/// <summary> /// </summary> /// <param name="sender"> </param> /// <param name="e"> </param> private void ScanTimerElapsed(object sender, ElapsedEventArgs e) { if (_isScanning) { return; } _isScanning = true; double refresh = 100; if (Double.TryParse(Settings.Default.TargetWorkerRefresh.ToString(CultureInfo.InvariantCulture), out refresh)) { _scanTimer.Interval = refresh; } Func <bool> scannerWorker = delegate { if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("GAMEMAIN")) { if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("CHARMAP")) { try { uint targetHateStructure; switch (Settings.Default.GameLanguage) { case "Chinese": targetHateStructure = MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] + 1136; break; default: targetHateStructure = MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] - 120664; break; } var enmityEntries = new List <EnmityEntry>(); var targetEntity = new TargetEntity(); if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("TARGET")) { var targetAddress = MemoryHandler.Instance.SigScanner.Locations["TARGET"]; var somethingFound = false; if (targetAddress > 0) { //var targetInfo = MemoryHandler.Instance.GetStructure<Structures.Target>(targetAddress); uint currentTarget; uint mouseOverTarget; uint focusTarget; uint previousTarget; uint currentTargetID; var targetInfoSource = MemoryHandler.Instance.GetByteArray(targetAddress, 128); switch (Settings.Default.GameLanguage) { case "Chinese": currentTarget = BitConverter.ToUInt32(targetInfoSource, 0x0); mouseOverTarget = BitConverter.ToUInt32(targetInfoSource, 0x18); focusTarget = BitConverter.ToUInt32(targetInfoSource, 0x48); previousTarget = BitConverter.ToUInt32(targetInfoSource, 0x54); currentTargetID = BitConverter.ToUInt32(targetInfoSource, 0x68); break; default: currentTarget = BitConverter.ToUInt32(targetInfoSource, 0x0); mouseOverTarget = BitConverter.ToUInt32(targetInfoSource, 0xC); focusTarget = BitConverter.ToUInt32(targetInfoSource, 0x3C); previousTarget = BitConverter.ToUInt32(targetInfoSource, 0x48); currentTargetID = BitConverter.ToUInt32(targetInfoSource, 0x5C); break; } if (currentTarget > 0) { try { var source = MemoryHandler.Instance.GetByteArray(currentTarget, 0x3F40); var entry = ActorEntityHelper.ResolveActorFromBytes(source); if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("MAP")) { try { entry.MapIndex = MemoryHandler.Instance.GetUInt32(MemoryHandler.Instance.SigScanner.Locations["MAP"]); } catch (Exception ex) { } } if (entry.IsValid) { somethingFound = true; targetEntity.CurrentTarget = entry; } } catch (Exception ex) { } } if (mouseOverTarget > 0) { try { var source = MemoryHandler.Instance.GetByteArray(mouseOverTarget, 0x3F40); var entry = ActorEntityHelper.ResolveActorFromBytes(source); if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("MAP")) { try { entry.MapIndex = MemoryHandler.Instance.GetUInt32(MemoryHandler.Instance.SigScanner.Locations["MAP"]); } catch (Exception ex) { } } if (entry.IsValid) { somethingFound = true; targetEntity.MouseOverTarget = entry; } } catch (Exception ex) { } } if (focusTarget > 0) { var source = MemoryHandler.Instance.GetByteArray(focusTarget, 0x3F40); var entry = ActorEntityHelper.ResolveActorFromBytes(source); if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("MAP")) { try { entry.MapIndex = MemoryHandler.Instance.GetUInt32(MemoryHandler.Instance.SigScanner.Locations["MAP"]); } catch (Exception ex) { } } if (entry.IsValid) { somethingFound = true; targetEntity.FocusTarget = entry; } } if (previousTarget > 0) { try { var source = MemoryHandler.Instance.GetByteArray(previousTarget, 0x3F40); var entry = ActorEntityHelper.ResolveActorFromBytes(source); if (MemoryHandler.Instance.SigScanner.Locations.ContainsKey("MAP")) { try { entry.MapIndex = MemoryHandler.Instance.GetUInt32(MemoryHandler.Instance.SigScanner.Locations["MAP"]); } catch (Exception ex) { } } if (entry.IsValid) { somethingFound = true; targetEntity.PreviousTarget = entry; } } catch (Exception ex) { } } if (currentTargetID > 0) { somethingFound = true; targetEntity.CurrentTargetID = currentTargetID; } } if (targetEntity.CurrentTargetID > 0) { for (uint i = 0; i < 16; i++) { var address = targetHateStructure + (i * 72); var enmityEntry = new EnmityEntry { ID = (uint)MemoryHandler.Instance.GetInt32(address), Enmity = (uint)MemoryHandler.Instance.GetInt32(address, 4) }; if (enmityEntry.ID <= 0) { continue; } if (PCWorkerDelegate.GetUniqueNPCEntities() .Any()) { if (PCWorkerDelegate.GetUniqueNPCEntities() .Any(a => a.ID == enmityEntry.ID)) { enmityEntry.Name = PCWorkerDelegate.GetUniqueNPCEntities() .First(a => a.ID == enmityEntry.ID) .Name; } } if (String.IsNullOrWhiteSpace(enmityEntry.Name)) { if (NPCWorkerDelegate.GetUniqueNPCEntities() .Any()) { if (NPCWorkerDelegate.GetUniqueNPCEntities() .Any(a => a.ID == enmityEntry.ID)) { enmityEntry.Name = NPCWorkerDelegate.GetUniqueNPCEntities() .First(a => a.NPCID2 == enmityEntry.ID) .Name; } } } if (String.IsNullOrWhiteSpace(enmityEntry.Name)) { if (MonsterWorkerDelegate.GetUniqueNPCEntities() .Any()) { if (MonsterWorkerDelegate.GetUniqueNPCEntities() .Any(a => a.ID == enmityEntry.ID)) { enmityEntry.Name = MonsterWorkerDelegate.GetUniqueNPCEntities() .First(a => a.ID == enmityEntry.ID) .Name; } } } enmityEntries.Add(enmityEntry); } } targetEntity.EnmityEntries = enmityEntries; if (somethingFound) { AppContextHelper.Instance.RaiseNewTargetEntity(targetEntity); } } } catch (Exception ex) { } } } _isScanning = false; return(true); }; scannerWorker.BeginInvoke(delegate { }, scannerWorker); }
public static TargetReadResult GetTargetInfo() { var result = new TargetReadResult(); if (!CanGetTargetInfo() || !MemoryHandler.Instance.IsAttached) { return(result); } try { var targetAddress = (IntPtr)Scanner.Instance.Locations[Signatures.TargetKey]; if (targetAddress.ToInt64() > 0) { var 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 { var entry = GetTargetActorEntityFromSource(currentTarget); currentTargetID = entry.ID; if (entry.IsValid) { result.TargetsFound = true; result.TargetEntity.CurrentTarget = entry; } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } if (mouseOverTarget > 0) { try { var entry = GetTargetActorEntityFromSource(mouseOverTarget); if (entry.IsValid) { result.TargetsFound = true; result.TargetEntity.MouseOverTarget = entry; } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } if (focusTarget > 0) { try { var entry = GetTargetActorEntityFromSource(focusTarget); if (entry.IsValid) { result.TargetsFound = true; result.TargetEntity.FocusTarget = entry; } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } if (previousTarget > 0) { try { var entry = GetTargetActorEntityFromSource(previousTarget); if (entry.IsValid) { result.TargetsFound = true; result.TargetEntity.PreviousTarget = entry; } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } if (currentTargetID > 0) { result.TargetsFound = true; result.TargetEntity.CurrentTargetID = currentTargetID; } } if (result.TargetEntity.CurrentTargetID > 0) { var enmityEntries = new List <EnmityEntry>(); 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) { for (uint i = 0; i < enmityCount; i++) { try { 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) { continue; } if (string.IsNullOrWhiteSpace(enmityEntry.Name)) { var pc = PCWorkerDelegate.GetEntity(enmityEntry.ID); var npc = NPCWorkerDelegate.GetEntity(enmityEntry.ID); var monster = MonsterWorkerDelegate.GetEntity(enmityEntry.ID); try { enmityEntry.Name = (pc ?? npc).Name ?? monster.Name; } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } enmityEntries.Add(enmityEntry); } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } } } } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } result.TargetEntity.EnmityEntries = enmityEntries; } } catch (Exception ex) { MemoryHandler.Instance.RaiseException(Logger, ex, true); } return(result); }
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); }
/// <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); }
/// <summary> /// カレントターゲットの敵視情報を取得 /// </summary> public unsafe List<EnmityEntry> GetEnmityEntryList() { short num; uint topEnmity = 0; var result = new List<EnmityEntry>(); var combatantList = Combatants; var mychar = GetSelfCombatant(); // 一度に全部読む var buffer = GetByteArray(_enmityAddress, 0x900 + 2); fixed (byte* p = buffer) num = p[0x900]; if (num <= 0) { return result; } if (num > 32) num = 32; for (short i = 0; i < num; i++) { var p = i*72; uint id; uint enmity; fixed (byte* bp = buffer) { id = *(uint*) &bp[p + 0x40]; enmity = *(uint*) &bp[p + 0x44]; } var entry = new EnmityEntry { Id = id, Enmity = enmity, IsMe = false, Name = "Unknown", Job = 0x00 }; if (entry.Id > 0) { var c = combatantList.Find(x => x.Id == entry.Id); if (c != null) { entry.Name = c.Name; entry.Job = c.Job; entry.OwnerId = c.OwnerId; } if (entry.Id == mychar.Id) { entry.IsMe = true; } if (topEnmity <= entry.Enmity) { topEnmity = entry.Enmity; } entry.HateRate = (int) ((entry.Enmity/(double) topEnmity)*100); result.Add(entry); } } 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); }
public AggroEntry(Helpers.AggroEntry aggroEntry) { BattleCharacter = GetBattleCharacterWithId(aggroEntry.Id); HateRate = aggroEntry.HateRate; Order = aggroEntry.Order; Target = new EnmityEntry(aggroEntry.Target); }
/// <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 { var enmityCount = MemoryHandler.Instance.GetInt16(MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] + 5688); var enmityStructure = MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] + 3384; 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 { Name = MemoryHandler.Instance.GetString(address), ID = (uint)MemoryHandler.Instance.GetInt32(address + 64), Enmity = (uint)MemoryHandler.Instance.GetInt16(address + 68) }; if (enmityEntry.ID > 0) { enmityEntries.Add(enmityEntry); } } } var playerInfo = MemoryHandler.Instance.GetStructure <Structures.PlayerInfo>(PlayerInfoMap); var playerEntity = new PlayerEntity { Name = MemoryHandler.Instance.GetString(PlayerInfoMap, 1), EnmityEntries = enmityEntries, Accuracy = playerInfo.Accuracy, ACN = playerInfo.ACN, ACN_CurrentEXP = playerInfo.ACN_CurrentEXP, ALC = playerInfo.ALC, ARC = playerInfo.ARC, ARC_CurrentEXP = playerInfo.ARC_CurrentEXP, ARM = playerInfo.ARM, ARM_CurrentEXP = playerInfo.ARM_CurrentEXP, AttackMagicPotency = playerInfo.AttackMagicPotency, AttackPower = playerInfo.AttackPower, BTN = playerInfo.BTN, BTN_CurrentEXP = playerInfo.BTN_CurrentEXP, BSM = playerInfo.BSM, BSM_CurrentEXP = playerInfo.BSM_CurrentEXP, BaseDexterity = playerInfo.BaseDexterity, BaseIntelligence = playerInfo.BaseIntelligence, BaseMind = playerInfo.BaseMind, BasePiety = playerInfo.BasePiety, BaseStrength = playerInfo.BaseStrength, BaseVitality = playerInfo.BaseVitality, CNJ = playerInfo.CNJ, CNJ_CurrentEXP = playerInfo.CNJ_CurrentEXP, CPMax = playerInfo.CPMax, CPT = playerInfo.CPT, CPT_CurrentEXP = playerInfo.CPT_CurrentEXP, CUL = playerInfo.CUL, CUL_CurrentEXP = playerInfo.CUL_CurrentEXP, Control = playerInfo.Control, Craftmanship = playerInfo.Craftmanship, CriticalHitRate = playerInfo.CriticalHitRate, Defense = playerInfo.Defense, Determination = playerInfo.Determination, Dexterity = playerInfo.Dexterity, FSH = playerInfo.FSH, FSH_CurrentEXP = playerInfo.FSH_CurrentEXP, FireResistance = playerInfo.FireResistance, GLD = playerInfo.GLD, GLD_CurrentEXP = playerInfo.GLD_CurrentEXP, GPMax = playerInfo.GPMax, GSM = playerInfo.GSM, GSM_CurrentEXP = playerInfo.GSM_CurrentEXP, Gathering = playerInfo.Gathering, HPMax = playerInfo.HPMax, HealingMagicPotency = playerInfo.HealingMagicPotency, IceResistance = playerInfo.IceResistance, Intelligence = playerInfo.Intelligence, JobID = playerInfo.JobID, LNC = playerInfo.LNC, LNC_CurrentEXP = playerInfo.LNC_CurrentEXP, LTW = playerInfo.LTW, LTW_CurrentEXP = playerInfo.LTW_CurrentEXP, LightningResistance = playerInfo.LightningResistance, MIN = playerInfo.MIN, MIN_CurrentEXP = playerInfo.MIN_CurrentEXP, MPMax = playerInfo.MPMax, MRD = playerInfo.MRD, MRD_CurrentEXP = playerInfo.MRD_CurrentEXP, MagicDefense = playerInfo.MagicDefense, Mind = playerInfo.Mind, PGL = playerInfo.PGL, PGL_CurrentEXP = playerInfo.PGL_CurrentEXP, Parry = playerInfo.Parry, Perception = playerInfo.Perception, PiercingResistance = playerInfo.PiercingResistance, Piety = playerInfo.Piety, SkillSpeed = playerInfo.SkillSpeed, SlashingResistance = playerInfo.SlashingResistance, SpellSpeed = playerInfo.SpellSpeed, Strength = playerInfo.Strength, THM = playerInfo.THM, THM_CurrentEXP = playerInfo.THM_CurrentEXP, TPMax = playerInfo.TPMax, Vitality = playerInfo.Vitality, WVR = playerInfo.WVR, WVR_CurrentEXP = playerInfo.WVR_CurrentEXP, WaterResistance = playerInfo.WaterResistance, WindResistance = playerInfo.WindResistance }; playerEntity.Job = (Actor.Job)playerEntity.JobID; var notify = false; if (LastPlayerEntity == null) { LastPlayerEntity = playerEntity; notify = true; } else { var hash1 = JsonConvert.SerializeObject(LastPlayerEntity) .GetHashCode(); var hash2 = JsonConvert.SerializeObject(playerEntity) .GetHashCode(); if (!hash1.Equals(hash2)) { LastPlayerEntity = playerEntity; notify = true; } } if (notify) { AppContextHelper.Instance.RaiseNewPlayerEntity(playerEntity); } } catch (Exception ex) { } } else { try { PlayerInfoMap = MemoryHandler.Instance.SigScanner.Locations["CHARMAP"] + 5724; MemoryHandler.Instance.SigScanner.Locations.Add("PLAYERINFO", PlayerInfoMap); } catch (Exception ex) { } } } _isScanning = false; return(true); }; scannerWorker.BeginInvoke(delegate { }, scannerWorker); }