EzPlugins

ClickPortalPlugin

Sep 27th, 2025 (edited)
378
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.35 KB | None | 0 0
  1. using Turbo.Plugins.Default;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Runtime.InteropServices;
  6. using SharpDX.DirectInput;
  7. using System.Windows.Forms;
  8. using System.Threading;
  9.  
  10. namespace Turbo.Plugins.Ez
  11. {
  12.     public class ClickPortalPlugin : BasePlugin, IAfterCollectHandler
  13.     {
  14.         public static IntPtr D3Hwnd = IntPtr.Zero;
  15.  
  16.         [DllImport("USER32.DLL")]
  17.         private static extern IntPtr FindWindow(string ClassName, string WindowText);
  18.  
  19.         [DllImport("user32.dll")]
  20.         private static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, IntPtr dwExtraInfo);
  21.  
  22.         [DllImport("user32.dll")]
  23.         public static extern bool SetCursorPos(int x, int y);
  24.  
  25.         public static void MoveMouseEventLClick(int x, int y)
  26.         {
  27.             SetCursorPos(x, y);
  28.             Thread.Sleep(1); mouse_event(6U, 0, 0, 0U, IntPtr.Zero);
  29.             Thread.Sleep(1); SetCursorPos(x, y); mouse_event(6U, 0, 0, 0U, IntPtr.Zero); // quick rp and retry
  30.         }
  31.  
  32.         public static void MouseEventLClick()
  33.         {
  34.             mouse_event(6U, 0, 0, 0U, IntPtr.Zero);
  35.         }
  36.  
  37.         private long msLapseAction { get; set; } = 0;
  38.         private const long msLapse = 100;       // 100
  39.         private const long pauseClick = 250;    // 250
  40.  
  41.         private uint blockPortalTarget { get; set; } = 0;
  42.         private long blockPortalTime { get; set; } = 0;
  43.         private long blockPortalLapse { get; set; } = 1500; // 1500
  44.  
  45.         private uint allowActorAnnId { get; set; } = 0;
  46.         private long blockActorTime { get; set; } = 0;
  47.         private long blockActorLapse { get; set; } = 2000;  // 2000
  48.  
  49.         public bool enableEntranceVision { get; set; }
  50.         public float distanceItem { get; set; }
  51.         public float distanceElite { get; set; }
  52.         public float distanceSelectedPortal { get; set; }
  53.         public bool enableAutoPortal { get; set; }
  54.         public float distanceAutoPortal { get; set; }
  55.  
  56.         public HashSet<ActorSnoEnum> BlackListPortals { get; set; } = new HashSet<ActorSnoEnum>()
  57.         {
  58.             ActorSnoEnum._p4_setdung_portal_wiz_opus,           // Dungeons Sets
  59.             ActorSnoEnum._p4_setdung_portal_wiz_rasha,
  60.             ActorSnoEnum._p4_setdung_portal_wiz_firebird,
  61.             ActorSnoEnum._p4_setdung_portal_wiz_vyr,
  62.  
  63.             ActorSnoEnum._p4_setdung_portal_barb_kings,
  64.             ActorSnoEnum._p4_setdung_portal_barb_wastes,
  65.             ActorSnoEnum._p4_setdung_portal_barb_raekor,
  66.             ActorSnoEnum._p4_setdung_portal_barb_might,
  67.  
  68.             ActorSnoEnum._p4_setdung_portal_dh_mar,
  69.             ActorSnoEnum._p4_setdung_portal_dh_nat ,
  70.             ActorSnoEnum._p4_setdung_portal_dh_ess ,
  71.             ActorSnoEnum._p4_setdung_portal_dh_shadow ,
  72.  
  73.             ActorSnoEnum._p4_setdung_portal_wd_tooth,
  74.             ActorSnoEnum._p4_setdung_portal_wd_haunt,
  75.             ActorSnoEnum._p4_setdung_portal_wd_spider,
  76.             ActorSnoEnum._p4_setdung_portal_wd_jade,
  77.  
  78.             ActorSnoEnum._p4_setdung_portal_monk_innas,
  79.             ActorSnoEnum._p4_setdung_portal_monk_sunwuko,
  80.             ActorSnoEnum._p4_setdung_portal_monk_uliana,
  81.             ActorSnoEnum._p4_setdung_portal_monk_storms,
  82.  
  83.             ActorSnoEnum._p6_setdung_portal_necro_blood,
  84.             ActorSnoEnum._p6_setdung_portal_necro_bone,
  85.             ActorSnoEnum._p6_setdung_portal_necro_plague,
  86.             ActorSnoEnum._p6_setdung_portal_necro_saint,
  87.  
  88.             ActorSnoEnum._p4_setdung_portal_cru_thorns,
  89.             ActorSnoEnum._p4_setdung_portal_cru_seeker,
  90.             ActorSnoEnum._p4_setdung_portal_cru_akkhan,
  91.             ActorSnoEnum._p4_setdung_portal_cru_roland,
  92.  
  93.             ActorSnoEnum._p4_setdung_portal_dynamicreturn,
  94.             ActorSnoEnum._p4_setdung_portal_neph_eyes,
  95.  
  96.             //ActorSnoEnum._hearthportal, // Town
  97.             //ActorSnoEnum._x1_openworld_lootrunportal, // Town
  98.             //ActorSnoEnum._x1_openworld_tiered_rifts_portal, // Town
  99.             ActorSnoEnum._x1_openworld_tiered_rifts_challenge_portal,
  100.             ActorSnoEnum._p1_greed_portal,
  101.             //ActorSnoEnum._p1_greed_portal_ancient, // Town
  102.             ActorSnoEnum._p2_totallynotacowlevel_portal,
  103.             ActorSnoEnum._dungeon_stone_portal,
  104.         };
  105.  
  106.         private HashSet<uint> EnmityAreas { get; set; } = new HashSet<uint>
  107.         {
  108.             488740, 488741, 488742, 488743, 488745, 488746, 488767, 488770, 488799, 488800, 488870, 488871, 488872, 488873, 488874
  109.         };
  110.  
  111.         private HashSet<ActorSnoEnum> EnmityPortals { get; set; } = new HashSet<ActorSnoEnum> {
  112.             ActorSnoEnum._p76_portal_oldtristram_seasontheme,
  113.             ActorSnoEnum._p76_portal_newtristram_seasontheme,
  114.             ActorSnoEnum._p76_portal_graveyardact1_seasontheme,
  115.             ActorSnoEnum._p76_portal_bloodpit_seasontheme,
  116.             ActorSnoEnum._p76_portal_moors_sacrifice_seasontheme,
  117.             ActorSnoEnum._p76_portal_boneyard_seasontheme,
  118.             ActorSnoEnum._p76_portal_church_seasontheme,
  119.             ActorSnoEnum._p76_portal_alcarnus_seasontheme,
  120.             ActorSnoEnum._p76_portal_sescheron_seasontheme,
  121.             ActorSnoEnum._p76_portal_foresttower_seasontheme,
  122.             ActorSnoEnum._p76_portal_bog_seasontheme,
  123.             ActorSnoEnum._p76_portal_gideonscourt_seasontheme,
  124.             ActorSnoEnum._p76_portal_spire_seasontheme,
  125.             ActorSnoEnum._p76_portal_hell_seasontheme,
  126.             ActorSnoEnum._p76_portal_ram_seasontheme,
  127.         };
  128.  
  129.         public ClickPortalPlugin()
  130.         {
  131.             Enabled = true;
  132.         }
  133.  
  134.         public override void Load(IController hud)
  135.         {
  136.             base.Load(hud);
  137.             enableEntranceVision = true;
  138.             enableAutoPortal = true;
  139.             distanceAutoPortal = 10;
  140.             distanceSelectedPortal = 16;
  141.             distanceItem = 50;
  142.             distanceElite = 50;
  143.  
  144.             D3Hwnd = FindWindow("D3 Main Window Class", null); // D3Hwnd = FindWindow(null, "Diablo III");
  145.         }
  146.  
  147.         private bool IsElite(IMonster m)
  148.         {
  149.             return (m.Rarity == ActorRarity.Champion || m.Rarity == ActorRarity.Rare || m.Rarity == ActorRarity.Unique || m.Rarity == ActorRarity.Boss || m.SnoMonster.Priority >= MonsterPriority.goblin) && m.SummonerAcdDynamicId == 0;
  150.         }
  151.  
  152.         public void AfterCollect()
  153.         {
  154.             if (!Hud.Game.IsInGame || Hud.Game.Me.IsInTown || !Hud.Window.IsForeground) return;
  155.             if (Hud.Game.CurrentRealTimeMilliseconds > msLapseAction)
  156.             {
  157.                 msLapseAction = Hud.Game.CurrentRealTimeMilliseconds + msLapse;
  158.                 if (Hud.Game.Me.AnimationState != AcdAnimationState.Running && !Hud.Game.Me.Powers.BuffIsActive(Hud.Sno.SnoPowers.Generic_ActorInvulBuff.Sno) && !Hud.Input.IsKeyDown(Keys.LControlKey))
  159.                 {
  160.                     IActor actorPortal = null; bool movemouse = false;
  161.                     if (Hud.Game.SelectedActor != null)
  162.                     {
  163.                         if (Hud.Game.SelectedActor.CentralXyDistanceToMe < distanceSelectedPortal && (Hud.Game.SelectedActor.SnoActor.Kind == ActorKind.Portal || Hud.Game.SelectedActor.GizmoType.ToString().Contains("Portal")))
  164.                             actorPortal = Hud.Game.SelectedActor;
  165.                     }
  166.                     else if (enableAutoPortal)
  167.                     {
  168.                         actorPortal = Hud.Game.Actors.Where(a => a.CentralXyDistanceToMe < distanceAutoPortal && (a.SnoActor.Kind == ActorKind.Portal || a.GizmoType.ToString().Contains("Portal"))).OrderBy(o => o.CentralXyDistanceToMe).FirstOrDefault();
  169.                         movemouse = true;
  170.                     }
  171.  
  172.                     if (actorPortal != null && !BlackListPortals.Contains(actorPortal.SnoActor.Sno)) // !actorPortal.SnoActor.Code.Contains("_SetDung_Portal_")
  173.                     {
  174.                         if (!Hud.Game.AliveMonsters.Any(m => IsElite(m) && m.CentralXyDistanceToMe < distanceElite)) // No ELites Near
  175.                         {
  176.                             if (!Hud.Game.Items.Any(i => i.Location == ItemLocation.Floor && i.IsLegendary && i.CentralXyDistanceToMe < distanceItem))
  177.                             {
  178.                                 var portal = Hud.Game.Portals.FirstOrDefault(p => p.ActorAvailable && (actorPortal.AnnId == p.AnnId));
  179.                                 if (portal != null)
  180.                                 {
  181.                                     if (portal.TargetArea.Sno != Hud.Game.Me.SnoArea.Sno)
  182.                                     {
  183.                                         bool isvalid = (portal.TargetArea.IsTown)? false
  184.                                                 :(portal.GizmoType == GizmoType.BossPortal)? (Hud.Game.NumberOfPlayersInGame == 1)
  185.                                                     : (Hud.Game.Me.SnoArea.Sno == 288482 || Hud.Game.Me.SnoArea.HostAreaSno == 288482)? (portal.TargetArea.Sno > Hud.Game.Me.SnoArea.Sno && (Hud.Game.Me.InGreaterRiftRank == 0 || Hud.Game.RiftPercentage < 100))
  186.                                                         : EnmityAreas.Contains(Hud.Game.Me.SnoArea.Sno)? EnmityPortals.Contains(portal.SnoActor.Sno)
  187.                                                             : (EnmityPortals.Contains(portal.SnoActor.Sno))? enableEntranceVision
  188.                                                                 : (portal.TargetArea.Sno != blockPortalTarget || Hud.Game.CurrentRealTimeMilliseconds > blockPortalTime)
  189.                                         ;
  190.                                         if (isvalid)
  191.                                         {
  192.                                             blockPortalTarget = Hud.Game.Me.SnoArea.Sno;
  193.                                             blockPortalTime = Hud.Game.CurrentRealTimeMilliseconds + blockPortalLapse;
  194.                                             msLapseAction = Hud.Game.CurrentRealTimeMilliseconds + pauseClick;
  195.                                             if (movemouse)  MoveMouseEventLClick((int)portal.ScreenCoordinate.X + Hud.Window.Offset.X, (int)portal.ScreenCoordinate.Y + Hud.Window.Offset.Y);
  196.                                             else    MouseEventLClick();
  197.                                         }
  198.                                     }
  199.                                 }
  200.                                 else if (actorPortal.GizmoType == GizmoType.Switch || (actorPortal.GizmoType == GizmoType.BossPortal && Hud.Game.NumberOfPlayersInGame == 1))
  201.                                 {//else if (actorPortal.GizmoType == GizmoType.Switch || (actorPortal.SnoActor.Sno == ActorSnoEnum._p6_envy_bossportal && Hud.Game.NumberOfPlayersInGame == 1)) //(ActorSnoEnum._x1_fortress_portal_switch, ..)//vidian portal bug
  202.                                     if (actorPortal.AnnId == allowActorAnnId || Hud.Game.CurrentRealTimeMilliseconds > blockActorTime)
  203.                                     {
  204.                                         allowActorAnnId = actorPortal.AnnId;
  205.                                         blockActorTime = Hud.Game.CurrentRealTimeMilliseconds + blockActorLapse;
  206.                                         msLapseAction = Hud.Game.CurrentRealTimeMilliseconds + pauseClick;
  207.                                         if (movemouse)  MoveMouseEventLClick((int)actorPortal.ScreenCoordinate.X + Hud.Window.Offset.X, (int)actorPortal.ScreenCoordinate.Y + Hud.Window.Offset.Y);
  208.                                         else    MouseEventLClick();
  209.                                     }
  210.                                 }
  211.                             }
  212.                         }
  213.                     }
  214.                 }
  215.             }
  216.         }
  217.     }
  218. }
Advertisement
Add Comment
Please, Sign In to add comment