dxbydt

Untitled

Jun 28th, 2019
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.10 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using PoeHUD.Poe.Elements;
  5. using PoeHUD.Controllers;
  6. using PoeHUD.Poe.Components;
  7. using System.IO;
  8.  
  9. namespace PoeHUD.Poe.RemoteMemoryObjects
  10. {
  11.     public class ServerData : RemoteMemoryObject
  12.     {
  13.         public BetrayalData BetrayalData => GetObject<BetrayalData>(M.ReadLong(Address + 0x3C8, 0x718));
  14.  
  15.         [Obsolete("Obsolete. Use GameController.Game.IngameState.IngameUi.StashElement instead")]
  16.         public StashElement StashPanel => GameController.Instance.Game.IngameState.IngameUi.StashElement;// Address != 0 ? GetObject<StashElement>(M.ReadLong(Address + 0x4C8, 0xA0, 0x78)) : null; // needs fixed, but if it's obsolete, just remove it
  17.  
  18.         public CharacterClass PlayerClass => (CharacterClass)(M.ReadByte(Address + 0x6390) & 0xF);
  19.  
  20.         public int GetBeastCapturedAmount(BestiaryCapturableMonster monster)
  21.         {
  22.             return M.ReadInt(Address + 0x5240 + monster.Id * 4);
  23.         }
  24.  
  25.         public List<ushort> PassiveSkillIds
  26.         {
  27.             get
  28.             {
  29.                 var fisrPtr = M.ReadLong(Address + 0x6320);
  30.                 var endPtr = M.ReadLong(Address + 0x6328);
  31.  
  32.                 int skillIds = (int)(endPtr - fisrPtr);
  33.  
  34.                 if (Math.Abs(skillIds) > 500)
  35.                     return null;
  36.                 var bytes = M.ReadBytes(fisrPtr, skillIds);
  37.                 var result = new List<ushort>();
  38.  
  39.                 for (int i = 0; i < bytes.Length; i += 2)
  40.                 {
  41.                     var id = BitConverter.ToUInt16(bytes, i);
  42.                     result.Add(id);
  43.                 }
  44.                 return result;
  45.             }
  46.         }
  47.         #region PlayerData
  48.         public int CharacterLevel => M.ReadInt(Address + 0x6394);
  49.         public int PassiveRefundPointsLeft => M.ReadInt(Address + 0x6398);
  50.         public int QuestPassiveSkillPoints => M.ReadInt(Address + 0x639C);
  51.         public int FreePassiveSkillPointsLeft => (CharacterLevel - 1) + QuestPassiveSkillPoints - (PassiveSkillIds.Count - SpentAscendencyPoints);
  52.  
  53.         public int TotalAscendencyPoints => M.ReadInt(Address + 0x63A4);
  54.         public int SpentAscendencyPoints => M.ReadInt(Address + 0x63A8);
  55.         public int TimeInGame => M.ReadInt(Address + 0x6468);
  56.  
  57.         public NetworkStateE NetworkState => (NetworkStateE)M.ReadByte(Address + 0x63D0);
  58.         public bool IsInGame => GameStateController.IsInGameState;
  59.  
  60.         public string League => NativeStringReader.ReadString(Address + 0x63E8);
  61.         public PartyAllocation PartyAllocationType => (PartyAllocation)M.ReadByte(Address + 0x65C8);
  62.         public int Latency => M.ReadInt(Address + 0x6470);
  63.         #endregion
  64.         #region Stash Tabs
  65.         public List<ServerStashTab> PlayerStashTabs => GetStashTabs(0x6480, 0x6488);
  66.         public List<ServerStashTab> GuildStashTabs => GetStashTabs(0x6498, 0x64A0);
  67.         private List<ServerStashTab> GetStashTabs(int offsetBegin, int offsetEnd)
  68.         {
  69.             var firstAddr = M.ReadLong(Address + offsetBegin);
  70.             var lastAddr = M.ReadLong(Address + offsetEnd);
  71.  
  72.             var tabs = M.ReadStructsArray<ServerStashTab>(firstAddr, lastAddr, ServerStashTab.StructSize, 5000);//Some players have 300 stash tabs, lol
  73.  
  74.             //Skipping hidden tabs of premium maps tab (read notes in StashTabController.cs)
  75.             tabs.RemoveAll(x => x.IsHidden);
  76.             return tabs;
  77.         }
  78.         #endregion
  79.  
  80.         public PartyStatus PartyStatusType => (PartyStatus)M.ReadByte(Address + 0x65A8);
  81.  
  82.         // New Guild is a structure pointed to at 0x65D0
  83.         // 0x10 - Length of Guild Name
  84.         // 0x00 - Name (either a pointer if length > 8 else Ustring)
  85.         public string GuildName => NativeStringReader.ReadString(M.ReadLong(Address + 0x6630));
  86.  
  87.         public List<ushort> SkillBarIds
  88.         {
  89.             get
  90.             {
  91.                 var result = new List<ushort>();
  92.  
  93.                 var readAddr = Address + 0x6658;
  94.                 for (var i = 0; i < 8; i++)
  95.                 {
  96.                     result.Add(M.ReadUShort(readAddr));
  97.                     readAddr += 2;
  98.                 }
  99.                 return result;
  100.             }
  101.         }
  102.         public List<Player> NearestPlayers
  103.         {
  104.             get
  105.             {
  106.                 var startPtr = M.ReadLong(Address + 0x6690);
  107.                 var endPtr = M.ReadLong(Address + 0x6698);
  108.  
  109.                 if (Math.Abs(endPtr - startPtr) / 8 > 50)
  110.                     return null;
  111.  
  112.                 startPtr += 16;//Don't ask me why. Just skipping first 2
  113.  
  114.                 var result = new List<Player>();
  115.                 for (var addr = startPtr; addr < endPtr; addr += 16)//16 because we are reading each second pointer (pointer vectors)
  116.                 {
  117.                     result.Add(ReadObject<Player>(addr));
  118.                 }
  119.                 return result;
  120.             }
  121.         }
  122.  
  123.         #region Inventories
  124.         public List<InventoryHolder> PlayerInventories
  125.         {
  126.             get
  127.             {
  128.                 var firstAddr = M.ReadLong(Address + 0x6770);
  129.                 var lastAddr = M.ReadLong(Address + 0x6778);
  130.                 return M.ReadStructsArray<InventoryHolder>(firstAddr, lastAddr, InventoryHolder.StructSize, 400);
  131.             }
  132.         }
  133.         public List<InventoryHolder> NPCInventories
  134.         {
  135.             get
  136.             {
  137.                 var firstAddr = M.ReadLong(Address + 0x6828);
  138.                 var lastAddr = M.ReadLong(Address + 0x6830);
  139.  
  140.                 if (firstAddr == 0)
  141.                     return new List<InventoryHolder>();
  142.  
  143.                 return M.ReadStructsArray<InventoryHolder>(firstAddr, lastAddr, InventoryHolder.StructSize, 100);
  144.             }
  145.         }
  146.  
  147.         public List<InventoryHolder> GuildInventories
  148.         {
  149.             get
  150.             {
  151.                 var firstAddr = M.ReadLong(Address + 0x68E0); // double check these
  152.                 var lastAddr = M.ReadLong(Address + 0x68E8);
  153.                 return M.ReadStructsArray<InventoryHolder>(firstAddr, lastAddr, InventoryHolder.StructSize, 100);
  154.             }
  155.         }
  156.  
  157.         #region Utils functions
  158.         public ServerInventory GetPlayerInventoryBySlot(InventorySlotE slot)
  159.         {
  160.             foreach (var inventory in PlayerInventories)
  161.             {
  162.                 if (inventory.Inventory.InventSlot == slot)
  163.                 {
  164.                     return inventory.Inventory;
  165.                 }
  166.             }
  167.             return null;
  168.         }
  169.         public ServerInventory GetPlayerInventoryByType(InventoryTypeE type)
  170.         {
  171.             foreach (var inventory in PlayerInventories)
  172.             {
  173.                 if (inventory.Inventory.InventType == type)
  174.                 {
  175.                     return inventory.Inventory;
  176.                 }
  177.             }
  178.             return null;
  179.         }
  180.  
  181.         public ServerInventory GetPlayerInventoryBySlotAndType(InventoryTypeE type, InventorySlotE slot)
  182.         {
  183.             foreach (var inventory in PlayerInventories)
  184.             {
  185.                 if (inventory.Inventory.InventType == type && inventory.Inventory.InventSlot == slot)
  186.                 {
  187.                     return inventory.Inventory;
  188.                 }
  189.             }
  190.             return null;
  191.         }
  192.  
  193.         #endregion
  194.         #endregion
  195.  
  196.         public ushort TradeChatChannel => M.ReadUShort(Address + 0x69F8);
  197.         public ushort GlobalChatChannel => M.ReadUShort(Address + 0x6A00);
  198.         public ushort LastActionId => M.ReadUShort(Address + 0x6A4C);
  199.  
  200.         #region Completed Areas
  201.         public List<WorldArea> UnknownAreas => GetAreas(0x6A88);
  202.         public List<WorldArea> CompletedAreas => GetAreas(0x6AC8);
  203.         public List<WorldArea> ShapedMaps => GetAreas(0x6B08);
  204.         public List<WorldArea> BonusCompletedAreas => GetAreas(0x6B48);
  205.         public List<WorldArea> ElderGuardiansAreas => GetAreas(0x6B88);
  206.         public List<WorldArea> MasterAreas => GetAreas(0x6BC8);
  207.         public List<WorldArea> ShaperElderAreas => GetAreas(0x6C08);
  208.  
  209.         private List<WorldArea> GetAreas(int offset)
  210.         {
  211.             var result = new List<WorldArea>();
  212.             var size = M.ReadInt(Address + offset - 0x8);
  213.  
  214.             if (size == 0 || size > 300)
  215.                 return result;
  216.             var listStart = M.ReadLong(Address + offset);
  217.  
  218.             for (var addr = M.ReadLong(listStart); addr != listStart; addr = M.ReadLong(addr))
  219.             {
  220.  
  221.                 var areaAddr = M.ReadLong(addr + 0x18);
  222.  
  223.                 if (areaAddr != 0)
  224.                 {
  225.                     var area = GameController.Instance.Files.WorldAreas.GetByAddress(areaAddr);
  226.                     if (area != null)
  227.                         result.Add(area);
  228.                 }
  229.  
  230.                 if (--size < 0) break;
  231.             }
  232.             return result;
  233.         }
  234.         #endregion
  235.         #region Monster Info
  236.         public byte MonsterLevel => M.ReadByte(Address + 0x75AC);
  237.         public byte MonstersRemaining => M.ReadByte(Address + 0x75AD); // 51 = 50+, 255 = N/A (Town, etc.)
  238.         #endregion
  239.         #region Delve Info
  240.         public int CurrentSulphiteAmount => M.ReadUShort(Address + 0x7644);
  241.         public int CurrentAzuriteAmount => M.ReadInt(Address + 0x7650);
  242.         #endregion
  243.         public enum NetworkStateE : byte
  244.         {
  245.             None,
  246.             Disconnected,
  247.             Connecting,
  248.             Connected
  249.         }
  250.  
  251.         public enum PartyStatus
  252.         {
  253.             PartyLeader,
  254.             Invited,
  255.             PartyMember,
  256.             None,
  257.         }
  258.  
  259.         public enum PartyAllocation : byte
  260.         {
  261.             FreeForAll,
  262.             ShortAllocation,
  263.             PermanentAllocation,
  264.             None,
  265.             NotInParty = 160
  266.         }
  267.  
  268.         public enum CharacterClass
  269.         {
  270.             Scion,
  271.             Marauder,
  272.             Ranger,
  273.             Witch,
  274.             Duelist,
  275.             Templar,
  276.             Shadow,
  277.             None
  278.         }
  279.     }
  280. }
Advertisement
Add Comment
Please, Sign In to add comment