EzPlugins

EnchantPlugin

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