From 9d454eb3dfd6f74af5eb32045bc1a5a4bf21db90 Mon Sep 17 00:00:00 2001 From: iridinite Date: Mon, 27 Nov 2017 23:00:30 +0100 Subject: [3.3.5] Core/AuctionHouse: Auction bidders (#18328) * Save more auction bidders than the highest bidder only --- src/server/game/AuctionHouse/AuctionHouseMgr.cpp | 46 ++++++++++++++++++------ src/server/game/AuctionHouse/AuctionHouseMgr.h | 2 +- src/server/game/Handlers/AuctionHouseHandler.cpp | 10 ++++++ 3 files changed, 47 insertions(+), 11 deletions(-) (limited to 'src/server/game') diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 1dabff8a76e..d4faa188493 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -355,21 +355,37 @@ void AuctionHouseMgr::LoadAuctions() uint32 oldMSTime = getMSTime(); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTIONS); - PreparedQueryResult result = CharacterDatabase.Query(stmt); + PreparedQueryResult resultAuctions = CharacterDatabase.Query(stmt); - if (!result) + if (!resultAuctions) { TC_LOG_INFO("server.loading", ">> Loaded 0 auctions. DB table `auctionhouse` is empty."); return; } - uint32 count = 0; + // parse bidder list + std::unordered_map> biddersByAuction; + PreparedStatement* stmt2 = CharacterDatabase.GetPreparedStatement(CHAR_SEL_AUCTION_BIDDERS); + uint32 countBidders = 0; + if (PreparedQueryResult resultBidders = CharacterDatabase.Query(stmt2)) + { + do + { + Field* fields = resultBidders->Fetch(); + biddersByAuction[fields[0].GetUInt32()].insert(ObjectGuid::Create(fields[1].GetUInt32())); + ++countBidders; + } + while (resultBidders->NextRow()); + } + + // parse auctions from db + uint32 countAuctions = 0; SQLTransaction trans = CharacterDatabase.BeginTransaction(); do { - Field* fields = result->Fetch(); + Field* fields = resultAuctions->Fetch(); AuctionEntry* aItem = new AuctionEntry(); if (!aItem->LoadFromDB(fields)) @@ -379,14 +395,17 @@ void AuctionHouseMgr::LoadAuctions() continue; } + auto it = biddersByAuction.find(aItem->Id); + if (it != biddersByAuction.end()) + aItem->bidders = std::move(it->second); + GetAuctionsMapByHouseId(aItem->houseId)->AddAuction(aItem); - ++count; - } while (result->NextRow()); + ++countAuctions; + } while (resultAuctions->NextRow()); CharacterDatabase.CommitTransaction(trans); - TC_LOG_INFO("server.loading", ">> Loaded %u auctions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); - + TC_LOG_INFO("server.loading", ">> Loaded %u auctions with %u bidders in %u ms", countAuctions, countBidders, GetMSTimeDiffToNow(oldMSTime)); } void AuctionHouseMgr::AddAItem(Item* it) @@ -656,7 +675,7 @@ void AuctionHouseObject::BuildListBidderItems(WorldPacket& data, Player* player, for (AuctionEntryMap::const_iterator itr = AuctionsMap.begin(); itr != AuctionsMap.end(); ++itr) { AuctionEntry* Aentry = itr->second; - if (Aentry && Aentry->bidder == player->GetGUID().GetCounter()) + if (Aentry && Aentry->bidders.find(player->GetGUID()) != Aentry->bidders.end()) { if (itr->second->BuildAuctionInfo(data)) ++count; @@ -863,7 +882,13 @@ uint32 AuctionEntry::GetAuctionOutBid() const void AuctionEntry::DeleteFromDB(SQLTransaction& trans) const { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_AUCTION); + PreparedStatement* stmt; + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_AUCTION); + stmt->setUInt32(0, Id); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_AUCTION_BIDDERS); stmt->setUInt32(0, Id); trans->Append(stmt); } @@ -913,6 +938,7 @@ bool AuctionEntry::LoadFromDB(Field* fields) TC_LOG_ERROR("misc", "Auction %u has not a existing item : %u", Id, itemGUIDLow); return false; } + return true; } std::string AuctionEntry::BuildAuctionMailSubject(MailAuctionAnswers response) const diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h index 2fad4264d15..3c2080b1ad5 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -88,6 +88,7 @@ struct TC_GAME_API AuctionEntry ObjectGuid::LowType bidder; uint32 deposit; //deposit can be calculated only when creating auction uint32 etime; + std::unordered_set bidders; AuctionHouseEntry const* auctionHouseEntry; // in AuctionHouse.dbc // helpers @@ -164,7 +165,6 @@ class TC_GAME_API AuctionHouseMgr AuctionHouseObject* GetAuctionsMap(uint32 factionTemplateId); AuctionHouseObject* GetAuctionsMapByHouseId(uint8 auctionHouseId); - AuctionHouseObject* GetBidsMap(uint32 factionTemplateId); Item* GetAItem(ObjectGuid::LowType id) { diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index a0d6ae3bdd2..89db6ee6e69 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -515,6 +515,16 @@ void WorldSession::HandleAuctionPlaceBid(WorldPacket& recvData) stmt->setUInt32(2, auction->Id); trans->Append(stmt); + if (auction->bidders.find(player->GetGUID()) == auction->bidders.end()) + { + // save new bidder in list, and save record to db + auction->bidders.insert(player->GetGUID()); + stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AUCTION_BIDDERS); + stmt->setUInt32(0, auction->Id); + stmt->setUInt32(1, auction->bidder); + trans->Append(stmt); + } + SendAuctionCommandResult(auction->Id, AUCTION_PLACE_BID, ERR_AUCTION_OK, 0); } else -- cgit v1.2.3