Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 43.71 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Windows.Forms;
  7. using FullRareSetManager.SetParts;
  8. using FullRareSetManager.Utilities;
  9. using PoeHUD.Controllers;
  10. using PoeHUD.Framework;
  11. using PoeHUD.Models;
  12. using PoeHUD.Models.Enums;
  13. using PoeHUD.Models.Interfaces;
  14. using PoeHUD.Plugins;
  15. using PoeHUD.Poe.Components;
  16. using PoeHUD.Poe.Elements;
  17. using PoeHUD.Poe.RemoteMemoryObjects;
  18. using SharpDX;
  19. using PoeHUD.Hud;
  20. using PoeHUD.Hud.Menu;
  21. using PoeHUD.Poe;
  22. using System.Threading.Tasks;
  23. using System.Diagnostics;
  24.  
  25. namespace FullRareSetManager
  26. {
  27.     public class Core : BaseSettingsPlugin<FullRareSetManagerSettings>
  28.     {
  29.         private const int INPUT_DELAY = 15;
  30.         private bool _bDropAllItems;
  31.  
  32.         private Inventory _currentOpenedStashTab;
  33.         private string _currentOpenedStashTabName;
  34.         private CurrentSetInfo _currentSetData;
  35.         private string _drawInfoString = "";
  36.         private DropAllToInventory _inventDrop;
  37.  
  38.         private BaseSetPart[] _itemSetTypes;
  39.         private StashData _sData;
  40.  
  41.         public ItemDisplayData[] DisplayData;
  42.  
  43.         public Core()
  44.         {
  45.             PluginName = "Rare Set Manager";
  46.         }
  47.  
  48.         private void ExternalUpdateStashes(object[] args)
  49.         {
  50.             if (!Settings.Enable.Value) return;
  51.             Thread.Sleep(70);
  52.             UpdateStashes();
  53.             UpdatePlayerInventory();
  54.             UpdateItemsSetsInfo();
  55.         }
  56.  
  57.         public override void Initialise()
  58.         {
  59.             SetupOrClose();
  60.             Settings.Enable.OnValueChanged += SetupOrClose;
  61.             Settings.CalcByFreeSpace.OnValueChanged += UpdateItemsSetsInfo;
  62.  
  63.             MenuPlugin.eMouseEvent += OnMouseEvent;
  64.             API.SubscribePluginEvent("StashUpdate", ExternalUpdateStashes);
  65.         }
  66.  
  67.         private void SetupOrClose()
  68.         {
  69.             if (!Settings.Enable.Value)
  70.             {
  71.                 // If threads are implemented they should be closed here.
  72.                 return;
  73.             }
  74.  
  75.             CheckGitUpdateConfig();
  76.  
  77.             _sData = StashData.Load(this);
  78.             _inventDrop = new DropAllToInventory(this);
  79.  
  80.             DisplayData = new ItemDisplayData[8];
  81.  
  82.             for (var i = 0; i <= 7; i++)
  83.             {
  84.                 DisplayData[i] = new ItemDisplayData();
  85.             }
  86.  
  87.             UpdateItemsSetsInfo();
  88.  
  89.             GameController.Area.OnAreaChange += OnAreaChange;
  90.  
  91.             Settings.WeaponTypePriority.SetListValues(new List<string> {"Two handed", "One handed"});
  92.         }
  93.  
  94.         private void CheckGitUpdateConfig()
  95.         {
  96.             var path = $"{PluginDirectory}\\GitUpdateConfig.txt";
  97.             const string gitUpdateConfig = "Owner: Stridemann\n" +
  98.                                            "Name: PoeHUD_FullRareSetManager\n\r" +
  99.                                            "Repository\n\r" +
  100.                                            "\n\r" +
  101.                                            "Ignore:\n\r" +
  102.                                            "src\n\r" +
  103.                                            ".gitignore\n\r" +
  104.                                            "README.md\n\r" +
  105.                                            "LICENSE\n\r" +
  106.                                            "Screenshot.jpg\n\r";
  107.             if (File.Exists(path))
  108.             {
  109.                 return;
  110.             }
  111.  
  112.             using (var streamWriter = new StreamWriter(path, true))
  113.             {
  114.                 streamWriter.Write(gitUpdateConfig);
  115.                 streamWriter.Close();
  116.             }
  117.         }
  118.  
  119.         private void OnAreaChange(AreaController area)
  120.         {
  121.             _currentLabels.Clear();
  122.             _currentAlerts.Clear();
  123.         }
  124.  
  125.         public override void OnClose()
  126.         {
  127.             if (_sData != null)
  128.             {
  129.                 StashData.Save(this, _sData);
  130.             }
  131.         }
  132.  
  133.         public override void Render()
  134.         {
  135.             var needUpdate = UpdatePlayerInventory();
  136.             var ingameState = GameController.Game.IngameState;
  137.             var stashIsVisible = ingameState.ServerData.StashPanel.IsVisible;
  138.             if (stashIsVisible)
  139.             {
  140.                 needUpdate = UpdateStashes() || needUpdate;
  141.             }
  142.  
  143.             if (needUpdate)
  144.             {
  145.                 //Thread.Sleep(100);//Wait until item be placed to player invent. There should be some delay
  146.                 UpdateItemsSetsInfo();
  147.             }
  148.  
  149.             if (_bDropAllItems)
  150.             {
  151.                 _bDropAllItems = false;
  152.                 try
  153.                 {
  154.                     DropAllItems();
  155.                 }
  156.                 catch
  157.                 {
  158.                     LogError("There was an error while moving items.", 5);
  159.                 }
  160.                 finally
  161.                 {
  162.                     UpdatePlayerInventory();
  163.                     UpdateItemsSetsInfo();
  164.                 }
  165.             }
  166.  
  167.             if (!_bDropAllItems)
  168.             {
  169.                 DrawSetsInfo();
  170.             }
  171.  
  172.             RenderLabels();
  173.  
  174.             if (WinApi.IsKeyDown(Settings.DropToInventoryKey))
  175.             {
  176.                 if (stashIsVisible && ingameState.IngameUi.InventoryPanel.IsVisible)
  177.                 {
  178.                     if (_currentSetData.BSetIsReady)
  179.                     {
  180.                         _bDropAllItems = true;
  181.                     }
  182.                 }
  183.  
  184.                 SellSetToVendor();
  185.             }
  186.         }
  187.  
  188.         public void SellSetToVendor()
  189.         {
  190.             try
  191.             {
  192.                 // Sell to vendor.
  193.                 var gameWindow = GameController.Window.GetWindowRectangle().TopLeft;
  194.                 var latency = (int) GameController.Game.IngameState.CurLatency;
  195.                 var npcTradingWindow = GameController.Game.IngameState.UIRoot
  196.                     .Children[1]
  197.                     .Children[47]
  198.                     .Children[3];
  199.  
  200.                 if (!npcTradingWindow.IsVisible)
  201.                 {
  202.                     // The vendor sell window is not open, but is in memory (it would've went straigth to catch if that wasn't the case).
  203.                     LogMessage("Error: npcTradingWindow is not visible (opened)!", 5);
  204.                 }
  205.  
  206.                 Keyboard.KeyDown(Keys.LControlKey);
  207.                 Thread.Sleep(INPUT_DELAY);
  208.                 for (var i = 0; i < 8; i++)
  209.                 {
  210.                     var itemType = _itemSetTypes[i];
  211.                     var items = itemType.GetPreparedItems();
  212.  
  213.                     if (items.Any(item => !item.BInPlayerInventory))
  214.                     {
  215.                         return;
  216.                     }
  217.  
  218.                     foreach (var item in items)
  219.                     {
  220.                         var foundItem =
  221.                             GameController.Game.IngameState.IngameUi.InventoryPanel[InventoryIndex.PlayerInventory]
  222.                                 .VisibleInventoryItems.Find(
  223.                                     x => x.InventPosX == item.InventPosX && x.InventPosY == item.InventPosY);
  224.  
  225.                         if (foundItem == null)
  226.                         {
  227.                             LogError("FoundItem was null.", 3);
  228.                             return;
  229.                         }
  230.  
  231.                         Mouse.SetCursorPosAndLeftClick(foundItem.GetClientRect().Center + gameWindow, Settings.ExtraDelay);
  232.                         Thread.Sleep(latency + Settings.ExtraDelay);
  233.                     }
  234.                 }
  235.  
  236.                 Thread.Sleep(Settings.ExtraDelay);
  237.                 Keyboard.KeyUp(Keys.LControlKey);
  238.                 Thread.Sleep(INPUT_DELAY);
  239.  
  240.                 var npcOfferItems = npcTradingWindow.Children[1];
  241.  
  242.                 foreach (var element in npcOfferItems.Children)
  243.                 {
  244.                     var item = element.AsObject<NormalInventoryItem>().Item;
  245.                     if (item.Path == "")
  246.                     {
  247.                         continue;
  248.                     }
  249.  
  250.                     Graphics.DrawFrame(element.GetClientRect(), 2, Color.AntiqueWhite);
  251.                 }
  252.  
  253.                 var offer = npcOfferItems.Children.Where(element => GameController.Files.BaseItemTypes
  254.                                                                         .Translate(element
  255.                                                                             .AsObject<NormalInventoryItem>().Item.Path)
  256.                                                                         .BaseName.Equals("Chaos Orb") || GameController
  257.                                                                         .Files.BaseItemTypes
  258.                                                                         .Translate(element
  259.                                                                             .AsObject<NormalInventoryItem>().Item.Path)
  260.                                                                         .BaseName.Equals("Regal Orb")).ToList();
  261.                 if (offer.Count == 0)
  262.                 {
  263.                     return;
  264.                 }
  265.                 Thread.Sleep(latency + Settings.ExtraDelay);
  266.                 var acceptButton = npcTradingWindow.Children[5];
  267.                 Mouse.SetCursorPos(acceptButton.GetClientRect().Center + gameWindow);
  268.             }
  269.             catch
  270.             {
  271.                 Keyboard.KeyUp(Keys.LControlKey);
  272.                 Thread.Sleep(INPUT_DELAY);
  273.                 // We are not talking to a vendor.
  274.             }
  275.         }
  276.  
  277.         public void DropAllItems()
  278.         {
  279.             var stashPanel = GameController.Game.IngameState.ServerData.StashPanel;
  280.             var stashNames = stashPanel.AllStashNames;
  281.             var gameWindowPos = GameController.Window.GetWindowRectangle();
  282.             var latency = (int)GameController.Game.IngameState.CurLatency + Settings.ExtraDelay;
  283.             var cursorPosPreMoving = Mouse.GetCursorPosition();
  284.  
  285.             // Iterrate through all the different item types.
  286.             for (var i = 0; i < 8; i++) //Check that we have enough items for any set
  287.             {
  288.                 var part = _itemSetTypes[i];
  289.                 var items = part.GetPreparedItems();
  290.  
  291.                 Keyboard.KeyDown(Keys.LControlKey);
  292.                 Thread.Sleep(INPUT_DELAY);
  293.  
  294.                 try
  295.                 {
  296.                     foreach (var curPreparedItem in items)
  297.                     {
  298.                         // If items is already in our inventory, move on.
  299.                         if (curPreparedItem.BInPlayerInventory)
  300.                         {
  301.                             continue;
  302.                         }
  303.  
  304.                         // Get the index of the item we want to move from stash to inventory.
  305.                         var invIndex = stashNames.IndexOf(curPreparedItem.StashName);
  306.  
  307.                         // Switch to the tab we want to go to.
  308.                         if (!_inventDrop.SwitchToTab(invIndex, Settings))
  309.                         {
  310.                             //throw new Exception("Can't switch to tab");
  311.                             Keyboard.KeyUp(Keys.LControlKey);
  312.                             return;
  313.                         }
  314.                         Thread.Sleep(latency + Settings.ExtraDelay);
  315.                         // Get the current visible stash tab.
  316.                         _currentOpenedStashTab = stashPanel.VisibleStash;
  317.  
  318.  
  319.  
  320.                         var item = curPreparedItem;
  321.                         var foundItem =
  322.                             _currentOpenedStashTab.VisibleInventoryItems.Find(
  323.                                 x => x.InventPosX == item.InventPosX && x.InventPosY == item.InventPosY);
  324.                         var curItemsCount = _currentOpenedStashTab.VisibleInventoryItems.Count;
  325.  
  326.                         if (foundItem != null)
  327.                         {
  328.                          
  329.                             // If we found the item.
  330.                             Mouse.SetCursorPosAndLeftClick(foundItem.GetClientRect().Center + gameWindowPos.TopLeft, Settings.ExtraDelay);
  331.                             item.BInPlayerInventory = true;
  332.                             Thread.Sleep(latency + 100 + Settings.ExtraDelay);
  333.  
  334.                             if(_currentOpenedStashTab.VisibleInventoryItems.Count == curItemsCount)
  335.                             {
  336.                                 //LogError("Item was not dropped?? : " + curPreparedItem.ItemName + ", checking again...", 10);
  337.                                 Thread.Sleep(200);
  338.                                
  339.                                 if (_currentOpenedStashTab.VisibleInventoryItems.Count == curItemsCount)
  340.                                 {
  341.                                     LogError("Item was not dropped after additional delay: " + curPreparedItem.ItemName, 5);
  342.  
  343.                                 }
  344.                                
  345.                             }
  346.                         }
  347.                         else
  348.                         {
  349.                             LogError("We couldn't find the item we where looking for.\n" +
  350.                                      $"ItemName: {item.ItemName}.\n" +
  351.                                      $"Inventory Position: ({item.InventPosX},{item.InventPosY})", 5);
  352.                         }
  353.                         //Thread.Sleep(200);
  354.                         if(!UpdateStashes())
  355.                         {
  356.                             LogError("There was item drop but it don't want to update stash!", 10);
  357.                         }
  358.                     }
  359.                 }
  360.                 catch (Exception ex)
  361.                 {
  362.                     LogError("Error move items: " + ex.Message, 4);
  363.                 }
  364.                 Keyboard.KeyUp(Keys.LControlKey);
  365.                 //part.RemovePreparedItems();
  366.             }
  367.             UpdatePlayerInventory();
  368.             UpdateItemsSetsInfo();
  369.  
  370.             Mouse.SetCursorPos(cursorPosPreMoving);
  371.         }
  372.  
  373.         private void DrawSetsInfo()
  374.         {
  375.             var stash = GameController.Game.IngameState.ServerData.StashPanel;
  376.             var leftPanelOpened = stash.IsVisible;
  377.  
  378.             if (leftPanelOpened)
  379.             {
  380.                 if (_currentSetData.BSetIsReady && _currentOpenedStashTab != null)
  381.                 {
  382.                     var visibleInventoryItems = _currentOpenedStashTab.VisibleInventoryItems;
  383.  
  384.                     if (visibleInventoryItems != null)
  385.                     {
  386.                         var stashTabRect = _currentOpenedStashTab.InventoryUiElement.GetClientRect();
  387.  
  388.                         var setItemsListRect = new RectangleF(stashTabRect.Right, stashTabRect.Bottom, 270, 240);
  389.                         Graphics.DrawBox(setItemsListRect, new Color(0, 0, 0, 200));
  390.                         Graphics.DrawFrame(setItemsListRect, 2, Color.White);
  391.  
  392.                         var drawPosX = setItemsListRect.X + 10;
  393.                         var drawPosY = setItemsListRect.Y + 10;
  394.  
  395.                         Graphics.DrawText("Current " + (_currentSetData.SetType == 1 ? "Chaos" : "Regal") + " set:", 15,
  396.                             new Vector2(drawPosX, drawPosY));
  397.  
  398.                         drawPosY += 25;
  399.  
  400.                         for (var i = 0; i < 8; i++)
  401.                         {
  402.                             var part = _itemSetTypes[i];
  403.                             var items = part.GetPreparedItems();
  404.  
  405.                             foreach (var curPreparedItem in items)
  406.                             {
  407.                                 var inInventory = _sData.PlayerInventory.StashTabItems.Contains(curPreparedItem);
  408.                                 var curStashOpened = curPreparedItem.StashName == _currentOpenedStashTabName;
  409.                                 var color = Color.Gray;
  410.  
  411.                                 if (inInventory)
  412.                                 {
  413.                                     color = Color.Green;
  414.                                 }
  415.                                 else if (curStashOpened)
  416.                                 {
  417.                                     color = Color.Yellow;
  418.                                 }
  419.  
  420.                                 if (!inInventory && curStashOpened)
  421.                                 {
  422.                                     var item = curPreparedItem;
  423.                                     var foundItem =
  424.                                         visibleInventoryItems.Find(x => x.InventPosX == item.InventPosX &&
  425.                                                                         x.InventPosY == item.InventPosY);
  426.  
  427.                                     if (foundItem != null)
  428.                                     {
  429.                                         Graphics.DrawFrame(foundItem.GetClientRect(), 2, Color.Yellow);
  430.                                     }
  431.                                 }
  432.  
  433.                                 Graphics.DrawText(
  434.                                     curPreparedItem.StashName + " (" + curPreparedItem.ItemName + ") " +
  435.                                     (curPreparedItem.LowLvl ? "L" : "H"), 15, new Vector2(drawPosX, drawPosY), color);
  436.                                 drawPosY += 20;
  437.                             }
  438.                         }
  439.                     }
  440.                 }
  441.             }
  442.  
  443.             if (Settings.ShowOnlyWithInventory)
  444.             {
  445.                 if (!GameController.Game.IngameState.IngameUi.InventoryPanel.IsVisible)
  446.                 {
  447.                     return;
  448.                 }
  449.             }
  450.  
  451.             if (Settings.HideWhenLeftPanelOpened)
  452.             {
  453.                 if (leftPanelOpened)
  454.                 {
  455.                     return;
  456.                 }
  457.             }
  458.  
  459.             var posX = Settings.PositionX.Value;
  460.             var posY = Settings.PositionY.Value;
  461.  
  462.             var rect = new RectangleF(posX, posY, 230, 200);
  463.             Graphics.DrawBox(rect, new Color(0, 0, 0, 200));
  464.             Graphics.DrawFrame(rect, 2, Color.White);
  465.  
  466.  
  467.             posX += 10;
  468.             posY += 10;
  469.             Graphics.DrawText(_drawInfoString, 15, new Vector2(posX, posY));
  470.         }
  471.  
  472.         private void UpdateItemsSetsInfo()
  473.         {
  474.             _currentSetData = new CurrentSetInfo();
  475.             _itemSetTypes = new BaseSetPart[8];
  476.             _itemSetTypes[0] = new WeaponItemsSetPart("Weapons");
  477.             _itemSetTypes[0].ItemCellsSize = 8;
  478.             _itemSetTypes[1] = new SingleItemSetPart("Helmets");
  479.             _itemSetTypes[1].ItemCellsSize = 4;
  480.             _itemSetTypes[2] = new SingleItemSetPart("Body Armors");
  481.             _itemSetTypes[2].ItemCellsSize = 6;
  482.             _itemSetTypes[3] = new SingleItemSetPart("Gloves");
  483.             _itemSetTypes[3].ItemCellsSize = 4;
  484.             _itemSetTypes[4] = new SingleItemSetPart("Boots");
  485.             _itemSetTypes[4].ItemCellsSize = 4;
  486.             _itemSetTypes[5] = new SingleItemSetPart("Belts");
  487.             _itemSetTypes[5].ItemCellsSize = 2;
  488.             _itemSetTypes[6] = new SingleItemSetPart("Amulets");
  489.             _itemSetTypes[6].ItemCellsSize = 1;
  490.             _itemSetTypes[7] = new RingItemsSetPart("Rings");
  491.             _itemSetTypes[7].ItemCellsSize = 1;
  492.  
  493.  
  494.             for (var i = 0; i <= 7; i++)
  495.             {
  496.                 DisplayData[i].BaseData = _itemSetTypes[i];
  497.             }
  498.  
  499.             foreach (var item in _sData.PlayerInventory.StashTabItems)
  500.             {
  501.                 var index = (int) item.ItemType;
  502.  
  503.                 if (index > 7)
  504.                 {
  505.                     index = 0; // Switch One/TwoHanded to 0(weapon)
  506.                 }
  507.  
  508.                 var setPart = _itemSetTypes[index];
  509.                 setPart.AddItem(item);
  510.             }
  511.  
  512.             const int StashCellsCount = 12 * 12;
  513.  
  514.             foreach (var stash in _sData.StashTabs)
  515.             {
  516.                 var stashTabItems = stash.Value.StashTabItems;
  517.                 foreach (var item in stashTabItems)
  518.                 {
  519.                     var index = (int) item.ItemType;
  520.  
  521.                     if (index > 7)
  522.                     {
  523.                         index = 0; // Switch One/TwoHanded to 0(weapon)
  524.                     }
  525.  
  526.                     var setPart = _itemSetTypes[index];
  527.                     setPart.AddItem(item);
  528.                     setPart.StashTabItemsCount = stashTabItems.Count;
  529.                 }
  530.             }
  531.  
  532.             //Calculate sets:
  533.             _drawInfoString = "";
  534.             var chaosSetMaxCount = 0;
  535.  
  536.             var regalSetMaxCount = int.MaxValue;
  537.             var minItemsCount = int.MaxValue;
  538.             var maxItemsCount = 0;
  539.  
  540.  
  541.        
  542.             for (var i = 0; i <= 7; i++) //Check that we have enough items for any set
  543.             {
  544.                 var setPart = _itemSetTypes[i];
  545.  
  546.                 var low = setPart.LowSetsCount();
  547.                 var high = setPart.HighSetsCount();
  548.                 var total = setPart.TotalSetsCount();
  549.  
  550.                 if (minItemsCount > total)
  551.                     minItemsCount = total;
  552.  
  553.                 if (maxItemsCount < total)
  554.                     maxItemsCount = total;
  555.  
  556.                 if (regalSetMaxCount > high)
  557.                     regalSetMaxCount = high;
  558.  
  559.                 chaosSetMaxCount += low;
  560.                 _drawInfoString += setPart.GetInfoString() + "\r\n";
  561.  
  562.                 var drawInfo = DisplayData[i];
  563.                 drawInfo.TotalCount = total;
  564.                 drawInfo.TotalLowCount = low;
  565.                 drawInfo.TotalHighCount = high;
  566.  
  567.                 if (Settings.CalcByFreeSpace.Value)
  568.                 {
  569.                     int totalPossibleStashItemsCount = StashCellsCount / setPart.ItemCellsSize;
  570.  
  571.                     drawInfo.FreeSpaceCount = totalPossibleStashItemsCount - (setPart.StashTabItemsCount + setPart.PlayerInventItemsCount());
  572.  
  573.                     if (drawInfo.FreeSpaceCount < 0)
  574.                         drawInfo.FreeSpaceCount = 0;
  575.  
  576.                     drawInfo.PriorityPercent = (float)drawInfo.FreeSpaceCount / totalPossibleStashItemsCount;
  577.                     if (drawInfo.PriorityPercent > 1)
  578.                         drawInfo.PriorityPercent = 1;
  579.                     drawInfo.PriorityPercent = 1 - drawInfo.PriorityPercent;
  580.                 }
  581.             }
  582.  
  583.        
  584.             if (!Settings.CalcByFreeSpace.Value)
  585.             {
  586.                 var maxSets = maxItemsCount;
  587.  
  588.                 if (Settings.MaxSets.Value > 0)
  589.                 {
  590.                     maxSets = Settings.MaxSets.Value;
  591.                 }
  592.  
  593.                 for (var i = 0; i <= 7; i++)
  594.                 {
  595.                     var drawInfo = DisplayData[i];
  596.  
  597.                     if (drawInfo.TotalCount == 0)
  598.                         drawInfo.PriorityPercent = 1;
  599.                     else
  600.                     {
  601.                         drawInfo.PriorityPercent = (float)drawInfo.TotalCount / maxSets;
  602.  
  603.                         if (drawInfo.PriorityPercent > 1)
  604.                             drawInfo.PriorityPercent = 1;
  605.                     }
  606.                 }
  607.             }
  608.  
  609.             _drawInfoString += "\r\n";
  610.  
  611.             var chaosSets = Math.Min(minItemsCount, chaosSetMaxCount);
  612.  
  613.             _drawInfoString += "Chaos sets ready: " + chaosSets;
  614.  
  615.             if (Settings.ShowRegalSets.Value)
  616.             {
  617.                 _drawInfoString += "\r\n";
  618.                 _drawInfoString += "Regal sets ready: " + regalSetMaxCount;
  619.             }
  620.  
  621.             if (chaosSets <= 0 && regalSetMaxCount <= 0)
  622.             {
  623.                 return;
  624.             }
  625.  
  626.             {
  627.                 var maxAvailableReplaceCount = 0;
  628.                 var replaceIndex = -1;
  629.  
  630.                 var isLowSet = false;
  631.                 for (var i = 0; i < 8; i++) //Check that we have enough items for any set
  632.                 {
  633.                     var part = _itemSetTypes[i];
  634.                     var prepareResult = part.PrepareItemForSet(Settings);
  635.  
  636.                     isLowSet = isLowSet || prepareResult.LowSet;
  637.  
  638.                     if (maxAvailableReplaceCount >= prepareResult.AllowedReplacesCount || prepareResult.BInPlayerInvent)
  639.                     {
  640.                         continue;
  641.                     }
  642.  
  643.                     maxAvailableReplaceCount = prepareResult.AllowedReplacesCount;
  644.                     replaceIndex = i;
  645.                 }
  646.  
  647.                 if (!isLowSet)
  648.                 {
  649.                     if (Settings.ShowRegalSets)
  650.                     {
  651.                         _currentSetData.BSetIsReady = true;
  652.                         _currentSetData.SetType = 2;
  653.                         return;
  654.                     }
  655.                     if (maxAvailableReplaceCount == 0)
  656.                     {
  657.                         LogMessage("You want to make a regal set anyway? Ok.", 2);
  658.                         _currentSetData.BSetIsReady = true;
  659.                         _currentSetData.SetType = 2;
  660.                         return;
  661.                     }
  662.  
  663.                     if (replaceIndex != -1)
  664.                     {
  665.                         _itemSetTypes[replaceIndex].DoLowItemReplace();
  666.                         _currentSetData.SetType = 1;
  667.                         _currentSetData.BSetIsReady = true;
  668.                     }
  669.                     else
  670.                     {
  671.                         _currentSetData.BSetIsReady = true;
  672.                         _currentSetData.SetType = 1;
  673.                     }
  674.                 }
  675.                 else
  676.                 {
  677.                     _currentSetData.BSetIsReady = true;
  678.                     _currentSetData.SetType = 1;
  679.                 }
  680.             }
  681.         }
  682.        
  683.         public bool UpdateStashes()
  684.         {
  685.             var stashPanel = GameController.Game.IngameState.ServerData.StashPanel;
  686.             var stashNames = new List<string>();
  687.             var needUpdateAllInfo = false;
  688.             _currentOpenedStashTab = null;
  689.             _currentOpenedStashTabName = "";
  690.            
  691.             for (var i = 0; i < stashPanel.TotalStashes; i++)
  692.             {
  693.                 var stash = stashPanel.GetStashInventoryByIndex(i);
  694.  
  695.                 var stashName = stashPanel.GetStashName(i);
  696.                 if (stashName.Contains("+"))
  697.                 {
  698.                     stashNames.Add(stashName);
  699.  
  700.                     var visibleInventoryItems = stash?.VisibleInventoryItems;
  701.  
  702.                     if (visibleInventoryItems == null)
  703.                     {
  704.                         continue;
  705.                     }
  706.  
  707.                     _currentOpenedStashTab = stash;
  708.                     _currentOpenedStashTabName = stashName;
  709.  
  710.                     //if (stash.ItemCount != visibleInventoryItems.Count)
  711.                     {
  712.                         //LogMessage("No update stash coz: ItemCount", 4);
  713.                         //continue;
  714.                     }
  715.  
  716.                     StashTabData curStashData;
  717.  
  718.                     var add = false;
  719.                     if (!_sData.StashTabs.TryGetValue(stashName, out curStashData))
  720.                     {
  721.                         curStashData = new StashTabData();
  722.                         add = true;
  723.                     }
  724.  
  725.                     //if (curStashData.ItemsCount != stash.ItemCount)//Temporary disabled. Trying to find a source of bug
  726.                     {
  727.                         curStashData.StashTabItems = new List<StashItem>();
  728.                         needUpdateAllInfo = true;
  729.                         foreach (var invItem in visibleInventoryItems)
  730.                         {
  731.                             var item = invItem.Item;
  732.                             var newStashItem = ProcessItem(item);
  733.  
  734.                             if (newStashItem == null)
  735.                             {
  736.                                 continue;
  737.                             }
  738.  
  739.                             curStashData.StashTabItems.Add(newStashItem);
  740.                             newStashItem.StashName = stashName;
  741.                             newStashItem.InventPosX = invItem.InventPosX;
  742.                             newStashItem.InventPosY = invItem.InventPosY;
  743.                         }
  744.                         curStashData.ItemsCount = (int)stash.ItemCount;
  745.                     }
  746.  
  747.                     if (add && curStashData.ItemsCount > 0)
  748.                     {
  749.                         _sData.StashTabs.Add(stashName, curStashData);
  750.                     }
  751.                     break;
  752.                 }
  753.             }
  754.                
  755.             if (!needUpdateAllInfo)
  756.             {
  757.                 return false;
  758.             }
  759.  
  760.             foreach (var name in stashNames) //Delete stashes that doesn't exist
  761.             {
  762.                 if (!_sData.StashTabs.ContainsKey(name))
  763.                 {
  764.                     _sData.StashTabs.Remove(name);
  765.                 }
  766.             }
  767.  
  768.             return true;
  769.         }
  770.         private bool UpdatePlayerInventory()
  771.         {
  772.             if (!GameController.Game.IngameState.IngameUi.InventoryPanel.IsVisible)
  773.             {
  774.                 return false;
  775.             }
  776.             var inventory = GameController.Game.IngameState.IngameUi.InventoryPanel[InventoryIndex.PlayerInventory];
  777.  
  778.             if (_sData?.PlayerInventory == null)
  779.             {
  780.                 return true;
  781.             }
  782.  
  783.             //if (_sData.PlayerInventory.ItemsCount == inventory.ItemCount)
  784.             {
  785.             //    return false;
  786.             }
  787.  
  788.             _sData.PlayerInventory = new StashTabData();
  789.  
  790.             var invItems = inventory.VisibleInventoryItems;
  791.  
  792.             if (invItems != null)
  793.             {
  794.                 foreach (var invItem in invItems)
  795.                 {
  796.                     var item = invItem.Item;
  797.                     var newAddedItem = ProcessItem(item);
  798.  
  799.                     if (newAddedItem != null)
  800.                     {
  801.                         _sData.PlayerInventory.StashTabItems.Add(newAddedItem);
  802.                         newAddedItem.InventPosX = invItem.InventPosX;
  803.                         newAddedItem.InventPosY = invItem.InventPosY;
  804.                         newAddedItem.BInPlayerInventory = true;
  805.                     }
  806.                 }
  807.                 _sData.PlayerInventory.ItemsCount = (int) inventory.ItemCount;
  808.             }
  809.  
  810.             return true;
  811.         }
  812.  
  813.         private long CurPickItemCount = 0;
  814.         private void OnMouseEvent(MouseEventID eventId, Vector2 pos)
  815.         {
  816.             try
  817.             {
  818.                 if (!Settings.Enable || !GameController.Window.IsForeground() || eventId != MouseEventID.LeftButtonDown)
  819.                 {
  820.                     return;
  821.                 }
  822.                 Element uiHover = GameController.Game.IngameState.UIHover;
  823.                 var HoverItemIcon = uiHover.AsObject<HoverItemIcon>();
  824.  
  825.                 if (HoverItemIcon.ToolTipType == ToolTipType.ItemOnGround)
  826.                 {
  827.                     var item = HoverItemIcon.Item;
  828.  
  829.                     var filteredItemResult = ProcessItem(item);
  830.  
  831.                     if (filteredItemResult == null) return;
  832.  
  833.                     if (++CurPickItemCount > long.MaxValue)
  834.                         CurPickItemCount = 0;
  835.  
  836.                     Task.Factory.StartNew(async () =>
  837.                     {
  838.                         long curItemPickCount = CurPickItemCount;
  839.                         Stopwatch sw = Stopwatch.StartNew();
  840.                         while (item.IsValid)
  841.                         {
  842.                             await Task.Delay(30);
  843.  
  844.                             //We want to prevent the item was added more than once
  845.                             if (curItemPickCount != CurPickItemCount)
  846.                                 return;
  847.  
  848.                             if (sw.ElapsedMilliseconds <= 10000) continue;
  849.                             sw.Stop();
  850.                             break;
  851.                         }
  852.  
  853.                         //We want to prevent the item was added more than once
  854.                         if (curItemPickCount != CurPickItemCount)
  855.                             return;
  856.  
  857.                         if (!item.IsValid)
  858.                         {
  859.                             filteredItemResult.BInPlayerInventory = true;
  860.                             _sData.PlayerInventory.StashTabItems.Add(filteredItemResult);
  861.                             UpdateItemsSetsInfo();
  862.                         }
  863.                     });
  864.  
  865.                 }
  866.             }
  867.             catch (Exception e)
  868.             {
  869.                 LogError("OnMouseEvent error: " + e.Message, 4);
  870.                 return;
  871.             }
  872.             return;
  873.         }
  874.  
  875.  
  876.  
  877.         private StashItem ProcessItem(IEntity item)
  878.         {
  879.             try
  880.             {
  881.                 var mods = item?.GetComponent<Mods>();
  882.  
  883.                 if (mods?.ItemRarity != ItemRarity.Rare)
  884.                 {
  885.                     return null;
  886.                 }
  887.  
  888.                 var bIdentified = mods.Identified;
  889.                 if (bIdentified && !Settings.AllowIdentified)
  890.                 {
  891.                     return null;
  892.                 }
  893.  
  894.                 if (mods.ItemLevel < 60)
  895.                 {
  896.                     return null;
  897.                 }
  898.  
  899.                 var newItem = new StashItem
  900.                 {
  901.                     BIdentified = bIdentified,
  902.                     LowLvl = mods.ItemLevel < 75
  903.                 };
  904.  
  905.  
  906.                 var bit = GameController.Files.BaseItemTypes.Translate(item.Path);
  907.  
  908.                 newItem.ItemClass = bit.ClassName;
  909.                 newItem.ItemName = bit.BaseName;
  910.  
  911.                 newItem.ItemType = GetStashItemTypeByClassName(newItem.ItemClass);
  912.  
  913.                 if (newItem.ItemType != StashItemType.Undefined)
  914.                 {
  915.                     return newItem;
  916.                 }
  917.             }
  918.             catch (Exception e)
  919.             {
  920.                 LogError($"Error 0x01: {e}", 0);
  921.                 return null;
  922.             }
  923.  
  924.             return null;
  925.         }
  926.  
  927.         private StashItemType GetStashItemTypeByClassName(string className)
  928.         {
  929.             if (className.StartsWith("Two Hand"))
  930.             {
  931.                 return StashItemType.TwoHanded;
  932.             }
  933.             if (className.StartsWith("One Hand") || className.StartsWith("Thrusting One Hand"))
  934.             {
  935.                 return StashItemType.OneHanded;
  936.             }
  937.             switch (className)
  938.             {
  939.                 case "Bow": return StashItemType.TwoHanded;
  940.                 case "Staff": return StashItemType.TwoHanded;
  941.                 case "Sceptre": return StashItemType.OneHanded;
  942.                 case "Wand": return StashItemType.OneHanded;
  943.                 case "Dagger": return StashItemType.OneHanded;
  944.                 case "Claw": return StashItemType.OneHanded;
  945.                 case "Shield": return StashItemType.OneHanded;
  946.  
  947.                 case "Ring": return StashItemType.Ring;
  948.                 case "Amulet": return StashItemType.Amulet;
  949.                 case "Belt": return StashItemType.Belt;
  950.  
  951.                 case "Helmet": return StashItemType.Helmet;
  952.                 case "Body Armour": return StashItemType.Body;
  953.                 case "Boots": return StashItemType.Boots;
  954.                 case "Gloves": return StashItemType.Gloves;
  955.  
  956.                 default:
  957.                     return StashItemType.Undefined;
  958.             }
  959.         }
  960.  
  961.  
  962.         private struct CurrentSetInfo
  963.         {
  964.             public bool BSetIsReady;
  965.             public int SetType; // 1 - chaos set, 2 - regal set
  966.         }
  967.         /*Rare set classes:
  968.  
  969.         Two Hand Sword
  970.         Two Hand Axe
  971.         Two Hand Mace
  972.         Bow
  973.         Staff
  974.  
  975.         One Hand Sword
  976.         One Hand Axe
  977.         One Hand Mace
  978.         Sceptre
  979.         Wand
  980.         Dagger
  981.         Claw
  982.  
  983.         Ring
  984.         Amulet
  985.         Belt
  986.         Shield
  987.         Helmet
  988.         Body Armour
  989.         Boots
  990.         Gloves
  991.         */
  992.  
  993.  
  994.         public class ItemDisplayData
  995.         {
  996.             public BaseSetPart BaseData;
  997.             public float PriorityPercent;
  998.             public int TotalCount;
  999.             public int TotalHighCount;
  1000.             public int TotalLowCount;
  1001.             public int FreeSpaceCount;
  1002.         }
  1003.  
  1004.         #region Draw labels
  1005.  
  1006.         private readonly Dictionary<EntityWrapper, ItemDisplayData> _currentAlerts =
  1007.             new Dictionary<EntityWrapper, ItemDisplayData>();
  1008.  
  1009.         private Dictionary<long, ItemsOnGroundLabelElement> _currentLabels =
  1010.             new Dictionary<long, ItemsOnGroundLabelElement>();
  1011.  
  1012.         private void RenderLabels()
  1013.         {
  1014.             if (!Settings.EnableBorders.Value)
  1015.             {
  1016.                 return;
  1017.             }
  1018.             var shouldUpdate = false;
  1019.  
  1020.             var tempCopy = new Dictionary<EntityWrapper, ItemDisplayData>(_currentAlerts);
  1021.             var keyValuePairs = tempCopy.AsParallel().Where(x => x.Key != null && x.Key.Address != 0 && x.Key.IsValid)
  1022.                 .ToList();
  1023.             foreach (var kv in keyValuePairs)
  1024.             {
  1025.                 if (DrawBorder(kv.Key.Address, kv.Value) && !shouldUpdate)
  1026.                 {
  1027.                     shouldUpdate = true;
  1028.                 }
  1029.             }
  1030.  
  1031.             if (shouldUpdate)
  1032.             {
  1033.                 _currentLabels = GameController.Game.IngameState.IngameUi.ItemsOnGroundLabels
  1034.                     .GroupBy(y => y.ItemOnGround.Address).ToDictionary(y => y.Key, y => y.First());
  1035.             }
  1036.  
  1037.             if (!Settings.InventBorders.Value)
  1038.             {
  1039.                 return;
  1040.             }
  1041.             if (!GameController.Game.IngameState.IngameUi.InventoryPanel.IsVisible)
  1042.             {
  1043.                 return;
  1044.             }
  1045.  
  1046.             var playerInv = GameController.Game.IngameState.IngameUi.InventoryPanel[InventoryIndex.PlayerInventory];
  1047.             var visibleInventoryItems = playerInv.VisibleInventoryItems;
  1048.             if (visibleInventoryItems == null)
  1049.             {
  1050.                 return;
  1051.             }
  1052.  
  1053.             foreach (var inventItem in visibleInventoryItems)
  1054.             {
  1055.                 var item = inventItem.Item;
  1056.                 if (item == null)
  1057.                 {
  1058.                     continue;
  1059.                 }
  1060.  
  1061.                 var visitResult = ProcessItem(item);
  1062.  
  1063.                 if (visitResult != null)
  1064.                 {
  1065.                     var index = (int)visitResult.ItemType;
  1066.  
  1067.                     if (index > 7)
  1068.                     {
  1069.                         index = 0;
  1070.                     }
  1071.  
  1072.                     var data = DisplayData[index];
  1073.                     var rect = inventItem.GetClientRect();
  1074.  
  1075.                     var borderColor = Color.Lerp(Color.Red, Color.Green, data.PriorityPercent);
  1076.  
  1077.                     rect.X += 2;
  1078.                     rect.Y += 2;
  1079.  
  1080.                     rect.Width -= 4;
  1081.                     rect.Height -= 4;
  1082.  
  1083.                     var testRect = new RectangleF(rect.X + 3, rect.Y + 3, 40, 20);
  1084.  
  1085.                     Graphics.DrawBox(testRect, new Color(10, 10, 10, 230));
  1086.                     Graphics.DrawFrame(rect, 2, borderColor);
  1087.  
  1088.                     if (Settings.CalcByFreeSpace.Value)
  1089.                         Graphics.DrawText($"{data.FreeSpaceCount}", Settings.TextSize.Value, testRect.TopLeft, Color.White);
  1090.                     else
  1091.                         Graphics.DrawText($"{data.PriorityPercent:p0}", Settings.TextSize.Value, testRect.TopLeft, Color.White);
  1092.                 }
  1093.             }
  1094.         }
  1095.  
  1096.  
  1097.         private bool DrawBorder(long entityAddress, ItemDisplayData data)
  1098.         {
  1099.             var ui = GameController.Game.IngameState.IngameUi;
  1100.             ItemsOnGroundLabelElement entityLabel;
  1101.             var shouldUpdate = false;
  1102.             if (_currentLabels.TryGetValue(entityAddress, out entityLabel))
  1103.             {
  1104.                 if (entityLabel.IsVisible)
  1105.                 {
  1106.                     var rect = entityLabel.Label.GetClientRect();
  1107.                     if (ui.OpenLeftPanel.IsVisible && ui.OpenLeftPanel.GetClientRect().Intersects(rect) ||
  1108.                         ui.OpenRightPanel.IsVisible && ui.OpenRightPanel.GetClientRect().Intersects(rect))
  1109.                     {
  1110.                         return false;
  1111.                     }
  1112.                     var incrSize = Settings.BorderOversize.Value;
  1113.  
  1114.                     if (Settings.BorderAutoResize.Value)
  1115.                     {
  1116.                         incrSize = (int)Lerp(incrSize, 1, data.PriorityPercent);
  1117.                     }
  1118.  
  1119.                     rect.X -= incrSize;
  1120.                     rect.Y -= incrSize;
  1121.  
  1122.                     rect.Width += incrSize * 2;
  1123.                     rect.Height += incrSize * 2;
  1124.  
  1125.                     var borderColor = Color.Lerp(Color.Red, Color.Green, data.PriorityPercent);
  1126.  
  1127.  
  1128.                     var borderWidth = Settings.BorderWidth.Value;
  1129.  
  1130.                     if (Settings.BorderAutoResize.Value)
  1131.                     {
  1132.                         borderWidth = (int)Lerp(borderWidth, 1, data.PriorityPercent);
  1133.                     }
  1134.  
  1135.                     Graphics.DrawFrame(rect, borderWidth, borderColor);
  1136.  
  1137.                     if (Settings.TextSize.Value != 0)
  1138.                     {
  1139.                         if (Settings.TextOffsetX < 0)
  1140.                         {
  1141.                             rect.X += Settings.TextOffsetX;
  1142.                         }
  1143.                         else
  1144.                         {
  1145.                             rect.X += rect.Width * (Settings.TextOffsetX.Value / 10);
  1146.                         }
  1147.  
  1148.                         if (Settings.TextOffsetY < 0)
  1149.                         {
  1150.                             rect.Y += Settings.TextOffsetY;
  1151.                         }
  1152.                         else
  1153.                         {
  1154.                             rect.Y += rect.Height * (Settings.TextOffsetY.Value / 10);
  1155.                         }
  1156.                         if (Settings.CalcByFreeSpace.Value)
  1157.                             Graphics.DrawText($"{data.FreeSpaceCount}", Settings.TextSize.Value, rect.TopLeft, Color.White);
  1158.                         else
  1159.                             Graphics.DrawText($"{data.PriorityPercent:p0}", Settings.TextSize.Value, rect.TopLeft, Color.White);
  1160.                     }
  1161.                 }
  1162.             }
  1163.             else
  1164.             {
  1165.                 shouldUpdate = true;
  1166.             }
  1167.             return shouldUpdate;
  1168.         }
  1169.  
  1170.  
  1171.         private float Lerp(float a, float b, float f)
  1172.         {
  1173.             return a + f * (b - a);
  1174.         }
  1175.  
  1176.  
  1177.         public override void EntityAdded(EntityWrapper entity)
  1178.         {
  1179.             if (!Settings.EnableBorders.Value)
  1180.             {
  1181.                 return;
  1182.             }
  1183.  
  1184.             if (!Settings.Enable || entity == null || GameController.Area.CurrentArea.IsTown ||
  1185.                 _currentAlerts.ContainsKey(entity) || !entity.HasComponent<WorldItem>())
  1186.             {
  1187.                 return;
  1188.             }
  1189.  
  1190.             var item = entity.GetComponent<WorldItem>().ItemEntity;
  1191.  
  1192.             var visitResult = ProcessItem(item);
  1193.  
  1194.             if (visitResult == null)
  1195.             {
  1196.                 return;
  1197.             }
  1198.  
  1199.             if (Settings.IgnoreOneHanded && visitResult.ItemType == StashItemType.OneHanded)
  1200.             {
  1201.                 visitResult = null;
  1202.             }
  1203.  
  1204.             if (visitResult == null)
  1205.             {
  1206.                 return;
  1207.             }
  1208.  
  1209.             var index = (int) visitResult.ItemType;
  1210.  
  1211.             if (index > 7)
  1212.             {
  1213.                 index = 0;
  1214.             }
  1215.  
  1216.             var displData = DisplayData[index];
  1217.  
  1218.             _currentAlerts.Add(entity, displData);
  1219.         }
  1220.  
  1221.         public override void EntityRemoved(EntityWrapper entity)
  1222.         {
  1223.             if (!Settings.EnableBorders.Value)
  1224.             {
  1225.                 return;
  1226.             }
  1227.  
  1228.             _currentAlerts.Remove(entity);
  1229.             _currentLabels.Remove(entity.Address);
  1230.         }
  1231.  
  1232.         #endregion
  1233.     }
  1234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement