From 155cf58236f7adbd169f57e0578c96fd7ce2173f Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 13 Mar 2023 00:09:18 +0100 Subject: Core/Creatures: Allow scripts to change creature loot id (must be done before death) --- src/server/game/Entities/Creature/Creature.cpp | 13 +++++++++++++ src/server/game/Entities/Creature/Creature.h | 3 +++ src/server/game/Entities/Unit/Unit.cpp | 6 +++--- 3 files changed, 19 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 423d4ae2ec7..90e0b98398c 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1303,6 +1303,19 @@ bool Creature::CanResetTalents(Player* player) const && player->GetClass() == GetCreatureTemplate()->trainer_class; } +uint32 Creature::GetLootId() const +{ + if (m_lootId) + return *m_lootId; + + return GetCreatureTemplate()->lootid; +} + +void Creature::SetLootId(Optional lootId) +{ + m_lootId = lootId; +} + void Creature::SetTappedBy(Unit const* unit, bool withGroup) { // set the player whose group should receive the right diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index f71a6e07e81..a2354945950 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -231,6 +231,8 @@ class TC_GAME_API Creature : public Unit, public GridObject, public Ma bool CanHaveLoot() const { return !_staticFlags.HasFlag(CREATURE_STATIC_FLAG_NO_LOOT); } void SetCanHaveLoot(bool canHaveLoot) { _staticFlags.ApplyFlag(CREATURE_STATIC_FLAG_NO_LOOT, !canHaveLoot); } + uint32 GetLootId() const; + void SetLootId(Optional lootId); std::unique_ptr m_loot; std::unordered_map> m_personalLoot; void StartPickPocketRefillTimer(); @@ -459,6 +461,7 @@ class TC_GAME_API Creature : public Unit, public GridObject, public Ma std::array m_stringIds; Optional m_scriptStringId; + Optional m_lootId; uint16 m_LootMode; // Bitmask (default: LOOT_MODE_DEFAULT) that determines what loot will be lootable bool IsInvisibleDueToDespawn(WorldObject const* seer) const override; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 21fe8c16be7..bb31ad0fff6 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10686,7 +10686,7 @@ void Unit::SetMeleeAnimKitId(uint16 animKitId) { if (dungeonEncounter) { - creature->m_personalLoot = GenerateDungeonEncounterPersonalLoot(dungeonEncounter->ID, creature->GetCreatureTemplate()->lootid, + creature->m_personalLoot = GenerateDungeonEncounterPersonalLoot(dungeonEncounter->ID, creature->GetLootId(), LootTemplates_Creature, LOOT_CORPSE, creature, creature->GetCreatureTemplate()->mingold, creature->GetCreatureTemplate()->maxgold, creature->GetLootMode(), creature->GetMap()->GetDifficultyLootItemContext(), tappers); } @@ -10697,7 +10697,7 @@ void Unit::SetMeleeAnimKitId(uint16 animKitId) Loot* loot = new Loot(creature->GetMap(), creature->GetGUID(), LOOT_CORPSE, dungeonEncounter ? group : nullptr); - if (uint32 lootid = creature->GetCreatureTemplate()->lootid) + if (uint32 lootid = creature->GetLootId()) loot->FillLoot(lootid, LootTemplates_Creature, looter, dungeonEncounter != nullptr, false, creature->GetLootMode(), creature->GetMap()->GetDifficultyLootItemContext()); if (creature->GetLootMode() > 0) @@ -10723,7 +10723,7 @@ void Unit::SetMeleeAnimKitId(uint16 animKitId) if (dungeonEncounter) loot->SetDungeonEncounterId(dungeonEncounter->ID); - if (uint32 lootid = creature->GetCreatureTemplate()->lootid) + if (uint32 lootid = creature->GetLootId()) loot->FillLoot(lootid, LootTemplates_Creature, tapper, true, false, creature->GetLootMode(), creature->GetMap()->GetDifficultyLootItemContext()); if (creature->GetLootMode() > 0) -- cgit v1.2.3