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:
@@ -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
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user