diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index 0c1ce2a..185b4bb 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -121,7 +121,7 @@ public class CharacterDataFactory Logger.Warn("Could not get model data for " + objectKind); return; } - //Logger.Verbose("Checking File Replacement for Model " + mdlPath); + Logger.Verbose("Checking File Replacement for Model " + mdlPath); FileReplacement mdlFileReplacement = CreateFileReplacement(mdlPath); DebugPrint(mdlFileReplacement, objectKind, "Model", inheritanceLevel); @@ -151,7 +151,7 @@ public class CharacterDataFactory return; } - Logger.Verbose("Check File Replacement for Material " + fileName); + Logger.Verbose("Checking File Replacement for Material " + fileName); var mtrlPath = fileName.Split("|")[2]; if (cache.FileReplacements.ContainsKey(objectKind)) @@ -182,7 +182,7 @@ public class CharacterDataFactory if (string.IsNullOrEmpty(texPath)) continue; - Logger.Verbose("Check File Replacement for Texture " + texPath); + Logger.Verbose("Checking File Replacement for Texture " + texPath); AddReplacementsFromTexture(texPath, objectKind, cache, inheritanceLevel + 1); } @@ -260,7 +260,7 @@ public class CharacterDataFactory Thread.Sleep(50); } - _dalamudUtil.WaitWhileCharacterIsDrawing(objectKind.ToString(), charaPointer); + _dalamudUtil.WaitWhileCharacterIsDrawing(objectKind.ToString(), charaPointer, 15000); var human = (Human*)((Character*)charaPointer)->GameObject.GetDrawObject(); for (var mdlIdx = 0; mdlIdx < human->CharacterBase.SlotCount; ++mdlIdx) diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index 527ec39..b50add8 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -244,7 +244,7 @@ public class CachedPlayer if (objectKind == ObjectKind.Player) { - _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, ct); + _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, 10000, ct); ct.ThrowIfCancellationRequested(); _ipcManager.HeelsSetOffsetForPlayer(_cachedData.HeelsOffset, PlayerCharacter); RequestedPenumbraRedraw = true; @@ -265,7 +265,7 @@ public class CachedPlayer if (minionOrMount != null) { Logger.Debug($"Request Redraw for Minion/Mount"); - _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName! + " minion or mount", (IntPtr)minionOrMount, ct); + _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName! + " minion or mount", (IntPtr)minionOrMount, 10000, ct); ct.ThrowIfCancellationRequested(); if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData)) { @@ -311,7 +311,7 @@ public class CachedPlayer if (companion != IntPtr.Zero) { Logger.Debug("Request Redraw for Companion"); - _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName! + " companion", companion, ct); + _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName! + " companion", companion, 10000,ct); ct.ThrowIfCancellationRequested(); if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData)) { @@ -460,7 +460,7 @@ public class CachedPlayer PlayerCharacter = address; var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(5)); - _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, cts.Token); + _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, 10000, cts.Token); cts.Dispose(); cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(5)); diff --git a/MareSynchronos/Managers/PlayerManager.cs b/MareSynchronos/Managers/PlayerManager.cs index dff239f..84125a3 100644 --- a/MareSynchronos/Managers/PlayerManager.cs +++ b/MareSynchronos/Managers/PlayerManager.cs @@ -230,7 +230,7 @@ namespace MareSynchronos.Managers { foreach (var item in unprocessedObjects) { - _dalamudUtil.WaitWhileCharacterIsDrawing("self " + item.ObjectKind.ToString(), item.Address, token); + _dalamudUtil.WaitWhileCharacterIsDrawing("self " + item.ObjectKind.ToString(), item.Address, 10000, token); } CharacterCacheDto? cacheDto = (await CreateFullCharacterCacheDto(token)); diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index e977d85..abebf98 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.4.4 + 0.4.5 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/Utils/DalamudUtil.cs b/MareSynchronos/Utils/DalamudUtil.cs index c37c6ac..3515728 100644 --- a/MareSynchronos/Utils/DalamudUtil.cs +++ b/MareSynchronos/Utils/DalamudUtil.cs @@ -195,16 +195,15 @@ namespace MareSynchronos.Utils return await _framework.RunOnFrameworkThread(func); } - public unsafe void WaitWhileCharacterIsDrawing(string name, IntPtr characterAddress, CancellationToken? ct = null) + public unsafe void WaitWhileCharacterIsDrawing(string name, IntPtr characterAddress, int timeOut = 5000, CancellationToken? ct = null) { if (!_clientState.IsLoggedIn || characterAddress == IntPtr.Zero) return; var obj = (GameObject*)characterAddress; - const int maxWaitTime = 5000; const int tick = 250; int curWaitTime = 0; // ReSharper disable once LoopVariableIsNeverChangedInsideLoop - while ((obj->RenderFlags & 0b100000000000) == 0b100000000000 && (!ct?.IsCancellationRequested ?? true) && curWaitTime < maxWaitTime) // 0b100000000000 is "still rendering" or something + while ((obj->RenderFlags & 0b100000000000) == 0b100000000000 && (!ct?.IsCancellationRequested ?? true) && curWaitTime < timeOut) // 0b100000000000 is "still rendering" or something { Logger.Verbose($"Waiting for {name} to finish drawing"); curWaitTime += tick; @@ -216,8 +215,6 @@ namespace MareSynchronos.Utils Thread.Sleep(tick); } - public void WaitWhileSelfIsDrawing(CancellationToken? token) => WaitWhileCharacterIsDrawing("self", _clientState.LocalPlayer?.Address ?? IntPtr.Zero, token); - public void Dispose() { _clientState.Login -= ClientStateOnLogin;