Switch to CS in NetworkMonitorWidget (#2600)
Some checks failed
Tag Build / Tag Build (push) Successful in 2s
Build Dalamud / Build on Windows (push) Has been cancelled
Build Dalamud / Check API Compatibility (push) Has been cancelled
Build Dalamud / Deploy dalamud-distrib staging (push) Has been cancelled

* Switch to CS in NetworkMonitorWidget

* Lazy-init the hooks

* Fix warnings
This commit is contained in:
Haselnussbomber 2026-01-31 21:57:11 +01:00 committed by GitHub
parent aa4ace976e
commit 33a7cdefa8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 16 additions and 22 deletions

View file

@ -336,7 +336,7 @@ internal sealed unsafe class ContextMenu : IInternalDisposableService, IContextM
this.MenuCallbackIds.Clear(); this.MenuCallbackIds.Clear();
this.SelectedAgent = agent; this.SelectedAgent = agent;
var unitManager = RaptureAtkUnitManager.Instance(); var unitManager = RaptureAtkUnitManager.Instance();
this.SelectedParentAddon = unitManager->GetAddonById(unitManager->GetAddonByName(addonName)->ContextMenuParentId); this.SelectedParentAddon = unitManager->GetAddonById(unitManager->GetAddonByName(addonName)->BlockedParentId);
this.SelectedEventInterfaces.Clear(); this.SelectedEventInterfaces.Clear();
if (this.SelectedAgent == AgentInventoryContext.Instance()) if (this.SelectedAgent == AgentInventoryContext.Instance())
{ {

View file

@ -62,7 +62,7 @@ internal class GaugeWidget : IDataWindowWidget
40 => jobGauges.Get<SGEGauge>(), 40 => jobGauges.Get<SGEGauge>(),
41 => jobGauges.Get<VPRGauge>(), 41 => jobGauges.Get<VPRGauge>(),
42 => jobGauges.Get<PCTGauge>(), 42 => jobGauges.Get<PCTGauge>(),
_ => null _ => null,
}; };
if (gauge == null) if (gauge == null)

View file

@ -50,7 +50,7 @@ internal unsafe class HookWidget : IDataWindowWidget
{ {
MessageBoxW, MessageBoxW,
AddonFinalize, AddonFinalize,
Random Random,
} }
/// <inheritdoc/> /// <inheritdoc/>

View file

@ -2,7 +2,6 @@ using System.Collections.Concurrent;
using System.Threading; using System.Threading;
using Dalamud.Bindings.ImGui; using Dalamud.Bindings.ImGui;
using Dalamud.Game;
using Dalamud.Hooking; using Dalamud.Hooking;
using Dalamud.Interface.Components; using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Utility.Raii;
@ -23,7 +22,7 @@ internal unsafe class NetworkMonitorWidget : IDataWindowWidget
private readonly ConcurrentQueue<NetworkPacketData> packets = new(); private readonly ConcurrentQueue<NetworkPacketData> packets = new();
private Hook<PacketDispatcher.Delegates.OnReceivePacket>? hookDown; private Hook<PacketDispatcher.Delegates.OnReceivePacket>? hookDown;
private Hook<ZoneClientSendPacketDelegate>? hookUp; private Hook<ZoneClient.Delegates.SendPacket>? hookUp;
private bool trackNetwork; private bool trackNetwork;
private int trackedPackets = 20; private int trackedPackets = 20;
@ -40,8 +39,6 @@ internal unsafe class NetworkMonitorWidget : IDataWindowWidget
this.hookUp?.Dispose(); this.hookUp?.Dispose();
} }
private delegate byte ZoneClientSendPacketDelegate(ZoneClient* thisPtr, nint packet, uint a3, uint a4, byte a5);
private enum NetworkMessageDirection private enum NetworkMessageDirection
{ {
ZoneDown, ZoneDown,
@ -58,22 +55,19 @@ internal unsafe class NetworkMonitorWidget : IDataWindowWidget
public bool Ready { get; set; } public bool Ready { get; set; }
/// <inheritdoc/> /// <inheritdoc/>
public void Load() public void Load() => this.Ready = true;
{
this.hookDown = Hook<PacketDispatcher.Delegates.OnReceivePacket>.FromAddress(
(nint)PacketDispatcher.StaticVirtualTablePointer->OnReceivePacket,
this.OnReceivePacketDetour);
// TODO: switch to ZoneClient.SendPacket from CS
if (Service<TargetSigScanner>.Get().TryScanText("E8 ?? ?? ?? ?? 4C 8B 44 24 ?? E9", out var address))
this.hookUp = Hook<ZoneClientSendPacketDelegate>.FromAddress(address, this.SendPacketDetour);
this.Ready = true;
}
/// <inheritdoc/> /// <inheritdoc/>
public void Draw() public void Draw()
{ {
this.hookDown ??= Hook<PacketDispatcher.Delegates.OnReceivePacket>.FromAddress(
(nint)PacketDispatcher.StaticVirtualTablePointer->OnReceivePacket,
this.OnReceivePacketDetour);
this.hookUp ??= Hook<ZoneClient.Delegates.SendPacket>.FromAddress(
(nint)ZoneClient.MemberFunctionPointers.SendPacket,
this.SendPacketDetour);
if (ImGui.Checkbox("Track Network Packets"u8, ref this.trackNetwork)) if (ImGui.Checkbox("Track Network Packets"u8, ref this.trackNetwork))
{ {
if (this.trackNetwork) if (this.trackNetwork)
@ -213,7 +207,7 @@ internal unsafe class NetworkMonitorWidget : IDataWindowWidget
this.hookDown.OriginalDisposeSafe(thisPtr, targetId, packet); this.hookDown.OriginalDisposeSafe(thisPtr, targetId, packet);
} }
private byte SendPacketDetour(ZoneClient* thisPtr, nint packet, uint a3, uint a4, byte a5) private bool SendPacketDetour(ZoneClient* thisPtr, nint packet, uint a3, uint a4, bool a5)
{ {
var opCode = *(ushort*)packet; var opCode = *(ushort*)packet;
this.RecordPacket(new NetworkPacketData(Interlocked.Increment(ref this.nextPacketIndex), DateTime.Now, opCode, NetworkMessageDirection.ZoneUp, 0, string.Empty)); this.RecordPacket(new NetworkPacketData(Interlocked.Increment(ref this.nextPacketIndex), DateTime.Now, opCode, NetworkMessageDirection.ZoneUp, 0, string.Empty));

View file

@ -1,4 +1,4 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
@ -322,7 +322,7 @@ public interface ITextureProvider : IDalamudService
/// <param name="leaveWrapOpen">Whether to leave <paramref name="wrap"/> non-disposed when the returned /// <param name="leaveWrapOpen">Whether to leave <paramref name="wrap"/> non-disposed when the returned
/// <see cref="Task{TResult}"/> completes.</param> /// <see cref="Task{TResult}"/> completes.</param>
/// <returns>Address of the new <see cref="FFXIVClientStructs.FFXIV.Client.Graphics.Kernel.Texture"/>.</returns> /// <returns>Address of the new <see cref="FFXIVClientStructs.FFXIV.Client.Graphics.Kernel.Texture"/>.</returns>
/// <example>See <c>PrintTextureInfo</c> in <see cref="Interface.Internal.UiDebug.Browsing.ImageNodeTre"/> for an example /// <example>See <c>PrintTextureInfo</c> in <see cref="Interface.Internal.UiDebug.Browsing.ImageNodeTree"/> for an example
/// of replacing the texture of an image node.</example> /// of replacing the texture of an image node.</example>
/// <remarks> /// <remarks>
/// <para>If the returned kernel texture is to be destroyed, call the fourth function in its vtable, by calling /// <para>If the returned kernel texture is to be destroyed, call the fourth function in its vtable, by calling