diff --git a/Dalamud/Game/Network/Internal/MarketBoardUploaders/MarketBoardItemRequest.cs b/Dalamud/Game/Network/Internal/MarketBoardUploaders/MarketBoardItemRequest.cs index eb4ed7ece..aa112753f 100644 --- a/Dalamud/Game/Network/Internal/MarketBoardUploaders/MarketBoardItemRequest.cs +++ b/Dalamud/Game/Network/Internal/MarketBoardUploaders/MarketBoardItemRequest.cs @@ -14,13 +14,9 @@ internal class MarketBoardItemRequest { } - /// - /// Gets the catalog ID. - /// - public uint CatalogId { get; private set; } - /// /// Gets the request status. Nonzero statuses are errors. + /// Known values: default=0; rate limited=0x70000003 /// public uint Status { get; private set; } @@ -32,44 +28,33 @@ internal class MarketBoardItemRequest /// /// Gets the amount to arrive. /// - public byte AmountToArrive { get; private set; } + public uint AmountToArrive { get; private set; } /// /// Gets the offered item listings. /// - public List Listings { get; } = new(); + public List Listings { get; } = []; /// /// Gets the historical item listings. /// - public List History { get; } = new(); - - /// - /// Gets or sets the listing request ID. - /// - public int ListingsRequestId { get; set; } = -1; - - /// - /// Gets a value indicating whether the upload is complete. - /// - public bool IsDone => this.Listings.Count == this.AmountToArrive && this.History.Count != 0; + public List History { get; } = []; /// /// Read a packet off the wire. /// /// Packet data. /// An object representing the data read. - public static unsafe MarketBoardItemRequest Read(IntPtr dataPtr) + public static unsafe MarketBoardItemRequest Read(nint dataPtr) { using var stream = new UnmanagedMemoryStream((byte*)dataPtr.ToPointer(), 1544); using var reader = new BinaryReader(stream); - var output = new MarketBoardItemRequest(); - - output.CatalogId = reader.ReadUInt32(); - output.Status = reader.ReadUInt32(); - stream.Position += 0x3; - output.AmountToArrive = reader.ReadByte(); + var output = new MarketBoardItemRequest + { + Status = reader.ReadUInt32(), + AmountToArrive = reader.ReadUInt32(), + }; return output; } diff --git a/Dalamud/Game/Network/Internal/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs b/Dalamud/Game/Network/Internal/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs index 15f192bff..7892e8a04 100644 --- a/Dalamud/Game/Network/Internal/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs +++ b/Dalamud/Game/Network/Internal/MarketBoardUploaders/Universalis/UniversalisMarketBoardUploader.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; @@ -47,9 +48,9 @@ internal class UniversalisMarketBoardUploader : IMarketBoardUploader { WorldId = clientState.LocalPlayer?.CurrentWorld.Id ?? 0, UploaderId = uploader.ToString(), - ItemId = request.CatalogId, - Listings = new List(), - Sales = new List(), + ItemId = request.Listings.FirstOrDefault()?.CatalogId ?? 0, + Listings = [], + Sales = [], }; foreach (var marketBoardItemListing in request.Listings) @@ -105,7 +106,7 @@ internal class UniversalisMarketBoardUploader : IMarketBoardUploader // ==================================================================================== - Log.Verbose("Universalis data upload for item#{CatalogId} completed", request.CatalogId); + Log.Verbose("Universalis data upload for item#{CatalogId} completed", request.Listings.FirstOrDefault()?.CatalogId ?? 0); } /// diff --git a/Dalamud/Game/Network/Internal/NetworkHandlers.cs b/Dalamud/Game/Network/Internal/NetworkHandlers.cs index 23bfe2db2..0e87880ec 100644 --- a/Dalamud/Game/Network/Internal/NetworkHandlers.cs +++ b/Dalamud/Game/Network/Internal/NetworkHandlers.cs @@ -315,7 +315,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService } catch (Exception ex) { - Log.Error(ex, "CfPopDetour threw an exception"); + Log.Error(ex, "CfPopDetour threw an exception"); } return result; @@ -350,7 +350,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService } return offeringsObservable - .Where(offerings => offerings.InternalItemListings.All(l => l.CatalogId == request.CatalogId)) + .Where(offerings => offerings.InternalItemListings.All(l => l.CatalogId != 0)) .Skip(totalPackets - 1) .Do(LogEndObserved); } @@ -387,7 +387,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService IObservable UntilBatchEnd(MarketBoardItemRequest request) { return historyObservable - .Where(history => history.CatalogId == request.CatalogId) + .Where(history => history.CatalogId != 0) .Take(1); } @@ -411,10 +411,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService { void LogStartObserved(MarketBoardItemRequest request) { - Log.Verbose( - "Observed start of request for item#{CatalogId} with {NumListings} expected listings", - request.CatalogId, - request.AmountToArrive); + Log.Verbose("Observed start of request for item with {NumListings} expected listings", request.AmountToArrive); } var startObservable = this.MbItemRequestObservable @@ -442,23 +439,18 @@ internal unsafe class NetworkHandlers : IInternalDisposableService ICollection sales, ICollection listings) { + var catalogId = listings.FirstOrDefault()?.CatalogId ?? 0; if (listings.Count != request.AmountToArrive) { Log.Error( "Wrong number of Market Board listings received for request: {ListingsCount} != {RequestAmountToArrive} item#{RequestCatalogId}", - listings.Count, request.AmountToArrive, request.CatalogId); - return; - } - - if (listings.Any(listing => listing.CatalogId != request.CatalogId)) - { - Log.Error("Received listings with mismatched item IDs for item#{RequestCatalogId}", request.CatalogId); + listings.Count, request.AmountToArrive, catalogId); return; } Log.Verbose( "Market Board request resolved, starting upload: item#{CatalogId} listings#{ListingsObserved} sales#{SalesObserved}", - request.CatalogId, + catalogId, listings.Count, sales.Count); @@ -545,7 +537,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService { Log.Error(ex, "MarketPurchasePacketHandler threw an exception"); } - + return this.mbPurchaseHook.OriginalDisposeSafe(a1, packetData); } @@ -559,7 +551,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService { Log.Error(ex, "MarketHistoryPacketDetour threw an exception"); } - + return this.mbHistoryHook.OriginalDisposeSafe(a1, packetData, a3, a4); } @@ -589,7 +581,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService { Log.Error(ex, "MarketItemRequestStartDetour threw an exception"); } - + return this.mbItemRequestStartHook.OriginalDisposeSafe(a1, packetRef); } @@ -603,7 +595,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService { Log.Error(ex, "MarketBoardOfferingsDetour threw an exception"); } - + return this.mbOfferingsHook.OriginalDisposeSafe(a1, packetRef); } @@ -617,7 +609,7 @@ internal unsafe class NetworkHandlers : IInternalDisposableService { Log.Error(ex, "MarketBoardSendPurchaseRequestDetour threw an exception"); } - + return this.mbSendPurchaseRequestHook.OriginalDisposeSafe(infoProxyItemSearch); } }