Advertisement
jarppaaja

PowerCircle

Aug 5th, 2019
486
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 16.60 KB | None | 0 0
  1. // PowerCircle.cs "$Revision: 2591 $" "$Date: 2019-09-23 13:20:14 +0300 (ma, 23 syys 2019) $"
  2. // Files:
  3. // plugins/JarJar/PowerCircle   https://pastebin.com/dDQGn1An
  4. // plugins/User/Runes           https://pastebin.com/vSfQm5x6
  5. using System.Globalization;
  6. using System.Linq;
  7. using SharpDX;
  8. using SharpDX.Direct2D1;
  9. using Turbo.Plugins.Default;
  10. using Turbo.Plugins.User;
  11.  
  12. namespace Turbo.Plugins.JarJar
  13. {
  14.     public class PowerCircle : BasePlugin, IInGameWorldPainter
  15.     {
  16.         public bool IsCrusader { get; set; } = true;
  17.         public bool IsNecromancer { get; set; } = true;
  18.         public bool IsWitchDoctor { get; set; } = true;
  19.         public bool IsWizard { get; set; } = true;
  20.         public bool ShowMouseDistancePlayer { get; set; } = false;
  21.  
  22.         public string MouseLabelFormat { get; set; } = "{0:0}";
  23.         public float MouseDistOffsetX { get; set; } = 2f;
  24.         public float MouseDistOffsetY { get; set; } = 1f;
  25.         public WorldDecoratorCollection MouseDistDecorator { get; set; }
  26.  
  27.         public WorldDecoratorCollection PowerDecoratorMain { get; set; }
  28.         public WorldDecoratorCollection PowerDecoratorExtra { get; set; }
  29.  
  30.         public WorldDecoratorCollection MouseCircleDecorator { get; set; }
  31.  
  32.         public WorldDecoratorCollection SlowTimeDecorator { get; set; }
  33.         public WorldDecoratorCollection MeteorDecoratorPending { get; set; }
  34.         public WorldDecoratorCollection MeteorDecoratorActive { get; set; }
  35.         public WorldDecoratorCollection MeteorDecoratorTimed { get; set; }
  36.  
  37.         public PowerCircle() { Enabled = true; }
  38.  
  39.         public override void Load(IController hud)
  40.         {
  41.             base.Load(hud);
  42.  
  43.             var font = Color.Black;
  44.             MouseDistDecorator = new WorldDecoratorCollection(
  45.                 new GroundLabelDecorator(Hud)
  46.                 {
  47.                     BackgroundBrush = Hud.Render.CreateBrush(255, 255, 255, 64, 0),
  48.                     TextFont = Hud.Render.CreateFont("tahoma", 9f, 255, font.R, font.G, font.B, false, false, false),
  49.                 }
  50.             );
  51.             PowerDecoratorMain = new WorldDecoratorCollection(
  52.                 new GroundCircleDecorator(Hud)
  53.                 {
  54.                     Brush = Hud.Render.CreateBrush(255, 192, 96, 0, 1.5f, DashStyle.Dash),      // Kind of orange
  55.                     Radius = -1f,
  56.                 }
  57.             );
  58.             PowerDecoratorExtra = new WorldDecoratorCollection(
  59.                 new GroundCircleDecorator(Hud)
  60.                 {
  61.                     Brush = Hud.Render.CreateBrush(255, 255, 0, 128, 1.5f, DashStyle.Dash),     // Kind of purple
  62.                     Radius = -1f,
  63.                 }
  64.             );
  65.             var color = Color.Yellow;
  66.             MouseCircleDecorator = new WorldDecoratorCollection(
  67.                 new GroundCircleDecorator(Hud)
  68.                 {
  69.                     Brush = Hud.Render.CreateBrush(255, color.R, color.G, color.B, 2f, DashStyle.DashDot),
  70.                     Radius = -1f,
  71.                 }
  72.                 );
  73.  
  74.             color = Color.Crimson;
  75.             var minimapColor = Color.Cyan;
  76.             font = Color.MediumSpringGreen;
  77.             SlowTimeDecorator = new WorldDecoratorCollection(
  78.                 new GroundCircleDecorator(Hud)
  79.                 {
  80.                     Brush = Hud.Render.CreateBrush(100, color.R, color.G, color.B, 4f, DashStyle.Solid),
  81.                     Radius = 20f,
  82.                 },
  83.                 new GroundLabelDecorator(Hud)
  84.                 {
  85.                     CountDownFrom = 15,
  86.                     TextFont = Hud.Render.CreateFont("tahoma", 9, 255, font.R, font.G, font.B, true, false, 128, 0, 0, 0, true),
  87.                 },
  88.                 new GroundTimerDecorator(Hud)
  89.                 {
  90.                     CountDownFrom = 15,
  91.                     BackgroundBrushEmpty = Hud.Render.CreateBrush(128, 0, 0, 0, 0),
  92.                     BackgroundBrushFill = Hud.Render.CreateBrush(100, color.R, color.G, color.B, 0),
  93.                     Radius = 20f,
  94.                 },
  95.                 new MapShapeDecorator(Hud)  //  Minimnap
  96.                 {
  97.                     ShapePainter = new CircleShapePainter(Hud),
  98.                     Brush = Hud.Render.CreateBrush(255, minimapColor.R, minimapColor.G, minimapColor.B, 2.5f, DashStyle.Solid),
  99.                     Radius = 12f,
  100.                 }
  101.             );
  102.             color = Color.Orange;
  103.             MeteorDecoratorPending = new WorldDecoratorCollection(
  104.                 new GroundCircleDecorator(Hud)
  105.                 {
  106.                     Brush = Hud.Render.CreateBrush(255, color.R, color.G, color.B, 4f, DashStyle.Dash),
  107.                     Radius = 12f,
  108.                 }
  109.             );
  110.             color = Color.Crimson;
  111.             MeteorDecoratorActive = new WorldDecoratorCollection(
  112.                 new GroundCircleDecorator(Hud)
  113.                 {
  114.                     Brush = Hud.Render.CreateBrush(255, color.R, color.G, color.B, 4f, DashStyle.Solid),
  115.                     Radius = 12f,
  116.                 }
  117.             );
  118.             color = Color.Orange;
  119.             MeteorDecoratorTimed = new WorldDecoratorCollection(
  120.                 new GroundCircleDecorator(Hud)
  121.                 {
  122.                     Brush = Hud.Render.CreateBrush(255, color.R, color.G, color.B, 4f, DashStyle.Solid),
  123.                     Radius = 12f,
  124.                 },
  125.                 new GroundLabelDecorator(Hud)
  126.                 {
  127.                     CountDownFrom = 3,
  128.                     TextFont = Hud.Render.CreateFont("tahoma", 9, 255, font.R, font.G, font.B, true, false, 128, 0, 0, 0, true),
  129.                 },
  130.                 new GroundTimerDecorator(Hud)
  131.                 {
  132.                     CountDownFrom = 3,
  133.                     BackgroundBrushEmpty = Hud.Render.CreateBrush(128, 0, 0, 0, 0),
  134.                     BackgroundBrushFill = Hud.Render.CreateBrush(100, color.R, color.G, color.B, 0),
  135.                     Radius = 20f,
  136.                 }
  137.             );
  138.         }
  139.  
  140.         public void PaintWorld(WorldLayer layer)
  141.         {
  142.             if (Hud.Render.UiHidden)
  143.                 return;
  144.             if ((Hud.Game.MapMode == MapMode.WaypointMap) || (Hud.Game.MapMode == MapMode.ActMap) || (Hud.Game.MapMode == MapMode.Map))
  145.                 return;
  146.             if (Hud.Inventory.InventoryMainUiElement.Visible)
  147.                 return;
  148.             if (Hud.Game.Me.IsDead || Hud.Game.Me.AnimationState == AcdAnimationState.CastingPortal)
  149.                 return;
  150.  
  151.             switch (Hud.Game.Me.HeroClassDefinition.HeroClass)
  152.             {
  153.                 case HeroClass.Crusader:
  154.                     if (IsCrusader) Crusader(layer);
  155.                     break;
  156.                 case HeroClass.Necromancer:
  157.                     if (IsNecromancer) Necromancer(layer);
  158.                     break;
  159.                 case HeroClass.WitchDoctor:
  160.                     if (IsWitchDoctor) WitchDoctor(layer);
  161.                     break;
  162.                 case HeroClass.Wizard:
  163.                     if (IsWizard) Wizard(layer);
  164.                     break;
  165.             }
  166.             if (ShowMouseDistancePlayer && layer == WorldLayer.Ground)
  167.             {
  168.                 var mouseCoord = Hud.Window.CreateScreenCoordinate(Hud.Window.CursorX, Hud.Window.CursorY).ToWorldCoordinate();
  169.                 var distance = mouseCoord.XYDistanceTo(Hud.Game.Me.FloorCoordinate);
  170.                 var label = string.Format(CultureInfo.InvariantCulture, MouseLabelFormat, distance);
  171.                 MouseDistDecorator.Paint(layer, null, mouseCoord.Offset(MouseDistOffsetX, MouseDistOffsetY, 0f), label);
  172.             }
  173.         }
  174.  
  175.         private void Crusader(WorldLayer layer)
  176.         {
  177.             var skill = Hud.Game.Me.Powers.GetUsedSkill(Hud.Sno.SnoPowers.Crusader_Provoke);
  178.             if (skill != null)
  179.             {
  180.                 paint(layer, PowerDecoratorMain, 15f);
  181.             }
  182.             else
  183.             {
  184.                 // Mostly same radius as Provoke.
  185.                 skill = Hud.Game.Me.Powers.GetUsedSkill(Hud.Sno.SnoPowers.Crusader_Condemn);
  186.                 if (skill != null)
  187.                 {
  188.                     switch (skill.Rune)
  189.                     {
  190.                         case Runes.Crusader.Condemn.Vacuum:
  191.                         case Runes.Crusader.Condemn.ShatteringExplosion:
  192.                             paint(layer, PowerDecoratorMain, 20f);
  193.                             break;
  194.                         default:
  195.                             paint(layer, PowerDecoratorMain, 15f);
  196.                             break;
  197.                     }
  198.                 }
  199.             }
  200.             skill = Hud.Game.Me.Powers.GetUsedSkill(Hud.Sno.SnoPowers.Crusader_SweepAttack);
  201.             if (skill != null)
  202.             {
  203.                 switch (skill.Rune)
  204.                 {
  205.                     case Runes.Crusader.SweepAttack.GatheringSweep:
  206.                         paint(layer, PowerDecoratorExtra, 28f);
  207.                         break;
  208.                     default:
  209.                         paint(layer, PowerDecoratorExtra, 18f);
  210.                         break;
  211.                 }
  212.             }
  213.         }
  214.  
  215.         private void Necromancer(WorldLayer layer)
  216.         {
  217.             // Frailty and Devour has same 15 yd base radius extended by 50% of pickup range.
  218.             // - Hud.Game.Me.Powers.BuffIsActive(Hud.Sno.SnoPowers.Necromancer_Passive_FrailtyPassiveEffect.Sno)
  219.             if (Hud.Game.Me.Powers.GetUsedSkill(Hud.Sno.SnoPowers.Necromancer_Frailty)?.Rune == Runes.Necromancer.Frailty.AuraOfFrailty ||
  220.                 Hud.Game.Me.Powers.GetUsedSkill(Hud.Sno.SnoPowers.Necromancer_Devour)?.Rune == Runes.Necromancer.Devour.DevouringAura)
  221.             {
  222.                 var helperRadius = 15f + (Hud.Game.Me.Stats.PickupRange / 2f);
  223.                 paint(layer, PowerDecoratorMain, helperRadius);
  224.             }
  225.             if (Hud.Game.Me.Powers.GetUsedSkill(Hud.Sno.SnoPowers.Necromancer_BoneArmor) != null)
  226.             {
  227.                 paint(layer, PowerDecoratorExtra, 30f);
  228.             }
  229.         }
  230.  
  231.         private void WitchDoctor(WorldLayer layer)
  232.         {
  233.             if (Hud.Game.Me.Powers.GetUsedSkill(Hud.Sno.SnoPowers.WitchDoctor_SoulHarvest) != null)
  234.             {
  235.                 paint(layer, PowerDecoratorMain, 18f);
  236.             }
  237.         }
  238.  
  239.         private string prevText = string.Empty;
  240.         private readonly ActorSnoEnum[] wizardMeteors = new ActorSnoEnum[]
  241.         {
  242.             // All possible candidates, not checked.
  243.             ActorSnoEnum._temp_wizard_meteor_impact,
  244.             ActorSnoEnum._temp_wizard_meteor_pending,
  245.             ActorSnoEnum._temp_wizard_meteor_afterburn,
  246.             ActorSnoEnum._temp_wizard_meteor_pending_rune,
  247.             ActorSnoEnum._temp_wizard_meteor_impact_rune,
  248.             ActorSnoEnum._temp_wizard_meteor_pending_frost_rune,
  249.             ActorSnoEnum._temp_wizard_meteor_impact_frost_rune,
  250.             ActorSnoEnum._temp_wizard_meteor_afterburn_frost_rune,
  251.             ActorSnoEnum._wizard_meteor_impact_adddamage,
  252.             ActorSnoEnum._wizard_meteor_pending_adddamage,
  253.             ActorSnoEnum._wizard_meteor_impact_cost,
  254.             ActorSnoEnum._wizard_meteor_pending_cost,
  255.             ActorSnoEnum._wizard_meteor_sphereholes,
  256.             ActorSnoEnum._wizard_meteor_afterburn_cost,
  257.             ActorSnoEnum._wizard_meteor_firering_geo_cost,
  258.             ActorSnoEnum._temp_wizard_meteor_pending_longer,
  259.             ActorSnoEnum._temp_wizard_meteor_impact_longer,
  260.             ActorSnoEnum._temp_wizard_meteor_afterburn_longer,
  261.         };
  262.         private readonly ActorSnoEnum[] pendingMeteor = new ActorSnoEnum[]
  263.         {
  264.             // Hand picked
  265.             ActorSnoEnum._temp_wizard_meteor_pending,
  266.             ActorSnoEnum._temp_wizard_meteor_pending_longer,
  267.             ActorSnoEnum._wizard_meteor_pending_cost,
  268.             ActorSnoEnum._temp_wizard_meteor_pending_frost_rune,
  269.             ActorSnoEnum._temp_wizard_meteor_pending_rune,
  270.             ActorSnoEnum._wizard_meteor_pending_adddamage,
  271.         };
  272.         private readonly ActorSnoEnum[] timedMeteor = new ActorSnoEnum[]
  273.         {
  274.             // Hand picked
  275.             ActorSnoEnum._temp_wizard_meteor_afterburn,
  276.             ActorSnoEnum._temp_wizard_meteor_impact_longer,
  277.             ActorSnoEnum._temp_wizard_meteor_afterburn_longer,
  278.             ActorSnoEnum._wizard_meteor_impact_cost,
  279.             ActorSnoEnum._wizard_meteor_afterburn_cost,
  280.             ActorSnoEnum._temp_wizard_meteor_afterburn_frost_rune,
  281.         };
  282.  
  283.         private void Wizard(WorldLayer layer)
  284.         {
  285.             var meteor = Hud.Game.Me.Powers.GetUsedSkill(Hud.Sno.SnoPowers.Wizard_Meteor);
  286.             var slowTime = Hud.Game.Me.Powers.GetUsedSkill(Hud.Sno.SnoPowers.Wizard_SlowTime);
  287.             if (meteor != null || slowTime != null)
  288.             {
  289.                 var radius = meteor != null ? 12f : 15f;
  290.                 var mouseCoord = Hud.Window.CreateScreenCoordinate(Hud.Window.CursorX, Hud.Window.CursorY).ToWorldCoordinate();
  291.                 paint(layer, MouseCircleDecorator, radius, mouseCoord);
  292.  
  293.                 var text = string.Empty;
  294.                 var actors = Hud.Game.Actors;   // Select all actors created by any player.
  295.                 foreach (var actor in actors)
  296.                 {
  297.                     if (meteor != null)
  298.                     {
  299.                         if (wizardMeteors.Any(x => x == actor.SnoActor.Sno))
  300.                         {
  301.                             //text = string.Format("actor {0,6} {1,40} d={2,2:0}", (uint)actor.SnoActor.Sno, actor.SnoActor.Sno, (Hud.Game.CurrentGameTick - actor.CreatedAtInGameTick) / 60.0);
  302.                             switch (meteor.Rune)
  303.                             {
  304.                                 case Runes.Wizard.Meteor.MeteorShower:
  305.                                     radius = 8f;
  306.                                     break;
  307.                                 case Runes.Wizard.Meteor.MoltenImpact:
  308.                                     radius = 20f;
  309.                                     break;
  310.                                 default:
  311.                                     radius = 12f;
  312.                                     break;
  313.                             }
  314.                             if (pendingMeteor.Any(x => x == actor.SnoActor.Sno))
  315.                             {
  316.                                 paint(layer, MeteorDecoratorPending, radius, actor.FloorCoordinate);
  317.                             }
  318.                             else if (timedMeteor.Any(x => x == actor.SnoActor.Sno))
  319.                             {
  320.                                 paint(layer, MeteorDecoratorTimed, radius, actor.FloorCoordinate, actor);
  321.                             }
  322.                             else
  323.                             {
  324.                                 paint(layer, MeteorDecoratorActive, radius, actor.FloorCoordinate);
  325.                             }
  326.                         }
  327.                     }
  328.                     if (slowTime != null)
  329.                     {
  330.                         switch (actor.SnoActor.Sno)
  331.                         {
  332.                             case ActorSnoEnum._wizard_slowtime_proxy:                   // No rune
  333.                             case ActorSnoEnum._wizard_slowtimerune_damage_proxy:        // 0 Time warp
  334.                             case ActorSnoEnum._wizard_slowtimerune_linger_proxy:        // 1 Point of no return
  335.                             case ActorSnoEnum._wizard_slowtimerune_small_proxy:         // 2 Time shell
  336.                             case ActorSnoEnum._wizard_slowtimerune_cost_proxy:          // 3 Exhaustion
  337.                             case ActorSnoEnum._wizard_slowtimerune_attackspeed_proxy:   // 4 Stretch time
  338.                                 SlowTimeDecorator.Paint(layer, actor, actor.FloorCoordinate, null);
  339.                                 break;
  340.                         }
  341.                     }
  342.                 }
  343.                 if (text != string.Empty)
  344.                 {
  345.                     if (prevText != text)
  346.                     {
  347.                         prevText = text;
  348.                         Hud.Debug(text);
  349.                     }
  350.                 }
  351.             }
  352.         }
  353.  
  354.         private void paint(WorldLayer layer, WorldDecoratorCollection decoratorCollection, float radius, IWorldCoordinate coord = null, IActor actor = null)
  355.         {
  356.             var decorator = decoratorCollection.Decorators[0] as GroundCircleDecorator;
  357.             if (decorator.Radius != radius)
  358.             {
  359.                 decorator.Radius = radius;
  360.             }
  361.             decoratorCollection.Paint(layer, actor, coord ?? Hud.Game.Me.FloorCoordinate, null);
  362.         }
  363.     }
  364. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement