mirror of
https://gitcode.com/GitHub_Trending/az/azerothcore-wotlk.git
synced 2026-07-11 03:13:10 +00:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user