Changeset 204

Show
Ignore:
Timestamp:
11/19/08 13:46:06 (17 years ago)
Author:
yumileroy
Message:

[svn] Add Druid swift flight form quest scripts. Patch provided by Blaymoria.
Update tempest keep scripts. Patch provided by Blaymoria.

Original author: megamage
Date: 2008-11-09 15:17:38-06:00

Location:
trunk
Files:
1 added
8 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/bindings/scripts/scripts/zone/azshara/azshara.cpp

    r90 r204  
    1818SDName: Azshara 
    1919SD%Complete: 90 
    20 SDComment: Quest support: 2744, 3141, 9364 
     20SDComment: Quest support: 2744, 3141, 9364, 10994 
    2121SDCategory: Azshara 
    2222EndScriptData */ 
     
    2525mobs_spitelashes 
    2626npc_loramus_thalipedes 
     27mob_rizzle_sprysprocket 
     28mob_depth_charge 
    2729EndContentData */ 
    2830 
    2931#include "precompiled.h" 
     32#include "World.h" 
     33#include "WorldPacket.h" 
    3034 
    3135/*###### 
     
    146150    } 
    147151    return true; 
     152} 
     153 
     154/*#### 
     155# mob_rizzle_sprysprocket 
     156####*/ 
     157#define MOB_DEPTH_CHARGE 23025 
     158#define SPELL_RIZZLE_BLACKJACK 39865 
     159#define SPELL_RIZZLE_ESCAPE 39871 
     160#define SPELL_RIZZLE_FROST_GRENADE 40525 
     161#define SPELL_DEPTH_CHARGE_TRAP 38576 
     162#define SPELL_PERIODIC_DEPTH_CHARGE 39912 
     163#define SPELL_GIVE_SOUTHFURY_MOONSTONE 39886 
     164 
     165#define SAY_RIZZLE_START "You, there! Hand over that moonstone and nobody gets hurt!" 
     166#define SAY_RIZZLE_GRENADE "Just chill!" 
     167#define SAY_RIZZLE_FINAL "All right, you win! I surrender! Just don't hurt me!" 
     168//next message must be send to player when Rizzle jump into river, not implemented 
     169#define MSG_ESCAPE_NOTICE "Rizzle Sprysprocket takes the Southfury moonstone and escapes into the river. Follow her!" 
     170 
     171float WPs[58][4] = 
     172{ 
     173//pos_x   pos_y     pos_z    orien 
     174{3691.97, -3962.41, 35.9118, 3.67}, 
     175{3675.02, -3960.49, 35.9118, 3.67}, 
     176{3653.19, -3958.33, 33.9118, 3.59}, 
     177{3621.12, -3958.51, 29.9118, 3.48}, 
     178{3604.86, -3963,    29.9118, 3.48}, 
     179{3569.94, -3970.25, 29.9118, 3.44}, 
     180{3541.03, -3975.64, 29.9118, 3.41}, 
     181{3510.84, -3978.71, 29.9118, 3.41}, 
     182{3472.7,  -3997.07, 29.9118, 3.35}, 
     183{3439.15, -4014.55, 29.9118, 3.29}, 
     184{3412.8,  -4025.87, 29.9118, 3.25}, 
     185{3384.95, -4038.04, 29.9118, 3.24}, 
     186{3346.77, -4052.93, 29.9118, 3.22}, 
     187{3299.56, -4071.59, 29.9118, 3.20}, 
     188{3261.22, -4080.38, 30.9118, 3.19}, 
     189{3220.68, -4083.09, 31.9118, 3.18}, 
     190{3187.11, -4070.45, 33.9118, 3.16}, 
     191{3162.78, -4062.75, 33.9118, 3.15}, 
     192{3136.09, -4050.32, 33.9118, 3.07}, 
     193{3119.47, -4044.51, 36.0363, 3.07}, 
     194{3098.95, -4019.8,  33.9118, 3.07}, 
     195{3073.07, -4011.42, 33.9118, 3.07}, 
     196{3051.71, -3993.37, 33.9118, 3.02}, 
     197{3027.52, -3978.6,  33.9118, 3.00}, 
     198{3003.78, -3960.14, 33.9118, 2.98}, 
     199{2977.99, -3941.98, 31.9118, 2.96}, 
     200{2964.57, -3932.07, 30.9118, 2.96}, 
     201{2947.9,  -3921.31, 29.9118, 2.96}, 
     202{2924.91, -3910.8,  29.9118, 2.94}, 
     203{2903.04, -3896.42, 29.9118, 2.93}, 
     204{2884.75, -3874.03, 29.9118, 2.90}, 
     205{2868.19, -3851.48, 29.9118, 2.82}, 
     206{2854.62, -3819.72, 29.9118, 2.80}, 
     207{2825.53, -3790.4,  29.9118, 2.744}, 
     208{2804.31, -3773.05, 29.9118, 2.71}, 
     209{2769.78, -3763.57, 29.9118, 2.70}, 
     210{2727.23, -3745.92, 30.9118, 2.69}, 
     211{2680.12, -3737.49, 30.9118, 2.67}, 
     212{2647.62, -3739.94, 30.9118, 2.66}, 
     213{2616.6,  -3745.75, 30.9118, 2.64}, 
     214{2589.38, -3731.97, 30.9118, 2.61}, 
     215{2562.94, -3722.35, 31.9118, 2.56}, 
     216{2521.05, -3716.6,  31.9118, 2.55}, 
     217{2485.26, -3706.67, 31.9118, 2.51}, 
     218{2458.93, -3696.67, 31.9118, 2.51}, 
     219{2432,    -3692.03, 31.9118, 2.46}, 
     220{2399.59, -3681.97, 31.9118, 2.45}, 
     221{2357.75, -3666.6,  31.9118, 2.44}, 
     222{2311.99, -3656.88, 31.9118, 2.94}, 
     223{2263.41, -3649.55, 31.9118, 3.02}, 
     224{2209.05, -3641.76, 31.9118, 2.99}, 
     225{2164.83, -3637.64, 31.9118, 3.15}, 
     226{2122.42, -3639,    31.9118, 3.21}, 
     227{2075.73, -3643.59, 31.9118, 3.22}, 
     228{2033.59, -3649.52, 31.9118, 3.42}, 
     229{1985.22, -3662.99, 31.9118, 3.42}, 
     230{1927.09, -3679.56, 33.9118, 3.42}, 
     231{1873.57, -3695.32, 33.9118, 3.44} 
     232}; 
     233 
     234 
     235struct TRINITY_DLL_DECL mob_rizzle_sprysprocketAI : public ScriptedAI 
     236{ 
     237    mob_rizzle_sprysprocketAI(Creature *c) : ScriptedAI(c) {Reset();} 
     238 
     239    uint32 spellEscape_Timer; 
     240    uint32 Teleport_Timer; 
     241    uint32 Check_Timer; 
     242    uint32 Grenade_Timer; 
     243    uint32 Must_Die_Timer; 
     244    uint32 CurrWP; 
     245 
     246    uint64 PlayerGUID; 
     247 
     248    bool Must_Die; 
     249    bool Escape; 
     250    bool ContinueWP; 
     251        bool Reached; 
     252 
     253    void Reset() 
     254    { 
     255        spellEscape_Timer = 1300; 
     256        Teleport_Timer = 3500; 
     257        Check_Timer = 10000; 
     258        Grenade_Timer = 30000; 
     259        Must_Die_Timer = 3000; 
     260        CurrWP = 0; 
     261 
     262        PlayerGUID = 0; 
     263 
     264        Must_Die = false; 
     265        Escape = false; 
     266        ContinueWP = false; 
     267                Reached = false; 
     268    } 
     269 
     270    void Despawn() 
     271    { 
     272        m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); 
     273        m_creature->RemoveCorpse(); 
     274    } 
     275 
     276    void UpdateAI(const uint32 diff) 
     277    { 
     278        if(Must_Die) 
     279            if(Must_Die_Timer < diff) 
     280            { 
     281                Despawn(); 
     282                return; 
     283            } else Must_Die_Timer -= diff; 
     284 
     285        if(!Escape) 
     286        { 
     287            if(!PlayerGUID) 
     288                return; 
     289 
     290            if(spellEscape_Timer < diff) 
     291            { 
     292                DoCast(m_creature, SPELL_RIZZLE_ESCAPE, false); 
     293                spellEscape_Timer = 10000; 
     294            } else spellEscape_Timer -= diff; 
     295 
     296            if(Teleport_Timer < diff) 
     297            { 
     298                //temp solution - unit can't be teleported by core using spelleffect 5, only players 
     299                Map *map = m_creature->GetMap(); 
     300                if(map) 
     301                { 
     302                    map->CreatureRelocation(m_creature, 3706.39, -3969.15, 35.9118, 0); 
     303                    m_creature->AI_SendMoveToPacket(3706.39, -3969.15, 35.9118, 0, 0, 0); 
     304                } 
     305                //begin swimming and summon depth charges 
     306                                Player* player = ((Player*)Unit::GetUnit((*m_creature), PlayerGUID)); 
     307                                SendText(MSG_ESCAPE_NOTICE, player); 
     308                DoCast(m_creature, SPELL_PERIODIC_DEPTH_CHARGE); 
     309                m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLYING2 | MOVEMENTFLAG_SWIMMING); 
     310                m_creature->SetSpeed(MOVE_RUN, 0.85f, true); 
     311                m_creature->GetMotionMaster()->MovementExpired(); 
     312                m_creature->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]); 
     313                Escape = true; 
     314            } else Teleport_Timer -= diff; 
     315 
     316            return; 
     317        } 
     318 
     319        if(ContinueWP) 
     320        { 
     321            m_creature->GetMotionMaster()->MovePoint(CurrWP, WPs[CurrWP][0], WPs[CurrWP][1], WPs[CurrWP][2]); 
     322            ContinueWP = false; 
     323        } 
     324 
     325        if(Grenade_Timer < diff) 
     326        { 
     327            Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); 
     328            if(player) 
     329            { 
     330               DoWhisper(SAY_RIZZLE_GRENADE, player); 
     331               DoCast(player, SPELL_RIZZLE_FROST_GRENADE, true); 
     332            } 
     333            Grenade_Timer = 30000; 
     334        } else Grenade_Timer -= diff; 
     335 
     336                if(Check_Timer < diff) 
     337        { 
     338            Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); 
     339            if(!player) 
     340            { 
     341                Despawn(); 
     342                return; 
     343            } 
     344            float dist = m_creature->GetDistance(player); 
     345                        if(dist < 10 && m_creature->GetPositionX() > player->GetPositionX() && !Reached) 
     346            { 
     347                DoYell(SAY_RIZZLE_FINAL, LANG_UNIVERSAL, NULL); 
     348                m_creature->SetUInt32Value(UNIT_NPC_FLAGS, 1); 
     349                                m_creature->setFaction(35); 
     350                m_creature->StopMoving(); 
     351                m_creature->GetMotionMaster()->MovementExpired(); 
     352                                m_creature->GetMotionMaster()->Clear(true); 
     353                m_creature->RemoveAurasDueToSpell(SPELL_PERIODIC_DEPTH_CHARGE); 
     354                                Reached = true; 
     355            } 
     356 
     357            Check_Timer = 1000; 
     358        } else Check_Timer -= diff; 
     359 
     360    } 
     361 
     362        void SendText(const char *text, Player* player) 
     363        { 
     364                WorldPacket data(SMSG_SERVER_MESSAGE, 0);              // guess size 
     365                data << text; 
     366                if(player) 
     367                        player->GetSession()->SendPacket(&data); 
     368        } 
     369 
     370    void AttackStart(Unit *who) 
     371    {         
     372        if (!who || PlayerGUID) 
     373            return; 
     374 
     375        if(who->GetTypeId() == TYPEID_PLAYER && ((Player *)who)->GetQuestStatus(10994) == QUEST_STATUS_INCOMPLETE) 
     376        { 
     377            PlayerGUID = who->GetGUID(); 
     378            DoYell(SAY_RIZZLE_START, LANG_UNIVERSAL, NULL); 
     379            DoCast(who, SPELL_RIZZLE_BLACKJACK, false); 
     380            return; 
     381        } 
     382    } 
     383 
     384    void Aggro(Unit* who) {} 
     385 
     386    void MovementInform(uint32 type, uint32 id) 
     387    { 
     388        if (type != POINT_MOTION_TYPE) 
     389            return; 
     390 
     391        if(id == 57) 
     392        { 
     393            Despawn(); 
     394            return; 
     395        } 
     396 
     397        CurrWP++; 
     398        ContinueWP = true; 
     399    } 
     400 
     401}; 
     402 
     403bool GossipHello_mob_rizzle_sprysprocket(Player *player, Creature *_Creature) 
     404{ 
     405    if(player->GetQuestStatus(10994) != QUEST_STATUS_INCOMPLETE) 
     406        return true; 
     407    player->ADD_GOSSIP_ITEM( 0, "Hand over the Southfury moonstone and I'll let you go.", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); 
     408    player->SEND_GOSSIP_MENU(10811,_Creature->GetGUID()); 
     409    return true; 
     410} 
     411 
     412bool GossipSelect_mob_rizzle_sprysprocket(Player *player, Creature *_Creature, uint32 sender, uint32 action ) 
     413{ 
     414    if (action == GOSSIP_ACTION_INFO_DEF + 1 && player->GetQuestStatus(10994) == QUEST_STATUS_INCOMPLETE) 
     415    { 
     416        player->CLOSE_GOSSIP_MENU(); 
     417        _Creature->CastSpell(player, SPELL_GIVE_SOUTHFURY_MOONSTONE, true); 
     418        ((mob_rizzle_sprysprocketAI*)_Creature->AI())->Must_Die_Timer = 3000; 
     419        ((mob_rizzle_sprysprocketAI*)_Creature->AI())->Must_Die = true; 
     420    } 
     421    return true; 
     422} 
     423 
     424CreatureAI* GetAI_mob_rizzle_sprysprocket(Creature *_Creature) 
     425{ 
     426    return new mob_rizzle_sprysprocketAI (_Creature); 
     427} 
     428 
     429/*#### 
     430# mob_depth_charge 
     431####*/ 
     432 
     433struct TRINITY_DLL_DECL mob_depth_chargeAI : public ScriptedAI 
     434{ 
     435    mob_depth_chargeAI(Creature *c) : ScriptedAI(c) {Reset();} 
     436 
     437    bool we_must_die; 
     438    uint32 must_die_timer; 
     439 
     440    void Reset() 
     441    { 
     442        m_creature->SetUnitMovementFlags(MOVEMENTFLAG_FLYING2 | MOVEMENTFLAG_SWIMMING); 
     443                m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); 
     444        we_must_die = false; 
     445        must_die_timer = 1000; 
     446    } 
     447  
     448    void UpdateAI(const uint32 diff) 
     449    { 
     450        if(we_must_die) 
     451            if(must_die_timer < diff) 
     452            { 
     453                m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); 
     454                m_creature->RemoveCorpse(); 
     455            } else must_die_timer -= diff; 
     456        return; 
     457    } 
     458 
     459    void MoveInLineOfSight(Unit *who) 
     460    { 
     461        if (!who) 
     462            return; 
     463 
     464        if(who->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinDistInMap(who, 5)) 
     465        { 
     466            DoCast(who, SPELL_DEPTH_CHARGE_TRAP); 
     467            we_must_die = true; 
     468            return; 
     469        } 
     470    } 
     471  
     472    void AttackStart(Unit *who) 
     473    {         
     474        return; 
     475    } 
     476 
     477    void Aggro(Unit* who) 
     478        { 
     479        return; 
     480        } 
     481}; 
     482 
     483CreatureAI* GetAI_mob_depth_charge(Creature *_Creature) 
     484{ 
     485    return new mob_depth_chargeAI (_Creature); 
    148486} 
    149487 
     
    162500    newscript->pGossipSelect = &GossipSelect_npc_loramus_thalipedes; 
    163501    m_scripts[nrscripts++] = newscript; 
    164 } 
     502 
     503        newscript = new Script; 
     504    newscript->Name="mob_rizzle_sprysprocket"; 
     505    newscript->GetAI = GetAI_mob_rizzle_sprysprocket; 
     506    newscript->pGossipHello =  &GossipHello_mob_rizzle_sprysprocket; 
     507    newscript->pGossipSelect = &GossipSelect_mob_rizzle_sprysprocket; 
     508    m_scripts[nrscripts++] = newscript; 
     509 
     510    newscript = new Script; 
     511    newscript->Name="mob_depth_charge"; 
     512    newscript->GetAI = GetAI_mob_depth_charge; 
     513    m_scripts[nrscripts++] = newscript; 
     514} 
  • trunk/src/bindings/scripts/scripts/zone/moonglade/moonglade.cpp

    r90 r204  
    1818SDName: Moonglade 
    1919SD%Complete: 100 
    20 SDComment: Quest support: 30, 272, 5929, 5930. Special Flight Paths for Druid class. 
     20SDComment: Quest support: 30, 272, 5929, 5930, 10965. Special Flight Paths for Druid class. 
    2121SDCategory: Moonglade 
    2222EndScriptData */ 
     
    2626npc_great_bear_spirit 
    2727npc_silva_filnaveth 
     28npc_clintar_spirit 
     29npc_clintar_dreamwalker 
    2830EndContentData */ 
    2931 
    3032#include "precompiled.h" 
     33#include "../../npc/npc_escortAI.h" 
    3134 
    3235/*###### 
     
    191194 
    192195/*###### 
    193 ## 
     196## npc_clintar_spirit 
    194197######*/ 
     198 
     199float Clintar_spirit_WP[41][5] =  
     200{ 
     201 //pos_x   pos_y    pos_z    orien waitTime 
     202{7465.28, -3115.46, 439.327, 0.83, 4000}, 
     203{7476.49, -3101,    443.457, 0.89, 0}, 
     204{7486.57, -3085.59, 439.478, 1.07, 0}, 
     205{7472.19, -3085.06, 443.142, 3.07, 0}, 
     206{7456.92, -3085.91, 438.862, 3.24, 0}, 
     207{7446.68, -3083.43, 438.245, 2.40, 0}, 
     208{7446.17, -3080.21, 439.826, 1.10, 6000}, 
     209{7452.41, -3085.8,  438.984, 5.78, 0}, 
     210{7469.11, -3084.94, 443.048, 6.25, 0}, 
     211{7483.79, -3085.44, 439.607, 6.25, 0}, 
     212{7491.14, -3090.96, 439.983, 5.44, 0}, 
     213{7497.62, -3098.22, 436.854, 5.44, 0}, 
     214{7498.72, -3113.41, 434.596, 4.84, 0}, 
     215{7500.06, -3122.51, 434.749, 5.17, 0}, 
     216{7504.96, -3131.53, 434.475, 4.74, 0}, 
     217{7504.31, -3133.53, 435.693, 3.84, 6000}, 
     218{7504.55, -3133.27, 435.476, 0.68, 15000}, 
     219{7501.99, -3126.01, 434.93,  1.83, 0}, 
     220{7490.76, -3114.97, 434.431, 2.51, 0}, 
     221{7479.64, -3105.51, 431.123, 1.83, 0}, 
     222{7474.63, -3086.59, 428.994, 1.83, 2000}, 
     223{7472.96, -3074.18, 427.566, 1.57, 0}, 
     224{7472.25, -3063,    428.268, 1.55, 0}, 
     225{7473.46, -3054.22, 427.588, 0.36, 0}, 
     226{7475.08, -3053.6,  428.653, 0.36, 6000}, 
     227{7474.66, -3053.56, 428.433, 3.19, 4000}, 
     228{7471.81, -3058.84, 427.073, 4.29, 0}, 
     229{7472.16, -3064.91, 427.772, 4.95, 0}, 
     230{7471.56, -3085.36, 428.924, 4.72, 0}, 
     231{7473.56, -3093.48, 429.294, 5.04, 0}, 
     232{7478.94, -3104.29, 430.638, 5.23, 0}, 
     233{7484.46, -3109.61, 432.769, 5.79, 0}, 
     234{7490.23, -3111.08, 434.431, 0.02, 0}, 
     235{7496.29, -3108,    434.783, 1.15, 0}, 
     236{7497.46, -3100.66, 436.191, 1.50, 0}, 
     237{7495.64, -3093.39, 438.349, 2.10, 0}, 
     238{7492.44, -3086.01, 440.267, 1.38, 0}, 
     239{7498.26, -3076.44, 440.808, 0.71, 0}, 
     240{7506.4,  -3067.35, 443.64,  0.77, 0}, 
     241{7518.37, -3057.42, 445.584, 0.74, 0}, 
     242{7517.51, -3056.3,  444.568, 2.49, 4500} 
     243}; 
     244 
     245#define ASPECT_RAVEN 22915 
     246#define ASPECT_RAVEN_SUMMON_X 7472.96 
     247#define ASPECT_RAVEN_SUMMON_Y -3074.18 
     248#define ASPECT_RAVEN_SUMMON_Z 427.566 
     249#define CLINTAR_SPIRIT_SUMMON_X 7459.2275 
     250#define CLINTAR_SPIRIT_SUMMON_Y -3122.5632 
     251#define CLINTAR_SPIRIT_SUMMON_Z 438.9842 
     252#define CLINTAR_SPIRIT_SUMMON_O 0.8594 
     253#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." 
     254#define CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1 "The Emerald Dream will never be yours!" 
     255#define CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2 "Begone from this place!" 
     256#define CLINTAR_SPIRIT_SAY_GET_ONE "That's the first relic, but there are still two more. Follow me, $N." 
     257#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." 
     258#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." 
     259#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!" 
     260 
     261struct TRINITY_DLL_DECL npc_clintar_spiritAI : public npc_escortAI 
     262{ 
     263public: 
     264    npc_clintar_spiritAI(Creature *c) : npc_escortAI(c) {Reset(); } 
     265 
     266    uint32 Step; 
     267    uint32 CurrWP; 
     268    uint32 Event_Timer; 
     269    uint32 checkPlayer_Timer; 
     270 
     271        uint64 PlayerGUID; 
     272 
     273        bool Event_onWait; 
     274 
     275    void Reset() 
     276    { 
     277        if(!PlayerGUID) 
     278        { 
     279            Step = 0; 
     280            CurrWP = 0; 
     281            Event_Timer = 0; 
     282            PlayerGUID = 0; 
     283            checkPlayer_Timer = 1000; 
     284            Event_onWait = false; 
     285        } 
     286    } 
     287 
     288    void JustDied(Unit *killer) 
     289    { 
     290        if(!PlayerGUID) 
     291            return; 
     292        Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); 
     293        if(player && player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) 
     294        { 
     295            player->FailQuest(10965); 
     296            PlayerGUID = 0; 
     297            Reset(); 
     298        } 
     299    } 
     300 
     301    void EnterEvadeMode() 
     302    { 
     303        Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); 
     304        if(player && player->isInCombat() && player->getAttackerForHelper()) 
     305        { 
     306            AttackStart(player->getAttackerForHelper()); 
     307            return; 
     308        } 
     309        npc_escortAI::EnterEvadeMode(); 
     310    } 
     311 
     312    void Aggro(Unit* who) 
     313    { 
     314        uint32 rnd = rand()%2; 
     315        switch(rnd) 
     316        { 
     317            case 0: 
     318                m_creature->Say(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_1, 0, who->GetGUID()); 
     319                break; 
     320            case 1: 
     321                m_creature->Say(CLINTAR_SPIRIT_SAY_UNDER_ATTACK_2, 0,who->GetGUID()); 
     322                break; 
     323        } 
     324    } 
     325 
     326    void StartEvent(Player *player) 
     327    { 
     328        if(!player) 
     329            return; 
     330        if(player->GetQuestStatus(10965) == QUEST_STATUS_INCOMPLETE) 
     331        { 
     332            for(uint8 i = 0; i < 41; i++) 
     333            { 
     334                AddWaypoint(i, Clintar_spirit_WP[i][0], Clintar_spirit_WP[i][1], Clintar_spirit_WP[i][2], (uint32)Clintar_spirit_WP[i][4]); 
     335            } 
     336            PlayerGUID = player->GetGUID(); 
     337            Start(true,true,false,PlayerGUID); 
     338        } 
     339        return; 
     340    } 
     341 
     342    void UpdateAI(const uint32 diff) 
     343    { 
     344        npc_escortAI::UpdateAI(diff); 
     345 
     346        if(!PlayerGUID) 
     347        { 
     348            m_creature->setDeathState(JUST_DIED); 
     349            return; 
     350        } 
     351 
     352        if(!InCombat && !Event_onWait && checkPlayer_Timer < diff) 
     353        { 
     354            Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); 
     355            if(player && player->isInCombat() && player->getAttackerForHelper()) 
     356                AttackStart(player->getAttackerForHelper()); 
     357            checkPlayer_Timer = 1000; 
     358        } else if(!InCombat && !Event_onWait) checkPlayer_Timer -= diff; 
     359 
     360        if(Event_onWait && Event_Timer < diff) 
     361        { 
     362 
     363            Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); 
     364            if(!player || (player && player->GetQuestStatus(10965) == QUEST_STATUS_NONE)) 
     365            { 
     366                m_creature->setDeathState(JUST_DIED); 
     367                return; 
     368            } 
     369 
     370            switch(CurrWP) 
     371            { 
     372                case 0: 
     373                    switch(Step) 
     374                    { 
     375                        case 0: 
     376                            m_creature->Say(CLINTAR_SPIRIT_SAY_START,0,PlayerGUID); 
     377                            Event_Timer = 8000; 
     378                            Step = 1; 
     379                            break; 
     380                        case 1: 
     381                            Event_onWait = false; 
     382                            break; 
     383                    } 
     384                    break; 
     385                case 6: 
     386                    switch(Step) 
     387                    { 
     388                        case 0: 
     389                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); 
     390                            Event_Timer = 5000; 
     391                            Step = 1; 
     392                            break; 
     393                        case 1: 
     394                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); 
     395                            m_creature->Say(CLINTAR_SPIRIT_SAY_GET_ONE,0,PlayerGUID); 
     396                            Event_onWait = false; 
     397                            break; 
     398                    } 
     399                    break; 
     400                case 15: 
     401                    switch(Step) 
     402                    { 
     403                        case 0: 
     404                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); 
     405                            Event_Timer = 5000; 
     406                            Step = 1; 
     407                            break; 
     408                        case 1: 
     409                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); 
     410                            Event_onWait = false; 
     411                            break; 
     412                    } 
     413                    break; 
     414                case 16: 
     415                    switch(Step) 
     416                    { 
     417                        case 0: 
     418                            m_creature->Say(CLINTAR_SPIRIT_SAY_GET_TWO,0,PlayerGUID); 
     419                            Event_Timer = 15000; 
     420                            Step = 1; 
     421                            break; 
     422                        case 1: 
     423                            Event_onWait = false; 
     424                            break; 
     425                    } 
     426                    break; 
     427                case 20: 
     428                    switch(Step) 
     429                    { 
     430                        case 0: 
     431                            { 
     432                            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); 
     433                            if(mob) 
     434                            { 
     435                                mob->AddThreat(m_creature,10000.0f); 
     436                                mob->AI()->AttackStart(m_creature); 
     437                            } 
     438                            Event_Timer = 2000; 
     439                            Step = 1; 
     440                            break; 
     441                            } 
     442                        case 1: 
     443                            Event_onWait = false; 
     444                            break; 
     445                    } 
     446                    break; 
     447                case 24: 
     448                    switch(Step) 
     449                    { 
     450                        case 0: 
     451                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 133); 
     452                            Event_Timer = 5000; 
     453                            Step = 1; 
     454                            break; 
     455                        case 1: 
     456                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); 
     457                            Event_onWait = false; 
     458                            break; 
     459                    } 
     460                    break; 
     461                case 25: 
     462                    switch(Step) 
     463                    { 
     464                        case 0: 
     465                            m_creature->Say(CLINTAR_SPIRIT_SAY_GET_THREE, 0, PlayerGUID); 
     466                            Event_Timer = 4000; 
     467                            Step = 1; 
     468                            break; 
     469                        case 1: 
     470                            Event_onWait = false; 
     471                            break; 
     472                    } 
     473                    break; 
     474                case 40: 
     475                    switch(Step) 
     476                    { 
     477                        case 0: 
     478                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 2); 
     479                            m_creature->Say(CLINTAR_SPIRIT_SAY_GET_FINAL, 0, PlayerGUID); 
     480                                                        player->CompleteQuest(10965); 
     481                            Event_Timer = 1500; 
     482                            Step = 1; 
     483                            break; 
     484                        case 1: 
     485                            m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); 
     486                            Event_Timer = 3000; 
     487                            Step = 2; 
     488                            break; 
     489                        case 2: 
     490                            player->TalkedToCreature(m_creature->GetEntry(), m_creature->GetGUID()); 
     491                            PlayerGUID = 0; 
     492                            Reset(); 
     493                            m_creature->setDeathState(JUST_DIED); 
     494                            break; 
     495                    } 
     496                    break; 
     497                default: 
     498                    Event_onWait = false; 
     499                    break; 
     500            } 
     501 
     502        } else if(Event_onWait) Event_Timer -= diff; 
     503    } 
     504 
     505    void WaypointReached(uint32 id) 
     506    { 
     507        CurrWP = id; 
     508        Event_Timer = 0; 
     509        Step = 0; 
     510        Event_onWait = true; 
     511    } 
     512}; 
     513 
     514CreatureAI* GetAI_npc_clintar_spirit(Creature *_Creature) 
     515{ 
     516    return new npc_clintar_spiritAI (_Creature); 
     517} 
     518 
     519/*#### 
     520# npc_clintar_dreamwalker 
     521####*/ 
     522 
     523#define CLINTAR_SPIRIT 22916  
     524 
     525bool QuestAccept_npc_clintar_dreamwalker(Player *player, Creature *creature, Quest const *quest ) 
     526{ 
     527    if(quest->GetQuestId() == 10965) 
     528    { 
     529        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); 
     530        if(clintar_spirit) 
     531            ((npc_clintar_spiritAI*)clintar_spirit->AI())->StartEvent(player); 
     532    } 
     533    return true; 
     534} 
     535 
     536/*#### 
     537#  
     538####*/ 
    195539 
    196540void AddSC_moonglade() 
     
    215559    newscript->pGossipSelect = &GossipSelect_npc_silva_filnaveth; 
    216560    m_scripts[nrscripts++] = newscript; 
    217 } 
     561 
     562        newscript = new Script; 
     563    newscript->Name="npc_clintar_dreamwalker"; 
     564    newscript->pQuestAccept = &QuestAccept_npc_clintar_dreamwalker; 
     565    m_scripts[nrscripts++] = newscript; 
     566 
     567    newscript = new Script; 
     568    newscript->Name="npc_clintar_spirit"; 
     569    newscript->GetAI = GetAI_npc_clintar_spirit; 
     570    m_scripts[nrscripts++] = newscript; 
     571} 
  • trunk/src/bindings/scripts/scripts/zone/nagrand/nagrand.cpp

    r90 r204  
    1818SDName: Nagrand 
    1919SD%Complete: 90 
    20 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) 
     20SDComment: 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) 
    2121SDCategory: Nagrand 
    2222EndScriptData */ 
     
    3030npc_lantresor_of_the_blade 
    3131npc_creditmarker_visit_with_ancestors 
     32mob_sparrowhawk 
    3233EndContentData */ 
    3334 
     
    519520 
    520521/*###### 
    521 ## AddSC 
     522## mob_sparrowhawk 
    522523######*/ 
     524 
     525#define SPELL_SPARROWHAWK_NET 39810 
     526#define SPELL_ITEM_CAPTIVE_SPARROWHAWK 39812 
     527 
     528struct TRINITY_DLL_DECL mob_sparrowhawkAI : public ScriptedAI 
     529{ 
     530 
     531    mob_sparrowhawkAI(Creature *c) : ScriptedAI(c) {Reset();} 
     532 
     533    uint32 Check_Timer; 
     534    uint64 PlayerGUID; 
     535    bool fleeing; 
     536 
     537    void Reset() 
     538    { 
     539        m_creature->RemoveAurasDueToSpell(SPELL_SPARROWHAWK_NET); 
     540        Check_Timer = 1000; 
     541        PlayerGUID = 0; 
     542        fleeing = false; 
     543    } 
     544    void AttackStart(Unit *who) 
     545    { 
     546        if(PlayerGUID) 
     547            return; 
     548 
     549        ScriptedAI::AttackStart(who); 
     550    } 
     551 
     552    void Aggro(Unit* who) {} 
     553 
     554    void MoveInLineOfSight(Unit *who) 
     555    { 
     556        if(!who || PlayerGUID) 
     557            return; 
     558 
     559        if(!PlayerGUID && who->GetTypeId() == TYPEID_PLAYER && m_creature->IsWithinDistInMap(((Player *)who), 30) && ((Player *)who)->GetQuestStatus(10987) == QUEST_STATUS_INCOMPLETE) 
     560        { 
     561            PlayerGUID = who->GetGUID(); 
     562            return; 
     563        } 
     564 
     565        ScriptedAI::MoveInLineOfSight(who); 
     566    } 
     567 
     568    void UpdateAI(const uint32 diff) 
     569    { 
     570        if(Check_Timer < diff) 
     571        { 
     572            if(PlayerGUID) 
     573            { 
     574                if(fleeing && m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != FLEEING_MOTION_TYPE) 
     575                    fleeing = false; 
     576 
     577                Player *player = (Player *)Unit::GetUnit((*m_creature), PlayerGUID); 
     578                if(player && m_creature->IsWithinDistInMap(player, 30)/* && m_creature->CanFreeMove()*/) 
     579                { 
     580                    if(!fleeing) 
     581                    { 
     582                        m_creature->DeleteThreatList(); 
     583                        m_creature->GetMotionMaster()->MoveFleeing(player); 
     584                        fleeing = true; 
     585                    } 
     586                } 
     587                else if(fleeing) 
     588                { 
     589                    m_creature->GetMotionMaster()->MovementExpired(false); 
     590                    PlayerGUID = 0; 
     591                    fleeing = false; 
     592                } 
     593            } 
     594            Check_Timer = 1000; 
     595        } else Check_Timer -= diff; 
     596 
     597        if (PlayerGUID) 
     598            return; 
     599 
     600        ScriptedAI::UpdateAI(diff); 
     601    } 
     602 
     603    void SpellHit(Unit *caster, const SpellEntry *spell) 
     604    { 
     605        if (caster->GetTypeId() == TYPEID_PLAYER) 
     606        { 
     607            if(spell->Id == SPELL_SPARROWHAWK_NET && ((Player*)caster)->GetQuestStatus(10987) == QUEST_STATUS_INCOMPLETE) 
     608            { 
     609                m_creature->CastSpell(caster, SPELL_ITEM_CAPTIVE_SPARROWHAWK, true); 
     610                m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); 
     611                m_creature->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); 
     612            } 
     613        } 
     614        return; 
     615    } 
     616}; 
     617 
     618CreatureAI* GetAI_mob_sparrowhawk(Creature *_Creature) 
     619{ 
     620    return new mob_sparrowhawkAI (_Creature); 
     621} 
     622 
     623/*#### 
     624# 
     625####*/ 
    523626 
    524627void AddSC_nagrand() 
     
    566669    newscript->GetAI = GetAI_npc_creditmarker_visit_with_ancestors; 
    567670    m_scripts[nrscripts++] = newscript; 
    568 } 
     671 
     672    newscript = new Script; 
     673    newscript->Name="mob_sparrowhawk"; 
     674    newscript->GetAI = GetAI_mob_sparrowhawk; 
     675    m_scripts[nrscripts++] = newscript; 
     676} 
  • trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_astromancer.cpp

    r90 r204  
    174174 
    175175        if(pInstance) 
    176             pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, NOT_STARTED); 
     176            pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, DONE); 
    177177    } 
    178178 
  • trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp

    r109 r204  
    386386 
    387387        if(pInstance) 
    388             pInstance->SetData(DATA_KAELTHASEVENT, 0); 
     388            pInstance->SetData(DATA_KAELTHASEVENT, NOT_STARTED); 
    389389    } 
    390390 
     
    442442            DoPlaySoundToSet(m_creature, SOUND_INTRO); 
    443443 
    444             pInstance->SetData(DATA_KAELTHASEVENT, 1); 
     444            pInstance->SetData(DATA_KAELTHASEVENT, IN_PROGRESS); 
    445445            m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); 
    446446 
     
    475475 
    476476        if(pInstance) 
    477             pInstance->SetData(DATA_KAELTHASEVENT, 0); 
     477            pInstance->SetData(DATA_KAELTHASEVENT, DONE); 
    478478 
    479479        Creature *pCreature; 
  • trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp

    r117 r204  
    100100 
    101101        if(pInstance) 
    102             pInstance->SetData(DATA_VOIDREAVEREVENT, NOT_STARTED); 
     102            pInstance->SetData(DATA_VOIDREAVEREVENT, DONE); 
    103103    } 
    104104 
  • trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h

    r90 r204  
    1010#define DATA_GRANDASTROMANCERCAPERNIAN      3 
    1111#define DATA_HIGHASTROMANCERSOLARIANEVENT   4 
    12 #define DATA_FATHOMLORDKARATHRESSEVENT      5 
    13 #define DATA_KAELTHAS                       6 
    14 #define DATA_KAELTHASEVENT                  7 
    15 #define DATA_LORDSANGUINAR                  8 
    16 #define DATA_MASTERENGINEERTELONICUS        9 
    17 #define DATA_SOLARIANEVENT                  10 
    18 #define DATA_THALADREDTHEDARKENER           11 
    19 #define DATA_VOIDREAVEREVENT                12 
    20 #define DATA_ALAR 13 
     12#define DATA_KAELTHAS                       5 
     13#define DATA_KAELTHASEVENT                  6 
     14#define DATA_LORDSANGUINAR                  7 
     15#define DATA_MASTERENGINEERTELONICUS        8 
     16#define DATA_THALADREDTHEDARKENER           10 
     17#define DATA_VOIDREAVEREVENT                11 
     18#define DATA_ALAR                                                       12 
    2119#endif 
  • trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp

    r90 r204  
    8686            case 19622: Kaelthas = creature->GetGUID(); break; 
    8787            case 18805: Astromancer = creature->GetGUID(); break; 
    88  
    89             case 19514: 
    90                 Alar = creature->GetGUID(); 
    91                 break; 
     88            case 19514: Alar = creature->GetGUID(); break; 
    9289        } 
    9390    } 
     
    9794        switch(identifier) 
    9895        { 
    99             case DATA_THALADREDTHEDARKENER: 
    100                 return ThaladredTheDarkener; 
    101  
    102             case DATA_LORDSANGUINAR: 
    103                 return LordSanguinar; 
    104  
    105             case DATA_GRANDASTROMANCERCAPERNIAN: 
    106                 return GrandAstromancerCapernian; 
    107  
    108             case DATA_MASTERENGINEERTELONICUS: 
    109                 return MasterEngineerTelonicus; 
    110  
    111             case DATA_KAELTHAS: 
    112                 return Kaelthas; 
    113  
    114             case DATA_ASTROMANCER: 
    115                 return Astromancer; 
    116  
    117             case DATA_ALAR: 
    118                 return Alar; 
     96            case DATA_THALADREDTHEDARKENER:                     return ThaladredTheDarkener; 
     97            case DATA_LORDSANGUINAR:                            return LordSanguinar; 
     98            case DATA_GRANDASTROMANCERCAPERNIAN:        return GrandAstromancerCapernian; 
     99            case DATA_MASTERENGINEERTELONICUS:          return MasterEngineerTelonicus; 
     100            case DATA_KAELTHAS:                                         return Kaelthas; 
     101            case DATA_ASTROMANCER:                                      return Astromancer; 
     102            case DATA_ALAR:                                                     return Alar; 
    119103        } 
    120  
    121104        return 0; 
    122105    } 
     
    126109        switch(type) 
    127110        { 
    128             case DATA_ALAREVENT: 
    129                 AlarEventPhase = data; 
    130                 Encounters[0] = (data) ? true : false; 
    131                 break; 
    132  
    133             case DATA_SOLARIANEVENT: 
    134                 Encounters[1] = (data) ? true : false; 
    135                 break; 
    136  
    137             case DATA_VOIDREAVEREVENT: 
    138                 Encounters[2] = (data) ? true : false; 
    139                 break; 
    140  
    141                 //Kael'thas 
    142             case DATA_KAELTHASEVENT: 
    143                 KaelthasEventPhase = data; 
    144                 Encounters[3] = (data) ? true : false; 
    145                 break; 
    146  
    147             case DATA_HIGHASTROMANCERSOLARIANEVENT: 
    148                 Encounters[4] = (data) ? true : false; 
    149                 break; 
     111            case DATA_ALAREVENT:        AlarEventPhase = data;  Encounters[0] = data;                   break; 
     112            case DATA_HIGHASTROMANCERSOLARIANEVENT:     Encounters[1] = data;                                   break; 
     113            case DATA_VOIDREAVEREVENT:  Encounters[2] = data;                                                           break;  
     114            case DATA_KAELTHASEVENT:    KaelthasEventPhase = data;      Encounters[3] = data;   break; 
    150115        } 
     116                if(data == DONE) 
     117                        SaveToDB(); 
    151118    } 
    152119 
     
    155122        switch(type) 
    156123        { 
    157             case DATA_ALAREVENT: 
    158                 return AlarEventPhase; 
     124            case DATA_ALAREVENT:        return AlarEventPhase; 
     125            case DATA_HIGHASTROMANCERSOLARIANEVENT:     return Encounters[1]; 
     126            case DATA_VOIDREAVEREVENT:  return Encounters[2]; 
     127            case DATA_KAELTHASEVENT:    return KaelthasEventPhase; 
     128        } 
     129        return 0; 
     130    } 
    159131 
    160             case DATA_SOLARIANEVENT: 
    161                 return Encounters[1]; 
     132        const char* Save() 
     133        { 
     134                OUT_SAVE_INST_DATA; 
     135        std::ostringstream stream; 
     136        stream << Encounters[0] << " " << Encounters[1] << " " << Encounters[2] << " " << Encounters[3]; 
     137        char* out = new char[stream.str().length() + 1]; 
     138        strcpy(out, stream.str().c_str()); 
     139        if(out) 
     140        { 
     141            OUT_SAVE_INST_DATA_COMPLETE; 
     142            return out; 
     143        } 
     144        return NULL; 
     145    } 
    162146 
    163             case DATA_VOIDREAVEREVENT: 
    164                 return Encounters[2]; 
    165  
    166             case DATA_HIGHASTROMANCERSOLARIANEVENT: 
    167                 return Encounters[4]; 
    168  
    169                 //Kael'thas 
    170             case DATA_KAELTHASEVENT: 
    171                 return KaelthasEventPhase; 
     147    void Load(const char* in) 
     148    { 
     149        if(!in) 
     150        { 
     151            OUT_LOAD_INST_DATA_FAIL; 
     152            return; 
    172153        } 
    173  
    174         return 0; 
     154        OUT_LOAD_INST_DATA(in); 
     155        std::istringstream stream(in); 
     156        stream >> Encounters[0] >> Encounters[1] >> Encounters[2] >> Encounters[3]; 
     157                for(uint8 i = 0; i < ENCOUNTERS; ++i) 
     158                        if(Encounters[i] == IN_PROGRESS)                // Do not load an encounter as "In Progress" - reset it instead. 
     159                                Encounters[i] = NOT_STARTED; 
     160                OUT_LOAD_INST_DATA_COMPLETE; 
    175161    } 
    176162};