diff --git a/LightlessSync/PlayerData/Handlers/GameObjectHandler.cs b/LightlessSync/PlayerData/Handlers/GameObjectHandler.cs index f3d1a4b..efff84d 100644 --- a/LightlessSync/PlayerData/Handlers/GameObjectHandler.cs +++ b/LightlessSync/PlayerData/Handlers/GameObjectHandler.cs @@ -78,7 +78,6 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP if (msg.Address == Address) { _haltProcessing = false; - Refresh(); } }); @@ -114,16 +113,16 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP public async Task ActOnFrameworkAfterEnsureNoDrawAsync(Action act, CancellationToken token) { while (await _dalamudUtil.RunOnFrameworkThread(() => - { - EnsureLatestObjectState(); - if (CurrentDrawCondition != DrawCondition.None) return true; - var gameObj = _dalamudUtil.CreateGameObject(Address); - if (gameObj is Dalamud.Game.ClientState.Objects.Types.ICharacter chara) - { - act.Invoke(chara); - } - return false; - }).ConfigureAwait(false)) + { + EnsureLatestObjectState(); + if (CurrentDrawCondition != DrawCondition.None) return true; + var gameObj = _dalamudUtil.CreateGameObject(Address); + if (gameObj is Dalamud.Game.ClientState.Objects.Types.ICharacter chara) + { + act.Invoke(chara); + } + return false; + }).ConfigureAwait(false)) { await Task.Delay(250, token).ConfigureAwait(false); } @@ -183,6 +182,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP { var prevAddr = Address; var prevDrawObj = DrawObjectAddress; + string? nameString = null; Address = _getAddress(); @@ -193,10 +193,9 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP EntityId = gameObject->EntityId; var chara = (Character*)Address; - var newName = chara->GameObject.NameString; - - if (!string.IsNullOrEmpty(newName) && !string.Equals(newName, Name, StringComparison.Ordinal)) - Name = newName; + nameString = chara->GameObject.NameString; + if (!string.IsNullOrEmpty(nameString) && !string.Equals(nameString, Name, StringComparison.Ordinal)) + Name = nameString; } else { @@ -214,16 +213,18 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP if (Address != IntPtr.Zero && DrawObjectAddress != IntPtr.Zero) { var chara = (Character*)Address; - var name = chara->GameObject.NameString; - bool nameChange = !string.Equals(name, Name, StringComparison.Ordinal); - if (nameChange) - { - Name = name; - } + var drawObj = (DrawObject*)DrawObjectAddress; + var objType = drawObj->Object.GetObjectType(); + var isHuman = objType == ObjectType.CharacterBase + && ((CharacterBase*)drawObj)->GetModelType() == CharacterBase.ModelType.Human; + + nameString ??= ((Character*)Address)->GameObject.NameString; + var nameChange = !string.Equals(nameString, Name, StringComparison.Ordinal); + if (nameChange) Name = nameString; + bool equipDiff = false; - if (((DrawObject*)DrawObjectAddress)->Object.GetObjectType() == ObjectType.CharacterBase - && ((CharacterBase*)DrawObjectAddress)->GetModelType() == CharacterBase.ModelType.Human) + if (isHuman) { var classJob = chara->CharacterData.ClassJob; if (classJob != _classJob) @@ -233,7 +234,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP Mediator.Publish(new ClassJobChangedMessage(this)); } - equipDiff = CompareAndUpdateEquipByteData((byte*)&((Human*)DrawObjectAddress)->Head); + equipDiff = CompareAndUpdateEquipByteData((byte*)&((Human*)drawObj)->Head); ref var mh = ref chara->DrawData.Weapon(WeaponSlot.MainHand); ref var oh = ref chara->DrawData.Weapon(WeaponSlot.OffHand); @@ -258,12 +259,11 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP bool customizeDiff = false; - if (((DrawObject*)DrawObjectAddress)->Object.GetObjectType() == ObjectType.CharacterBase - && ((CharacterBase*)DrawObjectAddress)->GetModelType() == CharacterBase.ModelType.Human) + if (isHuman) { - var gender = ((Human*)DrawObjectAddress)->Customize.Sex; - var raceId = ((Human*)DrawObjectAddress)->Customize.Race; - var tribeId = ((Human*)DrawObjectAddress)->Customize.Tribe; + var gender = ((Human*)drawObj)->Customize.Sex; + var raceId = ((Human*)drawObj)->Customize.Race; + var tribeId = ((Human*)drawObj)->Customize.Tribe; if (_isOwnedObject && ObjectKind == ObjectKind.Player && (gender != Gender || raceId != RaceId || tribeId != TribeId)) @@ -274,7 +274,7 @@ public sealed class GameObjectHandler : DisposableMediatorSubscriberBase, IHighP TribeId = tribeId; } - customizeDiff = CompareAndUpdateCustomizeData(((Human*)DrawObjectAddress)->Customize.Data); + customizeDiff = CompareAndUpdateCustomizeData(((Human*)drawObj)->Customize.Data); if (customizeDiff) Logger.LogTrace("Checking [{this}] customize data as human from draw obj, result: {diff}", this, customizeDiff); }