diff options
Diffstat (limited to 'src')
5 files changed, 25 insertions, 9 deletions
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index 6c75b2fa287..3d0631b5216 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -165,15 +165,15 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_MAILITEMS_AZERITE_UNLOCKED_ESSENCE, "SELECT iaue.itemGuid, iaue.azeriteEssenceId, iaue.`rank` FROM item_instance_azerite_unlocked_essence iaue INNER JOIN mail_items mi ON iaue.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?", CONNECTION_BOTH); PrepareStatement(CHAR_SEL_MAILITEMS_AZERITE_EMPOWERED, "SELECT iae.itemGuid, iae.azeritePowerId1, iae.azeritePowerId2, iae.azeritePowerId3, iae.azeritePowerId4, iae.azeritePowerId5 FROM item_instance_azerite_empowered iae INNER JOIN mail_items mi ON iae.itemGuid = mi.item_guid INNER JOIN mail m ON mi.mail_id = m.id WHERE m.receiver = ?", CONNECTION_BOTH); PrepareStatement(CHAR_SEL_AUCTION_ITEMS, "SELECT " SelectItemInstanceContent ", ii.owner_guid, ai.auctionId FROM auction_items ai INNER JOIN item_instance ii ON ai.itemGuid = ii.guid LEFT JOIN item_instance_gems ig ON ii.guid = ig.itemGuid LEFT JOIN item_instance_transmog iit ON ii.guid = iit.itemGuid LEFT JOIN item_instance_modifiers im ON ii.guid = im.itemGuid", CONNECTION_SYNCH); - PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime FROM auctionhouse", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_AUCTIONS, "SELECT id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime, serverFlags FROM auctionhouse", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_AUCTION_ITEMS, "INSERT INTO auction_items (auctionId, itemGuid) VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_AUCTION_ITEMS_BY_ITEM, "DELETE FROM auction_items WHERE itemGuid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_AUCTION_BIDDERS, "SELECT auctionId, playerGuid FROM auction_bidders", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_AUCTION_BIDDER, "INSERT INTO auction_bidders (auctionId, playerGuid) VALUES (?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_AUCTION_BIDDER_BY_PLAYER, "DELETE FROM auction_bidders WHERE playerGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_AUCTION, "INSERT INTO auctionhouse (id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime, serverFlags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_AUCTION, "DELETE a, ab, ai FROM auctionhouse a LEFT JOIN auction_items ai ON a.id = ai.auctionId LEFT JOIN auction_bidders ab ON a.id = ab.auctionId WHERE a.id = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_UPD_AUCTION_BID, "UPDATE auctionhouse SET bidder = ?, bidAmount = ? WHERE id = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_UPD_AUCTION_BID, "UPDATE auctionhouse SET bidder = ?, bidAmount = ?, serverFlags = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_AUCTION_EXPIRATION, "UPDATE auctionhouse SET endTime = ? WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_MAIL, "INSERT INTO mail(id, messageType, stationery, mailTemplateId, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_MAIL_BY_ID, "DELETE FROM mail WHERE id = ?", CONNECTION_ASYNC); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index be9845258de..0fdd6d32117 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -631,6 +631,7 @@ void AuctionHouseMgr::LoadAuctions() auction.BidAmount = fields[7].GetUInt64(); auction.StartTime = std::chrono::system_clock::from_time_t(fields[8].GetInt64()); auction.EndTime = std::chrono::system_clock::from_time_t(fields[9].GetInt64()); + auction.ServerFlags = static_cast<AuctionPostingServerFlag>(fields[10].GetUInt8()); auto biddersItr = biddersByAuction.find(auction.Id); if (biddersItr != biddersByAuction.end()) @@ -1003,6 +1004,7 @@ void AuctionHouseObject::AddAuction(CharacterDatabaseTransaction trans, AuctionP stmt->setUInt64(7, auction.BidAmount); stmt->setInt64(8, std::chrono::system_clock::to_time_t(auction.StartTime)); stmt->setInt64(9, std::chrono::system_clock::to_time_t(auction.EndTime)); + stmt->setUInt8(10, auction.ServerFlags.AsUnderlyingType()); trans->Append(stmt); for (Item* item : auction.Items) @@ -1854,18 +1856,16 @@ void AuctionHouseObject::SendAuctionWon(AuctionPosting const* auction, Player* b // data for gm.log std::string bidderName; - bool logGmTrade = false; + bool logGmTrade = auction->ServerFlags.HasFlag(AuctionPostingServerFlag::GmLogBuyer); if (bidder) { bidderAccId = bidder->GetSession()->GetAccountId(); bidderName = bidder->GetName(); - logGmTrade = bidder->GetSession()->HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE); } else { bidderAccId = sCharacterCache->GetCharacterAccountIdByGuid(auction->Bidder); - logGmTrade = AccountMgr::HasPermission(bidderAccId, rbac::RBAC_PERM_LOG_GM_TRADE, realm.Id.Realm); if (logGmTrade && !sCharacterCache->GetCharacterNameByGuid(auction->Bidder, bidderName)) bidderName = sObjectMgr->GetTrinityStringForDBCLocale(LANG_UNKNOWN); diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h index 2d84bdb24a9..caa96909654 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.h +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h @@ -222,6 +222,14 @@ struct AuctionsBucketData class Sorter; }; +enum class AuctionPostingServerFlag : uint8 +{ + None = 0x0, + GmLogBuyer = 0x1 // write transaction to gm log file for buyer (optimization flag - avoids querying database for offline player permissions) +}; + +DEFINE_ENUM_FLAG(AuctionPostingServerFlag); + // This structure represents the result of a single C_AuctionHouse.PostItem/PostCommodity call struct AuctionPosting { @@ -238,6 +246,7 @@ struct AuctionPosting uint64 BidAmount = 0; SystemTimePoint StartTime = SystemTimePoint::min(); SystemTimePoint EndTime = SystemTimePoint::min(); + EnumFlag<AuctionPostingServerFlag> ServerFlags = AuctionPostingServerFlag::None; GuidUnorderedSet BidderHistory; diff --git a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp index bd7c156211d..684e9d452df 100644 --- a/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp +++ b/src/server/game/AuctionHouseBot/AuctionHouseBotBuyer.cpp @@ -439,12 +439,14 @@ void AuctionBotBuyer::PlaceBidToEntry(AuctionPosting* auction, AuctionHouseObjec // Set bot as bidder and set new bid amount auction->Bidder = newBidder; auction->BidAmount = bidPrice; + auction->ServerFlags &= ~AuctionPostingServerFlag::GmLogBuyer; // Update auction to DB CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID); stmt->setUInt64(0, auction->Bidder.GetCounter()); - stmt->setUInt32(1, auction->BidAmount); - stmt->setUInt32(2, auction->Id); + stmt->setUInt64(1, auction->BidAmount); + stmt->setUInt8(2, auction->ServerFlags.AsUnderlyingType()); + stmt->setUInt32(3, auction->Id); trans->Append(stmt); // Run SQLs diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index 39f60749439..59ddbcbae8f 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -435,6 +435,10 @@ void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlac player->ModifyMoney(-int64(priceToPay)); auction->Bidder = player->GetGUID(); auction->BidAmount = placeBid.BidAmount; + if (HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE)) + auction->ServerFlags |= AuctionPostingServerFlag::GmLogBuyer; + else + auction->ServerFlags &= ~AuctionPostingServerFlag::GmLogBuyer; if (canBuyout && placeBid.BidAmount == auction->BuyoutOrUnitPrice) { @@ -450,7 +454,8 @@ void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlac CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID); stmt->setUInt64(0, auction->Bidder.GetCounter()); stmt->setUInt64(1, auction->BidAmount); - stmt->setUInt32(2, auction->Id); + stmt->setUInt8(2, auction->ServerFlags.AsUnderlyingType()); + stmt->setUInt32(3, auction->Id); trans->Append(stmt); if (auction->BidderHistory.insert(player->GetGUID()).second) |