From 2e92a6d74868c3dd075ff37bb98aaf8c71d1c735 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Wed, 7 Sep 2022 22:17:10 +0200 Subject: [PATCH 1/2] fix sending data to everyone always. oops. --- MareSynchronos/Managers/OnlinePlayerManager.cs | 2 +- MareSynchronos/MareSynchronos.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/MareSynchronos/Managers/OnlinePlayerManager.cs b/MareSynchronos/Managers/OnlinePlayerManager.cs index 1dfbed3..e98aea4 100644 --- a/MareSynchronos/Managers/OnlinePlayerManager.cs +++ b/MareSynchronos/Managers/OnlinePlayerManager.cs @@ -24,7 +24,7 @@ public class OnlinePlayerManager : IDisposable private readonly ConcurrentDictionary _temporaryStoredCharacterCache = new(); private readonly ConcurrentDictionary _playerTokenDisposal = new(); - private List OnlineVisiblePlayerHashes => _onlineCachedPlayers.Select(p => p.Value).Where(p => p.PlayerCharacter != null) + private List OnlineVisiblePlayerHashes => _onlineCachedPlayers.Select(p => p.Value).Where(p => p.PlayerCharacter != IntPtr.Zero) .Select(p => p.PlayerNameHash).ToList(); private DateTime _lastPlayerObjectCheck = DateTime.Now; diff --git a/MareSynchronos/MareSynchronos.csproj b/MareSynchronos/MareSynchronos.csproj index 4a7c6c3..3c68ea7 100644 --- a/MareSynchronos/MareSynchronos.csproj +++ b/MareSynchronos/MareSynchronos.csproj @@ -3,7 +3,7 @@ - 0.3.13 + 0.3.14 https://github.com/Penumbra-Sync/client From d5068d55159194acddd16fca11f3cf41daa14b18 Mon Sep 17 00:00:00 2001 From: Stanley Dimant Date: Sat, 10 Sep 2022 14:11:52 +0200 Subject: [PATCH 2/2] add heels support --- MareAPI | 2 +- .../Factories/CharacterDataFactory.cs | 2 + MareSynchronos/Managers/CachedPlayer.cs | 16 ++++- MareSynchronos/Managers/IpcManager.cs | 70 +++++++++++++++++++ MareSynchronos/Managers/PlayerManager.cs | 12 ++++ MareSynchronos/Models/CharacterData.cs | 6 +- MareSynchronos/UI/UIShared.cs | 7 ++ 7 files changed, 111 insertions(+), 4 deletions(-) diff --git a/MareAPI b/MareAPI index 9bb99a5..9dc1e90 160000 --- a/MareAPI +++ b/MareAPI @@ -1 +1 @@ -Subproject commit 9bb99a5e68196165b9c1360acff198c4731164d1 +Subproject commit 9dc1e901aa453e65bb432b2b288c1ff00021700a diff --git a/MareSynchronos/Factories/CharacterDataFactory.cs b/MareSynchronos/Factories/CharacterDataFactory.cs index fd3de0a..28c2bde 100644 --- a/MareSynchronos/Factories/CharacterDataFactory.cs +++ b/MareSynchronos/Factories/CharacterDataFactory.cs @@ -277,6 +277,8 @@ public class CharacterDataFactory { Logger.Warn("Could not get Legacy Body Decal Data"); } + + previousData.HeelsOffset = _ipcManager.GetHeelsOffset(); } st.Stop(); diff --git a/MareSynchronos/Managers/CachedPlayer.cs b/MareSynchronos/Managers/CachedPlayer.cs index 2380168..72acd7e 100644 --- a/MareSynchronos/Managers/CachedPlayer.cs +++ b/MareSynchronos/Managers/CachedPlayer.cs @@ -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) { diff --git a/MareSynchronos/Managers/IpcManager.cs b/MareSynchronos/Managers/IpcManager.cs index c545764..ee88898 100644 --- a/MareSynchronos/Managers/IpcManager.cs +++ b/MareSynchronos/Managers/IpcManager.cs @@ -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 _glamourerApiVersion; @@ -33,6 +34,13 @@ namespace MareSynchronos.Managers private readonly ICallGateSubscriber? _reverseResolvePlayer; private readonly ICallGateSubscriber, string, int, int> _penumbraSetTemporaryMod; + + private readonly ICallGateSubscriber _heelsGetApiVersion; + private readonly ICallGateSubscriber _heelsGetOffset; + private readonly ICallGateSubscriber _heelsOffsetUpdate; + private readonly ICallGateSubscriber _heelsRegisterPlayer; + private readonly ICallGateSubscriber _heelsUnregisterPlayer; + private readonly DalamudUtil _dalamudUtil; private readonly ConcurrentQueue actionQueue = new(); @@ -73,6 +81,15 @@ namespace MareSynchronos.Managers _penumbraRemoveTemporaryCollection = pi.GetIpcSubscriber("Penumbra.RemoveTemporaryCollection"); + _heelsGetApiVersion = pi.GetIpcSubscriber("HeelsPlugin.ApiVersion"); + _heelsGetOffset = pi.GetIpcSubscriber("HeelsPlugin.GetOffset"); + _heelsRegisterPlayer = pi.GetIpcSubscriber("HeelsPlugin.RegisterPlayer"); + _heelsUnregisterPlayer = pi.GetIpcSubscriber("HeelsPlugin.UnregisterPlayer"); + _heelsOffsetUpdate = pi.GetIpcSubscriber("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); diff --git a/MareSynchronos/Managers/PlayerManager.cs b/MareSynchronos/Managers/PlayerManager.cs index a978fb5..b5195a0 100644 --- a/MareSynchronos/Managers/PlayerManager.cs +++ b/MareSynchronos/Managers/PlayerManager.cs @@ -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() diff --git a/MareSynchronos/Models/CharacterData.cs b/MareSynchronos/Models/CharacterData.cs index 4a76b7a..f0dd168 100644 --- a/MareSynchronos/Models/CharacterData.cs +++ b/MareSynchronos/Models/CharacterData.cs @@ -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 }; } diff --git a/MareSynchronos/UI/UIShared.cs b/MareSynchronos/UI/UIShared.cs index e6226ad..7e08337 100644 --- a/MareSynchronos/UI/UIShared.cs +++ b/MareSynchronos/UI/UIShared.cs @@ -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) {