add customizeplus support

This commit is contained in:
rootdarkarchon
2022-10-27 12:49:18 +02:00
parent d3f5b72d71
commit 71e11c5b45
6 changed files with 114 additions and 9 deletions

View File

@@ -263,7 +263,7 @@ public class CharacterDataFactory
Thread.Sleep(50); Thread.Sleep(50);
} }
_dalamudUtil.WaitWhileCharacterIsDrawing(objectKind.ToString(), charaPointer, 15000); _dalamudUtil.WaitWhileCharacterIsDrawing(objectKind.ToString(), charaPointer, objectKind == ObjectKind.MinionOrMount ? 1000 : 15000);
var human = (Human*)((Character*)charaPointer)->GameObject.GetDrawObject(); var human = (Human*)((Character*)charaPointer)->GameObject.GetDrawObject();
for (var mdlIdx = 0; mdlIdx < human->CharacterBase.SlotCount; ++mdlIdx) for (var mdlIdx = 0; mdlIdx < human->CharacterBase.SlotCount; ++mdlIdx)
@@ -303,6 +303,7 @@ public class CharacterDataFactory
previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations(); previousData.ManipulationString = _ipcManager.PenumbraGetMetaManipulations();
previousData.GlamourerString[objectKind] = _ipcManager.GlamourerGetCharacterCustomization(charaPointer); previousData.GlamourerString[objectKind] = _ipcManager.GlamourerGetCharacterCustomization(charaPointer);
previousData.HeelsOffset = _ipcManager.GetHeelsOffset(); previousData.HeelsOffset = _ipcManager.GetHeelsOffset();
previousData.CustomizePlusScale = _ipcManager.GetCustomizePlusScale();
Logger.Debug("Handling transient update for " + objectKind); Logger.Debug("Handling transient update for " + objectKind);
ManageSemiTransientData(previousData, objectKind, charaPointer); ManageSemiTransientData(previousData, objectKind, charaPointer);

View File

