EzPlugins

UrshiUpgrade

Mar 6th, 2025 (edited)
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.89 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.  
  54.         private long msLapseAction { get; set; } = 0;
  55.         private long msLapseMin { get; set; } = 20;
  56.         private string NamePlugin { get; } = "[UrshiUpgrade] ";
  57.         private Func<int> UpgradeTimes { get; set; }
  58.  
  59.         public Keys keyTown { get; set; } = Keys.T; // Teleport To Town
  60.         public IKeyEvent ToggleKeyEvent { get; set; }
  61.         public IFont InfoFont { get; set; }
  62.  
  63.         public string TextTryInv { get; set; } = "Selecting Gem from Inventory (0,0)";
  64.         public string TextTryClick { get; set; } = "Pressing the button to update the Gem {0}"; // {0} = level gem
  65.         public string TextSelectYou { get; set; } = "You need to select a gem to upgrade";
  66.         public string TextNotUpgrade { get; set; } = "Select another Gem (non-upgradable)!";
  67.         public string TextMaxLevel { get; set; } = "Select another Gem to upgrade (max level)!";
  68.         public string TextReadLevel { get; set; } = "Cannot read Gem level";
  69.         public string TextProcessing { get; set; } = "Processing..";
  70.         public string TextClickDetected { get; set; } = "Clicking the button";
  71.         public string TextSelected { get; set; } = "There is a selected Gem";
  72.         public string TextAutoSelect { get; set; } = "\nAutoSelect Gem Inventory (0,0): {0}"; // {0} = On/Off
  73.         public string TextRunning { get; set; } = "\nRunning... Press {0} to Stop.";        // {0} = ToggleKeyEvent.ToString()
  74.         public string TextStopped { get; set; } = "\nStopped... Press {0} to Start.";   // {0} = ToggleKeyEvent.ToString()
  75.  
  76.  
  77.         public UrshiUpgrade()
  78.         {
  79.             Enabled = true;
  80.         }
  81.  
  82.         public override void Load(IController hud)
  83.         {
  84.             base.Load(hud);
  85.  
  86.             ToggleKeyEvent = Hud.Input.CreateKeyEvent(true, Key.F3, controlPressed: false, altPressed: false, shiftPressed: false); // Hotkey
  87.  
  88.             InfoFont = Hud.Render.CreateFont("tahoma", 8, 255, 200, 200, 0, true, false, 255, 0, 0, 0, true);
  89.  
  90.             GemUpgradePane = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane", null, null);
  91.             Upgrade_Button = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.upgrade_button", null, null);
  92.             Item_Button = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.item_button", null, null);
  93.             Item0 = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.items_list._content._stackpanel._tilerow0._item0.Item", null, null);
  94.             GemLevelText = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.gemLevelText", null, null);
  95.             GemUpgradeChance = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.gemUpgradeChance", null, null);
  96.             Item0_Highlight = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.items_list._content._stackpanel._tilerow0._item0.Highlight", null, null);
  97.             Click_Eater = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.riftReward_dialog.LayoutRoot.gemUpgradePane.click_eater", null, null);
  98.  
  99.             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);
  100.  
  101.             D3Hwnd = FindWindow("D3 Main Window Class", null); // D3Hwnd = FindWindow(null, "Diablo III");
  102.         }
  103.  
  104.         public void OnKeyEvent(IKeyEvent keyEvent)
  105.         {
  106.             if (keyEvent.IsPressed && ToggleKeyEvent.Matches(keyEvent))
  107.             {
  108.                 if (GemUpgradePane.Visible)
  109.                 {
  110.                     if (doUpgrade)
  111.                     {
  112.                         doUpgrade = false;
  113.                         autoSelect = false;
  114.                     }
  115.                     else
  116.                     {
  117.                         doUpgrade = true;
  118.                     }
  119.                 }
  120.             }
  121.         }
  122.  
  123.  
  124.         private bool JewelUpgradeable(IItem item)
  125.         {
  126.             switch (item.SnoItem.NameEnglish)
  127.             {                                                               // item.SnoItem.NameEnglish / item.SnoItem.Code / item.SnoActor.Sno (uint)
  128.                 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)
  129.                 case "Iceblink": return item.JewelRank < 50;                // ITEM => NameEnglish: "Iceblink" / Code: Hud.Sno.SnoItems.Unique_Gem_021_x1 / Sno: ActorSnoEnum._unique_gem_021_x1 (428355)
  130.                 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)
  131.                 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)
  132.                 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)
  133.                 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)
  134.                 default: return true;
  135.             }
  136.         }
  137.  
  138.         public void AfterCollect()
  139.         {
  140.             if (Hud.Game.IsInGame && Hud.Game.Me.InGreaterRiftRank > 0 && Hud.Game.Quests.Any(q => q.SnoQuest.Sno == 337492 && q.QuestStepId == 34)) // Hud.Game.RiftPercentage == 100
  141.             {
  142.                 if (GemUpgradePane.Visible)
  143.                 {
  144.                     if (Hud.Game.CurrentRealTimeMilliseconds > msLapseAction)
  145.                     {
  146.                         msLapseAction = Hud.Game.CurrentRealTimeMilliseconds + msLapseMin;
  147.                         var gemInventory = Hud.Inventory.ItemsInInventory.FirstOrDefault(x => x.InventoryX == 0 && x.InventoryY == 0 && x.IsLegendary && x.SnoItem.MainGroupCode == "gems_unique");
  148.                         if (Item_Button.AnimState == -1)
  149.                         {
  150.                             if (autoSelect && gemInventory != null)
  151.                             {
  152.                                 mouseLClickUiE(Item0);
  153.                                 msLapseAction += 150;
  154.                                 msgInfo = TextTryInv;
  155.                             }
  156.                             else msgInfo = TextSelectYou;
  157.                         }
  158.                         else if (autoSelect && gemInventory != null && !Item0_Highlight.Visible && JewelUpgradeable(gemInventory))
  159.                         {
  160.                             mouseLClickUiE(Item0);
  161.                             msLapseAction += 150;
  162.                             msgInfo = TextTryInv;
  163.                         }
  164.                         else if (doUpgrade)
  165.                         {
  166.                             if (Upgrade_Button.AnimState == 24 || Upgrade_Button.AnimState == 25)
  167.                             {
  168.                                 var match  = Regex.Match(GemLevelText.ReadText(Encoding.UTF8, true),  @"([0-9]+)");
  169.                                 if (match.Success && int.TryParse(match.Groups[1].Value, out var num))
  170.                                 {
  171.                                     if (num < 150 || (Item0_Highlight.Visible && gemInventory != null))
  172.                                     {
  173.                                         mouseLClickUiE(Upgrade_Button);
  174.                                         msgInfo = string.Format(TextTryClick, num);
  175.                                     }
  176.                                     else msgInfo = TextMaxLevel;
  177.                                 }
  178.                                 else msgInfo = TextReadLevel;
  179.                             }
  180.                             else if (Upgrade_Button.AnimState == 27)
  181.                             {
  182.                                 if (Click_Eater.Visible)
  183.                                 {
  184.                                     msgInfo = TextProcessing;
  185.                                     if (Hud.Game.Me.AnimationState != AcdAnimationState.CastingPortal && UpgradeTimes() < 3) SendPressKey(keyTown);
  186.                                 }
  187.                                 else  msgInfo = (Upgrade_Button.ReadText(Encoding.UTF8, true) !=  string.Empty)? TextNotUpgrade : string.Empty;
  188.                             }
  189.                             else msgInfo = TextClickDetected; // Upgrade_Button.AnimState == 26
  190.                         }
  191.                         else msgInfo = (Upgrade_Button.ReadText(Encoding.UTF8, true) !=  string.Empty && Upgrade_Button.AnimState == 27)? TextNotUpgrade : TextSelected;
  192.                     }
  193.                 }
  194.                 else if (msgInfo != string.Empty)
  195.                 {
  196.                     doUpgrade = true;
  197.                     autoSelect = true;
  198.                     msgInfo = string.Empty;
  199.                 }
  200.             }
  201.         }
  202.  
  203.         public void PaintTopInGame(ClipState clipState)
  204.         {
  205.             if (clipState == ClipState.AfterClip && GemUpgradePane.Visible && msgInfo != string.Empty)
  206.             {
  207.                 var msg = NamePlugin + msgInfo + string.Format(TextAutoSelect, (autoSelect?"On":"Off")) + string.Format((doUpgrade?TextRunning:TextStopped), ToggleKeyEvent.ToString());
  208.                 InfoFont.DrawText(InfoFont.GetTextLayout(msg), GemUpgradePane.Rectangle.X + (GemUpgradePane.Rectangle.Width * 0.056f), GemUpgradePane.Rectangle.Y + (GemUpgradePane.Rectangle.Height * 0.082f));
  209.             }
  210.         }
  211.     }
  212. }
Add Comment
Please, Sign In to add comment