aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Pandaria/zone_the_wandering_isle.cpp212
1 files changed, 211 insertions, 1 deletions
diff --git a/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp b/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp
index a9bd29a40bf..c5b42828c9a 100644
--- a/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp
+++ b/src/server/scripts/Pandaria/zone_the_wandering_isle.cpp
@@ -17,12 +17,15 @@
#include "CellImpl.h"
#include "Containers.h"
+#include "CreatureAI.h"
+#include "CreatureAIImpl.h" // for RAND()
#include "GridNotifiersImpl.h"
#include "MotionMaster.h"
#include "ObjectAccessor.h"
#include "Player.h"
-#include "ScriptedCreature.h"
#include "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "SpellScript.h"
#include "TaskScheduler.h"
enum TraineeMisc
@@ -400,10 +403,217 @@ private:
TaskScheduler _scheduler;
};
+enum JaominRoMisc
+{
+ // Spells
+ SPELL_CSA_AREATRIGGER_DUMMY = 88811,
+ SPELL_HAWK_DIVING_TO_EARTH = 108955,
+ SPELL_HAWK_DIVING_TO_EARTH_DMG = 108935,
+ SPELL_BABY_ELEPHANT_TAKES_A_BATH = 108938,
+ SPELL_FORCE_SUMMONER_TO_RIDE = 108583,
+ SPELL_EJECT_ALL_PASSENGERS = 50630,
+ SPELL_DIZZY = 108959,
+ SPELL_RIDE_DRAKE = 108582,
+ SPELL_SERVERSIDE_KILL_CREDIT = 109837,
+ SPELL_FULL_HEALTH = 17683,
+
+ // Texts
+ SAY_INTRO = 0,
+ SAY_DEFEATED = 1,
+
+ // Movement
+ POINT_RANDOM_DEST = 0,
+
+ // Events
+ EVENT_RANDOM_SPELL = 1,
+ EVENT_MOVE,
+ EVENT_HEAL,
+ EVENT_MOVE_HOME
+};
+
+// 54611 - Jaomin Ro
+struct npc_jaomin_ro : public ScriptedAI
+{
+ using ScriptedAI::ScriptedAI;
+
+ void JustEngagedWith(Unit* /*who*/) override
+ {
+ _events.ScheduleEvent(EVENT_RANDOM_SPELL, 4s, 6s);
+ }
+
+ void JustReachedHome() override
+ {
+ me->RemoveUnitFlag(UNIT_FLAG_NON_ATTACKABLE_2);
+ me->InitializeReactState();
+ }
+
+ void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
+ {
+ if (spellInfo->Id == SPELL_CSA_AREATRIGGER_DUMMY && target->GetTypeId() == TYPEID_PLAYER && !me->IsInCombat())
+ {
+ Talk(SAY_INTRO, target);
+ me->SetOrientation(1.67690026f);
+ me->SetStandState(UNIT_STAND_STATE_STAND);
+ me->SetEmoteState(EMOTE_STATE_READY_UNARMED);
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ _events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING) || me->HasUnitState(UNIT_STATE_STUNNED) || me->HasAura(SPELL_RIDE_DRAKE))
+ return;
+
+ switch (_events.ExecuteEvent())
+ {
+ case EVENT_RANDOM_SPELL:
+ {
+ uint32 spellId = RAND(SPELL_BABY_ELEPHANT_TAKES_A_BATH, SPELL_HAWK_DIVING_TO_EARTH);
+ DoCast(spellId);
+ _events.ScheduleEvent(EVENT_RANDOM_SPELL, 4s, 6s);
+ break;
+ }
+ case EVENT_HEAL:
+ {
+ DoCastSelf(SPELL_FULL_HEALTH);
+ me->SetUninteractible(false);
+ break;
+ }
+ case EVENT_MOVE_HOME:
+ {
+ EnterEvadeMode();
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ void OnHealthDepleted(Unit* attacker, bool /*isKill*/) override
+ {
+ me->SetReactState(REACT_PASSIVE);
+ me->AttackStop();
+ me->RemoveAllAuras();
+ me->InterruptNonMeleeSpells(true);
+ _events.Reset();
+ me->SetUninteractible(true);
+ me->SetUnitFlag(UNIT_FLAG_NON_ATTACKABLE_2);
+ me->SetEmoteState(EMOTE_ONESHOT_NONE);
+ DoCast(SPELL_SERVERSIDE_KILL_CREDIT);
+ Talk(SAY_DEFEATED, attacker);
+
+ _events.ScheduleEvent(EVENT_HEAL, 5s);
+ _events.ScheduleEvent(EVENT_MOVE_HOME, 6s);
+ }
+
+private:
+ EventMap _events;
+};
+
+// 57750 - Jaomin Ro (Hawk)
+struct npc_jaomin_ro_hawk : public ScriptedAI
+{
+ using ScriptedAI::ScriptedAI;
+
+ void JustAppeared() override
+ {
+ me->SetReactState(REACT_PASSIVE);
+ me->SetSpeedRate(MOVE_RUN, 2.5f);
+ }
+
+ void IsSummonedBy(WorldObject* summonerWO) override
+ {
+ Unit* summoner = summonerWO->ToUnit();
+ if (!summoner)
+ return;
+ Unit* victim = summoner->GetVictim();
+ if (!victim)
+ return;
+
+ DoCast(SPELL_FORCE_SUMMONER_TO_RIDE);
+ _scheduler.Schedule(1s, [this, orientation = me->GetAbsoluteAngle(victim) - me->GetOrientation()](TaskContext /*context*/)
+ {
+ me->GetMotionMaster()->MovePoint(POINT_RANDOM_DEST, me->GetFirstCollisionPosition(40.0f, orientation));
+ });
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ _scheduler.Update(diff);
+ }
+
+ void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override
+ {
+ if (spellInfo->Id == SPELL_HAWK_DIVING_TO_EARTH_DMG && target->GetTypeId() == TYPEID_PLAYER)
+ {
+ DoCast(SPELL_EJECT_ALL_PASSENGERS);
+ me->DespawnOrUnsummon();
+ }
+ }
+
+ void MovementInform(uint32 type, uint32 pointId) override
+ {
+ if (type != POINT_MOTION_TYPE)
+ return;
+
+ switch (pointId)
+ {
+ case POINT_RANDOM_DEST:
+ {
+ DoCast(SPELL_EJECT_ALL_PASSENGERS);
+ me->DespawnOrUnsummon();
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+private:
+ TaskScheduler _scheduler;
+};
+
+// 108583 - Force Summoner to Ride Vehicle
+class spell_force_summoner_to_ride_vehicle : public SpellScript
+{
+ void HandleScript(SpellEffIndex /*effIndex*/) const
+ {
+ GetHitUnit()->CastSpell(GetCaster(), GetEffectValue(), TRIGGERED_FULL_MASK);
+ }
+
+ void Register() override
+ {
+ OnEffectHitTarget += SpellEffectFn(spell_force_summoner_to_ride_vehicle::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
+ }
+};
+
+// 108582 - Ride Drake
+class spell_ride_drake : public AuraScript
+{
+ void OnRemoveVehicle(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const
+ {
+ if (Unit* caster = GetCaster())
+ caster->CastSpell(caster, SPELL_DIZZY, TRIGGERED_FULL_MASK);
+ }
+
+ void Register() override
+ {
+ OnEffectRemove += AuraEffectRemoveFn(spell_ride_drake::OnRemoveVehicle, EFFECT_0, SPELL_AURA_CONTROL_VEHICLE, AURA_EFFECT_HANDLE_REAL);
+ }
+};
+
void AddSC_zone_the_wandering_isle()
{
RegisterCreatureAI(npc_tushui_huojin_trainee);
RegisterCreatureAI(npc_huojin_trainee);
RegisterCreatureAI(npc_tushui_leading_trainee);
RegisterCreatureAI(npc_instructor_zhi);
+ RegisterCreatureAI(npc_jaomin_ro);
+ RegisterCreatureAI(npc_jaomin_ro_hawk);
+ RegisterSpellScript(spell_force_summoner_to_ride_vehicle);
+ RegisterSpellScript(spell_ride_drake);
}