diff --git a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs index 95254aa..01c33f0 100644 --- a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs @@ -55,7 +55,7 @@ public class PlayerDataFactory pointerIsZero = playerRelatedObject.Address == IntPtr.Zero; try { - pointerIsZero = CheckForNullDrawObject(playerRelatedObject.Address); + pointerIsZero = await CheckForNullDrawObject(playerRelatedObject.Address); } catch { @@ -101,7 +101,12 @@ public class PlayerDataFactory previousData.GlamourerString = previousGlamourerData; } - private static unsafe bool CheckForNullDrawObject(IntPtr playerPointer) + private async Task CheckForNullDrawObject(IntPtr playerPointer) + { + return await _dalamudUtil.RunOnFrameworkThread(() => CheckForNullDrawObjectUnsafe(playerPointer)); + } + + private unsafe bool CheckForNullDrawObjectUnsafe(IntPtr playerPointer) { return ((Character*)playerPointer)->GameObject.DrawObject == null; } @@ -321,7 +326,7 @@ public class PlayerDataFactory Stopwatch st = Stopwatch.StartNew(); // gather static replacements from render model - var (forwardResolve, reverseResolve) = BuildDataFromModel(objectKind, charaPointer, token); + var (forwardResolve, reverseResolve) = await _dalamudUtil.RunOnFrameworkThread(() => BuildDataFromModel(objectKind, charaPointer, token)); Dictionary> resolvedPaths = await GetFileReplacementsFromPaths(forwardResolve, reverseResolve).ConfigureAwait(false); previousData.FileReplacements[objectKind] = new HashSet(resolvedPaths.Select(c => new FileReplacement(c.Value, c.Key, _fileCacheManager)), FileReplacementComparer.Instance) diff --git a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs index 380bfc4..17e0eb0 100644 --- a/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs +++ b/MareSynchronos/PlayerData/Pairs/CachedPlayer.cs @@ -224,9 +224,9 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase var handler = changes.Key switch { ObjectKind.Player => _charaHandler!, - ObjectKind.Companion => _gameObjectHandlerFactory(changes.Key, () => _dalamudUtil.GetCompanion(ptr), false), + ObjectKind.Companion => _gameObjectHandlerFactory(changes.Key, () => _dalamudUtil.GetCompanion(ptr).GetAwaiter().GetResult(), false), ObjectKind.MinionOrMount => _gameObjectHandlerFactory(changes.Key, () => _dalamudUtil.GetMinionOrMount(ptr), false), - ObjectKind.Pet => _gameObjectHandlerFactory(changes.Key, () => _dalamudUtil.GetPet(ptr), false), + ObjectKind.Pet => _gameObjectHandlerFactory(changes.Key, () => _dalamudUtil.GetPet(ptr).GetAwaiter().GetResult(), false), _ => throw new NotSupportedException("ObjectKind not supported: " + changes.Key) }; @@ -583,7 +583,7 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase } else if (objectKind == ObjectKind.Pet) { - var pet = _dalamudUtil.GetPet(address); + var pet = await _dalamudUtil.GetPet(address); if (pet != IntPtr.Zero) { using GameObjectHandler tempHandler = _gameObjectHandlerFactory(ObjectKind.Pet, () => pet, false); @@ -592,7 +592,7 @@ public sealed class CachedPlayer : DisposableMediatorSubscriberBase } else if (objectKind == ObjectKind.Companion) { - var companion = _dalamudUtil.GetCompanion(address); + var companion = await _dalamudUtil.GetCompanion(address); if (companion != IntPtr.Zero) { using GameObjectHandler tempHandler = _gameObjectHandlerFactory(ObjectKind.Pet, () => companion, false); diff --git a/MareSynchronos/PlayerData/Services/CacheCreationService.cs b/MareSynchronos/PlayerData/Services/CacheCreationService.cs index 684bbff..1633782 100644 --- a/MareSynchronos/PlayerData/Services/CacheCreationService.cs +++ b/MareSynchronos/PlayerData/Services/CacheCreationService.cs @@ -81,9 +81,9 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase _playerRelatedObjects[ObjectKind.MinionOrMount] = gameObjectHandlerFactory(ObjectKind.MinionOrMount, () => dalamudUtil.GetMinionOrMount(), true); _playerRelatedObjects[ObjectKind.Pet] = - gameObjectHandlerFactory(ObjectKind.Pet, () => dalamudUtil.GetPet(), true); + gameObjectHandlerFactory(ObjectKind.Pet, () => dalamudUtil.GetPet().GetAwaiter().GetResult(), true); _playerRelatedObjects[ObjectKind.Companion] = - gameObjectHandlerFactory(ObjectKind.Companion, () => dalamudUtil.GetCompanion(), true); + gameObjectHandlerFactory(ObjectKind.Companion, () => dalamudUtil.GetCompanion().GetAwaiter().GetResult(), true); } protected override void Dispose(bool disposing) diff --git a/MareSynchronos/Services/DalamudUtilService.cs b/MareSynchronos/Services/DalamudUtilService.cs index 19f0bbc..141e68c 100644 --- a/MareSynchronos/Services/DalamudUtilService.cs +++ b/MareSynchronos/Services/DalamudUtilService.cs @@ -88,7 +88,12 @@ public class DalamudUtilService : IHostedService return (Dalamud.Game.ClientState.Objects.Types.Character)objTableObj; } - public unsafe IntPtr GetCompanion(IntPtr? playerPointer = null) + public async Task GetCompanion(IntPtr? playerPointer = null) + { + return await RunOnFrameworkThread(() => GetCompanionInternal(playerPointer)); + } + + private unsafe IntPtr GetCompanionInternal(IntPtr? playerPointer = null) { var mgr = CharacterManager.Instance(); playerPointer ??= PlayerPointer; @@ -108,7 +113,12 @@ public class DalamudUtilService : IHostedService return _objectTable.GetObjectAddress(((GameObject*)playerPointer)->ObjectIndex + 1); } - public unsafe IntPtr GetPet(IntPtr? playerPointer = null) + public async Task GetPet(IntPtr? playerPointer = null) + { + return await RunOnFrameworkThread(() => GetPetInternal(playerPointer)); + } + + private unsafe IntPtr GetPetInternal(IntPtr? playerPointer = null) { if (ClassJobIdsIgnoredForPets.Contains(_classJobId ?? 0)) return IntPtr.Zero; var mgr = CharacterManager.Instance();