Advertisement
Shuraken007

script - southshore_assasin_event

Apr 14th, 2014
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.93 KB | None | 0 0
  1. #include "precompiled.h"
  2.  
  3. enum
  4. {
  5.     SPELL_STEALTH = 1786,
  6.     NPC_SOUTHSHORE_GUARD = 2386,
  7.     NPC_MAGISTRATE_HENRY = 2276,
  8.     SAY_MAGISTRATE_HENRY = -1999930,
  9. };
  10.  
  11.  
  12. struct npc_shadowy_assassinAI : public ScriptedAI
  13. {
  14.     npc_shadowy_assassinAI(Creature* pCreature) : ScriptedAI(pCreature)
  15.     {
  16.         m_creature->SetActiveObjectState(true);
  17.         assassin_script_access++;
  18.         pid = assassin_script_access;
  19.         Reset();
  20.     }
  21.     uint32 Assassin_Timer;
  22.     static int assassin_script_access;// по умолчанию 0
  23.     int script_step;
  24.     bool timer_flag;
  25.     int pid;
  26.     void ScriptExecuting();
  27.     void Reset()
  28.     {
  29.         Assassin_Timer = 5000;
  30.         script_step = 0;
  31.         timer_flag = false;
  32.         m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  33.         m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE);
  34.         ScriptExecuting();//при спавне в стелс
  35.         if (pid == 5)
  36.             assassin_script_access = 1;
  37.     }
  38.     void UpdateAI(const uint32 uiDiff)
  39.     {
  40.         if (Assassin_Timer<uiDiff)
  41.             Assassin_Timer = 0;
  42.         else
  43.             Assassin_Timer -=uiDiff;
  44.  
  45.         if (timer_flag && Assassin_Timer==0)
  46.             this->ScriptExecuting();
  47.  
  48.         if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
  49.             return;
  50.  
  51.         DoMeleeAttackIfReady();
  52.     }
  53.     void MovementInform(uint32 uiMoveType, uint32 uiWpId)
  54.     {
  55.         if ( uiMoveType == WAYPOINT_MOTION_TYPE && uiWpId == 3 )
  56.         {
  57.             m_creature->GetMotionMaster()->Clear();
  58.             m_creature->GetMotionMaster()->MoveIdle();
  59.             m_creature->StopMoving();
  60.         }
  61.     }
  62.     void JustDied(Unit *pKiller){
  63.         if (pKiller->GetEntry() == NPC_MAGISTRATE_HENRY)
  64.             DoScriptText(SAY_MAGISTRATE_HENRY, pKiller);
  65.     }
  66. };
  67.  
  68. void npc_shadowy_assassinAI::ScriptExecuting()
  69. {
  70.     switch(script_step)
  71.     {
  72.         case 0://войти в стелс
  73.             if (DoCastSpellIfCan(m_creature, SPELL_STEALTH, CAST_AURA_NOT_PRESENT) == CAST_OK)
  74.             script_step++;
  75.             break;
  76.         case 1:// пойти к финальной точке
  77.             m_creature->GetMotionMaster()->MoveWaypoint();
  78.             script_step++;
  79.             break;
  80.         case 2:// реализует нужный доступ+задержку для выхода из стелса по 2
  81.             timer_flag = true;
  82.             if (assassin_script_access == pid)
  83.             {
  84.                 int local_a = pid;
  85.                 if ( (local_a%2) == 1 )
  86.                     Assassin_Timer = 2000;
  87.                 script_step++;
  88.             }
  89.             break;
  90.         case 3:// сам выход из стелса + задержка чтоб ринуться в атаку
  91.             m_creature->RemoveAllAuras();
  92.             assassin_script_access++;
  93.             Assassin_Timer = ( (6-pid)/2 )*2000+2000;//атака стражи произойдет у всех ассассинов одновременно
  94.             script_step++;
  95.             break;
  96.         case 4:// сама атака ближайшего стражника
  97.             Creature* pAttacer;
  98.             if (pAttacer = (GetClosestCreatureWithEntry(m_creature, NPC_SOUTHSHORE_GUARD, 20) ) )
  99.             {
  100.                 m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
  101.                 m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE);
  102.                 m_creature->AI()->AttackStart(pAttacer);
  103.                 script_step++;
  104.                 timer_flag = false;
  105.             }
  106.             break;
  107.     }
  108. }
  109.  
  110. int npc_shadowy_assassinAI::assassin_script_access;
  111.  
  112. CreatureAI* GetAI_npc_shadowy_assassin(Creature* pCreature)
  113. {
  114.     return new npc_shadowy_assassinAI(pCreature);
  115. }
  116.  
  117. enum
  118. {
  119.     SAY_WAYPOINT_SPAWN = -1999926,
  120.     SAY_WAYPOINT_FIRST = -1999927,
  121.     SAY_WAYPOINT_SECOND = -1999928,
  122.     SAY_WAYPOINT_THIRD = -1999929,
  123.     NPC_ASSASSIN = 2434,
  124. };
  125.  
  126.  
  127. struct npc_southshore_crierAI : public ScriptedAI
  128. {
  129.     npc_southshore_crierAI(Creature* pCreature) : ScriptedAI(pCreature)
  130.     {
  131.         m_creature->SetActiveObjectState(true);
  132.         Reset();
  133.     }
  134.     uint32 Crier_Timer;
  135.     int script_step;
  136.     bool timer_flag;// если флаг поднят, то надо зайти в ScriptExecuting() при Crier_Timer = 0
  137.     void ScriptExecuting();
  138.     void Reset()
  139.     {
  140.         Crier_Timer = 5000;
  141.         script_step = 0;
  142.         ScriptExecuting();//крикнуть фразу при спавне
  143.         timer_flag = false;
  144.     }
  145.     void UpdateAI(const uint32 uiDiff)
  146.     {
  147.         if (Crier_Timer<uiDiff)
  148.             Crier_Timer = 0;
  149.         else
  150.             Crier_Timer -=uiDiff;
  151.         if (timer_flag && Crier_Timer==0)
  152.             this->ScriptExecuting();
  153.     }
  154.     void MovementInform(uint32 uiMoveType, uint32 uiWpId)
  155.     {
  156.         if (uiMoveType == WAYPOINT_MOTION_TYPE)
  157.             switch(uiWpId)
  158.             {
  159.                 case 1:
  160.                     m_creature->SetWalk(false,true);
  161.                     break;
  162.                 case 8: //команда ассасинам переместится
  163.                     ScriptExecuting();
  164.                     break;
  165.                 case 10: //крикнуть фразу
  166.                     ScriptExecuting();
  167.                     break;
  168.                 case 14: //c бега на шаг
  169.                     m_creature->SetWalk(true, true);
  170.                     break;
  171.                 case 15: //точка смерти
  172.                     m_creature->GetMotionMaster()->MoveIdle();
  173.                     m_creature->StopMoving();
  174.                     ScriptExecuting();
  175.                     break;
  176.             }
  177.     }
  178.     void ContinueScript();
  179. };
  180.  
  181. void npc_southshore_crierAI::ContinueScript()
  182. {
  183.     std::list<Creature*> m_Assassins;
  184.     GetCreatureListWithEntryInGrid(m_Assassins, m_creature, NPC_ASSASSIN, 200.0f);
  185.     if (!m_Assassins.empty())
  186.         for (std::list<Creature*>::iterator iter = m_Assassins.begin(); iter != m_Assassins.end(); ++iter)
  187.             if (*iter)
  188.                 if (npc_shadowy_assassinAI * pAssassinAI = dynamic_cast<npc_shadowy_assassinAI*> ((*iter)->AI()))
  189.                     pAssassinAI->ScriptExecuting();
  190. }
  191.  
  192. void npc_southshore_crierAI::ScriptExecuting()
  193. {
  194.     switch(script_step)
  195.     {
  196.         case 0:
  197.             DoScriptText(SAY_WAYPOINT_SPAWN, m_creature);
  198.             script_step++;
  199.             break;
  200.         case 1:
  201.             DoScriptText(SAY_WAYPOINT_FIRST, m_creature);
  202.             script_step++;
  203.             break;
  204.         case 2:
  205.             ContinueScript();//асассины двигаются к финальной точке
  206.             script_step++;
  207.             break;
  208.         case 3:
  209.             DoScriptText(SAY_WAYPOINT_SECOND, m_creature);
  210.             Crier_Timer=5000;
  211.             timer_flag = true;
  212.             script_step++;
  213.             break;
  214.         case 4:
  215.             DoScriptText(SAY_WAYPOINT_THIRD, m_creature);
  216.             Crier_Timer=5000;
  217.             script_step++;
  218.             break;
  219.         case 5:
  220.             m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
  221.             ContinueScript();//ассасины выходят из стелса
  222.             script_step++;
  223.             timer_flag = false;
  224.             break;
  225.     }
  226. }
  227.  
  228. CreatureAI* GetAI_npc_southshore_crier(Creature* pCreature)
  229. {
  230.     return new npc_southshore_crierAI(pCreature);
  231. }
  232.  
  233.  
  234. void AddSC_hillsbrad_foothills()
  235. {
  236.     Script* pNewScript1;
  237.    
  238.     pNewScript1 = new Script;
  239.     pNewScript1->Name = "npc_southshore_crier";
  240.     pNewScript1->GetAI = &GetAI_npc_southshore_crier;
  241.     pNewScript1->RegisterSelf();
  242.  
  243.     Script* pNewScript2;
  244.    
  245.     pNewScript2 = new Script;
  246.     pNewScript2->Name = "npc_shadowy_assassin";
  247.     pNewScript2->GetAI = &GetAI_npc_shadowy_assassin;
  248.     pNewScript2->RegisterSelf();
  249. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement