fix(Core/Player): Loot Chest eligibility and re-send loot rolls (#26469)
This commit is contained in:
@@ -7896,6 +7896,15 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type)
|
|||||||
// get next RR player (for next loot)
|
// get next RR player (for next loot)
|
||||||
if (groupRules && !go->loot.empty())
|
if (groupRules && !go->loot.empty())
|
||||||
group->UpdateLooterGuid(go);
|
group->UpdateLooterGuid(go);
|
||||||
|
|
||||||
|
if (groupRules)
|
||||||
|
{
|
||||||
|
GuidUnorderedSet const& allowedLooters = go->GetAllowedLooters();
|
||||||
|
if (!allowedLooters.empty())
|
||||||
|
for (ObjectGuid const& allowedGuid : allowedLooters)
|
||||||
|
if (Player* allowedPlayer = ObjectAccessor::FindPlayer(allowedGuid))
|
||||||
|
loot->FillNotNormalLootFor(allowedPlayer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())
|
if (GameObjectTemplateAddon const* addon = go->GetTemplateAddon())
|
||||||
loot->generateMoneyLoot(addon->mingold, addon->maxgold);
|
loot->generateMoneyLoot(addon->mingold, addon->maxgold);
|
||||||
@@ -11761,6 +11770,13 @@ void Player::SendInitialPacketsAfterAddToMap()
|
|||||||
}
|
}
|
||||||
else if (GetRaidDifficulty() != GetStoredRaidDifficulty())
|
else if (GetRaidDifficulty() != GetStoredRaidDifficulty())
|
||||||
SendRaidDifficulty(GetGroup() != nullptr);
|
SendRaidDifficulty(GetGroup() != nullptr);
|
||||||
|
|
||||||
|
// Re-send any pending group loot rolls to this player when they enter a dungeon/raid.
|
||||||
|
if (Map* map = GetMap())
|
||||||
|
if (map->IsDungeon() || map->IsRaid())
|
||||||
|
if (Group* group = GetGroup())
|
||||||
|
group->SendPendingRollsToPlayer(this, map);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Player::SendUpdateToOutOfRangeGroupMembers()
|
void Player::SendUpdateToOutOfRangeGroupMembers()
|
||||||
|
|||||||
@@ -880,6 +880,50 @@ void Group::SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll& r)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Group::SendPendingRollsToPlayer(Player* player, Map* map)
|
||||||
|
{
|
||||||
|
for (Roll* roll : RollId)
|
||||||
|
{
|
||||||
|
auto itr = roll->playerVote.find(player->GetGUID());
|
||||||
|
if (itr == roll->playerVote.end())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (itr->second != NOT_EMITED_YET)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Loot* loot = roll->getLoot();
|
||||||
|
if (!loot)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Get remaining time from the loot source object
|
||||||
|
uint32 remainingTime = 60000;
|
||||||
|
WorldObject* lootedObject = nullptr;
|
||||||
|
if (GameObject* go = loot->sourceGameObject)
|
||||||
|
{
|
||||||
|
remainingTime = go->m_groupLootTimer;
|
||||||
|
lootedObject = go;
|
||||||
|
}
|
||||||
|
else if (!loot->sourceWorldObjectGUID.IsEmpty())
|
||||||
|
{
|
||||||
|
if (Creature* creature = map->GetCreature(loot->sourceWorldObjectGUID))
|
||||||
|
{
|
||||||
|
remainingTime = creature->m_groupLootTimer;
|
||||||
|
lootedObject = creature;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool canNeed = true;
|
||||||
|
if (GetLootMethod() == NEED_BEFORE_GREED)
|
||||||
|
{
|
||||||
|
ItemTemplate const* proto = sObjectMgr->GetItemTemplate(roll->itemid);
|
||||||
|
if (proto && lootedObject)
|
||||||
|
canNeed = (player->CanRollForItemInLFG(proto, lootedObject) == EQUIP_ERR_OK);
|
||||||
|
}
|
||||||
|
|
||||||
|
SendLootStartRollToPlayer(remainingTime, map->GetId(), player, canNeed, *roll);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Group::SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p, bool canNeed, Roll const& r)
|
void Group::SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p, bool canNeed, Roll const& r)
|
||||||
{
|
{
|
||||||
if (!p)
|
if (!p)
|
||||||
@@ -1036,7 +1080,12 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject)
|
|||||||
Player* member = itr->GetSource();
|
Player* member = itr->GetSource();
|
||||||
if (!member || !member->GetSession())
|
if (!member || !member->GetSession())
|
||||||
continue;
|
continue;
|
||||||
if (member->IsAtLootRewardDistance(pLootedObject))
|
|
||||||
|
bool canLoot = member->IsAtLootRewardDistance(pLootedObject);
|
||||||
|
if (!canLoot && !pLootedObject->GetAllowedLooters().empty())
|
||||||
|
canLoot = pLootedObject->HasAllowedLooter(member->GetGUID());
|
||||||
|
|
||||||
|
if (canLoot)
|
||||||
{
|
{
|
||||||
r->totalPlayersRolling++;
|
r->totalPlayersRolling++;
|
||||||
|
|
||||||
@@ -1122,7 +1171,11 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject)
|
|||||||
if (!member || !member->GetSession())
|
if (!member || !member->GetSession())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (member->IsAtLootRewardDistance(pLootedObject))
|
bool canLoot = member->IsAtLootRewardDistance(pLootedObject);
|
||||||
|
if (!canLoot && !pLootedObject->GetAllowedLooters().empty())
|
||||||
|
canLoot = pLootedObject->HasAllowedLooter(member->GetGUID());
|
||||||
|
|
||||||
|
if (canLoot)
|
||||||
{
|
{
|
||||||
r->totalPlayersRolling++;
|
r->totalPlayersRolling++;
|
||||||
|
|
||||||
@@ -1186,7 +1239,11 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject)
|
|||||||
if (!playerToRoll || !playerToRoll->GetSession())
|
if (!playerToRoll || !playerToRoll->GetSession())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (playerToRoll->IsAtGroupRewardDistance(lootedObject))
|
bool canLoot = playerToRoll->IsAtGroupRewardDistance(lootedObject);
|
||||||
|
if (!canLoot && !lootedObject->GetAllowedLooters().empty())
|
||||||
|
canLoot = lootedObject->HasAllowedLooter(playerToRoll->GetGUID());
|
||||||
|
|
||||||
|
if (canLoot)
|
||||||
{
|
{
|
||||||
r->totalPlayersRolling++;
|
r->totalPlayersRolling++;
|
||||||
|
|
||||||
@@ -1335,6 +1392,7 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject)
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Player*> looters;
|
std::vector<Player*> looters;
|
||||||
|
bool hasAllowedLooters = !pLootedObject->GetAllowedLooters().empty();
|
||||||
for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
|
for (GroupReference* itr = GetFirstMember(); itr != nullptr; itr = itr->next())
|
||||||
{
|
{
|
||||||
Player* looter = itr->GetSource();
|
Player* looter = itr->GetSource();
|
||||||
@@ -1343,7 +1401,11 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (looter->IsAtLootRewardDistance(pLootedObject))
|
bool canLoot = looter->IsAtLootRewardDistance(pLootedObject);
|
||||||
|
if (!canLoot && hasAllowedLooters)
|
||||||
|
canLoot = pLootedObject->HasAllowedLooter(looter->GetGUID());
|
||||||
|
|
||||||
|
if (canLoot)
|
||||||
{
|
{
|
||||||
looters.push_back(looter);
|
looters.push_back(looter);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -295,6 +295,7 @@ public:
|
|||||||
bool isRollLootActive() const;
|
bool isRollLootActive() const;
|
||||||
void SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll& r);
|
void SendLootStartRoll(uint32 CountDown, uint32 mapid, const Roll& r);
|
||||||
void SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p, bool canNeed, Roll const& r);
|
void SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p, bool canNeed, Roll const& r);
|
||||||
|
void SendPendingRollsToPlayer(Player* player, Map* map);
|
||||||
void SendLootRoll(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll& r, bool autoPass = false);
|
void SendLootRoll(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll& r, bool autoPass = false);
|
||||||
void SendLootRollWon(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll& r);
|
void SendLootRollWon(ObjectGuid SourceGuid, ObjectGuid TargetGuid, uint8 RollNumber, uint8 RollType, const Roll& r);
|
||||||
void SendLootAllPassed(Roll const& roll);
|
void SendLootAllPassed(Roll const& roll);
|
||||||
|
|||||||
Reference in New Issue
Block a user