fix(Core/Loot): keep group loot rolls when the roller leaves the loot's map (#26332)

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Andrew
2026-06-24 04:01:57 -03:00
committed by GitHub
parent a625997533
commit dd7af13fb3
4 changed files with 12 additions and 12 deletions
@@ -750,7 +750,7 @@ void Creature::Update(uint32 diff)
{
Group* group = sGroupMgr->GetGroupByGUID(lootingGroupLowGUID);
if (group)
group->EndRoll(&loot, GetMap());
group->EndRoll(&loot);
m_groupLootTimer = 0;
lootingGroupLowGUID = 0;
}
@@ -766,7 +766,7 @@ void GameObject::Update(uint32 diff)
{
Group* group = sGroupMgr->GetGroupByGUID(lootingGroupLowGUID);
if (group)
group->EndRoll(&loot, GetMap());
group->EndRoll(&loot);
m_groupLootTimer = 0;
lootingGroupLowGUID = 0;
}
+8 -8
View File
@@ -1407,20 +1407,20 @@ bool Group::CountRollVote(ObjectGuid playerGUID, ObjectGuid Guid, uint8 Choice)
if (roll->totalPass + roll->totalNeed + roll->totalGreed >= roll->totalPlayersRolling)
{
CountTheRoll(rollI, nullptr);
CountTheRoll(rollI);
return true;
}
return false;
}
//called when roll timer expires
void Group::EndRoll(Loot* pLoot, Map* allowedMap)
void Group::EndRoll(Loot* pLoot)
{
for (Rolls::iterator itr = RollId.begin(); itr != RollId.end();)
{
if ((*itr)->getLoot() == pLoot)
{
CountTheRoll(itr, allowedMap); //i don't have to edit player votes, who didn't vote ... he will pass
CountTheRoll(itr); //i don't have to edit player votes, who didn't vote ... he will pass
itr = RollId.begin();
}
else
@@ -1459,7 +1459,7 @@ void Group::RemovePlayerFromRolls(ObjectGuid guid)
}
}
void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
void Group::CountTheRoll(Rolls::iterator rollI)
{
Roll* roll = *rollI;
if (!roll->isValid()) // is loot already deleted ?
@@ -1484,7 +1484,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
continue;
player = ObjectAccessor::FindPlayer(itr->first);
if (!player || (allowedMap != nullptr && player->FindMap() != allowedMap))
if (!player)
{
--roll->totalNeed;
continue;
@@ -1548,7 +1548,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
roll->totalNeed = 0;
}
}
if (roll->totalNeed == 0 && roll->totalGreed > 0) // pussywizard: if (roll->totalNeed == 0 && ...), not else if, because numbers can be modified above if player is on a different map
if (roll->totalNeed == 0 && roll->totalGreed > 0) // if (roll->totalNeed == 0 && ...), not else if, because totalNeed can be decremented above when a needing player is offline
{
if (!roll->playerVote.empty())
{
@@ -1564,7 +1564,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
continue;
player = ObjectAccessor::FindPlayer(itr->first);
if (!player || (allowedMap != nullptr && player->FindMap() != allowedMap))
if (!player)
{
--roll->totalGreed;
continue;
@@ -1662,7 +1662,7 @@ void Group::CountTheRoll(Rolls::iterator rollI, Map* allowedMap)
roll->totalGreed = 0;
}
}
if (roll->totalNeed == 0 && roll->totalGreed == 0) // pussywizard: if, not else, because numbers can be modified above if player is on a different map
if (roll->totalNeed == 0 && roll->totalGreed == 0) // if, not else, because the totals can be decremented above when a rolling player is offline
{
SendLootAllPassed(*roll);
+2 -2
View File
@@ -303,9 +303,9 @@ public:
void NeedBeforeGreed(Loot* loot, WorldObject* pLootedObject);
void MasterLoot(Loot* loot, WorldObject* pLootedObject);
Rolls::iterator GetRoll(ObjectGuid Guid);
void CountTheRoll(Rolls::iterator roll, Map* allowedMap);
void CountTheRoll(Rolls::iterator roll);
bool CountRollVote(ObjectGuid playerGUID, ObjectGuid Guid, uint8 Choise);
void EndRoll(Loot* loot, Map* allowedMap);
void EndRoll(Loot* loot);
void RemovePlayerFromRolls(ObjectGuid guid);
// related to disenchant rolls