add delayedframework update to dalamudutil, rework to concurrent collections

This commit is contained in:
Stanley Dimant
2022-09-07 22:03:17 +02:00
parent 35ebaed80c
commit 920090c3b1
6 changed files with 128 additions and 85 deletions

View File

@@ -47,7 +47,7 @@ public class CachedPlayer
private string _originalGlamourerData = string.Empty;
public Dalamud.Game.ClientState.Objects.Types.Character? PlayerCharacter { get; set; }
public IntPtr PlayerCharacter { get; set; } = IntPtr.Zero;
public string? PlayerName { get; private set; }
@@ -226,27 +226,27 @@ public class CachedPlayer
private unsafe void ApplyCustomizationData(ObjectKind objectKind)
{
if (PlayerCharacter is null) return;
if (PlayerCharacter == IntPtr.Zero) return;
_cachedData.GlamourerData.TryGetValue(objectKind, out var glamourerData);
if (objectKind == ObjectKind.Player)
{
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter.Address);
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter);
RequestedPenumbraRedraw = true;
Logger.Debug(
$"Request Redraw for {PlayerName}");
if (_ipcManager.CheckGlamourerApi() && !string.IsNullOrEmpty(glamourerData))
{
_ipcManager.GlamourerApplyAll(glamourerData, PlayerCharacter.Address);
_ipcManager.GlamourerApplyAll(glamourerData, PlayerCharacter);
}
else
{
_ipcManager.PenumbraRedraw(PlayerCharacter.Address);
_ipcManager.PenumbraRedraw(PlayerCharacter);
}
}
else if (objectKind == ObjectKind.MinionOrMount)
{
var minionOrMount = ((Character*)PlayerCharacter.Address)->CompanionObject;
var minionOrMount = ((Character*)PlayerCharacter)->CompanionObject;
if (minionOrMount != null)
{
Logger.Debug($"Request Redraw for Minion/Mount");
@@ -262,7 +262,7 @@ public class CachedPlayer
}
else if (objectKind == ObjectKind.Pet)
{
var pet = _dalamudUtil.GetPet(PlayerCharacter.Address);
var pet = _dalamudUtil.GetPet(PlayerCharacter);
if (pet != IntPtr.Zero)
{
Logger.Debug("Request Redraw for Pet");
@@ -278,7 +278,7 @@ public class CachedPlayer
}
else if (objectKind == ObjectKind.Companion)
{
var companion = _dalamudUtil.GetCompanion(PlayerCharacter.Address);
var companion = _dalamudUtil.GetCompanion(PlayerCharacter);
if (companion != IntPtr.Zero)
{
Logger.Debug("Request Redraw for Companion");
@@ -296,7 +296,7 @@ public class CachedPlayer
private unsafe void RevertCustomizationData(ObjectKind objectKind)
{
if (PlayerCharacter is null) return;
if (PlayerCharacter == IntPtr.Zero) return;
if (objectKind == ObjectKind.Player)
{
@@ -307,12 +307,12 @@ public class CachedPlayer
}
else
{
_ipcManager.PenumbraRedraw(PlayerCharacter.Address);
_ipcManager.PenumbraRedraw(PlayerCharacter);
}
}
else if (objectKind == ObjectKind.MinionOrMount)
{
var minionOrMount = ((Character*)PlayerCharacter.Address)->CompanionObject;
var minionOrMount = ((Character*)PlayerCharacter)->CompanionObject;
if (minionOrMount != null)
{
_ipcManager.PenumbraRedraw((IntPtr)minionOrMount);
@@ -320,7 +320,7 @@ public class CachedPlayer
}
else if (objectKind == ObjectKind.Pet)
{
var pet = _dalamudUtil.GetPet(PlayerCharacter.Address);
var pet = _dalamudUtil.GetPet(PlayerCharacter);
if (pet != IntPtr.Zero)
{
_ipcManager.PenumbraRedraw(pet);
@@ -328,7 +328,7 @@ public class CachedPlayer
}
else if (objectKind == ObjectKind.Companion)
{
var companion = _dalamudUtil.GetCompanion(PlayerCharacter.Address);
var companion = _dalamudUtil.GetCompanion(PlayerCharacter);
if (companion != IntPtr.Zero)
{
_ipcManager.PenumbraRedraw(companion);
@@ -345,10 +345,10 @@ public class CachedPlayer
try
{
Logger.Verbose("Restoring state for " + PlayerName);
_dalamudUtil.FrameworkUpdate -= DalamudUtilOnFrameworkUpdate;
_dalamudUtil.DelayedFrameworkUpdate -= DalamudUtilOnDelayedFrameworkUpdate;
_ipcManager.PenumbraRedrawEvent -= IpcManagerOnPenumbraRedrawEvent;
_ipcManager.PenumbraRemoveTemporaryCollection(PlayerName);
if (PlayerCharacter != null && PlayerCharacter.IsValid())
if (PlayerCharacter != IntPtr.Zero)
{
foreach (var item in _cachedData.FileReplacements)
{
@@ -367,18 +367,18 @@ public class CachedPlayer
{
_cachedData = new();
PlayerName = string.Empty;
PlayerCharacter = null;
PlayerCharacter = IntPtr.Zero;
IsVisible = false;
}
}
public void InitializePlayer(PlayerCharacter character, CharacterCacheDto? cache)
public void InitializePlayer(IntPtr character, string name, CharacterCacheDto? cache)
{
Logger.Debug("Initializing Player " + this + " has cache: " + (cache != null));
IsVisible = true;
PlayerName = character.Name.ToString();
PlayerName = name;
PlayerCharacter = character;
_dalamudUtil.FrameworkUpdate += DalamudUtilOnFrameworkUpdate;
_dalamudUtil.DelayedFrameworkUpdate += DalamudUtilOnDelayedFrameworkUpdate;
_ipcManager.PenumbraRedrawEvent += IpcManagerOnPenumbraRedrawEvent;
_originalGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter);
_currentCharacterEquipment = new PlayerRelatedObject(ObjectKind.Player, IntPtr.Zero, IntPtr.Zero,
@@ -390,12 +390,12 @@ public class CachedPlayer
}
}
private void DalamudUtilOnFrameworkUpdate()
private void DalamudUtilOnDelayedFrameworkUpdate()
{
if (!_dalamudUtil.IsPlayerPresent || !_ipcManager.Initialized || !_apiController.IsConnected) return;
PlayerCharacter = _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName!);
if (PlayerCharacter == null)
PlayerCharacter = _dalamudUtil.GetPlayerCharacterFromObjectTableByName(PlayerName!)?.Address ?? IntPtr.Zero;
if (PlayerCharacter == IntPtr.Zero)
{
DisposePlayer();
return;
@@ -412,7 +412,7 @@ public class CachedPlayer
public override string ToString()
{
return PlayerNameHash + ":" + PlayerName + ":HasChar " + (PlayerCharacter != null);
return PlayerNameHash + ":" + PlayerName + ":HasChar " + (PlayerCharacter != IntPtr.Zero);
}
private Task? _penumbraRedrawEventTask;
@@ -425,10 +425,10 @@ public class CachedPlayer
_penumbraRedrawEventTask = Task.Run(() =>
{
PlayerCharacter = player;
PlayerCharacter = address;
using var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(5));
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter.Address, cts.Token);
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter, cts.Token);
if (RequestedPenumbraRedraw == false)
{
@@ -448,10 +448,10 @@ public class CachedPlayer
{
Logger.Debug($"Player {PlayerName} changed, PenumbraRedraw is {RequestedPenumbraRedraw}");
_currentCharacterEquipment!.HasUnprocessedUpdate = false;
if (!RequestedPenumbraRedraw && PlayerCharacter is not null)
if (!RequestedPenumbraRedraw && PlayerCharacter != IntPtr.Zero)
{
Logger.Debug($"Saving new Glamourer data");
_lastGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter!);
_lastGlamourerData = _ipcManager.GlamourerGetCharacterCustomization(PlayerCharacter);
}
}
}