/// <summary> /// </summary> /// <param name="sender"> </param> /// <param name="e"> </param> private void ScanTimerElapsed(object sender, ElapsedEventArgs e) { if (_isScanning) { return; } _isScanning = true; double refresh = 1000; if (Double.TryParse(Settings.Default.PlayerInfoWorkerRefresh.ToString(CultureInfo.InvariantCulture), out refresh)) { _scanTimer.Interval = refresh; } Func <bool> scannerWorker = delegate { if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("CHARMAP")) { if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("PLAYERINFO")) { PlayerInfoMap = MemoryHandler.Instance.SigScanner.Locations["PLAYERINFO"]; if (PlayerInfoMap <= 6496) { return(false); } try { short enmityCount; uint enmityStructure; switch (Settings.Default.GameLanguage) { case "Chinese": enmityCount = MemoryHandler.Instance.GetInt16(MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] + 5688); enmityStructure = MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] + 3384; break; default: enmityCount = MemoryHandler.Instance.GetInt16(MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] - 0x1C590); // 116032 enmityStructure = MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] - 0x1CE94; // 118340; break; } var enmityEntries = new List <EnmityEntry>(); if (enmityCount > 0 && enmityCount < 32 && enmityStructure > 0) { for (uint i = 0; i < enmityCount; i++) { var address = enmityStructure + (i * 72); var enmityEntry = new EnmityEntry { ID = (uint)MemoryHandler.Instance.GetInt32(address), Name = MemoryHandler.Instance.GetString(address + 4), Enmity = (uint)MemoryHandler.Instance.GetInt16(address + 72) }; if (enmityEntry.ID > 0) { enmityEntries.Add(enmityEntry); } } } var source = MemoryHandler.Instance.GetByteArray(PlayerInfoMap, 0x256); try { var entry = PlayerEntityHelper.ResolvePlayerFromBytes(source); entry.EnmityEntries = enmityEntries; var notify = false; if (LastPlayerEntity == null) { LastPlayerEntity = entry; notify = true; } else { var hash1 = JsonConvert.SerializeObject(LastPlayerEntity) .GetHashCode(); var hash2 = JsonConvert.SerializeObject(entry) .GetHashCode(); if (!hash1.Equals(hash2)) { LastPlayerEntity = entry; notify = true; } } if (notify) { AppContextHelper.Instance.RaiseNewPlayerEntity(entry); } } catch (Exception ex) { } } catch (Exception ex) { } } else { try { switch (Settings.Default.GameLanguage) { case "Chinese": PlayerInfoMap = MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] + 5724; break; default: PlayerInfoMap = MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] - 115996; break; } MemoryHandler.Instance.SigScanner.Locations.Add("PLAYERINFO", PlayerInfoMap); } catch (Exception ex) { } } } _isScanning = false; return(true); }; scannerWorker.BeginInvoke(delegate { }, scannerWorker); }
public static PlayerInfoReadResult GetPlayerInfo() { var result = new PlayerInfoReadResult(); if (!Scanner.Instance.Locations.ContainsKey("CHARMAP")) { return(result); } if (!Scanner.Instance.Locations.ContainsKey("PLAYERINFO")) { return(result); } PlayerInfoMap = Scanner.Instance.Locations["PLAYERINFO"]; if (PlayerInfoMap.ToInt64() <= 6496) { return(result); } try { var enmityEntries = new List <EnmityEntry>(); if (Scanner.Instance.Locations.ContainsKey("AGROMAP") && Scanner.Instance.Locations.ContainsKey("AGRO_COUNT")) { var enmityCount = MemoryHandler.Instance.GetInt16(Scanner.Instance.Locations["AGRO_COUNT"]); var enmityStructure = (IntPtr)Scanner.Instance.Locations["AGROMAP"]; if (enmityCount > 0 && enmityCount < 32 && enmityStructure.ToInt64() > 0) { for (uint i = 0; i < enmityCount; i++) { var address = new IntPtr(enmityStructure.ToInt64() + i * 72); var enmityEntry = new EnmityEntry { ID = (uint)MemoryHandler.Instance.GetPlatformInt(address, MemoryHandler.Instance.Structures.EnmityEntry.ID), Name = MemoryHandler.Instance.GetString(address + MemoryHandler.Instance.Structures.EnmityEntry.Name), Enmity = MemoryHandler.Instance.GetUInt32(address + MemoryHandler.Instance.Structures.EnmityEntry.Enmity) }; if (enmityEntry.ID > 0) { enmityEntries.Add(enmityEntry); } } } } var source = MemoryHandler.Instance.GetByteArray(PlayerInfoMap, 0x256); try { result.PlayerEntity = PlayerEntityHelper.ResolvePlayerFromBytes(source); result.PlayerEntity.EnmityEntries = enmityEntries; } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } return(result); }
public static PlayerInfoReadResult GetPlayerInfo() { var result = new PlayerInfoReadResult(); if (!CanGetPlayerInfo() || !MemoryHandler.Instance.IsAttached) { return(result); } var PlayerInfoMap = (IntPtr)Scanner.Instance.Locations[Signatures.PlayerInformationKey]; if (PlayerInfoMap.ToInt64() <= 6496) { return(result); } try { var agroEntries = new List <EnmityEntry>(); if (CanGetAgroEntities()) { var agroCount = MemoryHandler.Instance.GetInt16(Scanner.Instance.Locations[Signatures.AgroCountKey]); var agroStructure = (IntPtr)Scanner.Instance.Locations[Signatures.AgroMapKey]; if (agroCount > 0 && agroCount < 32 && agroStructure.ToInt64() > 0) { for (uint i = 0; i < agroCount; i++) { var address = new IntPtr(agroStructure.ToInt64() + i * 72); var agroEntry = new EnmityEntry { ID = (uint)MemoryHandler.Instance.GetPlatformInt(address, MemoryHandler.Instance.Structures.EnmityEntry.ID), Name = MemoryHandler.Instance.GetString(address + MemoryHandler.Instance.Structures.EnmityEntry.Name), Enmity = MemoryHandler.Instance.GetUInt32(address + MemoryHandler.Instance.Structures.EnmityEntry.Enmity) }; if (agroEntry.ID > 0) { agroEntries.Add(agroEntry); } } } } var source = MemoryHandler.Instance.GetByteArray(PlayerInfoMap, 0x256); try { result.PlayerEntity = PlayerEntityHelper.ResolvePlayerFromBytes(source); result.PlayerEntity.EnmityEntries = agroEntries; } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } return(result); }