From 975a813b7f05483c02985e86d4665e7063465cf7 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Tue, 26 Jul 2022 18:45:46 +0200 Subject: [PATCH] actually fix not sending data properly --- MareSynchronos/Factories/CharacterDataFactory.cs | 13 ++++++++++--- MareSynchronos/Managers/PlayerManager.cs | 12 ++++++------ MareSynchronos/MareSynchronos.csproj | 2 +- MareSynchronos/Models/PlayerRelatedObject.cs | 13 +++++++++++-- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index 9a312d8..5dfe48f 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -31,7 +31,7 @@ public class CharacterDataFactory _ipcManager = ipcManager; } - public CharacterData BuildCharacterData(CharacterData previousData, ObjectKind objectKind, IntPtr playerPointer) + public CharacterData BuildCharacterData(CharacterData previousData, ObjectKind objectKind, IntPtr playerPointer, CancellationToken token) { if (!_ipcManager.Initialized) { @@ -48,7 +48,12 @@ public class CharacterDataFactory try { - return CreateCharacterData(previousData, objectKind, playerPointer); + return CreateCharacterData(previousData, objectKind, playerPointer, token); + } + catch (OperationCanceledException) + { + Logger.Debug("Cancelled creating Character data"); + return previousData; } catch (Exception e) { @@ -186,7 +191,7 @@ public class CharacterDataFactory cache.AddFileReplacement(objectKind, texDx11Replacement); } - private unsafe CharacterData CreateCharacterData(CharacterData previousData, ObjectKind objectKind, IntPtr charaPointer) + private unsafe CharacterData CreateCharacterData(CharacterData previousData, ObjectKind objectKind, IntPtr charaPointer, CancellationToken token) { Stopwatch st = Stopwatch.StartNew(); var chara = _dalamudUtil.CreateGameObject(charaPointer)!; @@ -218,6 +223,8 @@ public class CharacterDataFactory continue; } + token.ThrowIfCancellationRequested(); + AddReplacementsFromRenderModel(mdl, objectKind, previousData, 0); } diff --git a/MareSynchronos/Managers/PlayerManager.cs b/MareSynchronos/Managers/PlayerManager.cs index 8f7fcb0..07e2e50 100644 --- a/MareSynchronos/Managers/PlayerManager.cs +++ b/MareSynchronos/Managers/PlayerManager.cs @@ -108,10 +108,10 @@ namespace MareSynchronos.Managers foreach (var unprocessedObject in playerRelatedObjects.Where(c => c.HasUnprocessedUpdate).ToList()) { Logger.Verbose("Building Cache for " + unprocessedObject.ObjectKind); - PermanentDataCache = _characterDataFactory.BuildCharacterData(PermanentDataCache, unprocessedObject.ObjectKind, unprocessedObject.Address); - unprocessedObject.HasUnprocessedUpdate = false; + PermanentDataCache = _characterDataFactory.BuildCharacterData(PermanentDataCache, unprocessedObject.ObjectKind, unprocessedObject.Address, token); unprocessedObject.IsProcessing = false; token.ThrowIfCancellationRequested(); + unprocessedObject.HasUnprocessedUpdate = false; } while (!PermanentDataCache.IsReady && !token.IsCancellationRequested) @@ -139,7 +139,7 @@ namespace MareSynchronos.Managers } } - if (playerRelatedObjects.Any(c => c.HasUnprocessedUpdate && !c.IsProcessing)) + if (playerRelatedObjects.Any(c => c.HasUnprocessedUpdate && (!c.IsProcessing || (c.IsProcessing && c.DoNotSendUpdate)))) { OnPlayerOrAttachedObjectsChanged(); } @@ -155,6 +155,8 @@ namespace MareSynchronos.Managers unprocessedObject.IsProcessing = true; } Logger.Debug("Object(s) changed: " + string.Join(", ", unprocessedObjects.Select(c => c.ObjectKind))); + bool doNotSendUpdate = unprocessedObjects.All(c => c.DoNotSendUpdate); + unprocessedObjects.ForEach(p => p.DoNotSendUpdate = false); _playerChangedCts?.Cancel(); _playerChangedCts = new CancellationTokenSource(); var token = _playerChangedCts.Token; @@ -195,13 +197,11 @@ namespace MareSynchronos.Managers LastCreatedCharacterData = cacheDto; } - if (_apiController.IsConnected && !token.IsCancellationRequested && !unprocessedObjects.All(c => c.DoNotSendUpdate)) + if (_apiController.IsConnected && !token.IsCancellationRequested && !doNotSendUpdate) { Logger.Verbose("Invoking PlayerHasChanged"); PlayerHasChanged?.Invoke(cacheDto); } - - unprocessedObjects.ForEach(p => p.DoNotSendUpdate = false); }, token); } } diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index c48c94d..a7ba604 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.2.5.0 + 0.2.6.0 https://github.com/Penumbra-Sync/client diff --git a/MareSynchronos/Models/PlayerRelatedObject.cs b/MareSynchronos/Models/PlayerRelatedObject.cs index 8d6ade0..4c2878d 100644 --- a/MareSynchronos/Models/PlayerRelatedObject.cs +++ b/MareSynchronos/Models/PlayerRelatedObject.cs @@ -77,6 +77,7 @@ namespace MareSynchronos.Models private unsafe bool CompareAndUpdateByteData(byte* equipSlotData, byte* customizeData) { bool hasChanges = false; + DoNotSendUpdate = false; for (int i = 0; i < EquipSlotData.Length; i++) { var data = Marshal.ReadByte((IntPtr)equipSlotData, i); @@ -103,14 +104,22 @@ namespace MareSynchronos.Models var newWeaponOrVisorState = Marshal.ReadByte((IntPtr)customizeData + 31, 0); if (newHatState != HatState) { - if (HatState != null && !hasChanges) DoNotSendUpdate = true; + if (HatState != null && !hasChanges) + { + Logger.Verbose("Not Sending Update, only Hat changed"); + DoNotSendUpdate = true; + } HatState = newHatState; hasChanges = true; } if (newWeaponOrVisorState != VisorWeaponState) { - if (VisorWeaponState != null && !hasChanges) DoNotSendUpdate = true; + if (VisorWeaponState != null && !hasChanges) + { + Logger.Verbose("Not Sending Update, only Visor/Weapon changed"); + DoNotSendUpdate = true; + } VisorWeaponState = newWeaponOrVisorState; hasChanges = true; }