-
-
Save knight84/dc0108897fb6b89a672d9e2e85a5f044 to your computer and use it in GitHub Desktop.
Elitebar
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// combined of elite bar, elite circle, health bar on elite, elite line, Zei Circle for Boss | |
//https://www.ownedcore.com/forums/diablo-3/turbohud/turbohud-community-plugins/798477-eng-elite-info.html | |
using System; | |
using System.Linq; | |
using System.Collections.Generic; | |
using System.Globalization; | |
using Turbo.Plugins.Default; | |
namespace Turbo.Plugins.DAVMonster | |
{ | |
public class DAV_EliteInfoPlugin : BasePlugin, IInGameWorldPainter, ICustomizer { | |
public float XPos { get; set; } | |
public float YPos { get; set; } | |
public float offsetZ { get; set; } = 0f; | |
public bool showDebuff_CC { get; set; } = true; | |
public bool showCurse { get; set; } = true; | |
public WorldDecoratorCollection ZeiDecorator { get; set; } | |
public DAV_EliteInfo Elite_Boss { get; set; } | |
public DAV_EliteInfo Elite_Null { get; set; } | |
public DAV_EliteInfo Elite_Rare { get; set; } | |
public DAV_EliteInfo Elite_Jugg { get; set; } | |
public Dictionary<int, DAV_EliteInfo> Elite_Blue { get; set; } = new Dictionary<int, DAV_EliteInfo>(); | |
public Dictionary<string, IFont> Affix_Font { get; set; } = new Dictionary<string, IFont>(); | |
public Dictionary<MonsterAffix, Tuple<int, string, string>> DisplayAffix { get; set; } = new Dictionary<MonsterAffix, Tuple<int, string, string>>(); | |
public DAV_EliteInfoPlugin() { | |
Enabled = true; | |
Order = 5000; | |
} | |
public override void Load(IController hud) { | |
base.Load(hud); | |
XPos = Hud.Window.Size.Width * 0.670f; | |
YPos = Hud.Window.Size.Height * 0.0720f; | |
//Colorization | |
Elite_Boss = new DAV_EliteInfo(Hud, 200, 20, 0, 0); | |
Elite_Null = new DAV_EliteInfo(Hud, 178, 102, 255); | |
Elite_Rare = new DAV_EliteInfo(Hud, 255, 153, 51); | |
Elite_Jugg = new DAV_EliteInfo(Hud, 255, 51, 51); | |
Elite_Blue.Add(1, new DAV_EliteInfo(Hud, 51, 153, 255)); | |
Elite_Blue.Add(2, new DAV_EliteInfo(Hud, 0, 204, 0)); | |
Elite_Blue.Add(3, new DAV_EliteInfo(Hud, 154, 205, 50)); | |
Elite_Blue.Add(4, new DAV_EliteInfo(Hud, 255, 153, 204)); | |
Elite_Blue.Add(5, new DAV_EliteInfo(Hud, 96, 96, 96)); | |
ZeiDecorator = new WorldDecoratorCollection( | |
new GroundCircleDecorator(Hud) { | |
Brush = Hud.Render.CreateBrush(255,192,96,0, 1), | |
Radius = 50f | |
} | |
); | |
Affix_Font.Add("Normal", Hud.Render.CreateFont("arial", 7, 255, 240, 240, 240, false, false, true)); | |
Affix_Font.Add("Lightning", Hud.Render.CreateFont("arial", 7, 255, 240, 240, 0, false, false, true)); | |
Affix_Font.Add("Fire", Hud.Render.CreateFont("arial", 7, 255, 255, 70, 0, false, false, true)); | |
Affix_Font.Add("Arcane", Hud.Render.CreateFont("arial", 6, 255, 140, 45, 225, false, false, true)); | |
Affix_Font.Add("Cold", Hud.Render.CreateFont("arial", 7, 255, 0, 190, 255, false, false, true)); | |
Affix_Font.Add("Poison", Hud.Render.CreateFont("arial", 7, 255, 128, 255, 0, false, false, true)); | |
Affix_Font.Add("Danger", Hud.Render.CreateFont("arial", 7, 255, 255, 128, 0, false, false, true)); | |
DisplayAffix.Add(MonsterAffix.Wormhole, new Tuple<int, string, string>(1, "Wurmloch", "Danger")); | |
DisplayAffix.Add(MonsterAffix.Juggernaut, new Tuple<int, string, string>(2, "Brecher", "Danger")); | |
DisplayAffix.Add(MonsterAffix.Waller, new Tuple<int, string, string>(3, "Waller", "Danger")); | |
DisplayAffix.Add(MonsterAffix.Teleporter, new Tuple<int, string, string>(4, "Teleporter", "Danger")); | |
DisplayAffix.Add(MonsterAffix.Shielding, new Tuple<int, string, string>(5, "Schield", "Danger")); | |
DisplayAffix.Add(MonsterAffix.Illusionist, new Tuple<int, string, string>(6, "Illu", "Danger")); | |
DisplayAffix.Add(MonsterAffix.Electrified, new Tuple<int, string, string>(7, "Elektro", "Lightning")); | |
DisplayAffix.Add(MonsterAffix.Orbiter, new Tuple<int, string, string>(8, "Orbiter", "Lightning")); | |
DisplayAffix.Add(MonsterAffix.Thunderstorm, new Tuple<int, string, string>(9, "Thunderstorm", "Lightning")); | |
DisplayAffix.Add(MonsterAffix.FireChains, new Tuple<int, string, string>(10, "Feuerkette", "Fire")); | |
DisplayAffix.Add(MonsterAffix.Desecrator, new Tuple<int, string, string>(11, "Desecrator", "Fire")); | |
DisplayAffix.Add(MonsterAffix.Molten, new Tuple<int, string, string>(12, "Molten", "Fire")); | |
DisplayAffix.Add(MonsterAffix.Mortar, new Tuple<int, string, string>(13, "Mörser", "Fire")); | |
DisplayAffix.Add(MonsterAffix.FrozenPulse, new Tuple<int, string, string>(14, "FrozenPulse", "Cold")); | |
DisplayAffix.Add(MonsterAffix.Frozen, new Tuple<int, string, string>(15, "Frozen", "Cold")); | |
DisplayAffix.Add(MonsterAffix.Arcane, new Tuple<int, string, string>(16, "Arcane", "Arcane")); | |
DisplayAffix.Add(MonsterAffix.Jailer, new Tuple<int, string, string>(17, "Jailer", "Arcane")); | |
DisplayAffix.Add(MonsterAffix.Plagued, new Tuple<int, string, string>(18, "Seuche", "Poison")); | |
DisplayAffix.Add(MonsterAffix.Poison, new Tuple<int, string, string>(19, "Gift", "Poison")); | |
DisplayAffix.Add(MonsterAffix.Horde, new Tuple<int, string, string>(20, "Horde", "Normal")); | |
DisplayAffix.Add(MonsterAffix.MissileDampening, new Tuple<int, string, string>(21, "MissileDampening", "Normal")); | |
DisplayAffix.Add(MonsterAffix.ExtraHealth, new Tuple<int, string, string>(22, "ExtraHealth", "Normal")); | |
DisplayAffix.Add(MonsterAffix.Fast, new Tuple<int, string, string>(23, "Fast", "Normal")); | |
DisplayAffix.Add(MonsterAffix.Vampiric, new Tuple<int, string, string>(24, "Vampiric", "Normal")); | |
DisplayAffix.Add(MonsterAffix.Knockback, new Tuple<int, string, string>(25, "Knockback", "Normal")); | |
DisplayAffix.Add(MonsterAffix.Nightmarish, new Tuple<int, string, string>(26, "Nightmarish", "Normal")); | |
DisplayAffix.Add(MonsterAffix.Vortex, new Tuple<int, string, string>(27, "Vortex", "Normal")); | |
DisplayAffix.Add(MonsterAffix.Avenger, new Tuple<int, string, string>(28, "Avenger", "Normal")); | |
DisplayAffix.Add(MonsterAffix.Reflect, new Tuple<int, string, string>(29, "Reflect", "Normal")); | |
DisplayAffix.Add(MonsterAffix.HealthLink, new Tuple<int, string, string>(30, "HealthLink", "Normal")); | |
} | |
public void PaintWorld(WorldLayer layer) { | |
var packs = Hud.Game.MonsterPacks.Where(x => x.MonstersAlive.Any()).OrderBy(m => m.IsFullChampionPack); | |
var bosses = Hud.Game.AliveMonsters.Where(m => (m.Rarity == ActorRarity.Boss || m.Rarity == ActorRarity.Unique) && m.SummonerAcdDynamicId == 0); | |
var nullpacks = Hud.Game.AliveMonsters.Where(m => (m.Rarity == ActorRarity.Champion || m.Rarity == ActorRarity.Rare) && m.SummonerAcdDynamicId == 0 && m.Pack == null); | |
float yref = YPos; | |
foreach(IMonster m in bosses) { | |
Elite_Boss.DrawInfo(layer, m, XPos, ref yref, offsetZ, showDebuff_CC, showCurse); | |
yref += 0.2f; | |
if (Hud.Game.Me.Powers.BuffIsActive(403468, 0)) | |
ZeiDecorator.Paint(layer, m, m.FloorCoordinate, null); | |
} | |
foreach(IMonster nullpack in nullpacks) { | |
if (nullpack.Rarity == ActorRarity.Rare) | |
Elite_Rare.DrawInfo(layer, nullpack, XPos, ref yref, offsetZ, showDebuff_CC, showCurse); | |
else Elite_Null.DrawInfo(layer, nullpack, XPos, ref yref, offsetZ, showDebuff_CC, showCurse); | |
yref += 0.4f; | |
} | |
var blueNum = 1; | |
foreach(IMonsterPack MonPack in packs){ | |
var monsters = MonPack.MonstersAlive.Where(m => m.Rarity != ActorRarity.RareMinion && m.SummonerAcdDynamicId == 0).OrderBy(p => p.CurHealth); | |
if (monsters.Count() == 0) continue; | |
// Elite Affix | |
var aff_x = XPos; | |
float aff_h = 0f; | |
var PackAffix = MonPack.AffixSnoList.ToList(); | |
PackAffix.Sort((a, b) => (DisplayAffix[a.Affix].Item1).CompareTo(DisplayAffix[b.Affix].Item1)); | |
foreach(var affix in PackAffix) { | |
var affixInfo = DisplayAffix[affix.Affix]; | |
var AffixFont = Affix_Font[affixInfo.Item3]; | |
var custname = AffixFont.GetTextLayout(affixInfo.Item2); | |
AffixFont.DrawText(custname, aff_x, yref); | |
aff_x += (float) custname.Metrics.Width + 5; | |
aff_h = (float) custname.Metrics.Height; | |
} | |
yref += aff_h; | |
DAV_EliteInfo ColorInfo = null; | |
if (MonPack.IsFullChampionPack) { | |
ColorInfo = Elite_Blue[blueNum]; | |
if (blueNum < Elite_Blue.Count) | |
blueNum++; | |
} | |
else if (MonPack.AffixSnoList.Any(a => a.Affix == MonsterAffix.Juggernaut)) | |
ColorInfo = Elite_Jugg; | |
else | |
ColorInfo = Elite_Rare; | |
foreach(var monster in monsters) | |
ColorInfo.DrawInfo(layer, monster, XPos, ref yref, offsetZ, showDebuff_CC, showCurse); | |
yref += 0.2f; | |
} | |
} | |
public void Customize() { | |
Hud.RunOnPlugin<StandardMonsterPlugin>(plugin => { | |
plugin.EliteChampionDecorator.Enabled = false; | |
plugin.EliteLeaderDecorator.Enabled = false; | |
plugin.EliteMinionDecorator.Enabled = false; | |
plugin.EliteUniqueDecorator.Enabled = false; | |
plugin.KeywardenDecorator.Enabled = false; | |
}); | |
} | |
} | |
public class DAV_EliteInfo { | |
public bool Enabled { get; set; } | |
public IController Hud { get; set; } | |
public float barH { get; set; } | |
public float barW { get; set; } | |
public float barHmon { get; set; } | |
public float barWmon { get; set; } | |
public float distance { get; set; } | |
public IBrush Brush_BG { get; set; } | |
public IBrush Brush_Border { get; set; } | |
public IBrush Brush_Health { get; set; } | |
public IBrush Brush_Line { get; set; } | |
public IBrush Brush_Invulnerable { get; set; } | |
public IFont Font_White { get; set; } | |
public IFont Font_Mon { get; set; } | |
public WorldDecoratorCollection EliteDecorator { get; set; } | |
public DAV_EliteInfo(IController hud, int r, int g, int b, float Monsize = 3f, float dist = 45f) { | |
Enabled = true; | |
Hud = hud; | |
barH = Hud.Window.Size.Height * 0.015f; //0.014f | |
barW = Hud.Window.Size.Width * 0.10f; | |
barHmon = barH * 1.1f; // 1.4f | |
barWmon = barW * 0.35f; | |
distance = dist; | |
Font_White = Hud.Render.CreateFont("tahoma", 7, 255, 255, 255, 255, false, false, false); //255, 255, 255, 255, true); | |
Font_Mon = Hud.Render.CreateFont("tahoma", 7f, 200, 255, 255, 255, false, false, true); | |
Brush_BG = Hud.Render.CreateBrush(255, 125, 120, 120, 0); | |
Brush_Border = Hud.Render.CreateBrush(255, 255, 255, 255, -1); | |
Brush_Health = Hud.Render.CreateBrush(255, r, g, b, 0); | |
Brush_Line = Hud.Render.CreateBrush(153, r, g, b, -1); | |
Brush_Invulnerable = Hud.Render.CreateBrush(255, 255, 0, 0, 3); | |
EliteDecorator = new WorldDecoratorCollection( | |
new MapShapeDecorator(Hud) { | |
Brush = Hud.Render.CreateBrush(180, r, g, b, 0), | |
Radius = 8, | |
ShapePainter = new CircleShapePainter(Hud) | |
}, | |
new GroundCircleDecorator(Hud) { | |
Brush = Hud.Render.CreateBrush(255, r, g, b, 6), | |
Radius = Monsize | |
}, | |
new GroundCircleDecorator(Hud) { | |
Brush = Hud.Render.CreateBrush(255, 255, 255, 255, 1.5f), | |
Radius = Monsize | |
} | |
); | |
} | |
private string Debuff(IMonster m, bool showDebuff) { | |
if (!showDebuff) return ""; | |
string textDebuff = null; | |
if (m.Locust) textDebuff += "Locust"; | |
if (m.Haunted) textDebuff += (textDebuff == null ? "Haunt" : ", Haunt"); | |
if (m.Palmed) textDebuff += (textDebuff == null ? "Palm" : ", Palm"); | |
//if (m.MarkedForDeath) textDebuff += (textDebuff == null ? "Mark" : ", Mark"); | |
if (m.Strongarmed) textDebuff += (textDebuff == null ? "Strongarm" : ", Strongarm"); | |
string textCC = null; | |
if (m.Frozen) textCC += "Frozen"; | |
if (m.Chilled) textCC += (textCC == null ? "Chill" : ", Chill"); | |
//if (m.Slow) textCC += (textCC == null ? "Slow" : ", Slow"); | |
if (m.Stunned) textCC += (textCC == null ? "Stun" : ", Stun"); | |
if (m.Invulnerable) textCC += (textCC == null ? "Invulnerable" : ", Invulnerable"); | |
if (m.Blind) textCC += (textCC == null ? "Blind" : ", Blind"); | |
var output = "\t" + textDebuff + (textDebuff != null && textCC != null ? " | " : "") + textCC; | |
return output; | |
} | |
private string Curse(IMonster m) { | |
string Curses = ""; | |
if (m.GetAttributeValue(Hud.Sno.Attributes.Power_Buff_2_Visual_Effect_None, 471845) == 1) //471845 1 power: Frailty | |
Curses += "F"; | |
if (m.GetAttributeValue(Hud.Sno.Attributes.Power_Buff_2_Visual_Effect_None, 471869) == 1) //471869 1 power: Leech | |
Curses += (Curses == "" ? "L" : " L"); | |
if (m.GetAttributeValue(Hud.Sno.Attributes.Power_Buff_2_Visual_Effect_None, 471738) == 1) //471738 1 power: Decrepify | |
Curses += (Curses == "" ? "D" : " D"); | |
return Curses; | |
} | |
public void DrawInfo(WorldLayer layer, IMonster monster, float Pos_X, ref float Pos_Y, float offset, bool showDebuff, bool showCurse){ | |
EliteDecorator.Paint(layer, monster, monster.FloorCoordinate, monster.SnoMonster.NameLocalized); | |
if (monster.CentralXyDistanceToMe >= distance) | |
Brush_Line.DrawLineWorld(monster.FloorCoordinate, Hud.Game.Me.FloorCoordinate); | |
var CurPercent = monster.CurHealth / monster.MaxHealth; | |
if (CurPercent < 0 || CurPercent > 1) | |
CurPercent = 1; | |
//Draw Rectangles | |
Brush_BG.DrawRectangle(Pos_X, Pos_Y, barW, barH); | |
Brush_Health.DrawRectangle(Pos_X, Pos_Y, (float) CurPercent * barW, barH); | |
// Brush_Border.DrawRectangle(Pos_X, Pos_Y, barW, barH); // white border for bar on screen | |
var name = Font_White.GetTextLayout(monster.SnoMonster.NameLocalized); | |
Font_White.DrawText(name, Pos_X + 3, Pos_Y + (barH - (float)name.Metrics.Height)/2); | |
var HPtext = (CurPercent * 100).ToString("0.0") + "%"; | |
var textLayout = Font_White.GetTextLayout(HPtext + Debuff(monster, showDebuff)); | |
Font_White.DrawText(textLayout, Pos_X + barW + 4 , Pos_Y + (barH - (float)textLayout.Metrics.Height)/2); | |
if (showCurse) { | |
var curseInfo = Curse(monster); | |
textLayout = Font_White.GetTextLayout(curseInfo); | |
Font_White.DrawText(textLayout, Pos_X + barW - textLayout.Metrics.Width - 6, Pos_Y + (barH - (float)textLayout.Metrics.Height)/2); | |
} | |
if (monster.IsOnScreen){ | |
var Mon_X = monster.FloorCoordinate.ToScreenCoordinate().X - barWmon / 2; | |
var Mon_Y = monster.FloorCoordinate.ToScreenCoordinate().Y + barHmon + offset; | |
Brush_BG.DrawRectangle(Mon_X, Mon_Y, barWmon, barHmon); | |
Brush_Health.DrawRectangle(Mon_X, Mon_Y, (float) CurPercent * barWmon, barHmon); | |
if (monster.Invulnerable) Brush_Invulnerable.DrawRectangle(Mon_X, Mon_Y, barWmon, barHmon); | |
else Brush_Border.DrawRectangle(Mon_X, Mon_Y, barWmon, barHmon); | |
var textLayout2 = Font_Mon.GetTextLayout(HPtext); | |
Font_Mon.DrawText(HPtext, Mon_X + (barWmon - textLayout2.Metrics.Width)/2 , Mon_Y + (barHmon - textLayout2.Metrics.Height)/2); | |
} | |
Pos_Y += barH * 1.1f; // * 1.3f; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment