refactor: move examine function into XivCommon

This commit is contained in:
Anna 2021-04-13 09:33:06 -04:00
parent bed788ea1c
commit 0e0a0143d2
4 changed files with 21 additions and 93 deletions

View File

@ -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<RequestCharInfoDelegate>(rciPtr);
}
private static IntPtr FollowPtrChain(IntPtr start, IEnumerable<int> 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<GetListDelegate>(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);
}
}
}

View File

@ -44,5 +44,6 @@
<PackageReference Include="ILMerge.Fody" Version="1.16.0" PrivateAssets="all"/>
<PackageReference Include="NAudio" Version="2.0.0"/>
<PackageReference Include="Resourcer.Fody" Version="1.8.0" PrivateAssets="all"/>
<PackageReference Include="XivCommon" Version="1.2.0"/>
</ItemGroup>
</Project>

View File

@ -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<TerritoryType>().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();
}

View File

@ -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),