EzPlugins

UrshiUpgrade

Mar 6th, 2025 (edited)
291
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.47 KB | None | 0 0
  1. using Turbo.Plugins.Default;
  2. using System;
  3. using System.Text;
  4. using System.Linq;
  5. using System.Windows.Forms;
  6. using SharpDX.DirectInput;
  7. using System.Runtime.InteropServices;
  8. using System.Text.RegularExpressions;
  9.  
  10. namespace Turbo.Plugins.Ez
  11. {
  12.     public class UrshiUpgrade : BasePlugin, IKeyEventHandler, IAfterCollectHandler, IInGameTopPainter
  13.     {
  14.         private static IntPtr D3Hwnd = IntPtr.Zero;
  15.         [DllImport("USER32.DLL")]
  16.         private static extern IntPtr FindWindow(string ClassName, string WindowText);
  17.         [DllImport("USER32.DLL")]
  18.         private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
  19.  
  20.         private static IntPtr MakeLParam(int x, int y)
  21.         {
  22.             return (IntPtr)(y << 16 | (x & 65535));
  23.         }
  24.  
  25.         public static void SendPressKey(Keys key)
  26.         {
  27.             SendMessage(D3Hwnd, 256U, (IntPtr)((int)key), IntPtr.Zero);
  28.             SendMessage(D3Hwnd, 257U, (IntPtr)((int)key), IntPtr.Zero);
  29.         }
  30.  
  31.         public void mouseLClickUiE(IUiElement uie)  // D3Hwnd
  32.         {
  33.             if (uie.Visible)
  34.             {
  35.                 IntPtr lParam = MakeLParam((int)(uie.Rectangle.X + uie.Rectangle.Width * 0.5f), (int)(uie.Rectangle.Y + uie.Rectangle.Height * 0.5f));
  36.                 SendMessage(D3Hwnd, 513U, (IntPtr)1, lParam);
  37.                 SendMessage(D3Hwnd, 514U, (IntPtr)1, lParam);
  38.             }
  39.         }
  40.  
  41.         protected IUiElement GemUpgradePane;
  42.         protected IUiElement Upgrade_Button;
  43.         protected IUiElement GemLevelText;
  44.         protected IUiElement GemUpgradeChance;
  45.         protected IUiElement Item_Button;
  46.         protected IUiElement Item0;
  47.         protected IUiElement Item0_Highlight;
  48.         protected IUiElement Click_Eater;
  49.  
  50.         private bool doUpgrade { get; set; } = true;
  51.         private bool autoSelect { get; set; } = true;
  52.         private string msgInfo { get; set; } = string.Empty;
  53.         private bool goFirst { get; set; } = false;
  54.  
  55.         private long msLapseAction { get; set; } = 0;
  56.         private long msLapseMin { get; set; } = 25;
  57.         private string NamePlugin { get; } = "[UrshiUpgrade] ";
  58.         private Func<int> UpgradeTimes { get; set; }
  59.  
  60.         public Keys keyTown { get; set; } = Keys.T; // Teleport To Town
  61.         public IKeyEvent ToggleKeyEvent { get; set; }
  62.         public IFont InfoFont { get; set; }
  63.  
  64.         public string TextTryInv { get; set; } = "Selecting Gem from Inventory (0,0)";
  65.         public string TextTryClick { get; set; } = "Pressing the button to update the Gem {0}"; // {0} = level gem
  66.         public string TextSelectYou { get; set; } = "You need to select a gem to upgrade";
  67.         public string TextNotUpgrade { get; set; } = "Select another Gem (non-upgradable)!";
  68.         public string TextMaxLevel { get; set; } = "Select another Gem to upgrade (max level)!";
  69.         public string TextReadLevel { get; set; } = "Cannot read Gem level";
  70.         public string TextProcessing { get; set; } = "Processing..";
  71.         public string TextClickDetected { get; set; } = "Clicking the button";
  72.         public string TextSelected { get; set; } = "There is a selected Gem";
  73.         public string TextAutoSelect { get; set; } = "\nAutoSelect Gem Inventory (0,0): {0}"; // {0} = On/Off
  74.         public string TextRunning { get; set; } = "\nRunning... Press {0} to Stop.";        // {0} = ToggleKeyEvent.ToString()
  75.         public string TextStopped { get; set; } = "\nStopped... Press {0} to Start.";   // {0} = ToggleKeyEvent.ToString()
  76.  
  77.  
  78.         public UrshiUpgrade()
  79.         {
  80.             Enabled = true;
  81.         }
  82.  
  83.         public override void Load(IController hud)
  84.         {
  85.             base.Load(hud);
  86.  
  87.             ToggleKeyEvent = Hud.Input.CreateKeyEvent(true, Key.F3, controlPressed: false, altPressed: false, shiftPressed: false); // Hotkey
  88.  
  89.             InfoFont = Hud.Render.CreateFont("tahoma", 8, 255, 200, 200, 0, true, false, 255, 0, 0, 0, true);
  90.  
  91.             GemUpgradePane = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane", null, null);
  92.             Upgrade_Button = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.upgrade_button", null, null);
  93.             Item_Button = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.item_button", null, null);
  94.             Item0 = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.items_list._content._stackpanel._tilerow0._item0.Item", null, null);
  95.             GemLevelText = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.gemLevelText", null, null);
  96.             GemUpgradeChance = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.gemUpgradeChance", null, null);
  97.             Item0_Highlight = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.items_list._content._stackpanel._tilerow0._item0.Highlight", null, null);
  98.             Click_Eater = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.click_eater", null, null);
  99.  
  100.             UpgradeTimes = () => Hud.Game.Me.GetAttributeValueAsInt(Hud.Sno.Attributes.Jewel_Upgrades_Bonus, 1048575, 0) + Hud.Game.Me.GetAttributeValueAsInt(Hud.Sno.Attributes.Jewel_Upgrades_Max, 1048575, 0) - Hud.Game.Me.GetAttributeValueAsInt(Hud.Sno.Attributes.Jewel_Upgrades_Used, 1048575, 0);
  101.  
  102.             D3Hwnd = FindWindow("D3 Main Window Class", null); // D3Hwnd = FindWindow(null, "Diablo III");
  103.         }
  104.  
  105.         public void OnKeyEvent(IKeyEvent keyEvent)
  106.         {
  107.             if (keyEvent.IsPressed && ToggleKeyEvent.Matches(keyEvent))
  108.             {
  109.                 if (GemUpgradePane.Visible)
  110.                 {
  111.                     if (doUpgrade)
  112.                     {
  113.                         doUpgrade = false;
  114.                         autoSelect = false;
  115.                     }
  116.                     else
  117.                     {
  118.                         doUpgrade = true;
  119.                     }
  120.                     goFirst = false;
  121.                 }
  122.             }
  123.         }
  124.  
  125.  
  126.         private bool JewelUpgradeable(IItem item)
  127.         {
  128.             switch (item.SnoItem.NameEnglish)
  129.             {                                                               // item.SnoItem.NameEnglish / item.SnoItem.Code / item.SnoActor.Sno (uint)
  130.                 case "Boon of the Hoarder": return item.JewelRank < 50;     // ITEM => NameEnglish: "Boon of the Hoarder" / Code: Hud.Sno.SnoItems.Unique_Gem_014_x1 / Sno: ActorSnoEnum._unique_gem_014_x1 (405803)
  131.                 case "Iceblink": return item.JewelRank < 50;                // ITEM => NameEnglish: "Iceblink" / Code: Hud.Sno.SnoItems.Unique_Gem_021_x1 / Sno: ActorSnoEnum._unique_gem_021_x1 (428355)
  132.                 case "Legacy of Dreams": return item.JewelRank < 99;        // ITEM => NameEnglish: "Legacy of Dreams" / Code: Hud.Sno.SnoItems.Unique_Gem_023_x1 / Sno: ActorSnoEnum._unique_gem_023_x1 (483318)
  133.                 case "Esoteric Alteration": return item.JewelRank < 100;    // ITEM => NameEnglish: "Esoteric Alteration" / Code: Hud.Sno.SnoItems.Unique_Gem_016_x1 / Sno: ActorSnoEnum._unique_gem_016_x1 (428033)
  134.                 case "Mutilation Guard": return item.JewelRank < 100;       // ITEM => NameEnglish: "Mutilation Guard" / Code: Hud.Sno.SnoItems.Unique_Gem_019_x1 / Sno: ActorSnoEnum._unique_gem_019_x1 (428346)
  135.                 case "Whisper of Atonement": return item.JewelRank < 150;   // ITEM => NameEnglish: "Whisper of Atonement" / Code: Hud.Sno.SnoItems.P73_Unique_Gem_125 / Sno: ActorSnoEnum._p73_swarmrift_gem_01 (486955)
  136.                 case "Gogok of Swiftness": return item.JewelRank < 150;     // ITEM => NameEnglish: "Gogok of Swiftness" / Code: Hud.Sno.SnoItems.Unique_Gem_008_x1 / Sno: ActorSnoEnum._unique_gem_008_x1 (486955)
  137.                 default: return true;
  138.             }
  139.         }
  140.  
  141.         public void AfterCollect()
  142.         {
  143.             if (Hud.Game.IsInGame && Hud.Game.Me.InGreaterRiftRank > 0 && Hud.Game.Quests.FirstOrDefault(q => q.SnoQuest.Sno == 337492)?.QuestStepId == 34) // Hud.Game.RiftPercentage == 100
  144.             {
  145.                 if (GemUpgradePane.Visible)
  146.                 {
  147.                     if (Hud.Game.CurrentRealTimeMilliseconds > msLapseAction)
  148.                     {
  149.                         msLapseAction = Hud.Game.CurrentRealTimeMilliseconds + msLapseMin;
  150.                         var gemInventory = Hud.Inventory.ItemsInInventory.FirstOrDefault(x => x.InventoryX == 0 && x.InventoryY == 0 && x.IsLegendary && x.SnoItem.MainGroupCode == "gems_unique");
  151.                         if (Item_Button.AnimState == -1)
  152.                         {
  153.                             if (gemInventory != null && autoSelect)
  154.                             {
  155.                                 if (!Item0_Highlight.Visible)
  156.                                 {
  157.                                     Item0.Refresh();
  158.                                     if (Item0.Visible)
  159.                                     {
  160.                                         if (goFirst) mouseLClickUiE(Item0); // Delay to avoid character movement / bad click
  161.                                         else goFirst = true;
  162.                                     }
  163.                                     msLapseAction += 150;
  164.                                     msgInfo = TextTryInv;
  165.                                 }
  166.                                 else msgInfo = TextMaxLevel;
  167.                             }
  168.                             else msgInfo = TextSelectYou;
  169.                         }
  170.                         else if (gemInventory != null && autoSelect && !Item0_Highlight.Visible && JewelUpgradeable(gemInventory))
  171.                         {
  172.                             if (Item0.Visible)  mouseLClickUiE(Item0);
  173.                             msLapseAction += 150;
  174.                             msgInfo = TextTryInv;
  175.                         }
  176.                         else if (doUpgrade)
  177.                         {
  178.                             if (Upgrade_Button.AnimState == 24 || Upgrade_Button.AnimState == 25)
  179.                             {
  180.                                 var match  = Regex.Match(GemLevelText.ReadText(Encoding.UTF8, true),  @"([0-9]+)");
  181.                                 if (match.Success && int.TryParse(match.Groups[1].Value, out var num))
  182.                                 {
  183.                                     if (num < 150 || (Item0_Highlight.Visible && gemInventory != null))
  184.                                     {
  185.                                         mouseLClickUiE(Upgrade_Button);
  186.                                         msgInfo = string.Format(TextTryClick, num);
  187.                                     }
  188.                                     else msgInfo = TextMaxLevel;
  189.                                 }
  190.                                 else msgInfo = TextReadLevel;
  191.                             }
  192.                             else if (Upgrade_Button.AnimState == 27)
  193.                             {
  194.                                 if (Click_Eater.Visible)
  195.                                 {
  196.                                     msgInfo = TextProcessing;
  197.                                     if (Hud.Game.Me.AnimationState != AcdAnimationState.CastingPortal && UpgradeTimes() < 3) SendPressKey(keyTown);
  198.                                 }
  199.                                 else  msgInfo = (Upgrade_Button.ReadText(Encoding.UTF8, true) !=  string.Empty)? TextNotUpgrade : string.Empty;
  200.                             }
  201.                             else msgInfo = TextClickDetected; // Upgrade_Button.AnimState == 26
  202.                         }
  203.                         else msgInfo = (Upgrade_Button.ReadText(Encoding.UTF8, true) !=  string.Empty && Upgrade_Button.AnimState == 27)? TextNotUpgrade : TextSelected;
  204.                     }
  205.                 }
  206.                 else if (msgInfo != string.Empty)
  207.                 {
  208.                     doUpgrade = true;
  209.                     autoSelect = true;
  210.                     msgInfo = string.Empty;
  211.                     goFirst = false;
  212.                 }
  213.             }
  214.         }
  215.  
  216.         public void PaintTopInGame(ClipState clipState)
  217.         {
  218.             if (clipState == ClipState.AfterClip && GemUpgradePane.Visible && msgInfo != string.Empty)
  219.             {
  220.                 var msg = NamePlugin + msgInfo + string.Format(TextAutoSelect, (autoSelect?"On":"Off")) + string.Format((doUpgrade?TextRunning:TextStopped), ToggleKeyEvent.ToString());
  221.                 InfoFont.DrawText(InfoFont.GetTextLayout(msg), GemUpgradePane.Rectangle.X + (GemUpgradePane.Rectangle.Width * 0.056f), GemUpgradePane.Rectangle.Y + (GemUpgradePane.Rectangle.Height * 0.082f));
  222.             }
  223.         }
  224.     }
  225. }
Add Comment
Please, Sign In to add comment