From f25f2cb861e752b98ab12c4631b82dcb847b579c Mon Sep 17 00:00:00 2001 From: rootdarkarchon Date: Sat, 30 Mar 2024 00:07:14 +0100 Subject: [PATCH] fix my own mistakes --- .../PlayerData/Factories/PlayerDataFactory.cs | 15 +++++++++++---- MareSynchronos/Services/XivDataAnalyzer.cs | 19 +++++++++---------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs index 3042f9a..8206d0b 100644 --- a/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs +++ b/MareSynchronos/PlayerData/Factories/PlayerDataFactory.cs @@ -139,6 +139,7 @@ public class PlayerDataFactory await Task.Delay(50, token).ConfigureAwait(false); totalWaitTime -= 50; } + var boneIndices = await _dalamudUtil.RunOnFrameworkThread(() => _modelAnalyzer.GetSkeletonBoneIndices(charaPointer)).ConfigureAwait(false); DateTime start = DateTime.UtcNow; @@ -236,7 +237,14 @@ public class PlayerDataFactory if (objectKind == ObjectKind.Player) { - await VerifyPlayerAnimationBones(previousData, objectKind, charaPointer).ConfigureAwait(false); + try + { + await VerifyPlayerAnimationBones(boneIndices, previousData, objectKind).ConfigureAwait(false); + } + catch (Exception e) + { + _logger.LogWarning(e, "Failed to verify player animations, continuing"); + } } _logger.LogInformation("Building character data for {obj} took {time}ms", objectKind, TimeSpan.FromTicks(DateTime.UtcNow.Ticks - start.Ticks).TotalMilliseconds); @@ -244,14 +252,13 @@ public class PlayerDataFactory return previousData; } - private async Task VerifyPlayerAnimationBones(CharacterData previousData, ObjectKind objectKind, nint charaPointer) + private async Task VerifyPlayerAnimationBones(Dictionary>? boneIndices, CharacterData previousData, ObjectKind objectKind) { - var boneIndices = _modelAnalyzer.GetSkeletonBoneIndices(charaPointer); if (boneIndices != null) { foreach (var kvp in boneIndices) { - _logger.LogDebug("Found {skellyname} ({idx} bone indices) on player: {bones}", kvp.Key, kvp.Value.Max(), string.Join(',', kvp.Value)); + _logger.LogDebug("Found {skellyname} ({idx} bone indices) on player: {bones}", kvp.Key, kvp.Value.Any() ? kvp.Value.Max() : 0, string.Join(',', kvp.Value)); } if (boneIndices.All(u => u.Value.Count == 0)) return; diff --git a/MareSynchronos/Services/XivDataAnalyzer.cs b/MareSynchronos/Services/XivDataAnalyzer.cs index 768100c..85abbcb 100644 --- a/MareSynchronos/Services/XivDataAnalyzer.cs +++ b/MareSynchronos/Services/XivDataAnalyzer.cs @@ -35,15 +35,14 @@ public sealed class XivDataAnalyzer var resHandles = chara->Skeleton->SkeletonResourceHandles; int i = 0; Dictionary> outputIndices = []; - while (*(resHandles + i) != null) + try { - string skeletonName = "unknown"; - - try + while (*(resHandles + i) != null) { var handle = *(resHandles + i); var curBones = handle->BoneCount; - skeletonName = handle->ResourceHandle.FileName.ToString(); + var skeletonName = handle->ResourceHandle.FileName.ToString(); + if (string.IsNullOrEmpty(skeletonName)) continue; outputIndices[skeletonName] = new(); for (ushort boneIdx = 0; boneIdx < curBones; boneIdx++) { @@ -53,12 +52,12 @@ public sealed class XivDataAnalyzer outputIndices[skeletonName].Add(boneIdx); } + i++; } - catch (Exception ex) - { - _logger.LogWarning(ex, "Could procss skeleton {skl}", skeletonName); - } - i++; + } + catch (Exception ex) + { + _logger.LogWarning(ex, "Could not process skeleton data"); } return outputIndices;