diff options
Diffstat (limited to 'src')
3 files changed, 478 insertions, 603 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index ad6007160f8..975b659c05a 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -100,452 +100,388 @@ enum SummonGroups SUMMON_GROUP_CHAINED_SPIRIT = 0 }; -class boss_mandokir : public CreatureScript +struct boss_mandokir : public BossAI { - public: + boss_mandokir(Creature* creature) : BossAI(creature, DATA_MANDOKIR) + { + Initialize(); + } - boss_mandokir() : CreatureScript("boss_mandokir") { } + void Initialize() + { + _ohganotSoFast = true; + _reanimateOhganCooldown = false; + } - struct boss_mandokirAI : public BossAI - { - boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) - { - Initialize(); - } + void Reset() override + { + DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL); - void Initialize() - { - _ohganotSoFast = true; - _reanimateOhganCooldown = false; - } + _Reset(); - void Reset() override - { - DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL); + me->SummonCreatureGroup(SUMMON_GROUP_CHAINED_SPIRIT); + Initialize(); + _reviveGUID.Clear(); + } - _Reset(); + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + Talk(SAY_AGGRO); - me->SummonCreatureGroup(SUMMON_GROUP_CHAINED_SPIRIT); - Initialize(); - _reviveGUID.Clear(); - } + DoCastAOE(SPELL_BLOODLORD_AURA); - void JustEngagedWith(Unit* who) override + if (!summons.empty()) + { + for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) { - BossAI::JustEngagedWith(who); - Talk(SAY_AGGRO); - - DoCastAOE(SPELL_BLOODLORD_AURA); - - if (!summons.empty()) - { - for (SummonList::const_iterator itr = summons.begin(); itr != summons.end(); ++itr) - { - if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, *itr)) - if (chainedSpirit->GetEntry() == NPC_CHAINED_SPIRIT && chainedSpirit->AI()) - chainedSpirit->SetFaction(FACTION_NONE); - } - } - - events.ScheduleEvent(EVENT_DECAPITATE, 10s); - events.ScheduleEvent(EVENT_BLOODLETTING, 15s); - events.ScheduleEvent(EVENT_SUMMON_OHGAN, 20s); - events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 25s); + if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, *itr)) + if (chainedSpirit->GetEntry() == NPC_CHAINED_SPIRIT && chainedSpirit->AI()) + chainedSpirit->SetFaction(FACTION_NONE); } + } - void JustDied(Unit* /*killer*/) override - { - DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL); - _JustDied(); - Talk(SAY_DEATH); - } + events.ScheduleEvent(EVENT_DECAPITATE, 10s); + events.ScheduleEvent(EVENT_BLOODLETTING, 15s); + events.ScheduleEvent(EVENT_SUMMON_OHGAN, 20s); + events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 25s); + } + + void JustDied(Unit* /*killer*/) override + { + DoCastAOE(SPELL_SPIRIT_VENGEANCE_CANCEL); + _JustDied(); + Talk(SAY_DEATH); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + { + Talk(SAY_PLAYER_KILL); + DoCast(SPELL_LEVEL_UP); + _reviveGUID = victim->GetGUID(); + DoAction(ACTION_START_REVIVE); + } + } - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() == TYPEID_PLAYER) - { - Talk(SAY_PLAYER_KILL); - DoCast(SPELL_LEVEL_UP); - _reviveGUID = victim->GetGUID(); - DoAction(ACTION_START_REVIVE); - } - } + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (me->HealthBelowPctDamaged(20, damage) && !me->HasAura(SPELL_FRENZY)) + { + DoCast(me, SPELL_FRENZY, true); + Talk(SAY_FRENZY); + Talk(EMOTE_FRENZY); + } + } - void DamageTaken(Unit* /*attacker*/, uint32& damage) override - { - if (me->HealthBelowPctDamaged(20, damage) && !me->HasAura(SPELL_FRENZY)) - { - DoCast(me, SPELL_FRENZY, true); - Talk(SAY_FRENZY); - Talk(EMOTE_FRENZY); - } - } + void DoAction(int32 action) override + { + switch (action) + { + case ACTION_OHGAN_IS_DEATH: + events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 4s); + _ohganotSoFast = false; + break; + case ACTION_START_REVIVE: + { + std::list<Creature*> creatures; + GetCreatureListWithEntryInGrid(creatures, me, NPC_CHAINED_SPIRIT, 200.0f); + creatures.remove_if(Trinity::AnyDeadUnitCheck()); + creatures.remove_if(Trinity::UnitAuraCheck(true, SPELL_OHGAN_ORDERS_TRIGGER)); + Trinity::Containers::RandomResize(creatures, 1); + if (creatures.empty()) + return; - void DoAction(int32 action) override - { - switch (action) + for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr) { - case ACTION_OHGAN_IS_DEATH: - events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 4s); - _ohganotSoFast = false; - break; - case ACTION_START_REVIVE: + if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, (*itr)->GetGUID())) { - std::list<Creature*> creatures; - GetCreatureListWithEntryInGrid(creatures, me, NPC_CHAINED_SPIRIT, 200.0f); - creatures.remove_if(Trinity::AnyDeadUnitCheck()); - creatures.remove_if(Trinity::UnitAuraCheck(true, SPELL_OHGAN_ORDERS_TRIGGER)); - Trinity::Containers::RandomResize(creatures, 1); - if (creatures.empty()) - return; - - for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr) - { - if (Creature* chainedSpirit = ObjectAccessor::GetCreature(*me, (*itr)->GetGUID())) - { - chainedSpirit->AI()->SetGUID(_reviveGUID); - chainedSpirit->AI()->DoAction(ACTION_REVIVE); - _reviveGUID.Clear(); - } - } - break; + chainedSpirit->AI()->SetGUID(_reviveGUID); + chainedSpirit->AI()->DoAction(ACTION_REVIVE); + _reviveGUID.Clear(); } - default: - break; - } + break; } + default: + break; - uint32 GetData(uint32 type) const override - { - if (type == DATA_OHGANOT_SO_FAST) - return _ohganotSoFast; + } + } - return 0; - } + uint32 GetData(uint32 type) const override + { + if (type == DATA_OHGANOT_SO_FAST) + return _ohganotSoFast; - void SetGUID(ObjectGuid const& guid, int32 /*type = 0 */) override - { - _reviveGUID = guid; - } + return 0; + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void SetGUID(ObjectGuid const& guid, int32 /*type = 0 */) override + { + _reviveGUID = guid; + } - events.Update(diff); + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + events.Update(diff); - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SUMMON_OHGAN: + me->SetMountDisplayId(0); + DoCast(me, SPELL_SUMMON_OHGAN, true); + break; + case EVENT_DECAPITATE: + DoCastAOE(SPELL_DECAPITATE); + events.ScheduleEvent(EVENT_DECAPITATE, me->HasAura(SPELL_FRENZY) ? (17s + 500ms) : 35s); + break; + case EVENT_BLOODLETTING: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) { - case EVENT_SUMMON_OHGAN: - me->SetMountDisplayId(0); - DoCast(me, SPELL_SUMMON_OHGAN, true); - break; - case EVENT_DECAPITATE: - DoCastAOE(SPELL_DECAPITATE); - events.ScheduleEvent(EVENT_DECAPITATE, me->HasAura(SPELL_FRENZY) ? (17s + 500ms) : 35s); - break; - case EVENT_BLOODLETTING: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true)) - { - DoCast(target, SPELL_BLOODLETTING, true); - me->ClearUnitState(UNIT_STATE_CASTING); - } - events.ScheduleEvent(EVENT_BLOODLETTING, 25s); - break; - case EVENT_REANIMATE_OHGAN: - if (_reanimateOhganCooldown) - events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 1s); - else - { - DoCastAOE(SPELL_REANIMATE_OHGAN); - Talk(SAY_REANIMATE_OHGAN); - // Cooldown - _reanimateOhganCooldown = true; - events.ScheduleEvent(EVENT_REANIMATE_OHGAN_COOLDOWN, 20s); - } - break; - case EVENT_REANIMATE_OHGAN_COOLDOWN: - _reanimateOhganCooldown = false; - break; - case EVENT_DEVASTATING_SLAM: - DoCastAOE(SPELL_DEVASTATING_SLAM_TRIGGER); - events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 30s); - break; - default: - break; + DoCast(target, SPELL_BLOODLETTING, true); + me->ClearUnitState(UNIT_STATE_CASTING); } + events.ScheduleEvent(EVENT_BLOODLETTING, 25s); + break; + case EVENT_REANIMATE_OHGAN: + if (_reanimateOhganCooldown) + events.ScheduleEvent(EVENT_REANIMATE_OHGAN, 1s); + else + { + DoCastAOE(SPELL_REANIMATE_OHGAN); + Talk(SAY_REANIMATE_OHGAN); + // Cooldown + _reanimateOhganCooldown = true; + events.ScheduleEvent(EVENT_REANIMATE_OHGAN_COOLDOWN, 20s); + } + break; + case EVENT_REANIMATE_OHGAN_COOLDOWN: + _reanimateOhganCooldown = false; + break; + case EVENT_DEVASTATING_SLAM: + DoCastAOE(SPELL_DEVASTATING_SLAM_TRIGGER); + events.ScheduleEvent(EVENT_DEVASTATING_SLAM, 30s); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + } - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - } - - DoMeleeAttackIfReady(); - } - - private: - bool _ohganotSoFast; - bool _reanimateOhganCooldown; - ObjectGuid _reviveGUID; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<boss_mandokirAI>(creature); - } +private: + bool _ohganotSoFast; + bool _reanimateOhganCooldown; + ObjectGuid _reviveGUID; }; -class npc_ohgan : public CreatureScript +struct npc_ohgan : public ScriptedAI { - public: - npc_ohgan() : CreatureScript("npc_ohgan") { } + npc_ohgan(Creature* creature) : ScriptedAI(creature) + { + _instance = me->GetInstanceScript(); + } + + void JustEngagedWith(Unit* /*who*/) override + { + DoCastAOE(SPELL_OHGAN_ORDERS, true); + } + + void DamageTaken(Unit* /*attacker*/, uint32& damage) override + { + if (damage >= me->GetHealth()) + { + damage = 0; + me->AttackStop(); + me->SetHealth(0); + me->SetTarget(ObjectGuid::Empty); + DoCast(me, SPELL_CLEAR_ALL, true); + DoCast(me, SPELL_PERMANENT_FEIGN_DEATH); + + if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_MANDOKIR))) + mandokir->AI()->DoAction(ACTION_OHGAN_IS_DEATH); + } + } - struct npc_ohganAI : public ScriptedAI + void KilledUnit(Unit* victim) override + { + if (Creature* creature = victim->ToCreature()) { - npc_ohganAI(Creature* creature) : ScriptedAI(creature) - { - _instance = me->GetInstanceScript(); - } - - void JustEngagedWith(Unit* /*who*/) override - { + if (creature->GetEntry() == NPC_CHAINED_SPIRIT) DoCastAOE(SPELL_OHGAN_ORDERS, true); - } - - void DamageTaken(Unit* /*attacker*/, uint32& damage) override - { - if (damage >= me->GetHealth()) - { - damage = 0; - me->AttackStop(); - me->SetHealth(0); - me->SetTarget(ObjectGuid::Empty); - DoCast(me, SPELL_CLEAR_ALL, true); - DoCast(me, SPELL_PERMANENT_FEIGN_DEATH); - - if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_MANDOKIR))) - mandokir->AI()->DoAction(ACTION_OHGAN_IS_DEATH); - } - } - - void KilledUnit(Unit* victim) override - { - if (Creature* creature = victim->ToCreature()) - { - if (creature->GetEntry() == NPC_CHAINED_SPIRIT) - DoCastAOE(SPELL_OHGAN_ORDERS, true); - } - } - - void UpdateAI(uint32 /*diff*/) override - { - if (!UpdateVictim()) - return; + } + } - DoMeleeAttackIfReady(); - } + void UpdateAI(uint32 /*diff*/) override + { + if (!UpdateVictim()) + return; - private: - InstanceScript* _instance; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<npc_ohganAI>(creature); - } +private: + InstanceScript* _instance; }; -class npc_chained_spirit : public CreatureScript +struct npc_chained_spirit : public ScriptedAI { - public: - npc_chained_spirit() : CreatureScript("npc_chained_spirit") { } - - struct npc_chained_spiritAI : public ScriptedAI + npc_chained_spirit(Creature* creature) : ScriptedAI(creature) + { + _instance = me->GetInstanceScript(); + me->AddUnitMovementFlag(MOVEMENTFLAG_HOVER); + me->SetReactState(REACT_PASSIVE); // correct? + } + + void Reset() override + { + _revivePlayerGUID.Clear(); + } + + void SetGUID(ObjectGuid const& guid, int32 /*type = 0 */) override + { + _revivePlayerGUID = guid; + } + + void DoAction(int32 action) override + { + if (action == ACTION_REVIVE) { - npc_chained_spiritAI(Creature* creature) : ScriptedAI(creature) - { - _instance = me->GetInstanceScript(); - me->AddUnitMovementFlag(MOVEMENTFLAG_HOVER); - me->SetReactState(REACT_PASSIVE); // correct? - } - - void Reset() override - { - _revivePlayerGUID.Clear(); - } - - void SetGUID(ObjectGuid const& guid, int32 /*type = 0 */) override - { - _revivePlayerGUID = guid; - } - - void DoAction(int32 action) override + Position pos; + if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID)) { - if (action == ACTION_REVIVE) - { - Position pos; - if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID)) - { - target->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 5.0f, target->GetAbsoluteAngle(me)); - me->GetMotionMaster()->MovePoint(POINT_START_REVIVE, pos); - } - } + target->GetNearPoint(me, pos.m_positionX, pos.m_positionY, pos.m_positionZ, 5.0f, target->GetAbsoluteAngle(me)); + me->GetMotionMaster()->MovePoint(POINT_START_REVIVE, pos); } - - void MovementInform(uint32 type, uint32 pointId) override - { - if (type != POINT_MOTION_TYPE || !_revivePlayerGUID) - return; - - if (pointId == POINT_START_REVIVE) - { - if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID)) - DoCast(target, SPELL_REVIVE); - - me->DespawnOrUnsummon(2s); - } - } - - void JustDied(Unit* /*killer*/) override - { - Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID); - if (!target || target->IsAlive()) - return; - - if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_MANDOKIR))) - { - mandokir->GetAI()->SetGUID(target->GetGUID()); - mandokir->GetAI()->DoAction(ACTION_START_REVIVE); - } - - me->DespawnOrUnsummon(); - } - - void UpdateAI(uint32 /*diff*/) override { } - - private: - InstanceScript* _instance; - ObjectGuid _revivePlayerGUID; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<npc_chained_spiritAI>(creature); } -}; + } -class spell_mandokir_decapitate : public SpellScriptLoader -{ - public: - spell_mandokir_decapitate() : SpellScriptLoader("spell_mandokir_decapitate") { } + void MovementInform(uint32 type, uint32 pointId) override + { + if (type != POINT_MOTION_TYPE || !_revivePlayerGUID) + return; - class spell_mandokir_decapitate_SpellScript : public SpellScript + if (pointId == POINT_START_REVIVE) { - PrepareSpellScript(spell_mandokir_decapitate_SpellScript); + if (Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID)) + DoCast(target, SPELL_REVIVE); - void FilterTargets(std::list<WorldObject*>& targets) - { - if (targets.empty()) - return; - - WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Player* target = GetHitPlayer()) - caster->CastSpell(target, uint32(GetEffectValue()), true); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_decapitate_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_mandokir_decapitate_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_mandokir_decapitate_SpellScript(); + me->DespawnOrUnsummon(2s); } -}; + } -class spell_mandokir_bloodletting : public SpellScriptLoader -{ - public: - spell_mandokir_bloodletting() : SpellScriptLoader("spell_mandokir_bloodletting") { } + void JustDied(Unit* /*killer*/) override + { + Player* target = ObjectAccessor::GetPlayer(*me, _revivePlayerGUID); + if (!target || target->IsAlive()) + return; - class spell_mandokir_bloodletting_AuraScript : public AuraScript + if (Creature* mandokir = ObjectAccessor::GetCreature(*me, _instance->GetGuidData(DATA_MANDOKIR))) { - PrepareAuraScript(spell_mandokir_bloodletting_AuraScript); - - bool Validate(SpellInfo const* /*spell*/) override - { - return ValidateSpellInfo({ SPELL_BLOODLETTING_DAMAGE, SPELL_BLOODLETTING_HEAL }); - } - - void HandleEffectPeriodic(AuraEffect const* aurEff) - { - Unit* target = GetTarget(); - Unit* caster = GetCaster(); - if (!caster) - return; - - CastSpellExtraArgs args; - args.TriggerFlags = TRIGGERED_FULL_MASK; - args.AddSpellMod(SPELLVALUE_BASE_POINT0, std::max<int32>(7500, target->CountPctFromCurHealth(aurEff->GetAmount()))); + mandokir->GetAI()->SetGUID(target->GetGUID()); + mandokir->GetAI()->DoAction(ACTION_START_REVIVE); + } - caster->CastSpell(target, SPELL_BLOODLETTING_DAMAGE, args); - target->CastSpell(caster, SPELL_BLOODLETTING_HEAL, args); - } + me->DespawnOrUnsummon(); + } - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_mandokir_bloodletting_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); - } - }; + void UpdateAI(uint32 /*diff*/) override { } - AuraScript* GetAuraScript() const override - { - return new spell_mandokir_bloodletting_AuraScript(); - } +private: + InstanceScript* _instance; + ObjectGuid _revivePlayerGUID; }; -class spell_mandokir_spirit_vengeance_cancel : public SpellScriptLoader +// 96682 - Decapitate +class spell_mandokir_decapitate : public SpellScript { - public: - spell_mandokir_spirit_vengeance_cancel() : SpellScriptLoader("spell_mandokir_spirit_vengeance_cancel") { } - - class spell_mandokir_spirit_vengeance_cancel_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mandokir_spirit_vengeance_cancel_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Player* target = GetHitPlayer()) - target->RemoveAura(uint32(GetEffectValue())); - } + PrepareSpellScript(spell_mandokir_decapitate); + + void FilterTargets(std::list<WorldObject*>& targets) + { + if (targets.empty()) + return; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Player* target = GetHitPlayer()) + caster->CastSpell(target, uint32(GetEffectValue()), true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_decapitate::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_mandokir_decapitate::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } +}; - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_mandokir_spirit_vengeance_cancel_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - OnEffectHitTarget += SpellEffectFn(spell_mandokir_spirit_vengeance_cancel_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_DUMMY); - } - }; +// 96776 - Bloodletting +class spell_mandokir_bloodletting : public AuraScript +{ + PrepareAuraScript(spell_mandokir_bloodletting); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo({ SPELL_BLOODLETTING_DAMAGE, SPELL_BLOODLETTING_HEAL }); + } + + void HandleEffectPeriodic(AuraEffect const* aurEff) + { + Unit* target = GetTarget(); + Unit* caster = GetCaster(); + if (!caster) + return; + + CastSpellExtraArgs args; + args.TriggerFlags = TRIGGERED_FULL_MASK; + args.AddSpellMod(SPELLVALUE_BASE_POINT0, std::max<int32>(7500, target->CountPctFromCurHealth(aurEff->GetAmount()))); + + caster->CastSpell(target, SPELL_BLOODLETTING_DAMAGE, args); + target->CastSpell(caster, SPELL_BLOODLETTING_HEAL, args); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_mandokir_bloodletting::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY); + } +}; - SpellScript* GetSpellScript() const override - { - return new spell_mandokir_spirit_vengeance_cancel_SpellScript(); - } +// 96821 - Spirit's Vengeance Cancel +class spell_mandokir_spirit_vengeance_cancel : public SpellScript +{ + PrepareSpellScript(spell_mandokir_spirit_vengeance_cancel); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Player* target = GetHitPlayer()) + target->RemoveAura(uint32(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_mandokir_spirit_vengeance_cancel::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + OnEffectHitTarget += SpellEffectFn(spell_mandokir_spirit_vengeance_cancel::HandleScript, EFFECT_1, SPELL_EFFECT_DUMMY); + } }; class DevastatingSlamTargetSelector @@ -568,194 +504,127 @@ class DevastatingSlamTargetSelector Unit const* _victim; }; -class spell_mandokir_devastating_slam : public SpellScriptLoader +// 96761 - Devastating Slam +class spell_mandokir_devastating_slam : public SpellScript { - public: - spell_mandokir_devastating_slam() : SpellScriptLoader("spell_mandokir_devastating_slam") { } - - class spell_mandokir_devastating_slam_SpellScript : public SpellScript + PrepareSpellScript(spell_mandokir_devastating_slam); + + void FilterTargets(std::list<WorldObject*>& targets) + { + targets.remove_if(DevastatingSlamTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetVictim())); + if (targets.empty()) + return; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + float angle = 0.0f; + float x, y, z; + + if (Player* target = GetHitPlayer()) { - PrepareSpellScript(spell_mandokir_devastating_slam_SpellScript); + caster->AttackStop(); + caster->SetOrientation(caster->GetAbsoluteAngle(target)); + caster->SetFacingTo(caster->GetAbsoluteAngle(target)); - void FilterTargets(std::list<WorldObject*>& targets) - { - targets.remove_if(DevastatingSlamTargetSelector(GetCaster()->ToCreature(), GetCaster()->GetVictim())); - if (targets.empty()) - return; - - WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } + caster->CastSpell(caster, SPELL_DEVASTATING_SLAM, false); - void HandleScript(SpellEffIndex /*effIndex*/) + // HACK: Need better way for pos calculation + for (uint8 i = 0; i <= 50; ++i) { - Unit* caster = GetCaster(); - float angle = 0.0f; - float x, y, z; - - if (Player* target = GetHitPlayer()) - { - caster->AttackStop(); - caster->SetOrientation(caster->GetAbsoluteAngle(target)); - caster->SetFacingTo(caster->GetAbsoluteAngle(target)); - - caster->CastSpell(caster, SPELL_DEVASTATING_SLAM, false); + angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f); + caster->GetClosePoint(x, y, z, 4.0f, frand(-2.5f, 50.0f), angle); - // HACK: Need better way for pos calculation - for (uint8 i = 0; i <= 50; ++i) - { - angle = float(rand_norm()) * static_cast<float>(M_PI * 35.0f / 180.0f) - static_cast<float>(M_PI * 17.5f / 180.0f); - caster->GetClosePoint(x, y, z, 4.0f, frand(-2.5f, 50.0f), angle); - - caster->CastSpell(Position{ x, y, z }, SPELL_DEVASTATING_SLAM_DAMAGE, true); - } - } - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_devastating_slam_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); - OnEffectHitTarget += SpellEffectFn(spell_mandokir_devastating_slam_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + caster->CastSpell(Position{ x, y, z }, SPELL_DEVASTATING_SLAM_DAMAGE, true); } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_mandokir_devastating_slam_SpellScript(); } -}; - -class spell_mandokir_ohgan_orders : public SpellScriptLoader -{ - public: - spell_mandokir_ohgan_orders() : SpellScriptLoader("spell_mandokir_ohgan_orders") { } - - class spell_mandokir_ohgan_orders_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mandokir_ohgan_orders_SpellScript); + } - void FilterTargets(std::list<WorldObject*>& targets) - { - if (targets.empty()) - return; - - WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); - targets.clear(); - targets.push_back(target); - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - if (Unit* target = GetHitUnit()) - caster->CastSpell(target, uint32(GetEffectValue()), true); - } - - void Register() override - { - OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_ohgan_orders_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); - OnEffectHitTarget += SpellEffectFn(spell_mandokir_ohgan_orders_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_mandokir_ohgan_orders_SpellScript(); - } + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_devastating_slam::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENEMY); + OnEffectHitTarget += SpellEffectFn(spell_mandokir_devastating_slam::HandleScript, EFFECT_0, SPELL_EFFECT_FORCE_CAST); + } }; -class spell_mandokir_ohgan_orders_trigger : public SpellScriptLoader +// 96721 - Ohgan's Orders +class spell_mandokir_ohgan_orders : public SpellScript { - public: - spell_mandokir_ohgan_orders_trigger() : SpellScriptLoader("spell_mandokir_ohgan_orders_trigger") { } - - class spell_mandokir_ohgan_orders_trigger_AuraScript : public AuraScript - { - PrepareAuraScript(spell_mandokir_ohgan_orders_trigger_AuraScript); - - void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - Unit* target = GetTarget(); - if (Unit* caster = GetCaster()) - { - // HACK: research better way - caster->ClearUnitState(UNIT_STATE_CASTING); - caster->GetMotionMaster()->Clear(); - caster->GetThreatManager().ResetAllThreat(); - caster->GetThreatManager().AddThreat(target, 50000000.0f); - // TODO: Fixate mechanic - } - } - - void Register() override - { - AfterEffectApply += AuraEffectApplyFn(spell_mandokir_ohgan_orders_trigger_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_mandokir_ohgan_orders_trigger_AuraScript(); - } + PrepareSpellScript(spell_mandokir_ohgan_orders); + + void FilterTargets(std::list<WorldObject*>& targets) + { + if (targets.empty()) + return; + + WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); + targets.clear(); + targets.push_back(target); + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + if (Unit* target = GetHitUnit()) + caster->CastSpell(target, uint32(GetEffectValue()), true); + } + + void Register() override + { + OnObjectAreaTargetSelect += SpellObjectAreaTargetSelectFn(spell_mandokir_ohgan_orders::FilterTargets, EFFECT_0, TARGET_UNIT_SRC_AREA_ENTRY); + OnEffectHitTarget += SpellEffectFn(spell_mandokir_ohgan_orders::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } }; -class spell_mandokir_reanimate_ohgan : public SpellScriptLoader +// 96722 - Ohgan's Orders +class spell_mandokir_ohgan_orders_trigger : public AuraScript { - public: - spell_mandokir_reanimate_ohgan() : SpellScriptLoader("spell_mandokir_reanimate_ohgan") { } - - class spell_mandokir_reanimate_ohgan_SpellScript : public SpellScript - { - PrepareSpellScript(spell_mandokir_reanimate_ohgan_SpellScript); - - void HandleScript(SpellEffIndex /*effIndex*/) - { - if (Unit* target = GetHitUnit()) - { - target->RemoveAura(SPELL_PERMANENT_FEIGN_DEATH); - target->CastSpell(target, SPELL_OHGAN_HEART_VISUAL, true); - target->CastSpell(nullptr, SPELL_OHGAN_ORDERS, true); - } - } + PrepareAuraScript(spell_mandokir_ohgan_orders_trigger); - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_mandokir_reanimate_ohgan_SpellScript::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Unit* target = GetTarget(); + if (Unit* caster = GetCaster()) { - return new spell_mandokir_reanimate_ohgan_SpellScript(); + // HACK: research better way + caster->ClearUnitState(UNIT_STATE_CASTING); + caster->GetMotionMaster()->Clear(); + caster->GetThreatManager().ResetAllThreat(); + caster->GetThreatManager().AddThreat(target, 50000000.0f); + // TODO: Fixate mechanic } + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_mandokir_ohgan_orders_trigger::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; -class spell_clear_all : public SpellScriptLoader +// 96724 - Reanimate Ohgan +class spell_mandokir_reanimate_ohgan : public SpellScript { - public: - spell_clear_all() : SpellScriptLoader("spell_clear_all") { } - - class spell_clear_all_SpellScript : public SpellScript - { - PrepareSpellScript(spell_clear_all_SpellScript); + PrepareSpellScript(spell_mandokir_reanimate_ohgan); - void HandleScript(SpellEffIndex /*effIndex*/) - { - Unit* caster = GetCaster(); - caster->RemoveAllAurasOnDeath(); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_clear_all_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override + void HandleScript(SpellEffIndex /*effIndex*/) + { + if (Unit* target = GetHitUnit()) { - return new spell_clear_all_SpellScript(); + target->RemoveAura(SPELL_PERMANENT_FEIGN_DEATH); + target->CastSpell(target, SPELL_OHGAN_HEART_VISUAL, true); + target->CastSpell(nullptr, SPELL_OHGAN_ORDERS, true); } + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_mandokir_reanimate_ohgan::HandleScript, EFFECT_1, SPELL_EFFECT_SCRIPT_EFFECT); + } }; class achievement_ohganot_so_fast : public AchievementCriteriaScript @@ -771,16 +640,15 @@ class achievement_ohganot_so_fast : public AchievementCriteriaScript void AddSC_boss_mandokir() { - new boss_mandokir(); - new npc_ohgan(); - new npc_chained_spirit(); - new spell_mandokir_decapitate(); - new spell_mandokir_bloodletting(); - new spell_mandokir_spirit_vengeance_cancel(); - new spell_mandokir_devastating_slam(); - new spell_mandokir_ohgan_orders(); - new spell_mandokir_ohgan_orders_trigger(); - new spell_mandokir_reanimate_ohgan(); - new spell_clear_all(); + RegisterZulGurubCreatureAI(boss_mandokir); + RegisterZulGurubCreatureAI(npc_ohgan); + RegisterZulGurubCreatureAI(npc_chained_spirit); + RegisterSpellScript(spell_mandokir_decapitate); + RegisterSpellScript(spell_mandokir_bloodletting); + RegisterSpellScript(spell_mandokir_spirit_vengeance_cancel); + RegisterSpellScript(spell_mandokir_devastating_slam); + RegisterSpellScript(spell_mandokir_ohgan_orders); + RegisterSpellScript(spell_mandokir_ohgan_orders_trigger); + RegisterSpellScript(spell_mandokir_reanimate_ohgan); new achievement_ohganot_so_fast(); } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp index c165787c1a8..3677594a533 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp @@ -31,61 +31,50 @@ enum Events { }; -class boss_renataki : public CreatureScript +struct boss_renataki : public BossAI { - public: - boss_renataki() : CreatureScript("boss_renataki") { } + boss_renataki(Creature* creature) : BossAI(creature, DATA_RENATAKI) + { + } - struct boss_renatakiAI : public BossAI - { - boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_RENATAKI) - { - } + void Reset() override + { + } - void Reset() override - { - } + void JustDied(Unit* /*killer*/) override + { + } - void JustDied(Unit* /*killer*/) override - { - } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - 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) - { - default: - break; - } - } - */ - - DoMeleeAttackIfReady(); - } - }; + events.Update(diff); - CreatureAI* GetAI(Creature* creature) const override + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + /* + while (uint32 eventId = events.ExecuteEvent()) { - return GetZulGurubAI<boss_renatakiAI>(creature); + switch (eventId) + { + default: + break; + } } + */ + + DoMeleeAttackIfReady(); + } }; void AddSC_boss_renataki() { - new boss_renataki(); + RegisterZulGurubCreatureAI(boss_renataki); } diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 5cbe20f1fc1..ba45619edc9 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -826,6 +826,23 @@ class spell_gen_chaos_blast : public SpellScript } }; +// 28471 - ClearAll +class spell_clear_all : public SpellScript +{ + PrepareSpellScript(spell_clear_all); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* caster = GetCaster(); + caster->RemoveAllAurasOnDeath(); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_clear_all::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } +}; + enum Clone { SPELL_NIGHTMARE_FIGMENT_MIRROR_IMAGE = 57528 @@ -4768,6 +4785,7 @@ void AddSC_generic_spell_scripts() RegisterSpellScript(spell_gen_cannibalize); RegisterSpellScript(spell_gen_chains_of_ice); RegisterSpellScript(spell_gen_chaos_blast); + RegisterSpellScript(spell_clear_all); RegisterSpellScript(spell_gen_clone); RegisterSpellScript(spell_gen_clone_weapon); RegisterSpellScript(spell_gen_clone_weapon_aura); |