diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Handlers/AuctionHouseHandler.cpp | 43 | ||||
-rw-r--r-- | src/server/game/Server/Packets/PacketUtilities.h | 2 |
2 files changed, 25 insertions, 20 deletions
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp index dc846cc10a7..9723e98a694 100644 --- a/src/server/game/Handlers/AuctionHouseHandler.cpp +++ b/src/server/game/Handlers/AuctionHouseHandler.cpp @@ -161,25 +161,27 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); uint32 finalCount = 0; - for (auto const& packetItem : packet.Items) + std::array<Item*, decltype(packet.Items)::max_capacity::value> items; + items.fill(nullptr); + for (std::size_t i = 0; i < packet.Items.size(); ++i) { - Item* item = _player->GetItemByGuid(packetItem.Guid); + items[i] = _player->GetItemByGuid(packet.Items[i].Guid); - if (!item) + if (!items[i]) { SendAuctionCommandResult(NULL, AUCTION_SELL_ITEM, ERR_AUCTION_ITEM_NOT_FOUND); return; } - if (sAuctionMgr->GetAItem(item->GetGUID().GetCounter()) || !item->CanBeTraded() || item->IsNotEmptyBag() || - item->GetTemplate()->GetFlags() & ITEM_FLAG_CONJURED || item->GetUInt32Value(ITEM_FIELD_DURATION) || - item->GetCount() < packetItem.UseCount) + if (sAuctionMgr->GetAItem(items[i]->GetGUID().GetCounter()) || !items[i]->CanBeTraded() || items[i]->IsNotEmptyBag() || + items[i]->GetTemplate()->GetFlags() & ITEM_FLAG_CONJURED || items[i]->GetUInt32Value(ITEM_FIELD_DURATION) || + items[i]->GetCount() < packet.Items[i].UseCount) { SendAuctionCommandResult(NULL, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } - finalCount += packetItem.UseCount; + finalCount += packet.Items[i].UseCount; } if (packet.Items.empty()) @@ -195,30 +197,33 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell } // check if there are 2 identical guids, in this case user is most likely cheating - for (uint32 i = 0; i < packet.Items.size() - 1; ++i) + for (std::size_t i = 0; i < packet.Items.size() - 1; ++i) { - for (uint32 j = i + 1; j < packet.Items.size(); ++j) + for (std::size_t j = i + 1; j < packet.Items.size(); ++j) { if (packet.Items[i].Guid == packet.Items[j].Guid) { SendAuctionCommandResult(NULL, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } + if (items[i]->GetEntry() != items[j]->GetEntry()) + { + SendAuctionCommandResult(NULL, AUCTION_SELL_ITEM, ERR_AUCTION_ITEM_NOT_FOUND); + return; + } } } - for (auto const& packetItem : packet.Items) + for (std::size_t i = 0; i < packet.Items.size(); ++i) { - Item* item = _player->GetItemByGuid(packetItem.Guid); - - if (item->GetMaxStackCount() < finalCount) + if (items[i]->GetMaxStackCount() < finalCount) { SendAuctionCommandResult(NULL, AUCTION_SELL_ITEM, ERR_AUCTION_DATABASE_ERROR); return; } } - Item* item = _player->GetItemByGuid(packet.Items[0].Guid); + Item* item = items[0]; uint32 auctionTime = uint32(packet.RunTime * sWorld->getRate(RATE_AUCTION_TIME)); AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction()); @@ -317,12 +322,12 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell auctionHouse->AddAuction(AH); sAuctionMgr->PendingAuctionAdd(_player, AH); - for (auto const& packetItem : packet.Items) + for (std::size_t i = 0; i < packet.Items.size(); ++i) { - Item* item2 = _player->GetItemByGuid(packetItem.Guid); + Item* item2 = items[i]; // Item stack count equals required count, ready to delete item - cloned item will be used for auction - if (item2->GetCount() == packetItem.UseCount) + if (item2->GetCount() == packet.Items[i].UseCount) { _player->MoveItemFromInventory(item2->GetBagSlot(), item2->GetSlot(), true); @@ -334,9 +339,9 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell } else // Item stack count is bigger than required count, update item stack count and save to database - cloned item will be used for auction { - item2->SetCount(item2->GetCount() - packetItem.UseCount); + item2->SetCount(item2->GetCount() - packet.Items[i].UseCount); item2->SetState(ITEM_CHANGED, _player); - _player->ItemRemovedQuestCheck(item2->GetEntry(), packetItem.UseCount); + _player->ItemRemovedQuestCheck(item2->GetEntry(), packet.Items[i].UseCount); item2->SendUpdateToPlayer(_player); SQLTransaction trans = CharacterDatabase.BeginTransaction(); diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index 44a4e22a74e..07ddf4a6fad 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -35,6 +35,7 @@ namespace WorldPackets template<typename T, std::size_t N> class Array { + public: typedef boost::container::static_vector<T, N> storage_type; typedef std::integral_constant<std::size_t, N> max_capacity; @@ -46,7 +47,6 @@ namespace WorldPackets typedef typename storage_type::iterator iterator; typedef typename storage_type::const_iterator const_iterator; - public: Array() { } iterator begin() { return _storage.begin(); } |