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

@@ -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();
}