mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 18:27:23 +01:00
Implement market board purchase message reading
Originally from d85146c0d9
This commit is contained in:
parent
41931dcb2d
commit
8b8d1ca74c
3 changed files with 132 additions and 5 deletions
|
|
@ -15,7 +15,7 @@ using Serilog;
|
||||||
namespace Dalamud.Game.Network
|
namespace Dalamud.Game.Network
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// This class handles network notifications and uploading Marketboard data.
|
/// This class handles network notifications and uploading market board data.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class NetworkHandlers
|
public class NetworkHandlers
|
||||||
{
|
{
|
||||||
|
|
@ -23,6 +23,8 @@ namespace Dalamud.Game.Network
|
||||||
|
|
||||||
private readonly List<MarketBoardItemRequest> marketBoardRequests = new();
|
private readonly List<MarketBoardItemRequest> marketBoardRequests = new();
|
||||||
|
|
||||||
|
private MarketBoardPurchaseHandler marketBoardPurchaseHandler;
|
||||||
|
|
||||||
private readonly bool optOutMbUploads;
|
private readonly bool optOutMbUploads;
|
||||||
private readonly IMarketBoardUploader uploader;
|
private readonly IMarketBoardUploader uploader;
|
||||||
|
|
||||||
|
|
@ -30,7 +32,7 @@ namespace Dalamud.Game.Network
|
||||||
/// Initializes a new instance of the <see cref="NetworkHandlers"/> class.
|
/// Initializes a new instance of the <see cref="NetworkHandlers"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dalamud">The Dalamud instance.</param>
|
/// <param name="dalamud">The Dalamud instance.</param>
|
||||||
/// <param name="optOutMbUploads">Whether the client should opt out of marketboard uploads.</param>
|
/// <param name="optOutMbUploads">Whether the client should opt out of market board uploads.</param>
|
||||||
public NetworkHandlers(Dalamud dalamud, bool optOutMbUploads)
|
public NetworkHandlers(Dalamud dalamud, bool optOutMbUploads)
|
||||||
{
|
{
|
||||||
this.dalamud = dalamud;
|
this.dalamud = dalamud;
|
||||||
|
|
@ -48,12 +50,22 @@ namespace Dalamud.Game.Network
|
||||||
|
|
||||||
private void OnNetworkMessage(IntPtr dataPtr, ushort opCode, uint sourceActorId, uint targetActorId, NetworkMessageDirection direction)
|
private void OnNetworkMessage(IntPtr dataPtr, ushort opCode, uint sourceActorId, uint targetActorId, NetworkMessageDirection direction)
|
||||||
{
|
{
|
||||||
if (direction != NetworkMessageDirection.ZoneDown)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!this.dalamud.Data.IsDataReady)
|
if (!this.dalamud.Data.IsDataReady)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (direction == NetworkMessageDirection.ZoneUp)
|
||||||
|
{
|
||||||
|
if (!this.optOutMbUploads)
|
||||||
|
{
|
||||||
|
if (opCode == this.dalamud.Data.ClientOpCodes["MarketBoardPurchaseHandler"])
|
||||||
|
{
|
||||||
|
this.marketBoardPurchaseHandler = MarketBoardPurchaseHandler.Read(dataPtr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (opCode == this.dalamud.Data.ServerOpCodes["CfNotifyPop"])
|
if (opCode == this.dalamud.Data.ServerOpCodes["CfNotifyPop"])
|
||||||
{
|
{
|
||||||
var data = new byte[64];
|
var data = new byte[64];
|
||||||
|
|
@ -256,6 +268,24 @@ namespace Dalamud.Game.Network
|
||||||
Log.Error(ex, "Market Board data upload failed.");
|
Log.Error(ex, "Market Board data upload failed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opCode == this.dalamud.Data.ServerOpCodes["MarketBoardPurchase"])
|
||||||
|
{
|
||||||
|
if (this.marketBoardPurchaseHandler == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var purchase = MarketBoardPurchase.Read(dataPtr);
|
||||||
|
|
||||||
|
// Transaction succeeded
|
||||||
|
if (purchase.ItemQuantity == this.marketBoardPurchaseHandler.ItemQuantity
|
||||||
|
&& (purchase.CatalogId == this.marketBoardPurchaseHandler.CatalogId
|
||||||
|
|| purchase.CatalogId == this.marketBoardPurchaseHandler.CatalogId + 1000000))
|
||||||
|
{ // HQ
|
||||||
|
Log.Information("Bought " + purchase.ItemQuantity + "x " + this.marketBoardPurchaseHandler.CatalogId + " for " + (this.marketBoardPurchaseHandler.PricePerUnit * purchase.ItemQuantity) + " gils, listing id is " + this.marketBoardPurchaseHandler.ListingId);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.marketBoardPurchaseHandler = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
40
Dalamud/Game/Network/Structures/MarketBoardPurchase.cs
Normal file
40
Dalamud/Game/Network/Structures/MarketBoardPurchase.cs
Normal file
|
|
@ -0,0 +1,40 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Network.Structures
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents market board purchase information. This message is received from the
|
||||||
|
/// server when a purchase is made at a market board.
|
||||||
|
/// </summary>
|
||||||
|
internal class MarketBoardPurchase
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the item ID of the item that was purchased.
|
||||||
|
/// </summary>
|
||||||
|
public uint CatalogId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the quantity of the item that was purchased.
|
||||||
|
/// </summary>
|
||||||
|
public uint ItemQuantity { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads market board purchase information from the struct at the provided pointer.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dataPtr">A pointer to a struct containing market board purchase information from the server.</param>
|
||||||
|
/// <returns>An object representing the data read.</returns>
|
||||||
|
public static unsafe MarketBoardPurchase Read(IntPtr dataPtr)
|
||||||
|
{
|
||||||
|
var output = new MarketBoardPurchase();
|
||||||
|
|
||||||
|
using var stream = new UnmanagedMemoryStream((byte*)dataPtr.ToPointer(), 1544);
|
||||||
|
using var reader = new BinaryReader(stream);
|
||||||
|
output.CatalogId = reader.ReadUInt32();
|
||||||
|
stream.Position += 4;
|
||||||
|
output.ItemQuantity = reader.ReadUInt32();
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace Dalamud.Game.Network.Structures
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents market board purchase information. This message is sent from the
|
||||||
|
/// client when a purchase is made at a market board.
|
||||||
|
/// </summary>
|
||||||
|
internal class MarketBoardPurchaseHandler
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the object ID of the retainer associated with the sale.
|
||||||
|
/// </summary>
|
||||||
|
public ulong RetainerId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the object ID of the item listing.
|
||||||
|
/// </summary>
|
||||||
|
public ulong ListingId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the item ID of the item that was purchased.
|
||||||
|
/// </summary>
|
||||||
|
public uint CatalogId { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the quantity of the item that was purchased.
|
||||||
|
/// </summary>
|
||||||
|
public uint ItemQuantity { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the unit price of the item.
|
||||||
|
/// </summary>
|
||||||
|
public uint PricePerUnit { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Reads market board purchase information from the struct at the provided pointer.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dataPtr">A pointer to a struct containing market board purchase information from the client.</param>
|
||||||
|
/// <returns>An object representing the data read.</returns>
|
||||||
|
public static unsafe MarketBoardPurchaseHandler Read(IntPtr dataPtr)
|
||||||
|
{
|
||||||
|
var output = new MarketBoardPurchaseHandler();
|
||||||
|
|
||||||
|
using var stream = new UnmanagedMemoryStream((byte*)dataPtr.ToPointer(), 1544);
|
||||||
|
using var reader = new BinaryReader(stream);
|
||||||
|
output.RetainerId = reader.ReadUInt64();
|
||||||
|
output.ListingId = reader.ReadUInt64();
|
||||||
|
output.CatalogId = reader.ReadUInt32();
|
||||||
|
output.ItemQuantity = reader.ReadUInt32();
|
||||||
|
output.PricePerUnit = reader.ReadUInt32();
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue