/* Copyright (C) 2006 - 2009 ScriptDev2 * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* ScriptData SDName: Silithus SD%Complete: 100 SDComment: Quest support: 7785, 8304, 8507. SDCategory: Silithus EndScriptData */ /* ContentData npc_highlord_demitrian npcs_rutgar_and_frankal quest_a_pawn_on_the_eternal_pawn EndContentData */ #include "ScriptedPch.h" /*### ## npc_highlord_demitrian ###*/ #define GOSSIP_DEMITRIAN1 "What do you know of it?" #define GOSSIP_DEMITRIAN2 "I am listening , Demitrian." #define GOSSIP_DEMITRIAN3 "Continue, please." #define GOSSIP_DEMITRIAN4 "A battle?" #define GOSSIP_DEMITRIAN5 "" #define GOSSIP_DEMITRIAN6 "Caught unaware? How?" #define GOSSIP_DEMITRIAN7 "So what did Ragnaros do next?" bool GossipHello_npc_highlord_demitrian(Player* pPlayer, Creature* pCreature) { if (pCreature->isQuestGiver()) pPlayer->PrepareQuestMenu(pCreature->GetGUID()); if (pPlayer->GetQuestStatus(7785) == QUEST_STATUS_NONE && (pPlayer->HasItemCount(18563,1,false) || pPlayer->HasItemCount(18564,1,false))) pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DEMITRIAN1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); pPlayer->SEND_GOSSIP_MENU(6812, pCreature->GetGUID()); return true; } bool GossipSelect_npc_highlord_demitrian(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction) { switch (uiAction) { case GOSSIP_ACTION_INFO_DEF: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DEMITRIAN2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1); pPlayer->SEND_GOSSIP_MENU(6842, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+1: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DEMITRIAN3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2); pPlayer->SEND_GOSSIP_MENU(6843, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DEMITRIAN4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3); pPlayer->SEND_GOSSIP_MENU(6844, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+3: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DEMITRIAN5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4); pPlayer->SEND_GOSSIP_MENU(6867, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+4: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DEMITRIAN6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5); pPlayer->SEND_GOSSIP_MENU(6868, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+5: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DEMITRIAN7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6); pPlayer->SEND_GOSSIP_MENU(6869, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+6: pPlayer->SEND_GOSSIP_MENU(6870, pCreature->GetGUID()); ItemPosCountVec dest; uint8 msg = pPlayer->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, 19016, 1); if (msg == EQUIP_ERR_OK) pPlayer->StoreNewItem(dest, 19016, true); break; } return true; } /*### ## npcs_rutgar_and_frankal ###*/ //gossip item text best guess #define GOSSIP_ITEM1 "I seek information about Natalia" #define GOSSIP_ITEM2 "That sounds dangerous!" #define GOSSIP_ITEM3 "What did you do?" #define GOSSIP_ITEM4 "Who?" #define GOSSIP_ITEM5 "Women do that. What did she demand?" #define GOSSIP_ITEM6 "What do you mean?" #define GOSSIP_ITEM7 "What happened next?" #define GOSSIP_ITEM11 "Yes, please continue" #define GOSSIP_ITEM12 "What language?" #define GOSSIP_ITEM13 "The Priestess attacked you?!" #define GOSSIP_ITEM14 "I should ask the monkey about this" #define GOSSIP_ITEM15 "Then what..." //trigger creatures to kill #define TRIGGER_RUTGAR 15222 #define TRIGGER_FRANKAL 15221 bool GossipHello_npcs_rutgar_and_frankal(Player* pPlayer, Creature* pCreature) { if (pCreature->isQuestGiver()) pPlayer->PrepareQuestMenu(pCreature->GetGUID()); if (pPlayer->GetQuestStatus(8304) == QUEST_STATUS_INCOMPLETE && pCreature->GetEntry() == 15170 && !pPlayer->GetReqKillOrCastCurrentCount(8304, TRIGGER_RUTGAR)) pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); if (pPlayer->GetQuestStatus(8304) == QUEST_STATUS_INCOMPLETE && pCreature->GetEntry() == 15171 && pPlayer->GetReqKillOrCastCurrentCount(8304, TRIGGER_RUTGAR)) pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+9); pPlayer->SEND_GOSSIP_MENU(7754, pCreature->GetGUID()); return true; } bool GossipSelect_npcs_rutgar_and_frankal(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction) { switch (uiAction) { case GOSSIP_ACTION_INFO_DEF: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); pPlayer->SEND_GOSSIP_MENU(7755, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 1: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); pPlayer->SEND_GOSSIP_MENU(7756, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 2: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); pPlayer->SEND_GOSSIP_MENU(7757, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 3: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); pPlayer->SEND_GOSSIP_MENU(7758, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 4: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); pPlayer->SEND_GOSSIP_MENU(7759, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 5: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); pPlayer->SEND_GOSSIP_MENU(7760, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 6: pPlayer->SEND_GOSSIP_MENU(7761, pCreature->GetGUID()); //'kill' our trigger to update quest status pPlayer->KilledMonsterCredit(TRIGGER_RUTGAR, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 9: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM11, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); pPlayer->SEND_GOSSIP_MENU(7762, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 10: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM12, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); pPlayer->SEND_GOSSIP_MENU(7763, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 11: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM13, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); pPlayer->SEND_GOSSIP_MENU(7764, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 12: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM14, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); pPlayer->SEND_GOSSIP_MENU(7765, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 13: pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM15, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); pPlayer->SEND_GOSSIP_MENU(7766, pCreature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 14: pPlayer->SEND_GOSSIP_MENU(7767, pCreature->GetGUID()); //'kill' our trigger to update quest status pPlayer->KilledMonsterCredit(TRIGGER_FRANKAL, pCreature->GetGUID()); break; } return true; } /*#### # quest_a_pawn_on_the_eternal_board (Defines) ####*/ enum eEternalBoard { QUEST_A_PAWN_ON_THE_ETERNAL_BOARD = 8519, FACTION_HOSTILE = 14, FACTION_FRIENDLY = 35, C_ANACHRONOS = 15381, C_FANDRAL_STAGHELM = 15382, C_ARYGOS = 15380, C_MERITHRA = 15378, C_CAELESTRASZ = 15379, ANACHRONOS_SAY_1 = -1350000, ANACHRONOS_SAY_2 = -1350001, ANACHRONOS_SAY_3 = -1350002, ANACHRONOS_SAY_4 = -1350003, ANACHRONOS_SAY_5 = -1350004, ANACHRONOS_SAY_6 = -1350005, ANACHRONOS_SAY_7 = -1350006, ANACHRONOS_SAY_8 = -1350007, ANACHRONOS_SAY_9 = -1350008, ANACHRONOS_SAY_10 = -1350009, ANACHRONOS_EMOTE_1 = -1350010, ANACHRONOS_EMOTE_2 = -1350011, ANACHRONOS_EMOTE_3 = -1350012, FANDRAL_SAY_1 = -1350013, FANDRAL_SAY_2 = -1350014, FANDRAL_SAY_3 = -1350015, FANDRAL_SAY_4 = -1350016, FANDRAL_SAY_5 = -1350017, FANDRAL_SAY_6 = -1350018, FANDRAL_EMOTE_1 = -1350019, FANDRAL_EMOTE_2 = -1350020, CAELESTRASZ_SAY_1 = -1350021, CAELESTRASZ_SAY_2 = -1350022, CAELESTRASZ_YELL_1 = -1350023, ARYGOS_SAY_1 = -1350024, ARYGOS_YELL_1 = -1350025, ARYGOS_EMOTE_1 = -1350026, MERITHRA_SAY_1 = -1350027, MERITHRA_SAY_2 = -1350028, MERITHRA_YELL_1 = -1350029, MERITHRA_EMOTE_1 = -1350030, GO_GATE_OF_AHN_QIRAJ = 176146, GO_GLYPH_OF_AHN_QIRAJ = 176148, GO_ROOTS_OF_AHN_QIRAJ = 176147 }; /*##### # Quest: A Pawn on the Eternal Board #####*/ /* ContentData A Pawn on the Eternal Board - creatures, gameobjects and defines mob_qiraj_war_spawn : Adds that are summoned in the Qiraj gates battle. npc_anachronos_the_ancient : Creature that controls the event. npc_anachronos_quest_trigger: controls the spawning of the BG War mobs. go_crystalline_tear : GameObject that begins the event and hands out quest TO DO: get correct spell IDs and timings for spells cast upon dragon transformations TO DO: Dragons should use the HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF) after transformation,but for some unknown reason it doesnt work. EndContentData */ #define QUEST_A_PAWN_ON_THE_ETERNAL_BOARD 8519 #define EVENT_AREA_RADIUS 65 //65yds #define EVENT_COOLDOWN 500000 //in ms. appear after event completed or failed (should be = Adds despawn time) struct QuestCinematic { int32 TextId; uint32 Creature, Timer; }; // Creature 0 - Anachronos, 1 - Fandral, 2 - Arygos, 3 - Merithra, 4 - Caelestrasz static QuestCinematic EventAnim[]= { {ANACHRONOS_SAY_1, 0, 2000}, {FANDRAL_SAY_1, 1, 4000}, {MERITHRA_EMOTE_1, 3, 500}, {MERITHRA_SAY_1, 3, 500}, {ARYGOS_EMOTE_1, 2, 2000}, {CAELESTRASZ_SAY_1, 4, 8000}, {MERITHRA_SAY_2, 3, 6000}, {NULL,3,2000}, {MERITHRA_YELL_1, 3, 2500}, {NULL, 3, 3000},//Morph {NULL,3,4000},//EmoteLiftoff {NULL, 3, 4000},// spell {NULL, 3, 1250},//fly {NULL, 3, 250},//remove flags {ARYGOS_SAY_1, 2, 3000}, {NULL,3,2000}, {ARYGOS_YELL_1, 2, 3000}, {NULL, 3, 3000},//Morph {NULL,3,4000},//EmoteLiftoff {NULL, 3, 4000},// spell {NULL, 3, 1000},//fly {NULL, 3, 1000},//remove flags {CAELESTRASZ_SAY_2, 4, 5000}, {NULL,3,3000}, {CAELESTRASZ_YELL_1, 4, 3000}, {NULL, 3, 3000},//Morph {NULL,3,4000},//EmoteLiftoff {NULL, 3, 2500},// spell {ANACHRONOS_SAY_2, 0, 2000}, {NULL, 3, 250},//fly {NULL, 3, 25},//remove flags {FANDRAL_SAY_2, 1, 3000}, {ANACHRONOS_SAY_3, 0, 10000},//Both run through the armies {NULL,3,2000},// Sands will stop {NULL,3,8000},// Summon Gate {ANACHRONOS_SAY_4, 0, 4000}, {NULL, 0, 2000},//spell 1-> Arcane cosmetic (Mobs freeze) {NULL, 0, 5000}, //Spell 2-> Arcane long cosmetic (barrier appears) (Barrier -> Glyphs) {NULL, 0, 7000},//BarrieR {NULL, 0, 4000},//Glyphs {ANACHRONOS_SAY_5, 0, 2000}, {NULL, 0, 4000},// Roots {FANDRAL_SAY_3, 1, 3000},//Root Text {FANDRAL_EMOTE_1, 1, 3000},//falls knee {ANACHRONOS_SAY_6, 0, 3000}, {ANACHRONOS_SAY_7, 0, 3000}, {ANACHRONOS_SAY_8, 0, 8000}, {ANACHRONOS_EMOTE_1, 0, 1000},//Give Scepter {FANDRAL_SAY_4, 1, 3000}, {FANDRAL_SAY_5, 1, 3000},//->Equip hammer~Scepter, throw it at door {FANDRAL_EMOTE_2, 1, 3000},//Throw hammer at door. {ANACHRONOS_SAY_9, 0, 3000}, {FANDRAL_SAY_6, 1, 3000}, //fandral goes away {ANACHRONOS_EMOTE_2, 0, 3000}, {ANACHRONOS_EMOTE_3, 0, 3000}, {NULL, 0, 2000}, {NULL, 0, 2000}, {NULL, 0, 4000}, {ANACHRONOS_SAY_10, 0, 3000}, {NULL, 0, 2000}, {NULL, 0, 3000}, {NULL, 0, 15000}, {NULL, 0, 5000}, {NULL, 0, 3500}, {NULL, 0, 5000}, {NULL, 0, 3500}, {NULL, 0, 5000}, {NULL, 0, NULL} }; struct Location { float x, y, z, o; }; //Cordinates for Spawns static Location SpawnLocation[]= { {-8085, 1528, 2.61, 3.141592},//Kaldorei Infantry {-8080, 1526, 2.61, 3.141592},//Kaldorei Infantry {-8085, 1524, 2.61, 3.141592},//Kaldorei Infantry {-8080, 1522, 2.61, 3.141592},//Kaldorei Infantry {-8085, 1520, 2.61, 3.141592},//Kaldorei Infantry {-8085, 1524, 2.61, 3.141592},//Kaldorei Infantry {-8080, 1522, 2.61, 3.141592},//Kaldorei Infantry {-8085, 1520, 2.61, 3.141592},//Kaldorei Infantry {-8080, 1518, 2.61, 3.141592},//Kaldorei Infantry {-8085, 1516, 2.61, 3.141592},//Kaldorei Infantry {-8085, 1518, 2.61, 3.141592},//Kaldorei Infantry {-8080, 1516, 2.61, 3.141592},//Kaldorei Infantry {-8080, 1520, 2.61, 3.141592},//Kaldorei Infantry {-8080, 1424, 2.61, 3.141592},//Kaldorei Infantry {-8085, 1422, 2.61, 3.141592},//Kaldorei Infantry // 2 waves of warriors {-8082, 1528, 2.61, 3.141592},//Kaldorei Infantry {-8078, 1525, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1524, 2.61, 3.141592},//Kaldorei Infantry {-8078, 1526, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1527, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1524, 2.61, 3.141592},//Kaldorei Infantry {-8078, 1522, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1520, 2.61, 3.141592},//Kaldorei Infantry {-8078, 1518, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1516, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1523, 2.61, 3.141592},//Kaldorei Infantry {-8078, 1521, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1528, 2.61, 3.141592},//Kaldorei Infantry {-8078, 1519, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1526, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1524, 2.61, 3.141592},//Kaldorei Infantry {-8078, 1522, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1520, 2.61, 3.141592},//Kaldorei Infantry {-8078, 1518, 2.61, 3.141592},//Kaldorei Infantry {-8082, 1516, 2.61, 3.141592},//Kaldorei Infantry {-8088, 1510, 2.61, 0},//Anubisath Conqueror {-8084, 1520, 2.61, 0},//Anubisath Conqueror {-8088, 1530, 2.61, 0},//Anubisath Conqueror {-8080, 1513, 2.61, 0},//Qiraj Wasp {-8082, 1523, 2.61, 0},//Qiraj Wasp {-8085, 1518, 2.61, 0},//Qiraj Wasp {-8082, 1516, 2.61, 0},//Qiraj Wasp {-8085, 1520, 2.61, 0},//Qiraj Wasp {-8080, 1528, 2.61, 0},//Qiraj Wasp {-8082, 1513, 2.61, 0},//Qiraj Wasp {-8079, 1523, 2.61, 0},//Qiraj Wasp {-8080, 1531, 2.61, 0},//Qiraj Wasp {-8079, 1516, 2.61, 0},//Qiraj Wasp {-8082, 1520, 2.61, 0},//Qiraj Wasp {-8080, 1518, 2.61, 0},//Qiraj Wasp {-8081, 1514, 2.61, 0},//Qiraj Tank {-8081, 1520, 2.61, 0},//Qiraj Tank {-8081, 1526, 2.61, 0},//Qiraj Tank {-8081, 1512, 2.61, 0},//Qiraj Tank {-8082, 1520, 2.61, 0},//Qiraj Tank {-8081, 1528, 2.61, 0},//Qiraj Tank {-8082, 1513, 2.61, 3.141592},//Anubisath Conqueror {-8082, 1520, 2.61, 3.141592},//Anubisath Conqueror {-8082, 1527, 2.61, 3.141592},//Anubisath Conqueror }; struct WaveData { uint8 SpawnCount, UsedSpawnPoint; uint32 CreatureId, SpawnTimer, YellTimer, DespTimer; int32 WaveTextId; }; static WaveData WavesInfo[] = { {30, 0, 15423, 0, 0,24000, NULL}, //Kaldorei Soldier {3, 35, 15424, 0, 0,24000, NULL}, //Anubisath Conqueror {12, 38, 15414, 0, 0,24000, NULL}, //Qiraji Wasps {6, 50, 15422, 0, 0,24000, NULL}, //Qiraji Tanks {15, 15, 15423, 0, 0,24000, NULL} //Kaldorei Soldier }; struct SpawnSpells { uint32 Timer1, Timer2, SpellId; }; static SpawnSpells SpawnCast[]=// { {100000, 2000, 33652}, // Stop Time {38500, 300000, 28528}, // Poison Cloud {58000, 300000, 35871}, // Frost Debuff (need correct spell) {80950, 300000, 42075}, // Fire Explosion (need correct spell however this one looks cool) }; /*##### # npc_anachronos_the_ancient ######*/ struct npc_anachronos_the_ancientAI : public ScriptedAI { npc_anachronos_the_ancientAI(Creature* c) : ScriptedAI(c) {} uint32 AnimationTimer; uint8 AnimationCount; uint64 AnachronosQuestTriggerGUID; uint64 MerithraGUID; uint64 ArygosGUID; uint64 CaelestraszGUID; uint64 FandralGUID; uint64 PlayerGUID; bool eventEnd; void Reset() { AnimationTimer = 1500; AnimationCount = 0; AnachronosQuestTriggerGUID = 0; MerithraGUID = 0; ArygosGUID = 0; CaelestraszGUID = 0; FandralGUID = 0; PlayerGUID = 0; eventEnd = false; m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } void HandleAnimation() { Player* plr = Unit::GetPlayer(PlayerGUID); if (!plr) return; Unit* Fandral = plr->FindNearestCreature(C_FANDRAL_STAGHELM, 100, m_creature); Unit* Arygos = plr->FindNearestCreature(C_ARYGOS, 100,m_creature); Unit* Caelestrasz = plr->FindNearestCreature(C_CAELESTRASZ, 100, m_creature); Unit* Merithra = plr->FindNearestCreature(C_MERITHRA, 100,m_creature); if (!Fandral || !Arygos || !Caelestrasz || !Merithra) return; Unit* mob; AnimationTimer = EventAnim[AnimationCount].Timer; if (eventEnd == false) { switch(AnimationCount) { case 0: DoScriptText(ANACHRONOS_SAY_1, m_creature , Fandral); break; case 1: Fandral->SetUInt64Value(UNIT_FIELD_TARGET, m_creature->GetGUID()); DoScriptText(FANDRAL_SAY_1, Fandral,m_creature); break; case 2: Fandral->SetUInt64Value(UNIT_FIELD_TARGET,NULL); DoScriptText(MERITHRA_EMOTE_1,Merithra); break; case 3: DoScriptText(MERITHRA_SAY_1,Merithra); break; case 4: DoScriptText(ARYGOS_EMOTE_1,Arygos); break; case 5: Caelestrasz->SetUInt64Value(UNIT_FIELD_TARGET, Fandral->GetGUID()); DoScriptText(CAELESTRASZ_SAY_1, Caelestrasz); break; case 6: DoScriptText(MERITHRA_SAY_2, Merithra); break; case 7: Caelestrasz->SetUInt64Value(UNIT_FIELD_TARGET, NULL); Merithra->GetMotionMaster()->MoveCharge(-8065,1530,2.61,10); break; case 8: DoScriptText(MERITHRA_YELL_1,Merithra); break; case 9: Merithra->CastSpell(Merithra,25105,true); break; case 10: Merithra->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); Merithra->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); Merithra->GetMotionMaster()->MoveCharge(-8065,1530,6.61,3); break; case 11: Merithra->CastSpell(Merithra,24818,false); break; case 12: Merithra->GetMotionMaster()->MoveCharge(-8150,1530,50,7); break; case 13: break; case 14: DoScriptText(ARYGOS_SAY_1,Arygos); break; case 15: Arygos->GetMotionMaster()->MoveCharge(-8065,1530,2.61,10); Merithra->SetVisibility(VISIBILITY_OFF); break; case 16: DoScriptText(ARYGOS_YELL_1, Arygos); break; case 17: Arygos->CastSpell(Arygos,25107,true); break; case 18: Arygos->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); Arygos->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); Arygos->GetMotionMaster()->MoveCharge(-8065,1530,6.61,3); break; case 19: Arygos->CastSpell(Arygos,50505,false); break; case 20: Arygos->GetMotionMaster()->MoveCharge(-8150,1530,50,7); break; case 21: break; case 22: DoScriptText(CAELESTRASZ_SAY_2,Caelestrasz, Fandral); break; case 23: Caelestrasz->GetMotionMaster()->MoveCharge(-8065,1530,2.61,10); Arygos->SetVisibility(VISIBILITY_OFF); break; case 24: DoScriptText(CAELESTRASZ_YELL_1, Caelestrasz); break; case 25: Caelestrasz->CastSpell(Caelestrasz,25106,true); break; case 26: Caelestrasz->HandleEmoteCommand(254); Caelestrasz->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); Caelestrasz->GetMotionMaster()->MoveCharge(-8065,1530,7.61,3); break; case 27: Caelestrasz->CastSpell(Caelestrasz,54293,false); break; case 28: DoScriptText(ANACHRONOS_SAY_2,m_creature, Fandral); break; case 29: Caelestrasz->GetMotionMaster()->MoveCharge(-8150,1530,50,7); DoScriptText(FANDRAL_SAY_2, Fandral, m_creature); break; case 30: break; case 31: DoScriptText(ANACHRONOS_SAY_3, m_creature, Fandral); break; case 32: Caelestrasz->SetVisibility(VISIBILITY_OFF); Fandral->GetMotionMaster()->MoveCharge(-8108,1529,2.77,8); m_creature->GetMotionMaster()->MoveCharge(-8113,1525,2.77,8); break;//both run to the gate case 33: DoScriptText(ANACHRONOS_SAY_4, m_creature); Caelestrasz->GetMotionMaster()->MoveCharge(-8165,1530,65,7); break; //Text: sands will stop case 34: DoCast(plr, 23017, true);//Arcane Channeling break; case 35: m_creature->CastSpell(-8088,1520.43,2.67,25158,true); break; case 36: DoCast(plr, 25159, true); break; case 37: m_creature->SummonGameObject(GO_GATE_OF_AHN_QIRAJ,-8130,1525,17.5,0,0,0,0,0,0); break; case 38: DoCast(plr, 25166, true); m_creature->SummonGameObject(GO_GLYPH_OF_AHN_QIRAJ,-8130,1525,17.5,0,0,0,0,0,0); break; case 39: DoScriptText(ANACHRONOS_SAY_5, m_creature, Fandral); break; case 40: Fandral->CastSpell(m_creature, 25167, true); break; case 41: Fandral->SummonGameObject(GO_ROOTS_OF_AHN_QIRAJ,-8130,1525,17.5,0,0,0,0,0,0); DoScriptText(FANDRAL_SAY_3, Fandral); break; case 42: m_creature->CastStop(); DoScriptText(FANDRAL_EMOTE_1, Fandral); break; case 43: Fandral->CastStop(); break; case 44: DoScriptText(ANACHRONOS_SAY_6, m_creature); break; case 45: DoScriptText(ANACHRONOS_SAY_7, m_creature); break; case 46: DoScriptText(ANACHRONOS_SAY_8, m_creature); m_creature->GetMotionMaster()->MoveCharge(-8110,1527,2.77,4); break; case 47: DoScriptText(ANACHRONOS_EMOTE_1, m_creature); break; case 48: DoScriptText(FANDRAL_SAY_4,Fandral,m_creature); break; case 49: DoScriptText(FANDRAL_SAY_5,Fandral,m_creature); break; case 50: DoScriptText(FANDRAL_EMOTE_2,Fandral); Fandral->CastSpell(-8127,1525,17.5,33806,true); break; case 51: while (mob = plr->FindNearestCreature(15423,50,m_creature)) mob->RemoveFromWorld(); while (mob = plr->FindNearestCreature(15424,50,m_creature)) mob->RemoveFromWorld(); while (mob = plr->FindNearestCreature(15414,50,m_creature)) mob->RemoveFromWorld(); while (mob = plr->FindNearestCreature(15422,50,m_creature)) mob->RemoveFromWorld(); break; case 52: Fandral->GetMotionMaster()->MoveCharge(-8028.75, 1538.795, 2.61,4); DoScriptText(ANACHRONOS_SAY_9, m_creature,Fandral); break; case 53: DoScriptText(FANDRAL_SAY_6,Fandral); break; case 54: DoScriptText(ANACHRONOS_EMOTE_2,m_creature); break; case 55: Fandral->SetVisibility(VISIBILITY_OFF); break; case 56: DoScriptText(ANACHRONOS_EMOTE_3, m_creature); m_creature->GetMotionMaster()->MoveCharge(-8116,1522,3.65,4); break; case 57: m_creature->GetMotionMaster()->MoveCharge(-8116.7,1527,3.7,4); break; case 58: m_creature->GetMotionMaster()->MoveCharge(-8112.67,1529.9,2.86,4); break; case 59: m_creature->GetMotionMaster()->MoveCharge(-8117.99,1532.24,3.94,4); break; case 60: if (plr) DoScriptText(ANACHRONOS_SAY_10, m_creature,plr); m_creature->GetMotionMaster()->MoveCharge(-8113.46,1524.16,2.89,4); break; case 61: m_creature->GetMotionMaster()->MoveCharge(-8057.1,1470.32,2.61,6); if (plr->IsInRange(m_creature,0,15)) plr->GroupEventHappens(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD ,m_creature); break; case 62: m_creature->SetDisplayId(15500); break; case 63: m_creature->HandleEmoteCommand(254); m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING); break; case 64: m_creature->GetMotionMaster()->MoveCharge(-8000,1400,150,9); break; case 65: m_creature->SetVisibility(VISIBILITY_OFF); if (Creature* AnachronosQuestTrigger = (Unit::GetCreature(*m_creature, AnachronosQuestTriggerGUID))) { DoScriptText(ARYGOS_YELL_1,m_creature); AnachronosQuestTrigger->AI()->EnterEvadeMode(); eventEnd=true; } break; } } ++AnimationCount; } void UpdateAI(const uint32 diff) { if (AnimationTimer) { if (AnimationTimer <= diff) HandleAnimation(); else AnimationTimer -= diff; } if (AnimationCount < 65) m_creature->CombatStop(); if (AnimationCount == 65 || eventEnd) m_creature->AI()->EnterEvadeMode(); } }; /*###### # mob_qiraj_war_spawn ######*/ struct mob_qiraj_war_spawnAI : public ScriptedAI { mob_qiraj_war_spawnAI(Creature* c) : ScriptedAI(c) {} uint64 MobGUID; uint64 PlayerGUID; uint32 SpellTimer1, SpellTimer2, SpellTimer3,SpellTimer4; bool Timers; bool hasTarget; void Reset() { MobGUID = 0; PlayerGUID = 0; Timers = false; hasTarget = false; } void EnterCombat(Unit* who) {} void JustDied(Unit* slayer); void UpdateAI(const uint32 diff) { Unit *pTarget; Player* plr = m_creature->GetPlayer(PlayerGUID); if (!Timers) { if (m_creature->GetEntry() == 15424 || m_creature->GetEntry() == 15422 || m_creature->GetEntry() == 15414) //all but Kaldorei Soldiers { SpellTimer1 = SpawnCast[1].Timer1; SpellTimer2 = SpawnCast[2].Timer1; SpellTimer3 = SpawnCast[3].Timer1; } if (m_creature->GetEntry() == 15423 || m_creature->GetEntry() == 15424 || m_creature->GetEntry() == 15422 || m_creature->GetEntry() == 15414) SpellTimer4 = SpawnCast[0].Timer1; Timers = true; } if (m_creature->GetEntry() == 15424 || m_creature->GetEntry() == 15422|| m_creature->GetEntry() == 15414) { if (SpellTimer1 <= diff) { DoCast(m_creature, SpawnCast[1].SpellId); DoCast(m_creature, 24319); SpellTimer1 = SpawnCast[1].Timer2; } else SpellTimer1 -= diff; if (SpellTimer2 <= diff) { DoCast(m_creature, SpawnCast[2].SpellId); SpellTimer2 = SpawnCast[2].Timer2; } else SpellTimer2 -= diff; if (SpellTimer3 <= diff) { DoCast(m_creature, SpawnCast[3].SpellId); SpellTimer3 = SpawnCast[3].Timer2; } else SpellTimer3 -= diff; } if (m_creature->GetEntry() == 15423 || m_creature->GetEntry() == 15424 || m_creature->GetEntry() == 15422 || m_creature->GetEntry() == 15414) { if (SpellTimer4 <= diff) { m_creature->RemoveAllAttackers(); m_creature->AttackStop(); DoCast(m_creature, 15533); SpellTimer4 = SpawnCast[0].Timer2; } else SpellTimer4 -= diff; } if (!hasTarget) { if (m_creature->GetEntry() == 15424 || m_creature->GetEntry() == 15422 || m_creature->GetEntry() == 15414) pTarget = m_creature->FindNearestCreature(15423,20,true); if (m_creature->GetEntry() == 15423) { uint8 tar = urand(0,2); if (tar == 0) pTarget = m_creature->FindNearestCreature(15422,20,true); else if (tar == 1) pTarget = m_creature->FindNearestCreature(15424,20,true); else if (tar == 2) pTarget = m_creature->FindNearestCreature(15414,20,true); } hasTarget = true; if (pTarget) m_creature->AI()->AttackStart(pTarget); } if (!(m_creature->FindNearestCreature(15379,100))) DoCast(m_creature, 33652); if (!UpdateVictim()) { hasTarget = false; return; } DoMeleeAttackIfReady(); } }; /*##### # npc_anachronos_quest_trigger #####*/ struct npc_anachronos_quest_triggerAI : public ScriptedAI { npc_anachronos_quest_triggerAI(Creature* c) : ScriptedAI(c) {} uint64 PlayerGUID; uint32 WaveTimer; uint32 AnnounceTimer; int8 LiveCount; uint8 WaveCount; bool EventStarted; bool Announced; bool Failed; void Reset() { PlayerGUID = 0; WaveTimer = 2000; AnnounceTimer = 1000; LiveCount = 0; WaveCount = 0; EventStarted = false; Announced = false; Failed = false; m_creature->SetVisibility(VISIBILITY_OFF); } void SummonNextWave() { uint8 count = WavesInfo[WaveCount].SpawnCount; uint8 locIndex = WavesInfo[WaveCount].UsedSpawnPoint; srand(time(NULL));//initializing random seed uint8 KaldoreiSoldierCount = 0; uint8 AnubisathConquerorCount = 0; uint8 QirajiWaspCount = 0; for (uint8 i = 0; i < 67; ++i) { Creature* Spawn = NULL; float X = SpawnLocation[locIndex + i].x; float Y = SpawnLocation[locIndex + i].y; float Z = SpawnLocation[locIndex + i].z; float O = SpawnLocation[locIndex + i].o; uint32 desptimer = WavesInfo[WaveCount].DespTimer; Spawn = m_creature->SummonCreature(WavesInfo[WaveCount].CreatureId, X, Y, Z, O, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, desptimer); if (Spawn) { Spawn->LoadCreaturesAddon(); if (Spawn->GetGUID()== 15423) Spawn->SetUInt32Value(UNIT_FIELD_DISPLAYID,15427+rand()%4); if (i >= 30) WaveCount = 1; if (i >= 33) WaveCount = 2; if (i >= 45) WaveCount = 3; if (i >= 51) WaveCount = 4; if (WaveCount < 5) //1-4 Wave { CAST_AI(mob_qiraj_war_spawnAI, Spawn->AI())->MobGUID = m_creature->GetGUID(); CAST_AI(mob_qiraj_war_spawnAI, Spawn->AI())->PlayerGUID = PlayerGUID; } } } WaveTimer = WavesInfo[WaveCount].SpawnTimer; AnnounceTimer = WavesInfo[WaveCount].YellTimer; } void CheckEventFail() { Player* pPlayer = Unit::GetPlayer(PlayerGUID); if (!pPlayer) return; if (Group *EventGroup = pPlayer->GetGroup()) { Player* GroupMember; uint8 GroupMemberCount = 0; uint8 DeadMemberCount = 0; uint8 FailedMemberCount = 0; const Group::MemberSlotList members = EventGroup->GetMemberSlots(); for (Group::member_citerator itr = members.begin(); itr!= members.end(); ++itr) { GroupMember = (Unit::GetPlayer(itr->guid)); if (!GroupMember) continue; if (!GroupMember->IsWithinDistInMap(m_creature, EVENT_AREA_RADIUS) && GroupMember->GetQuestStatus(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) == QUEST_STATUS_INCOMPLETE) { GroupMember->FailQuest(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD); GroupMember->SetQuestStatus(QUEST_A_PAWN_ON_THE_ETERNAL_BOARD, QUEST_STATUS_NONE); ++FailedMemberCount; } ++GroupMemberCount; if (GroupMember->isDead()) ++DeadMemberCount; } if (GroupMemberCount == FailedMemberCount || !pPlayer->IsWithinDistInMap(m_creature, EVENT_AREA_RADIUS)) Failed = true; //only so event can restart } } void LiveCounter() { --LiveCount; if (!LiveCount) Announced = false; } void UpdateAI(const uint32 diff) { if (!PlayerGUID || !EventStarted) return; if (WaveCount < 4) { if (!Announced && AnnounceTimer <= diff) { DoScriptText(WavesInfo[WaveCount].WaveTextId, m_creature); Announced = true; } else AnnounceTimer -= diff; if (WaveTimer <= diff) SummonNextWave(); else WaveTimer -= diff; } CheckEventFail(); if (WaveCount == 4 || Failed) EnterEvadeMode(); }; }; void mob_qiraj_war_spawnAI::JustDied(Unit* slayer) { m_creature->RemoveCorpse(); if (Creature* Mob = (Unit::GetCreature(*m_creature, MobGUID))) CAST_AI(npc_anachronos_quest_triggerAI, Mob->AI())->LiveCounter(); }; /*##### # go_crystalline_tear ######*/ bool GOQuestAccept_GO_crystalline_tear(Player* plr, GameObject* go, Quest const* quest) { if (quest->GetQuestId() == QUEST_A_PAWN_ON_THE_ETERNAL_BOARD) { if (Unit* Anachronos_Quest_Trigger = go->FindNearestCreature(15454, 100, plr)) { Unit *Merithra = Anachronos_Quest_Trigger->SummonCreature(15378,-8034.535,1535.14,2.61,0,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,150000); Unit *Caelestrasz = Anachronos_Quest_Trigger->SummonCreature(15379,-8032.767, 1533.148,2.61, 1.5,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,150000); Unit *Arygos = Anachronos_Quest_Trigger->SummonCreature(15380,-8034.52, 1537.843, 2.61, 5.7,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,150000); /* Unit *Fandral = */ Anachronos_Quest_Trigger->SummonCreature(15382,-8028.462, 1535.843, 2.61, 3.141592,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,215000); Creature *Anachronos = Anachronos_Quest_Trigger->SummonCreature(15381,-8028.75, 1538.795, 2.61, 4,TEMPSUMMON_TIMED_OR_DEAD_DESPAWN,220000); if (Merithra) { Merithra->SetUInt32Value(UNIT_NPC_FLAGS, 0); Merithra->SetUInt32Value(UNIT_FIELD_BYTES_1,0); Merithra->SetUInt32Value(UNIT_FIELD_DISPLAYID,15420); Merithra->setFaction(35); } if (Caelestrasz) { Caelestrasz->SetUInt32Value(UNIT_NPC_FLAGS, 0); Caelestrasz->SetUInt32Value(UNIT_FIELD_BYTES_1,0); Caelestrasz->SetUInt32Value(UNIT_FIELD_DISPLAYID,15419); Caelestrasz->setFaction(35); } if (Arygos) { Arygos->SetUInt32Value(UNIT_NPC_FLAGS, 0); Arygos->SetUInt32Value(UNIT_FIELD_BYTES_1,0); Arygos->SetUInt32Value(UNIT_FIELD_DISPLAYID,15418); Arygos->setFaction(35); } if (Anachronos) { CAST_AI(npc_anachronos_the_ancientAI, Anachronos->AI())->PlayerGUID = plr->GetGUID(); CAST_AI(npc_anachronos_quest_triggerAI, CAST_CRE(Anachronos_Quest_Trigger)->AI())->Failed=false; CAST_AI(npc_anachronos_quest_triggerAI, CAST_CRE(Anachronos_Quest_Trigger)->AI())->PlayerGUID = plr->GetGUID(); CAST_AI(npc_anachronos_quest_triggerAI, CAST_CRE(Anachronos_Quest_Trigger)->AI())->EventStarted=true; CAST_AI(npc_anachronos_quest_triggerAI, CAST_CRE(Anachronos_Quest_Trigger)->AI())->Announced=true; } } } return true; } CreatureAI* GetAI_npc_anachronos_quest_trigger(Creature* c) { return new npc_anachronos_quest_triggerAI(c); } CreatureAI* GetAI_mob_qiraj_war_spawn(Creature* c) { return new mob_qiraj_war_spawnAI(c); } CreatureAI* GetAI_npc_anachronos_the_ancient(Creature* c) { return new npc_anachronos_the_ancientAI(c); } void AddSC_silithus() { Script *newscript; newscript = new Script; newscript->Name = "go_crystalline_tear"; newscript->pGOQuestAccept = &GOQuestAccept_GO_crystalline_tear; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_anachronos_quest_trigger"; newscript->GetAI = &GetAI_npc_anachronos_quest_trigger; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_anachronos_the_ancient"; newscript->GetAI = &GetAI_npc_anachronos_the_ancient; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "mob_qiraj_war_spawn"; newscript->GetAI = &GetAI_mob_qiraj_war_spawn; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npc_highlord_demitrian"; newscript->pGossipHello = &GossipHello_npc_highlord_demitrian; newscript->pGossipSelect = &GossipSelect_npc_highlord_demitrian; newscript->RegisterSelf(); newscript = new Script; newscript->Name = "npcs_rutgar_and_frankal"; newscript->pGossipHello = &GossipHello_npcs_rutgar_and_frankal; newscript->pGossipSelect = &GossipSelect_npcs_rutgar_and_frankal; newscript->RegisterSelf(); }