feat: rework network message API again

This commit is contained in:
goat 2020-04-28 19:50:47 +02:00
parent 10d91031dd
commit 193dab20a4
3 changed files with 18 additions and 21 deletions

View file

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

View file

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

View file

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