diff options
author | Malcrom <malcromdev@gmail.com> | 2014-09-21 10:46:49 -0230 |
---|---|---|
committer | Malcrom <malcromdev@gmail.com> | 2014-09-21 10:46:49 -0230 |
commit | cd48ee01c0b1465c5b07427bb6fe9baa57f053b9 (patch) | |
tree | bb6a3f98b25d819faaf098e866e408f1700f07aa /src | |
parent | 9be609c49e1caa9115160964e059e8681b4c3534 (diff) |
Scripting/Shadowmoon Vally: Added scripting for Infernal Attackers.
Diffstat (limited to 'src')
-rw-r--r-- | src/server/scripts/Outland/zone_shadowmoon_valley.cpp | 139 |
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(); |