minor fixes

This commit is contained in:
Stanley Dimant
2022-09-09 14:53:59 +02:00
parent b9d119acf1
commit ce1a1187f0
5 changed files with 23 additions and 15 deletions

View File

@@ -239,7 +239,7 @@ public class CharacterDataFactory
Thread.Sleep(50); Thread.Sleep(50);
} }
_dalamudUtil.WaitWhileCharacterIsDrawing(charaPointer); _dalamudUtil.WaitWhileCharacterIsDrawing(objectKind.ToString(), charaPointer);
Stopwatch st = Stopwatch.StartNew(); Stopwatch st = Stopwatch.StartNew();

View File

@@ -165,7 +165,7 @@ public class CachedPlayer
foreach (var kind in objectKind) foreach (var kind in objectKind)
{ {
ApplyCustomizationData(kind); ApplyCustomizationData(kind, downloadToken);
} }
}, downloadToken).ContinueWith(task => }, downloadToken).ContinueWith(task =>
{ {
@@ -225,14 +225,15 @@ public class CachedPlayer
_ipcManager.PenumbraSetTemporaryMods(PlayerName!, moddedPaths, _cachedData.ManipulationData); _ipcManager.PenumbraSetTemporaryMods(PlayerName!, moddedPaths, _cachedData.ManipulationData);
} }
private unsafe void ApplyCustomizationData(ObjectKind objectKind) private unsafe void ApplyCustomizationData(ObjectKind objectKind, CancellationToken ct)
{ {
if (PlayerCharacter == IntPtr.Zero) return; if (PlayerCharacter == IntPtr.Zero) return;
_cachedData.GlamourerData.TryGetValue(objectKind, out var glamourerData); _cachedData.GlamourerData.TryGetValue(objectKind, out var glamourerData);
if (objectKind == ObjectKind.Player) if (objectKind == ObjectKind.Player)
{ {
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter); _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, ct);
ct.ThrowIfCancellationRequested();
RequestedPenumbraRedraw = true; RequestedPenumbraRedraw = true;
Logger.Debug( Logger.Debug(
$"Request Redraw for {PlayerName}"); $"Request Redraw for {PlayerName}");
@@ -251,7 +252,8 @@ public class CachedPlayer
if (minionOrMount != null) if (minionOrMount != null)
{ {
Logger.Debug($"Request Redraw for Minion/Mount"); Logger.Debug($"Request Redraw for Minion/Mount");
_dalamudUtil.WaitWhileCharacterIsDrawing((IntPtr)minionOrMount); _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName! + " minion or mount", (IntPtr)minionOrMount, ct);
ct.ThrowIfCancellationRequested();
if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData)) if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData))
{ {
_ipcManager.GlamourerApplyAll(glamourerData, obj: (IntPtr)minionOrMount); _ipcManager.GlamourerApplyAll(glamourerData, obj: (IntPtr)minionOrMount);
@@ -296,7 +298,8 @@ public class CachedPlayer
if (companion != IntPtr.Zero) if (companion != IntPtr.Zero)
{ {
Logger.Debug("Request Redraw for Companion"); Logger.Debug("Request Redraw for Companion");
_dalamudUtil.WaitWhileCharacterIsDrawing(companion); _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName! + " companion", companion, ct);
ct.ThrowIfCancellationRequested();
if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData)) if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData))
{ {
_ipcManager.GlamourerApplyAll(glamourerData, companion); _ipcManager.GlamourerApplyAll(glamourerData, companion);
@@ -441,14 +444,16 @@ public class CachedPlayer
_penumbraRedrawEventTask = Task.Run(() => _penumbraRedrawEventTask = Task.Run(() =>
{ {
PlayerCharacter = address; PlayerCharacter = address;
using var cts = new CancellationTokenSource(); var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(5));
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, cts.Token);
cts.Dispose();
cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(5)); cts.CancelAfter(TimeSpan.FromSeconds(5));
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter, cts.Token);
if (RequestedPenumbraRedraw == false) if (RequestedPenumbraRedraw == false)
{ {
Logger.Debug("Unauthorized character change detected"); Logger.Debug("Unauthorized character change detected");
ApplyCustomizationData(ObjectKind.Player); ApplyCustomizationData(ObjectKind.Player, cts.Token);
} }
else else
{ {
@@ -456,6 +461,7 @@ public class CachedPlayer
Logger.Debug( Logger.Debug(
$"Penumbra Redraw done for {PlayerName}"); $"Penumbra Redraw done for {PlayerName}");
} }
cts.Dispose();
}); });
} }

View File

@@ -142,10 +142,12 @@ namespace MareSynchronos.Managers
int totalSleepTime = 0; int totalSleepTime = 0;
while (actionQueue.Count > 0 && totalSleepTime < 2000) while (actionQueue.Count > 0 && totalSleepTime < 2000)
{ {
Logger.Verbose("Waiting for actionqueue to clear...");
System.Threading.Thread.Sleep(16); System.Threading.Thread.Sleep(16);
totalSleepTime += 16; totalSleepTime += 16;
} }
Logger.Verbose("Action queue clear or not, disposing");
_dalamudUtil.FrameworkUpdate -= HandleActionQueue; _dalamudUtil.FrameworkUpdate -= HandleActionQueue;
actionQueue.Clear(); actionQueue.Clear();

View File

@@ -200,7 +200,7 @@ namespace MareSynchronos.Managers
{ {
foreach(var item in unprocessedObjects) foreach(var item in unprocessedObjects)
{ {
_dalamudUtil.WaitWhileCharacterIsDrawing(item.Address, token); _dalamudUtil.WaitWhileCharacterIsDrawing("self " + item.ObjectKind.ToString(), item.Address, token);
} }
CharacterCacheDto? cacheDto = (await CreateFullCharacterCacheDto(token)); CharacterCacheDto? cacheDto = (await CreateFullCharacterCacheDto(token));

View File

@@ -189,18 +189,18 @@ namespace MareSynchronos.Utils
return null; return null;
} }
public unsafe void WaitWhileCharacterIsDrawing(IntPtr characterAddress, CancellationToken? ct = null) public unsafe void WaitWhileCharacterIsDrawing(string name, IntPtr characterAddress, CancellationToken? ct = null)
{ {
if (!_clientState.IsLoggedIn || characterAddress == IntPtr.Zero) return; if (!_clientState.IsLoggedIn || characterAddress == IntPtr.Zero) return;
var obj = (GameObject*)characterAddress; var obj = (GameObject*)characterAddress;
const int maxWaitTime = 10000; const int maxWaitTime = 5000;
const int tick = 250; const int tick = 250;
int curWaitTime = 0; int curWaitTime = 0;
// ReSharper disable once LoopVariableIsNeverChangedInsideLoop // 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 < maxWaitTime) // 0b100000000000 is "still rendering" or something
{ {
Logger.Verbose("Waiting for character to finish drawing"); Logger.Verbose($"Waiting for {name} to finish drawing");
curWaitTime += tick; curWaitTime += tick;
Thread.Sleep(tick); Thread.Sleep(tick);
} }
@@ -210,7 +210,7 @@ namespace MareSynchronos.Utils
Thread.Sleep(tick); Thread.Sleep(tick);
} }
public void WaitWhileSelfIsDrawing(CancellationToken? token) => WaitWhileCharacterIsDrawing(_clientState.LocalPlayer?.Address ?? IntPtr.Zero, token); public void WaitWhileSelfIsDrawing(CancellationToken? token) => WaitWhileCharacterIsDrawing("self", _clientState.LocalPlayer?.Address ?? IntPtr.Zero, token);
public void Dispose() public void Dispose()
{ {