diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-09-18 16:33:38 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-09-18 16:33:38 +0200 |
commit | 8c20f620d7b070b13b40803095e5fa97f9349512 (patch) | |
tree | 0e5d718500cf8139945234cb1f36a53986e05dea /src/server/game/Handlers/LootHandler.cpp | |
parent | c00e2e4851498aa04ac1d8ff13a0759b245df72b (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.cpp | 54 |
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() |