diff options
author | Aqua Deus <95978183+aquadeus@users.noreply.github.com> | 2025-10-18 22:14:53 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-10-18 22:14:53 +0200 |
commit | 5d00e6b4ab2c08c11ed735e69f6251f4cde8f6bd (patch) | |
tree | 4a1f7bd1ead3ed9d36c487c4a8ef033f9b2fed4c /src | |
parent | ea8972d716ee8a39d031bcf9b4b83252114fd421 (diff) |
Scripts/Mardum: Script Fel Lord Caza for quest Hidden no more (#30949)
Co-authored-by: Naddley <NaddleyTC@gmail.com>
Co-authored-by: ModoX <moardox@gmail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/BrokenIsles/zone_mardum.cpp | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/src/server/scripts/BrokenIsles/zone_mardum.cpp b/src/server/scripts/BrokenIsles/zone_mardum.cpp index 536d1b02b60..2f0cdd852c5 100644 --- a/src/server/scripts/BrokenIsles/zone_mardum.cpp +++ b/src/server/scripts/BrokenIsles/zone_mardum.cpp @@ -27,6 +27,7 @@ #include "MapUtils.h" #include "MotionMaster.h" #include "ObjectAccessor.h" +#include "PathGenerator.h" #include "PassiveAI.h" #include "PhasingHandler.h" #include "Player.h" @@ -34,6 +35,7 @@ #include "ScriptedCreature.h" #include "ScriptedGossip.h" #include "SpellAuras.h" +#include "SpellMgr.h" #include "SpellScript.h" #include "TemporarySummon.h" @@ -1969,6 +1971,282 @@ CreatureAI* DemonHunterHiddenNoMoreAISelector(Creature* creature) return new NullCreatureAI(creature); }; +enum FelLordCazaData +{ + // Text + SAY_FEL_LORD_CAZA_AGGRO = 0, + SAY_FEL_LORD_CAZA_THROW_AXE = 1, + SAY_FEL_LORD_CAZA_DEATH = 2, + + // Spells + SPELL_FEL_LORD_CAZA_SWEEPING_SLASH = 197002, + SPELL_FEL_LORD_CAZA_FEL_INFUSION = 197180, + SPELL_FEL_LORD_CAZA_VIOLENT_FEL_ENERGY = 196989, + SPELL_FEL_LORD_CAZA_THROW_AXE_JUMP = 196875, + SPELL_FEL_LORD_CAZA_THROW_AXE_MISSILE = 196876, + SPELL_FEL_LORD_CAZA_THROW_AXE_KNOCKBACK = 196955, + SPELL_FEL_LORD_CAZA_DIES = 210101, + SPELL_FEL_LORD_CAZA_KILL_CREDIT = 210104, + SPELL_FEL_LORD_CAZA_TAKING_POWER = 210105, + SPELL_AREATRIGGER_DUMMY_FEL_LORD_CAZA = 197471, // Serverside + + // Events + EVENT_CAZA_SWEEPING_SLASH = 1, + EVENT_CAZA_FEL_INFUSION, + EVENT_CAZA_THROW_AXE_JUMP, + + NPC_FEL_LORD_CAZA = 96441, + + DATA_CAZA_AXE_TARGET_GUID = 0, + + ACTION_CAZA_AXE_RETRIEVED = 0, +}; + +// 96441 - Fel Lord Caza +struct npc_fel_lord_caza_cryptic_hollow : public ScriptedAI +{ + npc_fel_lord_caza_cryptic_hollow(Creature* creature) : ScriptedAI(creature) { } + + void JustEngagedWith(Unit* /*who*/) override + { + Talk(SAY_FEL_LORD_CAZA_AGGRO); + _events.ScheduleEvent(EVENT_CAZA_SWEEPING_SLASH, 6s); + _events.ScheduleEvent(EVENT_CAZA_FEL_INFUSION, 11s); + _events.ScheduleEvent(EVENT_CAZA_THROW_AXE_JUMP, 23s); + } + + void Reset() override + { + _events.Reset(); + _axeTarget = ObjectGuid::Empty; + } + + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_FEL_LORD_CAZA_DEATH); + DoCastSelf(SPELL_FEL_LORD_CAZA_DIES); + + for (ObjectGuid tapperGUID : me->GetTapList()) + { + if (Player* tapper = ObjectAccessor::GetPlayer(*me, tapperGUID)) + tapper->CastSpell(tapper, SPELL_FEL_LORD_CAZA_KILL_CREDIT, false); + } + } + + void OnSpellCast(SpellInfo const* spell) override + { + if (spell->Id == SPELL_FEL_LORD_CAZA_THROW_AXE_MISSILE) + me->SetReactState(REACT_AGGRESSIVE); + } + + void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override + { + if (spellInfo->Id == SPELL_AREATRIGGER_DUMMY_FEL_LORD_CAZA && target->GetTypeId() == TYPEID_PLAYER && !me->IsInCombat()) + me->AI()->AttackStart(target->ToUnit()); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + _events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_CAZA_SWEEPING_SLASH: + DoCastVictim(SPELL_FEL_LORD_CAZA_SWEEPING_SLASH); + break; + case EVENT_CAZA_FEL_INFUSION: + DoCast(SPELL_FEL_LORD_CAZA_FEL_INFUSION); + break; + case EVENT_CAZA_THROW_AXE_JUMP: + Talk(SAY_FEL_LORD_CAZA_THROW_AXE); + me->SetReactState(REACT_PASSIVE); + DoCast(SPELL_FEL_LORD_CAZA_THROW_AXE_JUMP); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } + } + + void DoAction(int32 param) override + { + if (param != ACTION_CAZA_AXE_RETRIEVED) + return; + + _events.ScheduleEvent(EVENT_CAZA_FEL_INFUSION, 400ms); + _events.ScheduleEvent(EVENT_CAZA_SWEEPING_SLASH, 8500ms); + _events.ScheduleEvent(EVENT_CAZA_THROW_AXE_JUMP, 12000ms); + } + + void SetGUID(ObjectGuid const& guid, int32 id) override + { + if (id != DATA_CAZA_AXE_TARGET_GUID) + return; + + _axeTarget = guid; + } + + ObjectGuid GetGUID(int32 id) const override + { + if (id != DATA_CAZA_AXE_TARGET_GUID) + return ObjectGuid::Empty; + + return _axeTarget; + } + +private: + EventMap _events; + ObjectGuid _axeTarget; +}; + +// ID - 169 +struct at_fel_lord_caza_intro : AreaTriggerAI +{ + using AreaTriggerAI::AreaTriggerAI; + + void OnUnitEnter(Unit* unit) override + { + Player* player = unit->ToPlayer(); + if (!player || player->IsGameMaster()) + return; + + Creature* caza = player->FindNearestCreature(NPC_FEL_LORD_CAZA, 100.0f); + if (!caza || caza->isDead()) + return; + + // This should have a cooldown of 2 minutes + caza->CastSpell(player, SPELL_AREATRIGGER_DUMMY_FEL_LORD_CAZA, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } +}; + +// 197180 - Fel Infusion +// ID - 5315 +struct at_fel_lord_caza_fel_infusion : AreaTriggerAI +{ + using AreaTriggerAI::AreaTriggerAI; + + void OnUnitEnter(Unit* unit) override + { + if (!unit->IsPlayer()) + return; + + Unit* caster = at->GetCaster(); + if (!caster) + return; + + caster->CastSpell(unit, SPELL_FEL_LORD_CAZA_VIOLENT_FEL_ENERGY, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } +}; + +// 196959 - Throw Axe +// ID - 5295 +struct at_fel_lord_caza_throw_axe_knockback : AreaTriggerAI +{ + using AreaTriggerAI::AreaTriggerAI; + + void OnInitialize() override + { + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(at->GetSpellId(), DIFFICULTY_NONE); + if (!spellInfo) + return; + + Unit* caster = at->GetCaster(); + if (!caster) + return; + + Unit* axeTarget = ObjectAccessor::GetUnit(*at, caster->GetAI()->GetGUID(DATA_CAZA_AXE_TARGET_GUID)); + if (!axeTarget) + return; + + Position destPos = at->GetFirstCollisionPosition(spellInfo->GetMaxRange(false, caster), at->GetRelativeAngle(axeTarget)); + PathGenerator path(at); + + path.CalculatePath(destPos.GetPositionX(), destPos.GetPositionY(), destPos.GetPositionZ(), false); + + at->InitSplines(path.GetPath()); + } + + void OnUnitEnter(Unit* unit) override + { + if (Unit* caster = at->GetCaster()) + if (caster->IsValidAttackTarget(unit)) + caster->CastSpell(unit, SPELL_FEL_LORD_CAZA_THROW_AXE_KNOCKBACK, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + } +}; + +// 196889 - Throw Axe +class spell_fel_lord_caza_throwing_axe_selector : public SpellScript +{ + void FilterTargets(std::list<WorldObject*>& targets) + { + targets.remove_if([this](WorldObject* target) -> bool + { + return GetCaster()->GetDistance(target) <= 25.0f; + }); + } + + void HandleHit(SpellEffIndex /*effIndex*/) + { + GetCaster()->CastSpell(GetHitUnit()->GetPosition(), SPELL_FEL_LORD_CAZA_THROW_AXE_MISSILE, TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR); + GetCaster()->SetFacingToObject(GetHitUnit()); + GetCaster()->GetAI()->SetGUID(GetHitUnit()->GetGUID(), DATA_CAZA_AXE_TARGET_GUID); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_fel_lord_caza_throwing_axe_selector::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_fel_lord_caza_throwing_axe_selector::HandleHit, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + +// 210103 - (Serverside/Non-DB2) Hidden No More: Fel Lord Caza Dies 02 +class spell_fel_lord_caza_dies_02 : public SpellScript +{ + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FEL_LORD_CAZA_TAKING_POWER }); + } + + void HandleHitTarget(SpellEffIndex /*effIndex*/) const + { + Unit* target = GetHitUnit(); + target->CastSpell(target, SPELL_FEL_LORD_CAZA_TAKING_POWER, CastSpellExtraArgsInit{ + .TriggerFlags = TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_DONT_REPORT_CAST_ERROR, + .TriggeringSpell = GetSpell() + }); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_fel_lord_caza_dies_02::HandleHitTarget, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; + +// 196892 - Disarmed +class spell_fel_lord_caza_disarmed : public AuraScript +{ + void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + GetTarget()->GetAI()->DoAction(ACTION_CAZA_AXE_RETRIEVED); + } + + void Register() override + { + AfterEffectRemove += AuraEffectRemoveFn(spell_fel_lord_caza_disarmed::AfterRemove, EFFECT_0, SPELL_AURA_MOD_MELEE_HASTE_3, AURA_EFFECT_HANDLE_REAL); + } +}; + void AddSC_zone_mardum() { // Creature @@ -1982,6 +2260,7 @@ void AddSC_zone_mardum() RegisterCreatureAI(npc_inquisitor_baleful_molten_shore); RegisterCreatureAI(npc_baleful_beaming_eye); RegisterCreatureAI(npc_sevis_brightflame_shivarra_gateway); + RegisterCreatureAI(npc_fel_lord_caza_cryptic_hollow); // AISelector new FactoryCreatureScript<CreatureAI, &KaynSunfuryNearLegionBannerAISelector>("npc_kayn_sunfury_ashtongue_intro"); @@ -1998,6 +2277,9 @@ void AddSC_zone_mardum() // AreaTrigger RegisterAreaTriggerAI(at_enter_the_illidari_ashtongue_allari_killcredit); RegisterAreaTriggerAI(at_enter_the_illidari_shivarra_conversation); + RegisterAreaTriggerAI(at_fel_lord_caza_intro); + RegisterAreaTriggerAI(at_fel_lord_caza_fel_infusion); + RegisterAreaTriggerAI(at_fel_lord_caza_throw_axe_knockback); // EventScript new event_sevis_sacrifice_player(); @@ -2026,4 +2308,7 @@ void AddSC_zone_mardum() RegisterSpellScriptWithArgs(spell_freed_killcredit_set_them_free<NPC_IZAL_WHITEMOON_FREED>, "spell_izal_whitemoon_killcredit_set_them_free"); RegisterSpellScriptWithArgs(spell_freed_killcredit_set_them_free<NPC_BELATH_DAWNBLADE_FREED>, "spell_belath_dawnblade_killcredit_set_them_free"); RegisterSpellScriptWithArgs(spell_freed_killcredit_set_them_free<NPC_MANNETHREL_DARKSTAR_FREED>, "spell_mannethrel_darkstar_killcredit_set_them_free"); + RegisterSpellScript(spell_fel_lord_caza_throwing_axe_selector); + RegisterSpellScript(spell_fel_lord_caza_dies_02); + RegisterSpellScript(spell_fel_lord_caza_disarmed); }; |