public long GetPlatformUIntFromBytes(byte[] source, int index = 0) { if (this.ProcessModel.IsWin64) { return((long)BitConverter.TryToUInt64(source, index)); } return(BitConverter.TryToUInt32(source, index)); }
public IntPtr ReadPointer(IntPtr address, long offset = 0) { if (this.ProcessModel.IsWin64) { byte[] win64 = new byte[8]; this.Peek(new IntPtr(address.ToInt64() + offset), win64); return(new IntPtr(BitConverter.TryToInt64(win64, 0))); } byte[] win32 = new byte[4]; this.Peek(new IntPtr(address.ToInt64() + offset), win32); return(IntPtr.Add(IntPtr.Zero, BitConverter.TryToInt32(win32, 0))); }
public static TargetResult GetTargetInfo() { var result = new TargetResult(); if (!CanGetTargetInfo() || !MemoryHandler.Instance.IsAttached) { return(result); } try { var targetAddress = (IntPtr)Scanner.Instance.Locations[Signatures.TargetKey]; if (targetAddress.ToInt64() > 0) { byte[] targetInfoSource = MemoryHandler.Instance.GetByteArray(targetAddress, MemoryHandler.Instance.Structures.TargetInfo.SourceSize); var currentTarget = MemoryHandler.Instance.GetPlatformIntFromBytes(targetInfoSource, MemoryHandler.Instance.Structures.TargetInfo.Current); var mouseOverTarget = MemoryHandler.Instance.GetPlatformIntFromBytes(targetInfoSource, MemoryHandler.Instance.Structures.TargetInfo.MouseOver); var focusTarget = MemoryHandler.Instance.GetPlatformIntFromBytes(targetInfoSource, MemoryHandler.Instance.Structures.TargetInfo.Focus); var previousTarget = MemoryHandler.Instance.GetPlatformIntFromBytes(targetInfoSource, MemoryHandler.Instance.Structures.TargetInfo.Previous); var currentTargetID = BitConverter.TryToUInt32(targetInfoSource, MemoryHandler.Instance.Structures.TargetInfo.CurrentID); if (currentTarget > 0) { try { ActorItem entry = GetTargetActorItemFromSource(currentTarget); currentTargetID = entry.ID; if (entry.IsValid) { result.TargetsFound = true; result.TargetInfo.CurrentTarget = entry; } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } if (mouseOverTarget > 0) { try { ActorItem entry = GetTargetActorItemFromSource(mouseOverTarget); if (entry.IsValid) { result.TargetsFound = true; result.TargetInfo.MouseOverTarget = entry; } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } if (focusTarget > 0) { try { ActorItem entry = GetTargetActorItemFromSource(focusTarget); if (entry.IsValid) { result.TargetsFound = true; result.TargetInfo.FocusTarget = entry; } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } if (previousTarget > 0) { try { ActorItem entry = GetTargetActorItemFromSource(previousTarget); if (entry.IsValid) { result.TargetsFound = true; result.TargetInfo.PreviousTarget = entry; } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } if (currentTargetID > 0) { result.TargetsFound = true; result.TargetInfo.CurrentTargetID = currentTargetID; } } if (result.TargetInfo.CurrentTargetID > 0) { try { if (CanGetEnmityEntities()) { var enmityCount = MemoryHandler.Instance.GetInt16(Scanner.Instance.Locations[Signatures.EnmityCountKey]); var enmityStructure = (IntPtr)Scanner.Instance.Locations[Signatures.EnmityMapKey]; if (enmityCount > 0 && enmityCount < 16 && enmityStructure.ToInt64() > 0) { var enmitySourceSize = MemoryHandler.Instance.Structures.EnmityItem.SourceSize; for (uint i = 0; i < enmityCount; i++) { try { var address = new IntPtr(enmityStructure.ToInt64() + i * enmitySourceSize); var enmityEntry = new EnmityItem { ID = (uint)MemoryHandler.Instance.GetPlatformInt(address, MemoryHandler.Instance.Structures.EnmityItem.ID), Name = MemoryHandler.Instance.GetString(address + MemoryHandler.Instance.Structures.EnmityItem.Name), Enmity = MemoryHandler.Instance.GetUInt32(address + MemoryHandler.Instance.Structures.EnmityItem.Enmity) }; if (enmityEntry.ID <= 0) { continue; } if (string.IsNullOrWhiteSpace(enmityEntry.Name)) { ActorItem pc = PCWorkerDelegate.GetActorItem(enmityEntry.ID); ActorItem npc = NPCWorkerDelegate.GetActorItem(enmityEntry.ID); ActorItem monster = MonsterWorkerDelegate.GetActorItem(enmityEntry.ID); try { enmityEntry.Name = (pc ?? npc).Name ?? monster.Name; } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } result.TargetInfo.EnmityItems.Add(enmityEntry); } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } } } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } return(result); }
public static PartyResult GetPartyMembers() { var result = new PartyResult(); if (!CanGetPartyMembers() || !MemoryHandler.Instance.IsAttached) { return(result); } var PartyInfoMap = (IntPtr)Scanner.Instance.Locations[Signatures.PartyMapKey]; Signature PartyCountMap = Scanner.Instance.Locations[Signatures.PartyCountKey]; foreach (KeyValuePair <uint, PartyMember> kvp in PartyWorkerDelegate.PartyMembers) { result.RemovedPartyMembers.TryAdd(kvp.Key, kvp.Value.Clone()); } try { var partyCount = MemoryHandler.Instance.GetByte(PartyCountMap); var sourceSize = MemoryHandler.Instance.Structures.PartyMember.SourceSize; if (partyCount > 1 && partyCount < 9) { for (uint i = 0; i < partyCount; i++) { var address = PartyInfoMap.ToInt64() + i * (uint)sourceSize; byte[] source = MemoryHandler.Instance.GetByteArray(new IntPtr(address), sourceSize); var ID = BitConverter.TryToUInt32(source, MemoryHandler.Instance.Structures.PartyMember.ID); ActorItem existing = null; var newEntry = false; if (result.RemovedPartyMembers.ContainsKey(ID)) { result.RemovedPartyMembers.TryRemove(ID, out PartyMember removedPartyMember); if (MonsterWorkerDelegate.ActorItems.ContainsKey(ID)) { existing = MonsterWorkerDelegate.GetActorItem(ID); } if (PCWorkerDelegate.ActorItems.ContainsKey(ID)) { existing = PCWorkerDelegate.GetActorItem(ID); } } else { newEntry = true; } PartyMember entry = PartyMemberResolver.ResolvePartyMemberFromBytes(source, existing); if (!entry.IsValid) { continue; } if (existing != null) { continue; } if (newEntry) { PartyWorkerDelegate.EnsurePartyMember(entry.ID, entry); result.NewPartyMembers.TryAdd(entry.ID, entry.Clone()); } } } if (partyCount <= 1) { PartyMember entry = PartyMemberResolver.ResolvePartyMemberFromBytes(Array.Empty <byte>(), PCWorkerDelegate.CurrentUser); if (result.RemovedPartyMembers.ContainsKey(entry.ID)) { result.RemovedPartyMembers.TryRemove(entry.ID, out PartyMember removedPartyMember); } PartyWorkerDelegate.EnsurePartyMember(entry.ID, entry); } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } try { // REMOVE OLD PARTY MEMBERS FROM LIVE CURRENT DICTIONARY foreach (KeyValuePair <uint, PartyMember> kvp in result.RemovedPartyMembers) { PartyWorkerDelegate.RemovePartyMember(kvp.Key); } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } return(result); }
public short GetInt16(IntPtr address, long offset = 0) { byte[] value = new byte[2]; this.Peek(new IntPtr(address.ToInt64() + offset), value); return(BitConverter.TryToInt16(value, 0)); }
public ulong GetUInt64(IntPtr address, long offset = 0) { byte[] value = new byte[8]; this.Peek(new IntPtr(address.ToInt64() + offset), value); return(BitConverter.TryToUInt32(value, 0)); }
public static async Task <ActorResult> GetActors() { var result = new ActorResult(); if (!CanGetActors() || !MemoryHandler.Instance.IsAttached) { return(result); } try { IntPtr targetAddress = IntPtr.Zero; var endianSize = MemoryHandler.Instance.ProcessModel.IsWin64 ? 8 : 4; var sourceSize = MemoryHandler.Instance.Structures.ActorItem.SourceSize; var limit = MemoryHandler.Instance.Structures.ActorItem.EntityCount; byte[] characterAddressMap = MemoryHandler.Instance.GetByteArray(Scanner.Instance.Locations[Signatures.CharacterMapKey], endianSize * limit); Dictionary <IntPtr, IntPtr> uniqueAddresses = new Dictionary <IntPtr, IntPtr>(); IntPtr firstAddress = IntPtr.Zero; DateTime now = DateTime.Now; TimeSpan staleActorRemovalTime = TimeSpan.FromSeconds(0.25); var firstTime = true; for (var i = 0; i < limit; i++) { IntPtr characterAddress; if (MemoryHandler.Instance.ProcessModel.IsWin64) { characterAddress = new IntPtr(BitConverter.TryToInt64(characterAddressMap, i * endianSize)); } else { characterAddress = new IntPtr(BitConverter.TryToInt32(characterAddressMap, i * endianSize)); } if (characterAddress == IntPtr.Zero) { continue; } if (firstTime) { firstAddress = characterAddress; firstTime = false; } uniqueAddresses[characterAddress] = characterAddress; } foreach (KeyValuePair <uint, ActorItem> kvp in MonsterWorkerDelegate.ActorItems) { result.RemovedMonsters.TryAdd(kvp.Key, kvp.Value.Clone()); } foreach (KeyValuePair <uint, ActorItem> kvp in NPCWorkerDelegate.ActorItems) { result.RemovedNPCs.TryAdd(kvp.Key, kvp.Value.Clone()); } foreach (KeyValuePair <uint, ActorItem> kvp in PCWorkerDelegate.ActorItems) { result.RemovedPCs.TryAdd(kvp.Key, kvp.Value.Clone()); } foreach (KeyValuePair <IntPtr, IntPtr> kvp in uniqueAddresses) { try { var characterAddress = new IntPtr(kvp.Value.ToInt64()); byte[] source = MemoryHandler.Instance.GetByteArray(characterAddress, sourceSize); // var source = MemoryHandler.Instance.GetByteArray(characterAddress, 0x3F40); var ID = BitConverter.TryToUInt32(source, MemoryHandler.Instance.Structures.ActorItem.ID); var NPCID2 = BitConverter.TryToUInt32(source, MemoryHandler.Instance.Structures.ActorItem.NPCID2); var Type = (Actor.Type)source[MemoryHandler.Instance.Structures.ActorItem.Type]; ActorItem existing = null; var newEntry = false; switch (Type) { case Actor.Type.Monster: if (result.RemovedMonsters.ContainsKey(ID)) { result.RemovedMonsters.TryRemove(ID, out ActorItem removedMonster); existing = MonsterWorkerDelegate.GetActorItem(ID); } else { newEntry = true; } break; case Actor.Type.PC: if (result.RemovedPCs.ContainsKey(ID)) { result.RemovedPCs.TryRemove(ID, out ActorItem removedPC); existing = PCWorkerDelegate.GetActorItem(ID); } else { newEntry = true; } break; case Actor.Type.NPC: case Actor.Type.Aetheryte: case Actor.Type.EventObject: if (result.RemovedNPCs.ContainsKey(NPCID2)) { result.RemovedNPCs.TryRemove(NPCID2, out ActorItem removedNPC); existing = NPCWorkerDelegate.GetActorItem(NPCID2); } else { newEntry = true; } break; default: if (result.RemovedNPCs.ContainsKey(ID)) { result.RemovedNPCs.TryRemove(ID, out ActorItem removedNPC); existing = NPCWorkerDelegate.GetActorItem(ID); } else { newEntry = true; } break; } var isFirstEntry = kvp.Value.ToInt64() == firstAddress.ToInt64(); ActorItem entry = await ActorItemResolver.ResolveActorFromBytes(source, isFirstEntry, existing); if (entry != null && entry.IsValid) { if (expiringActors.ContainsKey(ID)) { expiringActors.Remove(ID); } } if (entry.Type == Actor.Type.EventObject) { var(EventObjectTypeID, EventObjectType) = GetEventObjectType(targetAddress); entry.EventObjectTypeID = EventObjectTypeID; entry.EventObjectType = EventObjectType; } EnsureMapAndZone(entry); if (isFirstEntry) { if (targetAddress.ToInt64() > 0) { byte[] targetInfoSource = MemoryHandler.Instance.GetByteArray(targetAddress, 128); entry.TargetID = (int)BitConverter.TryToUInt32(targetInfoSource, MemoryHandler.Instance.Structures.ActorItem.ID); } } // it doesn't matter what this is set to; it won't be used in code below ActorItem removed; if (!entry.IsValid) { result.NewMonsters.TryRemove(entry.ID, out removed); result.NewMonsters.TryRemove(entry.NPCID2, out removed); result.NewNPCs.TryRemove(entry.ID, out removed); result.NewNPCs.TryRemove(entry.NPCID2, out removed); result.NewPCs.TryRemove(entry.ID, out removed); result.NewPCs.TryRemove(entry.NPCID2, out removed); continue; } if (existing != null) { continue; } if (newEntry) { switch (entry.Type) { case Actor.Type.Monster: MonsterWorkerDelegate.EnsureActorItem(entry.ID, entry); result.NewMonsters.TryAdd(entry.ID, entry.Clone()); break; case Actor.Type.PC: PCWorkerDelegate.EnsureActorItem(entry.ID, entry); result.NewPCs.TryAdd(entry.ID, entry.Clone()); break; case Actor.Type.Aetheryte: case Actor.Type.EventObject: case Actor.Type.NPC: NPCWorkerDelegate.EnsureActorItem(entry.NPCID2, entry); result.NewNPCs.TryAdd(entry.NPCID2, entry.Clone()); break; default: NPCWorkerDelegate.EnsureActorItem(entry.ID, entry); result.NewNPCs.TryAdd(entry.ID, entry.Clone()); break; } } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } try { // add the "removed" actors to the expiring list foreach (KeyValuePair <uint, ActorItem> kvp in result.RemovedMonsters) { if (!expiringActors.ContainsKey(kvp.Key)) { expiringActors[kvp.Key] = now + staleActorRemovalTime; } } foreach (KeyValuePair <uint, ActorItem> kvp in result.RemovedNPCs) { if (!expiringActors.ContainsKey(kvp.Key)) { expiringActors[kvp.Key] = now + staleActorRemovalTime; } } foreach (KeyValuePair <uint, ActorItem> kvp in result.RemovedPCs) { if (!expiringActors.ContainsKey(kvp.Key)) { expiringActors[kvp.Key] = now + staleActorRemovalTime; } } // check expiring list for stale actors foreach (var kvp in expiringActors.ToList()) { if (now > kvp.Value) { // Stale actor. Remove it. MonsterWorkerDelegate.RemoveActorItem(kvp.Key); NPCWorkerDelegate.RemoveActorItem(kvp.Key); PCWorkerDelegate.RemoveActorItem(kvp.Key); expiringActors.Remove(kvp.Key); } else { // Not stale enough yet. We're not actually removing it. result.RemovedMonsters.TryRemove(kvp.Key, out ActorItem _); result.RemovedNPCs.TryRemove(kvp.Key, out ActorItem _); result.RemovedPCs.TryRemove(kvp.Key, out ActorItem _); } } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } MemoryHandler.Instance.ScanCount++; } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } return(result); }
public float GetSingle(IntPtr address, long offset = 0) { byte[] value = new byte[4]; this.Peek(new IntPtr(address.ToInt64() + offset), value); return(BitConverter.TryToSingle(value, 0)); }