diff --git a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs index 41faedb..9d4eb0e 100644 --- a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs @@ -142,7 +142,7 @@ public class PlayerDataFactory Dictionary>? boneIndices = objectKind != ObjectKind.Player ? null - : await _dalamudUtil.RunOnFrameworkThread(() => _modelAnalyzer.GetSkeletonBoneIndices(playerRelatedObject.Address)).ConfigureAwait(false); + : await _dalamudUtil.RunOnFrameworkThread(() => _modelAnalyzer.GetSkeletonBoneIndices(playerRelatedObject)).ConfigureAwait(false); DateTime start = DateTime.UtcNow; diff --git a/MareSynchronos/Services/XivDataAnalyzer.cs b/MareSynchronos/Services/XivDataAnalyzer.cs index 8263cbd..5937bf1 100644 --- a/MareSynchronos/Services/XivDataAnalyzer.cs +++ b/MareSynchronos/Services/XivDataAnalyzer.cs @@ -6,6 +6,7 @@ using Lumina; using Lumina.Data.Files; using MareSynchronos.FileCache; using MareSynchronos.MareConfiguration; +using MareSynchronos.PlayerData.Handlers; using Microsoft.Extensions.Logging; using System.Runtime.InteropServices; @@ -27,19 +28,20 @@ public sealed class XivDataAnalyzer _luminaGameData = new GameData(gameData.GameData.DataPath.FullName); } - public unsafe Dictionary>? GetSkeletonBoneIndices(nint charaPtr) + public unsafe Dictionary>? GetSkeletonBoneIndices(GameObjectHandler handler) { - if (charaPtr == nint.Zero) return null; - var chara = (CharacterBase*)(((Character*)charaPtr)->GameObject.DrawObject); + if (handler.Address == nint.Zero) return null; + var chara = (CharacterBase*)(((Character*)handler.Address)->GameObject.DrawObject); if (chara->GetModelType() != CharacterBase.ModelType.Human) return null; var resHandles = chara->Skeleton->SkeletonResourceHandles; - int i = -1; Dictionary> outputIndices = []; try { - while (*(resHandles + ++i) != null) + for (int i = 0; i < chara->Skeleton->PartialSkeletonCount; i++) { var handle = *(resHandles + i); + _logger.LogTrace("Iterating over SkeletonResourceHandle #{i}:{x}", i, ((nint)handle).ToString("X")); + if ((nint)handle == nint.Zero) continue; var curBones = handle->BoneCount; // this is unrealistic, the filename shouldn't ever be that long if (handle->ResourceHandle.FileName.Length > 1024) continue;