Heels and C+ updates (#54)

* add heels and customize plus multi data

* adjust customize plus api calls

* adjustments to ipc for customize

---------

Co-authored-by: rootdarkarchon <root.darkarchon@outlook.com>
This commit is contained in:
rootdarkarchon
2023-07-17 08:57:56 +02:00
committed by GitHub
parent 5543c7c7ad
commit 08a35c9152
11 changed files with 116 additions and 125 deletions

View File

@@ -2,7 +2,6 @@
using Dalamud.Plugin.Ipc;
using Dalamud.Game.ClientState.Objects.SubKinds;
using Dalamud.Game.ClientState.Objects.Types;
using Action = System.Action;
using System.Collections.Concurrent;
using System.Text;
using Penumbra.Api.Enums;
@@ -12,15 +11,16 @@ using Microsoft.Extensions.Logging;
using MareSynchronos.PlayerData.Handlers;
using MareSynchronos.Services.Mediator;
using MareSynchronos.Services;
using Dalamud.Utility;
namespace MareSynchronos.Interop;
public sealed class IpcManager : DisposableMediatorSubscriberBase
{
private readonly ICallGateSubscriber<string> _customizePlusApiVersion;
private readonly ICallGateSubscriber<string, string> _customizePlusGetBodyScale;
private readonly ICallGateSubscriber<string?, object> _customizePlusOnScaleUpdate;
private readonly ICallGateSubscriber<Character?, object> _customizePlusRevert;
private readonly ICallGateSubscriber<(int, int)> _customizePlusApiVersion;
private readonly ICallGateSubscriber<Character?, string?> _customizePlusGetBodyScale;
private readonly ICallGateSubscriber<string?, string?, object> _customizePlusOnScaleUpdate;
private readonly ICallGateSubscriber<Character?, object> _customizePlusRevertCharacter;
private readonly ICallGateSubscriber<string, Character?, object> _customizePlusSetBodyScaleToCharacter;
private readonly DalamudUtilService _dalamudUtil;
private readonly ICallGateSubscriber<int> _glamourerApiVersion;
@@ -28,11 +28,10 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
private readonly ICallGateSubscriber<string, GameObject?, object>? _glamourerApplyOnlyCustomization;
private readonly ICallGateSubscriber<string, GameObject?, object>? _glamourerApplyOnlyEquipment;
private readonly ICallGateSubscriber<GameObject?, string>? _glamourerGetAllCustomization;
private readonly ConcurrentQueue<Action> _gposeActionQueue = new();
private readonly ICallGateSubscriber<string> _heelsGetApiVersion;
private readonly ICallGateSubscriber<float> _heelsGetOffset;
private readonly ICallGateSubscriber<float, object?> _heelsOffsetUpdate;
private readonly ICallGateSubscriber<GameObject, float, object?> _heelsRegisterPlayer;
private readonly ICallGateSubscriber<(int, int)> _heelsGetApiVersion;
private readonly ICallGateSubscriber<string> _heelsGetOffset;
private readonly ICallGateSubscriber<string, object?> _heelsOffsetUpdate;
private readonly ICallGateSubscriber<GameObject, string, object?> _heelsRegisterPlayer;
private readonly ICallGateSubscriber<GameObject, object?> _heelsUnregisterPlayer;
private readonly ICallGateSubscriber<(uint major, uint minor)> _honorificApiVersion;
private readonly ICallGateSubscriber<Character, object> _honorificClearCharacterTitle;
@@ -41,7 +40,6 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
private readonly ICallGateSubscriber<string, object> _honorificLocalCharacterTitleChanged;
private readonly ICallGateSubscriber<object> _honorificReady;
private readonly ICallGateSubscriber<Character, string, object> _honorificSetCharacterTitle;
private readonly ConcurrentQueue<Action> _normalQueue = new();
private readonly ICallGateSubscriber<string> _palettePlusApiVersion;
private readonly ICallGateSubscriber<Character, string> _palettePlusBuildCharaPalette;
private readonly ICallGateSubscriber<Character, string, object> _palettePlusPaletteChanged;
@@ -71,7 +69,6 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
private bool _glamourerAvailable = false;
private bool _heelsAvailable = false;
private bool _honorificAvailable = false;
private bool _inGposeQueueMode = false;
private bool _palettePlusAvailable = false;
private bool _penumbraAvailable = false;
private bool _shownGlamourerUnavailable = false;
@@ -110,19 +107,19 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
_glamourerApplyOnlyCustomization = pi.GetIpcSubscriber<string, GameObject?, object>("Glamourer.ApplyOnlyCustomizationToCharacter");
_glamourerApplyOnlyEquipment = pi.GetIpcSubscriber<string, GameObject?, object>("Glamourer.ApplyOnlyEquipmentToCharacter");
_heelsGetApiVersion = pi.GetIpcSubscriber<string>("HeelsPlugin.ApiVersion");
_heelsGetOffset = pi.GetIpcSubscriber<float>("HeelsPlugin.GetOffset");
_heelsRegisterPlayer = pi.GetIpcSubscriber<GameObject, float, object?>("HeelsPlugin.RegisterPlayer");
_heelsUnregisterPlayer = pi.GetIpcSubscriber<GameObject, object?>("HeelsPlugin.UnregisterPlayer");
_heelsOffsetUpdate = pi.GetIpcSubscriber<float, object?>("HeelsPlugin.OffsetChanged");
_heelsGetApiVersion = pi.GetIpcSubscriber<(int, int)>("SimpleHeels.ApiVersion");
_heelsGetOffset = pi.GetIpcSubscriber<string>("SimpleHeels.GetLocalPlayer");
_heelsRegisterPlayer = pi.GetIpcSubscriber<GameObject, string, object?>("SimpleHeels.RegisterPlayer");
_heelsUnregisterPlayer = pi.GetIpcSubscriber<GameObject, object?>("SimpleHeels.UnregisterPlayer");
_heelsOffsetUpdate = pi.GetIpcSubscriber<string, object?>("SimpleHeels.LocalChanged");
_heelsOffsetUpdate.Subscribe(HeelsOffsetChange);
_customizePlusApiVersion = pi.GetIpcSubscriber<string>("CustomizePlus.GetApiVersion");
_customizePlusGetBodyScale = pi.GetIpcSubscriber<string, string>("CustomizePlus.GetBodyScale");
_customizePlusRevert = pi.GetIpcSubscriber<Character?, object>("CustomizePlus.RevertCharacter");
_customizePlusSetBodyScaleToCharacter = pi.GetIpcSubscriber<string, Character?, object>("CustomizePlus.SetBodyScaleToCharacter");
_customizePlusOnScaleUpdate = pi.GetIpcSubscriber<string?, object>("CustomizePlus.OnScaleUpdate");
_customizePlusApiVersion = pi.GetIpcSubscriber<(int, int)>("CustomizePlus.GetApiVersion");
_customizePlusGetBodyScale = pi.GetIpcSubscriber<Character?, string?>("CustomizePlus.GetProfileFromCharacter");
_customizePlusRevertCharacter = pi.GetIpcSubscriber<Character?, object>("CustomizePlus.RevertCharacter");
_customizePlusSetBodyScaleToCharacter = pi.GetIpcSubscriber<string, Character?, object>("CustomizePlus.SetProfileToCharacter");
_customizePlusOnScaleUpdate = pi.GetIpcSubscriber<string?, string?, object>("CustomizePlus.OnProfileUpdate");
_customizePlusOnScaleUpdate.Subscribe(OnCustomizePlusScaleChange);
@@ -151,9 +148,6 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
Mediator.Publish(new PenumbraInitializedMessage());
}
Mediator.Subscribe<FrameworkUpdateMessage>(this, (_) => HandleActionQueue());
Mediator.Subscribe<CutsceneFrameworkUpdateMessage>(this, (_) => HandleGposeActionQueue());
Mediator.Subscribe<ZoneSwitchEndMessage>(this, (_) => ClearActionQueue());
Mediator.Subscribe<DelayedFrameworkUpdateMessage>(this, (_) => PeriodicApiStateCheck());
PeriodicApiStateCheck();
@@ -161,7 +155,6 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
public bool Initialized => CheckPenumbraApiInternal() && CheckGlamourerApiInternal();
public string? PenumbraModDirectory { get; private set; }
private ConcurrentQueue<Action> ActionQueue => _inGposeQueueMode ? _gposeActionQueue : _normalQueue;
public bool CheckCustomizePlusApi() => _customizePlusAvailable;
@@ -184,14 +177,14 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
if (gameObj is Character c)
{
Logger.LogTrace("CustomizePlus reverting for {chara}", c.Address.ToString("X"));
_customizePlusRevert!.InvokeAction(c);
_customizePlusRevertCharacter!.InvokeAction(c);
}
}).ConfigureAwait(false);
}
public async Task CustomizePlusSetBodyScaleAsync(IntPtr character, string scale)
{
if (!CheckCustomizePlusApi() || string.IsNullOrEmpty(scale)) return;
if (!CheckCustomizePlusApi()) return;
await _dalamudUtil.RunOnFrameworkThread(() =>
{
var gameObj = _dalamudUtil.CreateGameObject(character);
@@ -199,22 +192,38 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
{
string decodedScale = Encoding.UTF8.GetString(Convert.FromBase64String(scale));
Logger.LogTrace("CustomizePlus applying for {chara}", c.Address.ToString("X"));
_customizePlusSetBodyScaleToCharacter!.InvokeAction(decodedScale, c);
if (scale.IsNullOrEmpty())
{
_customizePlusRevertCharacter!.InvokeAction(c);
}
else
{
_customizePlusSetBodyScaleToCharacter!.InvokeAction(decodedScale, c);
}
}
}).ConfigureAwait(false);
}
public async Task<string> GetCustomizePlusScaleAsync()
public async Task<string> GetCustomizePlusScaleAsync(IntPtr character)
{
if (!CheckCustomizePlusApi()) return string.Empty;
var scale = await _dalamudUtil.RunOnFrameworkThread(() => _customizePlusGetBodyScale.InvokeFunc(_dalamudUtil.GetPlayerName())).ConfigureAwait(false);
var scale = await _dalamudUtil.RunOnFrameworkThread(() =>
{
var gameObj = _dalamudUtil.CreateGameObject(character);
if (gameObj is Character c)
{
return _customizePlusGetBodyScale.InvokeFunc(c);
}
return string.Empty;
}).ConfigureAwait(false);
if (string.IsNullOrEmpty(scale)) return string.Empty;
return Convert.ToBase64String(Encoding.UTF8.GetBytes(scale));
}
public async Task<float> GetHeelsOffsetAsync()
public async Task<string> GetHeelsOffsetAsync()
{
if (!CheckHeelsApi()) return 0.0f;
if (!CheckHeelsApi()) return string.Empty;
return await _dalamudUtil.RunOnFrameworkThread(_heelsGetOffset.InvokeFunc).ConfigureAwait(false);
}
@@ -300,7 +309,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
}).ConfigureAwait(false);
}
public async Task HeelsSetOffsetForPlayerAsync(IntPtr character, float offset)
public async Task HeelsSetOffsetForPlayerAsync(IntPtr character, string data)
{
if (!CheckHeelsApi()) return;
await _dalamudUtil.RunOnFrameworkThread(() =>
@@ -309,7 +318,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
if (gameObj != null)
{
Logger.LogTrace("Applying Heels data to {chara}", character.ToString("X"));
_heelsRegisterPlayer.InvokeAction(gameObj, offset);
_heelsRegisterPlayer.InvokeAction(gameObj, data);
}
}).ConfigureAwait(false);
}
@@ -503,37 +512,12 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
}).ConfigureAwait(false);
}
public void ToggleGposeQueueMode(bool on)
{
_inGposeQueueMode = on;
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
_disposalCts.Cancel();
int totalSleepTime = 0;
while (!ActionQueue.IsEmpty && totalSleepTime < 2000)
{
Logger.LogTrace("Waiting for actionqueue to clear...");
PeriodicApiStateCheck();
if (CheckPenumbraApi())
{
HandleActionQueue();
}
Thread.Sleep(16);
totalSleepTime += 16;
}
if (totalSleepTime >= 2000)
{
Logger.LogTrace("Action queue clear or not, disposing");
}
ActionQueue.Clear();
_penumbraModSettingChanged.Dispose();
_penumbraGameObjectResourcePathResolved.Dispose();
_penumbraDispose.Dispose();
@@ -551,7 +535,9 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
{
try
{
return string.Equals(_customizePlusApiVersion.InvokeFunc(), "2.0", StringComparison.Ordinal);
var version = _customizePlusApiVersion.InvokeFunc();
if (version.Item1 == 3 && version.Item2 >= 0) return true;
return false;
}
catch
{
@@ -586,7 +572,7 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
{
try
{
return string.Equals(_heelsGetApiVersion.InvokeFunc(), "1.0.1", StringComparison.Ordinal);
return _heelsGetApiVersion.InvokeFunc() is { Item1: 1, Item2: >= 0 };
}
catch
{
@@ -641,46 +627,20 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
}
}
private void ClearActionQueue()
{
ActionQueue.Clear();
_gposeActionQueue.Clear();
}
private string? GetPenumbraModDirectoryInternal()
{
if (!CheckPenumbraApi()) return null;
return _penumbraResolveModDir!.Invoke().ToLowerInvariant();
}
private void HandleActionQueue()
{
if (ActionQueue.TryDequeue(out var action))
{
if (action == null) return;
Logger.LogDebug("Execution action in queue: {method}", action.Method);
action();
}
}
private void HandleGposeActionQueue()
{
if (_gposeActionQueue.TryDequeue(out var action))
{
if (action == null) return;
Logger.LogDebug("Execution action in gpose queue: {method}", action.Method);
action();
}
}
private void HeelsOffsetChange(float offset)
private void HeelsOffsetChange(string offset)
{
Mediator.Publish(new HeelsOffsetMessage());
}
private void OnCustomizePlusScaleChange(string? scale)
private void OnCustomizePlusScaleChange(string? profileName, string? scale)
{
Mediator.Publish(new CustomizePlusMessage());
Mediator.Publish(new CustomizePlusMessage(profileName ?? string.Empty));
}
private void OnHonorificDisposing()
@@ -710,7 +670,6 @@ public sealed class IpcManager : DisposableMediatorSubscriberBase
_disposalCts.Cancel();
_disposalCts.Dispose();
Mediator.Publish(new PenumbraDisposedMessage());
ActionQueue.Clear();
_disposalCts = new();
}

View File

@@ -6,17 +6,17 @@ namespace MareSynchronos.PlayerData.Data;
public class CharacterData
{
public string CustomizePlusScale { get; set; } = string.Empty;
public Dictionary<ObjectKind, string> CustomizePlusScale { get; set; } = new();
public Dictionary<ObjectKind, HashSet<FileReplacement>> FileReplacements { get; set; } = new();
public Dictionary<ObjectKind, string> GlamourerString { get; set; } = new();
public float HeelsOffset { get; set; } = 0f;
public string HeelsData { get; set; } = string.Empty;
public string HonorificData { get; set; } = string.Empty;
public bool IsReady => FileReplacements.SelectMany(k => k.Value).All(f => f.Computed);
public string ManipulationString { get; set; } = string.Empty;
public string PalettePlusPalette { get; set; } = string.Empty;
public string HonorificData { get; set; } = string.Empty;
public API.Data.CharacterData ToAPI()
{
@@ -40,8 +40,8 @@ public class CharacterData
FileReplacements = fileReplacements,
GlamourerData = GlamourerString.ToDictionary(d => d.Key, d => d.Value),
ManipulationData = ManipulationString,
HeelsOffset = HeelsOffset,
CustomizePlusData = CustomizePlusScale,
HeelsData = HeelsData,
CustomizePlusData = CustomizePlusScale.ToDictionary(d => d.Key, d => d.Value),
PalettePlusData = PalettePlusPalette,
HonorificData = HonorificData
};

View File

@@ -26,7 +26,8 @@ public record MareCharaFileData
GlamourerData = glamourerData;
}
CustomizePlusData = dto.CustomizePlusData;
dto.CustomizePlusData.TryGetValue(ObjectKind.Player, out var customizePlusData);
CustomizePlusData = customizePlusData ?? string.Empty;
PalettePlusData = dto.PalettePlusData;
ManipulationData = dto.ManipulationData;

View File

@@ -64,7 +64,6 @@ public class MareCharaFileManager
}
}
var applicationId = Guid.NewGuid();
_ipcManager.ToggleGposeQueueMode(on: true);
await _ipcManager.PenumbraRemoveTemporaryCollectionAsync(_logger, applicationId, charaTarget.Name.TextValue).ConfigureAwait(false);
var coll = await _ipcManager.PenumbraCreateTemporaryCollectionAsync(_logger, charaTarget.Name.TextValue).ConfigureAwait(false);
await _ipcManager.PenumbraAssignTemporaryCollectionAsync(_logger, coll, charaTarget.ObjectTableIndex()!.Value).ConfigureAwait(false);
@@ -74,7 +73,22 @@ public class MareCharaFileManager
await _ipcManager.GlamourerApplyAllAsync(_logger, tempHandler, LoadedCharaFile.CharaFileData.GlamourerData, applicationId, disposeCts.Token).ConfigureAwait(false);
_dalamudUtil.WaitWhileGposeCharacterIsDrawing(charaTarget.Address, 30000);
await _ipcManager.PenumbraRemoveTemporaryCollectionAsync(_logger, applicationId, coll).ConfigureAwait(false);
_ipcManager.ToggleGposeQueueMode(on: false);
if (!string.IsNullOrEmpty(LoadedCharaFile.CharaFileData.CustomizePlusData))
{
await _ipcManager.CustomizePlusSetBodyScaleAsync(tempHandler.Address, LoadedCharaFile.CharaFileData.CustomizePlusData).ConfigureAwait(false);
}
else
{
await _ipcManager.CustomizePlusRevertAsync(tempHandler.Address).ConfigureAwait(false);
}
if (!string.IsNullOrEmpty(LoadedCharaFile.CharaFileData.PalettePlusData))
{
await _ipcManager.PalettePlusSetPaletteAsync(tempHandler.Address, LoadedCharaFile.CharaFileData.PalettePlusData).ConfigureAwait(false);
}
else
{
await _ipcManager.PalettePlusRemovePaletteAsync(tempHandler.Address).ConfigureAwait(false);
}
}
}
finally

