Code:
using Turbo.Plugins.Default;
using System.Collections.Generic;
using System;
using System.Linq;
namespace Turbo.Plugins.RNN
{
public class OtherClassMarkers : BasePlugin, ICustomizer, IInGameWorldPainter, INewAreaHandler
{
public bool ShowInTown {get; set;}
public bool MyCircle {get; set;}
public bool MyCircleColorOverride {get; set;}
public bool MyCircleCenter {get; set;}
public bool CircleMapOthers {get; set;}
public bool CircleGroundOthers {get; set;}
public bool CircleGroundCenterOthers {get; set;}
public float CircleGroundRadius {get; set;}
public bool NamesGroundOthers {get; set;}
public bool NamesMapOthers {get; set;}
public bool AvatarGroundOthers {get; set;}
public bool AvatarMapOthers {get; set;}
public Dictionary<HeroClass, WorldDecoratorCollection> DecoratorbyClass { get; set; } = new Dictionary<HeroClass, WorldDecoratorCollection>();
public Dictionary<HeroClass, int[] > HeroBrush { get; set; } = new Dictionary<HeroClass, int[]> ();
private Dictionary<ActorSnoEnum, uint> SnoTexture { get; set; } = new Dictionary<ActorSnoEnum, uint>();
private ActorSnoEnum[] DataIndex { get; set; } = new ActorSnoEnum[4];
private ActorSnoEnum DataIndex_Default { get; set; } = ActorSnoEnum._healthglobe;
public int MyIndex { get; set; } = -1;
private int DataIndex_Num { get; set; }
public OtherClassMarkers()
{
Enabled = true;
}
public override void Load(IController hud)
{
base.Load(hud);
Order = 30950;
ShowInTown = true;
MyCircle = true;
MyCircleColorOverride = true; // If true my color will always be white
MyCircleCenter = true; // Circles Red&White For Me
CircleMapOthers = true;
CircleGroundOthers = true;
CircleGroundRadius = 4f; // Radius of the outer circle in the Ground. Assign positive values, or -1 to show the player's Hitbox
CircleGroundCenterOthers = true;
NamesGroundOthers = true;
NamesMapOthers = true;
AvatarGroundOthers = false;
AvatarMapOthers = true;
//HeroClass.Barbarian , HeroClass.Crusader , HeroClass.DemonHunter, HeroClass.Monk , HeroClass.WitchDoctor, HeroClass.Wizard, HeroClass.Necromancer
HeroBrush[HeroClass.Barbarian] = new int[5] {255,237, 20, 20, 4}; // new int[5] { opacity , Red, Green , Blue , stroke }
HeroBrush[HeroClass.Crusader] = new int[5] {255,255,204, 0, 4};
HeroBrush[HeroClass.DemonHunter] = new int[5] {255, 0,168,255, 4};
HeroBrush[HeroClass.Monk] = new int[5] {255, 35,225, 6, 4};
HeroBrush[HeroClass.WitchDoctor] = new int[5] {255,255,132, 0, 4};
HeroBrush[HeroClass.Wizard] = new int[5] {255, 220, 150,255, 4};
HeroBrush[HeroClass.Necromancer] = new int[5] {255, 64,192,176, 4};
HeroBrush[HeroClass.None] = new int[5] {255,255,255,255, 4}; // Color Override
SnoTexture.Add((ActorSnoEnum)75207, 3785199803); SnoTexture.Add((ActorSnoEnum)74706, 2939779782); //dh
SnoTexture.Add((ActorSnoEnum)6544, 44435619); SnoTexture.Add((ActorSnoEnum)6526, 876580014); //wiz
SnoTexture.Add((ActorSnoEnum)6485, 3925954876); SnoTexture.Add((ActorSnoEnum)6481, 1603231623); //wd
SnoTexture.Add((ActorSnoEnum)3301, 3921484788); SnoTexture.Add((ActorSnoEnum)3285, 1030273087); //barb
SnoTexture.Add((ActorSnoEnum)4721, 2227317895); SnoTexture.Add((ActorSnoEnum)4717, 2918463890); //monk
SnoTexture.Add((ActorSnoEnum)238284, 3742271755); SnoTexture.Add((ActorSnoEnum)238286, 3435775766); //crus
SnoTexture.Add((ActorSnoEnum)454021, 3285997023); SnoTexture.Add((ActorSnoEnum)454402, 473831658); //necro
}
public void OnNewArea(bool newGame, ISnoArea area)
{
if (newGame || (MyIndex != Hud.Game.Me.Index) )
{
MyIndex = Hud.Game.Me.Index;
DataIndex_Num = Hud.Game.NumberOfPlayersInGame;
for(var i = 0; i < 4; i++)
{
DataIndex[i] = DataIndex_Default;
}
if (!MyCircleColorOverride)
{
DecoratorbyClass[HeroClass.None].Decorators.Clear();
int[] c = HeroBrush[Hud.Game.Me.HeroClassDefinition.HeroClass];
addDecoratorbyClass(HeroClass.None, c[0],c[1],c[2],c[3],c[4]);
}
}
}
public void Customize()
{
Hud.TogglePlugin<OtherPlayersPlugin>(false); // disables default plugin OtherPlayersPlugin
foreach (HeroClass heroClass in Enum.GetValues(typeof(HeroClass)))
{
DecoratorbyClass.Add( heroClass, new WorldDecoratorCollection() );
int[] c = HeroBrush[heroClass];
addDecoratorbyClass(heroClass, c[0],c[1],c[2],c[3],c[4]);
}
}
public void addDecoratorbyClass(HeroClass hero, int o,int r,int g, int b, int t)
{
var groundLabelBackgroundBrush = Hud.Render.CreateBrush(255, 0, 0, 0, 0);
if ((CircleGroundOthers && (hero != HeroClass.None)) || ( MyCircle && (hero == HeroClass.None)))
DecoratorbyClass[hero].Decorators.Add(
new GroundCircleDecorator(Hud)
{
Brush = Hud.Render.CreateBrush(o,r,g,b,t),
Radius = CircleGroundRadius,
}
);
if (hero != HeroClass.None)
{
if (CircleMapOthers)
DecoratorbyClass[hero].Decorators.Add(
new MapShapeDecorator(Hud)
{
Brush = Hud.Render.CreateBrush(o,r,g,b,t),
ShapePainter = new CircleShapePainter(Hud),
Radius = 3f
}
);
if (CircleGroundCenterOthers)
DecoratorbyClass[hero].Decorators.Add(
new GroundCircleDecorator(Hud)
{
Brush = Hud.Render.CreateBrush(o,r,g,b, 19),
Radius = 0.6f,
}
);
if (NamesMapOthers)
DecoratorbyClass[hero].Decorators.Add(
new MapLabelDecorator(Hud)
{
LabelFont = Hud.Render.CreateFont("tahoma", 6f, o,r,g,b, false, false, 128, 0, 0, 0, true),
Up = false,
RadiusOffset = 7f,
}
);
if (NamesGroundOthers)
DecoratorbyClass[hero].Decorators.Add(
new GroundLabelDecorator(Hud)
{
BackgroundBrush = groundLabelBackgroundBrush,
BorderBrush = Hud.Render.CreateBrush(o,r,g,b, 1),
TextFont = Hud.Render.CreateFont("tahoma", 6f, o,r,g,b, false, false, 128, 0, 0, 0, true),
OffsetY = (AvatarGroundOthers)? 23f:0f,
}
);
}
else if (MyCircleCenter)
{
DecoratorbyClass[hero].Decorators.Add(
new GroundCircleDecorator(Hud)
{
Brush = Hud.Render.CreateBrush(255, 255, 0, 0, 6.0f),
Radius = 0.3f
}
);
DecoratorbyClass[hero].Decorators.Add(
new GroundCircleDecorator(Hud)
{
Brush = Hud.Render.CreateBrush(255,255,255, 255, 4.0f),
Radius = 0.7f
}
);
}
}
public void PlayersIndex_Part()
{
for(int i = 0; i < 4; i++)
{
var part = true;
foreach (IPlayer p in Hud.Game.Players)
{
if (p.Index == i)
{
part = false; break;
}
}
if (part) { DataIndex[i] = DataIndex_Default; }
}
}
public void PaintWorld(WorldLayer layer)
{
if (layer != WorldLayer.Ground) return;
if (!Hud.Game.IsInGame) return;
if (DataIndex_Num != Hud.Game.NumberOfPlayersInGame)
{
if (Hud.Game.NumberOfPlayersInGame < DataIndex_Num) { PlayersIndex_Part(); }
DataIndex_Num = Hud.Game.NumberOfPlayersInGame;
}
if (Hud.Game.IsInTown && !ShowInTown) return;
if ((Hud.Game.Me.HeroClassDefinition.HeroClass != HeroClass.Monk) || (Hud.Game.Me.Offense.SheetDps > 1000000) || (Hud.Game.Me.Defense.HealthMax < 1000000) ) return;
var players = Hud.Game.Players.Where(p => p.CoordinateKnown && !p.IsDeadSafeCheck);
foreach (var pl in players)
{
if ( ((Hud.Game.SpecialArea == SpecialArea.GreaterRift) || (Hud.Game.SpecialArea == SpecialArea.Rift)) && (Hud.Game.Me.SnoArea.Sno != pl.SnoArea.Sno)) continue;
if ( Hud.Game.Me.IsInTown ^ pl.IsInTown) continue;
HeroClass hero = (pl.IsMe)? HeroClass.None : pl.HeroClassDefinition.HeroClass ;
if (DecoratorbyClass.TryGetValue(hero, out var decorator))
{
decorator.Paint(layer, pl, pl.FloorCoordinate, pl.BattleTagAbovePortrait);
decorator.Paint(WorldLayer.Map, pl, pl.FloorCoordinate, pl.BattleTagAbovePortrait);
}
ITexture HeroTexture; ActorSnoEnum PlayerSnoEnumI;
if (pl.HasValidActor)
{
PlayerSnoEnumI = pl.SnoActor.Sno;
if (DataIndex[pl.Index] != pl.SnoActor.Sno) { DataIndex[pl.Index] = pl.SnoActor.Sno; }
}
else
{
PlayerSnoEnumI = (DataIndex[pl.Index] == pl.HeroClassDefinition.FemaleActorSno)? pl.HeroClassDefinition.FemaleActorSno : pl.HeroClassDefinition.MaleActorSno;
}
HeroTexture = (SnoTexture.ContainsKey(PlayerSnoEnumI))? Hud.Texture.GetTexture(SnoTexture[PlayerSnoEnumI]) : Hud.Texture.GetTexture(890155253);
float PlayersHeadOpacity = 1f;
if (Hud.Game.AliveMonsters.Where(m => m.Rarity != ActorRarity.Normal && m.FloorCoordinate.XYDistanceTo(pl.FloorCoordinate) < 25).Any() ) PlayersHeadOpacity = 0.20f;
float textureX, textureY;
Hud.Render.GetMinimapCoordinates(pl.FloorCoordinate.X, pl.FloorCoordinate.Y, out textureX, out textureY);
if ((!pl.IsMe) && ((pl.HeroClassDefinition.HeroClass == HeroClass.WitchDoctor) || (pl.HeroClassDefinition.HeroClass == HeroClass.Necromancer)))
{
if (AvatarMapOthers) HeroTexture.Draw(textureX - 11, textureY - 14, 22.3f, 24.1f, PlayersHeadOpacity);
if (AvatarGroundOthers && pl.IsOnScreen) HeroTexture.Draw(pl.FloorCoordinate.ToScreenCoordinate().X - 15 , pl.FloorCoordinate.ToScreenCoordinate().Y - 18 , 30f, 32.4f, 1f);
}
}
}
}
}