Skip to content

Commit ab3bed1

Browse files
committed
BossAI: Add Queued Casts
BossAI: Add timed respawn on evade BossAI: Correctly set instance data on evade
1 parent 91b8a78 commit ab3bed1

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

src/game/AI/ScriptDevAI/base/BossAI.cpp

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,26 @@ void BossAI::AddOnAggroText(uint32 text)
3232
m_onAggroTexts.push_back(text);
3333
}
3434

35+
void BossAI::Reset()
36+
{
37+
CombatAI::Reset();
38+
m_creature->SetSpellList(m_creature->GetCreatureInfo()->SpellList);
39+
}
40+
3541
void BossAI::JustDied(Unit* killer)
3642
{
43+
CombatAI::JustDied(killer);
3744
if (!m_onKilledTexts.empty())
3845
DoBroadcastText(m_onKilledTexts[urand(0, m_onKilledTexts.size() - 1)], m_creature, killer);
46+
for (QueuedCast& cast : m_castOnDeath)
47+
{
48+
Unit* target = m_creature->GetMap()->GetUnit(cast.target);
49+
m_creature->CastSpell(target, cast.spellId, cast.flags);
50+
}
3951
if (m_instanceDataType == -1)
4052
return;
4153
if (ScriptedInstance* instance = static_cast<ScriptedInstance*>(m_creature->GetInstanceData()))
4254
instance->SetData(m_instanceDataType, DONE);
43-
CombatAI::JustDied(killer);
4455
OpenEntrances();
4556
OpenExits();
4657
}
@@ -78,4 +89,30 @@ void BossAI::AddEntranceObject(uint32 value)
7889
void BossAI::AddExitObject(uint32 value)
7990
{
8091
m_exitObjects.push_back(value);
92+
}
93+
94+
void BossAI::EnterEvadeMode()
95+
{
96+
if (m_instanceDataType == -1)
97+
return;
98+
if (ScriptedInstance* instance = static_cast<ScriptedInstance*>(m_creature->GetInstanceData()))
99+
instance->SetData(m_instanceDataType, FAIL);
100+
OpenEntrances();
101+
if (m_respawnDelay == -1)
102+
{
103+
CombatAI::EnterEvadeMode();
104+
return;
105+
}
106+
m_creature->SetRespawnDelay(m_respawnDelay, true);
107+
m_creature->ForcedDespawn();
108+
}
109+
110+
void BossAI::AddCastOnDeath(QueuedCast cast)
111+
{
112+
m_castOnDeath.push_back(cast);
113+
}
114+
115+
void BossAI::AddRespawnOnEvade(std::chrono::seconds delay)
116+
{
117+
m_respawnDelay = delay.count();
81118
}

src/game/AI/ScriptDevAI/base/BossAI.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ enum InstanceActions
2727
INSTANCE_CLOSE_ENTRANCE_DOOR = 250,
2828
};
2929

30+
struct QueuedCast
31+
{
32+
ObjectGuid target;
33+
uint32 spellId;
34+
uint32 flags;
35+
};
36+
3037
class BossAI : public CombatAI
3138
{
3239
public:
@@ -56,6 +63,7 @@ class BossAI : public CombatAI
5663
for (auto& id : m_exitObjects)
5764
instance->DoUseOpenableObject(id, true);
5865
}
66+
5967
/**
6068
* Adds one or more Broadcast Texts to possibly emit when Unit dies
6169
* This function is not called if JustDied is overridden. Add CombatAI::JustDied(); to your overriding function.
@@ -83,6 +91,7 @@ class BossAI : public CombatAI
8391

8492
void SetDataType(uint32 type) { m_instanceDataType = type; }
8593

94+
void Reset() override;
8695
void JustDied(Unit* killer = nullptr) override;
8796
void JustReachedHome() override;
8897
void Aggro(Unit* who = nullptr) override;
@@ -101,6 +110,17 @@ class BossAI : public CombatAI
101110
AddExitObject(fargs...);
102111
}
103112
void SetGateDelay(std::chrono::milliseconds delay) { m_gateDelay = delay; }
113+
void EnterEvadeMode() override;
114+
115+
void AddCastOnDeath(QueuedCast cast);
116+
template <typename... Targs>
117+
void AddCastOnDeath(QueuedCast cast, Targs... fargs)
118+
{
119+
AddCastOnDeath(cast);
120+
AddCastOnDeath(fargs...);
121+
}
122+
123+
void AddRespawnOnEvade(std::chrono::seconds delay);
104124

105125
std::chrono::seconds TimeSinceEncounterStart()
106126
{
@@ -118,9 +138,12 @@ class BossAI : public CombatAI
118138
std::vector<uint32> m_entranceObjects;
119139
std::vector<uint32> m_exitObjects;
120140
std::chrono::milliseconds m_gateDelay = 3s;
141+
std::vector<QueuedCast> m_castOnDeath;
121142

122143
uint32 m_instanceDataType = -1;
123144

145+
uint32 m_respawnDelay = -1;
146+
124147
std::chrono::steady_clock::time_point m_combatStartTimestamp;
125148
};
126149

0 commit comments

Comments
 (0)