diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/World/boss_emerald_dragons.cpp | 62 |
1 files changed, 56 insertions, 6 deletions
diff --git a/src/server/scripts/World/boss_emerald_dragons.cpp b/src/server/scripts/World/boss_emerald_dragons.cpp index 7f0f63e5cd3..3ae7663f09d 100644 --- a/src/server/scripts/World/boss_emerald_dragons.cpp +++ b/src/server/scripts/World/boss_emerald_dragons.cpp @@ -19,6 +19,9 @@ #include "ObjectMgr.h" #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "Spell.h" +#include "SpellAuraEffects.h" // // Emerald Dragon NPCs and IDs (kept here for reference) @@ -43,7 +46,8 @@ enum EmeraldDragonSpells { SPELL_TAIL_SWEEP = 15847, // tail sweep - slap everything behind dragon (2 seconds interval) SPELL_SUMMON_PLAYER = 24776, // teleport highest threat player in front of dragon if wandering off - SPELL_DREAM_FOG = 24777, // used by summoned NPC (Dream Fog/15224) + SPELL_DREAM_FOG = 24777, // auraspell for Dream Fog NPC (15224) + SPELL_SLEEP = 24778, // sleep triggerspell (used for Dream Fog) SPELL_SEEPING_FOG_LEFT = 24813, // dream fog - summon left SPELL_SEEPING_FOG_RIGHT = 24814, // dream fog - summon right SPELL_NOXIOUS_BREATH = 24818, @@ -136,7 +140,7 @@ struct emerald_dragonAI : public WorldBossAI case EVENT_SEEPING_FOG: DoCast(me, SPELL_SEEPING_FOG_LEFT, true); DoCast(me, SPELL_SEEPING_FOG_RIGHT, true); - events.ScheduleEvent(EVENT_SEEPING_FOG, urand(8000,16000)); + events.ScheduleEvent(EVENT_SEEPING_FOG, urand(60000,120000)); break; case EVENT_NOXIOUS_BREATH: DoCast(me, SPELL_NOXIOUS_BREATH); @@ -172,7 +176,6 @@ struct emerald_dragonAI : public WorldBossAI * TODO: * - Change to random targets on random intervals(?) * - Check if targets are selected based on threatlevel(?) - * - Spell: Dream Fog needs a spellscript * */ @@ -201,13 +204,18 @@ class npc_dream_fog : public CreatureScript { // Chase target, but don't attack - otherwise just roam around Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true); + if (target) { - me->GetMotionMaster()->MoveChase(target); + _roamTimer = urand(15000, 30000); + me->GetMotionMaster()->MoveChase(target, 0.1f); } else - me->GetMotionMaster()->MoveIdle(); - _roamTimer = urand(10000, 20000); + { + _roamTimer = 5000; + me->GetMotionMaster()->MoveRandom(25.0f); + } + me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING); } else _roamTimer -= diff; @@ -224,6 +232,47 @@ class npc_dream_fog : public CreatureScript }; /* + * --- Spell: Dream Fog + */ + +class DreamFogTargetSelector +{ + public: + DreamFogTargetSelector() { } + + bool operator()(Unit* unit) + { + return unit->HasAura(SPELL_SLEEP); + } +}; + +class spell_dream_fog_sleep : public SpellScriptLoader +{ + public: + spell_dream_fog_sleep() : SpellScriptLoader("spell_dream_fog_sleep") { } + + class spell_dream_fog_sleep_SpellScript : public SpellScript + { + PrepareSpellScript(spell_dream_fog_sleep_SpellScript); + + void FilterTargets(std::list<Unit*>& unitList) + { + unitList.remove_if(DreamFogTargetSelector()); + } + + void Register() + { + OnUnitTargetSelect += SpellUnitTargetFn(spell_dream_fog_sleep_SpellScript::FilterTargets, EFFECT_0, TARGET_UNIT_AREA_ENEMY_DST); + } + }; + + SpellScript* GetSpellScript() const + { + return new spell_dream_fog_sleep_SpellScript(); + } +}; + +/* * --- * --- Dragonspecific scripts and handling: YSONDRE * --- @@ -849,6 +898,7 @@ void AddSC_emerald_dragons() { // helper NPC scripts new npc_dream_fog(); + new spell_dream_fog_sleep(); // ysondre and summons new boss_ysondre(); |