diff options
3 files changed, 506 insertions, 591 deletions
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp index bc16abd998f..ef5189f2eb5 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp @@ -99,195 +99,184 @@ Position const PosMandokir[2] = { -12197.86f, -1949.392f, 130.2745f, 0.0f } }; -class boss_mandokir : public CreatureScript +struct boss_mandokir : public BossAI { - public: - boss_mandokir() : CreatureScript("boss_mandokir") { } - - struct boss_mandokirAI : public BossAI + boss_mandokir(Creature* creature) : BossAI(creature, DATA_MANDOKIR) + { + Initialize(); + } + + void Initialize() + { + _killCount = 0; + } + + void Reset() override + { + if (me->GetPositionZ() > 140.0f) { - boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) - { - Initialize(); - } - - void Initialize() - { - _killCount = 0; - } - - void Reset() override - { - if (me->GetPositionZ() > 140.0f) - { - _Reset(); - Initialize(); - me->SetImmuneToAll(true); - events.ScheduleEvent(EVENT_CHECK_START, 1s); - if (Creature* speaker = instance->GetCreature(DATA_VILEBRANCH_SPEAKER)) - if (!speaker->IsAlive()) - speaker->Respawn(true); - } - summons.DespawnAll(); - me->Mount(MODEL_OHGAN_MOUNT); - } - - void JustDied(Unit* /*killer*/) override - { - summons.DespawnEntry(NPC_CHAINED_SPIRT); - instance->SetBossState(DATA_MANDOKIR, DONE); - instance->SaveToDB(); - } - - void JustReachedHome() override - { - me->SetImmuneToAll(false); - } - - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_OVERPOWER, 7s, 9s); - events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12s, 18s); - events.ScheduleEvent(EVENT_WHIRLWIND, 24s, 30s); - events.ScheduleEvent(EVENT_WATCH_PLAYER, 13s, 15s); - events.ScheduleEvent(EVENT_CHARGE_PLAYER, 33s, 38s); - me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); - Talk(SAY_AGGRO); - me->Dismount(); - - // Summon Ohgan (Spell missing) TEMP HACK - me->SummonCreature(NPC_OHGAN, me->GetPositionX() - 3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35s); - // Summon Chained Spirits - for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i) - me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN); - - DoZoneInCombat(); - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; + _Reset(); + Initialize(); + me->SetImmuneToAll(true); + events.ScheduleEvent(EVENT_CHECK_START, 1s); + if (Creature* speaker = instance->GetCreature(DATA_VILEBRANCH_SPEAKER)) + if (!speaker->IsAlive()) + speaker->Respawn(true); + } + summons.DespawnAll(); + me->Mount(MODEL_OHGAN_MOUNT); + } + + void JustDied(Unit* /*killer*/) override + { + summons.DespawnEntry(NPC_CHAINED_SPIRT); + instance->SetBossState(DATA_MANDOKIR, DONE); + instance->SaveToDB(); + } + + void JustReachedHome() override + { + me->SetImmuneToAll(false); + } + + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_OVERPOWER, 7s, 9s); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12s, 18s); + events.ScheduleEvent(EVENT_WHIRLWIND, 24s, 30s); + events.ScheduleEvent(EVENT_WATCH_PLAYER, 13s, 15s); + events.ScheduleEvent(EVENT_CHARGE_PLAYER, 33s, 38s); + me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); + Talk(SAY_AGGRO); + me->Dismount(); + + // Summon Ohgan (Spell missing) TEMP HACK + me->SummonCreature(NPC_OHGAN, me->GetPositionX() - 3, me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 35s); + // Summon Chained Spirits + for (int i = 0; i < CHAINED_SPIRT_COUNT; ++i) + me->SummonCreature(NPC_CHAINED_SPIRT, PosSummonChainedSpirits[i], TEMPSUMMON_CORPSE_DESPAWN); + + DoZoneInCombat(); + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() != TYPEID_PLAYER) + return; + + if (++_killCount == 3) + { + Talk(SAY_DING_KILL); + if (Creature* jindo = instance->GetCreature(DATA_JINDO)) + if (jindo->IsAlive()) + jindo->AI()->Talk(SAY_GRATS_JINDO); + DoCast(me, SPELL_LEVEL_UP, true); + _killCount = 0; + } + } - if (++_killCount == 3) - { - Talk(SAY_DING_KILL); - if (Creature* jindo = instance->GetCreature(DATA_JINDO)) - if (jindo->IsAlive()) - jindo->AI()->Talk(SAY_GRATS_JINDO); - DoCast(me, SPELL_LEVEL_UP, true); - _killCount = 0; - } - } + void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + { + if (summon->GetEntry() == NPC_OHGAN) + { + DoCast(me, SPELL_FRENZY); + Talk(SAY_OHGAN_DEAD); + } + } - void SummonedCreatureDies(Creature* summon, Unit* /*killer*/) override + void MovementInform(uint32 type, uint32 id) override + { + if (type == WAYPOINT_MOTION_TYPE) + { + me->SetWalk(false); + if (id == POINT_MANDOKIR_END) { - if (summon->GetEntry() == NPC_OHGAN) - { - DoCast(me, SPELL_FRENZY); - Talk(SAY_OHGAN_DEAD); - } + me->SetHomePosition(PosMandokir[1]); + me->GetMotionMaster()->MoveTargetedHome(); + instance->SetBossState(DATA_MANDOKIR, NOT_STARTED); } + } + } - void MovementInform(uint32 type, uint32 id) override - { - if (type == WAYPOINT_MOTION_TYPE) - { - me->SetWalk(false); - if (id == POINT_MANDOKIR_END) - { - me->SetHomePosition(PosMandokir[1]); - me->GetMotionMaster()->MoveTargetedHome(); - instance->SetBossState(DATA_MANDOKIR, NOT_STARTED); - } - } - } + void UpdateAI(uint32 diff) override + { + events.Update(diff); - void UpdateAI(uint32 diff) override + if (!UpdateVictim()) + { + if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL) { - events.Update(diff); - - if (!UpdateVictim()) - { - if (instance->GetBossState(DATA_MANDOKIR) == NOT_STARTED || instance->GetBossState(DATA_MANDOKIR) == SPECIAL) - { - while (uint32 eventId = events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_CHECK_START: - if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL) - { - me->GetMotionMaster()->MovePoint(0, PosMandokir[1]); - events.ScheduleEvent(EVENT_STARTED, 6s); - } - else - events.ScheduleEvent(EVENT_CHECK_START, 1s); - break; - case EVENT_STARTED: - me->SetImmuneToAll(false); - me->GetMotionMaster()->MovePath(PATH_MANDOKIR, false); - break; - default: - break; - } - } - } - return; - } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { - case EVENT_OVERPOWER: - DoCastVictim(SPELL_OVERPOWER, true); - events.ScheduleEvent(EVENT_OVERPOWER, 6s, 12s); - break; - case EVENT_MORTAL_STRIKE: - if (me->GetVictim() && me->EnsureVictim()->HealthBelowPct(50)) - DoCastVictim(SPELL_MORTAL_STRIKE, true); - events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12s, 18s); - break; - case EVENT_WHIRLWIND: - DoCast(me, SPELL_WHIRLWIND); - events.ScheduleEvent(EVENT_WHIRLWIND, 22s, 26s); - break; - case EVENT_WATCH_PLAYER: - if (Unit* player = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) + case EVENT_CHECK_START: + if (instance->GetBossState(DATA_MANDOKIR) == SPECIAL) { - DoCast(player, SPELL_WATCH); - Talk(SAY_WATCH, player); + me->GetMotionMaster()->MovePoint(0, PosMandokir[1]); + events.ScheduleEvent(EVENT_STARTED, 6s); } - events.ScheduleEvent(EVENT_WATCH_PLAYER, 12s, 15s); + else + events.ScheduleEvent(EVENT_CHECK_START, 1s); break; - case EVENT_CHARGE_PLAYER: - DoCast(SelectTarget(SelectTargetMethod::Random, 0, 40, true), SPELL_CHARGE); - events.ScheduleEvent(EVENT_CHARGE_PLAYER, 22s, 30s); + case EVENT_STARTED: + me->SetImmuneToAll(false); + me->GetMotionMaster()->MovePath(PATH_MANDOKIR, false); break; default: break; } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; } - - DoMeleeAttackIfReady(); } + return; + } - private: - uint8 _killCount; - }; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - CreatureAI* GetAI(Creature* creature) const override + while (uint32 eventId = events.ExecuteEvent()) { - return GetZulGurubAI<boss_mandokirAI>(creature); + switch (eventId) + { + case EVENT_OVERPOWER: + DoCastVictim(SPELL_OVERPOWER, true); + events.ScheduleEvent(EVENT_OVERPOWER, 6s, 12s); + break; + case EVENT_MORTAL_STRIKE: + if (me->GetVictim() && me->EnsureVictim()->HealthBelowPct(50)) + DoCastVictim(SPELL_MORTAL_STRIKE, true); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, 12s, 18s); + break; + case EVENT_WHIRLWIND: + DoCast(me, SPELL_WHIRLWIND); + events.ScheduleEvent(EVENT_WHIRLWIND, 22s, 26s); + break; + case EVENT_WATCH_PLAYER: + if (Unit* player = SelectTarget(SelectTargetMethod::Random, 0, 100, true)) + { + DoCast(player, SPELL_WATCH); + Talk(SAY_WATCH, player); + } + events.ScheduleEvent(EVENT_WATCH_PLAYER, 12s, 15s); + break; + case EVENT_CHARGE_PLAYER: + DoCast(SelectTarget(SelectTargetMethod::Random, 0, 40, true), SPELL_CHARGE); + events.ScheduleEvent(EVENT_CHARGE_PLAYER, 22s, 30s); + break; + default: + break; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } + +private: + uint8 _killCount; }; // Ohgan @@ -297,52 +286,41 @@ enum OhganSpells SPELL_SUNDERARMOR = 24317 }; -class npc_ohgan : public CreatureScript +struct npc_ohgan : public ScriptedAI { - public: - npc_ohgan() : CreatureScript("npc_ohgan") { } - - struct npc_ohganAI : public ScriptedAI + npc_ohgan(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } + + void Initialize() + { + _sunderArmorTimer = 5000; + } + + void Reset() override + { + Initialize(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (_sunderArmorTimer <= diff) { - npc_ohganAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } - - void Initialize() - { - _sunderArmorTimer = 5000; - } - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (_sunderArmorTimer <= diff) - { - DoCastVictim(SPELL_SUNDERARMOR, true); - _sunderArmorTimer = urand(10000, 15000); - } - else - _sunderArmorTimer -= diff; - - DoMeleeAttackIfReady(); - } + DoCastVictim(SPELL_SUNDERARMOR, true); + _sunderArmorTimer = urand(10000, 15000); + } + else + _sunderArmorTimer -= diff; - private: - uint32 _sunderArmorTimer; - }; + DoMeleeAttackIfReady(); + } - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<npc_ohganAI>(creature); - } +private: + uint32 _sunderArmorTimer; }; enum VilebranchSpells @@ -351,105 +329,83 @@ enum VilebranchSpells SPELL_CLEAVE = 15284 }; -class npc_vilebranch_speaker : public CreatureScript +struct npc_vilebranch_speaker : public ScriptedAI { - public: - npc_vilebranch_speaker() : CreatureScript("npc_vilebranch_speaker") { } - - struct npc_vilebranch_speakerAI : public ScriptedAI + npc_vilebranch_speaker(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) + { + Initialize(); + } + + void Initialize() + { + _demoralizingShoutTimer = urand(2000, 4000); + _cleaveTimer = urand(5000, 8000); + } + + void Reset() override + { + Initialize(); + } + + void JustDied(Unit* /*killer*/) override + { + _instance->SetBossState(DATA_MANDOKIR, SPECIAL); + } + + void UpdateAI(uint32 diff) override + { + // Return since we have no target + if (!UpdateVictim()) + return; + + if (_demoralizingShoutTimer <= diff) { - npc_vilebranch_speakerAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) - { - Initialize(); - } - - void Initialize() - { - _demoralizingShoutTimer = urand(2000, 4000); - _cleaveTimer = urand(5000, 8000); - } - - void Reset() override - { - Initialize(); - } - - void JustDied(Unit* /*killer*/) override - { - _instance->SetBossState(DATA_MANDOKIR, SPECIAL); - } - - void UpdateAI(uint32 diff) override - { - // Return since we have no target - if (!UpdateVictim()) - return; - - if (_demoralizingShoutTimer <= diff) - { - DoCast(me, SPELL_DEMORALIZING_SHOUT); - _demoralizingShoutTimer = urand(22000, 30000); - } - else - _demoralizingShoutTimer -= diff; - - if (_cleaveTimer <= diff) - { - DoCastVictim(SPELL_CLEAVE, true); - _cleaveTimer = urand(6000, 9000); - } - else - _cleaveTimer -= diff; - - DoMeleeAttackIfReady(); - } - - private: - uint32 _demoralizingShoutTimer; - uint32 _cleaveTimer; - InstanceScript* _instance; - }; + DoCast(me, SPELL_DEMORALIZING_SHOUT); + _demoralizingShoutTimer = urand(22000, 30000); + } + else + _demoralizingShoutTimer -= diff; - CreatureAI* GetAI(Creature* creature) const override + if (_cleaveTimer <= diff) { - return GetZulGurubAI<npc_vilebranch_speakerAI>(creature); + DoCastVictim(SPELL_CLEAVE, true); + _cleaveTimer = urand(6000, 9000); } + else + _cleaveTimer -= diff; + + DoMeleeAttackIfReady(); + } + +private: + uint32 _demoralizingShoutTimer; + uint32 _cleaveTimer; + InstanceScript* _instance; }; // 24314 - Threatening Gaze -class spell_threatening_gaze : public SpellScriptLoader +class spell_threatening_gaze : public AuraScript { - public: - spell_threatening_gaze() : SpellScriptLoader("spell_threatening_gaze") { } - - class spell_threatening_gaze_AuraScript : public AuraScript - { - PrepareAuraScript(spell_threatening_gaze_AuraScript); - - void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) - { - if (Unit* caster = GetCaster()) - if (Unit* target = GetTarget()) - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH) - caster->CastSpell(target, SPELL_WATCH_CHARGE); - } - - void Register() override - { - OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze_AuraScript::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_threatening_gaze_AuraScript(); - } + PrepareAuraScript(spell_threatening_gaze); + + void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + if (Unit* caster = GetCaster()) + if (Unit* target = GetTarget()) + if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE && GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_DEATH) + caster->CastSpell(target, SPELL_WATCH_CHARGE); + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_threatening_gaze::OnRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } }; void AddSC_boss_mandokir() { - new boss_mandokir(); - new npc_ohgan(); - new npc_vilebranch_speaker(); - new spell_threatening_gaze(); + RegisterZulGurubCreatureAI(boss_mandokir); + RegisterZulGurubCreatureAI(npc_ohgan); + RegisterZulGurubCreatureAI(npc_vilebranch_speaker); + RegisterSpellScript(spell_threatening_gaze); } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp index f319766306e..042e1419b46 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_marli.cpp @@ -78,231 +78,201 @@ enum Misc float const DamageIncrease = 35.0f; float const DamageDecrease = 100.f / (1.f + DamageIncrease / 100.f) - 100.f; -class boss_marli : public CreatureScript +struct boss_marli : public BossAI { - public: boss_marli() : CreatureScript("boss_marli") { } + boss_marli(Creature* creature) : BossAI(creature, DATA_MARLI) { } - struct boss_marliAI : public BossAI - { - boss_marliAI(Creature* creature) : BossAI(creature, DATA_MARLI) { } - - void Reset() override - { - if (events.IsInPhase(PHASE_THREE)) - me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack + void Reset() override + { + if (events.IsInPhase(PHASE_THREE)) + me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack - std::list<GameObject*> eggs; - me->GetGameObjectListWithEntryInGrid(eggs, GOB_SPIDER_EGG); - for (GameObject* egg : eggs) - { - egg->Respawn(); - egg->UpdateObjectVisibility(true); - } + std::list<GameObject*> eggs; + me->GetGameObjectListWithEntryInGrid(eggs, GOB_SPIDER_EGG); + for (GameObject* egg : eggs) + { + egg->Respawn(); + egg->UpdateObjectVisibility(true); + } - summons.DespawnAll(); - _Reset(); - } + summons.DespawnAll(); + _Reset(); + } - void JustDied(Unit* /*killer*/) override - { - _JustDied(); - Talk(SAY_DEATH); - } + void JustDied(Unit* /*killer*/) override + { + _JustDied(); + Talk(SAY_DEATH); + } - void JustEngagedWith(Unit* who) override - { - BossAI::JustEngagedWith(who); - events.ScheduleEvent(EVENT_SPAWN_START_SPIDERS, 1s, 0, PHASE_ONE); - Talk(SAY_AGGRO); - } + void JustEngagedWith(Unit* who) override + { + BossAI::JustEngagedWith(who); + events.ScheduleEvent(EVENT_SPAWN_START_SPIDERS, 1s, 0, PHASE_ONE); + Talk(SAY_AGGRO); + } - void JustSummoned(Creature* creature) override - { - creature->AI()->AttackStart(SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)); - summons.Summon(creature); - } + void JustSummoned(Creature* creature) override + { + creature->AI()->AttackStart(SelectTarget(SelectTargetMethod::Random, 0, 0.f, true)); + summons.Summon(creature); + } - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - events.Update(diff); + events.Update(diff); - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - while (uint32 eventId = events.ExecuteEvent()) + while (uint32 eventId = events.ExecuteEvent()) + { + switch (eventId) + { + case EVENT_SPAWN_START_SPIDERS: + Talk(SAY_SPIDER_SPAWN); + DoCastAOE(SPELL_HATCH_EGGS); + events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s); + events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 30s); + events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO); + events.SetPhase(PHASE_TWO); + break; + case EVENT_POISON_VOLLEY: + DoCastVictim(SPELL_POISON_VOLLEY, true); + events.ScheduleEvent(EVENT_POISON_VOLLEY, 10s, 20s); + break; + case EVENT_ASPECT_OF_MARLI: + DoCastVictim(SPELL_ASPECT_OF_MARLI, true); + events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 13s, 18s, 0, PHASE_TWO); + break; + case EVENT_HATCH_SPIDER_EGG: + me->CastSpell(me, SPELL_HATCH_SPIDER_EGG); + events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 12s, 17s); + break; + case EVENT_TRANSFORM: { - switch (eventId) + Talk(SAY_TRANSFORM); + DoCast(me, SPELL_SPIDER_FORM); // SPELL_AURA_TRANSFORM + /* + CreatureTemplate const* cinfo = me->GetCreatureTemplate(); + me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); + me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); + me->UpdateDamagePhysical(BASE_ATTACK); + */ + me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageIncrease); // hack + DoCastVictim(SPELL_ENVOLWINGWEB); + if (GetThreat(me->GetVictim())) + ModifyThreatByPercent(me->GetVictim(), -100); + events.ScheduleEvent(EVENT_CHARGE_PLAYER, 1500ms, 0, PHASE_THREE); + events.ScheduleEvent(EVENT_TRANSFORM_BACK, 25s, 0, PHASE_THREE); + events.CancelEvent(EVENT_HATCH_SPIDER_EGG); + events.SetPhase(PHASE_THREE); + break; + } + case EVENT_CHARGE_PLAYER: + { + Unit* target = nullptr; + int i = 0; + while (i++ < 3) // max 3 tries to get a random target with power_mana { - case EVENT_SPAWN_START_SPIDERS: - Talk(SAY_SPIDER_SPAWN); - DoCastAOE(SPELL_HATCH_EGGS); - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s); - events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 30s); - events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO); - events.SetPhase(PHASE_TWO); - break; - case EVENT_POISON_VOLLEY: - DoCastVictim(SPELL_POISON_VOLLEY, true); - events.ScheduleEvent(EVENT_POISON_VOLLEY, 10s, 20s); - break; - case EVENT_ASPECT_OF_MARLI: - DoCastVictim(SPELL_ASPECT_OF_MARLI, true); - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 13s, 18s, 0, PHASE_TWO); - break; - case EVENT_HATCH_SPIDER_EGG: - me->CastSpell(me, SPELL_HATCH_SPIDER_EGG); - events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 12s, 17s); - break; - case EVENT_TRANSFORM: - { - Talk(SAY_TRANSFORM); - DoCast(me, SPELL_SPIDER_FORM); // SPELL_AURA_TRANSFORM - /* - CreatureTemplate const* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 35))); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 35))); - me->UpdateDamagePhysical(BASE_ATTACK); - */ - me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageIncrease); // hack - DoCastVictim(SPELL_ENVOLWINGWEB); - if (GetThreat(me->GetVictim())) - ModifyThreatByPercent(me->GetVictim(), -100); - events.ScheduleEvent(EVENT_CHARGE_PLAYER, 1500ms, 0, PHASE_THREE); - events.ScheduleEvent(EVENT_TRANSFORM_BACK, 25s, 0, PHASE_THREE); - events.CancelEvent(EVENT_HATCH_SPIDER_EGG); - events.SetPhase(PHASE_THREE); - break; - } - case EVENT_CHARGE_PLAYER: - { - Unit* target = nullptr; - int i = 0; - while (i++ < 3) // max 3 tries to get a random target with power_mana - { - target = SelectTarget(SelectTargetMethod::Random, 1, 100, true); // not aggro leader - if (target && target->GetPowerType() == POWER_MANA) - break; - } - if (target) - { - DoCast(target, SPELL_CHARGE); - AttackStart(target); - } - events.ScheduleEvent(EVENT_CHARGE_PLAYER, 8s, 0, PHASE_THREE); - break; - } - case EVENT_TRANSFORM_BACK: - { - me->RemoveAura(SPELL_SPIDER_FORM); - /* - CreatureTemplate const* cinfo = me->GetCreatureTemplate(); - me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1))); - me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1))); - me->UpdateDamagePhysical(BASE_ATTACK); - */ - me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack - events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO); - events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s); - events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 12s, 17s); - events.ScheduleEvent(EVENT_TRANSFORM, 35s, 60s, 0, PHASE_TWO); - events.SetPhase(PHASE_TWO); - break; - } - default: + target = SelectTarget(SelectTargetMethod::Random, 1, 100, true); // not aggro leader + if (target && target->GetPowerType() == POWER_MANA) break; } - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; + if (target) + { + DoCast(target, SPELL_CHARGE); + AttackStart(target); + } + events.ScheduleEvent(EVENT_CHARGE_PLAYER, 8s, 0, PHASE_THREE); + break; } - - DoMeleeAttackIfReady(); + case EVENT_TRANSFORM_BACK: + { + me->RemoveAura(SPELL_SPIDER_FORM); + /* + CreatureTemplate const* cinfo = me->GetCreatureTemplate(); + me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg/100) * 1))); + me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg/100) * 1))); + me->UpdateDamagePhysical(BASE_ATTACK); + */ + me->ApplyStatPctModifier(UNIT_MOD_DAMAGE_MAINHAND, TOTAL_PCT, DamageDecrease); // hack + events.ScheduleEvent(EVENT_ASPECT_OF_MARLI, 12s, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_TRANSFORM, 45s, 0, PHASE_TWO); + events.ScheduleEvent(EVENT_POISON_VOLLEY, 15s); + events.ScheduleEvent(EVENT_HATCH_SPIDER_EGG, 12s, 17s); + events.ScheduleEvent(EVENT_TRANSFORM, 35s, 60s, 0, PHASE_TWO); + events.SetPhase(PHASE_TWO); + break; + } + default: + break; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<boss_marliAI>(creature); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; } + + DoMeleeAttackIfReady(); + } }; -class gob_spider_egg : public GameObjectScript +struct gob_spider_egg : public GameObjectAI { - public: gob_spider_egg() : GameObjectScript("gob_spider_egg") { } - - struct gob_spider_eggAI : public GameObjectAI - { - gob_spider_eggAI(GameObject* gob) : GameObjectAI(gob), _instance(gob->GetInstanceScript()) { } - - void JustSummoned(Creature* creature) override - { - if (Creature * marli = _instance->GetCreature(DATA_MARLI)) - marli->AI()->JustSummoned(creature); + gob_spider_egg(GameObject* gob) : GameObjectAI(gob), _instance(gob->GetInstanceScript()) { } - me->SetRespawnCompatibilityMode(true); - } - private: - InstanceScript* const _instance; - }; + void JustSummoned(Creature* creature) override + { + if (Creature * marli = _instance->GetCreature(DATA_MARLI)) + marli->AI()->JustSummoned(creature); - GameObjectAI* GetAI(GameObject* gob) const override - { - return GetZulGurubAI<gob_spider_eggAI>(gob); - } + me->SetRespawnCompatibilityMode(true); + } +private: + InstanceScript* const _instance; }; // Spawn of Marli -class npc_spawn_of_marli : public CreatureScript +struct npc_spawn_of_marli : public ScriptedAI { - public: npc_spawn_of_marli() : CreatureScript("npc_spawn_of_marli") { } - - struct npc_spawn_of_marliAI : public ScriptedAI - { - npc_spawn_of_marliAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } - - void Initialize() - { - _levelUpTimer = 3000; - } - - void Reset() override - { - Initialize(); - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; + npc_spawn_of_marli(Creature* creature) : ScriptedAI(creature) + { + Initialize(); + } - if (_levelUpTimer <= diff) - { - DoCast(me, SPELL_LEVELUP); - _levelUpTimer = 3000; - } - else - _levelUpTimer -= diff; + void Initialize() + { + _levelUpTimer = 3000; + } - DoMeleeAttackIfReady(); - } + void Reset() override + { + Initialize(); + } - private: - uint32 _levelUpTimer; - }; + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - CreatureAI* GetAI(Creature* creature) const override + if (_levelUpTimer <= diff) { - return GetZulGurubAI<npc_spawn_of_marliAI>(creature); + DoCast(me, SPELL_LEVELUP); + _levelUpTimer = 3000; } + else + _levelUpTimer -= diff; + + DoMeleeAttackIfReady(); + } + +private: + uint32 _levelUpTimer; }; // 24083 - Hatch Eggs @@ -324,8 +294,8 @@ class spell_hatch_spiders : public SpellScript void AddSC_boss_marli() { - new boss_marli(); - new npc_spawn_of_marli(); - new gob_spider_egg(); + RegisterZulGurubCreatureAI(boss_marli); + RegisterZulGurubCreatureAI(npc_spawn_of_marli); + RegisterZulGurubGameObjectAI(gob_spider_egg); RegisterSpellScript(spell_hatch_spiders); } diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp index e6d3e8c0b0b..f2288fc45de 100644 --- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp +++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_renataki.cpp @@ -30,130 +30,119 @@ enum Misc EQUIP_ID_MAIN_HAND = 0 // was item display id 31818, but this id does not exist }; -class boss_renataki : public CreatureScript +struct boss_renataki : public BossAI { - public: - boss_renataki() : CreatureScript("boss_renataki") { } + boss_renataki(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) + { + Initialize(); + } + + void Initialize() + { + _invisibleTimer = urand(8000, 18000); + _ambushTimer = 3000; + _visibleTimer = 4000; + _aggroTimer = urand(15000, 25000); + _thousandBladesTimer = urand(4000, 8000); + _invisible = false; + _ambushed = false; + } + + void Reset() override + { + _Reset(); + Initialize(); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (_invisibleTimer <= diff) + { + me->InterruptSpell(CURRENT_GENERIC_SPELL); + SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + me->SetDisplayId(11686); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + _invisible = true; + _invisibleTimer = urand(15000, 30000); + } + else + _invisibleTimer -= diff; - struct boss_renatakiAI : public BossAI + if (_invisible) { - boss_renatakiAI(Creature* creature) : BossAI(creature, DATA_EDGE_OF_MADNESS) + if (_ambushTimer <= diff) { - Initialize(); - } + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) + { + DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); + DoCast(target, SPELL_AMBUSH); + } - void Initialize() - { - _invisibleTimer = urand(8000, 18000); + _ambushed = true; _ambushTimer = 3000; - _visibleTimer = 4000; - _aggroTimer = urand(15000, 25000); - _thousandBladesTimer = urand(4000, 8000); - _invisible = false; - _ambushed = false; } + else + _ambushTimer -= diff; + } - void Reset() override + if (_ambushed) + { + if (_visibleTimer <= diff) { - _Reset(); - Initialize(); + me->InterruptSpell(CURRENT_GENERIC_SPELL); + me->SetDisplayId(15268); + SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + _invisible = false; + _visibleTimer = 4000; } + else + _visibleTimer -= diff; + } - void UpdateAI(uint32 diff) override + // Resetting some aggro so he attacks other gamers + if (!_invisible) + { + if (_aggroTimer <= diff) { - if (!UpdateVictim()) - return; - - if (_invisibleTimer <= diff) - { - me->InterruptSpell(CURRENT_GENERIC_SPELL); - SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - me->SetDisplayId(11686); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - _invisible = true; - _invisibleTimer = urand(15000, 30000); - } - else - _invisibleTimer -= diff; - - if (_invisible) - { - if (_ambushTimer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - { - DoTeleportTo(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ()); - DoCast(target, SPELL_AMBUSH); - } - - _ambushed = true; - _ambushTimer = 3000; - } - else - _ambushTimer -= diff; - } - - if (_ambushed) + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) { - if (_visibleTimer <= diff) - { - me->InterruptSpell(CURRENT_GENERIC_SPELL); - me->SetDisplayId(15268); - SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - _invisible = false; - _visibleTimer = 4000; - } - else - _visibleTimer -= diff; + if (GetThreat(me->GetVictim())) + ModifyThreatByPercent(me->GetVictim(), -50); + AttackStart(target); } - // Resetting some aggro so he attacks other gamers - if (!_invisible) - { - if (_aggroTimer <= diff) - { - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 0, 100.0f, true)) - { - if (GetThreat(me->GetVictim())) - ModifyThreatByPercent(me->GetVictim(), -50); - AttackStart(target); - } - - _aggroTimer = urand(7000, 20000); - } - else - _aggroTimer -= diff; - - if (_thousandBladesTimer <= diff) - { - DoCastVictim(SPELL_THOUSANDBLADES); - _thousandBladesTimer = urand(7000, 12000); - } - else - _thousandBladesTimer -= diff; - } - - DoMeleeAttackIfReady(); + _aggroTimer = urand(7000, 20000); } + else + _aggroTimer -= diff; - private: - uint32 _invisibleTimer; - uint32 _ambushTimer; - uint32 _visibleTimer; - uint32 _aggroTimer; - uint32 _thousandBladesTimer; - bool _invisible; - bool _ambushed; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetZulGurubAI<boss_renatakiAI>(creature); + if (_thousandBladesTimer <= diff) + { + DoCastVictim(SPELL_THOUSANDBLADES); + _thousandBladesTimer = urand(7000, 12000); + } + else + _thousandBladesTimer -= diff; } + + DoMeleeAttackIfReady(); + } + +private: + uint32 _invisibleTimer; + uint32 _ambushTimer; + uint32 _visibleTimer; + uint32 _aggroTimer; + uint32 _thousandBladesTimer; + bool _invisible; + bool _ambushed; }; void AddSC_boss_renataki() { - new boss_renataki(); + RegisterZulGurubCreatureAI(boss_renataki); } |