aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMalcrom <malcromdev@gmail.com>2014-09-21 10:46:49 -0230
committerMalcrom <malcromdev@gmail.com>2014-09-21 10:46:49 -0230
commitcd48ee01c0b1465c5b07427bb6fe9baa57f053b9 (patch)
treebb6a3f98b25d819faaf098e866e408f1700f07aa /src
parent9be609c49e1caa9115160964e059e8681b4c3534 (diff)
Scripting/Shadowmoon Vally: Added scripting for Infernal Attackers.
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Outland/zone_shadowmoon_valley.cpp139
1 files changed, 139 insertions, 0 deletions
diff --git a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
index 54a7455d3f8..fe323452c29 100644
--- a/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
+++ b/src/server/scripts/Outland/zone_shadowmoon_valley.cpp
@@ -24,6 +24,8 @@ SDCategory: Shadowmoon Valley
EndScriptData */
/* ContentData
+npc_invis_infernal_caster
+npc_infernal_attacker
npc_mature_netherwing_drake
npc_enslaved_netherwing_drake
npc_drake_dealer_hurlunk
@@ -48,6 +50,141 @@ EndContentData */
#include "WorldSession.h"
/*#####
+# npc_invis_infernal_caster
+#####*/
+
+enum InvisInfernalCaster
+{
+ EVENT_CAST_SUMMON_INFERNAL = 1,
+ NPC_INFERNAL_ATTACKER = 21419,
+ MODEL_INVISIBLE = 20577,
+ MODEL_INFERNAL = 17312,
+ SPELL_SUMMON_INFERNAL = 37277,
+ TYPE_INFERNAL = 1,
+ DATA_DIED = 1
+};
+
+class npc_invis_infernal_caster : public CreatureScript
+{
+public:
+ npc_invis_infernal_caster() : CreatureScript("npc_invis_infernal_caster") { }
+
+ struct npc_invis_infernal_casterAI : public ScriptedAI
+ {
+ npc_invis_infernal_casterAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset() override
+ {
+ ground = me->GetMap()->GetHeight(me->GetPositionX(), me->GetPositionY(), me->GetPositionZMinusOffset());
+ SummonInfernal();
+ events.ScheduleEvent(EVENT_CAST_SUMMON_INFERNAL, urand(1000, 3000));
+ }
+
+ void SetData(uint32 id, uint32 data) override
+ {
+ if (id == TYPE_INFERNAL && data == DATA_DIED)
+ SummonInfernal();
+ }
+
+ void SummonInfernal()
+ {
+ Creature* infernal = me->SummonCreature(NPC_INFERNAL_ATTACKER, me->GetPositionX(), me->GetPositionY(), ground + 0.05f, 0.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 60000);
+ infernalGUID = infernal->GetGUID();
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CAST_SUMMON_INFERNAL:
+ {
+ if (Unit* infernal = ObjectAccessor::GetUnit(*me, infernalGUID))
+ if (infernal->GetDisplayId() == MODEL_INVISIBLE)
+ me->CastSpell(infernal, SPELL_SUMMON_INFERNAL, true);
+ events.ScheduleEvent(EVENT_CAST_SUMMON_INFERNAL, 12000);
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+
+ private:
+ EventMap events;
+ ObjectGuid infernalGUID;
+ float ground;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_invis_infernal_casterAI(creature);
+ }
+};
+
+/*#####
+# npc_infernal_attacker
+#####*/
+
+class npc_infernal_attacker : public CreatureScript
+{
+public:
+ npc_infernal_attacker() : CreatureScript("npc_infernal_attacker") { }
+
+ struct npc_infernal_attackerAI : public ScriptedAI
+ {
+ npc_infernal_attackerAI(Creature* creature) : ScriptedAI(creature) { }
+
+ void Reset() override
+ {
+ me->SetDisplayId(MODEL_INVISIBLE);
+ me->GetMotionMaster()->MoveRandom(5.0f);
+ }
+
+ void IsSummonedBy(Unit* summoner) override
+ {
+ if (summoner->ToCreature())
+ caster = summoner->ToCreature();
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ if (caster)
+ caster->AI()->SetData(TYPE_INFERNAL, DATA_DIED);
+ }
+
+ void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override
+ {
+ if (spell->Id == SPELL_SUMMON_INFERNAL)
+ {
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_PACIFIED | UNIT_FLAG_NOT_SELECTABLE);
+ me->SetDisplayId(MODEL_INFERNAL);
+ }
+ }
+
+ void UpdateAI(uint32 diff) override
+ {
+ if (!UpdateVictim())
+ return;
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ Creature* caster;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return new npc_infernal_attackerAI(creature);
+ }
+};
+
+/*#####
# npc_mature_netherwing_drake
#####*/
@@ -1826,6 +1963,8 @@ public:
void AddSC_shadowmoon_valley()
{
+ new npc_invis_infernal_caster();
+ new npc_infernal_attacker();
new npc_mature_netherwing_drake();
new npc_enslaved_netherwing_drake();
new npc_dragonmaw_peon();