diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp | 443 |
1 files changed, 194 insertions, 249 deletions
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp index 029e24396e2..da662adc8cc 100644 --- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp +++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp @@ -31,90 +31,79 @@ uint32 ForgeSearch[3] = GO_GLOWING_ANVIL_3 }; -class npc_dragonflayer_forge_master : public CreatureScript +struct npc_dragonflayer_forge_master : public ScriptedAI { - public: - npc_dragonflayer_forge_master() : CreatureScript("npc_dragonflayer_forge_master") { } - - struct npc_dragonflayer_forge_masterAI : public ScriptedAI + npc_dragonflayer_forge_master(Creature* creature) : ScriptedAI(creature) + { + _instance = creature->GetInstanceScript(); + _forgeId = 0; + } + + void Reset() override + { + if (!_forgeId) + _forgeId = GetForgeMasterType(); + + if (!me->IsAlive()) + return; + + if (_forgeId) + _instance->SetData(DATA_FORGE_1 + _forgeId - 1, NOT_STARTED); + } + + void JustDied(Unit* /*killer*/) override + { + if (!_forgeId) + _forgeId = GetForgeMasterType(); + + if (_forgeId) + _instance->SetData(DATA_FORGE_1 + _forgeId - 1, DONE); + } + + void JustEngagedWith(Unit* /*who*/) override + { + if (!_forgeId) + _forgeId = GetForgeMasterType(); + + if (_forgeId) + _instance->SetData(DATA_FORGE_1 + _forgeId - 1, IN_PROGRESS); + + me->SetEmoteState(EMOTE_ONESHOT_NONE); + } + + void UpdateAI(uint32 /*diff*/) override + { + if (!_forgeId) + _forgeId = GetForgeMasterType(); + + if (!UpdateVictim()) + return; + + DoMeleeAttackIfReady(); + } + +private: + uint8 GetForgeMasterType() + { + float diff = 30.0f; + uint8 id = 0; + + for (uint8 i = 0; i < 3; ++i) { - npc_dragonflayer_forge_masterAI(Creature* creature) : ScriptedAI(creature) - { - _instance = creature->GetInstanceScript(); - _forgeId = 0; - } - - void Reset() override - { - if (!_forgeId) - _forgeId = GetForgeMasterType(); - - if (!me->IsAlive()) - return; - - if (_forgeId) - _instance->SetData(DATA_FORGE_1 + _forgeId - 1, NOT_STARTED); - } - - void JustDied(Unit* /*killer*/) override - { - if (!_forgeId) - _forgeId = GetForgeMasterType(); - - if (_forgeId) - _instance->SetData(DATA_FORGE_1 + _forgeId - 1, DONE); - } - - void JustEngagedWith(Unit* /*who*/) override + if (GameObject* go = me->FindNearestGameObject(ForgeSearch[i], 30)) { - if (!_forgeId) - _forgeId = GetForgeMasterType(); - - if (_forgeId) - _instance->SetData(DATA_FORGE_1 + _forgeId - 1, IN_PROGRESS); - - me->SetEmoteState(EMOTE_ONESHOT_NONE); - } - - void UpdateAI(uint32 /*diff*/) override - { - if (!_forgeId) - _forgeId = GetForgeMasterType(); - - if (!UpdateVictim()) - return; - - DoMeleeAttackIfReady(); - } - - private: - uint8 GetForgeMasterType() - { - float diff = 30.0f; - uint8 id = 0; - - for (uint8 i = 0; i < 3; ++i) + if (me->IsWithinDist(go, diff, false)) { - if (GameObject* go = me->FindNearestGameObject(ForgeSearch[i], 30)) - { - if (me->IsWithinDist(go, diff, false)) - { - id = i + 1; - diff = me->GetDistance2d(go); - } - } + id = i + 1; + diff = me->GetDistance2d(go); } - return id > 0 && id < 4 ? id : 0; } - - InstanceScript* _instance; - uint8 _forgeId; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetUtgardeKeepAI<npc_dragonflayer_forge_masterAI>(creature); } + return id > 0 && id < 4 ? id : 0; + } + + InstanceScript* _instance; + uint8 _forgeId; }; enum TickingTimeBomb @@ -122,36 +111,25 @@ enum TickingTimeBomb SPELL_TICKING_TIME_BOMB_EXPLODE = 59687 }; -class spell_ticking_time_bomb : public SpellScriptLoader +class spell_ticking_time_bomb : public AuraScript { - public: - spell_ticking_time_bomb() : SpellScriptLoader("spell_ticking_time_bomb") { } - - class spell_ticking_time_bomb_AuraScript : public AuraScript - { - PrepareAuraScript(spell_ticking_time_bomb_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_TICKING_TIME_BOMB_EXPLODE }); - } - - void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */) - { - if (GetCaster() == GetTarget()) - GetTarget()->CastSpell(GetTarget(), SPELL_TICKING_TIME_BOMB_EXPLODE, true); - } - - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_ticking_time_bomb_AuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_ticking_time_bomb_AuraScript(); - } + PrepareAuraScript(spell_ticking_time_bomb); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_TICKING_TIME_BOMB_EXPLODE }); + } + + void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */) + { + if (GetCaster() == GetTarget()) + GetTarget()->CastSpell(GetTarget(), SPELL_TICKING_TIME_BOMB_EXPLODE, true); + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_ticking_time_bomb::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; enum Fixate @@ -159,35 +137,24 @@ enum Fixate SPELL_FIXATE_TRIGGER = 40415 }; -class spell_fixate : public SpellScriptLoader +class spell_fixate : public SpellScript { - public: - spell_fixate() : SpellScriptLoader("spell_fixate") { } - - class spell_fixate_SpellScript : public SpellScript - { - PrepareSpellScript(spell_fixate_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_FIXATE_TRIGGER }); - } - - void HandleScriptEffect(SpellEffIndex /*effIndex*/) - { - GetHitUnit()->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGER, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_fixate_SpellScript::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_fixate_SpellScript(); - } + PrepareSpellScript(spell_fixate); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_FIXATE_TRIGGER }); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + GetHitUnit()->CastSpell(GetCaster(), SPELL_FIXATE_TRIGGER, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_fixate::HandleScriptEffect, EFFECT_2, SPELL_EFFECT_SCRIPT_EFFECT); + } }; enum SecondWind @@ -196,47 +163,36 @@ enum SecondWind }; // 42770 - Second Wind -class spell_uk_second_wind : public SpellScriptLoader +class spell_uk_second_wind : public AuraScript { - public: - spell_uk_second_wind() : SpellScriptLoader("spell_uk_second_wind") { } - - class spell_uk_second_wind_AuraScript : public AuraScript - { - PrepareAuraScript(spell_uk_second_wind_AuraScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_SECOND_WIND_TRIGGER }); - } - - bool CheckProc(ProcEventInfo& eventInfo) - { - SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); - if (!spellInfo) - return false; - - return (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))) != 0; - } - - void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) - { - PreventDefaultAction(); - Unit* caster = eventInfo.GetActionTarget(); - caster->CastSpell(caster, SPELL_SECOND_WIND_TRIGGER, aurEff); - } - - void Register() override - { - DoCheckProc += AuraCheckProcFn(spell_uk_second_wind_AuraScript::CheckProc); - OnEffectProc += AuraEffectProcFn(spell_uk_second_wind_AuraScript::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_uk_second_wind_AuraScript(); - } + PrepareAuraScript(spell_uk_second_wind); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_SECOND_WIND_TRIGGER }); + } + + bool CheckProc(ProcEventInfo& eventInfo) + { + SpellInfo const* spellInfo = eventInfo.GetSpellInfo(); + if (!spellInfo) + return false; + + return (spellInfo->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))) != 0; + } + + void HandleProc(AuraEffect* aurEff, ProcEventInfo& eventInfo) + { + PreventDefaultAction(); + Unit* caster = eventInfo.GetActionTarget(); + caster->CastSpell(caster, SPELL_SECOND_WIND_TRIGGER, aurEff); + } + + void Register() override + { + DoCheckProc += AuraCheckProcFn(spell_uk_second_wind::CheckProc); + OnEffectProc += AuraEffectProcFn(spell_uk_second_wind::HandleProc, EFFECT_0, SPELL_AURA_DUMMY); + } }; enum EnslavedProtoDrake @@ -259,95 +215,84 @@ enum EnslavedProtoDrake const Position protodrakeCheckPos = {206.24f, -190.28f, 200.11f, 0.f}; -class npc_enslaved_proto_drake : public CreatureScript +struct npc_enslaved_proto_drake : public ScriptedAI { - public: - npc_enslaved_proto_drake() : CreatureScript("npc_enslaved_proto_drake") { } + npc_enslaved_proto_drake(Creature* creature) : ScriptedAI(creature) + { + _setData = false; + } + + void Reset() override + { + _events.Reset(); + _events.ScheduleEvent(EVENT_REND, 2s, 3s); + _events.ScheduleEvent(EVENT_FLAME_BREATH, 5500ms, 7s); + _events.ScheduleEvent(EVENT_KNOCKAWAY, 3500ms, 6s); + } + + void MovementInform(uint32 type, uint32 id) override + { + if (type == WAYPOINT_MOTION_TYPE && id == POINT_LAST) + { + me->SetAnimTier(AnimTier::Ground); + } + } - struct npc_enslaved_proto_drakeAI : public ScriptedAI + void SetData(uint32 type, uint32 data) override + { + if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->GetDistance(protodrakeCheckPos) < 5.0f) { - npc_enslaved_proto_drakeAI(Creature* creature) : ScriptedAI(creature) - { - _setData = false; - } + _setData = true; + me->SetAnimTier(AnimTier::Fly); + me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false); + } + } - void Reset() override - { - _events.Reset(); - _events.ScheduleEvent(EVENT_REND, 2s, 3s); - _events.ScheduleEvent(EVENT_FLAME_BREATH, 5500ms, 7s); - _events.ScheduleEvent(EVENT_KNOCKAWAY, 3500ms, 6s); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void MovementInform(uint32 type, uint32 id) override - { - if (type == WAYPOINT_MOTION_TYPE && id == POINT_LAST) - { - me->SetAnimTier(AnimTier::Ground); - } - } + _events.Update(diff); - void SetData(uint32 type, uint32 data) override - { - if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->GetDistance(protodrakeCheckPos) < 5.0f) - { - _setData = true; - me->SetAnimTier(AnimTier::Fly); - me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false); - } - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + while (uint32 eventid = _events.ExecuteEvent()) + { + switch (eventid) { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventid = _events.ExecuteEvent()) - { - switch (eventid) - { - case EVENT_REND: - DoCast(SPELL_REND); - _events.ScheduleEvent(EVENT_REND, 15s, 20s); - break; - case EVENT_FLAME_BREATH: - DoCast(SPELL_FLAME_BREATH); - _events.ScheduleEvent(EVENT_FLAME_BREATH, 11s, 12s); - break; - case EVENT_KNOCKAWAY: - DoCast(SPELL_KNOCK_AWAY); - _events.ScheduleEvent(EVENT_KNOCKAWAY, 7s, 8500ms); - break; - default: - break; - } - } - - DoMeleeAttackIfReady(); + case EVENT_REND: + DoCast(SPELL_REND); + _events.ScheduleEvent(EVENT_REND, 15s, 20s); + break; + case EVENT_FLAME_BREATH: + DoCast(SPELL_FLAME_BREATH); + _events.ScheduleEvent(EVENT_FLAME_BREATH, 11s, 12s); + break; + case EVENT_KNOCKAWAY: + DoCast(SPELL_KNOCK_AWAY); + _events.ScheduleEvent(EVENT_KNOCKAWAY, 7s, 8500ms); + break; + default: + break; } + } - private: - bool _setData; - EventMap _events; + DoMeleeAttackIfReady(); + } - }; +private: + bool _setData; + EventMap _events; - CreatureAI* GetAI(Creature* creature) const override - { - return GetUtgardeKeepAI<npc_enslaved_proto_drakeAI>(creature); - } }; void AddSC_utgarde_keep() { - new npc_dragonflayer_forge_master(); - new npc_enslaved_proto_drake(); - new spell_ticking_time_bomb(); - new spell_fixate(); - new spell_uk_second_wind(); + RegisterUtgardeKeepCreatureAI(npc_dragonflayer_forge_master); + RegisterUtgardeKeepCreatureAI(npc_enslaved_proto_drake); + RegisterSpellScript(spell_ticking_time_bomb); + RegisterSpellScript(spell_fixate); + RegisterSpellScript(spell_uk_second_wind); } |