Changeset 204
- Timestamp:
- 11/19/08 13:46:06 (17 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 8 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/bindings/scripts/scripts/zone/azshara/azshara.cpp
r90 r204 18 18 SDName: Azshara 19 19 SD%Complete: 90 20 SDComment: Quest support: 2744, 3141, 9364 20 SDComment: Quest support: 2744, 3141, 9364, 10994 21 21 SDCategory: Azshara 22 22 EndScriptData */ … … 25 25 mobs_spitelashes 26 26 npc_loramus_thalipedes 27 mob_rizzle_sprysprocket 28 mob_depth_charge 27 29 EndContentData */ 28 30 29 31 #include "precompiled.h" 32 #include "World.h" 33 #include "WorldPacket.h" 30 34 31 35 /*###### … … 146 150 } 147 151 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 171 float 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 235 struct 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 403 bool 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 412 bool 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 424 CreatureAI* GetAI_mob_rizzle_sprysprocket(Creature *_Creature) 425 { 426 return new mob_rizzle_sprysprocketAI (_Creature); 427 } 428 429 /*#### 430 # mob_depth_charge 431 ####*/ 432 433 struct 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 483 CreatureAI* GetAI_mob_depth_charge(Creature *_Creature) 484 { 485 return new mob_depth_chargeAI (_Creature); 148 486 } 149 487 … … 162 500 newscript->pGossipSelect = &GossipSelect_npc_loramus_thalipedes; 163 501 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 18 18 SDName: Moonglade 19 19 SD%Complete: 100 20 SDComment: Quest support: 30, 272, 5929, 5930 . Special Flight Paths for Druid class.20 SDComment: Quest support: 30, 272, 5929, 5930, 10965. Special Flight Paths for Druid class. 21 21 SDCategory: Moonglade 22 22 EndScriptData */ … … 26 26 npc_great_bear_spirit 27 27 npc_silva_filnaveth 28 npc_clintar_spirit 29 npc_clintar_dreamwalker 28 30 EndContentData */ 29 31 30 32 #include "precompiled.h" 33 #include "../../npc/npc_escortAI.h" 31 34 32 35 /*###### … … 191 194 192 195 /*###### 193 ## 196 ## npc_clintar_spirit 194 197 ######*/ 198 199 float 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 261 struct TRINITY_DLL_DECL npc_clintar_spiritAI : public npc_escortAI 262 { 263 public: 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 514 CreatureAI* 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 525 bool 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 ####*/ 195 539 196 540 void AddSC_moonglade() … … 215 559 newscript->pGossipSelect = &GossipSelect_npc_silva_filnaveth; 216 560 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 18 18 SDName: Nagrand 19 19 SD%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)20 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) 21 21 SDCategory: Nagrand 22 22 EndScriptData */ … … 30 30 npc_lantresor_of_the_blade 31 31 npc_creditmarker_visit_with_ancestors 32 mob_sparrowhawk 32 33 EndContentData */ 33 34 … … 519 520 520 521 /*###### 521 ## AddSC522 ## mob_sparrowhawk 522 523 ######*/ 524 525 #define SPELL_SPARROWHAWK_NET 39810 526 #define SPELL_ITEM_CAPTIVE_SPARROWHAWK 39812 527 528 struct 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 618 CreatureAI* GetAI_mob_sparrowhawk(Creature *_Creature) 619 { 620 return new mob_sparrowhawkAI (_Creature); 621 } 622 623 /*#### 624 # 625 ####*/ 523 626 524 627 void AddSC_nagrand() … … 566 669 newscript->GetAI = GetAI_npc_creditmarker_visit_with_ancestors; 567 670 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 174 174 175 175 if(pInstance) 176 pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, NOT_STARTED);176 pInstance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, DONE); 177 177 } 178 178 -
trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_kaelthas.cpp
r109 r204 386 386 387 387 if(pInstance) 388 pInstance->SetData(DATA_KAELTHASEVENT, 0);388 pInstance->SetData(DATA_KAELTHASEVENT, NOT_STARTED); 389 389 } 390 390 … … 442 442 DoPlaySoundToSet(m_creature, SOUND_INTRO); 443 443 444 pInstance->SetData(DATA_KAELTHASEVENT, 1);444 pInstance->SetData(DATA_KAELTHASEVENT, IN_PROGRESS); 445 445 m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); 446 446 … … 475 475 476 476 if(pInstance) 477 pInstance->SetData(DATA_KAELTHASEVENT, 0);477 pInstance->SetData(DATA_KAELTHASEVENT, DONE); 478 478 479 479 Creature *pCreature; -
trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/boss_void_reaver.cpp
r117 r204 100 100 101 101 if(pInstance) 102 pInstance->SetData(DATA_VOIDREAVEREVENT, NOT_STARTED);102 pInstance->SetData(DATA_VOIDREAVEREVENT, DONE); 103 103 } 104 104 -
trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/def_the_eye.h
r90 r204 10 10 #define DATA_GRANDASTROMANCERCAPERNIAN 3 11 11 #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 21 19 #endif -
trunk/src/bindings/scripts/scripts/zone/tempest_keep/the_eye/instance_the_eye.cpp
r90 r204 86 86 case 19622: Kaelthas = creature->GetGUID(); break; 87 87 case 18805: Astromancer = creature->GetGUID(); break; 88 89 case 19514: 90 Alar = creature->GetGUID(); 91 break; 88 case 19514: Alar = creature->GetGUID(); break; 92 89 } 93 90 } … … 97 94 switch(identifier) 98 95 { 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; 119 103 } 120 121 104 return 0; 122 105 } … … 126 109 switch(type) 127 110 { 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; 150 115 } 116 if(data == DONE) 117 SaveToDB(); 151 118 } 152 119 … … 155 122 switch(type) 156 123 { 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 } 159 131 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 } 162 146 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; 172 153 } 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; 175 161 } 176 162 };