/* * Copyright (C) 2008-2011 TrinityCore * 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, see . */ /* ScriptData SDName: Nagrand SD%Complete: 90 SDComment: Quest support: 9849, 9868, 9918, 9874, 9991, 10107, 10108, 10044, 10172, 10646, 10085, 10987. TextId's unknown for altruis_the_sufferer and greatmother_geyah (npc_text) SDCategory: Nagrand EndScriptData */ /* ContentData mob_shattered_rumbler mob_lump npc_altruis_the_sufferer npc_greatmother_geyah npc_lantresor_of_the_blade npc_maghar_captive npc_creditmarker_visit_with_ancestors mob_sparrowhawk EndContentData */ #include "ScriptPCH.h" #include "ScriptedEscortAI.h" /*###### ## mob_shattered_rumbler - this should be done with ACID ######*/ class mob_shattered_rumbler : public CreatureScript { public: mob_shattered_rumbler() : CreatureScript("mob_shattered_rumbler") { } CreatureAI* GetAI(Creature* creature) const { return new mob_shattered_rumblerAI (creature); } struct mob_shattered_rumblerAI : public ScriptedAI { bool Spawn; mob_shattered_rumblerAI(Creature* c) : ScriptedAI(c) {} void Reset() { Spawn = false; } void EnterCombat(Unit* /*who*/) {} void SpellHit(Unit* Hitter, const SpellInfo *Spellkind) { if (Spellkind->Id == 32001 && !Spawn) { float x = me->GetPositionX(); float y = me->GetPositionY(); float z = me->GetPositionZ(); Hitter->SummonCreature(18181, x+(0.7f * (rand()%30)), y+(rand()%5), z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000); Hitter->SummonCreature(18181, x+(rand()%5), y-(rand()%5), z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000); Hitter->SummonCreature(18181, x-(rand()%5), y+(0.5f *(rand()%60)), z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 60000); me->setDeathState(CORPSE); Spawn = true; } return; } }; }; /*###### ## mob_lump ######*/ #define SPELL_VISUAL_SLEEP 16093 #define SPELL_SPEAR_THROW 32248 #define LUMP_SAY0 -1000190 #define LUMP_SAY1 -1000191 #define LUMP_DEFEAT -1000192 #define GOSSIP_HL "I need answers, ogre!" #define GOSSIP_SL1 "Why are Boulderfist out this far? You know that this is Kurenai territory." #define GOSSIP_SL2 "And you think you can just eat anything you want? You're obviously trying to eat the Broken of Telaar." #define GOSSIP_SL3 "This means war, Lump! War I say!" class mob_lump : public CreatureScript { public: mob_lump() : CreatureScript("mob_lump") { } bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) { player->PlayerTalkClass->ClearMenus(); switch (uiAction) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SL1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); player->SEND_GOSSIP_MENU(9353, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SL2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); player->SEND_GOSSIP_MENU(9354, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SL3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); player->SEND_GOSSIP_MENU(9355, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+3: player->SEND_GOSSIP_MENU(9356, creature->GetGUID()); player->TalkedToCreature(18354, creature->GetGUID()); break; } return true; } bool OnGossipHello(Player* player, Creature* creature) { if (player->GetQuestStatus(9918) == QUEST_STATUS_INCOMPLETE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); player->SEND_GOSSIP_MENU(9352, creature->GetGUID()); return true; } CreatureAI* GetAI(Creature* creature) const { return new mob_lumpAI(creature); } struct mob_lumpAI : public ScriptedAI { mob_lumpAI(Creature* c) : ScriptedAI(c) { bReset = false; } uint32 Reset_Timer; uint32 Spear_Throw_Timer; bool bReset; void Reset() { Reset_Timer = 60000; Spear_Throw_Timer = 2000; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } void AttackedBy(Unit* pAttacker) { if (me->getVictim()) return; if (me->IsFriendlyTo(pAttacker)) return; AttackStart(pAttacker); } void DamageTaken(Unit* done_by, uint32 & damage) { if (done_by->GetTypeId() == TYPEID_PLAYER && me->HealthBelowPctDamaged(30, damage)) { if (!bReset && CAST_PLR(done_by)->GetQuestStatus(9918) == QUEST_STATUS_INCOMPLETE) { //Take 0 damage damage = 0; CAST_PLR(done_by)->AttackStop(); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->RemoveAllAuras(); me->DeleteThreatList(); me->CombatStop(true); me->setFaction(1080); //friendly me->SetStandState(UNIT_STAND_STATE_SIT); DoScriptText(LUMP_DEFEAT, me); bReset = true; } } } void EnterCombat(Unit* /*who*/) { if (me->HasAura(SPELL_VISUAL_SLEEP)) me->RemoveAura(SPELL_VISUAL_SLEEP); if (!me->IsStandState()) me->SetStandState(UNIT_STAND_STATE_STAND); DoScriptText(RAND(LUMP_SAY0, LUMP_SAY1), me); } void UpdateAI(const uint32 diff) { //check if we waiting for a reset if (bReset) { if (Reset_Timer <= diff) { EnterEvadeMode(); bReset = false; me->setFaction(1711); //hostile return; } else Reset_Timer -= diff; } //Return since we have no target if (!UpdateVictim()) return; //Spear_Throw_Timer if (Spear_Throw_Timer <= diff) { DoCast(me->getVictim(), SPELL_SPEAR_THROW); Spear_Throw_Timer = 20000; } else Spear_Throw_Timer -= diff; DoMeleeAttackIfReady(); } }; }; /*###### ## npc_altruis_the_sufferer ######*/ #define GOSSIP_HATS1 "I see twisted steel and smell sundered earth." #define GOSSIP_HATS2 "Well...?" #define GOSSIP_HATS3 "[PH] Story about Illidan's Pupil" #define GOSSIP_SATS1 "Legion?" #define GOSSIP_SATS2 "And now?" #define GOSSIP_SATS3 "How do you see them now?" #define GOSSIP_SATS4 "Forge camps?" #define GOSSIP_SATS5 "Ok." #define GOSSIP_SATS6 "[PH] Story done" class npc_altruis_the_sufferer : public CreatureScript { public: npc_altruis_the_sufferer() : CreatureScript("npc_altruis_the_sufferer") { } bool OnQuestAccept(Player* player, Creature* /*creature*/, Quest const* /*quest*/) { if (!player->GetQuestRewardStatus(9991)) //Survey the Land, q-id 9991 { player->CLOSE_GOSSIP_MENU(); player->ActivateTaxiPathTo(532); //TaxiPath 532 } return true; } bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) { player->PlayerTalkClass->ClearMenus(); switch (uiAction) { case GOSSIP_ACTION_INFO_DEF+10: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SATS1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); player->SEND_GOSSIP_MENU(9420, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+11: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SATS2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); player->SEND_GOSSIP_MENU(9421, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+12: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SATS3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); player->SEND_GOSSIP_MENU(9422, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+13: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SATS4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); player->SEND_GOSSIP_MENU(9423, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+14: player->SEND_GOSSIP_MENU(9424, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+20: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SATS5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 21); player->SEND_GOSSIP_MENU(9427, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+21: player->CLOSE_GOSSIP_MENU(); player->AreaExploredOrEventHappens(9991); break; case GOSSIP_ACTION_INFO_DEF+30: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SATS6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 31); player->SEND_GOSSIP_MENU(384, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+31: player->CLOSE_GOSSIP_MENU(); player->AreaExploredOrEventHappens(10646); break; } return true; } bool OnGossipHello(Player* player, Creature* creature) { if (creature->isQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); //gossip before obtaining Survey the Land if (player->GetQuestStatus(9991) == QUEST_STATUS_NONE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HATS1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+10); //gossip when Survey the Land is incomplete (technically, after the flight) if (player->GetQuestStatus(9991) == QUEST_STATUS_INCOMPLETE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HATS2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+20); //wowwiki.com/Varedis if (player->GetQuestStatus(10646) == QUEST_STATUS_INCOMPLETE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HATS3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+30); player->SEND_GOSSIP_MENU(9419, creature->GetGUID()); return true; } }; /*###### ## npc_greatmother_geyah ######*/ #define GOSSIP_HGG1 "Hello, Greatmother. Garrosh told me that you wanted to speak with me." #define GOSSIP_HGG2 "Garrosh is beyond redemption, Greatmother. I fear that in helping the Mag'har, I have convinced Garrosh that he is unfit to lead." #define GOSSIP_SGG1 "You raised all of the orcs here, Greatmother?" #define GOSSIP_SGG2 "Do you believe that?" #define GOSSIP_SGG3 "What can be done? I have tried many different things. I have done my best to help the people of Nagrand. Each time I have approached Garrosh, he has dismissed me." #define GOSSIP_SGG4 "Left? How can you choose to leave?" #define GOSSIP_SGG5 "What is this duty?" #define GOSSIP_SGG6 "Is there anything I can do for you, Greatmother?" #define GOSSIP_SGG7 "I have done all that I could, Greatmother. I thank you for your kind words." #define GOSSIP_SGG8 "Greatmother, you are the mother of Durotan?" #define GOSSIP_SGG9 "Greatmother, I never had the honor. Durotan died long before my time, but his heroics are known to all on my world. The orcs of Azeroth reside in a place known as Durotar, named after your son. And ... (You take a moment to breathe and think through what you are about to tell the Greatmother.)" #define GOSSIP_SGG10 "It is my Warchief, Greatmother. The leader of my people. From my world. He ... He is the son of Durotan. He is your grandchild." #define GOSSIP_SGG11 "I will return to Azeroth at once, Greatmother." //all the textId's for the below is unknown, but i do believe the gossip item texts are proper. class npc_greatmother_geyah : public CreatureScript { public: npc_greatmother_geyah() : CreatureScript("npc_greatmother_geyah") { } bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) { player->PlayerTalkClass->ClearMenus(); switch (uiAction) { case GOSSIP_ACTION_INFO_DEF + 1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 2: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 3: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 4: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 5: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 6: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 7: player->AreaExploredOrEventHappens(10044); player->CLOSE_GOSSIP_MENU(); break; case GOSSIP_ACTION_INFO_DEF + 10: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 11); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 11: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 12); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 12: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 13); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 13: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 14); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 14: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SGG11, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 15); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF + 15: player->AreaExploredOrEventHappens(10172); player->CLOSE_GOSSIP_MENU(); break; } return true; } bool OnGossipHello(Player* player, Creature* creature) { if (creature->isQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); if (player->GetQuestStatus(10044) == QUEST_STATUS_INCOMPLETE) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HGG1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); } else if (player->GetQuestStatus(10172) == QUEST_STATUS_INCOMPLETE) { player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HGG2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 10); player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); } else player->SEND_GOSSIP_MENU(player->GetGossipTextId(creature), creature->GetGUID()); return true; } }; /*###### ## npc_lantresor_of_the_blade ######*/ #define GOSSIP_HLB "I have killed many of your ogres, Lantresor. I have no fear." #define GOSSIP_SLB1 "Should I know? You look like an orc to me." #define GOSSIP_SLB2 "And the other half?" #define GOSSIP_SLB3 "I have heard of your kind, but I never thought to see the day when I would meet a half-breed." #define GOSSIP_SLB4 "My apologies. I did not mean to offend. I am here on behalf of my people." #define GOSSIP_SLB5 "My people ask that you pull back your Boulderfist ogres and cease all attacks on our territories. In return, we will also pull back our forces." #define GOSSIP_SLB6 "We will fight you until the end, then, Lantresor. We will not stand idly by as you pillage our towns and kill our people." #define GOSSIP_SLB7 "What do I need to do?" class npc_lantresor_of_the_blade : public CreatureScript { public: npc_lantresor_of_the_blade() : CreatureScript("npc_lantresor_of_the_blade") { } bool OnGossipSelect(Player* player, Creature* creature, uint32 /*uiSender*/, uint32 uiAction) { player->PlayerTalkClass->ClearMenus(); switch (uiAction) { case GOSSIP_ACTION_INFO_DEF: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SLB1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); player->SEND_GOSSIP_MENU(9362, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+1: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SLB2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 2); player->SEND_GOSSIP_MENU(9363, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+2: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SLB3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 3); player->SEND_GOSSIP_MENU(9364, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+3: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SLB4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 4); player->SEND_GOSSIP_MENU(9365, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+4: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SLB5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 5); player->SEND_GOSSIP_MENU(9366, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+5: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SLB6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 6); player->SEND_GOSSIP_MENU(9367, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+6: player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_SLB7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 7); player->SEND_GOSSIP_MENU(9368, creature->GetGUID()); break; case GOSSIP_ACTION_INFO_DEF+7: player->SEND_GOSSIP_MENU(9369, creature->GetGUID()); if (player->GetQuestStatus(10107) == QUEST_STATUS_INCOMPLETE) player->AreaExploredOrEventHappens(10107); if (player->GetQuestStatus(10108) == QUEST_STATUS_INCOMPLETE) player->AreaExploredOrEventHappens(10108); break; } return true; } bool OnGossipHello(Player* player, Creature* creature) { if (creature->isQuestGiver()) player->PrepareQuestMenu(creature->GetGUID()); if (player->GetQuestStatus(10107) == QUEST_STATUS_INCOMPLETE || player->GetQuestStatus(10108) == QUEST_STATUS_INCOMPLETE) player->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_HLB, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF); player->SEND_GOSSIP_MENU(9361, creature->GetGUID()); return true; } }; /*##### ## npc_maghar_captive #####*/ enum eMagharCaptive { SAY_MAG_START = -1000482, SAY_MAG_NO_ESCAPE = -1000483, SAY_MAG_MORE = -1000484, SAY_MAG_MORE_REPLY = -1000485, SAY_MAG_LIGHTNING = -1000486, SAY_MAG_SHOCK = -1000487, SAY_MAG_COMPLETE = -1000488, SPELL_CHAIN_LIGHTNING = 16006, SPELL_EARTHBIND_TOTEM = 15786, SPELL_FROST_SHOCK = 12548, SPELL_HEALING_WAVE = 12491, QUEST_TOTEM_KARDASH_H = 9868, NPC_MURK_RAIDER = 18203, NPC_MURK_BRUTE = 18211, NPC_MURK_SCAVENGER = 18207, NPC_MURK_PUTRIFIER = 18202 }; static float m_afAmbushA[]= {-1568.805786f, 8533.873047f, 1.958f}; static float m_afAmbushB[]= {-1491.554321f, 8506.483398f, 1.248f}; class npc_maghar_captive : public CreatureScript { public: npc_maghar_captive() : CreatureScript("npc_maghar_captive") { } bool OnQuestAccept(Player* player, Creature* creature, const Quest* pQuest) { if (pQuest->GetQuestId() == QUEST_TOTEM_KARDASH_H) { if (npc_maghar_captiveAI* pEscortAI = dynamic_cast(creature->AI())) { creature->SetStandState(UNIT_STAND_STATE_STAND); creature->setFaction(232); pEscortAI->Start(true, false, player->GetGUID(), pQuest); DoScriptText(SAY_MAG_START, creature); creature->SummonCreature(NPC_MURK_RAIDER, m_afAmbushA[0]+2.5f, m_afAmbushA[1]-2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); creature->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushA[0]-2.5f, m_afAmbushA[1]+2.5f, m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); creature->SummonCreature(NPC_MURK_BRUTE, m_afAmbushA[0], m_afAmbushA[1], m_afAmbushA[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); } } return true; } CreatureAI* GetAI(Creature* creature) const { return new npc_maghar_captiveAI(creature); } struct npc_maghar_captiveAI : public npc_escortAI { npc_maghar_captiveAI(Creature* creature) : npc_escortAI(creature) { Reset(); } uint32 m_uiChainLightningTimer; uint32 m_uiHealTimer; uint32 m_uiFrostShockTimer; void Reset() { m_uiChainLightningTimer = 1000; m_uiHealTimer = 0; m_uiFrostShockTimer = 6000; } void EnterCombat(Unit* /*who*/) { DoCast(me, SPELL_EARTHBIND_TOTEM, false); } void WaypointReached(uint32 uiPointId) { switch(uiPointId) { case 7: DoScriptText(SAY_MAG_MORE, me); if (Creature* pTemp = me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushB[0], m_afAmbushB[1], m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000)) DoScriptText(SAY_MAG_MORE_REPLY, pTemp); me->SummonCreature(NPC_MURK_PUTRIFIER, m_afAmbushB[0]-2.5f, m_afAmbushB[1]-2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0]+2.5f, m_afAmbushB[1]+2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); me->SummonCreature(NPC_MURK_SCAVENGER, m_afAmbushB[0]+2.5f, m_afAmbushB[1]-2.5f, m_afAmbushB[2], 0.0f, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 25000); break; case 16: DoScriptText(SAY_MAG_COMPLETE, me); if (Player* player = GetPlayerForEscort()) player->GroupEventHappens(QUEST_TOTEM_KARDASH_H, me); SetRun(); break; } } void JustSummoned(Creature* summoned) { if (summoned->GetEntry() == NPC_MURK_BRUTE) DoScriptText(SAY_MAG_NO_ESCAPE, summoned); if (summoned->isTotem()) return; summoned->RemoveUnitMovementFlag(MOVEMENTFLAG_WALKING); summoned->GetMotionMaster()->MovePoint(0, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()); summoned->AI()->AttackStart(me); } void SpellHitTarget(Unit* /*pTarget*/, const SpellInfo* pSpell) { if (pSpell->Id == SPELL_CHAIN_LIGHTNING) { if (rand()%10) return; DoScriptText(SAY_MAG_LIGHTNING, me); } } void UpdateAI(const uint32 uiDiff) { npc_escortAI::UpdateAI(uiDiff); if (!me->getVictim()) return; if (m_uiChainLightningTimer <= uiDiff) { DoCast(me->getVictim(), SPELL_CHAIN_LIGHTNING); m_uiChainLightningTimer = urand(7000, 14000); } else m_uiChainLightningTimer -= uiDiff; if (HealthBelowPct(30)) { if (m_uiHealTimer <= uiDiff) { DoCast(me, SPELL_HEALING_WAVE); m_uiHealTimer = 5000; } else m_uiHealTimer -= uiDiff; } if (m_uiFrostShockTimer <= uiDiff) { DoCast(me->getVictim(), SPELL_FROST_SHOCK); m_uiFrostShockTimer = urand(7500, 15000); } else m_uiFrostShockTimer -= uiDiff; DoMeleeAttackIfReady(); } }; }; /*###### ## npc_creditmarker_visist_with_ancestors ######*/ class npc_creditmarker_visit_with_ancestors : public CreatureScript { public: npc_creditmarker_visit_with_ancestors() : CreatureScript("npc_creditmarker_visit_with_ancestors") { } CreatureAI* GetAI(Creature* creature) const { return new npc_creditmarker_visit_with_ancestorsAI (creature); } struct npc_creditmarker_visit_with_ancestorsAI : public ScriptedAI { npc_creditmarker_visit_with_ancestorsAI(Creature* c) : ScriptedAI(c) {} void Reset() {} void EnterCombat(Unit* /*who*/) {} void MoveInLineOfSight(Unit* who) { if (!who) return; if (who->GetTypeId() == TYPEID_PLAYER) { if (CAST_PLR(who)->GetQuestStatus(10085) == QUEST_STATUS_INCOMPLETE) { uint32 creditMarkerId = me->GetEntry(); if ((creditMarkerId >= 18840) && (creditMarkerId <= 18843)) { // 18840: Sunspring, 18841: Laughing, 18842: Garadar, 18843: Bleeding if (!CAST_PLR(who)->GetReqKillOrCastCurrentCount(10085, creditMarkerId)) CAST_PLR(who)->KilledMonsterCredit(creditMarkerId, me->GetGUID()); } } } } }; }; /*###### ## mob_sparrowhawk ######*/ #define SPELL_SPARROWHAWK_NET 39810 #define SPELL_ITEM_CAPTIVE_SPARROWHAWK 39812 class mob_sparrowhawk : public CreatureScript { public: mob_sparrowhawk() : CreatureScript("mob_sparrowhawk") { } CreatureAI* GetAI(Creature* creature) const { return new mob_sparrowhawkAI (creature); } struct mob_sparrowhawkAI : public ScriptedAI { mob_sparrowhawkAI(Creature* c) : ScriptedAI(c) {} uint32 Check_Timer; uint64 PlayerGUID; bool fleeing; void Reset() { me->RemoveAurasDueToSpell(SPELL_SPARROWHAWK_NET); Check_Timer = 1000; PlayerGUID = 0; fleeing = false; } void AttackStart(Unit* who) { if (PlayerGUID) return; ScriptedAI::AttackStart(who); } void EnterCombat(Unit* /*who*/) {} void MoveInLineOfSight(Unit* who) { if (!who || PlayerGUID) return; if (!PlayerGUID && who->GetTypeId() == TYPEID_PLAYER && me->IsWithinDistInMap(who, 30) && CAST_PLR(who)->GetQuestStatus(10987) == QUEST_STATUS_INCOMPLETE) { PlayerGUID = who->GetGUID(); return; } ScriptedAI::MoveInLineOfSight(who); } void UpdateAI(const uint32 diff) { if (Check_Timer <= diff) { if (PlayerGUID) { if (fleeing && me->GetMotionMaster()->GetCurrentMovementGeneratorType() != FLEEING_MOTION_TYPE) fleeing = false; Player* player = Unit::GetPlayer(*me, PlayerGUID); if (player && me->IsWithinDistInMap(player, 30)) { if (!fleeing) { me->DeleteThreatList(); me->GetMotionMaster()->MoveFleeing(player); fleeing = true; } } else if (fleeing) { me->GetMotionMaster()->MovementExpired(false); PlayerGUID = 0; fleeing = false; } } Check_Timer = 1000; } else Check_Timer -= diff; if (PlayerGUID) return; ScriptedAI::UpdateAI(diff); } void SpellHit(Unit* caster, const SpellInfo *spell) { if (caster->GetTypeId() == TYPEID_PLAYER) { if (spell->Id == SPELL_SPARROWHAWK_NET && CAST_PLR(caster)->GetQuestStatus(10987) == QUEST_STATUS_INCOMPLETE) { DoCast(caster, SPELL_ITEM_CAPTIVE_SPARROWHAWK, true); me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE); } } return; } }; }; enum CorkiData { // first quest QUEST_HELP = 9923, NPC_CORKI = 18445, NPC_CORKI_CREDIT_1 = 18369, GO_CORKIS_PRISON = 182349, CORKI_SAY_THANKS = -1800071, // 2nd quest QUEST_CORKIS_GONE_MISSING_AGAIN = 9924, NPC_CORKI_2 = 20812, GO_CORKIS_PRISON_2 = 182350, CORKI_SAY_PROMISE = -1800072, // 3rd quest QUEST_CHOWAR_THE_PILLAGER = 9955, NPC_CORKI_3 = 18369, NPC_CORKI_CREDIT_3 = 18444, GO_CORKIS_PRISON_3 = 182521, CORKI_SAY_LAST = -1800073 }; class go_corkis_prison : public GameObjectScript { public: go_corkis_prison() : GameObjectScript("go_corkis_prison") { } bool OnGossipHello(Player* player, GameObject* go) { if (go->GetEntry() == GO_CORKIS_PRISON) { if (Creature* corki = go->FindNearestCreature(NPC_CORKI, 25, true)) { go->SetGoState(GO_STATE_READY); corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+5, go->GetPositionY(), go->GetPositionZ()); if (player) player->KilledMonsterCredit(NPC_CORKI_CREDIT_1, 0); } } if (go->GetEntry() == GO_CORKIS_PRISON_2) { if (Creature* corki = go->FindNearestCreature(NPC_CORKI_2, 25, true)) { go->SetGoState(GO_STATE_READY); corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()-5, go->GetPositionY(), go->GetPositionZ()); if (player) player->KilledMonsterCredit(NPC_CORKI_2, 0); } } if (go->GetEntry() == GO_CORKIS_PRISON_3) { if (Creature* corki = go->FindNearestCreature(NPC_CORKI_3, 25, true)) { go->SetGoState(GO_STATE_READY); corki->GetMotionMaster()->MovePoint(1, go->GetPositionX()+4, go->GetPositionY(), go->GetPositionZ()); if (player) player->KilledMonsterCredit(NPC_CORKI_CREDIT_3, 0); } } return true; } }; /*###### ## npc_corki ######*/ class npc_corki : public CreatureScript { public: npc_corki() : CreatureScript("npc_corki") { } CreatureAI *GetAI(Creature* creature) const { return new npc_corkiAI(creature); } struct npc_corkiAI : public ScriptedAI { npc_corkiAI(Creature* creature) : ScriptedAI(creature) {} uint32 Say_Timer; bool ReleasedFromCage; void Reset() { ReleasedFromCage = false; } void UpdateAI(uint32 const diff) { if (Say_Timer <= diff && ReleasedFromCage) { me->ForcedDespawn(); ReleasedFromCage = false; } else Say_Timer -= diff; } void MovementInform(uint32 type, uint32 id) { if (type == POINT_MOTION_TYPE && id == 1) { Say_Timer = 5000; ReleasedFromCage = true; if (me->GetEntry() == NPC_CORKI) DoScriptText(CORKI_SAY_THANKS, me); if (me->GetEntry() == NPC_CORKI_2) DoScriptText(CORKI_SAY_PROMISE, me); if (me->GetEntry() == NPC_CORKI_3) DoScriptText(CORKI_SAY_LAST, me); } }; }; }; void AddSC_nagrand() { new mob_shattered_rumbler(); new mob_lump(); new npc_altruis_the_sufferer(); new npc_greatmother_geyah(); new npc_lantresor_of_the_blade(); new npc_maghar_captive(); new npc_creditmarker_visit_with_ancestors(); new mob_sparrowhawk(); new npc_corki(); new go_corkis_prison(); }