diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 20d4a7beda..8566066493 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -346,7 +346,7 @@ public: using Sorter = typename T::Sorter; AuctionsResultBuilder(uint32 offset, LocaleConstant locale, std::span sorts, AuctionHouseResultLimits maxResults) - : _offset(offset), _sorter(locale, sorts), _maxResults(AsUnderlyingType(maxResults)), _hasMoreResults(false) + : _offset(offset), _sorter(locale, sorts), _maxResults(AsUnderlyingType(maxResults)), _totalCount(0) { _items.reserve(_maxResults + offset + 1); } @@ -355,12 +355,10 @@ public: { auto where = std::ranges::lower_bound(_items, item, std::cref(_sorter)); + ++_totalCount; _items.insert(where, item); if (_items.size() > _maxResults + _offset) - { _items.pop_back(); - _hasMoreResults = true; - } } std::span GetResultRange() const @@ -368,17 +366,22 @@ public: return std::span(_items.begin() + _offset, _items.end()); } + std::size_t GetTotalCount() const + { + return _totalCount; + } + bool HasMoreResults() const { - return _hasMoreResults; + return _totalCount > _items.size(); } private: uint32 _offset; Sorter _sorter; std::size_t _maxResults; + std::size_t _totalCount; std::vector _items; - bool _hasMoreResults; }; AuctionHouseMgr::AuctionHouseMgr() : mHordeAuctions(6), mAllianceAuctions(2), mNeutralAuctions(1), mGoblinAuctions(7), _replicateIdGenerator(0) @@ -1280,11 +1283,12 @@ void AuctionHouseObject::BuildListBuckets(WorldPackets::AuctionHouse::AuctionLis for (AuctionsBucketData const* resultBucket : builder.GetResultRange()) { - listBucketsResult.Buckets.emplace_back(); - WorldPackets::AuctionHouse::BucketInfo& bucketInfo = listBucketsResult.Buckets.back(); + WorldPackets::AuctionHouse::BucketInfo& bucketInfo = listBucketsResult.Buckets.emplace_back(); resultBucket->BuildBucketInfo(&bucketInfo, player); } + listBucketsResult.Filters = filters; + listBucketsResult.TotalCount = builder.GetTotalCount(); listBucketsResult.HasMoreResults = builder.HasMoreResults(); } @@ -1306,11 +1310,11 @@ void AuctionHouseObject::BuildListBuckets(WorldPackets::AuctionHouse::AuctionLis for (AuctionsBucketData const* resultBucket : buckets) { - listBucketsResult.Buckets.emplace_back(); - WorldPackets::AuctionHouse::BucketInfo& bucketInfo = listBucketsResult.Buckets.back(); + WorldPackets::AuctionHouse::BucketInfo& bucketInfo = listBucketsResult.Buckets.emplace_back(); resultBucket->BuildBucketInfo(&bucketInfo, player); } + listBucketsResult.TotalCount = buckets.size(); listBucketsResult.HasMoreResults = false; } @@ -1328,8 +1332,7 @@ void AuctionHouseObject::BuildListBiddedItems(WorldPackets::AuctionHouse::Auctio for (AuctionPosting const* resultAuction : auctions) { - listBiddedItemsResult.Items.emplace_back(); - WorldPackets::AuctionHouse::AuctionItem& auctionItem = listBiddedItemsResult.Items.back(); + WorldPackets::AuctionHouse::AuctionItem& auctionItem = listBiddedItemsResult.Items.emplace_back(); resultAuction->BuildAuctionItem(&auctionItem, true, true, true, false); } @@ -1339,7 +1342,7 @@ void AuctionHouseObject::BuildListBiddedItems(WorldPackets::AuctionHouse::Auctio void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::AuctionListItemsResult& listItemsResult, Player const* player, AuctionsBucketKey const& bucketKey, uint32 offset, std::span sorts) const { - listItemsResult.TotalCount = 0; + listItemsResult.TotalQuantity = 0; if (AuctionsBucketData const* bucket = Trinity::Containers::MapGetValuePtr(_buckets, bucketKey)) { AuctionsResultBuilder builder(offset, player->GetSession()->GetSessionDbcLocale(), sorts, AuctionHouseResultLimits::Items); @@ -1348,17 +1351,17 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::Aucti { builder.AddItem(auction); for (Item* item : auction->Items) - listItemsResult.TotalCount += item->GetCount(); + listItemsResult.TotalQuantity += item->GetCount(); } for (AuctionPosting const* resultAuction : builder.GetResultRange()) { - listItemsResult.Items.emplace_back(); - WorldPackets::AuctionHouse::AuctionItem& auctionItem = listItemsResult.Items.back(); + WorldPackets::AuctionHouse::AuctionItem& auctionItem = listItemsResult.Items.emplace_back(); resultAuction->BuildAuctionItem(&auctionItem, false, false, resultAuction->OwnerAccount != player->GetSession()->GetAccountGUID(), resultAuction->Bidder.IsEmpty()); } + listItemsResult.TotalCount = builder.GetTotalCount(); listItemsResult.HasMoreResults = builder.HasMoreResults(); } } @@ -1369,14 +1372,14 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::Aucti AuctionsResultBuilder builder(offset, player->GetSession()->GetSessionDbcLocale(), sorts, AuctionHouseResultLimits::Items); auto itr = _buckets.lower_bound(AuctionsBucketKey(itemId, 0, 0, 0)); auto end = _buckets.end(); - listItemsResult.TotalCount = 0; + listItemsResult.TotalQuantity = 0; while (itr != end && itr->first.ItemId == itemId) { for (AuctionPosting const* auction : itr->second.Auctions) { builder.AddItem(auction); for (Item* item : auction->Items) - listItemsResult.TotalCount += item->GetCount(); + listItemsResult.TotalQuantity += item->GetCount(); } ++itr; @@ -1384,12 +1387,12 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::Aucti for (AuctionPosting const* resultAuction : builder.GetResultRange()) { - listItemsResult.Items.emplace_back(); - WorldPackets::AuctionHouse::AuctionItem& auctionItem = listItemsResult.Items.back(); + WorldPackets::AuctionHouse::AuctionItem& auctionItem = listItemsResult.Items.emplace_back(); resultAuction->BuildAuctionItem(&auctionItem, false, true, resultAuction->OwnerAccount != player->GetSession()->GetAccountGUID(), resultAuction->Bidder.IsEmpty()); } + listItemsResult.TotalCount = builder.GetTotalCount(); listItemsResult.HasMoreResults = builder.HasMoreResults(); } @@ -1407,8 +1410,7 @@ void AuctionHouseObject::BuildListOwnedItems(WorldPackets::AuctionHouse::Auction for (AuctionPosting const* resultAuction : auctions) { - listOwnedItemsResult.Items.emplace_back(); - WorldPackets::AuctionHouse::AuctionItem& auctionItem = listOwnedItemsResult.Items.back(); + WorldPackets::AuctionHouse::AuctionItem& auctionItem = listOwnedItemsResult.Items.emplace_back(); resultAuction->BuildAuctionItem(&auctionItem, true, true, false, false); } @@ -1444,8 +1446,7 @@ void AuctionHouseObject::BuildReplicate(WorldPackets::AuctionHouse::AuctionRepli { AuctionPosting const& auction = itr->second; - replicateResponse.Items.emplace_back(); - WorldPackets::AuctionHouse::AuctionItem& auctionItem = replicateResponse.Items.back(); + WorldPackets::AuctionHouse::AuctionItem& auctionItem = replicateResponse.Items.emplace_back(); auction.BuildAuctionItem(&auctionItem, false, true, true, auction.Bidder.IsEmpty()); if (!--count) break; diff --git a/src/server/game/Server/Packets/AuctionHousePackets.cpp b/src/server/game/Server/Packets/AuctionHousePackets.cpp index f09587c30b..56a1c7d230 100644 --- a/src/server/game/Server/Packets/AuctionHousePackets.cpp +++ b/src/server/game/Server/Packets/AuctionHousePackets.cpp @@ -576,8 +576,8 @@ WorldPacket const* AuctionListBucketsResult::Write() { _worldPacket << Size(Buckets); _worldPacket << uint32(DesiredDelay); - _worldPacket << int32(Unknown830_0); - _worldPacket << int32(Unknown830_1); + _worldPacket << int32(Filters); + _worldPacket << int32(TotalCount); _worldPacket << Bits<1>(BrowseMode); _worldPacket << Bits<1>(HasMoreResults); _worldPacket.FlushBits(); @@ -592,7 +592,7 @@ WorldPacket const* AuctionListItemsResult::Write() { { _worldPacket << Size(Items); - _worldPacket << uint32(Unknown830); + _worldPacket << uint32(TotalCount); _worldPacket << uint32(DesiredDelay); for (AuctionItem const& item : Items) _worldPacket << item; diff --git a/src/server/game/Server/Packets/AuctionHousePackets.h b/src/server/game/Server/Packets/AuctionHousePackets.h index 17852023ce..13d9c71c4e 100644 --- a/src/server/game/Server/Packets/AuctionHousePackets.h +++ b/src/server/game/Server/Packets/AuctionHousePackets.h @@ -442,8 +442,8 @@ namespace WorldPackets std::vector Buckets; uint32 DesiredDelay = 0; - int32 Unknown830_0 = 0; - int32 Unknown830_1 = 0; + AuctionHouseFilterMask Filters = AuctionHouseFilterMask(0); + int32 TotalCount = 0; AuctionHouseBrowseMode BrowseMode = AuctionHouseBrowseMode(0); bool HasMoreResults = false; }; @@ -467,8 +467,8 @@ namespace WorldPackets WorldPacket const* Write() override; std::vector Items; - uint32 Unknown830 = 0; - uint32 TotalCount = 0; + uint32 TotalCount = 0; ///< number of auctions + uint32 TotalQuantity = 0; ///< number of items (summing stack counts) uint32 DesiredDelay = 0; AuctionHouseListType ListType = AuctionHouseListType(0); bool HasMoreResults = false;