aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-03-12 13:05:35 +0100
committerShauren <shauren.trinity@gmail.com>2023-03-12 13:05:35 +0100
commitebf799c0f696ec88be66795d4ad0a20fa5ce5e92 (patch)
tree25b153256675c0b64c20c13f77ef0dd500dbf20d /src
parent8f38c12c4e7d832a91c7719ee1a5ac4d801862a6 (diff)
Core/Creatures: Allow disabling loot for creatures
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/Creature.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp7
-rw-r--r--src/server/game/Spells/SpellInfo.cpp2
3 files changed, 9 insertions, 2 deletions
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<Creature>, public Ma
virtual void SaveToDB(uint32 mapid, std::vector<Difficulty> 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<Loot> m_loot;
std::unordered_map<ObjectGuid, std::unique_ptr<Loot>> 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<Player*> 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;
}