add heels support
This commit is contained in:
		
							
								
								
									
										2
									
								
								MareAPI
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								MareAPI
									
									
									
									
									
								
							 Submodule MareAPI updated: 9bb99a5e68...9dc1e901aa
									
								
							| @@ -277,6 +277,8 @@ public class CharacterDataFactory | ||||
|             { | ||||
|                 Logger.Warn("Could not get Legacy Body Decal Data"); | ||||
|             } | ||||
|  | ||||
|             previousData.HeelsOffset = _ipcManager.GetHeelsOffset(); | ||||
|         } | ||||
|  | ||||
|         st.Stop(); | ||||
|   | ||||
| @@ -3,12 +3,10 @@ using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
| using Dalamud.Game.ClientState.Objects.SubKinds; | ||||
| using Dalamud.Logging; | ||||
| using FFXIVClientStructs.FFXIV.Client.Game.Character; | ||||
| using MareSynchronos.API; | ||||
| using MareSynchronos.FileCacheDB; | ||||
| using MareSynchronos.Interop; | ||||
| using MareSynchronos.Models; | ||||
| using MareSynchronos.Utils; | ||||
| using MareSynchronos.WebAPI; | ||||
| @@ -116,6 +114,17 @@ public class CachedPlayer | ||||
|                     continue; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (objectKind == ObjectKind.Player) | ||||
|             { | ||||
|                 bool heelsOffsetDifferent = _cachedData.HeelsOffset != characterData.HeelsOffset; | ||||
|                 if (heelsOffsetDifferent) | ||||
|                 { | ||||
|                     Logger.Debug("Updating " + objectKind); | ||||
|                     charaDataToUpdate.Add(objectKind); | ||||
|                     continue; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         _cachedData = characterData; | ||||
| @@ -232,6 +241,7 @@ public class CachedPlayer | ||||
|         if (objectKind == ObjectKind.Player) | ||||
|         { | ||||
|             _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerCharacter); | ||||
|             _ipcManager.HeelsSetOffsetForPlayer(_cachedData.HeelsOffset, PlayerCharacter); | ||||
|             RequestedPenumbraRedraw = true; | ||||
|             Logger.Debug( | ||||
|                 $"Request Redraw for {PlayerName}"); | ||||
| @@ -309,6 +319,8 @@ public class CachedPlayer | ||||
|             { | ||||
|                 _ipcManager.PenumbraRedraw(PlayerCharacter); | ||||
|             } | ||||
|  | ||||
|             _ipcManager.HeelsRestoreOffsetForPlayer(PlayerCharacter); | ||||
|         } | ||||
|         else if (objectKind == ObjectKind.MinionOrMount) | ||||
|         { | ||||
|   | ||||
| @@ -11,6 +11,7 @@ using System.Collections.Concurrent; | ||||
| namespace MareSynchronos.Managers | ||||
| { | ||||
|     public delegate void PenumbraRedrawEvent(IntPtr address, int objTblIdx); | ||||
|     public delegate void HeelsOffsetChange(float change); | ||||
|     public class IpcManager : IDisposable | ||||
|     { | ||||
|         private readonly ICallGateSubscriber<int> _glamourerApiVersion; | ||||
| @@ -33,6 +34,13 @@ namespace MareSynchronos.Managers | ||||
|         private readonly ICallGateSubscriber<string, string[]>? _reverseResolvePlayer; | ||||
|         private readonly ICallGateSubscriber<string, string, Dictionary<string, string>, string, int, int> | ||||
|             _penumbraSetTemporaryMod; | ||||
|  | ||||
|         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<GameObject, object?> _heelsUnregisterPlayer; | ||||
|  | ||||
|         private readonly DalamudUtil _dalamudUtil; | ||||
|         private readonly ConcurrentQueue<Action> actionQueue = new(); | ||||
|  | ||||
| @@ -73,6 +81,15 @@ namespace MareSynchronos.Managers | ||||
|             _penumbraRemoveTemporaryCollection = | ||||
|                 pi.GetIpcSubscriber<string, int>("Penumbra.RemoveTemporaryCollection"); | ||||
|  | ||||
|             _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"); | ||||
|  | ||||
|             _heelsOffsetUpdate.Subscribe(HeelsOffsetChange); | ||||
|  | ||||
|  | ||||
|             if (Initialized) | ||||
|             { | ||||
|                 PenumbraInitialized?.Invoke(); | ||||
| @@ -95,6 +112,7 @@ namespace MareSynchronos.Managers | ||||
|         public event VoidDelegate? PenumbraInitialized; | ||||
|         public event VoidDelegate? PenumbraDisposed; | ||||
|         public event PenumbraRedrawEvent? PenumbraRedrawEvent; | ||||
|         public event HeelsOffsetChange? HeelsOffsetChangeEvent; | ||||
|  | ||||
|         public bool Initialized => CheckPenumbraApi(); | ||||
|         public bool CheckGlamourerApi() | ||||
| @@ -121,6 +139,18 @@ namespace MareSynchronos.Managers | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public bool CheckHeelsApi() | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 return _heelsGetApiVersion.InvokeFunc() == "1.0.1"; | ||||
|             }  | ||||
|             catch | ||||
|             { | ||||
|                 return false; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public void Dispose() | ||||
|         { | ||||
|             Logger.Verbose("Disposing " + nameof(IpcManager)); | ||||
| @@ -131,6 +161,41 @@ namespace MareSynchronos.Managers | ||||
|             _penumbraDispose.Unsubscribe(PenumbraDispose); | ||||
|             _penumbraInit.Unsubscribe(PenumbraInit); | ||||
|             _penumbraObjectIsRedrawn.Unsubscribe(RedrawEvent); | ||||
|             _heelsOffsetUpdate.Unsubscribe(HeelsOffsetChange); | ||||
|         } | ||||
|  | ||||
|         public float GetHeelsOffset() | ||||
|         { | ||||
|             if (!CheckHeelsApi()) return 0.0f; | ||||
|             return _heelsGetOffset.InvokeFunc(); | ||||
|         } | ||||
|  | ||||
|         public void HeelsSetOffsetForPlayer(float offset, IntPtr character) | ||||
|         { | ||||
|             if(!CheckHeelsApi()) return; | ||||
|             actionQueue.Enqueue(() => | ||||
|             { | ||||
|                 var gameObj = _dalamudUtil.CreateGameObject(character); | ||||
|                 if (gameObj != null) | ||||
|                 { | ||||
|                     Logger.Verbose("Applying Heels data to " + character.ToString("X")); | ||||
|                     _heelsRegisterPlayer.InvokeAction(gameObj, offset); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         public void HeelsRestoreOffsetForPlayer(IntPtr character) | ||||
|         { | ||||
|             if (!CheckHeelsApi()) return; | ||||
|             actionQueue.Enqueue(() => | ||||
|             { | ||||
|                 var gameObj = _dalamudUtil.CreateGameObject(character); | ||||
|                 if (gameObj != null) | ||||
|                 { | ||||
|                     Logger.Verbose("Restoring Heels data to " + character.ToString("X")); | ||||
|                     _heelsUnregisterPlayer.InvokeAction(gameObj); | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         public void GlamourerApplyAll(string? customization, IntPtr obj) | ||||
| @@ -280,6 +345,11 @@ namespace MareSynchronos.Managers | ||||
|             }); | ||||
|         } | ||||
|  | ||||
|         private void HeelsOffsetChange(float offset) | ||||
|         { | ||||
|             HeelsOffsetChangeEvent?.Invoke(offset); | ||||
|         } | ||||
|  | ||||
|         private void RedrawEvent(IntPtr objectAddress, int objectTableIndex) | ||||
|         { | ||||
|             PenumbraRedrawEvent?.Invoke(objectAddress, objectTableIndex); | ||||
|   | ||||
| @@ -42,6 +42,7 @@ namespace MareSynchronos.Managers | ||||
|             _apiController.Connected += ApiControllerOnConnected; | ||||
|             _apiController.Disconnected += ApiController_Disconnected; | ||||
|             _dalamudUtil.DelayedFrameworkUpdate += DalamudUtilOnDelayedFrameworkUpdate; | ||||
|             _ipcManager.HeelsOffsetChangeEvent += HeelsOffsetChanged; | ||||
|  | ||||
|             Logger.Debug("Watching Player, ApiController is Connected: " + _apiController.IsConnected); | ||||
|             if (_apiController.IsConnected) | ||||
| @@ -58,6 +59,16 @@ namespace MareSynchronos.Managers | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         private void HeelsOffsetChanged(float change) | ||||
|         { | ||||
|             var player = playerRelatedObjects.First(f => f.ObjectKind == ObjectKind.Player); | ||||
|             if (LastCreatedCharacterData != null && LastCreatedCharacterData.HeelsOffset != change && !player.IsProcessing) | ||||
|             { | ||||
|                 Logger.Debug("Heels offset changed to " + change); | ||||
|                 playerRelatedObjects.First(f => f.ObjectKind == ObjectKind.Player).HasUnprocessedUpdate = true; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         public void Dispose() | ||||
|         { | ||||
|             Logger.Verbose("Disposing " + nameof(PlayerManager)); | ||||
| @@ -67,6 +78,7 @@ namespace MareSynchronos.Managers | ||||
|  | ||||
|             _ipcManager.PenumbraRedrawEvent -= IpcManager_PenumbraRedrawEvent; | ||||
|             _dalamudUtil.DelayedFrameworkUpdate -= DalamudUtilOnDelayedFrameworkUpdate; | ||||
|             _ipcManager.HeelsOffsetChangeEvent -= HeelsOffsetChanged; | ||||
|         } | ||||
|  | ||||
|         private unsafe void DalamudUtilOnDelayedFrameworkUpdate() | ||||
|   | ||||
| @@ -20,6 +20,9 @@ namespace MareSynchronos.Models | ||||
|         [JsonProperty] | ||||
|         public string ManipulationString { get; set; } = string.Empty; | ||||
|  | ||||
|         [JsonProperty] | ||||
|         public float HeelsOffset { get; set; } = 0.0f; | ||||
|  | ||||
|         public void AddFileReplacement(ObjectKind objectKind, FileReplacement fileReplacement) | ||||
|         { | ||||
|             if (!fileReplacement.HasFileReplacement) return; | ||||
| @@ -50,7 +53,8 @@ namespace MareSynchronos.Models | ||||
|                     }; | ||||
|                 }).ToList()), | ||||
|                 GlamourerData = GlamourerString.ToDictionary(d => d.Key, d => d.Value), | ||||
|                 ManipulationData = ManipulationString | ||||
|                 ManipulationData = ManipulationString, | ||||
|                 HeelsOffset = HeelsOffset | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -114,9 +114,11 @@ namespace MareSynchronos.UI | ||||
|         { | ||||
|             var penumbraExists = _ipcManager.CheckPenumbraApi(); | ||||
|             var glamourerExists = _ipcManager.CheckGlamourerApi(); | ||||
|             var heelsExists = _ipcManager.CheckHeelsApi(); | ||||
|  | ||||
|             var penumbraColor = penumbraExists ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed; | ||||
|             var glamourerColor = glamourerExists ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed; | ||||
|             var heelsColor = heelsExists ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed; | ||||
|             ImGui.Text("Penumbra:"); | ||||
|             ImGui.SameLine(); | ||||
|             ImGui.TextColored(penumbraColor, penumbraExists ? "Available" : "Unavailable"); | ||||
| @@ -124,6 +126,11 @@ namespace MareSynchronos.UI | ||||
|             ImGui.Text("Glamourer:"); | ||||
|             ImGui.SameLine(); | ||||
|             ImGui.TextColored(glamourerColor, glamourerExists ? "Available" : "Unavailable"); | ||||
|             ImGui.Text("Optional Addons | "); | ||||
|             ImGui.SameLine(); | ||||
|             ImGui.Text("Heels:"); | ||||
|             ImGui.SameLine(); | ||||
|             ImGui.TextColored(heelsColor, heelsExists ? "Available" : "Unavailable"); | ||||
|  | ||||
|             if (!penumbraExists || !glamourerExists) | ||||
|             { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Stanley Dimant
					Stanley Dimant