aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroffl <11556157+offl@users.noreply.github.com>2025-05-28 17:46:24 +0300
committerGitHub <noreply@github.com>2025-05-28 16:46:24 +0200
commit640ee4519993e8578fbb0b0cf53a4196026b3500 (patch)
treeecbc991baf1ea7ac492201f073422efef8a7599e /src
parente045dd021121f3c90451d0dcc88eed874798ebf2 (diff)
Scripts/The Slave Pens: Modernize Kalithresh script (#30957)
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp312
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp17
2 files changed, 172 insertions, 157 deletions
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp
index cb5504f4345..1447281a9c7 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/boss_warlord_kalithresh.cpp
@@ -15,194 +15,222 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/* ScriptData
-SDName: Boss_Warlord_Kalithres
-SD%Complete: 65
-SDComment: Contains workarounds regarding warlord's rage spells not acting as expected. Both scripts here require review and fine tuning.
-SDCategory: Coilfang Resevoir, The Steamvault
-EndScriptData */
+/* Timers requires update
+ * Distillers should respawn at some point, probably in case of wipe
+ * All distillers should cast SPELL_QUIET_SUICIDE when encounter is finished */
#include "ScriptMgr.h"
#include "InstanceScript.h"
+#include "MotionMaster.h"
+#include "ObjectAccessor.h"
#include "ScriptedCreature.h"
-#include "SpellInfo.h"
#include "steam_vault.h"
-enum NagaDistiller
+enum KalithreshTexts
{
- SAY_INTRO = 0,
- SAY_REGEN = 1,
- SAY_AGGRO = 2,
- SAY_SLAY = 3,
- SAY_DEATH = 4,
-
- SPELL_SPELL_REFLECTION = 31534,
- SPELL_IMPALE = 39061,
- SPELL_WARLORDS_RAGE = 37081,
- SPELL_WARLORDS_RAGE_NAGA = 31543,
-
- SPELL_WARLORDS_RAGE_PROC = 36453
+ SAY_INTRO = 0,
+ SAY_REGEN = 1,
+ SAY_AGGRO = 2,
+ SAY_SLAY = 3,
+ SAY_DEATH = 4,
+ EMOTE_CHANNEL = 5
};
-class npc_naga_distiller : public CreatureScript
+enum KalithreshSpells
{
-public:
- npc_naga_distiller() : CreatureScript("npc_naga_distiller") { }
+ SPELL_HEAD_CRACK = 16172,
+ SPELL_REFLECTION = 31534,
+ SPELL_IMPALE = 39061,
+
+ SPELL_WARLORDS_RAGE = 37081,
+ SPELL_WARLORDS_RAGE_DISTILLER = 31543,
+
+ // A bunch of NYI serverside spells, some may be not even used
+ SPELL_SUMMON_DISTILLER_1 = 31544,
+ SPELL_SUMMON_DISTILLER_2 = 31545,
+ SPELL_SUMMON_DISTILLER_3 = 31546,
+
+ SPELL_DISTILLER_DUMMY = 31763,
+ SPELL_DISTILLER_DUMMY_DESPAWN = 31767,
+ SPELL_DISTILLER_DUMMY_TRIGGER_1 = 33761,
+ SPELL_DISTILLER_DUMMY_COMBAT = 33769,
+ SPELL_DISTILLER_DUMMY_TRIGGER_2 = 34065,
+ // Distiller
+ SPELL_STUN_SELF = 25900,
+ SPELL_QUIET_SUICIDE = 3617
+};
+
+enum KalithreshEvents
+{
+ EVENT_HEAD_CRACK = 1,
+ EVENT_REFLECTION,
+ EVENT_IMPALE,
+ EVENT_RAGE
+};
+
+enum KalithreshMisc
+{
+ SOUND_ID_SLAY = 10396,
+ NPC_NAGA_DISTILLER = 17954,
+ POINT_DISTILLER = 1,
+ ACTION_DISTILLER_DEAD = 1,
+ ACTION_DISTILLER_CHANNEL = 1
+};
+
+// 17798 - Warlord Kalithresh
+struct boss_warlord_kalithresh : public BossAI
+{
+ boss_warlord_kalithresh(Creature* creature) : BossAI(creature, DATA_WARLORD_KALITHRESH), _introDone(false) { }
- CreatureAI* GetAI(Creature* creature) const override
+ void Reset() override
{
- return GetSteamVaultAI<npc_naga_distillerAI>(creature);
+ _Reset();
+ _distillerGUID.Clear();
}
- struct npc_naga_distillerAI : public ScriptedAI
+ void JustEngagedWith(Unit* who) override
{
- npc_naga_distillerAI(Creature* creature) : ScriptedAI(creature)
- {
- instance = creature->GetInstanceScript();
- }
+ Talk(SAY_AGGRO);
+ BossAI::JustEngagedWith(who);
- InstanceScript* instance;
+ events.ScheduleEvent(EVENT_HEAD_CRACK, 10s, 15s);
+ events.ScheduleEvent(EVENT_REFLECTION, 15s, 25s);
+ events.ScheduleEvent(EVENT_IMPALE, 7s, 14s);
+ events.ScheduleEvent(EVENT_RAGE, 10s, 20s);
+ }
- void Reset() override
+ void MoveInLineOfSight(Unit* who) override
+ {
+ if (!_introDone && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 50.0f))
{
- me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
- me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
-
- //hack, due to really weird spell behaviour :(
- if (instance->GetData(DATA_DISTILLER) == IN_PROGRESS)
- {
- me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
- me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
- }
+ _introDone = true;
+ Talk(SAY_INTRO);
}
- void JustEngagedWith(Unit* /*who*/) override { }
-
- void StartRageGen(Unit* /*caster*/)
- {
- me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
- me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE);
-
- DoCast(me, SPELL_WARLORDS_RAGE_NAGA, true);
+ BossAI::MoveInLineOfSight(who);
+ }
- instance->SetData(DATA_DISTILLER, IN_PROGRESS);
- }
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (type != POINT_MOTION_TYPE)
+ return;
- void DamageTaken(Unit* /*done_by*/, uint32& damage, DamageEffectType /*damageType*/, SpellInfo const* /*spellInfo = nullptr*/) override
+ if (pointId == POINT_DISTILLER)
{
- if (me->GetHealth() <= damage)
- instance->SetData(DATA_DISTILLER, DONE);
- }
- };
-
-};
+ Talk(EMOTE_CHANNEL);
+ Talk(SAY_REGEN);
+ me->SetReactState(REACT_AGGRESSIVE);
+ DoCastSelf(SPELL_WARLORDS_RAGE);
-class boss_warlord_kalithresh : public CreatureScript
-{
-public:
- boss_warlord_kalithresh() : CreatureScript("boss_warlord_kalithresh") { }
+ if (Creature* distiller = ObjectAccessor::GetCreature(*me, _distillerGUID))
+ distiller->AI()->DoAction(ACTION_DISTILLER_CHANNEL);
+ }
+ }
- CreatureAI* GetAI(Creature* creature) const override
+ void DoAction(int32 action) override
{
- return GetSteamVaultAI<boss_warlord_kalithreshAI>(creature);
+ if (action == ACTION_DISTILLER_DEAD)
+ me->RemoveAurasDueToSpell(SPELL_WARLORDS_RAGE);
}
- struct boss_warlord_kalithreshAI : public ScriptedAI
+ void KilledUnit(Unit* /*victim*/) override
{
- boss_warlord_kalithreshAI(Creature* creature) : ScriptedAI(creature)
- {
- Initialize();
- instance = creature->GetInstanceScript();
- }
+ if (roll_chance_i(50))
+ Talk(SAY_SLAY);
+ else
+ DoPlaySoundToSet(me, SOUND_ID_SLAY);
+ }
- void Initialize()
- {
- Reflection_Timer = 10000;
- Impale_Timer = 7000 + rand32() % 7000;
- Rage_Timer = 45000;
- CanRage = false;
- }
+ void JustDied(Unit* /*killer*/) override
+ {
+ Talk(SAY_DEATH);
+ _JustDied();
+ }
- InstanceScript* instance;
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
- uint32 Reflection_Timer;
- uint32 Impale_Timer;
- uint32 Rage_Timer;
- bool CanRage;
+ events.Update(diff);
- void Reset() override
+ while (uint32 eventId = events.ExecuteEvent())
{
- Initialize();
-
- instance->SetBossState(DATA_WARLORD_KALITHRESH, NOT_STARTED);
+ switch (eventId)
+ {
+ case EVENT_HEAD_CRACK:
+ DoCastVictim(SPELL_HEAD_CRACK);
+ events.Repeat(20s, 30s);
+ break;
+ case EVENT_REFLECTION:
+ DoCastSelf(SPELL_REFLECTION);
+ events.Repeat(15s, 25s);
+ break;
+ case EVENT_IMPALE:
+ if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
+ DoCast(target, SPELL_IMPALE);
+ events.Repeat(7s, 12s);
+ break;
+ case EVENT_RAGE:
+ if (Creature* distiller = me->FindNearestCreature(NPC_NAGA_DISTILLER, 150.0f))
+ {
+ _distillerGUID = distiller->GetGUID();
+ me->SetReactState(REACT_PASSIVE);
+
+ float x, y, z;
+ distiller->GetContactPoint(me, x, y, z);
+
+ me->GetMotionMaster()->MovePoint(POINT_DISTILLER, x, y, z);
+ }
+ events.Repeat(50s);
+ break;
+ default:
+ break;
+ }
}
- void JustEngagedWith(Unit* /*who*/) override
- {
- Talk(SAY_AGGRO);
+ DoMeleeAttackIfReady();
+ }
- instance->SetBossState(DATA_WARLORD_KALITHRESH, IN_PROGRESS);
- }
+private:
+ bool _introDone;
+ ObjectGuid _distillerGUID;
+};
- void KilledUnit(Unit* /*victim*/) override
- {
- Talk(SAY_SLAY);
- }
+// 17954 - Naga Distiller
+struct npc_naga_distiller : public ScriptedAI
+{
+ npc_naga_distiller(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
- void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override
- {
- //hack :(
- if (spellInfo->Id == SPELL_WARLORDS_RAGE_PROC)
- if (instance->GetData(DATA_DISTILLER) == DONE)
- me->RemoveAurasDueToSpell(SPELL_WARLORDS_RAGE_PROC);
- }
+ void Reset() override
+ {
+ me->SetCorpseDelay(2, true);
+ DoCastSelf(SPELL_STUN_SELF);
+ me->SetUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
+ }
- void JustDied(Unit* /*killer*/) override
+ void DoAction(int32 action) override
+ {
+ if (action == ACTION_DISTILLER_CHANNEL)
{
- Talk(SAY_DEATH);
-
- instance->SetBossState(DATA_WARLORD_KALITHRESH, DONE);
+ // Creature is stunned, cast as triggered
+ DoCastSelf(SPELL_WARLORDS_RAGE_DISTILLER, true);
+ me->RemoveUnitFlag(UNIT_FLAG_UNINTERACTIBLE);
}
+ }
- void UpdateAI(uint32 diff) override
- {
- if (!UpdateVictim())
- return;
-
- if (Rage_Timer <= diff)
- {
- if (Creature* distiller = me->FindNearestCreature(17954, 100.0f))
- {
- Talk(SAY_REGEN);
- DoCast(me, SPELL_WARLORDS_RAGE);
- ENSURE_AI(npc_naga_distiller::npc_naga_distillerAI, distiller->AI())->StartRageGen(me);
- }
- Rage_Timer = 3000 + rand32() % 15000;
- } else Rage_Timer -= diff;
-
- //Reflection_Timer
- if (Reflection_Timer <= diff)
- {
- DoCast(me, SPELL_SPELL_REFLECTION);
- Reflection_Timer = 15000 + rand32() % 10000;
- } else Reflection_Timer -= diff;
-
- //Impale_Timer
- if (Impale_Timer <= diff)
- {
- if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0))
- DoCast(target, SPELL_IMPALE);
-
- Impale_Timer = 7500 + rand32() % 5000;
- } else Impale_Timer -= diff;
+ void JustDied(Unit* /*killer*/) override
+ {
+ if (Creature* kalithresh = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_WARLORD_KALITHRESH)))
+ kalithresh->AI()->DoAction(ACTION_DISTILLER_DEAD);
+ }
- DoMeleeAttackIfReady();
- }
- };
+private:
+ InstanceScript* _instance;
};
void AddSC_boss_warlord_kalithresh()
{
- new npc_naga_distiller();
- new boss_warlord_kalithresh();
+ RegisterSteamVaultCreatureAI(boss_warlord_kalithresh);
+ RegisterSteamVaultCreatureAI(npc_naga_distiller);
}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
index c18b8dfae5d..57341990c17 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp
@@ -71,7 +71,6 @@ class instance_steam_vault : public InstanceMapScript
SetHeaders(DataHeader);
SetBossNumber(EncounterCount);
LoadObjectData(creatureData, gameObjectData);
- distillerState = 0;
}
void OnGameObjectCreate(GameObject* go) override
@@ -96,21 +95,12 @@ class instance_steam_vault : public InstanceMapScript
}
}
- void SetData(uint32 type, uint32 data) override
+ void SetData(uint32 type, uint32 /*data*/) override
{
- if (type == DATA_DISTILLER)
- distillerState = data;
- else if (type == ACTION_OPEN_DOOR)
+ if (type == ACTION_OPEN_DOOR)
CheckMainDoor();
}
- uint32 GetData(uint32 type) const override
- {
- if (type == DATA_DISTILLER)
- return distillerState;
- return 0;
- }
-
bool SetBossState(uint32 type, EncounterState state) override
{
if (!InstanceScript::SetBossState(type, state))
@@ -134,9 +124,6 @@ class instance_steam_vault : public InstanceMapScript
return true;
}
-
- protected:
- uint8 distillerState;
};
InstanceScript* GetInstanceScript(InstanceMap* map) const override