diff options
-rw-r--r-- | sql/updates/world/master/2021_11_23_09_world_2019_02_02_01_world.sql | 4 | ||||
-rw-r--r-- | src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp | 184 |
2 files changed, 88 insertions, 100 deletions
diff --git a/sql/updates/world/master/2021_11_23_09_world_2019_02_02_01_world.sql b/sql/updates/world/master/2021_11_23_09_world_2019_02_02_01_world.sql new file mode 100644 index 00000000000..4e661554206 --- /dev/null +++ b/sql/updates/world/master/2021_11_23_09_world_2019_02_02_01_world.sql @@ -0,0 +1,4 @@ +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_gen_despawn_self' AND `spell_id`=52267; +DELETE FROM `spell_script_names` WHERE `ScriptName`='spell_deliver_stolen_horse'; +INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES +(52264, 'spell_deliver_stolen_horse'); diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index 37841b0910d..8e0690bd89e 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -28,6 +28,7 @@ #include "Player.h" #include "ScriptedEscortAI.h" #include "ScriptedGossip.h" +#include "SpellScript.h" #include "SpellInfo.h" #include "TemporarySummon.h" #include "Vehicle.h" @@ -639,94 +640,71 @@ public: enum DarkRiderOfAcherus { SAY_DARK_RIDER = 0, - SPELL_DESPAWN_HORSE = 51918 + + EVENT_START_MOVING = 1, + EVENT_DESPAWN_HORSE = 2, + EVENT_END_SCRIPT = 3, + + SPELL_DESPAWN_HORSE = 52267 }; -class npc_dark_rider_of_acherus : public CreatureScript +struct npc_dark_rider_of_acherus : public ScriptedAI { - public: - npc_dark_rider_of_acherus() : CreatureScript("npc_dark_rider_of_acherus") { } + npc_dark_rider_of_acherus(Creature* creature) : ScriptedAI(creature) { } - struct npc_dark_rider_of_acherusAI : public ScriptedAI - { - npc_dark_rider_of_acherusAI(Creature* creature) : ScriptedAI(creature) - { - Initialize(); - } - - void Initialize() - { - PhaseTimer = 4000; - Phase = 0; - Intro = false; - TargetGUID.Clear(); - } + void JustAppeared() override + { + if (TempSummon* summon = me->ToTempSummon()) + _horseGUID = summon->GetSummonerGUID(); - void Reset() override - { - Initialize(); - } + _events.ScheduleEvent(EVENT_START_MOVING, 1s); + } - void UpdateAI(uint32 diff) override - { - if (!Intro || !TargetGUID) - return; + void Reset() override + { + _events.Reset(); + } - if (PhaseTimer <= diff) - { - switch (Phase) - { - case 0: - Talk(SAY_DARK_RIDER); - PhaseTimer = 5000; - Phase = 1; - break; - case 1: - if (Unit* target = ObjectAccessor::GetUnit(*me, TargetGUID)) - DoCast(target, SPELL_DESPAWN_HORSE, true); - PhaseTimer = 3000; - Phase = 2; - break; - case 2: - me->SetVisible(false); - PhaseTimer = 2000; - Phase = 3; - break; - case 3: - me->DespawnOrUnsummon(); - break; - default: - break; - } - } - else - PhaseTimer -= diff; - } + void UpdateAI(uint32 diff) override + { + _events.Update(diff); - void InitDespawnHorse(Unit* who) + while (uint32 eventId = _events.ExecuteEvent()) + { + switch (eventId) { - if (!who) - return; - - TargetGUID = who->GetGUID(); - me->SetWalk(true); - me->SetSpeedRate(MOVE_RUN, 0.4f); - me->GetMotionMaster()->MoveChase(who); - me->SetTarget(TargetGUID); - Intro = true; + case EVENT_START_MOVING: + me->SetTarget(_horseGUID); + me->SetWalk(true); + if (Creature* horse = ObjectAccessor::GetCreature(*me, _horseGUID)) + me->GetMotionMaster()->MoveChase(horse); + _events.ScheduleEvent(EVENT_DESPAWN_HORSE, 5s); + break; + case EVENT_DESPAWN_HORSE: + Talk(SAY_DARK_RIDER); + if (Creature* horse = ObjectAccessor::GetCreature(*me, _horseGUID)) + DoCast(horse, SPELL_DESPAWN_HORSE, true); + _events.ScheduleEvent(EVENT_END_SCRIPT, 2s); + break; + case EVENT_END_SCRIPT: + me->DespawnOrUnsummon(); + break; + default: + break; } + } + } - private: - uint32 PhaseTimer; - uint32 Phase; - bool Intro; - ObjectGuid TargetGUID; - }; + void SpellHitTarget(Unit* target, SpellInfo const* spell) override + { + if (spell->Id == SPELL_DESPAWN_HORSE && target->GetGUID() == _horseGUID) + if (Creature* creature = target->ToCreature()) + creature->DespawnOrUnsummon(2s); + } - CreatureAI* GetAI(Creature* creature) const override - { - return new npc_dark_rider_of_acherusAI(creature); - } +private: + ObjectGuid _horseGUID; + EventMap _events; }; /*###### @@ -739,7 +717,6 @@ enum SalanarTheHorseman GOSSIP_SALANAR_OPTION = 0, SALANAR_SAY = 0, QUEST_INTO_REALM_OF_SHADOWS = 12687, - NPC_DARK_RIDER_OF_ACHERUS = 28654, NPC_SALANAR_IN_REALM_OF_SHADOWS = 28788, SPELL_EFFECT_STOLEN_HORSE = 52263, SPELL_DELIVER_STOLEN_HORSE = 52264, @@ -767,28 +744,6 @@ public: return false; } - void SpellHit(Unit* caster, SpellInfo const* spell) override - { - if (spell->Id == SPELL_DELIVER_STOLEN_HORSE) - { - if (caster->GetTypeId() == TYPEID_UNIT && caster->IsVehicle()) - { - if (Unit* charmer = caster->GetCharmer()) - { - if (charmer->HasAura(SPELL_EFFECT_STOLEN_HORSE)) - { - charmer->RemoveAurasDueToSpell(SPELL_EFFECT_STOLEN_HORSE); - caster->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK); - caster->SetFaction(FACTION_FRIENDLY); - DoCast(caster, SPELL_CALL_DARK_RIDER, true); - if (Creature* Dark_Rider = me->FindNearestCreature(NPC_DARK_RIDER_OF_ACHERUS, 15)) - ENSURE_AI(npc_dark_rider_of_acherus::npc_dark_rider_of_acherusAI, Dark_Rider->AI())->InitDespawnHorse(caster); - } - } - } - } - } - void MoveInLineOfSight(Unit* who) override { ScriptedAI::MoveInLineOfSight(who); @@ -825,6 +780,34 @@ public: } }; +class spell_deliver_stolen_horse : public SpellScript +{ + PrepareSpellScript(spell_deliver_stolen_horse); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + return ValidateSpellInfo({ SPELL_DELIVER_STOLEN_HORSE, SPELL_EFFECT_STOLEN_HORSE }); + } + + void HandleScriptEffect(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit(); + target->RemoveAurasDueToSpell(SPELL_EFFECT_STOLEN_HORSE); + + Unit* caster = GetCaster(); + caster->RemoveAurasDueToSpell(SPELL_EFFECT_STOLEN_HORSE); + caster->RemoveNpcFlag(UNIT_NPC_FLAG_SPELLCLICK); + caster->SetFaction(FACTION_FRIENDLY); + + caster->CastSpell(caster, SPELL_CALL_DARK_RIDER, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_deliver_stolen_horse::HandleScriptEffect, EFFECT_1, SPELL_EFFECT_KILL_CREDIT2); + } +}; + /*###### ## npc_ros_dark_rider ######*/ @@ -1233,8 +1216,9 @@ void AddSC_the_scarlet_enclave_c1() new go_acherus_soul_prison(); new npc_eye_of_acherus(); new npc_death_knight_initiate(); + RegisterCreatureAI(npc_dark_rider_of_acherus); new npc_salanar_the_horseman(); - new npc_dark_rider_of_acherus(); + RegisterSpellScript(spell_deliver_stolen_horse); new npc_ros_dark_rider(); new npc_dkc1_gothik(); new npc_scarlet_ghoul(); |