View File

@@ -73,6 +73,7 @@ public class PlayerDataFactory
_logger.LogTrace("Pointer was zero for {objectKind}", playerRelatedObject.ObjectKind);
previousData.FileReplacements.Remove(playerRelatedObject.ObjectKind);
previousData.GlamourerString.Remove(playerRelatedObject.ObjectKind);
previousData.CustomizePlusScale.Remove(playerRelatedObject.ObjectKind);
return;
}
@@ -373,20 +374,20 @@ public class PlayerDataFactory
// gather up data from ipc
previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations();
Task<float> getHeelsOffset = _ipcManager.GetHeelsOffsetAsync();
Task<string> getHeelsOffset = _ipcManager.GetHeelsOffsetAsync();
Task<string> getGlamourerData = _ipcManager.GlamourerGetCharacterCustomizationAsync(playerRelatedObject.Address);
Task<string> getCustomizeData = _ipcManager.GetCustomizePlusScaleAsync();
Task<string> getCustomizeData = _ipcManager.GetCustomizePlusScaleAsync(playerRelatedObject.Address);
Task<string> getPalettePlusData = _ipcManager.PalettePlusBuildPaletteAsync();
previousData.GlamourerString[playerRelatedObject.ObjectKind] = await getGlamourerData.ConfigureAwait(false);
_logger.LogDebug("Glamourer is now: {data}", previousData.GlamourerString[playerRelatedObject.ObjectKind]);
previousData.CustomizePlusScale = await getCustomizeData.ConfigureAwait(false);
_logger.LogDebug("Customize is now: {data}", previousData.CustomizePlusScale);
previousData.CustomizePlusScale[playerRelatedObject.ObjectKind] = await getCustomizeData.ConfigureAwait(false);
_logger.LogDebug("Customize is now: {data}", previousData.CustomizePlusScale[playerRelatedObject.ObjectKind]);
previousData.PalettePlusPalette = await getPalettePlusData.ConfigureAwait(false);
_logger.LogDebug("Palette is now: {data}", previousData.PalettePlusPalette);
previousData.HonorificData = _ipcManager.HonorificGetTitle();
_logger.LogDebug("Honorific is now: {data}", previousData.HonorificData);
previousData.HeelsOffset = await getHeelsOffset.ConfigureAwait(false);
_logger.LogDebug("Heels is now: {heels}", previousData.HeelsOffset);
previousData.HeelsData = await getHeelsOffset.ConfigureAwait(false);
_logger.LogDebug("Heels is now: {heels}", previousData.HeelsData);
st.Stop();
_logger.LogInformation("Building character data for {obj} took {time}ms", objectKind, TimeSpan.FromTicks(st.ElapsedTicks).TotalMilliseconds);

