diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-10-05 20:04:15 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-10-05 20:04:15 +0200 |
commit | 5f1a4cf9044d9ad65b49eb859ec36e1f62c2be10 (patch) | |
tree | 1a28a863c2e3e9feaaa6d0559ea6dcfe69b884e9 | |
parent | bdf22f955d71d5b96764894f8b67133bbdbab18f (diff) |
Core/Loot: Set loot dungeon encounter id before generating
-rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 6 | ||||
-rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedCreature.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Instances/InstanceScript.cpp | 9 | ||||
-rw-r--r-- | src/server/game/Instances/InstanceScript.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 2 |
6 files changed, 17 insertions, 7 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index fc9477a85d1..95c23c38904 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -521,13 +521,7 @@ void BossAI::_JustDied() summons.DespawnAll(); scheduler.CancelAll(); if (instance) - { - if (me->m_loot) - if (DungeonEncounterEntry const* dungeonEncounter = instance->GetBossDungeonEncounter(_bossId)) - me->m_loot->SetDungeonEncounterId(dungeonEncounter->ID); - instance->SetBossState(_bossId, DONE); - } } void BossAI::_JustReachedHome() diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index b984c8b5bdb..a6037edf291 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -336,6 +336,8 @@ class TC_GAME_API BossAI : public ScriptedAI bool CanAIAttack(Unit const* target) const override; + uint32 GetBossId() const { return _bossId; } + protected: void _Reset(); void _JustEngagedWith(Unit* who); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6dda8e06e02..13f75a7a6ed 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10657,6 +10657,10 @@ void Unit::SetMeleeAnimKitId(uint16 animKitId) if (creature->GetMap()->Is25ManRaid()) loot->maxDuplicates = 3; + if (InstanceScript const* instance = creature->GetInstanceScript()) + if (DungeonEncounterEntry const* dungeonEncounter = instance->GetBossDungeonEncounter(creature)) + loot->SetDungeonEncounterId(dungeonEncounter->ID); + if (uint32 lootid = creature->GetCreatureTemplate()->lootid) loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature->GetMap()->GetDifficultyLootItemContext()); diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index 2494c4852af..edc8cd584f7 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -35,6 +35,7 @@ #include "PhasingHandler.h" #include "Player.h" #include "RBAC.h" +#include "ScriptedCreature.h" #include "ScriptReloadMgr.h" #include "SmartEnum.h" #include "SpellMgr.h" @@ -729,6 +730,14 @@ DungeonEncounterEntry const* InstanceScript::GetBossDungeonEncounter(uint32 id) return id < bosses.size() ? bosses[id].GetDungeonEncounterForDifficulty(instance->GetDifficultyID()) : nullptr; } +DungeonEncounterEntry const* InstanceScript::GetBossDungeonEncounter(Creature const* creature) const +{ + if (BossAI const* bossAi = dynamic_cast<BossAI const*>(creature->GetAI())) + return GetBossDungeonEncounter(bossAi->GetBossId()); + + return nullptr; +} + bool InstanceScript::CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* /*source*/, Unit const* /*target*/ /*= nullptr*/, uint32 /*miscvalue1*/ /*= 0*/) { TC_LOG_ERROR("misc", "Achievement system call InstanceScript::CheckAchievementCriteriaMeet but instance script for map %u not have implementation for achievement criteria %u", diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index 0e44521dcb0..05be59d2b72 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -268,6 +268,7 @@ class TC_GAME_API InstanceScript : public ZoneScript static char const* GetBossStateName(uint8 state); CreatureBoundary const* GetBossBoundary(uint32 id) const { return id < bosses.size() ? &bosses[id].boundary : nullptr; } DungeonEncounterEntry const* GetBossDungeonEncounter(uint32 id) const; + DungeonEncounterEntry const* GetBossDungeonEncounter(Creature const* creature) const; // Achievement criteria additional requirements check // NOTE: not use this if same can be checked existed requirement types from AchievementCriteriaRequirementType diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 9bc89995523..20c4bc88c24 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1570,13 +1570,13 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype) loot = new Loot(gameObjTarget->GetMap(), guid, loottype, groupRules ? group : nullptr); gameObjTarget->m_loot.reset(loot); + loot->SetDungeonEncounterId(gameObjTarget->GetGOInfo()->chest.DungeonEncounter); loot->FillLoot(lootId, LootTemplates_Gameobject, player, !groupRules, false, gameObjTarget->GetLootMode(), gameObjTarget->GetMap()->GetDifficultyLootItemContext()); if (gameObjTarget->GetLootMode() > 0) if (GameObjectTemplateAddon const* addon = gameObjTarget->GetTemplateAddon()) loot->generateMoneyLoot(addon->Mingold, addon->Maxgold); - loot->SetDungeonEncounterId(gameObjTarget->GetGOInfo()->chest.DungeonEncounter); } /// @todo possible must be moved to loot release (in different from linked triggering) |