diff options
-rw-r--r-- | src/server/scripts/Northrend/IsleOfConquest/boss_ioc_horde_alliance.cpp | 145 | ||||
-rw-r--r-- | src/server/scripts/Northrend/IsleOfConquest/isle_of_conquest.cpp | 352 |
2 files changed, 210 insertions, 287 deletions
diff --git a/src/server/scripts/Northrend/IsleOfConquest/boss_ioc_horde_alliance.cpp b/src/server/scripts/Northrend/IsleOfConquest/boss_ioc_horde_alliance.cpp index cc4d51a482f..e3d89c1fc22 100644 --- a/src/server/scripts/Northrend/IsleOfConquest/boss_ioc_horde_alliance.cpp +++ b/src/server/scripts/Northrend/IsleOfConquest/boss_ioc_horde_alliance.cpp @@ -35,102 +35,91 @@ enum BossEvents EVENT_CHECK_RANGE = 4 }; -class boss_ioc_horde_alliance : public CreatureScript +struct boss_ioc_horde_alliance : public ScriptedAI { -public: - boss_ioc_horde_alliance() : CreatureScript("boss_ioc_horde_alliance") { } + boss_ioc_horde_alliance(Creature* creature) : ScriptedAI(creature) { } - struct boss_ioc_horde_allianceAI : public ScriptedAI + void Reset() override { - boss_ioc_horde_allianceAI(Creature* creature) : ScriptedAI(creature) { } + _events.Reset(); + + uint32 _npcGuard; + if (me->GetEntry() == NPC_HIGH_COMMANDER_HALFORD_WYRMBANE) + _npcGuard = NPC_SEVEN_TH_LEGION_INFANTRY; + else + _npcGuard = NPC_KOR_KRON_GUARD; + + std::list<Creature*> guardsList; + me->GetCreatureListWithEntryInGrid(guardsList, _npcGuard, 100.0f); + for (std::list<Creature*>::const_iterator itr = guardsList.begin(); itr != guardsList.end(); ++itr) + (*itr)->Respawn(); + }; - void Reset() override - { - _events.Reset(); + void JustEngagedWith(Unit* /*who*/) override + { + _events.ScheduleEvent(EVENT_BRUTAL_STRIKE, 5s); + _events.ScheduleEvent(EVENT_DAGGER_THROW, 7s); + _events.ScheduleEvent(EVENT_CHECK_RANGE, 1s); + _events.ScheduleEvent(EVENT_CRUSHING_LEAP, 15s); + } - uint32 _npcGuard; - if (me->GetEntry() == NPC_HIGH_COMMANDER_HALFORD_WYRMBANE) - _npcGuard = NPC_SEVEN_TH_LEGION_INFANTRY; - else - _npcGuard = NPC_KOR_KRON_GUARD; + void SpellHit(WorldObject* caster, SpellInfo const* /*spellInfo*/) override + { + Unit* unitCaster = caster->ToUnit(); + if (!unitCaster) + return; - std::list<Creature*> guardsList; - me->GetCreatureListWithEntryInGrid(guardsList, _npcGuard, 100.0f); - for (std::list<Creature*>::const_iterator itr = guardsList.begin(); itr != guardsList.end(); ++itr) - (*itr)->Respawn(); - }; + if (unitCaster->IsVehicle()) + Unit::Kill(me, unitCaster); + } - void JustEngagedWith(Unit* /*who*/) override - { - _events.ScheduleEvent(EVENT_BRUTAL_STRIKE, 5s); - _events.ScheduleEvent(EVENT_DAGGER_THROW, 7s); - _events.ScheduleEvent(EVENT_CHECK_RANGE, 1s); - _events.ScheduleEvent(EVENT_CRUSHING_LEAP, 15s); - } + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; - void SpellHit(WorldObject* caster, SpellInfo const* /*spellInfo*/) override - { - Unit* unitCaster = caster->ToUnit(); - if (!unitCaster) - return; + _events.Update(diff); - if (unitCaster->IsVehicle()) - Unit::Kill(me, unitCaster); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - void UpdateAI(uint32 diff) override + while (uint32 eventId = _events.ExecuteEvent()) { - if (!UpdateVictim()) - return; - - _events.Update(diff); - - if (me->HasUnitState(UNIT_STATE_CASTING)) - return; - - while (uint32 eventId = _events.ExecuteEvent()) + switch (eventId) { - switch (eventId) - { - case EVENT_BRUTAL_STRIKE: - DoCastVictim(SPELL_BRUTAL_STRIKE); - _events.ScheduleEvent(EVENT_BRUTAL_STRIKE, 5s); - break; - case EVENT_DAGGER_THROW: - if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) - DoCast(target, SPELL_DAGGER_THROW); - _events.ScheduleEvent(EVENT_DAGGER_THROW, 7s); - break; - case EVENT_CRUSHING_LEAP: - DoCastVictim(SPELL_CRUSHING_LEAP); - _events.ScheduleEvent(EVENT_CRUSHING_LEAP, 25s); - break; - case EVENT_CHECK_RANGE: - if (me->GetDistance(me->GetHomePosition()) > 25.0f) - DoCast(me, SPELL_RAGE); - else - me->RemoveAurasDueToSpell(SPELL_RAGE); - _events.ScheduleEvent(EVENT_CHECK_RANGE, 1s); - break; - default: - break; - } + case EVENT_BRUTAL_STRIKE: + DoCastVictim(SPELL_BRUTAL_STRIKE); + _events.ScheduleEvent(EVENT_BRUTAL_STRIKE, 5s); + break; + case EVENT_DAGGER_THROW: + if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1)) + DoCast(target, SPELL_DAGGER_THROW); + _events.ScheduleEvent(EVENT_DAGGER_THROW, 7s); + break; + case EVENT_CRUSHING_LEAP: + DoCastVictim(SPELL_CRUSHING_LEAP); + _events.ScheduleEvent(EVENT_CRUSHING_LEAP, 25s); + break; + case EVENT_CHECK_RANGE: + if (me->GetDistance(me->GetHomePosition()) > 25.0f) + DoCast(me, SPELL_RAGE); + else + me->RemoveAurasDueToSpell(SPELL_RAGE); + _events.ScheduleEvent(EVENT_CHECK_RANGE, 1s); + break; + default: + break; } - - DoMeleeAttackIfReady(); } - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const - { - return new boss_ioc_horde_allianceAI(creature); + DoMeleeAttackIfReady(); } + +private: + EventMap _events; }; void AddSC_boss_ioc_horde_alliance() { - new boss_ioc_horde_alliance(); + RegisterCreatureAI(boss_ioc_horde_alliance); } diff --git a/src/server/scripts/Northrend/IsleOfConquest/isle_of_conquest.cpp b/src/server/scripts/Northrend/IsleOfConquest/isle_of_conquest.cpp index 0f54e0dbc56..7a9a7ce3594 100644 --- a/src/server/scripts/Northrend/IsleOfConquest/isle_of_conquest.cpp +++ b/src/server/scripts/Northrend/IsleOfConquest/isle_of_conquest.cpp @@ -31,50 +31,39 @@ // TO-DO: This should be done with SmartAI, but yet it does not correctly support vehicles's AIs. // Even adding ReactState Passive we still have issues using SmartAI. -class npc_four_car_garage : public CreatureScript +struct npc_four_car_garage : public NullCreatureAI { - public: - npc_four_car_garage() : CreatureScript("npc_four_car_garage") { } + npc_four_car_garage(Creature* creature) : NullCreatureAI(creature) { } - struct npc_four_car_garageAI : public NullCreatureAI + void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override + { + if (apply) { - npc_four_car_garageAI(Creature* creature) : NullCreatureAI(creature) { } + uint32 spellId = 0; - void PassengerBoarded(Unit* who, int8 /*seatId*/, bool apply) override + switch (me->GetEntry()) { - if (apply) - { - uint32 spellId = 0; - - switch (me->GetEntry()) - { - case NPC_DEMOLISHER: - spellId = SPELL_DRIVING_CREDIT_DEMOLISHER; - break; - case NPC_GLAIVE_THROWER_A: - case NPC_GLAIVE_THROWER_H: - spellId = SPELL_DRIVING_CREDIT_GLAIVE; - break; - case NPC_SIEGE_ENGINE_H: - case NPC_SIEGE_ENGINE_A: - spellId = SPELL_DRIVING_CREDIT_SIEGE; - break; - case NPC_CATAPULT: - spellId = SPELL_DRIVING_CREDIT_CATAPULT; - break; - default: - return; - } - - me->CastSpell(who, spellId, true); - } + case NPC_DEMOLISHER: + spellId = SPELL_DRIVING_CREDIT_DEMOLISHER; + break; + case NPC_GLAIVE_THROWER_A: + case NPC_GLAIVE_THROWER_H: + spellId = SPELL_DRIVING_CREDIT_GLAIVE; + break; + case NPC_SIEGE_ENGINE_H: + case NPC_SIEGE_ENGINE_A: + spellId = SPELL_DRIVING_CREDIT_SIEGE; + break; + case NPC_CATAPULT: + spellId = SPELL_DRIVING_CREDIT_CATAPULT; + break; + default: + return; } - }; - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_four_car_garageAI(creature); + me->CastSpell(who, spellId, true); } + } }; enum Events @@ -88,127 +77,94 @@ enum Texts SAY_ONBOARD = 0 }; -class npc_ioc_gunship_captain : public CreatureScript +struct npc_ioc_gunship_captain : public ScriptedAI { - public: - npc_ioc_gunship_captain() : CreatureScript("npc_ioc_gunship_captain") { } + npc_ioc_gunship_captain(Creature* creature) : ScriptedAI(creature) { } - struct npc_ioc_gunship_captainAI : public ScriptedAI + void DoAction(int32 action) override + { + if (action == ACTION_GUNSHIP_READY) { - npc_ioc_gunship_captainAI(Creature* creature) : ScriptedAI(creature) { } - - void DoAction(int32 action) override - { - if (action == ACTION_GUNSHIP_READY) - { - DoCast(me, SPELL_SIMPLE_TELEPORT); - _events.ScheduleEvent(EVENT_TALK, 3s); - } - } + DoCast(me, SPELL_SIMPLE_TELEPORT); + _events.ScheduleEvent(EVENT_TALK, 3s); + } + } - void UpdateAI(uint32 diff) override + void UpdateAI(uint32 diff) override + { + _events.Update(diff); + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - _events.Update(diff); - while (uint32 eventId = _events.ExecuteEvent()) - { - switch (eventId) - { - case EVENT_TALK: - _events.ScheduleEvent(EVENT_DESPAWN, 1s); - Talk(SAY_ONBOARD); - DoCast(me, SPELL_TELEPORT_VISUAL_ONLY); - break; - case EVENT_DESPAWN: - if (BattlegroundMap* iocMap = me->GetMap()->ToBattlegroundMap()) - if (Battleground* bgIoC = iocMap->GetBG()) - bgIoC->DelCreature(BG_IC_NPC_GUNSHIP_CAPTAIN_1); - break; - default: - break; - } - } + case EVENT_TALK: + _events.ScheduleEvent(EVENT_DESPAWN, 1s); + Talk(SAY_ONBOARD); + DoCast(me, SPELL_TELEPORT_VISUAL_ONLY); + break; + case EVENT_DESPAWN: + if (BattlegroundMap* iocMap = me->GetMap()->ToBattlegroundMap()) + if (Battleground* bgIoC = iocMap->GetBG()) + bgIoC->DelCreature(BG_IC_NPC_GUNSHIP_CAPTAIN_1); + break; + default: + break; } - - private: - EventMap _events; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_ioc_gunship_captainAI(creature); } + } + +private: + EventMap _events; }; // 66630 - Alliance Gunship Portal // 66637 - Horde Gunship Portal -class spell_ioc_gunship_portal : public SpellScriptLoader +class spell_ioc_gunship_portal : public SpellScript { - public: - spell_ioc_gunship_portal() : SpellScriptLoader("spell_ioc_gunship_portal") { } - - class spell_ioc_gunship_portal_SpellScript : public SpellScript - { - PrepareSpellScript(spell_ioc_gunship_portal_SpellScript); - - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void HandleScript(SpellEffIndex /*effIndex*/) - { - Player* caster = GetCaster()->ToPlayer(); - /* - * HACK: GetWorldLocation() returns real position and not transportposition. - * ServertoClient: SMSG_MOVE_TELEPORT (0x0B39) - * counter: 45 - * Tranpsort Guid: Full: xxxx Type: MOTransport Low: xxx - * Transport Position X: 0 Y: 0 Z: 0 O: 0 - * Position: X: 7.305609 Y: -0.095246 Z: 34.51022 O: 0 - */ - caster->TeleportTo(GetHitCreature()->GetWorldLocation(), TELE_TO_NOT_LEAVE_TRANSPORT); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_ioc_gunship_portal_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_ioc_gunship_portal_SpellScript(); - } + PrepareSpellScript(spell_ioc_gunship_portal); + + bool Load() override + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Player* caster = GetCaster()->ToPlayer(); + /* + * HACK: GetWorldLocation() returns real position and not transportposition. + * ServertoClient: SMSG_MOVE_TELEPORT (0x0B39) + * counter: 45 + * Tranpsort Guid: Full: xxxx Type: MOTransport Low: xxx + * Transport Position X: 0 Y: 0 Z: 0 O: 0 + * Position: X: 7.305609 Y: -0.095246 Z: 34.51022 O: 0 + */ + caster->TeleportTo(GetHitCreature()->GetWorldLocation(), TELE_TO_NOT_LEAVE_TRANSPORT); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_ioc_gunship_portal::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } }; // 66656 - Parachute -class spell_ioc_parachute_ic : public SpellScriptLoader +class spell_ioc_parachute_ic : public AuraScript { - public: - spell_ioc_parachute_ic() : SpellScriptLoader("spell_ioc_parachute_ic") { } - - class spell_ioc_parachute_ic_AuraScript : public AuraScript - { - PrepareAuraScript(spell_ioc_parachute_ic_AuraScript); - - void HandleTriggerSpell(AuraEffect const* /*aurEff*/) - { - PreventDefaultAction(); - if (Player* target = GetTarget()->ToPlayer()) - if (target->m_movementInfo.GetFallTime() > 2000 && !target->GetTransport()) - target->CastSpell(target, SPELL_PARACHUTE_IC, true); - } - - void Register() override - { - OnEffectPeriodic += AuraEffectPeriodicFn(spell_ioc_parachute_ic_AuraScript::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_ioc_parachute_ic_AuraScript(); - } + PrepareAuraScript(spell_ioc_parachute_ic); + + void HandleTriggerSpell(AuraEffect const* /*aurEff*/) + { + PreventDefaultAction(); + if (Player* target = GetTarget()->ToPlayer()) + if (target->m_movementInfo.GetFallTime() > 2000 && !target->GetTransport()) + target->CastSpell(target, SPELL_PARACHUTE_IC, true); + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_ioc_parachute_ic::HandleTriggerSpell, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } }; class StartLaunchEvent : public BasicEvent @@ -239,33 +195,22 @@ class StartLaunchEvent : public BasicEvent }; // 66218 - Launch -class spell_ioc_launch : public SpellScriptLoader +class spell_ioc_launch : public SpellScript { - public: - spell_ioc_launch() : SpellScriptLoader("spell_ioc_launch") { } + PrepareSpellScript(spell_ioc_launch); - class spell_ioc_launch_SpellScript : public SpellScript - { - PrepareSpellScript(spell_ioc_launch_SpellScript); + void Launch() + { + if (!GetCaster()->ToCreature() || !GetExplTargetDest()) + return; - void Launch() - { - if (!GetCaster()->ToCreature() || !GetExplTargetDest()) - return; + GetCaster()->ToCreature()->m_Events.AddEvent(new StartLaunchEvent(*GetExplTargetDest(), GetHitPlayer()->GetGUID()), GetCaster()->ToCreature()->m_Events.CalculateTime(2500ms)); + } - GetCaster()->ToCreature()->m_Events.AddEvent(new StartLaunchEvent(*GetExplTargetDest(), GetHitPlayer()->GetGUID()), GetCaster()->ToCreature()->m_Events.CalculateTime(2500ms)); - } - - void Register() override - { - AfterHit += SpellHitFn(spell_ioc_launch_SpellScript::Launch); - } - }; - - SpellScript* GetSpellScript() const override - { - return new spell_ioc_launch_SpellScript(); - } + void Register() override + { + AfterHit += SpellHitFn(spell_ioc_launch::Launch); + } }; enum SeaforiumBombSpells @@ -278,54 +223,43 @@ enum SeaforiumBombSpells // 66672 - Huge Seaforium Blast // 66676 - Seaforium Blast -class spell_ioc_seaforium_blast_credit : public SpellScriptLoader +class spell_ioc_seaforium_blast_credit : public SpellScript { - public: - spell_ioc_seaforium_blast_credit() : SpellScriptLoader("spell_ioc_seaforium_blast_credit") { } - - class spell_ioc_seaforium_blast_credit_SpellScript : public SpellScript - { - PrepareSpellScript(spell_ioc_seaforium_blast_credit_SpellScript); - - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_A_BOMB_INABLE_CREDIT, SPELL_A_BOMB_INATION_CREDIT }); - } - - void HandleAchievementCredit(SpellEffIndex /*effIndex*/) - { - uint32 _creditSpell = 0; - Unit* caster = GetOriginalCaster(); - if (!caster) - return; - - if (GetSpellInfo()->Id == SPELL_SEAFORIUM_BLAST) - _creditSpell = SPELL_A_BOMB_INABLE_CREDIT; - else if (GetSpellInfo()->Id == SPELL_HUGE_SEAFORIUM_BLAST) - _creditSpell = SPELL_A_BOMB_INATION_CREDIT; - - if (GetHitGObj() && GetHitGObj()->IsDestructibleBuilding()) - caster->CastSpell(caster, _creditSpell, true); - } - - void Register() override - { - OnEffectHitTarget += SpellEffectFn(spell_ioc_seaforium_blast_credit_SpellScript::HandleAchievementCredit, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE); - } - }; - - SpellScript* GetSpellScript() const - { - return new spell_ioc_seaforium_blast_credit_SpellScript(); - } + PrepareSpellScript(spell_ioc_seaforium_blast_credit); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_A_BOMB_INABLE_CREDIT, SPELL_A_BOMB_INATION_CREDIT }); + } + + void HandleAchievementCredit(SpellEffIndex /*effIndex*/) + { + uint32 _creditSpell = 0; + Unit* caster = GetOriginalCaster(); + if (!caster) + return; + + if (GetSpellInfo()->Id == SPELL_SEAFORIUM_BLAST) + _creditSpell = SPELL_A_BOMB_INABLE_CREDIT; + else if (GetSpellInfo()->Id == SPELL_HUGE_SEAFORIUM_BLAST) + _creditSpell = SPELL_A_BOMB_INATION_CREDIT; + + if (GetHitGObj() && GetHitGObj()->IsDestructibleBuilding()) + caster->CastSpell(caster, _creditSpell, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_ioc_seaforium_blast_credit::HandleAchievementCredit, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE); + } }; void AddSC_isle_of_conquest() { - new npc_four_car_garage(); - new npc_ioc_gunship_captain(); - new spell_ioc_gunship_portal(); - new spell_ioc_parachute_ic(); - new spell_ioc_launch(); - new spell_ioc_seaforium_blast_credit(); + RegisterCreatureAI(npc_four_car_garage); + RegisterCreatureAI(npc_ioc_gunship_captain); + RegisterSpellScript(spell_ioc_gunship_portal); + RegisterSpellScript(spell_ioc_parachute_ic); + RegisterSpellScript(spell_ioc_launch); + RegisterSpellScript(spell_ioc_seaforium_blast_credit); } |