View File

@@ -229,11 +229,14 @@ public sealed class PairHandler : DisposableMediatorSubscriberBase
break;
case PlayerChanges.Customize:
await _ipcManager.CustomizePlusSetBodyScaleAsync(handler.Address, charaData.CustomizePlusData).ConfigureAwait(false);
if (charaData.CustomizePlusData.TryGetValue(changes.Key, out var customizePlusData))
{
await _ipcManager.CustomizePlusSetBodyScaleAsync(handler.Address, customizePlusData).ConfigureAwait(false);
}
break;
case PlayerChanges.Heels:
await _ipcManager.HeelsSetOffsetForPlayerAsync(handler.Address, charaData.HeelsOffset).ConfigureAwait(false);
await _ipcManager.HeelsSetOffsetForPlayerAsync(handler.Address, charaData.HeelsData).ConfigureAwait(false);
break;
case PlayerChanges.Honorific:

View File

@@ -5,6 +5,7 @@ using MareSynchronos.PlayerData.Handlers;
using MareSynchronos.Services;
using MareSynchronos.Services.Mediator;
using Microsoft.Extensions.Logging;
using System.Linq;
namespace MareSynchronos.PlayerData.Services;
@@ -53,15 +54,20 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase
Logger.LogTrace("Clearing cache for {obj}", msg.ObjectToCreateFor);
_playerData.FileReplacements.Remove(msg.ObjectToCreateFor.ObjectKind);
_playerData.GlamourerString.Remove(msg.ObjectToCreateFor.ObjectKind);
_playerData.CustomizePlusScale.Remove(msg.ObjectToCreateFor.ObjectKind);
Mediator.Publish(new CharacterDataCreatedMessage(_playerData.ToAPI()));
});
});
Mediator.Subscribe<CustomizePlusMessage>(this, async (_) =>
Mediator.Subscribe<CustomizePlusMessage>(this, async (msg) =>
{
if (_isZoning) return;
Logger.LogDebug("Received CustomizePlus change, updating player");
await AddPlayerCacheToCreate().ConfigureAwait(false);
foreach (var item in _playerRelatedObjects
.Where(item => string.Equals(item.Value.Name, msg.ProfileName, StringComparison.Ordinal)).Select(k => k.Key))
{
Logger.LogDebug("Received CustomizePlus change, updating {obj}", item);
await AddPlayerCacheToCreate(item).ConfigureAwait(false);
}
});
Mediator.Subscribe<HeelsOffsetMessage>(this, async (_) =>
{
@@ -104,10 +110,10 @@ public sealed class CacheCreationService : DisposableMediatorSubscriberBase
_cts.Dispose();
}
private async Task AddPlayerCacheToCreate()
private async Task AddPlayerCacheToCreate(ObjectKind kind = ObjectKind.Player)
{
await _cacheCreateLock.WaitAsync().ConfigureAwait(false);
_cachesToCreate[ObjectKind.Player] = _playerRelatedObjects[ObjectKind.Player];
_cachesToCreate[kind] = _playerRelatedObjects[kind];
_cacheCreateLock.Release();
}

View File

@@ -34,7 +34,7 @@ public record PenumbraDisposedMessage : MessageBase;
public record PenumbraRedrawMessage(IntPtr Address, int ObjTblIdx, bool WasRequested) : SameThreadMessage;
public record HeelsOffsetMessage : MessageBase;
public record PenumbraResourceLoadMessage(IntPtr GameObject, string GamePath, string FilePath) : SameThreadMessage;
public record CustomizePlusMessage : MessageBase;
public record CustomizePlusMessage(string ProfileName) : MessageBase;
public record PalettePlusMessage(Character Character) : MessageBase;
public record HonorificMessage(string NewHonorificTitle) : MessageBase;
public record HonorificReadyMessage : MessageBase;

View File

@@ -52,7 +52,10 @@ public sealed class DtrEntry : IDisposable, IHostedService
{
await _runTask!.ConfigureAwait(false);
}
catch (OperationCanceledException) { }
catch (OperationCanceledException)
{
// ignore cancelled
}
finally
{
_cancellationTokenSource.Dispose();

View File

@@ -1,4 +1,5 @@
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Utility;
using MareSynchronos.API.Data;
using MareSynchronos.API.Data.Enum;
using MareSynchronos.PlayerData.Handlers;
@@ -83,6 +84,16 @@ public static class VariousExtensions
}
}
oldData.CustomizePlusData.TryGetValue(objectKind, out var oldCustomizePlusData);
newData.CustomizePlusData.TryGetValue(objectKind, out var newCustomizePlusData);
bool customizeDataDifferent = !string.Equals(oldCustomizePlusData, newCustomizePlusData, StringComparison.Ordinal);
if (customizeDataDifferent || (forceApplyCustomization && !string.IsNullOrEmpty(newCustomizePlusData)))
{
logger.LogDebug("[BASE-{appBase}] Updating {object}/{kind} (Diff customize data) => {change}", applicationBase, cachedPlayer, objectKind, PlayerChanges.Customize);
charaDataToUpdate[objectKind].Add(PlayerChanges.Customize);
}
if (objectKind != ObjectKind.Player) continue;
bool manipDataDifferent = !string.Equals(oldData.ManipulationData, newData.ManipulationData, StringComparison.Ordinal);
@@ -92,20 +103,13 @@ public static class VariousExtensions
charaDataToUpdate[objectKind].Add(PlayerChanges.ModManip);
}
bool heelsOffsetDifferent = oldData.HeelsOffset != newData.HeelsOffset;
if (heelsOffsetDifferent || (forceApplyCustomization && newData.HeelsOffset != 0))
bool heelsOffsetDifferent = !string.Equals(oldData.HeelsData, newData.HeelsData, StringComparison.Ordinal);
if (heelsOffsetDifferent || (forceApplyCustomization && !string.IsNullOrEmpty(newData.HeelsData)))
{
logger.LogDebug("[BASE-{appBase}] Updating {object}/{kind} (Diff heels data) => {change}", applicationBase, cachedPlayer, objectKind, PlayerChanges.Heels);
charaDataToUpdate[objectKind].Add(PlayerChanges.Heels);
}
bool customizeDataDifferent = !string.Equals(oldData.CustomizePlusData, newData.CustomizePlusData, StringComparison.Ordinal);
if (customizeDataDifferent || (forceApplyCustomization && !string.IsNullOrEmpty(newData.CustomizePlusData)))
{
logger.LogDebug("[BASE-{appBase}] Updating {object}/{kind} (Diff customize data) => {change}", applicationBase, cachedPlayer, objectKind, PlayerChanges.Customize);
charaDataToUpdate[objectKind].Add(PlayerChanges.Customize);
}
bool palettePlusDataDifferent = !string.Equals(oldData.PalettePlusData, newData.PalettePlusData, StringComparison.Ordinal);
if (palettePlusDataDifferent || (forceApplyCustomization && !string.IsNullOrEmpty(newData.PalettePlusData)))
{