aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/LootHandler.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-09-18 16:33:38 +0200
committerShauren <shauren.trinity@gmail.com>2022-09-18 16:33:38 +0200
commit8c20f620d7b070b13b40803095e5fa97f9349512 (patch)
tree0e5d718500cf8139945234cb1f36a53986e05dea /src/server/game/Handlers/LootHandler.cpp
parentc00e2e4851498aa04ac1d8ff13a0759b245df72b (diff)
Core/Loot: Move loot generation out of Player::SendLoot
Diffstat (limited to 'src/server/game/Handlers/LootHandler.cpp')
-rw-r--r--src/server/game/Handlers/LootHandler.cpp54
1 files changed, 28 insertions, 26 deletions
diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp
index a367e18da8e..3d32e72e66e 100644
--- a/src/server/game/Handlers/LootHandler.cpp
+++ b/src/server/game/Handlers/LootHandler.cpp
@@ -44,12 +44,14 @@ public:
AELootCreatureCheck(Player* looter, ObjectGuid mainLootTarget) : _looter(looter), _mainLootTarget(mainLootTarget) { }
- bool operator()(Creature* creature) const
+ bool operator()(Creature const* creature) const
{
- if (creature->IsAlive())
- return false;
+ return IsValidAELootTarget(creature);
+ }
- if (creature->GetGUID() == _mainLootTarget)
+ bool IsValidLootTarget(Creature const* creature) const
+ {
+ if (creature->IsAlive())
return false;
if (!_looter->IsWithinDist(creature, LootDistance))
@@ -58,6 +60,15 @@ public:
return _looter->isAllowedToLoot(creature);
}
+ bool IsValidAELootTarget(Creature const* creature) const
+ {
+ if (creature->GetGUID() == _mainLootTarget)
+ return false;
+
+ return IsValidLootTarget(creature);
+ }
+
+private:
Player* _looter;
ObjectGuid _mainLootTarget;
};
@@ -201,14 +212,21 @@ void WorldSession::HandleLootOpcode(WorldPackets::Loot::LootUnit& packet)
if (!GetPlayer()->IsAlive() || !packet.Unit.IsCreatureOrVehicle())
return;
+ Creature* lootTarget = ObjectAccessor::GetCreature(*GetPlayer(), packet.Unit);
+ if (!lootTarget)
+ return;
+
+ AELootCreatureCheck check(_player, packet.Unit);
+ if (!check.IsValidLootTarget(lootTarget))
+ return;
+
// interrupt cast
if (GetPlayer()->IsNonMeleeSpellCast(false))
GetPlayer()->InterruptNonMeleeSpells(false);
GetPlayer()->RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags::Looting);
- std::list<Creature*> corpses;
- AELootCreatureCheck check(_player, packet.Unit);
+ std::vector<Creature*> corpses;
Trinity::CreatureListSearcher<AELootCreatureCheck> searcher(_player, corpses, check);
Cell::VisitGridObjects(_player, searcher, AELootCreatureCheck::LootDistance);
@@ -246,6 +264,8 @@ void WorldSession::DoLootRelease(Loot* loot)
if (player->GetLootGUID() == lguid)
player->SetLootGUID(ObjectGuid::Empty);
+ //Player is not looking at loot list, he doesn't need to see updates on the loot list
+ loot->RemoveLooter(player->GetGUID());
player->SendLootRelease(lguid);
player->m_AELootView.erase(loot->GetGUID());
@@ -263,12 +283,7 @@ void WorldSession::DoLootRelease(Loot* loot)
if (!go || ((go->GetOwnerGUID() != player->GetGUID() && go->GetGoType() != GAMEOBJECT_TYPE_FISHINGHOLE) && !go->IsWithinDistInMap(player)))
return;
- if (go->GetGoType() == GAMEOBJECT_TYPE_DOOR)
- {
- // locked doors are opened with spelleffect openlock, prevent remove its as looted
- go->UseDoorOrButton();
- }
- else if (loot->isLooted() || go->GetGoType() == GAMEOBJECT_TYPE_FISHINGNODE)
+ if (loot->isLooted() || go->GetGoType() == GAMEOBJECT_TYPE_FISHINGNODE || go->GetGoType() == GAMEOBJECT_TYPE_FISHINGHOLE)
{
if (go->GetGoType() == GAMEOBJECT_TYPE_FISHINGHOLE)
{ // The fishing hole used once more
@@ -287,10 +302,6 @@ void WorldSession::DoLootRelease(Loot* loot)
{
// not fully looted object
go->SetLootState(GO_ACTIVATED, player);
-
- // if the round robin player release, reset it.
- if (player->GetGUID() == loot->roundRobinPlayer)
- loot->roundRobinPlayer.Clear();
}
}
else if (lguid.IsCorpse()) // ONLY remove insignia at BG
@@ -317,7 +328,7 @@ void WorldSession::DoLootRelease(Loot* loot)
if (loot->loot_type == LOOT_PROSPECTING || loot->loot_type == LOOT_MILLING)
{
pItem->m_lootGenerated = false;
- pItem->m_loot.reset();
+ pItem->m_loot = nullptr;
uint32 count = pItem->GetCount();
@@ -341,12 +352,6 @@ void WorldSession::DoLootRelease(Loot* loot)
if (!creature)
return;
- if (!creature->IsWithinDistInMap(player, AELootCreatureCheck::LootDistance))
- return;
-
- if (creature->IsAlive() != (loot && loot->loot_type == LOOT_PICKPOCKETING))
- return;
-
if (loot->isLooted())
{
creature->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE);
@@ -367,9 +372,6 @@ void WorldSession::DoLootRelease(Loot* loot)
creature->ForceUpdateFieldChange(creature->m_values.ModifyValue(&Object::m_objectData).ModifyValue(&UF::ObjectData::DynamicFlags));
}
}
-
- //Player is not looking at loot list, he doesn't need to see updates on the loot list
- loot->RemoveLooter(player->GetGUID());
}
void WorldSession::DoLootReleaseAll()