From 334ea523c3b1acfb081fb10f918e1b3096a8c714 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Tue, 24 May 2022 10:23:12 -0400 Subject: [PATCH] Core/Auction House: Eliminate blocking db queries for account permissions when expiring auctions that have offline bidders Port From (https://github.com/TrinityCore/TrinityCore/commit/569b5d6f04548cd874cc161cb67a62dcad792fb0) --- Source/Framework/Constants/AuctionConst.cs | 6 ++++++ .../Database/Databases/CharacterDatabase.cs | 6 +++--- Source/Game/AuctionHouse/AuctionManager.cs | 15 ++++++++------- Source/Game/Handlers/AuctionHandler.cs | 7 ++++++- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/Source/Framework/Constants/AuctionConst.cs b/Source/Framework/Constants/AuctionConst.cs index 5fe92234e..39664414f 100644 --- a/Source/Framework/Constants/AuctionConst.cs +++ b/Source/Framework/Constants/AuctionConst.cs @@ -98,4 +98,10 @@ namespace Framework.Constants Commodities = 1, Items = 2 } + + public enum AuctionPostingServerFlag + { + None = 0x0, + GmLogBuyer = 0x1 // write transaction to gm log file for buyer (optimization flag - avoids querying database for offline player permissions) + } } diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index aeb022b74..dc1b52951 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -162,15 +162,15 @@ namespace Framework.Database PrepareStatement(CharStatements.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 = ?"); PrepareStatement(CharStatements.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 = ?"); PrepareStatement(CharStatements.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"); - PrepareStatement(CharStatements.SEL_AUCTIONS, "SELECT id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime FROM auctionhouse"); + PrepareStatement(CharStatements.SEL_AUCTIONS, "SELECT id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime, serverFlags FROM auctionhouse"); PrepareStatement(CharStatements.INS_AUCTION_ITEMS, "INSERT INTO auction_items (auctionId, itemGuid) VALUES (?, ?)"); PrepareStatement(CharStatements.DEL_AUCTION_ITEMS_BY_ITEM, "DELETE FROM auction_items WHERE itemGuid = ?"); PrepareStatement(CharStatements.SEL_AUCTION_BIDDERS, "SELECT auctionId, playerGuid FROM auction_bidders"); PrepareStatement(CharStatements.INS_AUCTION_BIDDER, "INSERT INTO auction_bidders (auctionId, playerGuid) VALUES (?, ?)"); PrepareStatement(CharStatements.DEL_AUCTION_BIDDER_BY_PLAYER, "DELETE FROM auction_bidders WHERE playerGuid = ?"); - PrepareStatement(CharStatements.INS_AUCTION, "INSERT INTO auctionhouse (id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + PrepareStatement(CharStatements.INS_AUCTION, "INSERT INTO auctionhouse (id, auctionHouseId, owner, bidder, minBid, buyoutOrUnitPrice, deposit, bidAmount, startTime, endTime, serverFlags) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.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 = ?"); - PrepareStatement(CharStatements.UPD_AUCTION_BID, "UPDATE auctionhouse SET bidder = ?, bidAmount = ? WHERE id = ?"); + PrepareStatement(CharStatements.UPD_AUCTION_BID, "UPDATE auctionhouse SET bidder = ?, bidAmount = ?, serverFlags = ? WHERE id = ?"); PrepareStatement(CharStatements.UPD_AUCTION_EXPIRATION, "UPDATE auctionhouse SET endTime = ? WHERE id = ?"); PrepareStatement(CharStatements.INS_MAIL, "INSERT INTO mail(id, messageType, stationery, mailTemplateId, sender, receiver, subject, body, has_items, expire_time, deliver_time, money, cod, checked) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.DEL_MAIL_BY_ID, "DELETE FROM mail WHERE id = ?"); diff --git a/Source/Game/AuctionHouse/AuctionManager.cs b/Source/Game/AuctionHouse/AuctionManager.cs index 11996c5c8..e7b8f9b5f 100644 --- a/Source/Game/AuctionHouse/AuctionManager.cs +++ b/Source/Game/AuctionHouse/AuctionManager.cs @@ -252,6 +252,7 @@ namespace Game auction.BidAmount = result.Read(7); auction.StartTime = Time.UnixTimeToDateTime(result.Read(8)); auction.EndTime = Time.UnixTimeToDateTime(result.Read(9)); + auction.ServerFlags = (AuctionPostingServerFlag)result.Read(10); if (biddersByAuction.ContainsKey(auction.Id)) auction.BidderHistory = biddersByAuction[auction.Id]; @@ -654,6 +655,7 @@ namespace Game stmt.AddValue(7, auction.BidAmount); stmt.AddValue(8, Time.DateTimeToUnixTime(auction.StartTime)); stmt.AddValue(9, Time.DateTimeToUnixTime(auction.EndTime)); + stmt.AddValue(10, (byte)auction.ServerFlags); trans.Append(stmt); foreach (Item item in auction.Items) @@ -1405,18 +1407,16 @@ namespace Game // data for gm.log string bidderName = ""; - bool logGmTrade; + bool logGmTrade= auction.ServerFlags.HasFlag(AuctionPostingServerFlag.GmLogBuyer); if (bidder) { bidderAccId = bidder.GetSession().GetAccountId(); bidderName = bidder.GetName(); - logGmTrade = bidder.GetSession().HasPermission(RBACPermissions.LogGmTrade); } else { bidderAccId = Global.CharacterCacheStorage.GetCharacterAccountIdByGuid(auction.Bidder); - logGmTrade = Global.AccountMgr.HasPermission(bidderAccId, RBACPermissions.LogGmTrade, Global.WorldMgr.GetRealmId().Index); if (logGmTrade && !Global.CharacterCacheStorage.GetCharacterNameByGuid(auction.Bidder, out bidderName)) bidderName = Global.ObjectMgr.GetCypherString(CypherStrings.Unknown); @@ -1623,12 +1623,13 @@ namespace Game public ObjectGuid Owner; public ObjectGuid OwnerAccount; public ObjectGuid Bidder; - public ulong MinBid = 0; - public ulong BuyoutOrUnitPrice = 0; - public ulong Deposit = 0; - public ulong BidAmount = 0; + public ulong MinBid; + public ulong BuyoutOrUnitPrice; + public ulong Deposit; + public ulong BidAmount; public DateTime StartTime = DateTime.MinValue; public DateTime EndTime = DateTime.MinValue; + public AuctionPostingServerFlag ServerFlags; public List BidderHistory = new(); diff --git a/Source/Game/Handlers/AuctionHandler.cs b/Source/Game/Handlers/AuctionHandler.cs index d3a3f45e4..653b77555 100644 --- a/Source/Game/Handlers/AuctionHandler.cs +++ b/Source/Game/Handlers/AuctionHandler.cs @@ -395,6 +395,10 @@ namespace Game player.ModifyMoney(-(long)priceToPay); auction.Bidder = player.GetGUID(); auction.BidAmount = placeBid.BidAmount; + if (HasPermission(RBACPermissions.LogGmTrade)) + auction.ServerFlags |= AuctionPostingServerFlag.GmLogBuyer; + else + auction.ServerFlags &= ~AuctionPostingServerFlag.GmLogBuyer; if (canBuyout && placeBid.BidAmount == auction.BuyoutOrUnitPrice) { @@ -410,7 +414,8 @@ namespace Game PreparedStatement stmt = DB.Characters.GetPreparedStatement(CharStatements.UPD_AUCTION_BID); stmt.AddValue(0, auction.Bidder.GetCounter()); stmt.AddValue(1, auction.BidAmount); - stmt.AddValue(2, auction.Id); + stmt.AddValue(2, (byte)auction.ServerFlags); + stmt.AddValue(3, auction.Id); trans.Append(stmt); auction.BidderHistory.Add(player.GetGUID());