add customizeplus support
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user