aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp233
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp25
2 files changed, 247 insertions, 11 deletions
diff --git a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
index c68d3abeb6b..bb68b4f25e2 100644
--- a/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_silverpine_forest.cpp
@@ -40,6 +40,210 @@
#include "Vehicle.h"
#include "WorldSession.h"
+enum HordeHauler
+{
+ NPC_HORDE_ENGINEER_HAULER = 44734,
+ NPC_SUBDUED_FOREST_ETTIN_HAULER = 44737,
+ NPC_FORSAKEN_TROOPER_F = 44732,
+ NPC_FORSAKEN_TROOPER_M = 44733,
+
+ SPELL_EJECT_PASSENGERS_3_8 = 83477,
+
+ EVENT_START_PATH = 1,
+ EVENT_YELL_ON_FORSAKEN_HIGH = 2,
+ EVENT_YELL_ON_SEPULCHER = 3,
+ EVENT_YELL_ON_FORSAKEN_FRONT = 4,
+ EVENT_TROOPERS_RUN = 5,
+
+ TALK_HAULER_BOARDED = 0,
+ TALK_ON_FORSAKEN_HIGH = 1,
+ TALK_ON_SEPULCHER = 2,
+ TALK_ON_FORSAKEN_FRONT = 3,
+
+ PATH_FROM_NORTH_TO_SOUTH = 447310,
+ PATH_TROOPER_1 = 447320,
+ PATH_TROOPER_2 = 447321,
+ PATH_TROOPER_3 = 447322,
+ PATH_TROOPER_4 = 447323,
+ PATH_TROOPER_5 = 447324,
+
+ WAYPOINT_ON_FORSAKEN_HIGH = 11,
+ WAYPOINT_ON_SEPULCHER = 35,
+ WAYPOINT_ON_FORSAKEN_FRONT = 60,
+ WAYPOINT_ON_DESPAWN_POINT_SOUTH = 63,
+ WAYPOINT_ON_TROOPER_DESPAWN = 1,
+
+ SEAT_HAULER_PLAYER = 2,
+ SEAT_HAULER_TROOPER_1 = 3,
+ SEAT_HAULER_TROOPER_2 = 4,
+ SEAT_HAULER_TROOPER_3 = 5,
+ SEAT_HAULER_TROOPER_4 = 6,
+ SEAT_HAULER_TROOPER_5 = 7
+};
+
+// 44731 - Horde Hauler
+struct npc_silverpine_horde_hauler : public ScriptedAI
+{
+ npc_silverpine_horde_hauler(Creature* creature) : ScriptedAI(creature) { }
+
+ void JustAppeared() override
+ {
+ _events.ScheduleEvent(EVENT_START_PATH, 8s);
+ }
+
+ void PassengerBoarded(Unit* passenger, int8 seatId, bool apply) override
+ {
+ if (apply && passenger->IsPlayer())
+ {
+ _playerGUID = passenger->GetGUID();
+
+ if (seatId == SEAT_HAULER_PLAYER)
+ {
+ if (Creature* engineer = me->FindNearestCreature(NPC_HORDE_ENGINEER_HAULER, 15.0f, true))
+ {
+ if (Player* player = ObjectAccessor::GetPlayer(*me, _playerGUID))
+ {
+ if (engineer->IsAIEnabled())
+ engineer->AI()->Talk(TALK_HAULER_BOARDED, player);
+ }
+ }
+ }
+ }
+
+ if (!apply && !passenger->IsPlayer())
+ {
+ uint32 pathId = 0;
+
+ switch (seatId)
+ {
+ case SEAT_HAULER_TROOPER_1:
+ pathId = PATH_TROOPER_1;
+ break;
+ case SEAT_HAULER_TROOPER_2:
+ pathId = PATH_TROOPER_2;
+ break;
+ case SEAT_HAULER_TROOPER_3:
+ pathId = PATH_TROOPER_3;
+ break;
+ case SEAT_HAULER_TROOPER_4:
+ pathId = PATH_TROOPER_4;
+ break;
+ case SEAT_HAULER_TROOPER_5:
+ pathId = PATH_TROOPER_5;
+ break;
+
+ default:
+ break;
+ }
+
+ passenger->GetMotionMaster()->MovePath(pathId, false);
+ }
+ }
+
+ void WaypointReached(uint32 waypointId, uint32 pathId) override
+ {
+ if (pathId == PATH_FROM_NORTH_TO_SOUTH)
+ {
+ if (waypointId == WAYPOINT_ON_FORSAKEN_HIGH)
+ _events.ScheduleEvent(EVENT_YELL_ON_FORSAKEN_HIGH, 1s);
+ else if (waypointId == WAYPOINT_ON_SEPULCHER)
+ _events.ScheduleEvent(EVENT_YELL_ON_SEPULCHER, 1s);
+ else if (waypointId == WAYPOINT_ON_FORSAKEN_FRONT)
+ _events.ScheduleEvent(EVENT_YELL_ON_FORSAKEN_FRONT, 1s);
+ else if (waypointId == WAYPOINT_ON_DESPAWN_POINT_SOUTH)
+ me->DespawnOrUnsummon(1s);
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _events.Update(diff);
+
+ while (uint32 eventId = _events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_START_PATH:
+ me->GetMotionMaster()->MovePath(PATH_FROM_NORTH_TO_SOUTH, false);
+ break;
+
+ case EVENT_YELL_ON_FORSAKEN_HIGH:
+ {
+ if (Creature* engineer = me->FindNearestCreature(NPC_HORDE_ENGINEER_HAULER, 15.0f, true))
+ {
+ if (engineer->IsAIEnabled())
+ engineer->AI()->Talk(TALK_ON_FORSAKEN_HIGH);
+ }
+ break;
+ }
+
+ case EVENT_YELL_ON_SEPULCHER:
+ {
+ if (Creature* engineer = me->FindNearestCreature(NPC_HORDE_ENGINEER_HAULER, 15.0f, true))
+ {
+ if (engineer->IsAIEnabled())
+ engineer->AI()->Talk(TALK_ON_SEPULCHER);
+ }
+ break;
+ }
+
+ case EVENT_YELL_ON_FORSAKEN_FRONT:
+ {
+ if (Creature* engineer = me->FindNearestCreature(NPC_HORDE_ENGINEER_HAULER, 15.0f, true))
+ {
+ if (engineer->IsAIEnabled())
+ engineer->AI()->Talk(TALK_ON_FORSAKEN_FRONT);
+ }
+
+ DoCastSelf(SPELL_EJECT_PASSENGERS_3_8);
+
+ me->SetUnitFlag3(UnitFlags3::UNIT_FLAG3_UNTARGETABLE_FROM_UI);
+ break;
+ }
+
+ default:
+ break;
+ }
+ }
+ }
+
+private:
+ EventMap _events;
+ ObjectGuid _playerGUID;
+};
+
+enum MagicalChainsHauler
+{
+ SPELL_CHAIN_RIGHT_HAULER = 83467,
+ SPELL_CHAIN_LEFT_HAULER = 83464
+};
+
+// 84238 - Magical Chains (Hauler)
+class spell_silverpine_magical_chains_hauler : public AuraScript
+{
+ PrepareAuraScript(spell_silverpine_magical_chains_hauler);
+
+ bool Validate(SpellInfo const* /*spellInfo*/) override
+ {
+ return ValidateSpellInfo
+ ({
+ SPELL_CHAIN_RIGHT_HAULER,
+ SPELL_CHAIN_LEFT_HAULER
+ });
+ }
+
+ void HandlePeriodic(AuraEffect const* /*aurEff*/)
+ {
+ GetTarget()->CastSpell(nullptr, SPELL_CHAIN_RIGHT_HAULER, true);
+ GetTarget()->CastSpell(nullptr, SPELL_CHAIN_LEFT_HAULER, true);
+ }
+
+ void Register() override
+ {
+ OnEffectPeriodic += AuraEffectPeriodicFn(spell_silverpine_magical_chains_hauler::HandlePeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY);
+ }
+};
+
Position const OrgrimmarPortalPos[3] =
{
{ 1358.62f, 1054.72f, 53.1200f, 0.0f },
@@ -151,7 +355,7 @@ enum QuestTheWarchiefCometh
ANIMKIT_GARROSH_2 = 595
};
-// Grand Executor Mortuus - 44615
+// 44615 - Grand Executor Mortuus
struct npc_silverpine_grand_executor_mortuus : public ScriptedAI
{
npc_silverpine_grand_executor_mortuus(Creature* creature) : ScriptedAI(creature), _summons(me), _eventInProgress(false) {}
@@ -731,7 +935,7 @@ enum RaiseForsakenCometh
ANIMKIT_FALLEN_HUMAN = 721
};
-// Raise Forsaken - 83173
+// 83173 - Raise Forsaken
class spell_silverpine_raise_forsaken_83173 : public AuraScript
{
PrepareAuraScript(spell_silverpine_raise_forsaken_83173);
@@ -776,7 +980,7 @@ enum FallenHuman
EVENT_EMOTE_TO_SYLVANAS = 4
};
-// Fallen Human - 44592, 44593
+// 44592, 44593 - Fallen Human
struct npc_silverpine_fallen_human : public ScriptedAI
{
npc_silverpine_fallen_human(Creature* creature) : ScriptedAI(creature), _transformDone(false) {}
@@ -876,7 +1080,7 @@ enum SpellForsakenTrooperMasterScriptCometh
DISPLAY_FEMALE_04_HC = 33985
};
-// Forsaken Trooper Master Script (Forsaken High Command) - 83149
+// 83149 - Forsaken Trooper Master Script (Forsaken High Command)
class spell_silverpine_forsaken_trooper_masterscript_high_command : public SpellScript
{
PrepareSpellScript(spell_silverpine_forsaken_trooper_masterscript_high_command);
@@ -953,7 +1157,7 @@ enum SylvanasForsakenHighCommand
SPELL_APPLY_INVIS_ZONE_4 = 84183
};
-// Lady Sylvanas Windrunner (Forsaken High Command) - 44365
+// 44365 - Lady Sylvanas Windrunner (Forsaken High Command)
struct npc_silverpine_sylvanas_windrunner_high_command : public ScriptedAI
{
npc_silverpine_sylvanas_windrunner_high_command(Creature* creature) : ScriptedAI(creature) { }
@@ -968,7 +1172,7 @@ struct npc_silverpine_sylvanas_windrunner_high_command : public ScriptedAI
}
};
-// Deathstalker and Deathstalker Commander Belmont - 44789, 44790
+// 44789, 44790 - Deathstalker and Deathstalker Commander Belmont
struct npc_silverpine_deathstalker : public ScriptedAI
{
npc_silverpine_deathstalker(Creature* creature) : ScriptedAI(creature) { }
@@ -991,7 +1195,7 @@ enum WorgenRenegade
EVENT_FLURRY_OF_CLAWS = 1
};
-// Worgen Renegade - 44793
+// 44793 - Worgen Renegade
struct npc_silverpine_worgen_renegade : public ScriptedAI
{
npc_silverpine_worgen_renegade(Creature* creature) : ScriptedAI(creature) { }
@@ -1047,7 +1251,7 @@ private:
EventMap _events;
};
-// Flurry of Claws - 80365
+// 80365 - Flurry of Claws
class spell_silverpine_flurry_of_claws : public AuraScript
{
PrepareAuraScript(spell_silverpine_flurry_of_claws);
@@ -1079,7 +1283,7 @@ enum ForsakenTrooper
TALK_TROOPER_RESET = 0
};
-// Forsaken Trooper - 44791, 44792
+// 44791, 44792 - Forsaken Trooper
struct npc_silverpine_forsaken_trooper : public ScriptedAI
{
npc_silverpine_forsaken_trooper(Creature* creature) : ScriptedAI(creature) { }
@@ -1147,7 +1351,7 @@ enum BatHandlerMaggothbreath
DATA_GOSSIP_MENU_MAGGOT = 11892
};
-// Bat Handler Maggotbreath - 44825
+// 44825 - Bat Handler Maggotbreath
struct npc_silverpine_bat_handler_maggotbreath : public ScriptedAI
{
npc_silverpine_bat_handler_maggotbreath(Creature* creature) : ScriptedAI(creature) { }
@@ -1217,7 +1421,7 @@ enum ForsakenBat
DATA_ITERATING_UPON_SUCCESS_QUEST_REQ = 50
};
-// Forsaken Bat - 44821
+// 44821 - Forsaken Bat
struct npc_silverpine_forsaken_bat : public VehicleAI
{
npc_silverpine_forsaken_bat(Creature* creature) : VehicleAI(creature)
@@ -1394,6 +1598,13 @@ private:
void AddSC_silverpine_forest()
{
+ /* Vehicles */
+
+ RegisterCreatureAI(npc_silverpine_horde_hauler);
+ RegisterSpellScript(spell_silverpine_magical_chains_hauler);
+
+ /* Forsaken High Command */
+
RegisterCreatureAI(npc_silverpine_grand_executor_mortuus);
RegisterSpellScript(spell_silverpine_raise_forsaken_83173);
RegisterCreatureAI(npc_silverpine_fallen_human);
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 76ae0bfe3ad..98271b04737 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -5117,6 +5117,30 @@ class spell_gen_ancestral_call : public SpellScript
}
};
+// 83477 - Eject Passengers 3-8
+class spell_gen_eject_passengers_3_8 : public SpellScript
+{
+ PrepareSpellScript(spell_gen_eject_passengers_3_8);
+
+ void HandleScriptEffect(SpellEffIndex /*effIndex*/)
+ {
+ Vehicle* vehicle = GetHitUnit()->GetVehicleKit();
+ if (!vehicle)
+ return;
+
+ for (uint8 i = 2; i < 8; i++)
+ {
+ if (Unit* passenger = vehicle->GetPassenger(i))
+ passenger->ExitVehicle();
+ }
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_gen_eject_passengers_3_8::HandleScriptEffect, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
+
void AddSC_generic_spell_scripts()
{
RegisterSpellScript(spell_gen_absorb0_hitlimit1);
@@ -5274,4 +5298,5 @@ void AddSC_generic_spell_scripts()
RegisterSpellScript(spell_gen_anchor_here);
RegisterSpellScript(spell_gen_mount_check_aura);
RegisterSpellScript(spell_gen_ancestral_call);
+ RegisterSpellScript(spell_gen_eject_passengers_3_8);
}