EzPlugins

EnchantPlugin

Mar 4th, 2025 (edited)
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 48.79 KB | None | 0 0
  1. // Small modification of the original plugin to work on TurboHud Free. Save to folder  plugins\LightningMod\
  2. namespace Turbo.Plugins.LightningMod
  3. {
  4.     using SharpDX.DirectInput;
  5.     using System.Linq;
  6.     using System.Windows.Forms;
  7.     using Turbo.Plugins.Default;
  8.  //   using Turbo.Plugins.glq;
  9.     using System;
  10.     using System.Text;
  11.     using System.Text.RegularExpressions;
  12.     using System.Runtime.InteropServices;
  13.  
  14.     public class EnchantPlugin : BasePlugin, IKeyEventHandler, IInGameTopPainter, IAfterCollectHandler
  15.     {
  16.         public static IntPtr D3Hwnd = IntPtr.Zero;
  17.         [DllImport("USER32.DLL")]
  18.         private static extern IntPtr FindWindow(string ClassName, string WindowText);
  19.  
  20.         [DllImport("user32.dll")]   // WM_KEYDOWN is 0x100 (256) //WM_KEYUP is 0x101 (257) //WM_CHAR (roughly equivalent to KeyPress) is 0x102 (258) // WM_SYSKEYDOWN is 0x104 (260) // WM_SYSKEYUP is 0x105 (261)
  21.         private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
  22.  
  23.         private static IntPtr MakeLParam(int x, int y)
  24.         {
  25.             return (IntPtr)(y << 16 | (x & 65535));
  26.         }
  27.  
  28.         public void mouseClickUiE(Keys key, IUiElement uie) // D3Hwnd
  29.         {
  30.             IntPtr lParam = MakeLParam((int)(uie.Rectangle.X + uie.Rectangle.Width * 0.5f), (int)(uie.Rectangle.Y + uie.Rectangle.Height * 0.5f));
  31.             switch (key)
  32.             {
  33.                 case Keys.LButton:
  34.                 {
  35.                     SendMessage(D3Hwnd, 513U, (IntPtr)1, lParam); SendMessage(D3Hwnd, 514U, (IntPtr)1, lParam);
  36.                     break;
  37.                 }
  38.                 case Keys.RButton:
  39.                 {
  40.                     SendMessage(D3Hwnd, 516U, (IntPtr)2, lParam); SendMessage(D3Hwnd, 517U, (IntPtr)2, lParam);
  41.                     break;
  42.                 }
  43.                 case Keys.MButton:
  44.                 {
  45.                     SendMessage(D3Hwnd, 519U, (IntPtr)16, lParam); SendMessage(D3Hwnd, 520U, (IntPtr)16, lParam);
  46.                     break;
  47.                 }
  48.                 default: break;
  49.             }
  50.         }
  51.  
  52.  
  53.         public bool TurnedOn { get; set; }
  54.         public IKeyEvent ToggleKeyEvent { get; set; }
  55.         public bool Running { get; private set; }
  56.         private int currentCount = 0;
  57.         private bool Perfect = false;
  58.         public int enchantCount { get; set; }//最大附魔次数
  59.         public int ReservedArcaneDust { get; set; }//保留奥术之尘
  60.         public int ReservedVeiledCrystal { get; set; }//保留水晶
  61.         public int ReservedForgottenSoul { get; set; }//保留遗忘之魂
  62.         public int ReservedDeathsBreath { get; set; }//保留死亡气息
  63.         public int ReservedGem { get; set; }//保留宝石
  64.         public long ReservedGold { get; set; }//保留金币
  65.         private IUiElement vendorPage;
  66.         private IUiElement enchantDialog;
  67.         private IUiElement enchantItem0;
  68.         private IUiElement enchantItem1;
  69.         private IUiElement enchantItem2;
  70.         private IUiElement enchantItem0Selected;
  71.         private IUiElement enchantItem1Selected;
  72.         private IUiElement enchantItem2Selected;
  73.         private IUiElement enchantButton;
  74.         private IUiElement affixListDialog;
  75.         public IFont HeaderFont { get; private set; }
  76.         public IFont InfoFont { get; private set; }
  77.         private string str_Header;
  78.         private string str_InfoLock;
  79.         private string str_InfoCommunity;
  80.         private string str_Info;
  81.         private string str_InfoPre;
  82.         private string str_NoItem;
  83.         private string str_NoAffixListShow;
  84.         private string str_Running;
  85.         private string str_times;
  86.         private string str_temp1;
  87.         private string str_temp2;
  88.         private string str_temp3;
  89.         private int tempX;
  90.         private int tempY;
  91.         private bool isIncommunity = false;
  92.         private string EnchantItemText = "";
  93.         private string AlternateProperty = "";
  94.         private long EnchantGold = 0;
  95.         private enum EnchantState : int
  96.         {
  97.             start = 0,         //启动状态机
  98.             generated = 1,     //生成了新属性
  99.             selected = 2,      //选择了新属性
  100.             changed = 3,        //改变了属性
  101.             end = 4,        //状态机完成
  102.             Unknown = int.MaxValue,
  103.         }
  104.         private EnchantState enchant_state = EnchantState.start;
  105.  
  106.         public EnchantPlugin()
  107.         {
  108.             Enabled = true;
  109.             TurnedOn = false;
  110.             Running = false;
  111.             Perfect = false;
  112.             enchantCount = 100000;//最大附魔次数
  113.             ReservedArcaneDust = 0;//保留奥术之尘
  114.             ReservedVeiledCrystal = 0;//保留水晶
  115.             ReservedForgottenSoul = 0;//保留遗忘之魂
  116.             ReservedDeathsBreath = 0;//保留死亡气息
  117.             ReservedGem = 0;//保留宝石
  118.             ReservedGold = 0;//保留金币
  119.     }
  120.  
  121.         public override void Load(IController hud)
  122.         {
  123.             base.Load(hud);
  124.  
  125.             str_Header = "【Auto Enchant-MOD】";
  126.             str_InfoPre = "Cursor Over Right Window\r\nTo Select Property\r\n";
  127.             str_Info = "Click {0} To Start";    // ToggleKeyEvent.ToString()
  128.             str_NoItem = "Place an Item";
  129.             str_NoAffixListShow = "Select Property And Click The \"?\" \r\nTo Display Alternate Property";
  130.             str_Running = "Auto Enchanting...\r\nClick {0} To Stop";    // ToggleKeyEvent.ToString()
  131.             str_times = "Enchant Times:";
  132.             str_temp2 = "Replace Property";
  133.             str_temp3 = "Select Property";
  134.  
  135.             ToggleKeyEvent = Hud.Input.CreateKeyEvent(true, Key.F3, false, false, false);
  136.  
  137.             vendorPage = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage", null, null);
  138.             enchantDialog = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog", null, null);
  139.             enchantItem0 = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item0.list_item_window.text", null, null); //第1条属性内容
  140.             enchantItem1 = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item1.list_item_window.text", null, null); //第2条属性内容
  141.             enchantItem2 = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item2.list_item_window.text", null, null); //第3条属性内容
  142.             enchantItem0Selected = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item0.list_item_window.selected_background", null, null); //属性选中为true
  143.             enchantItem1Selected = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item1.list_item_window.selected_background", null, null); //属性选中为true
  144.             enchantItem2Selected = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item2.list_item_window.selected_background", null, null); //属性选中为true
  145.             enchantButton = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.enchant_button", null, null); //属性生成按钮
  146.             affixListDialog = Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog", null, null); //可替换属性窗口
  147.  
  148.             HeaderFont = Hud.Render.CreateFont("tahoma", 12, 255, 200, 200, 100, true, false, 255, 0, 0, 0, true);
  149.             InfoFont = Hud.Render.CreateFont("tahoma", 8, 255, 200, 200, 0, true, false, 255, 0, 0, 0, true);
  150.  
  151.             D3Hwnd = FindWindow("D3 Main Window Class", null); // D3Hwnd = FindWindow(null, "Diablo III");
  152.         }
  153.  
  154.         public static string Between(string str, string strLeft, string strRight) //取文本中间
  155.         {
  156.             if (str == null || str.Length == 0) return "";
  157.             if (strLeft != null)
  158.             {
  159.                 int indexLeft = str.IndexOf(strLeft);//左边字符串位置
  160.                 if (indexLeft < 0) return "";
  161.                 indexLeft = indexLeft + strLeft.Length;//左边字符串长度
  162.                 if (strRight != null)
  163.                 {
  164.                     int indexRight = str.IndexOf(strRight, indexLeft);//右边字符串位置
  165.                     if (indexRight < 0) return "";
  166.                     return str.Substring(indexLeft, indexRight - indexLeft);//indexRight - indexLeft是取中间字符串长度
  167.                 }
  168.                 else return str.Substring(indexLeft, str.Length - indexLeft);//取字符串右边
  169.             }
  170.             else//取字符串左边
  171.             {
  172.                 if (strRight == null) return "";
  173.                 int indexRight = str.IndexOf(strRight);
  174.                 if (indexRight <= 0) return "";
  175.                 else return str.Substring(0, indexRight);
  176.             }
  177.         }
  178.  
  179.         private bool PlaceanItemtoReplaceaProperty()
  180.         {
  181.             var str = enchantButton.ReadText(Encoding.UTF8, true);
  182.             return str.Contains("放置一项物品来替换一项属性") //zhCN
  183.                 || str.Contains("放置物品以替換其屬性") //zhTW
  184.                 || str.Contains("Place an Item to Replace a Property") //enUS
  185.                 || str.Contains("Выберите предмет")//ruRU
  186.                 || str.Contains("속성을 교체할 아이템을 올려놓으십시오")//koKR
  187.                 || str.Contains("Zum Austausch Gegenstand platzieren")//deDE
  188.                 || str.Contains("Placez un objet")//frDR
  189.                 || str.Contains("Colloca un oggetto per incantarlo")//itIT
  190.                 || str.Contains("Colocar objeto")//esES
  191.                 || str.Contains("Coloca un objeto")//esMX
  192.                 || str.Contains("Umieść przedmiot")//plPL
  193.                 || str.Contains("Insira um Item")//ptPT
  194.                  ;
  195.         }
  196.         private bool ReplaceProperty()
  197.         {
  198.             var str = enchantButton.ReadText(Encoding.UTF8, true);
  199.             return str.Contains("替换属性")
  200.                 || str.Contains("替換屬性")
  201.                 || str.Contains("Replace Property")
  202.                 || str.Contains("Изменить")
  203.                 || str.Contains("속성 교체")
  204.                 || str.Contains("Eigenschaft austauschen")
  205.                 || str.Contains("Remplacer la propriété")
  206.                 || str.Contains("Sostituisci proprietà")
  207.                 || str.Contains("Reemplazar propiedad")
  208.                 || str.Contains("Reemplazar propiedad")
  209.                 || str.Contains("Zmień właściwość")
  210.                 || str.Contains("Substituir Propriedade")
  211.                  ;
  212.         }
  213.         private bool SelectProperty()
  214.         {
  215.             var str = enchantButton.ReadText(Encoding.UTF8, true);
  216.             return str.Contains("选择属性")
  217.                 || str.Contains("選擇屬性")
  218.                 || str.Contains("Select Property")
  219.                 || str.Contains("Выбрать свойство")
  220.                 || str.Contains("속성 선택")
  221.                 || str.Contains("Eigenschaft auswählen")
  222.                 || str.Contains("Choisir une propriété")
  223.                 || str.Contains("Seleziona proprietà")
  224.                 || str.Contains("Seleccionar propiedad")
  225.                 || str.Contains("Seleccionar propiedad")
  226.                 || str.Contains("Wybierz właściwość")
  227.                 || str.Contains("Selecionar Propriedade")
  228.                 ;
  229.         }
  230.         public void OnKeyEvent(IKeyEvent keyEvent)
  231.         {
  232.             if (ToggleKeyEvent.Matches(keyEvent))
  233.             {
  234.                 if (keyEvent.IsPressed)
  235.                 {
  236.                     if(AlternateProperty == "")
  237.                     {
  238.                         return;
  239.                     }
  240.                     if (!TurnedOn)
  241.                     {
  242.                         TurnedOn = true;
  243.                         Running = true;
  244.                         currentCount = 0;
  245.                         Perfect = false;
  246.                         enchant_state = EnchantState.start;
  247.                         EnchantItemText = getAffixItemTextByCursor();
  248.                     }
  249.                     else
  250.                     {
  251.                         TurnedOn = false;
  252.                         Running = false;
  253.                         currentCount = 0;
  254.                         AlternateProperty = "";//停止后清除选择的附魔词缀
  255.                     }
  256.                     TestTurnedOn();
  257.                 }
  258.             }
  259.         }
  260.         public void PaintTopInGame(ClipState clipState)
  261.         {
  262.             if (clipState != ClipState.Inventory) return;
  263.             if (!Hud.Game.IsInGame || !enchantDialog.Visible || !Hud.Inventory.InventoryMainUiElement.Visible) return;
  264.             var xDelta = 0.62f;
  265.             var xDelta1 = 0.1f;
  266.             var y = vendorPage.Rectangle.Y + vendorPage.Rectangle.Height * 0.037f;
  267.             var layout = HeaderFont.GetTextLayout(str_Header);
  268.             HeaderFont.DrawText(layout, vendorPage.Rectangle.X + (vendorPage.Rectangle.Width * xDelta - layout.Metrics.Width) / 2, y);
  269.             y += layout.Metrics.Height * 1.3f;
  270.             if (!Running)
  271.             {
  272.                 if (enchantItem0.Visible) //放置附魔物品
  273.                 {
  274.                     if (!affixListDialog.Visible || !isItemSelected())
  275.                     {
  276.                         layout = InfoFont.GetTextLayout(str_NoAffixListShow);
  277.                         InfoFont.DrawText(layout, vendorPage.Rectangle.X + vendorPage.Rectangle.Width * xDelta1, y);
  278.                     }
  279.                     else
  280.                     {
  281.                         AlternateProperty = getAffixItemTextByCursor();
  282.                         if (AlternateProperty == "")
  283.                         {
  284.                             layout = InfoFont.GetTextLayout(str_InfoPre);
  285.                             InfoFont.DrawText(layout, vendorPage.Rectangle.X + vendorPage.Rectangle.Width * xDelta1, y);
  286.                         }
  287.                         else
  288.                         {
  289.                             layout = InfoFont.GetTextLayout(string.Format(str_Info, ToggleKeyEvent.ToString()) + "\r\n\r\n" + str_temp3 + "\r\n" + processLongString(AlternateProperty) + "\r\n\r\n" + str_times + getRemainEnchantCount().ToString());
  290.                             InfoFont.DrawText(layout, vendorPage.Rectangle.X + vendorPage.Rectangle.Width * xDelta1, y);
  291.                         }
  292.                     }
  293.                 }
  294.                 else
  295.                 {
  296.                     layout = InfoFont.GetTextLayout(str_NoItem);
  297.                     InfoFont.DrawText(layout, vendorPage.Rectangle.X + vendorPage.Rectangle.Width * xDelta1, y);
  298.                 }
  299.             }
  300.             else
  301.             {
  302.                 layout = InfoFont.GetTextLayout(string.Format(str_Running, ToggleKeyEvent.ToString()) + "\r\n\r\n" + str_temp2 + "\r\n" + AlternateProperty + "\r\n\r\n" + str_times + "(" + currentCount.ToString() + "/" + enchantCount.ToString() + ")");
  303.                 InfoFont.DrawText(layout, vendorPage.Rectangle.X + vendorPage.Rectangle.Width * xDelta1, y);
  304.             }
  305.         }
  306.         //选取附魔词缀
  307.         private string getAffixItemTextByCursor()
  308.         {
  309.             var itemText = "";
  310.             IUiElement[] AffixListCanEnchanted =
  311.             {
  312.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item0.stack.text", null, null),
  313.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item1.stack.text", null, null),
  314.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item2.stack.text", null, null),
  315.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item3.stack.text", null, null),
  316.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item4.stack.text", null, null),
  317.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item5.stack.text", null, null),
  318.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item6.stack.text", null, null),
  319.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item7.stack.text", null, null),
  320.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item8.stack.text", null, null),
  321.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item9.stack.text", null, null),
  322.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item10.stack.text", null, null),
  323.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item11.stack.text", null, null),
  324.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item12.stack.text", null, null),
  325.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item13.stack.text", null, null),
  326.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item14.stack.text", null, null),
  327.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item15.stack.text", null, null),
  328.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item16.stack.text", null, null),
  329.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item17.stack.text", null, null),
  330.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item18.stack.text", null, null),
  331.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item19.stack.text", null, null),
  332.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item20.stack.text", null, null),
  333.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item21.stack.text", null, null),
  334.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item22.stack.text", null, null),
  335.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item23.stack.text", null, null),
  336.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item24.stack.text", null, null),
  337.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item25.stack.text", null, null),
  338.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item26.stack.text", null, null),
  339.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item27.stack.text", null, null),
  340.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item28.stack.text", null, null),
  341.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item29.stack.text", null, null),
  342.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item30.stack.text", null, null),
  343.                 Hud.Render.RegisterUiElement("Root.NormalLayer.validItemAffixes_dialog.affixes._content._stackpanel._item31.stack.text", null, null),
  344.             };
  345.  
  346.             for (int i=0; i<AffixListCanEnchanted.Length; i++)
  347.             {
  348.                 var uiRect = AffixListCanEnchanted[i];
  349.                 if (uiRect.Visible && Hud.Window.CursorInsideRect(uiRect.Rectangle.X, uiRect.Rectangle.Y, uiRect.Rectangle.Width, uiRect.Rectangle.Height))
  350.                 {
  351.                     var ss = uiRect.ReadText(Encoding.UTF8, true);
  352.                     ss = Regex.Replace(ss, @"\{icon.*?\}", ""); //removes {icon...}
  353.                     itemText = ss;
  354.                 }
  355.             }
  356.             return itemText;
  357.         }
  358.  
  359.         private int getTotalResource(IUiElement text)
  360.         {
  361.             if (text.Visible)
  362.             {
  363.                 var ss = text.ReadText(Encoding.UTF8, true);
  364.                 var tempstr = "";
  365.                 foreach (var c in ss)
  366.                 {
  367.                     if (c == '/' && tempstr != "")
  368.                     {
  369.                         if (tempstr == "*") return -1;
  370.                         else return (int)CustomNumericParse(tempstr);
  371.                     }
  372.                     else
  373.                     {
  374.                         tempstr += c;
  375.                     }
  376.                 }
  377.             }
  378.             return -1;
  379.         }
  380.         private int getUnitResource(IUiElement text)
  381.         {
  382.             if (text.Visible)
  383.             {
  384.                 var ss = text.ReadText(Encoding.UTF8, true);
  385.                 var tempstr = "";
  386.                 foreach (var c in ss)
  387.                 {
  388.                     if (c == '/')
  389.                     {
  390.                         tempstr = "";
  391.                     }
  392.                     else
  393.                     {
  394.                         tempstr += c;
  395.                     }
  396.                 }
  397.                 return (int)CustomNumericParse(tempstr);
  398.             }
  399.             return -1;
  400.         }
  401.         private int getRemainEnchantCount()
  402.         {
  403.             IUiElement[] uiMaterialList =
  404.             {
  405.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.required_materials.ingredient_0.text", null, null),  //奥数之尘
  406.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.required_materials.ingredient_1.text", null, null),  //萦雾水晶
  407.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.required_materials.ingredient_2.text", null, null),  //遗忘之魂
  408.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.required_materials.ingredient_3.text", null, null),  //死亡之息
  409.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.required_materials.ingredient_4.text", null, null),  //宝石
  410.             };
  411.             var uiGem = Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.required_materials.ingredient_4.icon", null, null);
  412.             long realMaterial = 0;
  413.             var gemid = 0;
  414.             enchantCount = 0;
  415.             for (int i=0; i<uiMaterialList.Length; i++)
  416.             {
  417.                 switch (i)
  418.                 {
  419.                     case 0:
  420.                         realMaterial = Hud.Game.Me.Materials.ArcaneDust - ReservedArcaneDust;
  421.                         break;
  422.                     case 1:
  423.                         realMaterial = Hud.Game.Me.Materials.VeiledCrystal - ReservedVeiledCrystal;
  424.                         break;
  425.                     case 2:
  426.                         realMaterial = Hud.Game.Me.Materials.ForgottenSoul - ReservedForgottenSoul;
  427.                         break;
  428.                     case 3:
  429.                         realMaterial = Hud.Game.Me.Materials.DeathsBreath - ReservedDeathsBreath;
  430.                         break;
  431.                     case 4:
  432.                         if(uiGem.Visible)
  433.                         {
  434.                             gemid = uiGem.AnimState;
  435.                             if(gemid == 53)//红宝石
  436.                             {
  437.                                 realMaterial = CountGems(1019190640) - ReservedGem;
  438.                             }
  439.                             else if(gemid == 15)//紫宝石
  440.                             {
  441.                                 realMaterial = CountGems(3446938397) - ReservedGem;
  442.                             }
  443.                             else if (gemid == 91)//钻石
  444.                             {
  445.                                 realMaterial = CountGems(3256663690) - ReservedGem;
  446.                             }
  447.                             else if (gemid == 34)//绿宝石
  448.                             {
  449.                                 realMaterial = CountGems(2838965544) - ReservedGem;
  450.                             }
  451.                             else if (gemid == 72)//黄宝石
  452.                             {
  453.                                 realMaterial = CountGems(4267641564) - ReservedGem;
  454.                             }
  455.                         }
  456.                         else
  457.                         {
  458.                             realMaterial = 0;
  459.                         }
  460.                         break;
  461.                     default:
  462.                         realMaterial = 0;
  463.                         break;
  464.                 }
  465.                 var u = getUnitResource(uiMaterialList[i]);//获取材料所需数量
  466.                 var total = realMaterial;
  467.                 var unit = (u <= 0) ? 0 : u;
  468.                 if(unit > 0 && total <= 0)
  469.                 {
  470.                     enchantCount = 0;//材料不足附魔次数为0
  471.                 }
  472.                 else if(unit > 0 && total > 0)
  473.                 {
  474.                     var c = total / unit;
  475.                     if (c < enchantCount || enchantCount == 0) enchantCount = (int)c; //取最少材料可附魔的次数
  476.                 }
  477.  
  478.             }
  479.             return enchantCount;
  480.         }
  481.         private long CountGems(uint snoItem)//获取宝石数量
  482.         {
  483.             var count = 0;
  484.             foreach (var item in Hud.Inventory.ItemsInStash)
  485.             {
  486.                 if (item.SnoItem.Sno == snoItem) count += (int)item.Quantity;
  487.             }
  488.  
  489.             foreach (var item in Hud.Inventory.ItemsInInventory)
  490.             {
  491.                 if (item.SnoItem.Sno == snoItem) count += (int)item.Quantity;
  492.             }
  493.             return count;
  494.         }
  495.         private string processLongString(string str)
  496.         {
  497.             var ss = "";
  498.             int count = 0;
  499.             if (str.Length > 50)
  500.             {
  501.                 foreach(var c in str)
  502.                 {
  503.                     if (count == 50) ss += "\r\n";
  504.                     ss += c;
  505.                     count ++;
  506.                 }
  507.                 return ss;
  508.             }
  509.             else
  510.             {
  511.                 return str;
  512.             }
  513.         }
  514.         private string removeValue(string text)
  515.         {
  516.             var ss = "";
  517.             if (text == null) return ss;
  518.             foreach(var c in text)
  519.             {
  520.                 if ((c >= '0' && c <= '9') || c == '.' || c == '-' || c == ',') continue;
  521.                 ss += c;
  522.             }
  523.             return ss;
  524.         }
  525.  
  526.         //获取词缀条目
  527.         private string getItemContent(string itemText)
  528.         {
  529.             if (itemText == null) return "";
  530.             var ss = itemText;
  531.             ss = ss.Replace("点闪电伤害", "点伤害");//zhCN
  532.             ss = ss.Replace("点火焰伤害", "点伤害");
  533.             ss = ss.Replace("点冰霜伤害", "点伤害");
  534.             ss = ss.Replace("点毒性伤害", "点伤害");
  535.             ss = ss.Replace("点奥术伤害", "点伤害");
  536.             ss = ss.Replace("点神圣伤害", "点伤害");
  537.  
  538.             ss = ss.Replace("點電擊傷害", "點傷害");//zhTW
  539.             ss = ss.Replace("點火焰傷害", "點傷害");
  540.             ss = ss.Replace("點冰寒傷害", "點傷害");
  541.             ss = ss.Replace("點毒素傷害", "點傷害");
  542.             ss = ss.Replace("點秘法傷害", "點傷害");
  543.             ss = ss.Replace("點神聖傷害", "點傷害");
  544.  
  545.             ss = ss.Replace("Lightning Damage", "Damage");//enUS
  546.             ss = ss.Replace("Fire Damage", "Damage");
  547.             ss = ss.Replace("Cold Damage", "Damage");
  548.             ss = ss.Replace("Poison Damage", "Damage");
  549.             ss = ss.Replace("Arcane Damage", "Damage");
  550.             ss = ss.Replace("Holy Damage", "Damage");
  551.  
  552.             ss = ss.Replace("ед. урона от молнии", "ед. урона");//ruRU
  553.             ss = ss.Replace("ед. урона от огня", "ед. урона");
  554.             ss = ss.Replace("ед. урона от холода", "ед. урона");
  555.             ss = ss.Replace("ед. урона от яда", "ед. урона");
  556.             ss = ss.Replace("ед. урона от тайной магии", "ед. урона");
  557.             ss = ss.Replace("ед. урона от сил Света", "ед. урона");
  558.  
  559.             ss = ss.Replace("번개 무기 공격력", "무기 공격력");//koKR
  560.             ss = ss.Replace("화염 무기 공격력", "무기 공격력");
  561.             ss = ss.Replace("냉기 무기 공격력", "무기 공격력");
  562.             ss = ss.Replace("독 무기 공격력", "무기 공격력");
  563.             ss = ss.Replace("비전 무기 공격력", "무기 공격력");
  564.             ss = ss.Replace("신성 무기 공격력", "무기 공격력");
  565.  
  566.             ss = ss.Replace("Blitzschaden", "Schaden");//deDE
  567.             ss = ss.Replace("Feuerschaden", "Schaden");
  568.             ss = ss.Replace("Kälteschaden", "Schaden");
  569.             ss = ss.Replace("Giftschaden", "Schaden");
  570.             ss = ss.Replace("Arkanschaden", "Schaden");
  571.             ss = ss.Replace("Heiligschaden", "Schaden");
  572.  
  573.             ss = ss.Replace("points de dégâts de foudre", "points de dégâts");//frFR
  574.             ss = ss.Replace("points de dégâts de feu", "points de dégâts");
  575.             ss = ss.Replace("points de dégâts de froid", "points de dégâts");
  576.             ss = ss.Replace("points de dégâts de poison", "points de dégâts");
  577.             ss = ss.Replace("points de dégâts arcaniques", "points de dégâts");
  578.             ss = ss.Replace("points de dégâts sacrés", "points de dégâts");
  579.  
  580.             ss = ss.Replace("danni da fulmine", "danni");//itIT
  581.             ss = ss.Replace("danni da fuoco", "danni");
  582.             ss = ss.Replace("danni da freddo", "danni");
  583.             ss = ss.Replace("danni da veleno", "danni");
  584.             ss = ss.Replace("danni arcani", "danni");
  585.             ss = ss.Replace("danni sacri", "danni");
  586.  
  587.             ss = ss.Replace("p. de daño de rayos", "p.de daño");//esES
  588.             ss = ss.Replace("p. de daño de fuego", "p.de daño");
  589.             ss = ss.Replace("p. de daño de frío", "p.de daño");
  590.             ss = ss.Replace("p. de daño de veneno", "p.de daño");
  591.             ss = ss.Replace("p. de daño arcano", "p.de daño");
  592.             ss = ss.Replace("p. de daño sagrado", "p.de daño");
  593.  
  594.             ss = ss.Replace("de daño de Rayo", "de daño");//enMX
  595.             ss = ss.Replace("de daño de Fuego", "de daño");
  596.             ss = ss.Replace("de daño de Frío", "de daño");
  597.             ss = ss.Replace("de daño de Veneno", "de daño");
  598.             ss = ss.Replace("de daño Arcano", "de daño");
  599.             ss = ss.Replace("de daño Sacro", "de daño");
  600.  
  601.             ss = ss.Replace("obrażeń od błyskawic", "obrażeń");//plPL
  602.             ss = ss.Replace("obrażeń od ognia", "obrażeń");
  603.             ss = ss.Replace("obrażeń od zimna", "obrażeń");
  604.             ss = ss.Replace("obrażeń od trucizny", "obrażeń");
  605.             ss = ss.Replace("obrażeń od mocy tajemnej", "obrażeń");
  606.             ss = ss.Replace("obrażeń od mocy świętej", "obrażeń");
  607.  
  608.             ss = ss.Replace("de dano Elétrico", "de dano");//ptPT
  609.             ss = ss.Replace("de dano Ígneo", "de dano");
  610.             ss = ss.Replace("de dano Gélido", "de dano");
  611.             ss = ss.Replace("de dano Venenoso", "de dano");
  612.             ss = ss.Replace("de dano Arcano", "de dano");
  613.             ss = ss.Replace("de dano Sagrado", "de dano");
  614.  
  615.             ss = Regex.Replace(ss, @"\{.*?\}", ""); //removes {...}
  616.             ss = Regex.Replace(ss, @"\[.*?\]", ""); //removes [...]
  617.             ss = Regex.Replace(ss, @"\(.*?\)", ""); //removes (...)
  618.             ss = removeValue(ss);
  619.             return ss.Trim();//避免部分词条前后可能有空格导致不一致,例如英文版爆伤词缀后多了个空格
  620.         }
  621.         //获取词缀值
  622.         private string getItemValue(string itemText)
  623.         {
  624.             if (itemText == null) return "";
  625.             var ss = "";
  626.             var find = false;
  627.             Regex re = new Regex(@"\[(?<result>)[^[\]]+\]");  //取中括号中的内容
  628.             MatchCollection mc = re.Matches(itemText);
  629.             foreach (Match ma in mc)
  630.             {
  631.                 ss = Regex.Replace(ma.Value, @"[\[\]]", ""); //removes [];
  632.                 string[] arr = ss.Split('-');
  633.                 foreach (var s in arr)
  634.                 {
  635.                     ss = s;
  636.                 }
  637.                 arr = ss.Split('~');
  638.                 foreach (var s in arr)
  639.                 {
  640.                     ss = s;
  641.                 }
  642.                 find = true;
  643.             }
  644.             /*if (!find)
  645.             {
  646.                 re = new Regex(@"\((?<result>)[^[\]]+\)"); //取小括号中的内容,主要用于获取镶孔数量,此处存在问题会导致英文版客户端优先获取到错误内容(仅XX职业)导致无法转换数字
  647.                 mc = re.Matches(itemText);
  648.                 foreach (Match ma in mc)
  649.                 {
  650.                     ss = Regex.Replace(ma.Value, "[()]", ""); //removes ()
  651.                     find = true;
  652.                 }
  653.             }*/
  654.             if (!find)
  655.             {
  656.                 var tempStr = "";
  657.                 var i = 0;
  658.                 var N = 0;
  659.                 foreach (var c in itemText)
  660.                 {
  661.                     i++;
  662.                     if ((c >= '0' && c <= '9'))
  663.                     {
  664.                         tempStr += c;
  665.                         N = i;//记录数字的位置
  666.                     }
  667.                     if(c == '-' || c == '~')
  668.                     {
  669.                         tempStr += c;
  670.                     }
  671.                     if (c == '.' && (i - 1 == N))//记录数字之后1位的“.”避免英文句号被记录
  672.                     {
  673.                         tempStr += c;
  674.                     }
  675.                 }
  676.                 find = true;
  677.                 ss = tempStr;
  678.             }
  679.             if(ss.Contains("-"))//取最大伤害白字
  680.             {
  681.                 var arr = ss.Split('-');
  682.                 ss = arr[1];
  683.             }
  684.             if (ss.Contains("~"))//koKR取最大伤害白字
  685.             {
  686.                 var arr = ss.Split('~');
  687.                 ss = arr[1];
  688.             }
  689.             ss = Regex.Replace(ss, ",", "");
  690.             return Regex.Replace(ss, " ","");
  691.         }
  692.         //判断词缀是否应被选择
  693.         private bool isItemSelected()
  694.         {
  695.             IUiElement[] ItemList =
  696.             {
  697.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item0.list_item_window.selected_background", null, null), //属性选中为true
  698.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item1.list_item_window.selected_background", null, null), //属性选中为true
  699.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item2.list_item_window.selected_background", null, null), //属性选中为true
  700.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item3.list_item_window.selected_background", null, null), //属性选中为true
  701.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item4.list_item_window.selected_background", null, null), //属性选中为true
  702.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item5.list_item_window.selected_background", null, null), //属性选中为true
  703.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item6.list_item_window.selected_background", null, null), //属性选中为true
  704.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item7.list_item_window.selected_background", null, null), //属性选中为true
  705.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item8.list_item_window.selected_background", null, null), //属性选中为true
  706.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item9.list_item_window.selected_background", null, null), //属性选中为true
  707.             };
  708.  
  709.             return ItemList.Any(a =>a.Visible);
  710.         }
  711.         private void AutoEnchantWork()
  712.         {
  713.             IUiElement[] ItemTextList =
  714.             {
  715.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item0.list_item_window.text", null, null), //第1条属性内容
  716.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item1.list_item_window.text", null, null), //第2条属性内容
  717.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item2.list_item_window.text", null, null), //第3条属性内容
  718.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item3.list_item_window.text", null, null), //第3条属性内容
  719.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item4.list_item_window.text", null, null), //第3条属性内容
  720.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item5.list_item_window.text", null, null), //第3条属性内容
  721.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item6.list_item_window.text", null, null), //第3条属性内容
  722.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item7.list_item_window.text", null, null), //第3条属性内容
  723.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item8.list_item_window.text", null, null), //第3条属性内容
  724.                 Hud.Render.RegisterUiElement("Root.NormalLayer.vendor_dialog_mainPage.enchant_dialog.LayoutRoot.item_affix_list._content._stackpanel._item9.list_item_window.text", null, null), //第3条属性内容
  725.             };
  726.  
  727.             if (EnchantItemText == ""
  728.                 || !enchantDialog.Visible
  729.                 || !enchantButton.Visible        //保证放置附魔物品
  730.                 || PlaceanItemtoReplaceaProperty()
  731.             ) return;
  732.  
  733.  
  734.             //能执行到这里,表示可以附魔了
  735.             if (isItemSelected())   //有词缀选中
  736.             {
  737.                 if (ReplaceProperty() && enchant_state != EnchantState.generated)   //首次附魔或更新已经附魔词缀,这个按下去,会产生新词缀
  738.                 {
  739.                     //获取附魔所需金币
  740.                     string gold = "";
  741.  
  742.                         gold = Between(enchantButton.ReadText(Encoding.UTF8, true), ":", "{");
  743.  
  744.                     if (gold.Contains(","))//处理千位分隔符
  745.                     {
  746.                         gold = gold.Replace(",", "");
  747.                     }
  748.                     if (gold.Contains("."))//处理deDE千位分隔符
  749.                     {
  750.                         gold = gold.Replace(".", "");
  751.                     }
  752.                     if (gold.Contains(" "))//处理frFR千位分隔符,不是普通的空格
  753.                     {
  754.                         gold = gold.Replace(" ", "");
  755.                     }
  756.                     gold = gold.Replace(" ", "");//处理可能出现的普通空格
  757.                     if (gold == "")
  758.                     {
  759.                         EnchantGold = 0;
  760.                     }
  761.                     else
  762.                     {
  763.                         EnchantGold = long.Parse(gold);
  764.                     }
  765.                     //按下附魔按钮前的条件
  766.                     var text0 = ItemTextList[0].ReadText(Encoding.UTF8, true);
  767.                     if (Perfect == true || (getItemContent(text0) == getItemContent(EnchantItemText) && getItemValue(text0) == getItemValue(EnchantItemText))//附魔词缀达到最大值
  768.                         || currentCount >= enchantCount //附魔次数完成
  769.                         || Hud.Game.Me.Materials.Gold - EnchantGold <= ReservedGold//金币低于保留数量
  770.                         )
  771.                     {
  772.                         Running = false;
  773.                         TurnedOn = false;
  774.                         Perfect = false;
  775.                         currentCount = 0;
  776.                     }
  777.                     else
  778.                     {
  779.                         mouseClickUiE(Keys.LButton, enchantButton); // Hud.Interaction.ClickUiElement(MouseButtons.Left, enchantButton);
  780.                         enchant_state = EnchantState.generated;
  781.                         currentCount++;  //完成一次附魔
  782.                     }
  783.                 }
  784.                 else if (SelectProperty() && enchant_state != EnchantState.changed)  //选中词缀替换现有词缀
  785.                 {
  786.                     enchant_state = EnchantState.changed;
  787.                     mouseClickUiE(Keys.LButton, enchantButton); // Hud.Interaction.ClickUiElement(MouseButtons.Left, enchantButton);
  788.                 }
  789.             }
  790.             else if (ItemTextList.Where(a =>a.Visible).Count() >= 3)//没有词缀选中,需要选择合适词缀,要等三个词缀都出现
  791.             {
  792.                 var text0 = ItemTextList[0].ReadText(Encoding.UTF8, true);//词缀列表第一个词缀
  793.                 double Item0Value = CustomNumericParse(getItemValue(text0));
  794.                 if (getItemContent(text0) == getItemContent(EnchantItemText))   //如果当前词缀是符合要求的,选择属性更好的词缀
  795.                 {
  796.                     var selectItem = ItemTextList[0];
  797.                     foreach (var item in ItemTextList)
  798.                     {
  799.                         if (!item.Visible) continue;
  800.                         var text = item.ReadText(Encoding.UTF8, true);
  801.  
  802.                         if (getItemContent(text) == getItemContent(EnchantItemText))
  803.                         {
  804.                             double ItemValue = CustomNumericParse(getItemValue(text));
  805.                             if (ItemValue >= Item0Value && ItemValue >= CustomNumericParse(getItemValue(selectItem.ReadText(Encoding.UTF8, true))))
  806.                             {
  807.                                 selectItem = item;
  808.                                 if (getItemContent(text) == getItemContent(EnchantItemText) && getItemValue(text) == getItemValue(EnchantItemText))//附魔词缀达到最大值
  809.                                 {
  810.                                     Perfect = true;
  811.                                     break;
  812.                                 }
  813.                             }
  814.                         }
  815.                     }
  816.                     if (selectItem.Visible && enchant_state != EnchantState.selected && SelectProperty())
  817.                     {
  818.                         mouseClickUiE(Keys.LButton, selectItem);    // Hud.Interaction.ClickUiElement(MouseButtons.Left, selectItem);
  819.                         enchant_state = EnchantState.selected;
  820.                     }
  821.                 }
  822.                 else //选择属性正确的词缀
  823.                 {
  824.                     var selectItem = ItemTextList[0];
  825.                     foreach (var item in ItemTextList)
  826.                     {
  827.                         if (!item.Visible) continue;
  828.                         var text = item.ReadText(Encoding.UTF8, true);
  829.                         if (getItemContent(text) == getItemContent(EnchantItemText))
  830.                         {
  831.                             selectItem = item;
  832.                             if (getItemContent(text) == getItemContent(EnchantItemText) && getItemValue(text) == getItemValue(EnchantItemText))//附魔词缀达到最大值
  833.                             {
  834.                                 Perfect = true;
  835.                                 break;
  836.                             }
  837.                             break;
  838.                         }
  839.                     }
  840.                     if (selectItem.Visible && enchant_state != EnchantState.selected && SelectProperty())
  841.                     {
  842.                          mouseClickUiE(Keys.LButton, selectItem);   // Hud.Interaction.ClickUiElement(MouseButtons.Left, selectItem);
  843.                         enchant_state = EnchantState.selected;
  844.                     }
  845.                 }
  846.             }
  847.         }
  848.         public void AfterCollect()
  849.         {
  850.  
  851.             if (!TestTurnedOn()) return;
  852.             if (!Running) return;
  853.             AutoEnchantWork();
  854.         }
  855.         private bool TestTurnedOn()
  856.         {
  857.             if (!Hud.Game.IsInGame
  858.                 || !Hud.Inventory.InventoryMainUiElement.Visible
  859.                 || !enchantDialog.Visible
  860.                 || !Hud.Window.IsForeground
  861.                 )
  862.             {
  863.                 TurnedOn = false;
  864.                 Running = false;
  865.                 enchant_state = EnchantState.start;
  866.             }
  867.             return TurnedOn;
  868.         }
  869.  
  870.         private double CustomNumericParse(string v)
  871.         {
  872.             double returnV = 0d;
  873.             try
  874.             {
  875.                 returnV = (double)decimal.Parse(v);
  876.                 return returnV;
  877.             }
  878.             catch (FormatException)
  879.             {
  880.                 Hud.Debug(v);
  881.                 if (string.IsNullOrEmpty(v)) return 0d; //如果输入的字符串为空或NULL,则直接返回0
  882.                 if (!char.IsDigit(v[0])) return 0d; //如果输入的字符串是非数字开头,直接返回0
  883.                 string subV = string.Empty;
  884.                 for (int i = 0; i < v.Length; i++)
  885.                 {
  886.                     if (char.IsDigit(v[i]) || (v[i].Equals('.') && !subV.Contains("."))) //从左至右,判断字符串的每位字符是否是数字或小数点,小数点只保留第一个
  887.                         subV += v[i];
  888.                     else
  889.                         break;
  890.                 }
  891.                 subV.TrimEnd(new char[] { '.' }); // 如果解析后的子字符串的末位是小数点,则去掉它
  892.  
  893.                 if (subV.Contains(".")) // 如果解析结果包含小数点,则根据小数点分两段求值
  894.                 {
  895.                     string strPointRight = subV.Substring(subV.IndexOf('.') + 1); //小数点右侧部分
  896.                     subV = subV.Substring(0, subV.IndexOf('.')); //小数点左侧部分
  897.                                                                  //计算小数点右侧的部分
  898.                     for (int i = 0; i < strPointRight.Length; i++)
  899.                     {
  900.                         returnV += ((int)strPointRight[i] - 48) / Math.Pow(10, i + 1); //(int)strPointRight[i] 是取该字符的ASCII码
  901.                     }
  902.                 }
  903.                 //计算小数点左侧的部分
  904.                 int iLen = subV.Length; //小数点左侧部分的长度
  905.                 for (int i = 0; i < iLen; i++)
  906.                 {
  907.                     returnV += ((int)subV[i] - 48) * Math.Pow(10, iLen - 1 - i); //按位乘以10的幂,并和小数点右侧结果相加
  908.                 }
  909.                 return returnV;
  910.             }
  911.             finally
  912.             {
  913.             }
  914.  
  915.         }
  916.     }
  917. }
Add Comment
Please, Sign In to add comment