aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp43
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h2
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(); }