I have referenced some code from other plugins and I have modified my own version of attackspeed
The attack speed will be shown on vary position depending on where you are in party or solo with or without follower hired.
The code might not be optimized. Im not a CSharp programmer.
Code:
using System.Linq;
using System.Collections.Generic;
using System.Globalization;
using Turbo.Plugins.Default;
namespace Turbo.Plugins.glq
{
public class AttackSpeed : BasePlugin, IInGameTopPainter
{
public TopLabelWithTitleDecorator AttackSpeedDecorator { get; set; }
private readonly ActorSnoEnum[] snoIds = new ActorSnoEnum[] {
(ActorSnoEnum) 4482,
(ActorSnoEnum) 52693,
(ActorSnoEnum) 52694,
(ActorSnoEnum) 453793,
(ActorSnoEnum) 473420
};
public AttackSpeed()
{
Enabled = true;
}
public override void Load(IController hud)
{
base.Load(hud);
AttackSpeedDecorator = new TopLabelWithTitleDecorator(Hud)
{
BackgroundBrush = Hud.Render.CreateBrush(160, 255, 255, 255, 0),
BorderBrush = Hud.Render.CreateBrush(255, 0, 0, 0, -1),
TextFont = Hud.Render.CreateFont("tahoma", 8, 255, 0, 0, 0, true, false, false),
};
}
public void PaintTopInGame(ClipState clipState)
{
if (Hud.Render.UiHidden) return;
if (clipState == ClipState.BeforeClip)
{
var w = Hud.Window.Size.Width * 0.04f;
var h = Hud.Window.Size.Height * 0.02f;
if (Hud.Game.NumberOfPlayersInGame > 1)
{
// in party group
foreach(var player in Hud.Game.Players)
{
if ( (player.HeroClassDefinition.HeroClass == HeroClass.WitchDoctor) || (player.HeroClassDefinition.HeroClass == HeroClass.Crusader) )
{
float x = player.PortraitUiElement.Rectangle.X + Hud.Window.Size.Width * 0.048f;
float y = player.PortraitUiElement.Rectangle.Y + Hud.Window.Size.Height * 0.04f;
AttackSpeedDecorator.Paint(x , y, w, h, player.Offense.AttackSpeed.ToString("F2", CultureInfo.InvariantCulture) + "/s");
}
}
}
else {
// in solo
var actors = Hud.Game.Actors.Where(x => snoIds.Contains(x.SnoActor.Sno));
if (actors.Any())
{
// follower hired
foreach(var player in Hud.Game.Players)
{
if ( (player.HeroClassDefinition.HeroClass == HeroClass.WitchDoctor) || (player.HeroClassDefinition.HeroClass == HeroClass.Crusader) )
{
float x = player.PortraitUiElement.Rectangle.X + Hud.Window.Size.Width * 0.052f;
float y = player.PortraitUiElement.Rectangle.Y + Hud.Window.Size.Height * 0.09f;
AttackSpeedDecorator.Paint(x , y, w, h, player.Offense.AttackSpeed.ToString("F2", CultureInfo.InvariantCulture) + "/s");
}
}
} else {
// no follower hired
foreach(var player in Hud.Game.Players)
{
if ( (player.HeroClassDefinition.HeroClass == HeroClass.WitchDoctor) || (player.HeroClassDefinition.HeroClass == HeroClass.Crusader) )
{
float x = player.PortraitUiElement.Rectangle.X + Hud.Window.Size.Width * 0.048f;
float y = player.PortraitUiElement.Rectangle.Y + Hud.Window.Size.Height * 0.04f;
AttackSpeedDecorator.Paint(x , y, w, h, player.Offense.AttackSpeed.ToString("F2", CultureInfo.InvariantCulture) + "/s");
}
}
}
}
}
}
}
}
optimized code
Code:
using System.Linq;
// using System.Collections.Generic;
using System.Globalization;
using Turbo.Plugins.Default;
namespace Turbo.Plugins.glq
{
public class AttackSpeed : BasePlugin, IInGameTopPainter
{
public TopLabelWithTitleDecorator AttackSpeedDecorator { get; set; }
private readonly ActorSnoEnum[] snoIds = new ActorSnoEnum[] {
(ActorSnoEnum) 4482,
(ActorSnoEnum) 52693,
(ActorSnoEnum) 52694,
(ActorSnoEnum) 453793,
(ActorSnoEnum) 473420
};
public float follower_OffsetX { get; set; }
public float follower_OffsetY { get; set; }
public float OffsetX { get; set; }
public float OffsetY { get; set; }
public AttackSpeed()
{
Enabled = true;
}
public override void Load(IController hud)
{
base.Load(hud);
OffsetX = 0.048f;
OffsetY = 0.04f;
follower_OffsetX = 0.052f;
follower_OffsetY = 0.09f;
AttackSpeedDecorator = new TopLabelWithTitleDecorator(Hud)
{
BackgroundBrush = Hud.Render.CreateBrush(160, 255, 255, 255, 0),
BorderBrush = Hud.Render.CreateBrush(255, 0, 0, 0, -1),
TextFont = Hud.Render.CreateFont("tahoma", 8, 255, 0, 0, 0, true, false, false),
};
}
public void PaintTopInGame(ClipState clipState)
{
if (Hud.Render.UiHidden) return;
if (clipState == ClipState.BeforeClip)
{
var w = Hud.Window.Size.Width * 0.04f;
var h = Hud.Window.Size.Height * 0.02f;
var _x = OffsetX;
var _y = OffsetY;
if (Hud.Game.NumberOfPlayersInGame > 1)
{
// in party group
_x = OffsetX;
_y = OffsetY;
}
else {
// in solo
var actors = Hud.Game.Actors.Where(x => snoIds.Contains(x.SnoActor.Sno));
if (actors.Any())
{
// follower hired
_x = follower_OffsetX;
_y = follower_OffsetY;
}
else
{
// no follower hired
_x = OffsetX;
_y = OffsetY;
}
}
foreach(var player in Hud.Game.Players)
{
if ( (player.HeroClassDefinition.HeroClass == HeroClass.WitchDoctor) || (player.HeroClassDefinition.HeroClass == HeroClass.Crusader) )
{
float x = player.PortraitUiElement.Rectangle.X + Hud.Window.Size.Width * _x;
float y = player.PortraitUiElement.Rectangle.Y + Hud.Window.Size.Height * _y;
AttackSpeedDecorator.Paint(x , y, w, h, player.Offense.AttackSpeed.ToString("F2", CultureInfo.InvariantCulture) + "/s");
}
}
}
}
}
}