@@ -126,6 +126,14 @@ public class CachedPlayer
charaDataToUpdate.Add(objectKind); charaDataToUpdate.Add(objectKind);
continue; continue;
} }
bool customizeDataDifferent = _cachedData.CustomizePlusData != characterData.CustomizePlusData;
if (customizeDataDifferent)
{
Logger.Debug("Updating " + objectKind);
charaDataToUpdate.Add(objectKind);
continue;
}
} }
} }
@@ -248,6 +256,7 @@ public class CachedPlayer
_dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, 10000, ct); _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, 10000, ct);
ct.ThrowIfCancellationRequested(); ct.ThrowIfCancellationRequested();
_ipcManager.HeelsSetOffsetForPlayer(_cachedData.HeelsOffset, PlayerCharacter); _ipcManager.HeelsSetOffsetForPlayer(_cachedData.HeelsOffset, PlayerCharacter);
_ipcManager.CustomizePlusSetBodyScale(PlayerCharacter, _cachedData.CustomizePlusData);
RequestedPenumbraRedraw = true; RequestedPenumbraRedraw = true;
Logger.Debug( Logger.Debug(
$"Request Redraw for {PlayerName}"); $"Request Redraw for {PlayerName}");
@@ -337,6 +346,7 @@ public class CachedPlayer
_ipcManager.GlamourerApplyOnlyCustomization(_originalGlamourerData, PlayerCharacter); _ipcManager.GlamourerApplyOnlyCustomization(_originalGlamourerData, PlayerCharacter);
_ipcManager.GlamourerApplyOnlyEquipment(_lastGlamourerData, PlayerCharacter); _ipcManager.GlamourerApplyOnlyEquipment(_lastGlamourerData, PlayerCharacter);
_ipcManager.HeelsRestoreOffsetForPlayer(PlayerCharacter); _ipcManager.HeelsRestoreOffsetForPlayer(PlayerCharacter);
_ipcManager.CustomizePlusRevert(PlayerCharacter);
} }
else else
{ {

View File

@@ -4,15 +4,16 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Game.ClientState.Objects.Types;
using MareSynchronos.Utils; using MareSynchronos.Utils;
using MareSynchronos.WebAPI;
using Action = System.Action; using Action = System.Action;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Text;
namespace MareSynchronos.Managers; namespace MareSynchronos.Managers;
public delegate void PenumbraRedrawEvent(IntPtr address, int objTblIdx); public delegate void PenumbraRedrawEvent(IntPtr address, int objTblIdx);
public delegate void HeelsOffsetChange(float change); public delegate void HeelsOffsetChange(float change);
public delegate void PenumbraResourceLoadEvent(IntPtr drawObject, string gamePath, string filePath); public delegate void PenumbraResourceLoadEvent(IntPtr drawObject, string gamePath, string filePath);
public delegate void CustomizePlusScaleChange(string? scale);
public class IpcManager : IDisposable public class IpcManager : IDisposable
{ {
private readonly ICallGateSubscriber<int> _glamourerApiVersion; private readonly ICallGateSubscriber<int> _glamourerApiVersion;
@@ -43,6 +44,12 @@ public class IpcManager : IDisposable
private readonly ICallGateSubscriber<GameObject, float, object?> _heelsRegisterPlayer; private readonly ICallGateSubscriber<GameObject, float, object?> _heelsRegisterPlayer;
private readonly ICallGateSubscriber<GameObject, object?> _heelsUnregisterPlayer; private readonly ICallGateSubscriber<GameObject, object?> _heelsUnregisterPlayer;
private readonly ICallGateSubscriber<string> _customizePlusApiVersion;
private readonly ICallGateSubscriber<string, string> _customizePlusGetBodyScale;
private readonly ICallGateSubscriber<string, Character?, object> _customizePlusSetBodyScaleToCharacter;
private readonly ICallGateSubscriber<Character?, object> _customizePlusRevert;
private readonly ICallGateSubscriber<string?, object> _customizePlusOnScaleUpdate;
private readonly DalamudUtil _dalamudUtil; private readonly DalamudUtil _dalamudUtil;
private readonly ConcurrentQueue<Action> actionQueue = new(); private readonly ConcurrentQueue<Action> actionQueue = new();
@@ -89,6 +96,14 @@ public class IpcManager : IDisposable
_heelsOffsetUpdate.Subscribe(HeelsOffsetChange); _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");
_customizePlusOnScaleUpdate.Subscribe(OnCustomizePlusScaleChange);
if (Initialized) if (Initialized)
{ {
PenumbraInitialized?.Invoke(); PenumbraInitialized?.Invoke();
@@ -128,6 +143,7 @@ public class IpcManager : IDisposable
public event PenumbraRedrawEvent? PenumbraRedrawEvent; public event PenumbraRedrawEvent? PenumbraRedrawEvent;
public event HeelsOffsetChange? HeelsOffsetChangeEvent; public event HeelsOffsetChange? HeelsOffsetChangeEvent;
public event PenumbraResourceLoadEvent? PenumbraResourceLoadEvent; public event PenumbraResourceLoadEvent? PenumbraResourceLoadEvent;
public event CustomizePlusScaleChange? CustomizePlusScaleChange;
public bool Initialized => CheckPenumbraApi(); public bool Initialized => CheckPenumbraApi();
public bool CheckGlamourerApi() public bool CheckGlamourerApi()
@@ -166,6 +182,18 @@ public class IpcManager : IDisposable
} }
} }
public bool CheckCustomizePlusApi()
{
try
{
return string.Equals(_customizePlusApiVersion.InvokeFunc(), "1.0", StringComparison.Ordinal);
}
catch
{
return false;
}
}
public void Dispose() public void Dispose()
{ {
Logger.Verbose("Disposing " + nameof(IpcManager)); Logger.Verbose("Disposing " + nameof(IpcManager));
@@ -229,6 +257,43 @@ public class IpcManager : IDisposable
}); });
} }
public string GetCustomizePlusScale()
{
if (!CheckCustomizePlusApi()) return string.Empty;
var scale = _customizePlusGetBodyScale.InvokeFunc(_dalamudUtil.PlayerName);
if(string.IsNullOrEmpty(scale)) return string.Empty;
return Convert.ToBase64String(Encoding.UTF8.GetBytes(scale));
}
public void CustomizePlusSetBodyScale(IntPtr character, string scale)
{
if (!CheckCustomizePlusApi() || string.IsNullOrEmpty(scale)) return;
actionQueue.Enqueue(() =>
{
var gameObj = _dalamudUtil.CreateGameObject(character);
if (gameObj is Character c)
{
string decodedScale = Encoding.UTF8.GetString(Convert.FromBase64String(scale));
Logger.Verbose("CustomizePlus applying for " + c.Address.ToString("X"));
_customizePlusSetBodyScaleToCharacter!.InvokeAction(decodedScale, c);
}
});
}
public void CustomizePlusRevert(IntPtr character)
{
if (!CheckCustomizePlusApi()) return;
actionQueue.Enqueue(() =>
{
var gameObj = _dalamudUtil.CreateGameObject(character);
if (gameObj is Character c)
{
Logger.Verbose("CustomizePlus reverting for " + c.Address.ToString("X"));
_customizePlusRevert!.InvokeAction(c);
}
});
}
public void GlamourerApplyAll(string? customization, IntPtr obj) public void GlamourerApplyAll(string? customization, IntPtr obj)
{ {
if (!CheckGlamourerApi() || string.IsNullOrEmpty(customization)) return; if (!CheckGlamourerApi() || string.IsNullOrEmpty(customization)) return;
@@ -392,6 +457,12 @@ public class IpcManager : IDisposable
HeelsOffsetChangeEvent?.Invoke(offset); HeelsOffsetChangeEvent?.Invoke(offset);
} }
private void OnCustomizePlusScaleChange(string? scale)
{
if (scale != null) scale = Convert.ToBase64String(Encoding.UTF8.GetBytes(scale));
CustomizePlusScaleChange?.Invoke(scale);
}
private void PenumbraDispose() private void PenumbraDispose()
{ {
PenumbraDisposed?.Invoke(); PenumbraDisposed?.Invoke();

View File

@@ -53,6 +53,7 @@ public class PlayerManager : IDisposable
_transientResourceManager.TransientResourceLoaded += HandleTransientResourceLoad; _transientResourceManager.TransientResourceLoaded += HandleTransientResourceLoad;
_dalamudUtil.DelayedFrameworkUpdate += DalamudUtilOnDelayedFrameworkUpdate; _dalamudUtil.DelayedFrameworkUpdate += DalamudUtilOnDelayedFrameworkUpdate;
_ipcManager.HeelsOffsetChangeEvent += HeelsOffsetChanged; _ipcManager.HeelsOffsetChangeEvent += HeelsOffsetChanged;
_ipcManager.CustomizePlusScaleChange += CustomizePlusChanged;
_dalamudUtil.FrameworkUpdate += DalamudUtilOnFrameworkUpdate; _dalamudUtil.FrameworkUpdate += DalamudUtilOnFrameworkUpdate;
@@ -105,7 +106,18 @@ public class PlayerManager : IDisposable
if (LastCreatedCharacterData != null && LastCreatedCharacterData.HeelsOffset != change && !player.IsProcessing) if (LastCreatedCharacterData != null && LastCreatedCharacterData.HeelsOffset != change && !player.IsProcessing)
{ {
Logger.Debug("Heels offset changed to " + change); Logger.Debug("Heels offset changed to " + change);
playerRelatedObjects.First(f => f.ObjectKind == ObjectKind.Player).HasTransientsUpdate = true; player.HasTransientsUpdate = true;
}
}
private void CustomizePlusChanged(string? change)
{
change ??= string.Empty;
var player = playerRelatedObjects.First(f => f.ObjectKind == ObjectKind.Player);
if (LastCreatedCharacterData != null && LastCreatedCharacterData.CustomizePlusData != change && !player.IsProcessing)
{
Logger.Debug("CustomizePlus data changed to " + change);
player.HasTransientsUpdate = true;
} }
} }
@@ -124,6 +136,7 @@ public class PlayerManager : IDisposable
_playerChangedCts?.Cancel(); _playerChangedCts?.Cancel();
_ipcManager.HeelsOffsetChangeEvent -= HeelsOffsetChanged; _ipcManager.HeelsOffsetChangeEvent -= HeelsOffsetChanged;
_ipcManager.CustomizePlusScaleChange -= CustomizePlusChanged;
} }
private unsafe void DalamudUtilOnDelayedFrameworkUpdate() private unsafe void DalamudUtilOnDelayedFrameworkUpdate()
@@ -241,7 +254,7 @@ public class PlayerManager : IDisposable
_periodicFileScanner.HaltScan("Character creation"); _periodicFileScanner.HaltScan("Character creation");
foreach (var item in unprocessedObjects) foreach (var item in unprocessedObjects)
{ {
_dalamudUtil.WaitWhileCharacterIsDrawing("self " + item.ObjectKind.ToString(), item.Address, 10000, token); _dalamudUtil.WaitWhileCharacterIsDrawing("self " + item.ObjectKind.ToString(), item.Address, item.ObjectKind == ObjectKind.MinionOrMount ? 1000 : 10000, token);
} }
cacheDto = (await CreateFullCharacterCacheDto(token).ConfigureAwait(false)); cacheDto = (await CreateFullCharacterCacheDto(token).ConfigureAwait(false));

