aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-05-30 21:28:02 +0200
committerShauren <shauren.trinity@gmail.com>2023-05-30 21:28:02 +0200
commitfb699dc641342c1e1a094ec5bff7b5e581dd0d01 (patch)
tree2119a1db823ed89e44eaa5016c886c1504a1f67d
parentd5ef68bc9b4523c0543206b16050644fbc1f5731 (diff)
Core/Loot: Fixed loot roll exploit
Closes #29042
-rw-r--r--src/server/game/Groups/Group.cpp12
-rw-r--r--src/server/game/Groups/Group.h2
-rw-r--r--src/server/game/Handlers/GroupHandler.cpp3
3 files changed, 10 insertions, 7 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 791960facd5..9b0b13f0518 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1385,21 +1385,21 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject)
}
}
-void Group::CountRollVote(ObjectGuid playerGUID, ObjectGuid Guid, uint8 Choice)
+bool Group::CountRollVote(ObjectGuid playerGUID, ObjectGuid Guid, uint8 Choice)
{
Rolls::iterator rollI = GetRoll(Guid);
if (rollI == RollId.end())
- return;
+ return false;
Roll* roll = *rollI;
Roll::PlayerVote::iterator itr = roll->playerVote.find(playerGUID);
// this condition means that player joins to the party after roll begins
- if (itr == roll->playerVote.end())
- return;
+ if (itr == roll->playerVote.end() || itr->second != NOT_EMITED_YET)
+ return false;
if (roll->getLoot())
if (roll->getLoot()->items.empty())
- return;
+ return false;
switch (Choice)
{
@@ -1427,6 +1427,8 @@ void Group::CountRollVote(ObjectGuid playerGUID, ObjectGuid Guid, uint8 Choice)
if (roll->totalPass + roll->totalNeed + roll->totalGreed >= roll->totalPlayersRolling)
CountTheRoll(rollI, nullptr);
+
+ return true;
}
//called when roll timer expires
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index d316bfeaddc..4bf4378686b 100644
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -312,7 +312,7 @@ class TC_GAME_API Group
void MasterLoot(Loot* loot, WorldObject* pLootedObject);
Rolls::iterator GetRoll(ObjectGuid Guid);
void CountTheRoll(Rolls::iterator roll, Map* allowedMap);
- void CountRollVote(ObjectGuid playerGUID, ObjectGuid Guid, uint8 Choise);
+ bool CountRollVote(ObjectGuid playerGUID, ObjectGuid Guid, uint8 Choise);
void EndRoll(Loot* loot, Map* allowedMap);
// related to disenchant rolls
diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp
index 85fabdf254a..d6bcfd04741 100644
--- a/src/server/game/Handlers/GroupHandler.cpp
+++ b/src/server/game/Handlers/GroupHandler.cpp
@@ -480,7 +480,8 @@ void WorldSession::HandleLootRoll(WorldPacket& recvData)
if (!group)
return;
- group->CountRollVote(GetPlayer()->GetGUID(), guid, rollType);
+ if (!group->CountRollVote(GetPlayer()->GetGUID(), guid, rollType))
+ return;
switch (rollType)
{