aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-10-05 20:04:15 +0200
committerShauren <shauren.trinity@gmail.com>2022-10-05 20:04:15 +0200
commit5f1a4cf9044d9ad65b49eb859ec36e1f62c2be10 (patch)
tree1a28a863c2e3e9feaaa6d0559ea6dcfe69b884e9
parentbdf22f955d71d5b96764894f8b67133bbdbab18f (diff)
Core/Loot: Set loot dungeon encounter id before generating
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp6
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/game/Instances/InstanceScript.cpp9
-rw-r--r--src/server/game/Instances/InstanceScript.h1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp2
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)