Thd3fp

HallOfAgonyShortcutsHints

Mar 11th, 2021 (edited)
513
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.77 KB | None | 0 0
  1. using Turbo.Plugins.Default;
  2. using System.Linq;
  3. using System;
  4. using System.Collections.Generic;
  5.  
  6. namespace Turbo.Plugins.Thd3fp
  7. {
  8.     public class HallOfAgonyShortcutsHints : BasePlugin, IAfterCollectHandler, IInGameWorldPainter, ICustomizer
  9.     {
  10.         public IBrush GreenBrush { get; set; }
  11.         public IBrush RedBrush { get; set; }
  12.         private IBrush Brush { get; set; }
  13.         public List<IPlugin> ListOverlapPlugin { get; set; }
  14.         public WorldDecoratorCollection IronMaidenDecorator { get; set; }
  15.         private IWorldCoordinate EllipseCloseToMeHint, EllipseJumpHint;
  16.         private float RadiusEllipseJumpHint = 3.0f;
  17.         private bool IsInShortcutArea = false;
  18.         private bool ShowEllipseHint = false;
  19.         private bool ShowEllipseJumpHint = false;
  20.  
  21.         public HallOfAgonyShortcutsHints()
  22.         {
  23.             Enabled = true;
  24.         }
  25.  
  26.         public override void Load(IController hud)
  27.         {
  28.             base.Load(hud);
  29.             GreenBrush = Brush = Hud.Render.CreateBrush(240, 0, 255, 0, 4);
  30.             RedBrush = Hud.Render.CreateBrush(240, 255, 0, 0, 4);
  31.             ListOverlapPlugin = new List<IPlugin>();
  32.  
  33.             IronMaidenDecorator = new WorldDecoratorCollection(
  34.                 new MapShapeDecorator(Hud)
  35.                 {
  36.                     Brush = Hud.Render.CreateBrush(255, 255, 100, 0, 1.5f),
  37.                     Radius = 6.0f,
  38.                     ShapePainter = new CircleShapePainter(Hud),
  39.                 },
  40.                 new GroundCircleDecorator(Hud)
  41.                 {
  42.                     Brush = Hud.Render.CreateBrush(255, 255, 100, 0, 2, SharpDX.Direct2D1.DashStyle.Dash),
  43.                     Radius = 3,
  44.                 }
  45.                 );
  46.         }
  47.  
  48.         public void Customize()
  49.         {
  50.             // disabled the plugin when we in the corner - avoiding overlap
  51.             // ListOverlapPlugin.Add(Hud.GetPlugin<Default.ConventionOfElementsBuffListPlugin>());
  52.         }
  53.  
  54.         public void AfterCollect()
  55.         {
  56.             if (!Hud.Game.IsInGame)
  57.                 return;
  58.             SetShortcutsCoord();
  59.         }
  60.  
  61.         public void PaintWorld(WorldLayer layer)
  62.         {
  63.             if (!Hud.Game.IsInGame || !IsInShortcutArea)
  64.                 return;
  65.  
  66.             DrawHints();
  67.  
  68.             foreach (var actor in Hud.Game.Actors.Where(a => a.SnoActor.Sno == ActorSnoEnum._a1dun_leor_iron_maiden)) // _a1dun_leor_iron_maiden = 97023
  69.                 IronMaidenDecorator.Paint(layer, actor, actor.FloorCoordinate, null);
  70.         }
  71.  
  72.         void DrawHints()
  73.         {
  74.             TogglePlugin(ShowEllipseJumpHint ? false : true); // disabled some plugins when we in the corner - avoiding overlap
  75.             if (ShowEllipseJumpHint)
  76.             {
  77.                 var radius = TransformRadius(RadiusEllipseJumpHint, 400, 0.8f, 1f);
  78.                 Brush.DrawWorldEllipse(radius, -1, EllipseJumpHint);
  79.                 Brush.DrawWorldEllipse(radius / 4f, -1, EllipseJumpHint);
  80.                 Hud.Render.GetMinimapCoordinates(EllipseJumpHint.X, EllipseJumpHint.Y, out var mapX, out var mapY);
  81.                 radius = TransformRadius(6, 400, 0.8f, 1f);
  82.                 Brush.DrawEllipse(mapX, mapY, radius, radius, -2.5f);
  83.                 Brush.DrawEllipse(mapX, mapY, 2, 2, -2.5f);
  84.             }
  85.             else if (ShowEllipseHint)
  86.             {
  87.                 var radius = TransformRadius(1, 400, 0.8f, 1f);
  88.                 Brush.DrawWorldEllipse(radius, -1, EllipseCloseToMeHint);
  89.                 Hud.Render.GetMinimapCoordinates(EllipseCloseToMeHint.X, EllipseCloseToMeHint.Y, out var mapX, out var mapY);
  90.                 radius = TransformRadius(6, 400, 0.8f, 1f);
  91.                 Brush.DrawEllipse(mapX, mapY, radius, radius, -1.5f);
  92.             }
  93.         }
  94.  
  95.         private void SetShortcutsCoord()
  96.         {
  97.             IsInShortcutArea = ShowEllipseJumpHint = ShowEllipseHint = false;
  98.             Brush = GreenBrush;
  99.             if (Hud.Game.Me.Scene?.SnoScene?.Code == "a1dun_leor_nw_01")
  100.             {
  101.                 var doors = Hud.Game.Actors.Any(a => a.SnoActor.Sno == ActorSnoEnum._a1dun_leor_jail_door_breakable_a);
  102.                 Brush = doors ? RedBrush : GreenBrush;
  103.  
  104.                 IsInShortcutArea = true;
  105.                 RadiusEllipseJumpHint = 3.0f;
  106.                 var leftJumpHint = SetWorldCoordinate(90.0f, 50.0f);
  107.                 var rightJumpHint = SetWorldCoordinate(50.0f, 90.0f);
  108.                 var leftHint = SetWorldCoordinate(83.0f, 53.0f);
  109.                 var rightHint = SetWorldCoordinate(53.0f, 83.0f);
  110.                 // var ironMaidenIsInLeftCorner = Hud.Game.Actors.Any(a => a.SnoActor.Sno == ActorSnoEnum._a1dun_leor_iron_maiden && a.FloorCoordinate.Equals(SetWorldCoordinate(92.5f, 40.0f, 0f))); // not used for now
  111.                 var ironMaidenIsInRightCorner = Hud.Game.Actors.Any(a => a.SnoActor.Sno == ActorSnoEnum._a1dun_leor_iron_maiden && a.FloorCoordinate.Equals(SetWorldCoordinate(51.0f, 85.0f, 0f)));
  112.                 if (ironMaidenIsInRightCorner)
  113.                 {
  114.                     RadiusEllipseJumpHint = 1.2f;
  115.                     rightHint = SetWorldCoordinate(53.0f, 90.0f);
  116.                     leftJumpHint = SetWorldCoordinate(86.0f, 52.2f);
  117.                     rightJumpHint = SetWorldCoordinate(51.8f, 92.1f);
  118.                 }
  119.  
  120.                 var chestIsInLeftCorner = Hud.Game.Actors.Any(a => a.SnoActor.Sno == ActorSnoEnum._a1dun_leor_chest && a.FloorCoordinate.Equals(SetWorldCoordinate(84.5f, 51.0f, 0f))); // Left  _a1dun_leor_chest = 94708
  121.                 if (chestIsInLeftCorner)
  122.                 {
  123.                     RadiusEllipseJumpHint = 1.2f;
  124.                     leftHint = SetWorldCoordinate(87.0f, 54.0f);
  125.                     leftJumpHint = SetWorldCoordinate(91.6f, 50.8f);
  126.                     rightJumpHint = SetWorldCoordinate(51.6f, 87.0f);
  127.                 }
  128.  
  129.                 var leftHintDistToMe = YardsDistToMe(leftHint);
  130.                 var rightHintDistToMe = YardsDistToMe(rightHint);
  131.                 EllipseCloseToMeHint = leftHintDistToMe > rightHintDistToMe ? rightHint : leftHint;
  132.                 var closeToMeHintDist = YardsDistToMe(EllipseCloseToMeHint);
  133.                 var yards = 2.0f;
  134.                 EllipseJumpHint = leftHintDistToMe < yards ? rightJumpHint : rightHintDistToMe < yards ? leftJumpHint : null;
  135.                 if (closeToMeHintDist < yards)
  136.                     ShowEllipseJumpHint = true;
  137.                 else if (closeToMeHintDist < 105f /*yards*/)
  138.                     ShowEllipseHint = true;
  139.             }
  140.         }
  141.  
  142.         // \plugins\Default\RadiusTransformators\StandardPingRadiusTransformator.cs
  143.         float TransformRadius(float radius, int PingSpeed, float RadiusMinimumMultiplier = 0.5f, float RadiusMaximumMultiplier = 1.0f)
  144.         {
  145.             if (PingSpeed <= 0)
  146.                 return radius;
  147.  
  148.             var msec = Hud.Game.CurrentRealTimeMilliseconds;
  149.             return Math.Floor((double)msec / PingSpeed) % 2 == 1
  150.                 ? radius * (RadiusMinimumMultiplier + ((RadiusMaximumMultiplier - RadiusMinimumMultiplier) * (msec % PingSpeed) / PingSpeed))
  151.                 : radius * (RadiusMaximumMultiplier - ((RadiusMaximumMultiplier - RadiusMinimumMultiplier) * (msec % PingSpeed) / PingSpeed));
  152.         }
  153.  
  154.         void TogglePlugin(bool togglePlugin)
  155.         {
  156.             foreach (var p in ListOverlapPlugin)
  157.                 if (p.Enabled != togglePlugin)
  158.                     p.Enabled = togglePlugin;
  159.         }
  160.  
  161.         IWorldCoordinate SetWorldCoordinate(float relativeX, float relativeY, float z = 0.1f) { return Hud.Window.CreateWorldCoordinate(Hud.Game.Me.Scene.PosX + relativeX, Hud.Game.Me.Scene.PosY + relativeY, z); }
  162.  
  163.         float YardsDistToMe(IWorldCoordinate wc) { return Hud.Game.Me.FloorCoordinate.XYZDistanceTo(wc); }
  164.     }
  165. }
  166.  
Advertisement
Add Comment
Please, Sign In to add comment