From d6e44477baee31f8aa9c466c564ea3ce14088e23 Mon Sep 17 00:00:00 2001 From: Tristan Cormier Date: Sat, 28 Jan 2017 02:10:01 -0500 Subject: [PATCH] Fixed a bug where the pickpocket spell would share picked up money with the caster's group. Fixes #2. --- src/game/WorldHandlers/LootHandler.cpp | 50 ++++++++++++++------------ 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/src/game/WorldHandlers/LootHandler.cpp b/src/game/WorldHandlers/LootHandler.cpp index ca6ded6c..c40b5014 100644 --- a/src/game/WorldHandlers/LootHandler.cpp +++ b/src/game/WorldHandlers/LootHandler.cpp @@ -270,35 +270,41 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recv_data*/) if (pLoot) { pLoot->NotifyMoneyRemoved(); - - if (!guid.IsItem() && player->GetGroup()) // item can be looted only single player + // Items/objects can ONLY be looted by a single player + if (!guid.IsItem() && player->GetGroup()) { - Group* group = player->GetGroup(); + // Pickpocket case + if (player->getClass() == CLASS_ROGUE && GetPlayer()->GetMap()->GetCreature(guid)->lootForPickPocketed) + player->ModifyMoney(pLoot->gold); + else + { + Group* group = player->GetGroup(); - std::vector playersNear; - for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) - { - Player* playerGroup = itr->getSource(); - if (!playerGroup) - { continue; } - if (player->IsWithinDistInMap(playerGroup, sWorld.getConfig(CONFIG_FLOAT_GROUP_XP_DISTANCE), false)) - { playersNear.push_back(playerGroup); } - } + std::vector playersNear; + for (GroupReference* itr = group->GetFirstMember(); itr != NULL; itr = itr->next()) + { + Player* playerGroup = itr->getSource(); + if (!playerGroup) + continue; + if (player->IsWithinDistInMap(playerGroup, sWorld.getConfig(CONFIG_FLOAT_GROUP_XP_DISTANCE), false)) + playersNear.push_back(playerGroup); + } - uint32 money_per_player = uint32((pLoot->gold) / (playersNear.size())); + uint32 money_per_player = uint32((pLoot->gold) / (playersNear.size())); - for (std::vector::const_iterator i = playersNear.begin(); i != playersNear.end(); ++i) - { - (*i)->ModifyMoney(money_per_player); + for (std::vector::const_iterator i = playersNear.begin(); i != playersNear.end(); ++i) + { + (*i)->ModifyMoney(money_per_player); - WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4); - data << uint32(money_per_player); + WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4); + data << uint32(money_per_player); - (*i)->GetSession()->SendPacket(&data); - } + (*i)->GetSession()->SendPacket(&data); + } + } } else - { player->ModifyMoney(pLoot->gold); } + player->ModifyMoney(pLoot->gold); // Used by Eluna #ifdef ENABLE_ELUNA @@ -308,7 +314,7 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recv_data*/) pLoot->gold = 0; if (pItem) - { pItem->SetLootState(ITEM_LOOT_CHANGED); } + pItem->SetLootState(ITEM_LOOT_CHANGED); } }