aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/AuctionHouseHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/AuctionHouseHandler.cpp')
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp568
1 files changed, 0 insertions, 568 deletions
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index 3ae5e2010f8..e9f0df38a09 100644
--- a/src/server/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
@@ -33,162 +33,6 @@
#include "World.h"
#include <sstream>
-void WorldSession::HandleAuctionBrowseQuery(WorldPackets::AuctionHouse::AuctionBrowseQuery& browseQuery)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, browseQuery.TaintedBy.has_value());
- if (throttle.Throttled)
- return;
-
- Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(browseQuery.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
- if (!creature)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionListItems - {} not found or you can't interact with him.", browseQuery.Auctioneer.ToString());
- return;
- }
-
- // remove fake death
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->GetFaction());
-
- TC_LOG_DEBUG("auctionHouse", "Auctionhouse search {}, searchedname: {}, levelmin: {}, levelmax: {}, filters: {}",
- browseQuery.Auctioneer.ToString(), browseQuery.Name, browseQuery.MinLevel, browseQuery.MaxLevel, AsUnderlyingType(browseQuery.Filters));
-
- std::wstring name;
- if (!Utf8toWStr(browseQuery.Name, name))
- return;
-
- Optional<AuctionSearchClassFilters> classFilters;
-
- WorldPackets::AuctionHouse::AuctionListBucketsResult listBucketsResult;
- if (!browseQuery.ItemClassFilters.empty())
- {
- classFilters.emplace();
-
- for (auto const& classFilter : browseQuery.ItemClassFilters)
- {
- if (!classFilter.SubClassFilters.empty())
- {
- for (auto const& subClassFilter : classFilter.SubClassFilters)
- {
- if (classFilter.ItemClass < MAX_ITEM_CLASS)
- {
- classFilters->Classes[classFilter.ItemClass].SubclassMask |= 1 << subClassFilter.ItemSubclass;
- if (subClassFilter.ItemSubclass < MAX_ITEM_SUBCLASS_TOTAL)
- classFilters->Classes[classFilter.ItemClass].InvTypes[subClassFilter.ItemSubclass] = subClassFilter.InvTypeMask;
- }
- }
- }
- else
- classFilters->Classes[classFilter.ItemClass].SubclassMask = AuctionSearchClassFilters::FILTER_SKIP_SUBCLASS;
- }
- }
-
- auctionHouse->BuildListBuckets(listBucketsResult, _player,
- name, browseQuery.MinLevel, browseQuery.MaxLevel, browseQuery.Filters, classFilters,
- browseQuery.KnownPets, browseQuery.MaxPetLevel, browseQuery.Offset, browseQuery.Sorts);
-
- listBucketsResult.BrowseMode = AuctionHouseBrowseMode::Search;
- listBucketsResult.DesiredDelay = uint32(throttle.DelayUntilNext.count());
- SendPacket(listBucketsResult.Write());
-}
-
-void WorldSession::HandleAuctionCancelCommoditiesPurchase(WorldPackets::AuctionHouse::AuctionCancelCommoditiesPurchase& cancelCommoditiesPurchase)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, cancelCommoditiesPurchase.TaintedBy.has_value(), AuctionCommand::PlaceBid);
- if (throttle.Throttled)
- return;
-
- Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(cancelCommoditiesPurchase.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
- if (!creature)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionCancelCommoditiesPurchase - {} not found or you can't interact with him.",
- cancelCommoditiesPurchase.Auctioneer.ToString());
- return;
- }
-
- // remove fake death
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->GetFaction());
- auctionHouse->CancelCommodityQuote(_player->GetGUID());
-}
-
-void WorldSession::HandleAuctionConfirmCommoditiesPurchase(WorldPackets::AuctionHouse::AuctionConfirmCommoditiesPurchase& confirmCommoditiesPurchase)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, confirmCommoditiesPurchase.TaintedBy.has_value(), AuctionCommand::PlaceBid);
- if (throttle.Throttled)
- return;
-
- Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(confirmCommoditiesPurchase.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
- if (!creature)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionConfirmCommoditiesPurchase - {} not found or you can't interact with him.", confirmCommoditiesPurchase.Auctioneer.ToString());
- return;
- }
-
- // remove fake death
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->GetFaction());
-
- CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
- if (auctionHouse->BuyCommodity(trans, _player, confirmCommoditiesPurchase.ItemID, confirmCommoditiesPurchase.Quantity, throttle.DelayUntilNext))
- {
- AddTransactionCallback(CharacterDatabase.AsyncCommitTransaction(trans)).AfterComplete([this, buyerGuid = _player->GetGUID(), throttle](bool success)
- {
- if (GetPlayer() && GetPlayer()->GetGUID() == buyerGuid)
- {
- if (success)
- {
- GetPlayer()->UpdateCriteria(CriteriaType::AuctionsWon, 1);
- SendAuctionCommandResult(0, AuctionCommand::PlaceBid, AuctionResult::Ok, throttle.DelayUntilNext);
- }
- else
- SendAuctionCommandResult(0, AuctionCommand::PlaceBid, AuctionResult::CommodityPurchaseFailed, throttle.DelayUntilNext);
- }
- });
- }
-}
-
-void WorldSession::HandleAuctionGetCommodityQuote(WorldPackets::AuctionHouse::AuctionGetCommodityQuote& getCommodityQuote)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, getCommodityQuote.TaintedBy.has_value(), AuctionCommand::PlaceBid);
- if (throttle.Throttled)
- return;
-
- Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(getCommodityQuote.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
- if (!creature)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionStartCommoditiesPurchase - {} not found or you can't interact with him.",
- getCommodityQuote.Auctioneer.ToString());
- return;
- }
-
- // remove fake death
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->GetFaction());
-
- WorldPackets::AuctionHouse::AuctionGetCommodityQuoteResult commodityQuoteResult;
-
- if (CommodityQuote const* quote = auctionHouse->CreateCommodityQuote(_player, getCommodityQuote.ItemID, getCommodityQuote.Quantity))
- {
- commodityQuoteResult.TotalPrice = quote->TotalPrice;
- commodityQuoteResult.Quantity = quote->Quantity;
- commodityQuoteResult.QuoteDuration = std::chrono::duration_cast<Milliseconds>(quote->ValidTo - GameTime::Now());
- }
-
- commodityQuoteResult.ItemID = getCommodityQuote.ItemID;
- commodityQuoteResult.DesiredDelay = uint32(throttle.DelayUntilNext.count());
-
- SendPacket(commodityQuoteResult.Write());
-}
-
void WorldSession::HandleAuctionHelloOpcode(WorldPackets::AuctionHouse::AuctionHelloRequest& hello)
{
Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(hello.Guid, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
@@ -205,149 +49,6 @@ void WorldSession::HandleAuctionHelloOpcode(WorldPackets::AuctionHouse::AuctionH
SendAuctionHello(hello.Guid, unit);
}
-void WorldSession::HandleAuctionListBiddedItems(WorldPackets::AuctionHouse::AuctionListBiddedItems& listBiddedItems)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, listBiddedItems.TaintedBy.has_value());
- if (throttle.Throttled)
- return;
-
- Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(listBiddedItems.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
- if (!creature)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionListBidderItems - {} not found or you can't interact with him.", listBiddedItems.Auctioneer.ToString());
- return;
- }
-
- // remove fake death
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->GetFaction());
-
- WorldPackets::AuctionHouse::AuctionListBiddedItemsResult result;
-
- Player* player = GetPlayer();
- auctionHouse->BuildListBiddedItems(result, player, listBiddedItems.Offset, listBiddedItems.Sorts);
- result.DesiredDelay = uint32(throttle.DelayUntilNext.count());
- SendPacket(result.Write());
-}
-
-void WorldSession::HandleAuctionListBucketsByBucketKeys(WorldPackets::AuctionHouse::AuctionListBucketsByBucketKeys& listBucketsByBucketKeys)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, listBucketsByBucketKeys.TaintedBy.has_value());
- if (throttle.Throttled)
- return;
-
- Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(listBucketsByBucketKeys.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
- if (!creature)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionListBucketsByBucketKeys - {} not found or you can't interact with him.",
- listBucketsByBucketKeys.Auctioneer.ToString());
- return;
- }
-
- // remove fake death
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->GetFaction());
-
- WorldPackets::AuctionHouse::AuctionListBucketsResult listBucketsResult;
-
- auctionHouse->BuildListBuckets(listBucketsResult, _player, listBucketsByBucketKeys.BucketKeys, listBucketsByBucketKeys.Sorts);
-
- listBucketsResult.BrowseMode = AuctionHouseBrowseMode::SpecificKeys;
- listBucketsResult.DesiredDelay = uint32(throttle.DelayUntilNext.count());
- SendPacket(listBucketsResult.Write());
-}
-
-void WorldSession::HandleAuctionListItemsByBucketKey(WorldPackets::AuctionHouse::AuctionListItemsByBucketKey& listItemsByBucketKey)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, listItemsByBucketKey.TaintedBy.has_value());
- if (throttle.Throttled)
- return;
-
- Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(listItemsByBucketKey.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
- if (!creature)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionListItemsByBucketKey - {} not found or you can't interact with him.", listItemsByBucketKey.Auctioneer.ToString());
- return;
- }
-
- // remove fake death
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->GetFaction());
-
- WorldPackets::AuctionHouse::AuctionListItemsResult listItemsResult;
- listItemsResult.DesiredDelay = uint32(throttle.DelayUntilNext.count());
- listItemsResult.BucketKey = listItemsByBucketKey.BucketKey;
- ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(listItemsByBucketKey.BucketKey.ItemID);
- listItemsResult.ListType = itemTemplate && itemTemplate->GetMaxStackSize() > 1 ? AuctionHouseListType::Commodities : AuctionHouseListType::Items;
-
- auctionHouse->BuildListAuctionItems(listItemsResult, _player, listItemsByBucketKey.BucketKey, listItemsByBucketKey.Offset, listItemsByBucketKey.Sorts);
-
- SendPacket(listItemsResult.Write());
-}
-
-void WorldSession::HandleAuctionListItemsByItemID(WorldPackets::AuctionHouse::AuctionListItemsByItemID& listItemsByItemID)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, listItemsByItemID.TaintedBy.has_value());
- if (throttle.Throttled)
- return;
-
- Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(listItemsByItemID.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
- if (!creature)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionListItemsByItemID - {} not found or you can't interact with him.", listItemsByItemID.Auctioneer.ToString());
- return;
- }
-
- // remove fake death
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->GetFaction());
-
- WorldPackets::AuctionHouse::AuctionListItemsResult listItemsResult;
- listItemsResult.DesiredDelay = uint32(throttle.DelayUntilNext.count());
- listItemsResult.BucketKey.ItemID = listItemsByItemID.ItemID;
- ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(listItemsByItemID.ItemID);
- listItemsResult.ListType = itemTemplate && itemTemplate->GetMaxStackSize() > 1 ? AuctionHouseListType::Commodities : AuctionHouseListType::Items;
-
- auctionHouse->BuildListAuctionItems(listItemsResult, _player, listItemsByItemID.ItemID, listItemsByItemID.Offset, listItemsByItemID.Sorts);
-
- SendPacket(listItemsResult.Write());
-}
-
-//this void sends player info about his auctions
-void WorldSession::HandleAuctionListOwnedItems(WorldPackets::AuctionHouse::AuctionListOwnedItems& listOwnedItems)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, listOwnedItems.TaintedBy.has_value());
- if (throttle.Throttled)
- return;
-
- Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(listOwnedItems.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
- if (!creature)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionListOwnerItems - {} not found or you can't interact with him.", listOwnedItems.Auctioneer.ToString());
- return;
- }
-
- // remove fake death
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->GetFaction());
-
- WorldPackets::AuctionHouse::AuctionListOwnedItemsResult result;
-
- auctionHouse->BuildListOwnedItems(result, _player, listOwnedItems.Offset, listOwnedItems.Sorts);
- result.DesiredDelay = uint32(throttle.DelayUntilNext.count());
- SendPacket(result.Write());
-}
-
// this function is called when client bids or buys out auction
void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlaceBid& placeBid)
{
@@ -574,247 +275,6 @@ void WorldSession::HandleAuctionReplicateItems(WorldPackets::AuctionHouse::Aucti
SendPacket(response.Write());
}
-void WorldSession::HandleAuctionRequestFavoriteList(WorldPackets::AuctionHouse::AuctionRequestFavoriteList& /*requestFavoriteList*/)
-{
- CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_FAVORITE_AUCTIONS);
- stmt->setUInt64(0, _player->GetGUID().GetCounter());
- GetQueryProcessor().AddCallback(CharacterDatabase.AsyncQuery(stmt)).WithPreparedCallback([this](PreparedQueryResult favoriteAuctionResult)
- {
- WorldPackets::AuctionHouse::AuctionFavoriteList favoriteItems;
- if (favoriteAuctionResult)
- {
- favoriteItems.Items.reserve(favoriteAuctionResult->GetRowCount());
-
- do
- {
- Field* fields = favoriteAuctionResult->Fetch();
-
- WorldPackets::AuctionHouse::AuctionFavoriteInfo& item = favoriteItems.Items.emplace_back();
- item.Order = fields[0].GetUInt32();
- item.ItemID = fields[1].GetUInt32();
- item.ItemLevel = fields[2].GetUInt32();
- item.BattlePetSpeciesID = fields[3].GetUInt32();
- item.SuffixItemNameDescriptionID = fields[4].GetUInt32();
-
- } while (favoriteAuctionResult->NextRow());
-
- }
- SendPacket(favoriteItems.Write());
- });
-}
-
-void WorldSession::HandleAuctionSellCommodity(WorldPackets::AuctionHouse::AuctionSellCommodity& sellCommodity)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, sellCommodity.TaintedBy.has_value(), AuctionCommand::SellItem);
- if (throttle.Throttled)
- return;
-
- if (!sellCommodity.UnitPrice || sellCommodity.UnitPrice > MAX_MONEY_AMOUNT)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionSellItem - Player {} {} attempted to sell item with invalid price.", _player->GetName(), _player->GetGUID().ToString());
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::DatabaseError, throttle.DelayUntilNext);
- return;
- }
-
- // auction house does not deal with copper
- if (sellCommodity.UnitPrice % SILVER)
- {
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::DatabaseError, throttle.DelayUntilNext);
- return;
- }
-
- Creature* creature = GetPlayer()->GetNPCIfCanInteractWith(sellCommodity.Auctioneer, UNIT_NPC_FLAG_AUCTIONEER, UNIT_NPC_FLAG_2_NONE);
- if (!creature)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionSellItem - Unit {} not found or you can't interact with him.", sellCommodity.Auctioneer.ToString());
- return;
- }
-
- uint32 houseId = 0;
- AuctionHouseEntry const* auctionHouseEntry = AuctionHouseMgr::GetAuctionHouseEntry(creature->GetFaction(), &houseId);
- if (!auctionHouseEntry)
- {
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionSellItem - Unit {} has wrong faction.", sellCommodity.Auctioneer.ToString());
- return;
- }
-
- switch (sellCommodity.RunTime)
- {
- case 1 * MIN_AUCTION_TIME / MINUTE:
- case 2 * MIN_AUCTION_TIME / MINUTE:
- case 4 * MIN_AUCTION_TIME / MINUTE:
- break;
- default:
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::AuctionHouseBusy, throttle.DelayUntilNext);
- return;
- }
-
- if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
- GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
-
- // find all items for sale
- uint64 totalCount = 0;
- std::unordered_map<ObjectGuid, std::pair<Item*, uint64>> items2;
-
- for (WorldPackets::AuctionHouse::AuctionItemForSale const& itemForSale : sellCommodity.Items)
- {
- Item* item = _player->GetItemByGuid(itemForSale.Guid);
- if (!item)
- {
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::ItemNotFound, throttle.DelayUntilNext);
- return;
- }
-
- if (item->GetTemplate()->GetMaxStackSize() == 1)
- {
- // not commodity, must use different packet
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::ItemNotFound, throttle.DelayUntilNext);
- return;
- }
-
- // verify that all items belong to the same bucket
- if (!items2.empty() && AuctionsBucketKey::ForItem(item) != AuctionsBucketKey::ForItem(items2.begin()->second.first))
- {
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::ItemNotFound, throttle.DelayUntilNext);
- return;
- }
-
- if (sAuctionMgr->GetAItem(item->GetGUID()) || !item->CanBeTraded() || item->IsNotEmptyBag() ||
- item->GetTemplate()->HasFlag(ITEM_FLAG_CONJURED) || *item->m_itemData->Expiration ||
- item->GetCount() < itemForSale.UseCount)
- {
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::DatabaseError, throttle.DelayUntilNext);
- return;
- }
-
- std::pair<Item*, uint64>& soldItem = items2[item->GetGUID()];
- soldItem.first = item;
- soldItem.second += itemForSale.UseCount;
- if (item->GetCount() < soldItem.second)
- {
- // check that we have enough of this item to sell
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::ItemNotFound, throttle.DelayUntilNext);
- return;
- }
-
- totalCount += itemForSale.UseCount;
- }
-
- if (!totalCount)
- {
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::DatabaseError, throttle.DelayUntilNext);
- return;
- }
-
- Seconds auctionTime = Seconds(int64(std::chrono::duration_cast<Seconds>(Minutes(sellCommodity.RunTime)).count() * double(sWorld->getRate(RATE_AUCTION_TIME))));
- AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->GetFaction());
-
- uint64 deposit = AuctionHouseMgr::GetCommodityAuctionDeposit(items2.begin()->second.first->GetTemplate(), Minutes(sellCommodity.RunTime), totalCount);
- if (!_player->HasEnoughMoney(deposit))
- {
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::NotEnoughMoney, throttle.DelayUntilNext);
- return;
- }
-
- uint32 auctionId = sObjectMgr->GenerateAuctionID();
- AuctionPosting auction;
- auction.Id = auctionId;
- auction.Owner = _player->GetGUID();
- auction.OwnerAccount = GetAccountGUID();
- auction.BuyoutOrUnitPrice = sellCommodity.UnitPrice;
- auction.Deposit = deposit;
- auction.StartTime = GameTime::GetSystemTime();
- auction.EndTime = auction.StartTime + auctionTime;
-
- // keep track of what was cloned to undo/modify counts later
- std::unordered_map<Item* /*original*/, std::unique_ptr<Item> /*clone*/> clones;
- for (std::pair<ObjectGuid const, std::pair<Item*, uint64>>& it : items2)
- {
- Item* itemForSale;
- if (it.second.first->GetCount() != it.second.second)
- {
- itemForSale = it.second.first->CloneItem(it.second.second, _player);
- if (!itemForSale)
- {
- TC_LOG_ERROR("network", "CMSG_AUCTION_SELL_COMMODITY: Could not create clone of item {}", it.second.first->GetEntry());
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::DatabaseError, throttle.DelayUntilNext);
- return;
- }
-
- clones.emplace(it.second.first, itemForSale);
- }
- }
-
- if (!sAuctionMgr->PendingAuctionAdd(_player, auctionHouse->GetAuctionHouseId(), auction.Id, auction.Deposit))
- {
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::NotEnoughMoney, throttle.DelayUntilNext);
- return;
- }
-
- TC_LOG_INFO("network", "CMSG_AUCTION_SELL_COMMODITY: {} {} is selling item {} {} to auctioneer {} with count {} with with unit price {} and with time {} (in sec) in auctionhouse {}",
- _player->GetGUID().ToString(), _player->GetName(), items2.begin()->second.first->GetNameForLocaleIdx(sWorld->GetDefaultDbcLocale()),
- ([&items2]()
- {
- std::stringstream ss;
- auto itr = items2.begin();
- ss << (itr++)->first.ToString();
- for (; itr != items2.end(); ++itr)
- ss << ',' << itr->first.ToString();
- return ss.str();
- }()).c_str(),
- creature->GetGUID().ToString().c_str(), totalCount, sellCommodity.UnitPrice, uint32(auctionTime.count()), auctionHouse->GetAuctionHouseId());
-
- if (HasPermission(rbac::RBAC_PERM_LOG_GM_TRADE))
- {
- Item* logItem = items2.begin()->second.first;
- sLog->OutCommand(GetAccountId(), "GM {} (Account: {}) create auction: {} (Entry: {} Count: {})",
- GetPlayerName(), GetAccountId(), logItem->GetNameForLocaleIdx(sWorld->GetDefaultDbcLocale()), logItem->GetEntry(), totalCount);
- }
-
- CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
-
- for (std::pair<ObjectGuid const, std::pair<Item*, uint64>> const& it : items2)
- {
- Item* itemForSale = it.second.first;
- auto cloneItr = clones.find(it.second.first);
- if (cloneItr != clones.end())
- {
- Item* original = itemForSale;
- original->SetCount(original->GetCount() - uint32(it.second.second));
- original->SetState(ITEM_CHANGED, _player);
- _player->ItemRemovedQuestCheck(original->GetEntry(), uint32(it.second.second));
- original->SaveToDB(trans);
-
- itemForSale = cloneItr->second.release();
- }
- else
- {
- _player->MoveItemFromInventory(itemForSale->GetBagSlot(), itemForSale->GetSlot(), true);
- itemForSale->DeleteFromInventoryDB(trans);
- }
-
- itemForSale->SaveToDB(trans);
- auction.Items.push_back(itemForSale);
- }
-
- auctionHouse->AddAuction(trans, std::move(auction));
- _player->SaveInventoryAndGoldToDB(trans);
-
- AddTransactionCallback(CharacterDatabase.AsyncCommitTransaction(trans)).AfterComplete([this, auctionId, auctionPlayerGuid = _player->GetGUID(), throttle](bool success)
- {
- if (GetPlayer() && GetPlayer()->GetGUID() == auctionPlayerGuid)
- {
- if (success)
- {
- GetPlayer()->UpdateCriteria(CriteriaType::ItemsPostedAtAuction, 1);
- SendAuctionCommandResult(auctionId, AuctionCommand::SellItem, AuctionResult::Ok, throttle.DelayUntilNext);
- }
- else
- SendAuctionCommandResult(0, AuctionCommand::SellItem, AuctionResult::DatabaseError, throttle.DelayUntilNext);
- }
- });
-}
-
void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSellItem& sellItem)
{
AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, sellItem.TaintedBy.has_value(), AuctionCommand::SellItem);
@@ -963,34 +423,6 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell
});
}
-void WorldSession::HandleAuctionSetFavoriteItem(WorldPackets::AuctionHouse::AuctionSetFavoriteItem& setFavoriteItem)
-{
- AuctionThrottleResult throttle = sAuctionMgr->CheckThrottle(_player, false);
- if (throttle.Throttled)
- return;
-
- CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
-
- CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_FAVORITE_AUCTION);
- stmt->setUInt64(0, _player->GetGUID().GetCounter());
- stmt->setUInt32(1, setFavoriteItem.Item.Order);
- trans->Append(stmt);
-
- if (!setFavoriteItem.IsNotFavorite)
- {
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_FAVORITE_AUCTION);
- stmt->setUInt64(0, _player->GetGUID().GetCounter());
- stmt->setUInt32(1, setFavoriteItem.Item.Order);
- stmt->setUInt32(2, setFavoriteItem.Item.ItemID);
- stmt->setUInt32(3, setFavoriteItem.Item.ItemLevel);
- stmt->setUInt32(4, setFavoriteItem.Item.BattlePetSpeciesID);
- stmt->setUInt32(5, setFavoriteItem.Item.SuffixItemNameDescriptionID);
- trans->Append(stmt);
- }
-
- CharacterDatabase.CommitTransaction(trans);
-}
-
//this void causes that auction window is opened
void WorldSession::SendAuctionHello(ObjectGuid guid, Unit const* unit)
{