aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp103
1 files changed, 95 insertions, 8 deletions
diff --git a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
index c694aa88338..01913dd1cd0 100644
--- a/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
+++ b/src/server/scripts/Northrend/UtgardeKeep/UtgardeKeep/utgarde_keep.cpp
@@ -143,14 +143,7 @@ public:
}
}
}
-
- switch (near_f)
- {
- case 1: return 1;
- case 2: return 2;
- case 3: return 3;
- default: return 0;
- }
+ return near_f > 0 && near_f < 4 ? near_f : 0;
}
void UpdateAI(const uint32 /*diff*/)
@@ -239,9 +232,103 @@ class spell_fixate : public SpellScriptLoader
return new spell_fixate_SpellScript();
}
};
+enum EnslavedProtoDrake
+{
+ TYPE_PROTODRAKE_AT = 28,
+ DATA_PROTODRAKE_MOVE = 6,
+
+ PATH_PROTODRAKE = 125946,
+
+ EVENT_REND = 1,
+ EVENT_FLAME_BREATH = 2,
+ EVENT_KNOCKAWAY = 3,
+
+ SPELL_REND = 43931,
+ SPELL_FLAME_BREATH = 50653,
+ SPELL_KNOCK_AWAY = 49722,
+};
+
+const Position protodrakeCheckPos = { 206.24f, -190.28f, 200.11f };
+
+class npc_enslaved_proto_drake : public CreatureScript
+{
+public:
+ npc_enslaved_proto_drake() : CreatureScript("npc_enslaved_proto_drake") { }
+
+ struct npc_enslaved_proto_drakeAI : public ScriptedAI
+ {
+ npc_enslaved_proto_drakeAI(Creature* creature) : ScriptedAI(creature)
+ {
+ setData = false;
+ }
+
+ void Reset()
+ {
+ events.Reset();
+ events.ScheduleEvent(EVENT_REND, urand(2000, 3000));
+ events.ScheduleEvent(EVENT_FLAME_BREATH, urand(5500, 7000));
+ events.ScheduleEvent(EVENT_KNOCKAWAY, urand(3500, 6000));
+ }
+
+ void SetData(uint32 type, uint32 data)
+ {
+ if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !setData && me->GetDistance(protodrakeCheckPos) < 5.0f)
+ {
+ setData = true;
+ me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false);
+ }
+ }
+
+ void UpdateAI(const uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventid = events.ExecuteEvent())
+ {
+ switch (eventid)
+ {
+ case EVENT_REND:
+ DoCast(SPELL_REND);
+ events.ScheduleEvent(EVENT_REND, urand(15000, 20000));
+ break;
+ case EVENT_FLAME_BREATH:
+ DoCast(SPELL_FLAME_BREATH);
+ events.ScheduleEvent(EVENT_FLAME_BREATH, urand(11000, 12000));
+ break;
+ case EVENT_KNOCKAWAY:
+ DoCast(SPELL_KNOCK_AWAY);
+ events.ScheduleEvent(EVENT_KNOCKAWAY, urand(7000, 8500));
+ break;
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ bool setData;
+ EventMap events;
+
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_enslaved_proto_drakeAI(creature);
+ }
+};
+
void AddSC_utgarde_keep()
{
new npc_dragonflayer_forge_master();
+ new npc_enslaved_proto_drake();
new spell_ticking_time_bomb();
new spell_fixate();
}