From ebf799c0f696ec88be66795d4ad0a20fa5ce5e92 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 12 Mar 2023 13:05:35 +0100 Subject: Core/Creatures: Allow disabling loot for creatures --- src/server/game/Entities/Creature/Creature.h | 2 ++ src/server/game/Entities/Unit/Unit.cpp | 7 ++++++- src/server/game/Spells/SpellInfo.cpp | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) (limited to 'src/server') diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index ed1657c9b21..af4c4b4517d 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -229,6 +229,8 @@ class TC_GAME_API Creature : public Unit, public GridObject, public Ma virtual void SaveToDB(uint32 mapid, std::vector const& spawnDifficulties); static bool DeleteFromDB(ObjectGuid::LowType spawnId); + bool CanHaveLoot() const { return !_staticFlags.HasFlag(CREATURE_STATIC_FLAG_NO_LOOT); } + void SetCanHaveLoot(bool canHaveLoot) { _staticFlags.ApplyFlag(CREATURE_STATIC_FLAG_NO_LOOT, !canHaveLoot); } std::unique_ptr m_loot; std::unordered_map> m_personalLoot; void StartPickPocketRefillTimer(); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index bcf16472b1e..21fe8c16be7 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10631,10 +10631,15 @@ void Unit::SetMeleeAnimKitId(uint16 animKitId) std::vector tappers; if (isRewardAllowed && creature) + { for (ObjectGuid tapperGuid : creature->GetTapList()) if (Player* tapper = ObjectAccessor::GetPlayer(*creature, tapperGuid)) tappers.push_back(tapper); + if (!creature->CanHaveLoot()) + isRewardAllowed = false; + } + // Exploit fix if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer()) isRewardAllowed = false; @@ -10822,7 +10827,7 @@ void Unit::SetMeleeAnimKitId(uint16 animKitId) else creature->AllLootRemovedFromCorpse(); - if (LootTemplates_Skinning.HaveLootFor(creature->GetCreatureTemplate()->SkinLootId)) + if (creature->CanHaveLoot() && LootTemplates_Skinning.HaveLootFor(creature->GetCreatureTemplate()->SkinLootId)) { creature->SetDynamicFlag(UNIT_DYNFLAG_CAN_SKIN); creature->SetUnitFlag(UNIT_FLAG_SKINNABLE); diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 02225a00b81..1632f66b19e 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -2176,7 +2176,7 @@ SpellCastResult SpellInfo::CheckTarget(WorldObject const* caster, WorldObject co if (!targetCreature) return SPELL_FAILED_BAD_TARGETS; - if (!LootTemplates_Pickpocketing.HaveLootFor(targetCreature->GetCreatureTemplate()->pickpocketLootId)) + if (!targetCreature->CanHaveLoot() || !LootTemplates_Pickpocketing.HaveLootFor(targetCreature->GetCreatureTemplate()->pickpocketLootId)) return SPELL_FAILED_TARGET_NO_POCKETS; } -- cgit v1.2.3