aboutsummaryrefslogtreecommitdiff
path: root/src/server/scripts/Northrend
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/scripts/Northrend')
-rw-r--r--src/server/scripts/Northrend/zone_icecrown.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/server/scripts/Northrend/zone_icecrown.cpp b/src/server/scripts/Northrend/zone_icecrown.cpp
index d5641b0fcc7..457eaccec8c 100644
--- a/src/server/scripts/Northrend/zone_icecrown.cpp
+++ b/src/server/scripts/Northrend/zone_icecrown.cpp
@@ -32,6 +32,7 @@ EndContentData */
#include "ScriptedGossip.h"
#include "SpellAuras.h"
#include "Player.h"
+#include "TemporarySummon.h"
/*######
## npc_arete
@@ -874,6 +875,92 @@ public:
}
};
+/*######
+## Borrowed Technology - Id: 13291, The Solution Solution (daily) - Id: 13292, Volatility - Id: 13239, Volatiliy - Id: 13261 (daily)
+######*/
+
+enum BorrowedTechnologyAndVolatility
+{
+ // Spells
+ SPELL_GRAB = 59318,
+ SPELL_PING_BUNNY = 59375,
+ SPELL_IMMOLATION = 54690,
+ SPELL_EXPLOSION = 59335,
+ SPELL_RIDE = 56687,
+
+ // Points
+ POINT_GRAB_DECOY = 1,
+ POINT_FLY_AWAY = 2,
+
+ // Events
+ EVENT_FLY_AWAY = 1
+};
+
+class npc_frostbrood_skytalon : public CreatureScript
+{
+ public:
+ npc_frostbrood_skytalon() : CreatureScript("npc_frostbrood_skytalon") { }
+
+ struct npc_frostbrood_skytalonAI : public VehicleAI
+ {
+ npc_frostbrood_skytalonAI(Creature* creature) : VehicleAI(creature) { }
+
+ EventMap events;
+
+ void IsSummonedBy(Unit* summoner)
+ {
+ me->GetMotionMaster()->MovePoint(POINT_GRAB_DECOY, summoner->GetPositionX(), summoner->GetPositionY(), summoner->GetPositionZ());
+ }
+
+ void MovementInform(uint32 type, uint32 id)
+ {
+ if (type != POINT_MOTION_TYPE)
+ return;
+
+ if (id == POINT_GRAB_DECOY)
+ if (TempSummon* summon = me->ToTempSummon())
+ if (Unit* summoner = summon->GetSummoner())
+ DoCast(summoner, SPELL_GRAB);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ VehicleAI::UpdateAI(diff);
+ events.Update(diff);
+
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ if (eventId == EVENT_FLY_AWAY)
+ {
+ Position randomPosOnRadius;
+ randomPosOnRadius.m_positionZ = (me->GetPositionZ() + 40.0f);
+ me->GetNearPoint2D(randomPosOnRadius.m_positionX, randomPosOnRadius.m_positionY, 40.0f, me->GetAngle(me));
+ me->GetMotionMaster()->MovePoint(POINT_FLY_AWAY, randomPosOnRadius);
+ }
+ }
+ }
+
+ void SpellHit(Unit* /*caster*/, SpellInfo const* spell)
+ {
+ switch (spell->Id)
+ {
+ case SPELL_EXPLOSION:
+ DoCast(me, SPELL_IMMOLATION);
+ break;
+ case SPELL_RIDE:
+ DoCastAOE(SPELL_PING_BUNNY);
+ events.ScheduleEvent(EVENT_FLY_AWAY, 100);
+ break;
+ }
+ }
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new npc_frostbrood_skytalonAI(creature);
+ }
+};
+
void AddSC_icecrown()
{
new npc_arete;
@@ -883,4 +970,5 @@ void AddSC_icecrown()
new npc_vereth_the_cunning;
new npc_tournament_training_dummy;
new npc_blessed_banner();
+ new npc_frostbrood_skytalon();
}