mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 10:17:22 +01:00
feat: rework network message API again
This commit is contained in:
parent
10d91031dd
commit
193dab20a4
3 changed files with 18 additions and 21 deletions
|
|
@ -11,7 +11,7 @@ namespace Dalamud.Game.Internal.Network {
|
|||
#region Hooks
|
||||
|
||||
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
|
||||
private delegate void ProcessZonePacketDownDelegate(IntPtr a, IntPtr b, IntPtr dataPtr);
|
||||
private delegate void ProcessZonePacketDownDelegate(IntPtr a, uint targetId, IntPtr dataPtr);
|
||||
private readonly Hook<ProcessZonePacketDownDelegate> processZonePacketDownHook;
|
||||
|
||||
[UnmanagedFunctionPointer(CallingConvention.ThisCall)]
|
||||
|
|
@ -23,7 +23,7 @@ namespace Dalamud.Game.Internal.Network {
|
|||
private GameNetworkAddressResolver Address { get; }
|
||||
private IntPtr baseAddress;
|
||||
|
||||
public delegate void OnNetworkMessageDelegate(IntPtr dataPtr, NetworkMessageDirection direction);
|
||||
public delegate void OnNetworkMessageDelegate(IntPtr dataPtr, ushort opCode, uint targetId, NetworkMessageDirection direction);
|
||||
|
||||
/// <summary>
|
||||
/// Event that is called when a network message is sent/received.
|
||||
|
|
@ -63,14 +63,14 @@ namespace Dalamud.Game.Internal.Network {
|
|||
this.processZonePacketUpHook.Dispose();
|
||||
}
|
||||
|
||||
private void ProcessZonePacketDownDetour(IntPtr a, IntPtr b, IntPtr dataPtr) {
|
||||
private void ProcessZonePacketDownDetour(IntPtr a, uint targetId, IntPtr dataPtr) {
|
||||
this.baseAddress = a;
|
||||
|
||||
try {
|
||||
// Call events
|
||||
this.OnNetworkMessage?.Invoke(dataPtr, NetworkMessageDirection.ZoneDown);
|
||||
this.OnNetworkMessage?.Invoke(dataPtr + 0x10, (ushort) Marshal.ReadInt16(dataPtr, 2), targetId, NetworkMessageDirection.ZoneDown);
|
||||
|
||||
this.processZonePacketDownHook.Original(a, b, dataPtr);
|
||||
this.processZonePacketDownHook.Original(a, targetId, dataPtr);
|
||||
} catch (Exception ex) {
|
||||
string header;
|
||||
try {
|
||||
|
|
@ -83,7 +83,7 @@ namespace Dalamud.Game.Internal.Network {
|
|||
|
||||
Log.Error(ex, "Exception on ProcessZonePacketDown hook. Header: " + header);
|
||||
|
||||
this.processZonePacketDownHook.Original(a, b, dataPtr);
|
||||
this.processZonePacketDownHook.Original(a, targetId, dataPtr);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -92,7 +92,7 @@ namespace Dalamud.Game.Internal.Network {
|
|||
try
|
||||
{
|
||||
// Call events
|
||||
this.OnNetworkMessage?.Invoke(dataPtr, NetworkMessageDirection.ZoneUp);
|
||||
this.OnNetworkMessage?.Invoke(dataPtr + 0x20, (ushort) Marshal.ReadInt16(dataPtr), 0x0, NetworkMessageDirection.ZoneUp);
|
||||
|
||||
var op = Marshal.ReadInt16(dataPtr);
|
||||
var length = Marshal.ReadInt16(dataPtr, 8);
|
||||
|
|
@ -153,7 +153,7 @@ namespace Dalamud.Game.Internal.Network {
|
|||
Marshal.Copy(packetData, 0, unmanagedPacketData, packetData.Length);
|
||||
|
||||
if (this.baseAddress != IntPtr.Zero) {
|
||||
this.processZonePacketDownHook.Original(this.baseAddress, IntPtr.Zero, unmanagedPacketData);
|
||||
this.processZonePacketDownHook.Original(this.baseAddress, 0, unmanagedPacketData);
|
||||
}
|
||||
|
||||
Marshal.FreeHGlobal(unmanagedPacketData);
|
||||
|
|
|
|||
|
|
@ -37,21 +37,19 @@ namespace Dalamud.Game.Network {
|
|||
|
||||
}
|
||||
|
||||
private void OnNetworkMessage(IntPtr dataPtr, NetworkMessageDirection direction) {
|
||||
private void OnNetworkMessage(IntPtr dataPtr, ushort opCode, uint targetId, NetworkMessageDirection direction) {
|
||||
if (direction != NetworkMessageDirection.ZoneDown)
|
||||
return;
|
||||
|
||||
if (!this.dalamud.Data.IsDataReady)
|
||||
return;
|
||||
|
||||
var opCode = (ushort) Marshal.ReadInt16(dataPtr, 2);
|
||||
|
||||
if (opCode == this.dalamud.Data.ServerOpCodes["CfNotifyPop"]) {
|
||||
var data = new byte[64];
|
||||
Marshal.Copy(dataPtr, data, 0, 64);
|
||||
|
||||
var notifyType = data[16];
|
||||
var contentFinderConditionId = BitConverter.ToUInt16(data, 36);
|
||||
var notifyType = data[0];
|
||||
var contentFinderConditionId = BitConverter.ToUInt16(data, 0x14);
|
||||
|
||||
if (notifyType != 3)
|
||||
return;
|
||||
|
|
@ -103,8 +101,8 @@ namespace Dalamud.Game.Network {
|
|||
|
||||
Task.Run(async () => {
|
||||
for (var rouletteIndex = 1; rouletteIndex < 11; rouletteIndex++) {
|
||||
var currentRoleKey = data[16 + rouletteIndex];
|
||||
var prevRoleKey = this.lastPreferredRole[16 + rouletteIndex];
|
||||
var currentRoleKey = data[rouletteIndex];
|
||||
var prevRoleKey = this.lastPreferredRole[rouletteIndex];
|
||||
|
||||
Log.Verbose("CfPreferredRole: {0} - {1} => {2}", rouletteIndex, prevRoleKey, currentRoleKey);
|
||||
|
||||
|
|
@ -145,8 +143,8 @@ namespace Dalamud.Game.Network {
|
|||
|
||||
if (!this.optOutMbUploads) {
|
||||
if (opCode == this.dalamud.Data.ServerOpCodes["MarketBoardItemRequestStart"]) {
|
||||
var catalogId = (uint) Marshal.ReadInt32(dataPtr + 0x10);
|
||||
var amount = Marshal.ReadByte(dataPtr + 0x1B);
|
||||
var catalogId = (uint) Marshal.ReadInt32(dataPtr);
|
||||
var amount = Marshal.ReadByte(dataPtr + 0xB);
|
||||
|
||||
this.marketBoardRequests.Add(new MarketBoardItemRequest {
|
||||
CatalogId = catalogId,
|
||||
|
|
@ -160,7 +158,7 @@ namespace Dalamud.Game.Network {
|
|||
}
|
||||
|
||||
if (opCode == this.dalamud.Data.ServerOpCodes["MarketBoardOfferings"]) {
|
||||
var listing = MarketBoardCurrentOfferings.Read(dataPtr + 0x10);
|
||||
var listing = MarketBoardCurrentOfferings.Read(dataPtr);
|
||||
|
||||
var request =
|
||||
this.marketBoardRequests.LastOrDefault(
|
||||
|
|
@ -215,7 +213,7 @@ namespace Dalamud.Game.Network {
|
|||
}
|
||||
|
||||
if (opCode == this.dalamud.Data.ServerOpCodes["MarketBoardHistory"]) {
|
||||
var listing = MarketBoardHistory.Read(dataPtr + 0x10);
|
||||
var listing = MarketBoardHistory.Read(dataPtr);
|
||||
|
||||
var request = this.marketBoardRequests.LastOrDefault(r => r.CatalogId == listing.CatalogId);
|
||||
|
||||
|
|
@ -238,7 +236,7 @@ namespace Dalamud.Game.Network {
|
|||
|
||||
if (opCode == this.dalamud.Data.ServerOpCodes["MarketTaxRates"])
|
||||
{
|
||||
var taxes = MarketTaxRates.Read(dataPtr + 0x10);
|
||||
var taxes = MarketTaxRates.Read(dataPtr);
|
||||
|
||||
Log.Verbose("MarketTaxRates: limsa#{0} grid#{1} uldah#{2} ish#{3} kugane#{4} cr#{5}",
|
||||
taxes.LimsaLominsaTax, taxes.GridaniaTax, taxes.UldahTax, taxes.IshgardTax, taxes.KuganeTax, taxes.CrystariumTax);
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@ namespace Dalamud.Interface
|
|||
// If another game is running, we don't want to just fail in here
|
||||
Log.Error(ex, "Could not download asset.");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue