diff options
| author | Jeremy <Golrag@users.noreply.github.com> | 2024-02-26 22:33:07 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-26 22:33:07 +0100 |
| commit | 409adfa7a5372dedd40d6f40650c901f6fd646a6 (patch) | |
| tree | 01757abae94b4662985ae78d1bcb610516ba79bf /src/server/scripts/Northrend | |
| parent | 5f69c1fe0d3dd5db644102070bb25dd8de2c7934 (diff) | |
Core/Battlegrounds: Isle of Conquest Rework (#29687)
Diffstat (limited to 'src/server/scripts/Northrend')
| -rw-r--r-- | src/server/scripts/Northrend/IsleOfConquest/isle_of_conquest.cpp | 153 |
1 files changed, 144 insertions, 9 deletions
diff --git a/src/server/scripts/Northrend/IsleOfConquest/isle_of_conquest.cpp b/src/server/scripts/Northrend/IsleOfConquest/isle_of_conquest.cpp index 86942296681..1492335ce15 100644 --- a/src/server/scripts/Northrend/IsleOfConquest/isle_of_conquest.cpp +++ b/src/server/scripts/Northrend/IsleOfConquest/isle_of_conquest.cpp @@ -18,6 +18,7 @@ #include "ScriptMgr.h" #include "BattlegroundIC.h" #include "GameObject.h" +#include "GameObjectAI.h" #include "Map.h" #include "MotionMaster.h" #include "ObjectAccessor.h" @@ -27,6 +28,7 @@ #include "SpellInfo.h" #include "SpellScript.h" #include "Vehicle.h" +#include "WorldStateMgr.h" // 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. @@ -81,13 +83,10 @@ struct npc_ioc_gunship_captain : public ScriptedAI { npc_ioc_gunship_captain(Creature* creature) : ScriptedAI(creature) { } - void DoAction(int32 action) override + void JustAppeared() 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 @@ -103,9 +102,7 @@ struct npc_ioc_gunship_captain : public ScriptedAI 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); + me->DespawnOrUnsummon(); break; default: break; @@ -117,6 +114,89 @@ private: EventMap _events; }; +struct npc_ioc_siege_engine : public ScriptedAI +{ + npc_ioc_siege_engine(Creature* creature) : ScriptedAI(creature) { } + + static constexpr uint32 SPELL_DAMAGED = 67323; + static constexpr uint32 VEHICLE_REC_ID = 514; + static constexpr int32 ACTION_REPAIRED = 1; + + void JustAppeared() override + { + me->RemoveVehicleKit(false); + DoCastSelf(SPELL_DAMAGED); + } + + void DoAction(int32 actionId) override + { + // there should be some moving involved first + if (actionId == ACTION_REPAIRED) + { + me->CreateVehicleKit(VEHICLE_REC_ID, me->GetEntry(), false); + me->GetVehicleKit()->InstallAllAccessories(false); + } + } +}; + +struct go_ioc_capturable_object : public GameObjectAI +{ + go_ioc_capturable_object(GameObject* go) : GameObjectAI(go) { } + + bool OnGossipHello(Player* player) override + { + if (me->GetGoState() != GO_STATE_READY || me->HasFlag(GO_FLAG_NOT_SELECTABLE)) + return true; + + if (ZoneScript* zonescript = me->GetZoneScript()) + { + zonescript->DoAction(ACTION_IOC_INTERACT_CAPTURABLE_OBJECT, player, me); + return false; + } + + return true; + } +}; + +struct go_ioc_contested_object : public go_ioc_capturable_object +{ + go_ioc_contested_object(GameObject* go) : go_ioc_capturable_object(go) { } + + void Reset() override + { + go_ioc_capturable_object::Reset(); + _scheduler.Schedule(1min, [&](TaskContext) + { + if (ZoneScript* zonescript = me->GetZoneScript()) + zonescript->DoAction(ACTION_IOC_CAPTURE_CAPTURABLE_OBJECT, me, me); + }); + } + + void UpdateAI(uint32 diff) override + { + _scheduler.Update(diff); + } + +private: + TaskScheduler _scheduler; +}; + +// 67323 - Damaged +class spell_ioc_damaged : public AuraScript +{ + void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const + { + if (Creature const* creatureTarget = GetTarget()->ToCreature()) + if (UnitAI* ai = creatureTarget->GetAI()) + ai->DoAction(npc_ioc_siege_engine::ACTION_REPAIRED); + } + + void Register() override + { + OnEffectRemove += AuraEffectRemoveFn(spell_ioc_damaged::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); + } +}; + // 66630 - Alliance Gunship Portal // 66637 - Horde Gunship Portal class spell_ioc_gunship_portal : public SpellScript @@ -246,12 +326,67 @@ class spell_ioc_seaforium_blast_credit : public SpellScript } }; +class at_ioc_exploit : public AreaTriggerScript +{ +public: + at_ioc_exploit() : AreaTriggerScript("at_ioc_exploit") { } + + bool OnExit(Player* player, AreaTriggerEntry const* /*trigger*/) override + { + if (Battleground* battleground = player->GetBattleground()) + if (battleground->GetStatus() == STATUS_WAIT_JOIN) + battleground->TeleportPlayerToExploitLocation(player); + + return true; + } +}; + +class at_ioc_backdoor_job : public AreaTriggerScript +{ +public: + static constexpr uint32 AT_HORDE_KEEP = 5535; + static constexpr uint32 AT_ALLIANCE_KEEP = 5536; + + at_ioc_backdoor_job() : AreaTriggerScript("at_ioc_backdoor_job") { } + + bool OnTrigger(Player* player, AreaTriggerEntry const* trigger) override + { + /// @hack: this spell should be cast by npc 22515 (World Trigger) and not by the player + if (player->GetBGTeam() == HORDE && trigger->ID == AT_ALLIANCE_KEEP) + { + bool keepClosed = sWorldStateMgr->GetValue(BG_IC_GATE_EAST_A_WS_CLOSED, player->GetMap()) == 1 + && sWorldStateMgr->GetValue(BG_IC_GATE_WEST_A_WS_CLOSED, player->GetMap()) == 1 + && sWorldStateMgr->GetValue(BG_IC_GATE_FRONT_A_WS_CLOSED, player->GetMap()) == 1; + + if (keepClosed) + player->CastSpell(player, SPELL_BACK_DOOR_JOB_ACHIEVEMENT, true); + } + else if (player->GetBGTeam() == ALLIANCE && trigger->ID == AT_HORDE_KEEP) + { + bool keepClosed = sWorldStateMgr->GetValue(BG_IC_GATE_EAST_H_WS_CLOSED, player->GetMap()) == 1 + && sWorldStateMgr->GetValue(BG_IC_GATE_WEST_H_WS_CLOSED, player->GetMap()) == 1 + && sWorldStateMgr->GetValue(BG_IC_GATE_FRONT_H_WS_CLOSED, player->GetMap()) == 1; + + if (keepClosed) + player->CastSpell(player, SPELL_BACK_DOOR_JOB_ACHIEVEMENT, true); + } + + return true; + } +}; + void AddSC_isle_of_conquest() { RegisterCreatureAI(npc_four_car_garage); RegisterCreatureAI(npc_ioc_gunship_captain); + RegisterCreatureAI(npc_ioc_siege_engine); + RegisterGameObjectAI(go_ioc_capturable_object); + RegisterGameObjectAI(go_ioc_contested_object); + RegisterSpellScript(spell_ioc_damaged); RegisterSpellScript(spell_ioc_gunship_portal); RegisterSpellScript(spell_ioc_parachute_ic); RegisterSpellScript(spell_ioc_launch); RegisterSpellScript(spell_ioc_seaforium_blast_credit); + new at_ioc_exploit(); + new at_ioc_backdoor_job(); } |
