actually fix not sending data properly

This commit is contained in:
Stanley Dimant
2022-07-26 18:45:46 +02:00
parent 6b9d79b88d
commit 975a813b7f
4 changed files with 28 additions and 12 deletions

View File

@@ -31,7 +31,7 @@ public class CharacterDataFactory
_ipcManager = ipcManager; _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) if (!_ipcManager.Initialized)
{ {
@@ -48,7 +48,12 @@ public class CharacterDataFactory
try 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) catch (Exception e)
{ {
@@ -186,7 +191,7 @@ public class CharacterDataFactory
cache.AddFileReplacement(objectKind, texDx11Replacement); 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(); Stopwatch st = Stopwatch.StartNew();
var chara = _dalamudUtil.CreateGameObject(charaPointer)!; var chara = _dalamudUtil.CreateGameObject(charaPointer)!;
@@ -218,6 +223,8 @@ public class CharacterDataFactory
continue; continue;
} }
token.ThrowIfCancellationRequested();
AddReplacementsFromRenderModel(mdl, objectKind, previousData, 0); AddReplacementsFromRenderModel(mdl, objectKind, previousData, 0);
} }

View File

@@ -108,10 +108,10 @@ namespace MareSynchronos.Managers
foreach (var unprocessedObject in playerRelatedObjects.Where(c => c.HasUnprocessedUpdate).ToList()) foreach (var unprocessedObject in playerRelatedObjects.Where(c => c.HasUnprocessedUpdate).ToList())
{ {
Logger.Verbose("Building Cache for " + unprocessedObject.ObjectKind); Logger.Verbose("Building Cache for " + unprocessedObject.ObjectKind);
PermanentDataCache = _characterDataFactory.BuildCharacterData(PermanentDataCache, unprocessedObject.ObjectKind, unprocessedObject.Address); PermanentDataCache = _characterDataFactory.BuildCharacterData(PermanentDataCache, unprocessedObject.ObjectKind, unprocessedObject.Address, token);
unprocessedObject.HasUnprocessedUpdate = false;
unprocessedObject.IsProcessing = false; unprocessedObject.IsProcessing = false;
token.ThrowIfCancellationRequested(); token.ThrowIfCancellationRequested();
unprocessedObject.HasUnprocessedUpdate = false;
} }
while (!PermanentDataCache.IsReady && !token.IsCancellationRequested) 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(); OnPlayerOrAttachedObjectsChanged();
} }
@@ -155,6 +155,8 @@ namespace MareSynchronos.Managers
unprocessedObject.IsProcessing = true; unprocessedObject.IsProcessing = true;
} }
Logger.Debug("Object(s) changed: " + string.Join(", ", unprocessedObjects.Select(c => c.ObjectKind))); 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?.Cancel();
_playerChangedCts = new CancellationTokenSource(); _playerChangedCts = new CancellationTokenSource();
var token = _playerChangedCts.Token; var token = _playerChangedCts.Token;
@@ -195,13 +197,11 @@ namespace MareSynchronos.Managers
LastCreatedCharacterData = cacheDto; LastCreatedCharacterData = cacheDto;
} }
if (_apiController.IsConnected && !token.IsCancellationRequested && !unprocessedObjects.All(c => c.DoNotSendUpdate)) if (_apiController.IsConnected && !token.IsCancellationRequested && !doNotSendUpdate)
{ {
Logger.Verbose("Invoking PlayerHasChanged"); Logger.Verbose("Invoking PlayerHasChanged");
PlayerHasChanged?.Invoke(cacheDto); PlayerHasChanged?.Invoke(cacheDto);
} }
unprocessedObjects.ForEach(p => p.DoNotSendUpdate = false);
}, token); }, token);
} }
} }

View File

@@ -3,7 +3,7 @@
<PropertyGroup> <PropertyGroup>
<Authors></Authors> <Authors></Authors>
<Company></Company> <Company></Company>
<Version>0.2.5.0</Version> <Version>0.2.6.0</Version>
<Description></Description> <Description></Description>
<Copyright></Copyright> <Copyright></Copyright>
<PackageProjectUrl>https://github.com/Penumbra-Sync/client</PackageProjectUrl> <PackageProjectUrl>https://github.com/Penumbra-Sync/client</PackageProjectUrl>

View File

@@ -77,6 +77,7 @@ namespace MareSynchronos.Models
private unsafe bool CompareAndUpdateByteData(byte* equipSlotData, byte* customizeData) private unsafe bool CompareAndUpdateByteData(byte* equipSlotData, byte* customizeData)
{ {
bool hasChanges = false; bool hasChanges = false;
DoNotSendUpdate = false;
for (int i = 0; i < EquipSlotData.Length; i++) for (int i = 0; i < EquipSlotData.Length; i++)
{ {
var data = Marshal.ReadByte((IntPtr)equipSlotData, i); var data = Marshal.ReadByte((IntPtr)equipSlotData, i);
@@ -103,14 +104,22 @@ namespace MareSynchronos.Models
var newWeaponOrVisorState = Marshal.ReadByte((IntPtr)customizeData + 31, 0); var newWeaponOrVisorState = Marshal.ReadByte((IntPtr)customizeData + 31, 0);
if (newHatState != HatState) 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; HatState = newHatState;
hasChanges = true; hasChanges = true;
} }
if (newWeaponOrVisorState != VisorWeaponState) 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; VisorWeaponState = newWeaponOrVisorState;
hasChanges = true; hasChanges = true;
} }