private bool GetPointerAddress() { if (!memory.IsValid()) { return(false); } // Don't scan too often to avoid excessive CPU load if ((DateTime.Now - lastSigScan) < TimeSpan.FromSeconds(5)) { return(false); } lastSigScan = DateTime.Now; bool success = true; bool bRIP = true; List <string> fail = new List <string>(); /// CHARMAP List <IntPtr> list = memory.SigScan(charmapSignature, 0, bRIP); if (list != null && list.Count > 0) { charmapAddress = list[0] + charmapSignatureOffset; } else { charmapAddress = IntPtr.Zero; fail.Add(nameof(charmapAddress)); success = false; } // ENMITY list = memory.SigScan(enmitySignature, 0, bRIP); if (list != null && list.Count > 0) { enmityAddress = IntPtr.Add(list[0], enmitySignatureOffset); aggroAddress = IntPtr.Add(list[0], aggroEnmityOffset); } else { enmityAddress = IntPtr.Zero; aggroAddress = IntPtr.Zero; fail.Add(nameof(enmityAddress)); fail.Add(nameof(aggroAddress)); success = false; } /// TARGET list = memory.SigScan(targetSignature, 0, bRIP); if (list != null && list.Count > 0) { targetAddress = list[0] + targetSignatureOffset; } else { targetAddress = IntPtr.Zero; fail.Add(nameof(targetAddress)); success = false; } /// IN COMBAT // The in combat address is set from a combination of two values, a base address and an offset. // They are found adjacent to the same signature, but at different offsets. var baseList = memory.SigScan(inCombatSignature, inCombatSignatureBaseOffset, bRIP); // SigScan returns pointers, but the offset is a 32-bit immediate value. Do not use RIP. var offsetList = memory.SigScan(inCombatSignature, inCombatSignatureOffsetOffset, false); if (baseList != null && baseList.Count > 0 && offsetList != null && offsetList.Count > 0) { var baseAddress = baseList[0]; var offset = (int)(((UInt64)offsetList[0]) & 0xFFFFFFFF); inCombatAddress = IntPtr.Add(baseAddress, offset); } else { inCombatAddress = IntPtr.Zero; fail.Add(nameof(inCombatAddress)); success = false; } // EnmityList list = memory.SigScan(enmityHudSignature, 0, bRIP); if (list != null && list.Count == 1) { enmityHudAddress = list[0] + enmityHudSignatureOffset; if (enmityHudAddress == IntPtr.Zero) { fail.Add(nameof(enmityHudAddress)); success = false; } } else { enmityHudAddress = IntPtr.Zero; fail.Add(nameof(enmityHudAddress)); success = false; } logger.Log(LogLevel.Debug, "charmapAddress: 0x{0:X}", charmapAddress.ToInt64()); logger.Log(LogLevel.Debug, "enmityAddress: 0x{0:X}", enmityAddress.ToInt64()); logger.Log(LogLevel.Debug, "aggroAddress: 0x{0:X}", aggroAddress.ToInt64()); logger.Log(LogLevel.Debug, "targetAddress: 0x{0:X}", targetAddress.ToInt64()); logger.Log(LogLevel.Debug, "inCombatAddress: 0x{0:X}", inCombatAddress.ToInt64()); logger.Log(LogLevel.Debug, "enmityListAddress: 0x{0:X}", enmityHudAddress.ToInt64()); Combatant c = GetSelfCombatant(); if (c != null) { logger.Log(LogLevel.Debug, "MyCharacter: '{0}' (0x{1:X})", c.Name, c.ID); } if (!success) { if (loggedScanErrors < 10) { logger.Log(LogLevel.Error, "Failed to find enmity memory for 5.4: {0}.", String.Join(",", fail)); loggedScanErrors++; if (loggedScanErrors == 10) { logger.Log(LogLevel.Error, "Further enmity errors won't be logged."); } } } else { logger.Log(LogLevel.Info, "Found enmity memory for 5.4."); loggedScanErrors = 0; } return(success); }
private bool GetPointerAddress() { if (!memory.IsValid()) { return(false); } // Don't scan too often to avoid excessive CPU load if ((DateTime.Now - lastSigScan) < TimeSpan.FromSeconds(5)) { return(false); } lastSigScan = DateTime.Now; bool success = true; bool bRIP = true; List <string> fail = new List <string>(); /// CHARMAP List <IntPtr> list = memory.SigScan(charmapSignature, 0, bRIP); if (list != null && list.Count > 0) { charmapAddress = list[0] + charmapSignatureOffset; } else { charmapAddress = IntPtr.Zero; fail.Add(nameof(charmapAddress)); success = false; } // ENMITY list = memory.SigScan(enmitySignature, 0, bRIP); if (list != null && list.Count > 0) { enmityAddress = IntPtr.Add(list[0], enmitySignatureOffset); aggroAddress = IntPtr.Add(list[0], aggroEnmityOffset); } else { enmityAddress = IntPtr.Zero; aggroAddress = IntPtr.Zero; fail.Add(nameof(enmityAddress)); fail.Add(nameof(aggroAddress)); success = false; } /// TARGET list = memory.SigScan(targetSignature, 0, bRIP); if (list != null && list.Count > 0) { targetAddress = list[0] + targetSignatureOffset; } else { targetAddress = IntPtr.Zero; fail.Add(nameof(targetAddress)); success = false; } /// IN COMBAT list = memory.SigScan(inCombatSignature, inCombatSignatureOffset, bRIP, inCombatRIPOffset); if (list != null && list.Count > 0) { inCombatAddress = list[0]; } else { inCombatAddress = IntPtr.Zero; fail.Add(nameof(inCombatAddress)); success = false; } // EnmityList list = memory.SigScan(enmityHudSignature, 0, bRIP); if (list != null && list.Count == 1) { enmityHudAddress = list[0] + enmityHudSignatureOffset; if (enmityHudAddress == IntPtr.Zero) { fail.Add(nameof(enmityHudAddress)); success = false; } } else { enmityHudAddress = IntPtr.Zero; fail.Add(nameof(enmityHudAddress)); success = false; } logger.Log(LogLevel.Debug, "charmapAddress: 0x{0:X}", charmapAddress.ToInt64()); logger.Log(LogLevel.Debug, "enmityAddress: 0x{0:X}", enmityAddress.ToInt64()); logger.Log(LogLevel.Debug, "aggroAddress: 0x{0:X}", aggroAddress.ToInt64()); logger.Log(LogLevel.Debug, "targetAddress: 0x{0:X}", targetAddress.ToInt64()); logger.Log(LogLevel.Debug, "inCombatAddress: 0x{0:X}", inCombatAddress.ToInt64()); logger.Log(LogLevel.Debug, "enmityListAddress: 0x{0:X}", enmityHudAddress.ToInt64()); Combatant c = GetSelfCombatant(); if (c != null) { logger.Log(LogLevel.Debug, "MyCharacter: '{0}' (0x{1:X})", c.Name, c.ID); } if (!success) { if (loggedScanErrors < 10) { logger.Log(LogLevel.Error, "Failed to find enmity memory for 6.1: {0}.", String.Join(",", fail)); loggedScanErrors++; if (loggedScanErrors == 10) { logger.Log(LogLevel.Error, "Further enmity errors won't be logged."); } } } else { logger.Log(LogLevel.Info, "Found enmity memory for 6.1."); loggedScanErrors = 0; } return(success); }