diff options
author | megamage <none@none> | 2008-11-09 15:17:38 -0600 |
---|---|---|
committer | megamage <none@none> | 2008-11-09 15:17:38 -0600 |
commit | a04ad26b9e5a2192c95ecd100f8a3ed027a1a5b0 (patch) | |
tree | d5690f76454373c24242b3edbe75c2d7813dcd87 /src | |
parent | ee02a2fc84c564d82a062bd975281a4e4f0fefa0 (diff) |
[svn] Add Druid swift flight form quest scripts. Patch provided by Blaymoria.
Update tempest keep scripts. Patch provided by Blaymoria.
--HG--
branch : trunk
Diffstat (limited to 'src')
8 files changed, 877 insertions, 81 deletions
diff --git a/src/bindings/scripts/scripts/zone/azshara/azshara.cpp b/src/bindings/scripts/scripts/zone/azshara/azshara.cpp index 101345850d6..92c522fba60 100644 --- a/src/bindings/scripts/scripts/zone/azshara/azshara.cpp +++ b/src/bindings/scripts/scripts/zone/azshara/azshara.cpp @@ -17,16 +17,20 @@ /* ScriptData SDName: Azshara SD%Complete: 90 -SDComment: Quest support: 2744, 3141, 9364 +SDComment: Quest support: 2744, 3141, 9364, 10994 SDCategory: Azshara EndScriptData */ /* ContentData mobs_spitelashes npc_loramus_thalipedes +mob_rizzle_sprysprocket +mob_depth_charge EndContentData */ #include "precompiled.h" +#include "World.h" +#include "WorldPacket.h" /*###### ## mobs_spitelashes @@ -147,6 +151,340 @@ bool GossipSelect_npc_loramus_thalipedes(Player *player, Creature *_Creature, ui return true; } +/*#### +# mob_rizzle_sprysprocket +####*/ +#define MOB_DEPTH_CHARGE 23025 +#define SPELL_RIZZLE_BLACKJACK 39865 +#define SPELL_RIZZLE_ESCAPE 39871 +#define SPELL_RIZZLE_FROST_GRENADE 40525 +#define SPELL_DEPTH_CHARGE_TRAP 38576 +#define SPELL_PERIODIC_DEPTH_CHARGE 39912 +#define SPELL_GIVE_SOUTHFURY_MOONSTONE 39886 + +#define SAY_RIZZLE_START "You, there! Hand over that moonstone and nobody gets hurt!" +#define SAY_RIZZLE_GRENADE "Just chill!" +#define SAY_RIZZLE_FINAL "All right, you win! I surrender! Just don't hurt me!" +//next message must be send to player when Rizzle jump into river, not implemented +#define MSG_ESCAPE_NOTICE "Rizzle Sprysprocket takes the Southfury moonstone and escapes into the river. Follow her!" + +float WPs[58][4] = +{ +//pos_x pos_y pos_z orien +{3691.97, -3962.41, 35.9118, 3.67}, +{3675.02, -3960.49, 35.9118, 3.67}, +{3653.19, -3958.33, 33.9118, 3.59}, +{3621.12, -3958.51, 29.9118, 3.48}, +{3604.86, -3963, 29.9118, 3.48}, +{3569.94, -3970.25, 29.9118, 3.44}, +{3541.03, -3975.64, 29.9118, 3.41}, +{3510.84, -3978.71, 29.9118, 3.41}, +{3472.7, -3997.07, 29.9118, 3.35}, +{3439.15, -4014.55, 29.9118, 3.29}, +{3412.8, -4025.87, 29.9118, 3.25}, +{3384.95, -4038.04, 29.9118, 3.24}, +{3346.77, -4052.93, 29.9118, 3.22}, +{3299.56, -4071.59, 29.9118, 3.20}, +{3261.22, -4080.38, 30.9118, 3.19}, +{3220.68, -4083.09, 31.9118, 3.18}, +{3187.11, -4070.45, 33.9118, 3.16}, +{3162.78, -4062.75, 33.9118, 3.15}, +{3136.09, -4050.32, 33.9118, 3.07}, +{3119.47, -4044.51, 36.0363, 3.07}, +{3098.95, -4019.8, 33.9118, 3.07}, +{3073.07, -4011.42, 33.9118, 3.07}, +{3051.71, -3993.37, 33.9118, 3.02}, +{3027.52, -3978.6, 33.9118, 3.00}, +{3003.78, -3960.14, 33.9118, 2.98}, +{2977.99, -3941.98, 31.9118, 2.96}, +{2964.57, -3932.07, 30.9118, 2.96}, +{2947.9, -3921.31, 29.9118, 2.96}, +{2924.91, -3910.8, 29.9118, 2.94}, +{2903.04, -3896.42, 29.9118, 2.93}, +{2884.75, -3874.03, 29.9118, 2.90}, +{2868.19, -3851.48, 29.9118, 2.82}, +{2854.62, -3819.72, 29.9118, 2.80}, +{2825.53, -3790.4, 29.9118, 2.744}, +{2804.31, -3773.05, 29.9118, 2.71}, +{2769.78, -3763.57, 29.9118, 2.70}, +{2727.23, -3745.92, 30.9118, 2.69}, +{2680.12, -3737.49, 30.9118, 2.67}, +{2647.62, -3739.94, 30.9118, 2.66}, +{2616.6, -3745.75, 30.9118, 2.64}, +{2589.38, -3731.97, 30.9118, 2.61}, +{2562.94, -3722.35, 31.9118, 2.56}, +{2521.05, -3716.6, 31.9118, 2.55}, +{2485.26, -3706.67, 31.9118, 2.51}, +{2458.93, -3696.67, 31.9118, 2.51}, +{2432, -3692.03, 31.9118, 2.46}, +{2399.59, -3681.97, 31.9118, 2.45}, +{2357.75, -3666.6, 31.9118, 2.44}, +{2311.99, -3656.88, 31.9118, 2.94}, +{2263.41, -3649.55, 31.9118, 3.02}, +{2209.05, -3641.76, 31.9118, 2.99}, +{2164.83, -3637.64, 31.9118, 3.15}, +{2122.42, -3639, 31.9118, 3.21}, +{2075.73, -3643.59, 31.9118, 3.22}, +{2033.59, -3649.52, 31.9118, 3.42}, +{1985.22, -3662.99, 31.9118, 3.42}, +{1927.09, -3679.56, 33.9118, 3.42}, +{1873.57, -3695.32, 33.9118, 3.44} +}; + + +struct TRINITY_DLL_DECL mob_rizzle_sprysprocketAI : public ScriptedAI +{ + mob_rizzle_sprysprocketAI(Creature *c) : ScriptedAI(c) {Reset();} + + uint32 spellEscape_Timer; + uint32 Teleport_Timer; + uint32 Check_Timer; + uint32 Grenade_Timer; + uint32 Must_Die_Timer; + uint32 CurrWP; + + uint64 PlayerGUID; + + bool Must_Die; + bool Escape; + bool ContinueWP; + bool Reached; + + void Reset() + { + spellEscape_Timer = 1300; + Teleport_Timer = 3500; + Check_Timer = 10000; + Grenade_Timer = 30000; + Must_Die_Timer = 3000; + CurrWP = 0; + + PlayerGUID = 0; + + Must_Die = false; + Escape = false; + ContinueWP = false; + Reached = false; + } + + void Despawn() + { + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + m_creature->RemoveCorpse(); + } + + void UpdateAI(const uint32 diff) + { + if(Must_Die) + if(Must_Die_Timer < diff) + { + Despawn(); + return; + } else Must_Die_Timer -= diff; + + if(!Escape) + { + if(!PlayerGUID) + return; + + if(spellEscape_Timer < diff) + { + DoCast(m_creature, SPELL_RIZZLE_ESCAPE, false); + spellEscape_Timer = 10000; + } else spellEscape_Timer -= diff; + + if(Teleport_Timer < diff) + { + //temp solution - unit can't be teleported by core using spelleffect 5, only players + Map *map = m_creature->GetMap(); + if(map) + { + map->CreatureRelocation(m_creature, 3706.39, -3969.15, 35.9118, 0); + m_creature->AI_SendMoveToPacket(3706.39, -3969.15, 35.9118, 0, 0, 0); + } + //begin swimming and summon depth charges + Player* player = ((Player*)Unit::GetUnit((*m_creature), PlayerGUID)); + SendText(MSG_ESCAPE_NOTICE, player); + DoCast(m_creature, SPELL_PERIODIC_DEPTH_CHARGE); + m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLYING2 | MOVEMENTFLAG_SWIMMING); + m_creature->SetSpeed(MOVE_RUN, 0.85f, true); + m_creature->GetMotionMaster()->MovementExpired(); + m_creature->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]); + Escape = true; + } else Teleport_Timer -= diff; + + return; + } + + if(ContinueWP) + { + m_creature->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]); + ContinueWP = false; + } + + if(Grenade_Timer < diff) + { + Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); + if(player) + { + DoWhisper(SAY_RIZZLE_GRENADE, player); + DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true); + } + Grenade_Timer = 30000; + } else Grenade_Timer -= diff; + + if(Check_Timer < diff) + { + Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); + if(!player) + { + Despawn(); + return; + } + float dist = m_creature->GetDistance(player); + if(dist < 10 && m_creature->GetPositionX() > player->GetPositionX() && !Reached) + { + DoYell(SAY_RIZZLE_FINAL, LANG_UNIVERSAL, NULL); + m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 1); + m_creature->setFaction(35); + m_creature->StopMoving(); + m_creature->GetMotionMaster()->MovementExpired(); + m_creature->GetMotionMaster()->Clear(true); + m_creature->RemoveAurasDueToSpell(SPELL_PERIODIC_DEPTH_CHARGE); + Reached = true; + } + + Check_Timer = 1000; + } else Check_Timer -= diff; + + } + + void SendText(const char *text, Player* player) + { + WorldPacket data(SMSG_SERVER_MESSAGE, 0); // guess size + data << text; + if(player) + player->GetSession()->SendPacket(&data); + } + + void AttackStart(Unit *who) + { + if (!who || PlayerGUID) + return; + + if(who->GetTypeId() == TYPEID_PLAYER && ((Player *)who)->GetQuestStatus(10994) == QUEST_STATUS_INCOMPLETE) + { + PlayerGUID = who->GetGUID(); + DoYell(SAY_RIZZLE_START, LANG_UNIVERSAL, NULL); + DoCast(who, SPELL_RIZZLE_BLACKJACK, false); + return; + } + } + + void Aggro(Unit* who) {} + + void MovementInform(uint32 type, uint32 id) + { + if (type != POINT_MOTION_TYPE) + return; + + if(id == 57) + { + Despawn(); + return; + } + + CurrWP++; + ContinueWP = true; + } + +}; + +bool GossipHello_mob_rizzle_sprysprocket(Player *player, Creature *_Creature) +{ + if(player->GetQuestStatus(10994) != QUEST_STATUS_INCOMPLETE) + return true; + player->ADD_GOSSIP_ITEM( 0, "Hand over the Southfury moonstone and I'll let you go.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); + player->SEND_GOSSIP_MENU(10811,_Creature->GetGUID()); + return true; +} + +bool GossipSelect_mob_rizzle_sprysprocket(Player *player, Creature *_Creature, uint32 sender, uint32 action ) +{ + if (action == GOSSIP_ACTION_INFO_DEF + 1 && player->GetQuestStatus(10994) == QUEST_STATUS_INCOMPLETE) + { + player->CLOSE_GOSSIP_MENU(); + _Creature->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true); + ((mob_rizzle_sprysprocketAI*)_Creature->AI())->Must_Die_Timer = 3000; + ((mob_rizzle_sprysprocketAI*)_Creature->AI())->Must_Die = true; + } + return true; +} + +CreatureAI* GetAI_mob_rizzle_sprysprocket(Creature *_Creature) +{ + return new mob_rizzle_sprysprocketAI (_Creature); +} + +/*#### +# mob_depth_charge +####*/ + +struct TRINITY_DLL_DECL mob_depth_chargeAI : public ScriptedAI +{ + mob_depth_chargeAI(Creature *c) : ScriptedAI(c) {Reset();} + + bool we_must_die; + uint32 must_die_timer; + + void Reset() + { + m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLYING2 | MOVEMENTFLAG_SWIMMING); + m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + we_must_die = false; + must_die_timer = 1000; + } + + void UpdateAI(const uint32 diff) + { + if(we_must_die) + if(must_die_timer < diff) + { + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + m_creature->RemoveCorpse(); + } else must_die_timer -= diff; + return; + } + + void MoveInLineOfSight(Unit *who) + { + if (!who) + return; + + if(who->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinDistInMap(who, 5)) + { + DoCast(who, SPELL_DEPTH_CHARGE_TRAP); + we_must_die = true; + return; + } + } + + void AttackStart(Unit *who) + { + return; + } + + void Aggro(Unit* who) + { + return; + } +}; + +CreatureAI* GetAI_mob_depth_charge(Creature *_Creature) +{ + return new mob_depth_chargeAI (_Creature); +} + void AddSC_azshara() { Script *newscript; @@ -161,4 +499,16 @@ void AddSC_azshara() newscript->pGossipHello = &GossipHello_npc_loramus_thalipedes; newscript->pGossipSelect = &GossipSelect_npc_loramus_thalipedes; m_scripts[nrscripts++] = newscript; + + newscript = new Script; + newscript->Name="mob_rizzle_sprysprocket"; + newscript->GetAI = GetAI_mob_rizzle_sprysprocket; + newscript->pGossipHello = &GossipHello_mob_rizzle_sprysprocket; + newscript->pGossipSelect = &GossipSelect_mob_rizzle_sprysprocket; + m_scripts[nrscripts++] = newscript; + + newscript = new Script; + newscript->Name="mob_depth_charge"; + newscript->GetAI = GetAI_mob_depth_charge; + m_scripts[nrscripts++] = newscript; } diff --git a/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp b/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp index 2e9ca764584..7ac2326327b 100644 --- a/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp +++ b/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp @@ -17,7 +17,7 @@ /* ScriptData SDName: Moonglade SD%Complete: 100 -SDComment: Quest support: 30, 272, 5929, 5930. Special Flight Paths for Druid class. +SDComment: Quest support: 30, 272, 5929, 5930, 10965. Special Flight Paths for Druid class. SDCategory: Moonglade EndScriptData */ @@ -25,9 +25,12 @@ EndScriptData */ npc_bunthen_plainswind npc_great_bear_spirit npc_silva_filnaveth +npc_clintar_spirit +npc_clintar_dreamwalker EndContentData */ #include "precompiled.h" +#include "../../npc/npc_escortAI.h" /*###### ## npc_bunthen_plainswind @@ -190,9 +193,350 @@ bool GossipSelect_npc_silva_filnaveth(Player *player, Creature *_Creature, uint3 } /*###### -## +## npc_clintar_spirit ######*/ +float Clintar_spirit_WP[41][5] = +{ + //pos_x pos_y pos_z orien waitTime +{7465.28, -3115.46, 439.327, 0.83, 4000}, +{7476.49, -3101, 443.457, 0.89, 0}, +{7486.57, -3085.59, 439.478, 1.07, 0}, +{7472.19, -3085.06, 443.142, 3.07, 0}, +{7456.92, -3085.91, 438.862, 3.24, 0}, +{7446.68, -3083.43, 438.245, 2.40, 0}, +{7446.17, -3080.21, 439.826, 1.10, 6000}, +{7452.41, -3085.8, 438.984, 5.78, 0}, +{7469.11, -3084.94, 443.048, 6.25, 0}, +{7483.79, -3085.44, 439.607, 6.25, 0}, +{7491.14, -3090.96, 439.983, 5.44, 0}, +{7497.62, -3098.22, 436.854, 5.44, 0}, +{7498.72, -3113.41, 434.596, 4.84, 0}, +{7500.06, -3122.51, 434.749, 5.17, 0}, +{7504.96, -3131.53, 434.475, 4.74, 0}, +{7504.31, -3133.53, 435.693, 3.84, 6000}, +{7504.55, -3133.27, 435.476, 0.68, 15000}, +{7501.99, -3126.01, 434.93, 1.83, 0}, +{7490.76, -3114.97, 434.431, 2.51, 0}, +{7479.64, -3105.51, 431.123, 1.83, 0}, +{7474.63, -3086.59, 428.994, 1.83, 2000}, +{7472.96, -3074.18, 427.566, 1.57, 0}, +{7472.25, -3063, 428.268, 1.55, 0}, +{7473.46, -3054.22, 427.588, 0.36, 0}, +{7475.08, -3053.6, 428.653, 0.36, 6000}, +{7474.66, -3053.56, 428.433, 3.19, 4000}, +{7471.81, -3058.84, 427.073, 4.29, 0}, +{7472.16, -3064.91, 427.772, 4.95, 0}, +{7471.56, -3085.36, 428.924, 4.72, 0}, +{7473.56, -3093.48, 429.294, 5.04, 0}, +{7478.94, -3104.29, 430.638, 5.23, 0}, +{7484.46, -3109.61, 432.769, 5.79, 0}, +{7490.23, -3111.08, 434.431, 0.02, 0}, +{7496.29, -3108, 434.783, 1.15, 0}, +{7497.46, -3100.66, 436.191, 1.50, 0}, +{7495.64, -3093.39, 438.349, 2.10, 0}, +{7492.44, -3086.01, 440.267, 1.38, 0}, +{7498.26, -3076.44, 440.808, 0.71, 0}, +{7506.4, -3067.35, 443.64, 0.77, 0}, +{7518.37, -3057.42, 445.584, 0.74, 0}, +{7517.51, -3056.3, 444.568, 2.49, 4500} +}; + +#define ASPECT_RAVEN 22915 +#define ASPECT_RAVEN_SUMMON_X 7472.96 +#define ASPECT_RAVEN_SUMMON_Y -3074.18 +#define ASPECT_RAVEN_SUMMON_Z 427.566 +#define CLINTAR_SPIRIT_SUMMON_X 7459.2275 +#define CLINTAR_SPIRIT_SUMMON_Y -3122.5632 +#define CLINTAR_SPIRIT_SUMMON_Z 438.9842 +#define CLINTAR_SPIRIT_SUMMON_O 0.8594 +#define CLINTAR_SPIRIT_SAY_START "A shadowy, sinister presence has invader the Emerald Dream. Its power is poised to spill over into our world, $N. We must oppose it! That's why I cannot accompany you in person." +#define CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1 "The Emerald Dream will never be yours!" +#define CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2 "Begone from this place!" +#define CLINTAR_SPIRIT_SAY_GET_ONE "That's the first relic, but there are still two more. Follow me, $N." +#define CLINTAR_SPIRIT_SAY_GET_TWO "I've recovered the second relic. Take a moment to rest, and then we'll continue to the last reliquary." +#define CLINTAR_SPIRIT_SAY_GET_THREE "We have all three of the relics, but my energy is rapidly fading. We must make our way back to Dreamwarden Lurosa! He will let you know what to do next." +#define CLINTAR_SPIRIT_SAY_GET_FINAL "Lurosa, I am entrusting the Relics of Aviana to $N, who will take them to Morthis Whisperwing. I must return completely to the Emerald Dream now. Do not let $N fail!" + +struct TRINITY_DLL_DECL npc_clintar_spiritAI : public npc_escortAI +{ +public: + npc_clintar_spiritAI(Creature *c) : npc_escortAI(c) {Reset(); } + + uint32 Step; + uint32 CurrWP; + uint32 Event_Timer; + uint32 checkPlayer_Timer; + + uint64 PlayerGUID; + + bool Event_onWait; + + void Reset() + { + if(!PlayerGUID) + { + Step = 0; + CurrWP = 0; + Event_Timer = 0; + PlayerGUID = 0; + checkPlayer_Timer = 1000; + Event_onWait = false; + } + } + + void JustDied(Unit *killer) + { + if(!PlayerGUID) + return; + Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); + if(player && player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) + { + player->FailQuest(10965); + PlayerGUID = 0; + Reset(); + } + } + + void EnterEvadeMode() + { + Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); + if(player && player->isInCombat() && player->getAttackerForHelper()) + { + AttackStart(player->getAttackerForHelper()); + return; + } + npc_escortAI::EnterEvadeMode(); + } + + void Aggro(Unit* who) + { + uint32 rnd = rand()%2; + switch(rnd) + { + case 0: + m_creature->Say(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1, 0, who->GetGUID()); + break; + case 1: + m_creature->Say(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2, 0,who->GetGUID()); + break; + } + } + + void StartEvent(Player *player) + { + if(!player) + return; + if(player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) + { + for(uint8 i = 0; i < 41; i++) + { + AddWaypoint(i, Clintar_spirit_WP[i][0], Clintar_spirit_WP[i][1], Clintar_spirit_WP[i][2], (uint32)Clintar_spirit_WP[i][4]); + } + PlayerGUID = player->GetGUID(); + Start(true,true,false,PlayerGUID); + } + return; + } + + void UpdateAI(const uint32 diff) + { + npc_escortAI::UpdateAI(diff); + + if(!PlayerGUID) + { + m_creature->setDeathState(JUST_DIED); + return; + } + + if(!InCombat && !Event_onWait && checkPlayer_Timer < diff) + { + Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); + if(player && player->isInCombat() && player->getAttackerForHelper()) + AttackStart(player->getAttackerForHelper()); + checkPlayer_Timer = 1000; + } else if(!InCombat && !Event_onWait) checkPlayer_Timer -= diff; + + if(Event_onWait && Event_Timer < diff) + { + + Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); + if(!player || (player && player->GetQuestStatus(10965) == QUEST_STATUS_NONE)) + { + m_creature->setDeathState(JUST_DIED); + return; + } + + switch(CurrWP) + { + case 0: + switch(Step) + { + case 0: + m_creature->Say(CLINTAR_SPIRIT_SAY_START,0,PlayerGUID); + Event_Timer = 8000; + Step = 1; + break; + case 1: + Event_onWait = false; + break; + } + break; + case 6: + switch(Step) + { + case 0: + m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); + Event_Timer = 5000; + Step = 1; + break; + case 1: + m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + m_creature->Say(CLINTAR_SPIRIT_SAY_GET_ONE,0,PlayerGUID); + Event_onWait = false; + break; + } + break; + case 15: + switch(Step) + { + case 0: + m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); + Event_Timer = 5000; + Step = 1; + break; + case 1: + m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + Event_onWait = false; + break; + } + break; + case 16: + switch(Step) + { + case 0: + m_creature->Say(CLINTAR_SPIRIT_SAY_GET_TWO,0,PlayerGUID); + Event_Timer = 15000; + Step = 1; + break; + case 1: + Event_onWait = false; + break; + } + break; + case 20: + switch(Step) + { + case 0: + { + Creature *mob = m_creature->SummonCreature(ASPECT_RAVEN, ASPECT_RAVEN_SUMMON_X, ASPECT_RAVEN_SUMMON_Y, ASPECT_RAVEN_SUMMON_Z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 2000); + if(mob) + { + mob->AddThreat(m_creature,10000.0f); + mob->AI()->AttackStart(m_creature); + } + Event_Timer = 2000; + Step = 1; + break; + } + case 1: + Event_onWait = false; + break; + } + break; + case 24: + switch(Step) + { + case 0: + m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); + Event_Timer = 5000; + Step = 1; + break; + case 1: + m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + Event_onWait = false; + break; + } + break; + case 25: + switch(Step) + { + case 0: + m_creature->Say(CLINTAR_SPIRIT_SAY_GET_THREE, 0, PlayerGUID); + Event_Timer = 4000; + Step = 1; + break; + case 1: + Event_onWait = false; + break; + } + break; + case 40: + switch(Step) + { + case 0: + m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 2); + m_creature->Say(CLINTAR_SPIRIT_SAY_GET_FINAL, 0, PlayerGUID); + player->CompleteQuest(10965); + Event_Timer = 1500; + Step = 1; + break; + case 1: + m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); + Event_Timer = 3000; + Step = 2; + break; + case 2: + player->TalkedToCreature(m_creature->GetEntry(), m_creature->GetGUID()); + PlayerGUID = 0; + Reset(); + m_creature->setDeathState(JUST_DIED); + break; + } + break; + default: + Event_onWait = false; + break; + } + + } else if(Event_onWait) Event_Timer -= diff; + } + + void WaypointReached(uint32 id) + { + CurrWP = id; + Event_Timer = 0; + Step = 0; + Event_onWait = true; + } +}; + +CreatureAI* GetAI_npc_clintar_spirit(Creature *_Creature) +{ + return new npc_clintar_spiritAI (_Creature); +} + +/*#### +# npc_clintar_dreamwalker +####*/ + +#define CLINTAR_SPIRIT 22916 + +bool QuestAccept_npc_clintar_dreamwalker(Player *player, Creature *creature, Quest const *quest ) +{ + if(quest->GetQuestId() == 10965) + { + Creature *clintar_spirit = creature->SummonCreature(CLINTAR_SPIRIT, CLINTAR_SPIRIT_SUMMON_X, CLINTAR_SPIRIT_SUMMON_Y, CLINTAR_SPIRIT_SUMMON_Z, CLINTAR_SPIRIT_SUMMON_O, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 100000); + if(clintar_spirit) + ((npc_clintar_spiritAI*)clintar_spirit->AI())->StartEvent(player); + } + return true; +} + +/*#### +# +####*/ + void AddSC_moonglade() { Script *newscript; @@ -214,4 +558,14 @@ void AddSC_moonglade() newscript->pGossipHello = &GossipHello_npc_silva_filnaveth; newscript->pGossipSelect = &GossipSelect_npc_silva_filnaveth; m_scripts[nrscripts++] = newscript; + + newscript = new Script; + newscript->Name="npc_clintar_dreamwalker"; + newscript->pQuestAccept = &QuestAccept_npc_clintar_dreamwalker; + m_scripts[nrscripts++] = newscript; + + newscript = new Script; + newscript->Name="npc_clintar_spirit"; + newscript->GetAI = GetAI_npc_clintar_spirit; + m_scripts[nrscripts++] = newscript; } diff --git a/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp b/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp index 9255575a2e9..dcd3f57bef3 100644 --- a/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp +++ b/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp @@ -17,7 +17,7 @@ /* ScriptData SDName: Nagrand SD%Complete: 90 -SDComment: Quest support: 9849, 9918, 9874, 9991, 10107, 10108, 10044, 10172, 10646, 10085. TextId's unknown for altruis_the_sufferer and greatmother_geyah (npc_text) +SDComment: Quest support: 9849, 9918, 9874, 9991, 10107, 10108, 10044, 10172, 10646, 10085, 10987. TextId's unknown for altruis_the_sufferer and greatmother_geyah (npc_text) SDCategory: Nagrand EndScriptData */ @@ -29,6 +29,7 @@ npc_altruis_the_sufferer npc_greatmother_geyah npc_lantresor_of_the_blade npc_creditmarker_visit_with_ancestors +mob_sparrowhawk EndContentData */ #include "precompiled.h" @@ -518,9 +519,111 @@ CreatureAI* GetAI_npc_creditmarker_visit_with_ancestors(Creature *_Creature) } /*###### -## AddSC +## mob_sparrowhawk ######*/ +#define SPELL_SPARROWHAWK_NET 39810 +#define SPELL_ITEM_CAPTIVE_SPARROWHAWK 39812 + +struct TRINITY_DLL_DECL mob_sparrowhawkAI : public ScriptedAI +{ + + mob_sparrowhawkAI(Creature *c) : ScriptedAI(c) {Reset();} + + uint32 Check_Timer; + uint64 PlayerGUID; + bool fleeing; + + void Reset() + { + m_creature->RemoveAurasDueToSpell(SPELL_SPARROWHAWK_NET); + Check_Timer = 1000; + PlayerGUID = 0; + fleeing = false; + } + void AttackStart(Unit *who) + { + if(PlayerGUID) + return; + + ScriptedAI::AttackStart(who); + } + + void Aggro(Unit* who) {} + + void MoveInLineOfSight(Unit *who) + { + if(!who || PlayerGUID) + return; + + if(!PlayerGUID && who->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinDistInMap(((Player *)who), 30) && ((Player *)who)->GetQuestStatus(10987) == QUEST_STATUS_INCOMPLETE) + { + PlayerGUID = who->GetGUID(); + return; + } + + ScriptedAI::MoveInLineOfSight(who); + } + + void UpdateAI(const uint32 diff) + { + if(Check_Timer < diff) + { + if(PlayerGUID) + { + if(fleeing && m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != FLEEING_MOTION_TYPE) + fleeing = false; + + Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); + if(player && m_creature->IsWithinDistInMap(player, 30)/* && m_creature->CanFreeMove()*/) + { + if(!fleeing) + { + m_creature->DeleteThreatList(); + m_creature->GetMotionMaster()->MoveFleeing(player); + fleeing = true; + } + } + else if(fleeing) + { + m_creature->GetMotionMaster()->MovementExpired(false); + PlayerGUID = 0; + fleeing = false; + } + } + Check_Timer = 1000; + } else Check_Timer -= diff; + + if (PlayerGUID) + return; + + ScriptedAI::UpdateAI(diff); + } + + void SpellHit(Unit *caster, const SpellEntry *spell) + { + if (caster->GetTypeId() == TYPEID_PLAYER) + { + if(spell->Id == SPELL_SPARROWHAWK_NET && ((Player*)caster)->GetQuestStatus(10987) == QUEST_STATUS_INCOMPLETE) + { + m_creature->CastSpell(caster, SPELL_ITEM_CAPTIVE_SPARROWHAWK, true); + m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); + m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); + } + } + return; + } +}; + +CreatureAI* GetAI_mob_sparrowhawk(Creature *_Creature) +{ + return new mob_sparrowhawkAI (_Creature); +} + +/*#### +# +####*/ + void AddSC_nagrand() { Script *newscript; @@ -565,4 +668,9 @@ void AddSC_nagrand() newscript->Name="npc_creditmarker_visit_with_ancestors"; newscript->GetAI = GetAI_npc_creditmarker_visit_with_ancestors; m_scripts[nrscripts++] = newscript; + + newscript = new Script; + newscript->Name="mob_sparrowhawk"; + newscript->GetAI = GetAI_mob_sparrowhawk; + m_scripts[nrscripts++] = newscript; } diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp index 895faaad107..477aab20241 100644 --- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp +++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp @@ -173,7 +173,7 @@ struct TRINITY_DLL_DECL boss_high_astromancer_solarianAI : public ScriptedAI DoPlaySoundToSet(m_creature, SOUND_DEATH); if(pInstance) - pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, NOT_STARTED); + pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, DONE); } void Aggro(Unit *who) diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp index 4081882d1c9..1792a691604 100644 --- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp +++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp @@ -385,7 +385,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); if(pInstance) - pInstance->SetData(DATA_KAELTHASEVENT, 0); + pInstance->SetData(DATA_KAELTHASEVENT, NOT_STARTED); } void PrepareAdvisors() @@ -441,7 +441,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI DoYell(SAY_INTRO, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_INTRO); - pInstance->SetData(DATA_KAELTHASEVENT, 1); + pInstance->SetData(DATA_KAELTHASEVENT, IN_PROGRESS); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); PhaseSubphase = 0; @@ -474,7 +474,7 @@ struct TRINITY_DLL_DECL boss_kaelthasAI : public ScriptedAI DoPlaySoundToSet(m_creature,SOUND_DEATH); if(pInstance) - pInstance->SetData(DATA_KAELTHASEVENT, 0); + pInstance->SetData(DATA_KAELTHASEVENT, DONE); Creature *pCreature; for(uint8 i = 0; i < 4; i++) diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp index cb1bf3d4375..406e7e4d9ab 100644 --- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp +++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp @@ -99,7 +99,7 @@ struct TRINITY_DLL_DECL boss_void_reaverAI : public ScriptedAI DoPlaySoundToSet(m_creature, SOUND_DEATH); if(pInstance) - pInstance->SetData(DATA_VOIDREAVEREVENT, NOT_STARTED); + pInstance->SetData(DATA_VOIDREAVEREVENT, DONE); } void Aggro(Unit *who) diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h index d2b3fd61f18..2a6492fdd74 100644 --- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h +++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h @@ -9,13 +9,11 @@ #define DATA_ASTROMANCER 2 #define DATA_GRANDASTROMANCERCAPERNIAN 3 #define DATA_HIGHASTROMANCERSOLARIANEVENT 4 -#define DATA_FATHOMLORDKARATHRESSEVENT 5 -#define DATA_KAELTHAS 6 -#define DATA_KAELTHASEVENT 7 -#define DATA_LORDSANGUINAR 8 -#define DATA_MASTERENGINEERTELONICUS 9 -#define DATA_SOLARIANEVENT 10 -#define DATA_THALADREDTHEDARKENER 11 -#define DATA_VOIDREAVEREVENT 12 -#define DATA_ALAR 13 +#define DATA_KAELTHAS 5 +#define DATA_KAELTHASEVENT 6 +#define DATA_LORDSANGUINAR 7 +#define DATA_MASTERENGINEERTELONICUS 8 +#define DATA_THALADREDTHEDARKENER 10 +#define DATA_VOIDREAVEREVENT 11 +#define DATA_ALAR 12 #endif diff --git a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp index d4dfcd82752..3f1316d45e8 100644 --- a/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp +++ b/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp @@ -85,10 +85,7 @@ struct TRINITY_DLL_DECL instance_the_eye : public ScriptedInstance case 20060: LordSanguinar = creature->GetGUID(); break; case 19622: Kaelthas = creature->GetGUID(); break; case 18805: Astromancer = creature->GetGUID(); break; - - case 19514: - Alar = creature->GetGUID(); - break; + case 19514: Alar = creature->GetGUID(); break; } } @@ -96,28 +93,14 @@ struct TRINITY_DLL_DECL instance_the_eye : public ScriptedInstance { switch(identifier) { - case DATA_THALADREDTHEDARKENER: - return ThaladredTheDarkener; - - case DATA_LORDSANGUINAR: - return LordSanguinar; - - case DATA_GRANDASTROMANCERCAPERNIAN: - return GrandAstromancerCapernian; - - case DATA_MASTERENGINEERTELONICUS: - return MasterEngineerTelonicus; - - case DATA_KAELTHAS: - return Kaelthas; - - case DATA_ASTROMANCER: - return Astromancer; - - case DATA_ALAR: - return Alar; + case DATA_THALADREDTHEDARKENER: return ThaladredTheDarkener; + case DATA_LORDSANGUINAR: return LordSanguinar; + case DATA_GRANDASTROMANCERCAPERNIAN: return GrandAstromancerCapernian; + case DATA_MASTERENGINEERTELONICUS: return MasterEngineerTelonicus; + case DATA_KAELTHAS: return Kaelthas; + case DATA_ASTROMANCER: return Astromancer; + case DATA_ALAR: return Alar; } - return 0; } @@ -125,53 +108,56 @@ struct TRINITY_DLL_DECL instance_the_eye : public ScriptedInstance { switch(type) { - case DATA_ALAREVENT: - AlarEventPhase = data; - Encounters[0] = (data) ? true : false; - break; - - case DATA_SOLARIANEVENT: - Encounters[1] = (data) ? true : false; - break; - - case DATA_VOIDREAVEREVENT: - Encounters[2] = (data) ? true : false; - break; - - //Kael'thas - case DATA_KAELTHASEVENT: - KaelthasEventPhase = data; - Encounters[3] = (data) ? true : false; - break; - - case DATA_HIGHASTROMANCERSOLARIANEVENT: - Encounters[4] = (data) ? true : false; - break; + case DATA_ALAREVENT: AlarEventPhase = data; Encounters[0] = data; break; + case DATA_HIGHASTROMANCERSOLARIANEVENT: Encounters[1] = data; break; + case DATA_VOIDREAVEREVENT: Encounters[2] = data; break; + case DATA_KAELTHASEVENT: KaelthasEventPhase = data; Encounters[3] = data; break; } + if(data == DONE) + SaveToDB(); } uint32 GetData(uint32 type) { switch(type) { - case DATA_ALAREVENT: - return AlarEventPhase; - - case DATA_SOLARIANEVENT: - return Encounters[1]; - - case DATA_VOIDREAVEREVENT: - return Encounters[2]; - - case DATA_HIGHASTROMANCERSOLARIANEVENT: - return Encounters[4]; + case DATA_ALAREVENT: return AlarEventPhase; + case DATA_HIGHASTROMANCERSOLARIANEVENT: return Encounters[1]; + case DATA_VOIDREAVEREVENT: return Encounters[2]; + case DATA_KAELTHASEVENT: return KaelthasEventPhase; + } + return 0; + } - //Kael'thas - case DATA_KAELTHASEVENT: - return KaelthasEventPhase; + const char* Save() + { + OUT_SAVE_INST_DATA; + std::ostringstream stream; + stream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " " << Encounters[3]; + char* out = new char[stream.str().length() + 1]; + strcpy(out, stream.str().c_str()); + if(out) + { + OUT_SAVE_INST_DATA_COMPLETE; + return out; } + return NULL; + } - return 0; + void Load(const char* in) + { + if(!in) + { + OUT_LOAD_INST_DATA_FAIL; + return; + } + OUT_LOAD_INST_DATA(in); + std::istringstream stream(in); + stream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3]; + for(uint8 i = 0; i < ENCOUNTERS; ++i) + if(Encounters[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead. + Encounters[i] = NOT_STARTED; + OUT_LOAD_INST_DATA_COMPLETE; } }; |