aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp6
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.h7
-rw-r--r--src/server/game/Instances/InstanceScript.cpp5
-rw-r--r--src/server/game/Instances/InstanceScript.h2
-rw-r--r--src/server/game/Spells/SpellScript.cpp39
-rw-r--r--src/server/game/Spells/SpellScript.h8
-rw-r--r--src/server/scripts/Battlegrounds/DeephaulRavine/battleground_deephaul_ravine.cpp3
-rw-r--r--src/server/scripts/Battlegrounds/EyeOfTheStorm/battleground_eye_of_the_storm.cpp3
-rw-r--r--src/server/scripts/Battlegrounds/IsleOfConquest/battleground_isle_of_conquest.cpp2
-rw-r--r--src/server/scripts/Battlegrounds/SilvershardMines/battleground_silvershard_mines.cpp3
-rw-r--r--src/server/scripts/Battlegrounds/TwinPeaks/battleground_twin_peaks.cpp3
-rw-r--r--src/server/scripts/Battlegrounds/WarsongGulch/battleground_warsong_gulch.cpp3
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp38
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp58
14 files changed, 117 insertions, 63 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
index e016c30289b..1c950a6b203 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp
@@ -124,7 +124,7 @@ void SummonList::DoActionImpl(int32 action, StorageType& summons, uint16 max)
ScriptedAI::ScriptedAI(Creature* creature) : ScriptedAI(creature, creature->GetScriptId()) { }
-ScriptedAI::ScriptedAI(Creature* creature, uint32 scriptId) : CreatureAI(creature, scriptId), IsFleeing(false), _isCombatMovementAllowed(true)
+ScriptedAI::ScriptedAI(Creature* creature, uint32 scriptId) : CreatureAI(creature, scriptId), _isCombatMovementAllowed(true)
{
_difficulty = me->GetMap()->GetDifficultyID();
}
@@ -538,6 +538,8 @@ BossAI::BossAI(Creature* creature, uint32 bossId) : ScriptedAI(creature), instan
});
}
+BossAI::~BossAI() = default;
+
void BossAI::_Reset()
{
if (!me->IsAlive())
@@ -657,6 +659,8 @@ void BossAI::_DespawnAtEvade(Seconds delayToRespawn /*= 30s*/, Creature* who /*=
// WorldBossAI - for non-instanced bosses
WorldBossAI::WorldBossAI(Creature* creature) : ScriptedAI(creature), summons(creature) { }
+WorldBossAI::~WorldBossAI() = default;
+
void WorldBossAI::_Reset()
{
if (!me->IsAlive())
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
index a52b33b0dcc..456a2569932 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h
@@ -150,9 +150,6 @@ struct TC_GAME_API ScriptedAI : public CreatureAI
// Variables
// *************
- // For fleeing
- bool IsFleeing;
-
// *************
// Pure virtual functions
// *************
@@ -312,7 +309,7 @@ class TC_GAME_API BossAI : public ScriptedAI
{
public:
BossAI(Creature* creature, uint32 bossId);
- virtual ~BossAI() { }
+ virtual ~BossAI();
InstanceScript* const instance;
@@ -359,7 +356,7 @@ class TC_GAME_API WorldBossAI : public ScriptedAI
{
public:
WorldBossAI(Creature* creature);
- virtual ~WorldBossAI() { }
+ virtual ~WorldBossAI();
void JustSummoned(Creature* summon) override;
void SummonedCreatureDespawn(Creature* summon) override;
diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp
index 40c08e742f7..a24e0a9b91f 100644
--- a/src/server/game/Instances/InstanceScript.cpp
+++ b/src/server/game/Instances/InstanceScript.cpp
@@ -159,6 +159,11 @@ void InstanceScript::SetHeaders(std::string const& dataHeaders)
headers = dataHeaders;
}
+void InstanceScript::SetBossNumber(uint32 number)
+{
+ bosses.resize(number);
+}
+
void InstanceScript::LoadBossBoundaries(BossBoundaryData const& data)
{
for (BossBoundaryEntry const& entry : data)
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 618600815ae..2ac6c0da04f 100644
--- a/src/server/game/Instances/InstanceScript.h
+++ b/src/server/game/Instances/InstanceScript.h
@@ -322,7 +322,7 @@ class TC_GAME_API InstanceScript : public ZoneScript
protected:
void SetHeaders(std::string const& dataHeaders);
- void SetBossNumber(uint32 number) { bosses.resize(number); }
+ void SetBossNumber(uint32 number);
void LoadBossBoundaries(BossBoundaryData const& data);
void LoadDoorData(DoorData const* data);
void LoadMinionData(MinionData const* data);
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index d541c5f0a46..5314223ea8d 100644
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -102,6 +102,13 @@ std::string_view SpellScriptBase::GetScriptName() const
return m_scriptName;
}
+template <typename T>
+SpellScriptBase::HookList<T>& SpellScriptBase::HookList<T>::operator+=(T&& t)
+{
+ ::HookList<T>::operator+=(std::move(t));
+ return *this;
+}
+
SpellScriptBase::EffectHook::EffectHook(uint8 effIndex)
{
// effect index must be in range <0;2>, allow use of special effindexes
@@ -248,6 +255,19 @@ bool SpellScript::TargetHook::CheckEffect(SpellInfo const* spellInfo, uint8 effI
return false;
}
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::CastHandler>& SpellScriptBase::HookList<SpellScript::CastHandler>::operator+=(SpellScript::CastHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::CheckCastHandler>& SpellScriptBase::HookList<SpellScript::CheckCastHandler>::operator+=(SpellScript::CheckCastHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::EffectHandler>& SpellScriptBase::HookList<SpellScript::EffectHandler>::operator+=(SpellScript::EffectHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::BeforeHitHandler>& SpellScriptBase::HookList<SpellScript::BeforeHitHandler>::operator+=(SpellScript::BeforeHitHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::HitHandler>& SpellScriptBase::HookList<SpellScript::HitHandler>::operator+=(SpellScript::HitHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::OnCalcCritChanceHandler>& SpellScriptBase::HookList<SpellScript::OnCalcCritChanceHandler>::operator+=(SpellScript::OnCalcCritChanceHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::ObjectAreaTargetSelectHandler>& SpellScriptBase::HookList<SpellScript::ObjectAreaTargetSelectHandler>::operator+=(SpellScript::ObjectAreaTargetSelectHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::ObjectTargetSelectHandler>& SpellScriptBase::HookList<SpellScript::ObjectTargetSelectHandler>::operator+=(SpellScript::ObjectTargetSelectHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::DestinationTargetSelectHandler>& SpellScriptBase::HookList<SpellScript::DestinationTargetSelectHandler>::operator+=(SpellScript::DestinationTargetSelectHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::DamageAndHealingCalcHandler>& SpellScriptBase::HookList<SpellScript::DamageAndHealingCalcHandler>::operator+=(SpellScript::DamageAndHealingCalcHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::OnCalculateResistAbsorbHandler>& SpellScriptBase::HookList<SpellScript::OnCalculateResistAbsorbHandler>::operator+=(SpellScript::OnCalculateResistAbsorbHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<SpellScript::EmpowerStageCompletedHandler>& SpellScriptBase::HookList<SpellScript::EmpowerStageCompletedHandler>::operator+=(SpellScript::EmpowerStageCompletedHandler&& hook);
+
SpellScript::SpellScript(): m_spell(nullptr), m_hitPreventEffectMask(0), m_hitPreventDefaultEffectMask(0)
{
}
@@ -770,6 +790,25 @@ Difficulty SpellScript::GetCastDifficulty() const
return m_spell->GetCastDifficulty();
}
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::CheckAreaTargetHandler>& SpellScriptBase::HookList<AuraScript::CheckAreaTargetHandler>::operator+=(AuraScript::CheckAreaTargetHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::AuraDispelHandler>& SpellScriptBase::HookList<AuraScript::AuraDispelHandler>::operator+=(AuraScript::AuraDispelHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::AuraHeartbeatHandler>& SpellScriptBase::HookList<AuraScript::AuraHeartbeatHandler>::operator+=(AuraScript::AuraHeartbeatHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectApplyHandler>& SpellScriptBase::HookList<AuraScript::EffectApplyHandler>::operator+=(AuraScript::EffectApplyHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectPeriodicHandler>& SpellScriptBase::HookList<AuraScript::EffectPeriodicHandler>::operator+=(AuraScript::EffectPeriodicHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectUpdatePeriodicHandler>& SpellScriptBase::HookList<AuraScript::EffectUpdatePeriodicHandler>::operator+=(AuraScript::EffectUpdatePeriodicHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectCalcAmountHandler>& SpellScriptBase::HookList<AuraScript::EffectCalcAmountHandler>::operator+=(AuraScript::EffectCalcAmountHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectCalcPeriodicHandler>& SpellScriptBase::HookList<AuraScript::EffectCalcPeriodicHandler>::operator+=(AuraScript::EffectCalcPeriodicHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectCalcSpellModHandler>& SpellScriptBase::HookList<AuraScript::EffectCalcSpellModHandler>::operator+=(AuraScript::EffectCalcSpellModHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectCalcCritChanceHandler>& SpellScriptBase::HookList<AuraScript::EffectCalcCritChanceHandler>::operator+=(AuraScript::EffectCalcCritChanceHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectCalcDamageAndHealingHandler>& SpellScriptBase::HookList<AuraScript::EffectCalcDamageAndHealingHandler>::operator+=(AuraScript::EffectCalcDamageAndHealingHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectAbsorbHandler>& SpellScriptBase::HookList<AuraScript::EffectAbsorbHandler>::operator+=(AuraScript::EffectAbsorbHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectAbsorbHealHandler>& SpellScriptBase::HookList<AuraScript::EffectAbsorbHealHandler>::operator+=(AuraScript::EffectAbsorbHealHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::CheckProcHandler>& SpellScriptBase::HookList<AuraScript::CheckProcHandler>::operator+=(AuraScript::CheckProcHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::CheckEffectProcHandler>& SpellScriptBase::HookList<AuraScript::CheckEffectProcHandler>::operator+=(AuraScript::CheckEffectProcHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::AuraProcHandler>& SpellScriptBase::HookList<AuraScript::AuraProcHandler>::operator+=(AuraScript::AuraProcHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EffectProcHandler>& SpellScriptBase::HookList<AuraScript::EffectProcHandler>::operator+=(AuraScript::EffectProcHandler&& hook);
+template TC_GAME_API SpellScriptBase::HookList<AuraScript::EnterLeaveCombatHandler>& SpellScriptBase::HookList<AuraScript::EnterLeaveCombatHandler>::operator+=(AuraScript::EnterLeaveCombatHandler&& hook);
+
bool AuraScript::_Validate(SpellInfo const* entry)
{
for (auto itr = DoCheckAreaTarget.begin(); itr != DoCheckAreaTarget.end(); ++itr)
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index 22b54191244..5857d63fb08 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -89,6 +89,14 @@ public:
protected:
virtual bool _Validate(SpellInfo const* entry);
+ // compile barrier to avoid instantiating operator+= in every script file
+ template <typename T>
+ class HookList : public ::HookList<T>
+ {
+ public:
+ HookList& operator+=(T&& t);
+ };
+
class TC_GAME_API EffectHook
{
public:
diff --git a/src/server/scripts/Battlegrounds/DeephaulRavine/battleground_deephaul_ravine.cpp b/src/server/scripts/Battlegrounds/DeephaulRavine/battleground_deephaul_ravine.cpp
index 663a6170963..8be231534ab 100644
--- a/src/server/scripts/Battlegrounds/DeephaulRavine/battleground_deephaul_ravine.cpp
+++ b/src/server/scripts/Battlegrounds/DeephaulRavine/battleground_deephaul_ravine.cpp
@@ -743,7 +743,8 @@ struct battleground_deephaul_ravine : BattlegroundScript
return false;
}
- void DoForLeaders(std::function<void(Creature*)> const& fn) const
+ template <std::invocable<Creature*> Action>
+ void DoForLeaders(Action const& fn) const
{
for (ObjectGuid const& guid : _leaderGUIDs)
if (Creature* creature = battlegroundMap->GetCreature(guid))
diff --git a/src/server/scripts/Battlegrounds/EyeOfTheStorm/battleground_eye_of_the_storm.cpp b/src/server/scripts/Battlegrounds/EyeOfTheStorm/battleground_eye_of_the_storm.cpp
index 3c8ef48438e..107b003fe78 100644
--- a/src/server/scripts/Battlegrounds/EyeOfTheStorm/battleground_eye_of_the_storm.cpp
+++ b/src/server/scripts/Battlegrounds/EyeOfTheStorm/battleground_eye_of_the_storm.cpp
@@ -367,7 +367,8 @@ struct battleground_eye_of_the_storm : BattlegroundScript
return baseCount;
}
- void DoForFlagKeepers(std::function<void(Player*)> const& action) const
+ template <std::invocable<Player*> Action>
+ void DoForFlagKeepers(Action const& action) const
{
if (GameObject const* flag = battlegroundMap->GetGameObject(_flagGUID))
if (Player* carrier = ObjectAccessor::FindPlayer(flag->GetFlagCarrierGUID()))
diff --git a/src/server/scripts/Battlegrounds/IsleOfConquest/battleground_isle_of_conquest.cpp b/src/server/scripts/Battlegrounds/IsleOfConquest/battleground_isle_of_conquest.cpp
index 5d55df8d6b7..fb48e239129 100644
--- a/src/server/scripts/Battlegrounds/IsleOfConquest/battleground_isle_of_conquest.cpp
+++ b/src/server/scripts/Battlegrounds/IsleOfConquest/battleground_isle_of_conquest.cpp
@@ -339,7 +339,7 @@ struct battleground_isle_of_conquest : BattlegroundScript
{
BattlegroundScript::OnStart();
- auto gameobjectAction = [&](GuidVector const& guids, std::function<void(GameObject*)> const& action) -> void
+ auto gameobjectAction = [&]<std::invocable<GameObject*> Action>(GuidVector const& guids, Action const& action) -> void
{
for (ObjectGuid const& guid : guids)
if (GameObject* gameObject = battlegroundMap->GetGameObject(guid))
diff --git a/src/server/scripts/Battlegrounds/SilvershardMines/battleground_silvershard_mines.cpp b/src/server/scripts/Battlegrounds/SilvershardMines/battleground_silvershard_mines.cpp
index 30721e47425..e23de84bab0 100644
--- a/src/server/scripts/Battlegrounds/SilvershardMines/battleground_silvershard_mines.cpp
+++ b/src/server/scripts/Battlegrounds/SilvershardMines/battleground_silvershard_mines.cpp
@@ -715,7 +715,8 @@ public:
}
}
- void DoForPlayersInControlZone(std::function<void(GameObject const*, Player*)> const& fn) const
+ template <std::invocable<GameObject const*, Player*> Action>
+ void DoForPlayersInControlZone(Action const& fn) const
{
if (GameObject const* controlZone = GetControlZone())
for (ObjectGuid const& playerGuid : *controlZone->GetInsidePlayers())
diff --git a/src/server/scripts/Battlegrounds/TwinPeaks/battleground_twin_peaks.cpp b/src/server/scripts/Battlegrounds/TwinPeaks/battleground_twin_peaks.cpp
index 0a0b37e4a16..f71cf0e5017 100644
--- a/src/server/scripts/Battlegrounds/TwinPeaks/battleground_twin_peaks.cpp
+++ b/src/server/scripts/Battlegrounds/TwinPeaks/battleground_twin_peaks.cpp
@@ -190,7 +190,8 @@ struct battleground_twin_peaks : BattlegroundScript
TriggerGameEvent(TwinPeaks::Events::StartBattle);
}
- void DoForFlagKeepers(std::function<void(Player*)> const& action) const
+ template <std::invocable<Player*> Action>
+ void DoForFlagKeepers(Action const& action) const
{
for (ObjectGuid flagGUID : _flags)
if (GameObject const* flag = battlegroundMap->GetGameObject(flagGUID))
diff --git a/src/server/scripts/Battlegrounds/WarsongGulch/battleground_warsong_gulch.cpp b/src/server/scripts/Battlegrounds/WarsongGulch/battleground_warsong_gulch.cpp
index be76b69abf1..f658211a1bf 100644
--- a/src/server/scripts/Battlegrounds/WarsongGulch/battleground_warsong_gulch.cpp
+++ b/src/server/scripts/Battlegrounds/WarsongGulch/battleground_warsong_gulch.cpp
@@ -227,7 +227,8 @@ struct battleground_warsong_gulch : BattlegroundScript
battleground->RewardHonorToTeam(battleground->GetBonusHonorFromKill(_honorEndKills), HORDE);
}
- void DoForFlagKeepers(std::function<void(Player*)> const& action) const
+ template <std::invocable<Player*> Action>
+ void DoForFlagKeepers(Action const& action) const
{
for (ObjectGuid flagGUID : _flags)
if (GameObject const* flag = battlegroundMap->GetGameObject(flagGUID))
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
index b21e77530e0..762eafebd85 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_deathbringer_saurfang.cpp
@@ -637,12 +637,12 @@ struct npc_high_overlord_saurfang_icc : public ScriptedAI
return false;
}
- void GuardBroadcast(std::function<void(Creature*)>&& action) const
+ void GuardBroadcast(int32 action) const
{
std::vector<Creature*> guardList;
GetCreatureListWithEntryInGrid(guardList, me, NPC_SE_KOR_KRON_REAVER, 100.0f);
for (Creature* guard : guardList)
- action(guard);
+ guard->AI()->DoAction(action);
}
void DoAction(int32 action) override
@@ -681,19 +681,13 @@ struct npc_high_overlord_saurfang_icc : public ScriptedAI
_events.ScheduleEvent(EVENT_OUTRO_HORDE_5, 30s); // move
me->SetDisableGravity(false);
me->GetMotionMaster()->MoveFall();
- GuardBroadcast([](Creature* guard)
- {
- guard->AI()->DoAction(ACTION_DESPAWN);
- });
+ GuardBroadcast(ACTION_DESPAWN);
break;
}
case ACTION_INTERRUPT_INTRO:
{
_events.Reset();
- GuardBroadcast([](Creature* guard)
- {
- guard->AI()->DoAction(ACTION_DESPAWN);
- });
+ GuardBroadcast(ACTION_DESPAWN);
break;
}
default:
@@ -774,10 +768,7 @@ struct npc_high_overlord_saurfang_icc : public ScriptedAI
break;
case EVENT_INTRO_HORDE_8:
Talk(SAY_INTRO_HORDE_8);
- GuardBroadcast([](Creature* guard)
- {
- guard->AI()->DoAction(ACTION_CHARGE);
- });
+ GuardBroadcast(ACTION_CHARGE);
me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE);
break;
case EVENT_OUTRO_HORDE_2: // say
@@ -834,12 +825,12 @@ struct npc_muradin_bronzebeard_icc : public ScriptedAI
return false;
}
- void GuardBroadcast(std::function<void(Creature*)>&& action) const
+ void GuardBroadcast(int32 action) const
{
std::vector<Creature*> guardList;
GetCreatureListWithEntryInGrid(guardList, me, NPC_SE_SKYBREAKER_MARINE, 100.0f);
for (Creature* guard : guardList)
- action(guard);
+ guard->AI()->DoAction(action);
}
void DoAction(int32 action) override
@@ -874,10 +865,7 @@ struct npc_muradin_bronzebeard_icc : public ScriptedAI
Talk(SAY_OUTRO_ALLIANCE_1);
me->SetDisableGravity(false);
me->GetMotionMaster()->MoveFall();
- GuardBroadcast([](Creature* guard)
- {
- guard->AI()->DoAction(ACTION_DESPAWN);
- });
+ GuardBroadcast(ACTION_DESPAWN);
// temp until outro fully done - to put deathbringer on respawn timer (until next reset)
if (Creature* deathbringer = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_DEATHBRINGER_SAURFANG)))
@@ -886,10 +874,7 @@ struct npc_muradin_bronzebeard_icc : public ScriptedAI
}
case ACTION_INTERRUPT_INTRO:
_events.Reset();
- GuardBroadcast([](Creature* guard)
- {
- guard->AI()->DoAction(ACTION_DESPAWN);
- });
+ GuardBroadcast(ACTION_DESPAWN);
break;
}
}
@@ -932,10 +917,7 @@ struct npc_muradin_bronzebeard_icc : public ScriptedAI
break;
case EVENT_INTRO_ALLIANCE_5:
Talk(SAY_INTRO_ALLIANCE_5);
- GuardBroadcast([](Creature* guard)
- {
- guard->AI()->DoAction(ACTION_CHARGE);
- });
+ GuardBroadcast(ACTION_CHARGE);
me->GetMotionMaster()->MoveCharge(chargePos[0].GetPositionX(), chargePos[0].GetPositionY(), chargePos[0].GetPositionZ(), 8.5f, POINT_CHARGE);
break;
}
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
index 6a2289b5642..9a2fe5e8926 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_gothik.cpp
@@ -160,12 +160,25 @@ static Player* FindEligibleTarget(Creature const* me, bool isGateOpen)
}
/* Wave data */
-typedef std::pair<uint32, uint8> GothikWaveEntry; // (npcEntry, npcCount)
-typedef std::set<GothikWaveEntry> GothikWave;
-typedef std::pair<GothikWave, uint8> GothikWaveInfo; // (wave, secondsToNext)
-typedef std::vector<GothikWaveInfo> GothikWaveData;
-const GothikWaveData waves10 =
+struct GothikWaveEntry
{
+ uint32 CreatureId = 0;
+ uint32 Count = 0;
+};
+
+struct GothikWaveInfo
+{
+ constexpr GothikWaveInfo(std::initializer_list<GothikWaveEntry> waves, int64 timeToNextWave) : TimeToNextWave(timeToNextWave)
+ {
+ std::ranges::copy_n(waves.begin(), std::min(std::ranges::ssize(waves), std::ranges::ssize(Creatures)), Creatures.begin());
+ }
+
+ std::array<GothikWaveEntry, 3> Creatures;
+ Seconds TimeToNextWave;
+};
+
+static constexpr std::array<GothikWaveInfo, 19> waves10 =
+{ {
{
{{NPC_LIVE_TRAINEE, 2}},
20},
@@ -223,10 +236,10 @@ const GothikWaveData waves10 =
{
{{NPC_LIVE_TRAINEE, 2}},
0}
-};
+} };
-const GothikWaveData waves25 =
-{
+static constexpr std::array<GothikWaveInfo, 18> waves25 =
+{ {
{
{{NPC_LIVE_TRAINEE, 3}},
20},
@@ -281,7 +294,7 @@ const GothikWaveData waves25 =
{
{{NPC_LIVE_RIDER, 1}, {NPC_LIVE_KNIGHT, 2}, {NPC_LIVE_TRAINEE, 3}},
0}
-};
+} };
// GUID of first trigger NPC (used as offset for guid checks)
// 0-1 are living side soul triggers, 2-3 are spectral side soul triggers, 4 is living rider spawn trigger, 5-7 are living other spawn trigger, 8-12 are skull pile triggers
@@ -426,7 +439,7 @@ struct boss_gothik : public BossAI
{
case EVENT_SUMMON:
{
- if (RAID_MODE(waves10,waves25).size() <= _waveCount) // bounds check
+ if (RAID_MODE(waves10.size(), waves25.size()) <= _waveCount) // bounds check
{
TC_LOG_INFO("scripts", "GothikAI: Wave count {} is out of range for difficulty {}.", _waveCount, static_cast<uint32>(GetDifficulty()));
break;
@@ -434,8 +447,9 @@ struct boss_gothik : public BossAI
std::list<Creature*> triggers;
me->GetCreatureListWithEntryInGrid(triggers, NPC_TRIGGER, 150.0f);
- for (GothikWaveEntry entry : RAID_MODE(waves10, waves25)[_waveCount].first)
- for (uint8 i = 0; i < entry.second; ++i)
+ for (GothikWaveEntry entry : RAID_MODE(waves10[_waveCount], waves25[_waveCount]).Creatures)
+ {
+ for (uint32 i = 0; i < entry.Count; ++i)
{
// GUID layout is as follows:
// CGUID+4: center (back of platform) - primary rider spawn
@@ -443,7 +457,7 @@ struct boss_gothik : public BossAI
// CGUID+6: center (front of platform) - second spawn
// CGUID+7: south (front of platform) - primary trainee spawn
uint32 targetDBGuid;
- switch (entry.first)
+ switch (entry.CreatureId)
{
case NPC_LIVE_RIDER: // only spawns from center (back) > north
targetDBGuid = (CGUID_TRIGGER + 4) + (i % 2);
@@ -455,19 +469,17 @@ struct boss_gothik : public BossAI
targetDBGuid = (CGUID_TRIGGER + 7) - (i % 3);
break;
default:
- targetDBGuid = 0;
+ continue;
}
- for (Creature* trigger : triggers)
- if (trigger && trigger->GetSpawnId() == targetDBGuid)
- {
- DoSummon(entry.first, trigger, 1.0f, 15s, TEMPSUMMON_CORPSE_TIMED_DESPAWN);
- break;
- }
+ auto triggerItr = std::ranges::find(triggers, targetDBGuid, [](Creature const* trigger) { return trigger->GetSpawnId(); });
+ if (triggerItr != triggers.end())
+ DoSummon(entry.CreatureId, *triggerItr, 1.0f, 15s, TEMPSUMMON_CORPSE_TIMED_DESPAWN);
}
+ }
- if (uint8 timeToNext = RAID_MODE(waves10, waves25)[_waveCount].second)
- events.Repeat(Seconds(timeToNext));
+ if (Seconds timeToNext = RAID_MODE(waves10[_waveCount], waves25[_waveCount]).TimeToNextWave; timeToNext > 0s)
+ events.Repeat(timeToNext);
++_waveCount;
break;
@@ -532,6 +544,8 @@ struct boss_gothik : public BossAI
case EVENT_INTRO_4:
Talk(SAY_INTRO_4);
break;
+ default:
+ break;
}
}
}