merge from main
This commit is contained in:
		
							
								
								
									
										2
									
								
								MareAPI
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								MareAPI
									
									
									
									
									
								
							 Submodule MareAPI updated: 9bb99a5e68...9dc1e901aa
									
								
							| @@ -383,6 +383,8 @@ public class CharacterDataFactory | |||||||
|         { |         { | ||||||
|             transientResourceManager.RemoveTransientResource(charaPointer, item); |             transientResourceManager.RemoveTransientResource(charaPointer, item); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         previousData.HeelsOffset = _ipcManager.GetHeelsOffset(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private void AddReplacementSkeleton(ushort raceSexId, ObjectKind objectKind, CharacterData cache) |     private void AddReplacementSkeleton(ushort raceSexId, ObjectKind objectKind, CharacterData cache) | ||||||
|   | |||||||
| @@ -3,7 +3,6 @@ using System.Collections.Generic; | |||||||
| using System.Linq; | using System.Linq; | ||||||
| using System.Threading; | using System.Threading; | ||||||
| using System.Threading.Tasks; | using System.Threading.Tasks; | ||||||
| using Dalamud.Game.ClientState.Objects.SubKinds; |  | ||||||
| using Dalamud.Logging; | using Dalamud.Logging; | ||||||
| using FFXIVClientStructs.FFXIV.Client.Game.Character; | using FFXIVClientStructs.FFXIV.Client.Game.Character; | ||||||
| using MareSynchronos.API; | using MareSynchronos.API; | ||||||
| @@ -116,6 +115,17 @@ public class CachedPlayer | |||||||
|                     continue; |                     continue; | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             if (objectKind == ObjectKind.Player) | ||||||
|  |             { | ||||||
|  |                 bool heelsOffsetDifferent = _cachedData.HeelsOffset != characterData.HeelsOffset; | ||||||
|  |                 if (heelsOffsetDifferent) | ||||||
|  |                 { | ||||||
|  |                     Logger.Debug("Updating " + objectKind); | ||||||
|  |                     charaDataToUpdate.Add(objectKind); | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         _cachedData = characterData; |         _cachedData = characterData; | ||||||
| @@ -234,6 +244,7 @@ public class CachedPlayer | |||||||
|         { |         { | ||||||
|             _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, ct); |             _dalamudUtil.WaitWhileCharacterIsDrawing(PlayerName!, PlayerCharacter, ct); | ||||||
|             ct.ThrowIfCancellationRequested(); |             ct.ThrowIfCancellationRequested(); | ||||||
|  |             _ipcManager.HeelsSetOffsetForPlayer(_cachedData.HeelsOffset, PlayerCharacter); | ||||||
|             RequestedPenumbraRedraw = true; |             RequestedPenumbraRedraw = true; | ||||||
|             Logger.Debug( |             Logger.Debug( | ||||||
|                 $"Request Redraw for {PlayerName}"); |                 $"Request Redraw for {PlayerName}"); | ||||||
| @@ -327,6 +338,8 @@ public class CachedPlayer | |||||||
|             { |             { | ||||||
|                 _ipcManager.PenumbraRedraw(PlayerCharacter); |                 _ipcManager.PenumbraRedraw(PlayerCharacter); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             _ipcManager.HeelsRestoreOffsetForPlayer(PlayerCharacter); | ||||||
|         } |         } | ||||||
|         else if (objectKind == ObjectKind.MinionOrMount) |         else if (objectKind == ObjectKind.MinionOrMount) | ||||||
|         { |         { | ||||||
|   | |||||||
| @@ -11,6 +11,7 @@ using System.Collections.Concurrent; | |||||||
| 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 PenumbraResourceLoadEvent(IntPtr drawObject, string gamePath, string filePath); |     public delegate void PenumbraResourceLoadEvent(IntPtr drawObject, string gamePath, string filePath); | ||||||
|     public class IpcManager : IDisposable |     public class IpcManager : IDisposable | ||||||
|     { |     { | ||||||
| @@ -35,6 +36,13 @@ namespace MareSynchronos.Managers | |||||||
|         private readonly ICallGateSubscriber<string, string, Dictionary<string, string>, string, int, int> |         private readonly ICallGateSubscriber<string, string, Dictionary<string, string>, string, int, int> | ||||||
|             _penumbraSetTemporaryMod; |             _penumbraSetTemporaryMod; | ||||||
|         private readonly ICallGateSubscriber<IntPtr, string, string, object?> _penumbraGameObjectResourcePathResolved; |         private readonly ICallGateSubscriber<IntPtr, string, string, object?> _penumbraGameObjectResourcePathResolved; | ||||||
|  |  | ||||||
|  |         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 DalamudUtil _dalamudUtil; | ||||||
|         private readonly ConcurrentQueue<Action> actionQueue = new(); |         private readonly ConcurrentQueue<Action> actionQueue = new(); | ||||||
|  |  | ||||||
| @@ -77,6 +85,15 @@ namespace MareSynchronos.Managers | |||||||
|             _penumbraRemoveTemporaryCollection = |             _penumbraRemoveTemporaryCollection = | ||||||
|                 pi.GetIpcSubscriber<string, int>("Penumbra.RemoveTemporaryCollection"); |                 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) |             if (Initialized) | ||||||
|             { |             { | ||||||
|                 PenumbraInitialized?.Invoke(); |                 PenumbraInitialized?.Invoke(); | ||||||
| @@ -108,6 +125,7 @@ namespace MareSynchronos.Managers | |||||||
|         public event VoidDelegate? PenumbraInitialized; |         public event VoidDelegate? PenumbraInitialized; | ||||||
|         public event VoidDelegate? PenumbraDisposed; |         public event VoidDelegate? PenumbraDisposed; | ||||||
|         public event PenumbraRedrawEvent? PenumbraRedrawEvent; |         public event PenumbraRedrawEvent? PenumbraRedrawEvent; | ||||||
|  |         public event HeelsOffsetChange? HeelsOffsetChangeEvent; | ||||||
|         public event PenumbraResourceLoadEvent? PenumbraResourceLoadEvent; |         public event PenumbraResourceLoadEvent? PenumbraResourceLoadEvent; | ||||||
|  |  | ||||||
|         public bool Initialized => CheckPenumbraApi(); |         public bool Initialized => CheckPenumbraApi(); | ||||||
| @@ -135,6 +153,18 @@ namespace MareSynchronos.Managers | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         public bool CheckHeelsApi() | ||||||
|  |         { | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 return _heelsGetApiVersion.InvokeFunc() == "1.0.1"; | ||||||
|  |             }  | ||||||
|  |             catch | ||||||
|  |             { | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         public void Dispose() |         public void Dispose() | ||||||
|         { |         { | ||||||
|             Logger.Verbose("Disposing " + nameof(IpcManager)); |             Logger.Verbose("Disposing " + nameof(IpcManager)); | ||||||
| @@ -155,6 +185,41 @@ namespace MareSynchronos.Managers | |||||||
|             _penumbraInit.Unsubscribe(PenumbraInit); |             _penumbraInit.Unsubscribe(PenumbraInit); | ||||||
|             _penumbraObjectIsRedrawn.Unsubscribe(RedrawEvent); |             _penumbraObjectIsRedrawn.Unsubscribe(RedrawEvent); | ||||||
|             _penumbraGameObjectResourcePathResolved.Unsubscribe(ResourceLoaded); |             _penumbraGameObjectResourcePathResolved.Unsubscribe(ResourceLoaded); | ||||||
|  |             _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) |         public void GlamourerApplyAll(string? customization, IntPtr obj) | ||||||
| @@ -304,6 +369,11 @@ namespace MareSynchronos.Managers | |||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         private void HeelsOffsetChange(float offset) | ||||||
|  |         { | ||||||
|  |             HeelsOffsetChangeEvent?.Invoke(offset); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         private void RedrawEvent(IntPtr objectAddress, int objectTableIndex) |         private void RedrawEvent(IntPtr objectAddress, int objectTableIndex) | ||||||
|         { |         { | ||||||
|             PenumbraRedrawEvent?.Invoke(objectAddress, objectTableIndex); |             PenumbraRedrawEvent?.Invoke(objectAddress, objectTableIndex); | ||||||
|   | |||||||
| @@ -45,6 +45,7 @@ namespace MareSynchronos.Managers | |||||||
|             _apiController.Disconnected += ApiController_Disconnected; |             _apiController.Disconnected += ApiController_Disconnected; | ||||||
|             _transientResourceManager.TransientResourceLoaded += HandleTransientResourceLoad; |             _transientResourceManager.TransientResourceLoaded += HandleTransientResourceLoad; | ||||||
|             _dalamudUtil.DelayedFrameworkUpdate += DalamudUtilOnDelayedFrameworkUpdate; |             _dalamudUtil.DelayedFrameworkUpdate += DalamudUtilOnDelayedFrameworkUpdate; | ||||||
|  |             _ipcManager.HeelsOffsetChangeEvent += HeelsOffsetChanged; | ||||||
|  |  | ||||||
|             Logger.Debug("Watching Player, ApiController is Connected: " + _apiController.IsConnected); |             Logger.Debug("Watching Player, ApiController is Connected: " + _apiController.IsConnected); | ||||||
|             if (_apiController.IsConnected) |             if (_apiController.IsConnected) | ||||||
| @@ -74,6 +75,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() |         public void Dispose() | ||||||
|         { |         { | ||||||
|             Logger.Verbose("Disposing " + nameof(PlayerManager)); |             Logger.Verbose("Disposing " + nameof(PlayerManager)); | ||||||
| @@ -87,6 +98,7 @@ namespace MareSynchronos.Managers | |||||||
|             _transientResourceManager.TransientResourceLoaded -= HandleTransientResourceLoad; |             _transientResourceManager.TransientResourceLoaded -= HandleTransientResourceLoad; | ||||||
|  |  | ||||||
|             _playerChangedCts?.Cancel(); |             _playerChangedCts?.Cancel(); | ||||||
|  |             _ipcManager.HeelsOffsetChangeEvent -= HeelsOffsetChanged; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         private unsafe void DalamudUtilOnDelayedFrameworkUpdate() |         private unsafe void DalamudUtilOnDelayedFrameworkUpdate() | ||||||
|   | |||||||
| @@ -22,6 +22,9 @@ namespace MareSynchronos.Models | |||||||
|         [JsonProperty] |         [JsonProperty] | ||||||
|         public string ManipulationString { get; set; } = string.Empty; |         public string ManipulationString { get; set; } = string.Empty; | ||||||
|  |  | ||||||
|  |         [JsonProperty] | ||||||
|  |         public float HeelsOffset { get; set; } = 0.0f; | ||||||
|  |  | ||||||
|         public void AddFileReplacement(ObjectKind objectKind, FileReplacement fileReplacement) |         public void AddFileReplacement(ObjectKind objectKind, FileReplacement fileReplacement) | ||||||
|         { |         { | ||||||
|             if (!fileReplacement.HasFileReplacement) return; |             if (!fileReplacement.HasFileReplacement) return; | ||||||
| @@ -67,7 +70,8 @@ namespace MareSynchronos.Models | |||||||
|             { |             { | ||||||
|                 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 | ||||||
|             }; |             }; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -114,9 +114,11 @@ namespace MareSynchronos.UI | |||||||
|         { |         { | ||||||
|             var penumbraExists = _ipcManager.CheckPenumbraApi(); |             var penumbraExists = _ipcManager.CheckPenumbraApi(); | ||||||
|             var glamourerExists = _ipcManager.CheckGlamourerApi(); |             var glamourerExists = _ipcManager.CheckGlamourerApi(); | ||||||
|  |             var heelsExists = _ipcManager.CheckHeelsApi(); | ||||||
|  |  | ||||||
|             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; | ||||||
|             ImGui.Text("Penumbra:"); |             ImGui.Text("Penumbra:"); | ||||||
|             ImGui.SameLine(); |             ImGui.SameLine(); | ||||||
|             ImGui.TextColored(penumbraColor, penumbraExists ? "Available" : "Unavailable"); |             ImGui.TextColored(penumbraColor, penumbraExists ? "Available" : "Unavailable"); | ||||||
| @@ -124,6 +126,11 @@ namespace MareSynchronos.UI | |||||||
|             ImGui.Text("Glamourer:"); |             ImGui.Text("Glamourer:"); | ||||||
|             ImGui.SameLine(); |             ImGui.SameLine(); | ||||||
|             ImGui.TextColored(glamourerColor, glamourerExists ? "Available" : "Unavailable"); |             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) |             if (!penumbraExists || !glamourerExists) | ||||||
|             { |             { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Stanley Dimant
					Stanley Dimant