View File

@@ -25,6 +25,9 @@ public class CharacterData
[JsonProperty] [JsonProperty]
public float HeelsOffset { get; set; } = 0f; public float HeelsOffset { get; set; } = 0f;
[JsonProperty]
public string CustomizePlusScale { get; set; } = string.Empty;
public void AddFileReplacement(ObjectKind objectKind, FileReplacement fileReplacement) public void AddFileReplacement(ObjectKind objectKind, FileReplacement fileReplacement)
{ {
if (!fileReplacement.HasFileReplacement) return; if (!fileReplacement.HasFileReplacement) return;
@@ -71,7 +74,8 @@ public class CharacterData
FileReplacements = fileReplacements, FileReplacements = fileReplacements,
GlamourerData = GlamourerString.ToDictionary(d => d.Key, d => d.Value), GlamourerData = GlamourerString.ToDictionary(d => d.Key, d => d.Value),
ManipulationData = ManipulationString, ManipulationData = ManipulationString,
HeelsOffset = HeelsOffset HeelsOffset = HeelsOffset,
CustomizePlusData = CustomizePlusScale
}; };
} }

View File

@@ -41,7 +41,7 @@ public class UiShared : IDisposable
public bool UidFontBuilt { get; private set; } public bool UidFontBuilt { get; private set; }
public static bool CtrlPressed() => (GetKeyState(0xA2) & 0x8000) != 0 || (GetKeyState(0xA3) & 0x8000) != 0; public static bool CtrlPressed() => (GetKeyState(0xA2) & 0x8000) != 0 || (GetKeyState(0xA3) & 0x8000) != 0;
public static bool ShiftPressed() => (GetKeyState(0xA1) & 0x8000) != 0 || (GetKeyState(0xA0) & 0x8000) != 0; public static bool ShiftPressed() => (GetKeyState(0xA1) & 0x8000) != 0 || (GetKeyState(0xA0) & 0x8000) != 0;
public static ImGuiWindowFlags PopupWindowFlags = ImGuiWindowFlags.NoResize | public static ImGuiWindowFlags PopupWindowFlags = ImGuiWindowFlags.NoResize |
ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoScrollbar |
ImGuiWindowFlags.NoScrollWithMouse; ImGuiWindowFlags.NoScrollWithMouse;
@@ -115,10 +115,10 @@ public class UiShared : IDisposable
var center = ImGui.GetMainViewport().GetCenter(); var center = ImGui.GetMainViewport().GetCenter();
ImGui.SetWindowPos(new Vector2(center.X - x / 2, center.Y - y / 2)); ImGui.SetWindowPos(new Vector2(center.X - x / 2, center.Y - y / 2));
} }
ImGui.SetWindowSize(new Vector2(x, y)); ImGui.SetWindowSize(new Vector2(x, y));
} }
public static void SetScaledWindowSize(float width, float height, bool centerWindow = true) public static void SetScaledWindowSize(float width, float height, bool centerWindow = true)
{ {
ImGui.SameLine(); ImGui.SameLine();
@@ -130,7 +130,7 @@ public class UiShared : IDisposable
var center = ImGui.GetMainViewport().GetCenter(); var center = ImGui.GetMainViewport().GetCenter();
ImGui.SetWindowPos(new Vector2(center.X - x / 2, center.Y - y / 2)); ImGui.SetWindowPos(new Vector2(center.X - x / 2, center.Y - y / 2));
} }
ImGui.SetWindowSize(new Vector2(x, y)); ImGui.SetWindowSize(new Vector2(x, y));
} }
@@ -154,10 +154,12 @@ public class UiShared : IDisposable
var penumbraExists = _ipcManager.CheckPenumbraApi(); var penumbraExists = _ipcManager.CheckPenumbraApi();
var glamourerExists = _ipcManager.CheckGlamourerApi(); var glamourerExists = _ipcManager.CheckGlamourerApi();
var heelsExists = _ipcManager.CheckHeelsApi(); var heelsExists = _ipcManager.CheckHeelsApi();
var customizeExists = _ipcManager.CheckCustomizePlusApi();
var penumbraColor = penumbraExists ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed; var penumbraColor = penumbraExists ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed;
var glamourerColor = glamourerExists ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed; var glamourerColor = glamourerExists ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed;
var heelsColor = heelsExists ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed; var heelsColor = heelsExists ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed;
var customizeColor = customizeExists ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed;
ImGui.Text("Penumbra:"); ImGui.Text("Penumbra:");
ImGui.SameLine(); ImGui.SameLine();
ImGui.TextColored(penumbraColor, penumbraExists ? "Available" : "Unavailable"); ImGui.TextColored(penumbraColor, penumbraExists ? "Available" : "Unavailable");
@@ -170,6 +172,10 @@ public class UiShared : IDisposable
ImGui.Text("Heels:"); ImGui.Text("Heels:");
ImGui.SameLine(); ImGui.SameLine();
ImGui.TextColored(heelsColor, heelsExists ? "Available" : "Unavailable"); ImGui.TextColored(heelsColor, heelsExists ? "Available" : "Unavailable");
ImGui.SameLine();
ImGui.Text("Customize+:");
ImGui.SameLine();
ImGui.TextColored(customizeColor, customizeExists ? "Available" : "Unavailable");
if (!penumbraExists || !glamourerExists) if (!penumbraExists || !glamourerExists)
{ {