Scripts/World: Fix some more on the Emerald Dragon AI:
- Add spellscript for Dream Fog sleep - now it ticks like it should - Adjust movement-speed and timers for the Dream Fog NPC spawns (can now be outrun, and doesn't spawn like mad)
This commit is contained in:
@@ -0,0 +1 @@
|
|||||||
|
INSERT INTO `spell_script_names`(`spell_id`, `ScriptName`) VALUES ('24778', 'spell_dream_fog_sleep');
|
||||||
@@ -19,6 +19,9 @@
|
|||||||
#include "ObjectMgr.h"
|
#include "ObjectMgr.h"
|
||||||
#include "ScriptMgr.h"
|
#include "ScriptMgr.h"
|
||||||
#include "ScriptedCreature.h"
|
#include "ScriptedCreature.h"
|
||||||
|
#include "SpellScript.h"
|
||||||
|
#include "Spell.h"
|
||||||
|
#include "SpellAuraEffects.h"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Emerald Dragon NPCs and IDs (kept here for reference)
|
// 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_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_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_LEFT = 24813, // dream fog - summon left
|
||||||
SPELL_SEEPING_FOG_RIGHT = 24814, // dream fog - summon right
|
SPELL_SEEPING_FOG_RIGHT = 24814, // dream fog - summon right
|
||||||
SPELL_NOXIOUS_BREATH = 24818,
|
SPELL_NOXIOUS_BREATH = 24818,
|
||||||
@@ -136,7 +140,7 @@ struct emerald_dragonAI : public WorldBossAI
|
|||||||
case EVENT_SEEPING_FOG:
|
case EVENT_SEEPING_FOG:
|
||||||
DoCast(me, SPELL_SEEPING_FOG_LEFT, true);
|
DoCast(me, SPELL_SEEPING_FOG_LEFT, true);
|
||||||
DoCast(me, SPELL_SEEPING_FOG_RIGHT, 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;
|
break;
|
||||||
case EVENT_NOXIOUS_BREATH:
|
case EVENT_NOXIOUS_BREATH:
|
||||||
DoCast(me, SPELL_NOXIOUS_BREATH);
|
DoCast(me, SPELL_NOXIOUS_BREATH);
|
||||||
@@ -172,7 +176,6 @@ struct emerald_dragonAI : public WorldBossAI
|
|||||||
* TODO:
|
* TODO:
|
||||||
* - Change to random targets on random intervals(?)
|
* - Change to random targets on random intervals(?)
|
||||||
* - Check if targets are selected based on threatlevel(?)
|
* - 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
|
// Chase target, but don't attack - otherwise just roam around
|
||||||
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true);
|
Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true);
|
||||||
|
|
||||||
if (target)
|
if (target)
|
||||||
{
|
{
|
||||||
me->GetMotionMaster()->MoveChase(target);
|
_roamTimer = urand(15000, 30000);
|
||||||
|
me->GetMotionMaster()->MoveChase(target, 0.1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
me->GetMotionMaster()->MoveIdle();
|
{
|
||||||
_roamTimer = urand(10000, 20000);
|
_roamTimer = 5000;
|
||||||
|
me->GetMotionMaster()->MoveRandom(25.0f);
|
||||||
|
}
|
||||||
|
me->AddUnitMovementFlag(MOVEMENTFLAG_WALKING);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
_roamTimer -= diff;
|
_roamTimer -= diff;
|
||||||
@@ -223,6 +231,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
|
* --- Dragonspecific scripts and handling: YSONDRE
|
||||||
@@ -849,6 +898,7 @@ void AddSC_emerald_dragons()
|
|||||||
{
|
{
|
||||||
// helper NPC scripts
|
// helper NPC scripts
|
||||||
new npc_dream_fog();
|
new npc_dream_fog();
|
||||||
|
new spell_dream_fog_sleep();
|
||||||
|
|
||||||
// ysondre and summons
|
// ysondre and summons
|
||||||
new boss_ysondre();
|
new boss_ysondre();
|
||||||
|
|||||||
Reference in New Issue
Block a user