diff options
author | offl <11556157+offl@users.noreply.github.com> | 2025-05-28 17:46:24 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-05-28 16:46:24 +0200 |
commit | 640ee4519993e8578fbb0b0cf53a4196026b3500 (patch) | |
tree | ecbc991baf1ea7ac492201f073422efef8a7599e /src | |
parent | e045dd021121f3c90451d0dcc88eed874798ebf2 (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.cpp | 312 | ||||
-rw-r--r-- | src/server/scripts/Outland/CoilfangReservoir/SteamVault/instance_steam_vault.cpp | 17 |
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 |