diff --git a/Peeping Tom/GameFunctions.cs b/Peeping Tom/GameFunctions.cs deleted file mode 100644 index 5a6ffa5..0000000 --- a/Peeping Tom/GameFunctions.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Dalamud.Game.ClientState.Actors.Types; -using Dalamud.Plugin; -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; - -namespace PeepingTom { - public class GameFunctions { - private delegate IntPtr GetListDelegate(IntPtr basePtr); - private delegate long RequestCharInfoDelegate(IntPtr ptr); - - private PeepingTomPlugin Plugin { get; } - - private readonly RequestCharInfoDelegate? _requestCharInfo; - - public GameFunctions(PeepingTomPlugin plugin) { - this.Plugin = plugin ?? throw new ArgumentNullException(nameof(plugin), "PeepingTomPlugin cannot be null"); - - IntPtr rciPtr; - try { - // got this by checking what accesses rciData below - rciPtr = this.Plugin.Interface.TargetModuleScanner.ScanText("48 89 5C 24 ?? 57 48 83 EC 40 BA ?? ?? ?? ?? 48 8B D9 E8 ?? ?? ?? ?? 48 8B F8 48 85 C0 74 16"); - } catch (KeyNotFoundException) { - rciPtr = IntPtr.Zero; - } - if (rciPtr == IntPtr.Zero) { - PluginLog.Log("Could not find the signature for the examine window function - will not be able to open examine window."); - return; - } - - this._requestCharInfo = Marshal.GetDelegateForFunctionPointer(rciPtr); - } - - private static IntPtr FollowPtrChain(IntPtr start, IEnumerable offsets) { - foreach (var offset in offsets) { - start = Marshal.ReadIntPtr(start, offset); - if (start == IntPtr.Zero) { - break; - } - } - - return start; - } - - public void OpenExamineWindow(Actor actor) { - if (this._requestCharInfo == null) { - return; - } - - // NOTES LAST UPDATED: 5.45 - - // offsets and stuff come from the beginning of case 0x2c (around line 621 in IDA) - // if 29f8 ever changes, I'd just scan for it in old binary and find what it is in the new binary at the same spot - // 40 55 53 57 41 54 41 55 41 56 48 8D 6C 24 ?? - var uiModule = this.Plugin.Interface.Framework.Gui.GetUIModule(); - var getListPtr = FollowPtrChain(uiModule, new[] {0, 0x110}); - var getList = Marshal.GetDelegateForFunctionPointer(getListPtr); - var list = getList(uiModule); - var rciData = Marshal.ReadIntPtr(list + 0x1A0); - - unsafe { - // offsets at sig E8 ?? ?? ?? ?? 33 C0 EB 4C - // this is called at the end of the 2c case - var raw = (int*) rciData; - *(raw + 10) = actor.ActorId; - *(raw + 11) = actor.ActorId; - *(raw + 12) = actor.ActorId; - *(raw + 13) = -536870912; - *(raw + 311) = 0; - } - - this._requestCharInfo(rciData); - } - } -} diff --git a/Peeping Tom/Peeping Tom.csproj b/Peeping Tom/Peeping Tom.csproj index 890f94c..01f9cd2 100755 --- a/Peeping Tom/Peeping Tom.csproj +++ b/Peeping Tom/Peeping Tom.csproj @@ -44,5 +44,6 @@ + diff --git a/Peeping Tom/Plugin.cs b/Peeping Tom/Plugin.cs index 50561ee..5148a36 100644 --- a/Peeping Tom/Plugin.cs +++ b/Peeping Tom/Plugin.cs @@ -3,6 +3,7 @@ using Dalamud.Plugin; using System; using System.Collections.Generic; using Lumina.Excel.GeneratedSheets; +using XivCommon; namespace PeepingTom { public class PeepingTomPlugin : IDalamudPlugin { @@ -12,16 +13,16 @@ namespace PeepingTom { internal Configuration Config { get; private set; } = null!; internal PluginUi Ui { get; private set; } = null!; internal TargetWatcher Watcher { get; private set; } = null!; - internal GameFunctions GameFunctions { get; private set; } = null!; + internal XivCommonBase Common { get; private set; } = null!; internal bool InPvp { get; private set; } public void Initialize(DalamudPluginInterface pluginInterface) { - this.Interface = pluginInterface ?? throw new ArgumentNullException(nameof(pluginInterface), "DalamudPluginInterface argument was null"); + this.Interface = pluginInterface; + this.Common = new XivCommonBase(this.Interface); this.Config = this.Interface.GetPluginConfig() as Configuration ?? new Configuration(); this.Config.Initialize(this.Interface); this.Watcher = new TargetWatcher(this); - this.GameFunctions = new GameFunctions(this); this.Ui = new PluginUi(this); this.Interface.CommandManager.AddHandler("/ppeepingtom", new CommandInfo(this.OnCommand) { @@ -44,6 +45,21 @@ namespace PeepingTom { this.Watcher.StartThread(); } + public void Dispose() { + this.Common.Dispose(); + this.Interface.Framework.OnUpdateEvent -= this.Watcher.OnFrameworkUpdate; + this.Interface.ClientState.OnLogin -= this.OnLogin; + this.Interface.ClientState.OnLogout -= this.OnLogout; + this.Watcher.WaitStopThread(); + this.Watcher.Dispose(); + this.Interface.UiBuilder.OnBuildUi -= this.DrawUi; + this.Interface.UiBuilder.OnOpenConfigUi -= this.ConfigUi; + this.Interface.CommandManager.RemoveHandler("/ppeepingtom"); + this.Interface.CommandManager.RemoveHandler("/ptom"); + this.Interface.CommandManager.RemoveHandler("/ppeep"); + this.Ui.Dispose(); + } + private void OnTerritoryChange(object sender, ushort e) { try { var territory = this.Interface.Data.GetExcelSheet().GetRow(e); @@ -74,20 +90,6 @@ namespace PeepingTom { this.Watcher.ClearPrevious(); } - public void Dispose() { - this.Interface.Framework.OnUpdateEvent -= this.Watcher.OnFrameworkUpdate; - this.Interface.ClientState.OnLogin -= this.OnLogin; - this.Interface.ClientState.OnLogout -= this.OnLogout; - this.Watcher.WaitStopThread(); - this.Watcher.Dispose(); - this.Interface.UiBuilder.OnBuildUi -= this.DrawUi; - this.Interface.UiBuilder.OnOpenConfigUi -= this.ConfigUi; - this.Interface.CommandManager.RemoveHandler("/ppeepingtom"); - this.Interface.CommandManager.RemoveHandler("/ptom"); - this.Interface.CommandManager.RemoveHandler("/ppeep"); - this.Ui.Dispose(); - } - private void DrawUi() { this.Ui.Draw(); } diff --git a/Peeping Tom/PluginUi.cs b/Peeping Tom/PluginUi.cs index 4a84f0e..b67053f 100644 --- a/Peeping Tom/PluginUi.cs +++ b/Peeping Tom/PluginUi.cs @@ -544,7 +544,7 @@ namespace PeepingTom { if (left) { if (this.Plugin.Config.OpenExamine && ImGui.GetIO().KeyAlt) { if (actor != null) { - this.Plugin.GameFunctions.OpenExamineWindow(actor); + this.Plugin.Common.Functions.Examine.OpenExamineWindow(actor); } else { var error = new SeString(new Payload[] { new PlayerPayload(this.Plugin.Interface.Data, targeter.Name, targeter.HomeWorld.Id),