Share Pastebin
Guest
Public paste!

blackrock_depths.cpp

By: a guest | Mar 20th, 2010 | Syntax: None | Size: 48.64 KB | Hits: 55 | Expires: Never
Copy text to clipboard
  1. /* Copyright (C) 2006 - 2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
  2.  * This program is free software; you can redistribute it and/or modify
  3.  
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  16.  */
  17.  
  18. /* ScriptData
  19. SDName: Blackrock_Depths
  20. SD%Complete: 95
  21. SDComment: Quest support: 4001, 4342, 7604, 4322. Vendor Lokhtos Darkbargainer. Need to rewrite the Jail Break support
  22. SDCategory: Blackrock Depths
  23. EndScriptData */
  24.  
  25. /* ContentData
  26. go_shadowforge_brazier
  27. at_ring_of_law
  28. npc_grimstone
  29. mob_phalanx
  30. npc_kharan_mighthammer
  31. npc_lokhtos_darkbargainer
  32. npc_dughal_stormwing
  33. npc_marshal_windsor
  34. npc_marshal_reginald_windsor
  35. npc_tobias_seecher
  36. npc_rocknot
  37. EndContentData */
  38.  
  39. #include "ScriptedPch.h"
  40. #include "ScriptedEscortAI.h"
  41. #include "blackrock_depths.h"
  42.  
  43. /*######
  44. +## go_shadowforge_brazier
  45. +######*/
  46.  
  47. bool GOHello_go_shadowforge_brazier(Player* pPlayer, GameObject* pGo)
  48. {
  49.     if (ScriptedInstance* pInstance = pGo->GetInstanceData())
  50.     {
  51.         if (pInstance->GetData(TYPE_LYCEUM) == IN_PROGRESS)
  52.             pInstance->SetData(TYPE_LYCEUM, DONE);
  53.         else
  54.             pInstance->SetData(TYPE_LYCEUM, IN_PROGRESS);
  55.     }
  56.     return false;
  57. }
  58.  
  59. /*######
  60. ## npc_grimstone
  61. ######*/
  62.  
  63. enum eGrimstone
  64. {
  65.     NPC_GRIMSTONE                                          = 10096,
  66.     NPC_THELDREN                                           = 16059,
  67.  
  68.     //4 or 6 in total? 1+2+1 / 2+2+2 / 3+3. Depending on this, code should be changed.
  69.     MAX_MOB_AMOUNT                                         = 4
  70. };
  71.  
  72. uint32 RingMob[]=
  73. {
  74.     8925,                                                   // Dredge Worm
  75.     8926,                                                   // Deep Stinger
  76.     8927,                                                   // Dark Screecher
  77.     8928,                                                   // Burrowing Thundersnout
  78.     8933,                                                   // Cave Creeper
  79.     8932,                                                   // Borer Beetle
  80. };
  81.  
  82. uint32 RingBoss[]=
  83. {
  84.     9027,                                                   // Gorosh
  85.     9028,                                                   // Grizzle
  86.     9029,                                                   // Eviscerator
  87.     9030,                                                   // Ok'thor
  88.     9031,                                                   // Anub'shiah
  89.     9032,                                                   // Hedrum
  90. };
  91.  
  92. bool AreaTrigger_at_ring_of_law(Player* pPlayer, const AreaTriggerEntry *at)
  93. {
  94.     if (ScriptedInstance* pInstance = pPlayer->GetInstanceData())
  95.     {
  96.         if (pInstance->GetData(TYPE_RING_OF_LAW) == IN_PROGRESS || pInstance->GetData(TYPE_RING_OF_LAW) == DONE)
  97.             return false;
  98.  
  99.         pInstance->SetData(TYPE_RING_OF_LAW,IN_PROGRESS);
  100.         pPlayer->SummonCreature(NPC_GRIMSTONE,625.559,-205.618,-52.735,2.609,TEMPSUMMON_DEAD_DESPAWN,0);
  101.  
  102.         return false;
  103.     }
  104.     return false;
  105. }
  106.  
  107. /*######
  108. ## npc_grimstone
  109. ######*/
  110.  
  111. enum GrimstoneTexts
  112. {
  113.     SCRIPT_TEXT1                                           = -1000000,
  114.     SCRIPT_TEXT2                                           = -1000001,
  115.     SCRIPT_TEXT3                                           = -1000002,
  116.     SCRIPT_TEXT4                                           = -1000003,
  117.     SCRIPT_TEXT5                                           = -1000004,
  118.     SCRIPT_TEXT6                                           = -1000005
  119. };
  120.  
  121. //TODO: implement quest part of event (different end boss)
  122. struct npc_grimstoneAI : public npc_escortAI
  123. {
  124.     npc_grimstoneAI(Creature *c) : npc_escortAI(c)
  125.     {
  126.         pInstance = c->GetInstanceData();
  127.         MobSpawnId = rand()%6;
  128.     }
  129.  
  130.     ScriptedInstance* pInstance;
  131.  
  132.     uint8 EventPhase;
  133.     uint32 Event_Timer;
  134.  
  135.     uint8 MobSpawnId;
  136.     uint8 MobCount;
  137.     uint32 MobDeath_Timer;
  138.  
  139.     uint64 RingMobGUID[4];
  140.     uint64 RingBossGUID;
  141.  
  142.     bool CanWalk;
  143.  
  144.     void Reset()
  145.     {
  146.         m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  147.  
  148.         EventPhase = 0;
  149.         Event_Timer = 1000;
  150.  
  151.         MobCount = 0;
  152.         MobDeath_Timer = 0;
  153.  
  154.         for (uint8 i = 0; i < MAX_MOB_AMOUNT; ++i)
  155.             RingMobGUID[i] = 0;
  156.  
  157.         RingBossGUID = 0;
  158.  
  159.         CanWalk = false;
  160.     }
  161.  
  162.     //TODO: move them to center
  163.     void SummonRingMob()
  164.     {
  165.         if (Creature* tmp = m_creature->SummonCreature(RingMob[MobSpawnId],608.960,-235.322,-53.907,1.857,TEMPSUMMON_DEAD_DESPAWN,0))
  166.             RingMobGUID[MobCount] = tmp->GetGUID();
  167.  
  168.         ++MobCount;
  169.  
  170.         if (MobCount == MAX_MOB_AMOUNT)
  171.             MobDeath_Timer = 2500;
  172.     }
  173.  
  174.     //TODO: move them to center
  175.     void SummonRingBoss()
  176.     {
  177.         if (Creature* tmp = m_creature->SummonCreature(RingBoss[rand()%6],644.300,-175.989,-53.739,3.418,TEMPSUMMON_DEAD_DESPAWN,0))
  178.             RingBossGUID = tmp->GetGUID();
  179.  
  180.         MobDeath_Timer = 2500;
  181.     }
  182.  
  183.     void WaypointReached(uint32 i)
  184.     {
  185.         switch(i)
  186.         {
  187.         case 0:
  188.             DoScriptText(SCRIPT_TEXT1, m_creature);//2
  189.             CanWalk = false;
  190.             Event_Timer = 5000;
  191.             break;
  192.         case 1:
  193.             DoScriptText(SCRIPT_TEXT2, m_creature);//4
  194.             CanWalk = false;
  195.             Event_Timer = 5000;
  196.             break;
  197.         case 2:
  198.             CanWalk = false;
  199.             break;
  200.         case 3:
  201.             DoScriptText(SCRIPT_TEXT3, m_creature);//5
  202.             break;
  203.         case 4:
  204.             DoScriptText(SCRIPT_TEXT4, m_creature);//6
  205.             CanWalk = false;
  206.             Event_Timer = 5000;
  207.             break;
  208.         case 5:
  209.             if (pInstance)
  210.             {
  211.                 pInstance->SetData(TYPE_RING_OF_LAW,DONE);
  212.                 debug_log("TSCR: npc_grimstone: event reached end and set complete.");
  213.             }
  214.             break;
  215.         }
  216.     }
  217.  
  218.     void HandleGameObject(uint32 id, bool open)
  219.     {
  220.         pInstance->HandleGameObject(pInstance->GetData64(id), open);
  221.     }
  222.  
  223.     void UpdateAI(const uint32 diff)
  224.     {
  225.         if (!pInstance)
  226.             return;
  227.  
  228.         if (MobDeath_Timer)
  229.         {
  230.             if (MobDeath_Timer <= diff)
  231.             {
  232.                 MobDeath_Timer = 2500;
  233.  
  234.                 if (RingBossGUID)
  235.                 {
  236.                     Creature *boss = Unit::GetCreature(*m_creature,RingBossGUID);
  237.                     if (boss && !boss->isAlive() && boss->isDead())
  238.                     {
  239.                         RingBossGUID = 0;
  240.                         Event_Timer = 5000;
  241.                         MobDeath_Timer = 0;
  242.                         return;
  243.                     }
  244.                     return;
  245.                 }
  246.  
  247.                 for (uint8 i = 0; i < MAX_MOB_AMOUNT; ++i)
  248.                 {
  249.                     Creature *mob = Unit::GetCreature(*m_creature,RingMobGUID[i]);
  250.                     if (mob && !mob->isAlive() && mob->isDead())
  251.                     {
  252.                         RingMobGUID[i] = 0;
  253.                         --MobCount;
  254.  
  255.                         //seems all are gone, so set timer to continue and discontinue this
  256.                         if (!MobCount)
  257.                         {
  258.                             Event_Timer = 5000;
  259.                             MobDeath_Timer = 0;
  260.                         }
  261.                     }
  262.                 }
  263.             } else MobDeath_Timer -= diff;
  264.         }
  265.  
  266.         if (Event_Timer)
  267.         {
  268.             if (Event_Timer <= diff)
  269.             {
  270.                 switch(EventPhase)
  271.                 {
  272.                 case 0:
  273.                     DoScriptText(SCRIPT_TEXT5, m_creature);//1
  274.                     HandleGameObject(DATA_ARENA4, false);
  275.                     Start(false, false);
  276.                     CanWalk = true;
  277.                     Event_Timer = 0;
  278.                     break;
  279.                 case 1:
  280.                     CanWalk = true;
  281.                     Event_Timer = 0;
  282.                     break;
  283.                 case 2:
  284.                     Event_Timer = 2000;
  285.                     break;
  286.                 case 3:
  287.                     HandleGameObject(DATA_ARENA1, true);
  288.                     Event_Timer = 3000;
  289.                     break;
  290.                 case 4:
  291.                     CanWalk = true;
  292.                     m_creature->SetVisibility(VISIBILITY_OFF);
  293.                     SummonRingMob();
  294.                     Event_Timer = 8000;
  295.                     break;
  296.                 case 5:
  297.                     SummonRingMob();
  298.                     SummonRingMob();
  299.                     Event_Timer = 8000;
  300.                     break;
  301.                 case 6:
  302.                     SummonRingMob();
  303.                     Event_Timer = 0;
  304.                     break;
  305.                 case 7:
  306.                     m_creature->SetVisibility(VISIBILITY_ON);
  307.                     HandleGameObject(DATA_ARENA1, false);
  308.                     DoScriptText(SCRIPT_TEXT6, m_creature);//4
  309.                     CanWalk = true;
  310.                     Event_Timer = 0;
  311.                     break;
  312.                 case 8:
  313.                     HandleGameObject(DATA_ARENA2, true);
  314.                     Event_Timer = 5000;
  315.                     break;
  316.                 case 9:
  317.                     m_creature->SetVisibility(VISIBILITY_OFF);
  318.                     SummonRingBoss();
  319.                     Event_Timer = 0;
  320.                     break;
  321.                 case 10:
  322.                     //if quest, complete
  323.                     HandleGameObject(DATA_ARENA2, false);
  324.                     HandleGameObject(DATA_ARENA3, true);
  325.                     HandleGameObject(DATA_ARENA4, true);
  326.                     CanWalk = true;
  327.                     Event_Timer = 0;
  328.                     break;
  329.                 }
  330.                 ++EventPhase;
  331.             } else Event_Timer -= diff;
  332.         }
  333.  
  334.         if (CanWalk)
  335.             npc_escortAI::UpdateAI(diff);
  336.        }
  337. };
  338.  
  339. CreatureAI* GetAI_npc_grimstone(Creature* pCreature)
  340. {
  341.     return new npc_grimstoneAI(pCreature);
  342. }
  343.  
  344. /*######
  345. ## mob_phalanx
  346. ######*/
  347.  
  348. enum PhalanxSpells
  349. {
  350.     SPELL_THUNDERCLAP                                      = 8732,
  351.     SPELL_FIREBALLVOLLEY                                   = 22425,
  352.     SPELL_MIGHTYBLOW                                       = 14099
  353. };
  354.  
  355. struct mob_phalanxAI : public ScriptedAI
  356. {
  357.     mob_phalanxAI(Creature *c) : ScriptedAI(c) {}
  358.  
  359.     uint32 ThunderClap_Timer;
  360.     uint32 FireballVolley_Timer;
  361.     uint32 MightyBlow_Timer;
  362.  
  363.     void Reset()
  364.     {
  365.         ThunderClap_Timer = 12000;
  366.         FireballVolley_Timer =0;
  367.         MightyBlow_Timer = 15000;
  368.     }
  369.  
  370.     void UpdateAI(const uint32 diff)
  371.     {
  372.         //Return since we have no target
  373.         if (!UpdateVictim())
  374.             return;
  375.  
  376.         //ThunderClap_Timer
  377.         if (ThunderClap_Timer <= diff)
  378.         {
  379.             DoCast(m_creature->getVictim(), SPELL_THUNDERCLAP);
  380.             ThunderClap_Timer = 10000;
  381.         } else ThunderClap_Timer -= diff;
  382.  
  383.         //FireballVolley_Timer
  384.         if (m_creature->GetHealth()*100 / m_creature->GetMaxHealth() < 51)
  385.         {
  386.             if (FireballVolley_Timer <= diff)
  387.             {
  388.                 DoCast(m_creature->getVictim(), SPELL_FIREBALLVOLLEY);
  389.                 FireballVolley_Timer = 15000;
  390.             } else FireballVolley_Timer -= diff;
  391.         }
  392.  
  393.         //MightyBlow_Timer
  394.         if (MightyBlow_Timer <= diff)
  395.         {
  396.             DoCast(m_creature->getVictim(), SPELL_MIGHTYBLOW);
  397.             MightyBlow_Timer = 10000;
  398.         } else MightyBlow_Timer -= diff;
  399.  
  400.         DoMeleeAttackIfReady();
  401.     }
  402. };
  403. CreatureAI* GetAI_mob_phalanx(Creature* pCreature)
  404. {
  405.     return new mob_phalanxAI (pCreature);
  406. }
  407.  
  408. /*######
  409. ## npc_kharan_mighthammer
  410. ######*/
  411.  
  412. enum KharamQuests
  413. {
  414.     QUEST_4001                                             = 4001,
  415.     QUEST_4342                                             = 4342
  416. };
  417.  
  418. #define GOSSIP_ITEM_KHARAN_1    "I need to know where the princess are, Kharan!"
  419. #define GOSSIP_ITEM_KHARAN_2    "All is not lost, Kharan!"
  420.  
  421. #define GOSSIP_ITEM_KHARAN_3    "Gor'shak is my friend, you can trust me."
  422. #define GOSSIP_ITEM_KHARAN_4    "Not enough, you need to tell me more."
  423. #define GOSSIP_ITEM_KHARAN_5    "So what happened?"
  424. #define GOSSIP_ITEM_KHARAN_6    "Continue..."
  425. #define GOSSIP_ITEM_KHARAN_7    "So you suspect that someone on the inside was involved? That they were tipped off?"
  426. #define GOSSIP_ITEM_KHARAN_8    "Continue with your story please."
  427. #define GOSSIP_ITEM_KHARAN_9    "Indeed."
  428. #define GOSSIP_ITEM_KHARAN_10   "The door is open, Kharan. You are a free man."
  429.  
  430. bool GossipHello_npc_kharan_mighthammer(Player* pPlayer, Creature* pCreature)
  431. {
  432.     if (pCreature->isQuestGiver())
  433.         pPlayer->PrepareQuestMenu(pCreature->GetGUID());
  434.  
  435.     if (pPlayer->GetQuestStatus(QUEST_4001) == QUEST_STATUS_INCOMPLETE)
  436.          pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_1, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+1);
  437.  
  438.     if (pPlayer->GetQuestStatus(4342) == QUEST_STATUS_INCOMPLETE)
  439.         pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_2, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
  440.  
  441.     if (pPlayer->GetTeam() == HORDE)
  442.         pPlayer->SEND_GOSSIP_MENU(2473, pCreature->GetGUID());
  443.     else
  444.         pPlayer->SEND_GOSSIP_MENU(2474, pCreature->GetGUID());
  445.  
  446.     return true;
  447. }
  448.  
  449. bool GossipSelect_npc_kharan_mighthammer(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
  450. {
  451.     switch (uiAction)
  452.     {
  453.         case GOSSIP_ACTION_INFO_DEF+1:
  454.              pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_3, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+2);
  455.             pPlayer->SEND_GOSSIP_MENU(2475, pCreature->GetGUID());
  456.             break;
  457.         case GOSSIP_ACTION_INFO_DEF+2:
  458.             pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_4, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+3);
  459.             pPlayer->SEND_GOSSIP_MENU(2476, pCreature->GetGUID());
  460.             break;
  461.  
  462.         case GOSSIP_ACTION_INFO_DEF+3:
  463.             pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_5, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+4);
  464.             pPlayer->SEND_GOSSIP_MENU(2477, pCreature->GetGUID());
  465.             break;
  466.         case GOSSIP_ACTION_INFO_DEF+4:
  467.             pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_6, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+5);
  468.             pPlayer->SEND_GOSSIP_MENU(2478, pCreature->GetGUID());
  469.             break;
  470.         case GOSSIP_ACTION_INFO_DEF+5:
  471.              pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_7, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+6);
  472.             pPlayer->SEND_GOSSIP_MENU(2479, pCreature->GetGUID());
  473.             break;
  474.         case GOSSIP_ACTION_INFO_DEF+6:
  475.             pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_8, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+7);
  476.             pPlayer->SEND_GOSSIP_MENU(2480, pCreature->GetGUID());
  477.             break;
  478.         case GOSSIP_ACTION_INFO_DEF+7:
  479.             pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_9, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+8);
  480.             pPlayer->SEND_GOSSIP_MENU(2481, pCreature->GetGUID());
  481.             break;
  482.         case GOSSIP_ACTION_INFO_DEF+8:
  483.             pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_KHARAN_10, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF+9);
  484.             pPlayer->SEND_GOSSIP_MENU(2482, pCreature->GetGUID());
  485.             break;
  486.         case GOSSIP_ACTION_INFO_DEF+9:
  487.             pPlayer->CLOSE_GOSSIP_MENU();
  488.             if (pPlayer->GetTeam() == HORDE)
  489.                 pPlayer->AreaExploredOrEventHappens(QUEST_4001);
  490.             else
  491.                 pPlayer->AreaExploredOrEventHappens(QUEST_4342);
  492.             break;
  493.     }
  494.     return true;
  495. }
  496.  
  497. /*######
  498. ## npc_lokhtos_darkbargainer
  499. ######*/
  500.  
  501. enum LokhtosItems
  502. {
  503.     ITEM_THRORIUM_BROTHERHOOD_CONTRACT                     = 18628,
  504.     ITEM_SULFURON_INGOT                                    = 17203
  505. };
  506.  
  507. enum LokhtosQuests
  508. {
  509.     QUEST_A_BINDING_CONTRACT                               = 7604
  510. };
  511.  
  512. enum LokhtosSpells
  513. {
  514.     SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND          = 23059
  515. };
  516.  
  517. #define GOSSIP_ITEM_SHOW_ACCESS     "Show me what I have access to, Lothos."
  518. #define GOSSIP_ITEM_GET_CONTRACT    "Get Thorium Brotherhood Contract"
  519.  
  520. bool GossipHello_npc_lokhtos_darkbargainer(Player* pPlayer, Creature* pCreature)
  521. {
  522.     if (pCreature->isQuestGiver())
  523.         pPlayer->PrepareQuestMenu(pCreature->GetGUID());
  524.  
  525.     if (pCreature->isVendor() && pPlayer->GetReputationRank(59) >= REP_FRIENDLY)
  526.           pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_VENDOR, GOSSIP_ITEM_SHOW_ACCESS, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_TRADE);
  527.  
  528.     if (pPlayer->GetQuestRewardStatus(QUEST_A_BINDING_CONTRACT) != 1 &&
  529.         !pPlayer->HasItemCount(ITEM_THRORIUM_BROTHERHOOD_CONTRACT, 1, true) &&
  530.         pPlayer->HasItemCount(ITEM_SULFURON_INGOT, 1))
  531.     {
  532.         pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_ITEM_GET_CONTRACT, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
  533.     }
  534.  
  535.     if (pPlayer->GetReputationRank(59) < REP_FRIENDLY)
  536.         pPlayer->SEND_GOSSIP_MENU(3673, pCreature->GetGUID());
  537.     else
  538.         pPlayer->SEND_GOSSIP_MENU(3677, pCreature->GetGUID());
  539.  
  540.     return true;
  541. }
  542.  
  543. bool GossipSelect_npc_lokhtos_darkbargainer(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
  544. {
  545.     if (uiAction == GOSSIP_ACTION_INFO_DEF + 1)
  546.     {
  547.         pPlayer->CLOSE_GOSSIP_MENU();
  548.         pPlayer->CastSpell(pPlayer, SPELL_CREATE_THORIUM_BROTHERHOOD_CONTRACT_DND, false);
  549.     }
  550.     if (uiAction == GOSSIP_ACTION_TRADE)
  551.         pPlayer->SEND_VENDORLIST(pCreature->GetGUID());
  552.  
  553.     return true;
  554. }
  555.  
  556. /*######
  557. ## npc_dughal_stormwing
  558. ######*/
  559.  
  560. enum DughalQuests
  561. {
  562.     QUEST_JAIL_BREAK                                       = 4322
  563. };
  564.  
  565. #define SAY_DUGHAL_FREE         "Thank you, $N! I'm free!!!"
  566. #define GOSSIP_DUGHAL           "You're free, Dughal! Get out of here!"
  567.  
  568. /*
  569. struct npc_dughal_stormwingAI : public npc_escortAI
  570. {
  571.     npc_dughal_stormwingAI(Creature *c) : npc_escortAI(c) {}
  572.  
  573.     void WaypointReached(uint32 i)
  574.     {
  575.     switch(i)
  576.         {
  577.         case 0:m_creature->Say(SAY_DUGHAL_FREE, LANG_UNIVERSAL, PlayerGUID); break;
  578.         case 1:pInstance->SetData(DATA_DUGHAL,ENCOUNTER_STATE_OBJECTIVE_COMPLETED);break;
  579.         case 2:
  580.             m_creature->SetVisibility(VISIBILITY_OFF);
  581.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  582.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  583.             pInstance->SetData(DATA_DUGHAL,ENCOUNTER_STATE_ENDED);
  584.             break;
  585.         }
  586.     }
  587.  
  588.     void EnterCombat(Unit* who) {}
  589.     void Reset() {}
  590.  
  591.     void JustDied(Unit* killer)
  592.     {
  593.         if (IsBeingEscorted && killer == m_creature)
  594.         {
  595.             m_creature->SetVisibility(VISIBILITY_OFF);
  596.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  597.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  598.             pInstance->SetData(DATA_DUGHAL,ENCOUNTER_STATE_ENDED);
  599.         }
  600.     }
  601.  
  602.     void UpdateAI(const uint32 diff)
  603.     {
  604.         if (pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return;
  605.         if ((pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& pInstance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_ENDED)
  606.         {
  607.             m_creature->SetVisibility(VISIBILITY_OFF);
  608.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  609.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  610.         }
  611.         else
  612.         {
  613.             m_creature->SetVisibility(VISIBILITY_ON);
  614.             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  615.             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  616.         }
  617.         npc_escortAI::UpdateAI(diff);
  618.     }
  619. };
  620. CreatureAI* GetAI_npc_dughal_stormwing(Creature* pCreature)
  621. {
  622.     npc_dughal_stormwingAI* dughal_stormwingAI = new npc_dughal_stormwingAI(pCreature);
  623.  
  624.     dughal_stormwingAI->AddWaypoint(0, 280.42,-82.86, -77.12,0);
  625.     dughal_stormwingAI->AddWaypoint(1, 287.64,-87.01, -76.79,0);
  626.     dughal_stormwingAI->AddWaypoint(2, 354.63,-64.95, -67.53,0);
  627.  
  628.     return dughal_stormwingAI;
  629. }
  630. bool GossipHello_npc_dughal_stormwing(Player* pPlayer, Creature* pCreature)
  631. {
  632.     if (pPlayer->GetQuestStatus(QUEST_JAIL_BREAK) == QUEST_STATUS_INCOMPLETE && pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS)
  633.     {
  634.         pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, GOSSIP_DUGHAL, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
  635.         pPlayer->SEND_GOSSIP_MENU(2846, pCreature->GetGUID());
  636.     }
  637.     return true;
  638. }
  639.  
  640. bool GossipSelect_npc_dughal_stormwing(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
  641. {
  642.     if (uiAction == GOSSIP_ACTION_INFO_DEF + 1)
  643.     {
  644.         pPlayer->CLOSE_GOSSIP_MENU();
  645.         CAST_AI(npc_escortAI, (pCreature->AI()))->Start(false, true, pPlayer->GetGUID());
  646.         pCreature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  647.         pInstance->SetData(DATA_QUEST_JAIL_BREAK,ENCOUNTER_STATE_IN_PROGRESS);
  648.     }
  649.     return true;
  650. }
  651.  */
  652. /*######
  653. ## npc_marshal_windsor
  654. ######*/
  655.  
  656. #define SAY_WINDSOR_AGGRO1          "You locked up the wrong Marshal. Prepare to be destroyed!"
  657. #define SAY_WINDSOR_AGGRO2          "I bet you're sorry now, aren't you !?!!"
  658. #define SAY_WINDSOR_AGGRO3          "You better hold me back $N or they are going to feel some prison house beatings."
  659. #define SAY_WINDSOR_1               "Let's get a move on. My gear should be in the storage area up this way..."
  660. #define SAY_WINDSOR_4_1             "Check that cell, $N. If someone is alive in there, we need to get them out."
  661. #define SAY_WINDSOR_4_2             "Get him out of there!"
  662. #define SAY_WINDSOR_4_3             "Good work! We're almost there, $N. This way."
  663. #define SAY_WINDSOR_6               "This is it, $N. My stuff should be in that room. Cover me, I'm going in!"
  664. #define SAY_WINDSOR_9               "Ah, there it is!"
  665. #define MOB_ENTRY_REGINALD_WINDSOR  9682
  666.  
  667. Player* pPlayerStart;
  668. /*
  669. struct npc_marshal_windsorAI : public npc_escortAI
  670. {
  671.     npc_marshal_windsorAI(Creature *c) : npc_escortAI(c)
  672.     {
  673.         pInstance = c->GetInstanceData();
  674.     }
  675.  
  676.     void WaypointReached(uint32 i)
  677.     {
  678.     switch(i)
  679.         {
  680.         case 1:
  681.             m_creature->Say(SAY_WINDSOR_1, LANG_UNIVERSAL, PlayerGUID);
  682.             break;
  683.         case 7:
  684.             m_creature->HandleEmoteCommand(EMOTE_STATE_POINT);
  685.             m_creature->Say(SAY_WINDSOR_4_1, LANG_UNIVERSAL, PlayerGUID);
  686.             IsOnHold=true;
  687.             break;
  688.         case 10:
  689.             m_creature->setFaction(534);
  690.             break;
  691.         case 12:
  692.             m_creature->Say(SAY_WINDSOR_6, LANG_UNIVERSAL, PlayerGUID);
  693.             pInstance->SetData(DATA_SUPPLY_ROOM, ENCOUNTER_STATE_IN_PROGRESS);
  694.             break;
  695.         case 13:
  696.             m_creature->HandleEmoteCommand(EMOTE_STATE_USESTANDING);//EMOTE_STATE_WORK
  697.             break;
  698.         case 14:
  699.             pInstance->SetData(DATA_GATE_SR,0);
  700.             m_creature->setFaction(11);
  701.             break;
  702.         case 16:
  703.             m_creature->Say(SAY_WINDSOR_9, LANG_UNIVERSAL, PlayerGUID);
  704.             break;
  705.         case 17:
  706.             m_creature->HandleEmoteCommand(EMOTE_STATE_USESTANDING);//EMOTE_STATE_WORK
  707.             break;
  708.         case 18:
  709.             pInstance->SetData(DATA_GATE_SC,0);
  710.             break;
  711.         case 19:
  712.             m_creature->SetVisibility(VISIBILITY_OFF);
  713.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  714.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  715.             m_creature->SummonCreature(MOB_ENTRY_REGINALD_WINDSOR,403.61,-51.71,-63.92,3.600434,TEMPSUMMON_DEAD_DESPAWN ,0);
  716.             pInstance->SetData(DATA_SUPPLY_ROOM, ENCOUNTER_STATE_ENDED);
  717.             break;
  718.         }
  719.     }
  720.  
  721.     void EnterCombat(Unit* who)
  722.         {
  723.         switch (urand(0,2))
  724.         {
  725.             case 0: m_creature->Say(SAY_WINDSOR_AGGRO1, LANG_UNIVERSAL, PlayerGUID); break;
  726.             case 1: m_creature->Say(SAY_WINDSOR_AGGRO2, LANG_UNIVERSAL, PlayerGUID); break;
  727.             case 2: m_creature->Say(SAY_WINDSOR_AGGRO3, LANG_UNIVERSAL, PlayerGUID); break;
  728.         }
  729.         }
  730.  
  731.     void Reset() {}
  732.  
  733.     void JustDied(Unit *slayer)
  734.     {
  735.         pInstance->SetData(DATA_QUEST_JAIL_BREAK,ENCOUNTER_STATE_FAILED);
  736.     }
  737.  
  738.     void UpdateAI(const uint32 diff)
  739.     {
  740.         if (pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return;
  741.         if (pInstance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED)
  742.             SetEscortPaused(false);
  743.         if (!pInstance->GetData(DATA_GATE_D) && pInstance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_NOT_STARTED)
  744.             {
  745.             m_creature->Say(SAY_WINDSOR_4_2, LANG_UNIVERSAL, PlayerGUID);
  746.             pInstance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_BEFORE_START);
  747.             }
  748.         if (pInstance->GetData(DATA_DUGHAL) == ENCOUNTER_STATE_OBJECTIVE_COMPLETED)
  749.             {
  750.             m_creature->Say(SAY_WINDSOR_4_3, LANG_UNIVERSAL, PlayerGUID);
  751.             pInstance->SetData(DATA_DUGHAL, ENCOUNTER_STATE_ENDED);
  752.             }
  753.         if ((pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& pInstance->GetData(DATA_SUPPLY_ROOM) == ENCOUNTER_STATE_ENDED)
  754.         {
  755.             m_creature->SetVisibility(VISIBILITY_OFF);
  756.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  757.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  758.         }
  759.         else
  760.         {
  761.             m_creature->SetVisibility(VISIBILITY_ON);
  762.             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  763.             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  764.         }
  765.         npc_escortAI::UpdateAI(diff);
  766.     }
  767. };
  768. CreatureAI* GetAI_npc_marshal_windsor(Creature* pCreature)
  769. {
  770.     npc_marshal_windsorAI* marshal_windsorAI = new npc_marshal_windsorAI(pCreature);
  771.  
  772.     marshal_windsorAI->AddWaypoint(0, 316.336,-225.528, -77.7258,7000);
  773.     marshal_windsorAI->AddWaypoint(1, 316.336,-225.528, -77.7258,2000);
  774.     marshal_windsorAI->AddWaypoint(2, 322.96,-207.13, -77.87,0);
  775.     marshal_windsorAI->AddWaypoint(3, 281.05,-172.16, -75.12,0);
  776.     marshal_windsorAI->AddWaypoint(4, 272.19,-139.14, -70.61,0);
  777.     marshal_windsorAI->AddWaypoint(5, 283.62,-116.09, -70.21,0);
  778.     marshal_windsorAI->AddWaypoint(6, 296.18,-94.30, -74.08,0);
  779.     marshal_windsorAI->AddWaypoint(7, 294.57,-93.11, -74.08,0);
  780.     marshal_windsorAI->AddWaypoint(8, 314.31,-74.31, -76.09,0);
  781.     marshal_windsorAI->AddWaypoint(9, 360.22,-62.93, -66.77,0);
  782.     marshal_windsorAI->AddWaypoint(10, 383.38,-69.40, -63.25,0);
  783.     marshal_windsorAI->AddWaypoint(11, 389.99,-67.86, -62.57,0);
  784.     marshal_windsorAI->AddWaypoint(12, 400.98,-72.01, -62.31,0);
  785.     marshal_windsorAI->AddWaypoint(13, 404.22,-62.30, -63.50,2300);
  786.     marshal_windsorAI->AddWaypoint(14, 404.22,-62.30, -63.50,1500);
  787.     marshal_windsorAI->AddWaypoint(15, 407.65,-51.86, -63.96,0);
  788.     marshal_windsorAI->AddWaypoint(16, 403.61,-51.71, -63.92,1000);
  789.     marshal_windsorAI->AddWaypoint(17, 403.61,-51.71, -63.92,2000);
  790.     marshal_windsorAI->AddWaypoint(18, 403.61,-51.71, -63.92,1000);
  791.     marshal_windsorAI->AddWaypoint(19, 403.61,-51.71, -63.92,0);
  792.  
  793.     return marshal_windsorAI;
  794. }
  795.  
  796. bool QuestAccept_npc_marshal_windsor(Player* pPlayer, Creature* pCreature, Quest const *quest)
  797. {
  798.     if (quest->GetQuestId() == 4322)
  799.         {PlayerStart = player;
  800.         if (pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED)
  801.         {
  802.                 CAST_AI(npc_escortAI, (pCreature->AI()))->Start(true, false, pPlayer->GetGUID());
  803.                 pInstance->SetData(DATA_QUEST_JAIL_BREAK,ENCOUNTER_STATE_IN_PROGRESS);
  804.                 pCreature->setFaction(11);
  805.         }
  806.  
  807.         }
  808.     return false;
  809. }
  810.   */
  811. /*######
  812. ## npc_marshal_reginald_windsor
  813. ######*/
  814.  
  815. #define SAY_REGINALD_WINDSOR_0_1    "Can you feel the power, $N??? It's time to ROCK!"
  816. #define SAY_REGINALD_WINDSOR_0_2    "Now we just have to free Tobias and we can get out of here. This way!"
  817. #define SAY_REGINALD_WINDSOR_5_1    "Open it."
  818. #define SAY_REGINALD_WINDSOR_5_2    "I never did like those two. Let's get moving."
  819. #define SAY_REGINALD_WINDSOR_7_1    "Open it and be careful this time!"
  820. #define SAY_REGINALD_WINDSOR_7_2    "That intolerant dirtbag finally got what was coming to him. Good riddance!"
  821. #define SAY_REGINALD_WINDSOR_7_3    "Alright, let's go."
  822. #define SAY_REGINALD_WINDSOR_13_1   "Open it. We need to hurry up. I can smell those Dark Irons coming a mile away and I can tell you one thing, they're COMING!"
  823. #define SAY_REGINALD_WINDSOR_13_2   "Administering fists of fury on Crest Killer!"
  824. #define SAY_REGINALD_WINDSOR_13_3   "He has to be in the last cell. Unless... they killed him."
  825. #define SAY_REGINALD_WINDSOR_14_1   "Get him out of there!"
  826. #define SAY_REGINALD_WINDSOR_14_2   "Excellent work, $N. Let's find the exit. I think I know the way. Follow me!"
  827. #define SAY_REGINALD_WINDSOR_20_1   "We made it!"
  828. #define SAY_REGINALD_WINDSOR_20_2   "Meet me at Maxwell's encampment. We'll go over the next stages of the plan there and figure out a way to decode my tablets without the decryption ring."
  829. #define MOB_ENTRY_SHILL_DINGER      9678
  830. #define MOB_ENTRY_CREST_KILLER      9680
  831.  
  832. int wp = 0;
  833. /*
  834. struct npc_marshal_reginald_windsorAI : public npc_escortAI
  835. {
  836.     npc_marshal_reginald_windsorAI(Creature *c) : npc_escortAI(c)
  837.     {
  838.     }
  839.  
  840.     void WaypointReached(uint32 i)
  841.     {
  842.     wp=i;
  843.     switch(i)
  844.         {
  845.         case 0:
  846.             m_creature->setFaction(11);
  847.             m_creature->Say(SAY_REGINALD_WINDSOR_0_1, LANG_UNIVERSAL, PlayerGUID);
  848.             break;
  849.         case 1:
  850.             m_creature->Say(SAY_REGINALD_WINDSOR_0_2, LANG_UNIVERSAL, PlayerGUID);
  851.             break;
  852.         case 7:
  853.             m_creature->HandleEmoteCommand(EMOTE_STATE_POINT);
  854.             m_creature->Say(SAY_REGINALD_WINDSOR_5_1, LANG_UNIVERSAL, PlayerGUID);
  855.             IsOnHold=true;
  856.             break;
  857.         case 8:
  858.             m_creature->Say(SAY_REGINALD_WINDSOR_5_2, LANG_UNIVERSAL, PlayerGUID);
  859.             break;
  860.         case 11:
  861.             m_creature->HandleEmoteCommand(EMOTE_STATE_POINT);
  862.             m_creature->Say(SAY_REGINALD_WINDSOR_7_1, LANG_UNIVERSAL, PlayerGUID);
  863.             IsOnHold=true;
  864.             break;
  865.         case 12:
  866.             m_creature->Say(SAY_REGINALD_WINDSOR_7_2, LANG_UNIVERSAL, PlayerGUID);
  867.             break;
  868.         case 13:
  869.             m_creature->Say(SAY_REGINALD_WINDSOR_7_3, LANG_UNIVERSAL, PlayerGUID);
  870.             break;
  871.         case 20:
  872.             m_creature->HandleEmoteCommand(EMOTE_STATE_POINT);
  873.             m_creature->Say(SAY_REGINALD_WINDSOR_13_1, LANG_UNIVERSAL, PlayerGUID);
  874.             IsOnHold=true;
  875.             break;
  876.         case 21:
  877.             m_creature->Say(SAY_REGINALD_WINDSOR_13_3, LANG_UNIVERSAL, PlayerGUID);
  878.             break;
  879.         case 23:
  880.             m_creature->HandleEmoteCommand(EMOTE_STATE_POINT);
  881.             m_creature->Say(SAY_REGINALD_WINDSOR_14_1, LANG_UNIVERSAL, PlayerGUID);
  882.             IsOnHold=true;
  883.             break;
  884.         case 24:
  885.             m_creature->Say(SAY_REGINALD_WINDSOR_14_2, LANG_UNIVERSAL, PlayerGUID);
  886.             break;
  887.         case 31:
  888.             m_creature->Say(SAY_REGINALD_WINDSOR_20_1, LANG_UNIVERSAL, PlayerGUID);
  889.             break;
  890.         case 32:
  891.             m_creature->Say(SAY_REGINALD_WINDSOR_20_2, LANG_UNIVERSAL, PlayerGUID);
  892.             PlayerStart->GroupEventHappens(QUEST_JAIL_BREAK, m_creature);
  893.             pInstance->SetData(DATA_SHILL, ENCOUNTER_STATE_ENDED);
  894.             break;
  895.         }
  896.     }
  897.  
  898.     void MoveInLineOfSight(Unit *who)
  899.     {
  900.         if (HasEscortState(STATE_ESCORT_ESCORTING))
  901.             return;
  902.  
  903.         if (who->GetTypeId() == TYPEID_PLAYER)
  904.         {
  905.             if (CAST_PLR(who)->GetQuestStatus(4322) == QUEST_STATUS_INCOMPLETE)
  906.             {
  907.                 float Radius = 10.0;
  908.                 if (m_creature->IsWithinDistInMap(who, Radius))
  909.                 {
  910.                     SetEscortPaused(false);
  911.                     Start(true, false, who->GetGUID());
  912.                 }
  913.             }
  914.         }
  915.     }
  916.  
  917.     void EnterCombat(Unit* who)
  918.         {
  919.         switch (urand(0,2))
  920.         {
  921.             case 0: m_creature->Say(SAY_WINDSOR_AGGRO1, LANG_UNIVERSAL, PlayerGUID); break;
  922.             case 1: m_creature->Say(SAY_WINDSOR_AGGRO2, LANG_UNIVERSAL, PlayerGUID); break;
  923.             case 2: m_creature->Say(SAY_WINDSOR_AGGRO3, LANG_UNIVERSAL, PlayerGUID); break;
  924.         }
  925.         }
  926.     void Reset() {}
  927.  
  928.     void JustDied(Unit *slayer)
  929.     {
  930.         pInstance->SetData(DATA_QUEST_JAIL_BREAK,ENCOUNTER_STATE_FAILED);
  931.     }
  932.  
  933.     void UpdateAI(const uint32 diff)
  934.     {
  935.         if (pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return;
  936.         if (wp==7)
  937.             {
  938.             if (!pInstance->GetData(DATA_GATE_J) && pInstance->GetData(DATA_JAZ) == ENCOUNTER_STATE_NOT_STARTED)
  939.                 {
  940.                     pInstance->SetData(DATA_CREATURE_JAZ,1);
  941.                     pInstance->SetData(DATA_JAZ,ENCOUNTER_STATE_IN_PROGRESS);
  942.                 }
  943.             if (pInstance->GetData(DATA_CREATURE_JAZ) && pInstance->GetData(DATA_CREATURE_OGRABISI) && pInstance->GetData(DATA_JAZ) == ENCOUNTER_STATE_IN_PROGRESS)
  944.                 {
  945.                     SetEscortPaused(false);
  946.                     pInstance->SetData(DATA_JAZ,ENCOUNTER_STATE_ENDED);
  947.                 }
  948.             }
  949.         else if (wp==11)
  950.             {
  951.             if (!pInstance->GetData(DATA_GATE_S) && pInstance->GetData(DATA_SHILL) == ENCOUNTER_STATE_NOT_STARTED)
  952.                 {
  953.                     pInstance->SetData(DATA_CREATURE_SHILL,1);
  954.                     pInstance->SetData(DATA_SHILL,ENCOUNTER_STATE_IN_PROGRESS);
  955.                 }
  956.             if (pInstance->GetData(DATA_CREATURE_SHILL) && pInstance->GetData(DATA_SHILL) == ENCOUNTER_STATE_IN_PROGRESS)
  957.                 {
  958.                     pInstance->SetData(DATA_SHILL,ENCOUNTER_STATE_ENDED);
  959.                     SetEscortPaused(false);
  960.                 }
  961.             }
  962.         else if (wp==20)
  963.             {
  964.             if (!pInstance->GetData(DATA_GATE_C) && pInstance->GetData(DATA_CREST) == ENCOUNTER_STATE_NOT_STARTED)
  965.                 {
  966.                     pInstance->SetData(DATA_CREATURE_CREST,1);
  967.                     m_creature->Say(SAY_REGINALD_WINDSOR_13_2, LANG_UNIVERSAL, PlayerGUID);
  968.                     pInstance->SetData(DATA_CREST,ENCOUNTER_STATE_IN_PROGRESS);
  969.                 }
  970.             if (pInstance->GetData(DATA_CREATURE_CREST) && pInstance->GetData(DATA_CREST) == ENCOUNTER_STATE_IN_PROGRESS)
  971.                 {
  972.                     SetEscortPaused(false);
  973.                     pInstance->SetData(DATA_CREST,ENCOUNTER_STATE_ENDED);
  974.                 }
  975.             }
  976.         if (pInstance->GetData(DATA_TOBIAS)==ENCOUNTER_STATE_OBJECTIVE_COMPLETED) SetEscortPaused(false);
  977.         npc_escortAI::UpdateAI(diff);
  978.     }
  979. };
  980. CreatureAI* GetAI_npc_marshal_reginald_windsor(Creature* pCreature)
  981. {
  982.     npc_marshal_reginald_windsorAI* marshal_reginald_windsorAI = new npc_marshal_reginald_windsorAI(pCreature);
  983.  
  984.     marshal_reginald_windsorAI->AddWaypoint(0, 403.61,-52.71, -63.92,4000);
  985.     marshal_reginald_windsorAI->AddWaypoint(1, 403.61,-52.71, -63.92,4000);
  986.     marshal_reginald_windsorAI->AddWaypoint(2, 406.33,-54.87, -63.95,0);
  987.     marshal_reginald_windsorAI->AddWaypoint(3, 407.99,-73.91, -62.26,0);
  988.     marshal_reginald_windsorAI->AddWaypoint(4, 557.03,-119.71, -61.83,0);
  989.     marshal_reginald_windsorAI->AddWaypoint(5, 573.40,-124.39, -65.07,0);
  990.     marshal_reginald_windsorAI->AddWaypoint(6, 593.91,-130.29, -69.25,0);
  991.     marshal_reginald_windsorAI->AddWaypoint(7, 593.21,-132.16, -69.25,0);
  992.     marshal_reginald_windsorAI->AddWaypoint(8, 593.21,-132.16, -69.25,3000);
  993.     marshal_reginald_windsorAI->AddWaypoint(9, 622.81,-135.55, -71.92,0);
  994.     marshal_reginald_windsorAI->AddWaypoint(10, 634.68,-151.29, -70.32,0);
  995.     marshal_reginald_windsorAI->AddWaypoint(11, 635.06,-153.25, -70.32,0);
  996.     marshal_reginald_windsorAI->AddWaypoint(12, 635.06,-153.25, -70.32,3000);
  997.     marshal_reginald_windsorAI->AddWaypoint(13, 635.06,-153.25, -70.32,1500);
  998.     marshal_reginald_windsorAI->AddWaypoint(14, 655.25,-172.39, -73.72,0);
  999.     marshal_reginald_windsorAI->AddWaypoint(15, 654.79,-226.30, -83.06,0);
  1000.     marshal_reginald_windsorAI->AddWaypoint(16, 622.85,-268.85, -83.96,0);
  1001.     marshal_reginald_windsorAI->AddWaypoint(17, 579.45,-275.56, -80.44,0);
  1002.     marshal_reginald_windsorAI->AddWaypoint(18, 561.19,-266.85, -75.59,0);
  1003.     marshal_reginald_windsorAI->AddWaypoint(19, 547.91,-253.92, -70.34,0);
  1004.     marshal_reginald_windsorAI->AddWaypoint(20, 549.20,-252.40, -70.34,0);
  1005.     marshal_reginald_windsorAI->AddWaypoint(21, 549.20,-252.40, -70.34,4000);
  1006.     marshal_reginald_windsorAI->AddWaypoint(22, 555.33,-269.16, -74.40,0);
  1007.     marshal_reginald_windsorAI->AddWaypoint(23, 554.31,-270.88, -74.40,0);
  1008.     marshal_reginald_windsorAI->AddWaypoint(24, 554.31,-270.88, -74.40,4000);
  1009.     marshal_reginald_windsorAI->AddWaypoint(25, 536.10,-249.60, -67.47,0);
  1010.     marshal_reginald_windsorAI->AddWaypoint(26, 520.94,-216.65, -59.28,0);
  1011.     marshal_reginald_windsorAI->AddWaypoint(27, 505.99,-148.74, -62.17,0);
  1012.     marshal_reginald_windsorAI->AddWaypoint(28, 484.21,-56.24, -62.43,0);
  1013.     marshal_reginald_windsorAI->AddWaypoint(29, 470.39,-6.01, -70.10,0);
  1014.     marshal_reginald_windsorAI->AddWaypoint(30, 451.27,30.85, -70.07,0);
  1015.     marshal_reginald_windsorAI->AddWaypoint(31, 452.45,29.85, -70.37,1500);
  1016.     marshal_reginald_windsorAI->AddWaypoint(32, 452.45,29.85, -70.37,7000);
  1017.     marshal_reginald_windsorAI->AddWaypoint(33, 452.45,29.85, -70.37,10000);
  1018.     marshal_reginald_windsorAI->AddWaypoint(34, 451.27,31.85, -70.07,0);
  1019.  
  1020.     return marshal_reginald_windsorAI;
  1021. }
  1022. */
  1023. /*######
  1024. ## npc_tobias_seecher
  1025. ######*/
  1026.  
  1027. #define SAY_TOBIAS_FREE         "Thank you! I will run for safety immediately!"
  1028. /*
  1029. struct npc_tobias_seecherAI : public npc_escortAI
  1030. {
  1031.     npc_tobias_seecherAI(Creature *c) :npc_escortAI(c) {}
  1032.  
  1033.     void EnterCombat(Unit* who) {}
  1034.     void Reset() {}
  1035.  
  1036.     void JustDied(Unit* killer)
  1037.     {
  1038.         if (IsBeingEscorted && killer == m_creature)
  1039.         {
  1040.             m_creature->SetVisibility(VISIBILITY_OFF);
  1041.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  1042.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  1043.             pInstance->SetData(DATA_TOBIAS,ENCOUNTER_STATE_ENDED);
  1044.         }
  1045.     }
  1046.  
  1047.     void WaypointReached(uint32 i)
  1048.     {
  1049.     switch(i)
  1050.         {
  1051.         case 0:m_creature->Say(SAY_TOBIAS_FREE, LANG_UNIVERSAL, PlayerGUID); break;
  1052.         case 2:
  1053.             pInstance->SetData(DATA_TOBIAS,ENCOUNTER_STATE_OBJECTIVE_COMPLETED);break;
  1054.         case 4:
  1055.             m_creature->SetVisibility(VISIBILITY_OFF);
  1056.             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  1057.             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  1058.             pInstance->SetData(DATA_TOBIAS,ENCOUNTER_STATE_ENDED);
  1059.             break;
  1060.         }
  1061.     }
  1062.  
  1063.     void UpdateAI(const uint32 diff)
  1064.     {
  1065.         if (pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_NOT_STARTED) return;
  1066.         if ((pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS || pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_FAILED || pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_ENDED)&& pInstance->GetData(DATA_TOBIAS) == ENCOUNTER_STATE_ENDED)
  1067.         {
  1068.             m_creature->SetVisibility(VISIBILITY_OFF);
  1069.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  1070.             m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  1071.         }
  1072.         else
  1073.         {
  1074.             m_creature->SetVisibility(VISIBILITY_ON);
  1075.             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
  1076.             m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  1077.         }
  1078.         npc_escortAI::UpdateAI(diff);
  1079.     }
  1080. };
  1081.  
  1082. CreatureAI* GetAI_npc_tobias_seecher(Creature* pCreature)
  1083. {
  1084.     npc_tobias_seecherAI* tobias_seecherAI = new npc_tobias_seecherAI(pCreature);
  1085.  
  1086.     tobias_seecherAI->AddWaypoint(0, 549.21, -281.07, -75.27);
  1087.     tobias_seecherAI->AddWaypoint(1, 554.39, -267.39, -73.68);
  1088.     tobias_seecherAI->AddWaypoint(2, 533.59, -249.38, -67.04);
  1089.     tobias_seecherAI->AddWaypoint(3, 519.44, -217.02, -59.34);
  1090.     tobias_seecherAI->AddWaypoint(4, 506.55, -153.49, -62.34);
  1091.  
  1092.     return tobias_seecherAI;
  1093. }
  1094.  
  1095. bool GossipHello_npc_tobias_seecher(Player* pPlayer, Creature* pCreature)
  1096. {
  1097.     if (pPlayer->GetQuestStatus(QUEST_JAIL_BREAK) == QUEST_STATUS_INCOMPLETE && pInstance->GetData(DATA_QUEST_JAIL_BREAK) == ENCOUNTER_STATE_IN_PROGRESS)
  1098.     {
  1099.         pPlayer->ADD_GOSSIP_ITEM(GOSSIP_ICON_CHAT, "Get out of here, Tobias, you're free!", GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1);
  1100.         pPlayer->SEND_GOSSIP_MENU(2847, pCreature->GetGUID());
  1101.     }
  1102.     return true;
  1103. }
  1104.  
  1105. bool GossipSelect_npc_tobias_seecher(Player* pPlayer, Creature* pCreature, uint32 uiSender, uint32 uiAction)
  1106. {
  1107.     if (uiAction == GOSSIP_ACTION_INFO_DEF + 1)
  1108.     {
  1109.         pPlayer->CLOSE_GOSSIP_MENU();
  1110.         CAST_AI(npc_escortAI, (pCreature->AI()))->Start(false, true, pPlayer->GetGUID());
  1111.         pCreature->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP);
  1112.         pInstance->SetData(DATA_TOBIAS,ENCOUNTER_STATE_IN_PROGRESS);
  1113.     }
  1114.     return true;
  1115. }
  1116. */
  1117.  
  1118. /*######
  1119. ## npc_rocknot
  1120. ######*/
  1121.  
  1122. enum RocknotSays
  1123. {
  1124.     SAY_GOT_BEER                                           = -1230000
  1125. };
  1126.  
  1127. enum RocknotSpells
  1128. {
  1129.     SPELL_DRUNKEN_RAGE                                     = 14872
  1130. };
  1131.  
  1132. enum RocknotQuests
  1133. {
  1134.     QUEST_ALE                                              = 4295
  1135. };
  1136.  
  1137. struct npc_rocknotAI : public npc_escortAI
  1138. {
  1139.     npc_rocknotAI(Creature *c) : npc_escortAI(c)
  1140.     {
  1141.         pInstance = c->GetInstanceData();
  1142.     }
  1143.  
  1144.     ScriptedInstance* pInstance;
  1145.  
  1146.     uint32 BreakKeg_Timer;
  1147.     uint32 BreakDoor_Timer;
  1148.  
  1149.     void Reset()
  1150.     {
  1151.         if (HasEscortState(STATE_ESCORT_ESCORTING))
  1152.             return;
  1153.  
  1154.         BreakKeg_Timer = 0;
  1155.         BreakDoor_Timer = 0;
  1156.     }
  1157.  
  1158.     void DoGo(uint32 id, uint32 state)
  1159.     {
  1160.         if (GameObject* pGo = pInstance->instance->GetGameObject(pInstance->GetData64(id)))
  1161.             pGo->SetGoState((GOState)state);
  1162.     }
  1163.  
  1164.     void WaypointReached(uint32 i)
  1165.     {
  1166.         if (!pInstance)
  1167.             return;
  1168.  
  1169.         switch(i)
  1170.         {
  1171.         case 1:
  1172.             m_creature->HandleEmoteCommand(EMOTE_ONESHOT_KICK);
  1173.             break;
  1174.         case 2:
  1175.             m_creature->HandleEmoteCommand(EMOTE_ONESHOT_ATTACKUNARMED);
  1176.             break;
  1177.         case 3:
  1178.             m_creature->HandleEmoteCommand(EMOTE_ONESHOT_ATTACKUNARMED);
  1179.             break;
  1180.         case 4:
  1181.             m_creature->HandleEmoteCommand(EMOTE_ONESHOT_KICK);
  1182.             break;
  1183.         case 5:
  1184.             m_creature->HandleEmoteCommand(EMOTE_ONESHOT_KICK);
  1185.             BreakKeg_Timer = 2000;
  1186.             break;
  1187.         }
  1188.     }
  1189.  
  1190.     void UpdateAI(const uint32 diff)
  1191.     {
  1192.         if (!pInstance)
  1193.             return;
  1194.  
  1195.         if (BreakKeg_Timer)
  1196.         {
  1197.             if (BreakKeg_Timer <= diff)
  1198.             {
  1199.                 DoGo(DATA_GO_BAR_KEG,0);
  1200.                 BreakKeg_Timer = 0;
  1201.                 BreakDoor_Timer = 1000;
  1202.             } else BreakKeg_Timer -= diff;
  1203.         }
  1204.  
  1205.         if (BreakDoor_Timer)
  1206.         {
  1207.             if (BreakDoor_Timer <= diff)
  1208.             {
  1209.                 DoGo(DATA_GO_BAR_DOOR,2);
  1210.                 DoGo(DATA_GO_BAR_KEG_TRAP,0);               //doesn't work very well, leaving code here for future
  1211.                 //spell by trap has effect61, this indicate the bar go hostile
  1212.  
  1213.                 if (Unit *tmp = Unit::GetUnit(*m_creature,pInstance->GetData64(DATA_PHALANX)))
  1214.                     tmp->setFaction(14);
  1215.  
  1216.                 //for later, this event(s) has alot more to it.
  1217.                 //optionally, DONE can trigger bar to go hostile.
  1218.                 pInstance->SetData(TYPE_BAR,DONE);
  1219.  
  1220.                 BreakDoor_Timer = 0;
  1221.             } else BreakDoor_Timer -= diff;
  1222.         }
  1223.  
  1224.         npc_escortAI::UpdateAI(diff);
  1225.     }
  1226. };
  1227.  
  1228. CreatureAI* GetAI_npc_rocknot(Creature* pCreature)
  1229. {
  1230.     return new npc_rocknotAI(pCreature);
  1231. }
  1232.  
  1233. bool ChooseReward_npc_rocknot(Player* pPlayer, Creature* pCreature, const Quest *_Quest, uint32 item)
  1234. {
  1235.     ScriptedInstance* pInstance = pCreature->GetInstanceData();
  1236.  
  1237.     if (!pInstance)
  1238.         return true;
  1239.  
  1240.     if (pInstance->GetData(TYPE_BAR) == DONE || pInstance->GetData(TYPE_BAR) == SPECIAL)
  1241.         return true;
  1242.  
  1243.     if (_Quest->GetQuestId() == QUEST_ALE)
  1244.     {
  1245.         if (pInstance->GetData(TYPE_BAR) != IN_PROGRESS)
  1246.             pInstance->SetData(TYPE_BAR,IN_PROGRESS);
  1247.  
  1248.         pInstance->SetData(TYPE_BAR,SPECIAL);
  1249.  
  1250.         //keep track of amount in instance script, returns SPECIAL if amount ok and event in progress
  1251.         if (pInstance->GetData(TYPE_BAR) == SPECIAL)
  1252.         {
  1253.             DoScriptText(SAY_GOT_BEER, pCreature);
  1254.             pCreature->CastSpell(pCreature,SPELL_DRUNKEN_RAGE,false);
  1255.             if (npc_escortAI* pEscortAI = CAST_AI(npc_rocknotAI, pCreature->AI()))
  1256.                 pEscortAI->Start(false, false);
  1257.         }
  1258.     }
  1259.  
  1260.     return true;
  1261. }
  1262.  
  1263. /*######
  1264. ##
  1265. ######*/
  1266.  
  1267. void AddSC_blackrock_depths()
  1268. {
  1269.     Script *newscript;
  1270.  
  1271.     newscript = new Script;
  1272.     newscript->Name = "go_shadowforge_brazier";
  1273.     newscript->pGOHello = &GOHello_go_shadowforge_brazier;
  1274.     newscript->RegisterSelf();
  1275.  
  1276.     newscript = new Script;
  1277.     newscript->Name = "at_ring_of_law";
  1278.     newscript->pAreaTrigger = &AreaTrigger_at_ring_of_law;
  1279.     newscript->RegisterSelf();
  1280.  
  1281.     newscript = new Script;
  1282.     newscript->Name = "npc_grimstone";
  1283.     newscript->GetAI = &GetAI_npc_grimstone;
  1284.     newscript->RegisterSelf();
  1285.  
  1286.     newscript = new Script;
  1287.     newscript->Name = "mob_phalanx";
  1288.     newscript->GetAI = &GetAI_mob_phalanx;
  1289.     newscript->RegisterSelf();
  1290.  
  1291.     newscript = new Script;
  1292.     newscript->Name = "npc_kharan_mighthammer";
  1293.     newscript->pGossipHello =  &GossipHello_npc_kharan_mighthammer;
  1294.     newscript->pGossipSelect = &GossipSelect_npc_kharan_mighthammer;
  1295.     newscript->RegisterSelf();
  1296.  
  1297.     newscript = new Script;
  1298.     newscript->Name = "npc_lokhtos_darkbargainer";
  1299.     newscript->pGossipHello =  &GossipHello_npc_lokhtos_darkbargainer;
  1300.     newscript->pGossipSelect = &GossipSelect_npc_lokhtos_darkbargainer;
  1301.     newscript->RegisterSelf();
  1302. /*
  1303.     newscript = new Script;
  1304.     newscript->Name = "npc_dughal_stormwing";
  1305.     newscript->pGossipHello =  &GossipHello_npc_dughal_stormwing;
  1306.     newscript->pGossipSelect = &GossipSelect_npc_dughal_stormwing;
  1307.     newscript->GetAI = &GetAI_npc_dughal_stormwing;
  1308.     newscript->RegisterSelf();
  1309.  
  1310.     newscript = new Script;
  1311.     newscript->Name = "npc_tobias_seecher";
  1312.     newscript->pGossipHello =  &GossipHello_npc_tobias_seecher;
  1313.     newscript->pGossipSelect = &GossipSelect_npc_tobias_seecher;
  1314.     newscript->GetAI = &GetAI_npc_tobias_seecher;
  1315.     newscript->RegisterSelf();
  1316.  
  1317.     newscript = new Script;
  1318.     newscript->Name = "npc_marshal_windsor";
  1319.     newscript->pQuestAccept = &QuestAccept_npc_marshal_windsor;
  1320.     newscript->GetAI = &GetAI_npc_marshal_windsor;
  1321.     newscript->RegisterSelf();
  1322.  
  1323.     newscript = new Script;
  1324.     newscript->Name = "npc_marshal_reginald_windsor";
  1325.     newscript->GetAI = &GetAI_npc_marshal_reginald_windsor;
  1326.     newscript->RegisterSelf();
  1327. */
  1328.      newscript = new Script;
  1329.      newscript->Name = "npc_rocknot";
  1330.      newscript->GetAI = &GetAI_npc_rocknot;
  1331.      newscript->pChooseReward = &ChooseReward_npc_rocknot;
  1332.      newscript->RegisterSelf();
  1333. }