Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "precompiled.h"
- enum
- {
- SPELL_STEALTH = 1786,
- NPC_SOUTHSHORE_GUARD = 2386,
- NPC_MAGISTRATE_HENRY = 2276,
- SAY_MAGISTRATE_HENRY = -1999930,
- };
- struct npc_shadowy_assassinAI : public ScriptedAI
- {
- npc_shadowy_assassinAI(Creature* pCreature) : ScriptedAI(pCreature)
- {
- m_creature->SetActiveObjectState(true);
- assassin_script_access++;
- pid = assassin_script_access;
- Reset();
- }
- uint32 Assassin_Timer;
- static int assassin_script_access;// по умолчанию 0
- int script_step;
- bool timer_flag;
- int pid;
- void ScriptExecuting();
- void Reset()
- {
- Assassin_Timer = 5000;
- script_step = 0;
- timer_flag = false;
- m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE);
- ScriptExecuting();//при спавне в стелс
- if (pid == 5)
- assassin_script_access = 1;
- }
- void UpdateAI(const uint32 uiDiff)
- {
- if (Assassin_Timer<uiDiff)
- Assassin_Timer = 0;
- else
- Assassin_Timer -=uiDiff;
- if (timer_flag && Assassin_Timer==0)
- this->ScriptExecuting();
- if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
- return;
- DoMeleeAttackIfReady();
- }
- void MovementInform(uint32 uiMoveType, uint32 uiWpId)
- {
- if ( uiMoveType == WAYPOINT_MOTION_TYPE && uiWpId == 3 )
- {
- m_creature->GetMotionMaster()->Clear();
- m_creature->GetMotionMaster()->MoveIdle();
- m_creature->StopMoving();
- }
- }
- void JustDied(Unit *pKiller){
- if (pKiller->GetEntry() == NPC_MAGISTRATE_HENRY)
- DoScriptText(SAY_MAGISTRATE_HENRY, pKiller);
- }
- };
- void npc_shadowy_assassinAI::ScriptExecuting()
- {
- switch(script_step)
- {
- case 0://войти в стелс
- if (DoCastSpellIfCan(m_creature, SPELL_STEALTH, CAST_AURA_NOT_PRESENT) == CAST_OK)
- script_step++;
- break;
- case 1:// пойти к финальной точке
- m_creature->GetMotionMaster()->MoveWaypoint();
- script_step++;
- break;
- case 2:// реализует нужный доступ+задержку для выхода из стелса по 2
- timer_flag = true;
- if (assassin_script_access == pid)
- {
- int local_a = pid;
- if ( (local_a%2) == 1 )
- Assassin_Timer = 2000;
- script_step++;
- }
- break;
- case 3:// сам выход из стелса + задержка чтоб ринуться в атаку
- m_creature->RemoveAllAuras();
- assassin_script_access++;
- Assassin_Timer = ( (6-pid)/2 )*2000+2000;//атака стражи произойдет у всех ассассинов одновременно
- script_step++;
- break;
- case 4:// сама атака ближайшего стражника
- Creature* pAttacer;
- if (pAttacer = (GetClosestCreatureWithEntry(m_creature, NPC_SOUTHSHORE_GUARD, 20) ) )
- {
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PASSIVE);
- m_creature->AI()->AttackStart(pAttacer);
- script_step++;
- timer_flag = false;
- }
- break;
- }
- }
- int npc_shadowy_assassinAI::assassin_script_access;
- CreatureAI* GetAI_npc_shadowy_assassin(Creature* pCreature)
- {
- return new npc_shadowy_assassinAI(pCreature);
- }
- enum
- {
- SAY_WAYPOINT_SPAWN = -1999926,
- SAY_WAYPOINT_FIRST = -1999927,
- SAY_WAYPOINT_SECOND = -1999928,
- SAY_WAYPOINT_THIRD = -1999929,
- NPC_ASSASSIN = 2434,
- };
- struct npc_southshore_crierAI : public ScriptedAI
- {
- npc_southshore_crierAI(Creature* pCreature) : ScriptedAI(pCreature)
- {
- m_creature->SetActiveObjectState(true);
- Reset();
- }
- uint32 Crier_Timer;
- int script_step;
- bool timer_flag;// если флаг поднят, то надо зайти в ScriptExecuting() при Crier_Timer = 0
- void ScriptExecuting();
- void Reset()
- {
- Crier_Timer = 5000;
- script_step = 0;
- ScriptExecuting();//крикнуть фразу при спавне
- timer_flag = false;
- }
- void UpdateAI(const uint32 uiDiff)
- {
- if (Crier_Timer<uiDiff)
- Crier_Timer = 0;
- else
- Crier_Timer -=uiDiff;
- if (timer_flag && Crier_Timer==0)
- this->ScriptExecuting();
- }
- void MovementInform(uint32 uiMoveType, uint32 uiWpId)
- {
- if (uiMoveType == WAYPOINT_MOTION_TYPE)
- switch(uiWpId)
- {
- case 1:
- m_creature->SetWalk(false,true);
- break;
- case 8: //команда ассасинам переместится
- ScriptExecuting();
- break;
- case 10: //крикнуть фразу
- ScriptExecuting();
- break;
- case 14: //c бега на шаг
- m_creature->SetWalk(true, true);
- break;
- case 15: //точка смерти
- m_creature->GetMotionMaster()->MoveIdle();
- m_creature->StopMoving();
- ScriptExecuting();
- break;
- }
- }
- void ContinueScript();
- };
- void npc_southshore_crierAI::ContinueScript()
- {
- std::list<Creature*> m_Assassins;
- GetCreatureListWithEntryInGrid(m_Assassins, m_creature, NPC_ASSASSIN, 200.0f);
- if (!m_Assassins.empty())
- for (std::list<Creature*>::iterator iter = m_Assassins.begin(); iter != m_Assassins.end(); ++iter)
- if (*iter)
- if (npc_shadowy_assassinAI * pAssassinAI = dynamic_cast<npc_shadowy_assassinAI*> ((*iter)->AI()))
- pAssassinAI->ScriptExecuting();
- }
- void npc_southshore_crierAI::ScriptExecuting()
- {
- switch(script_step)
- {
- case 0:
- DoScriptText(SAY_WAYPOINT_SPAWN, m_creature);
- script_step++;
- break;
- case 1:
- DoScriptText(SAY_WAYPOINT_FIRST, m_creature);
- script_step++;
- break;
- case 2:
- ContinueScript();//асассины двигаются к финальной точке
- script_step++;
- break;
- case 3:
- DoScriptText(SAY_WAYPOINT_SECOND, m_creature);
- Crier_Timer=5000;
- timer_flag = true;
- script_step++;
- break;
- case 4:
- DoScriptText(SAY_WAYPOINT_THIRD, m_creature);
- Crier_Timer=5000;
- script_step++;
- break;
- case 5:
- m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
- ContinueScript();//ассасины выходят из стелса
- script_step++;
- timer_flag = false;
- break;
- }
- }
- CreatureAI* GetAI_npc_southshore_crier(Creature* pCreature)
- {
- return new npc_southshore_crierAI(pCreature);
- }
- void AddSC_hillsbrad_foothills()
- {
- Script* pNewScript1;
- pNewScript1 = new Script;
- pNewScript1->Name = "npc_southshore_crier";
- pNewScript1->GetAI = &GetAI_npc_southshore_crier;
- pNewScript1->RegisterSelf();
- Script* pNewScript2;
- pNewScript2 = new Script;
- pNewScript2->Name = "npc_shadowy_assassin";
- pNewScript2->GetAI = &GetAI_npc_shadowy_assassin;
- pNewScript2->RegisterSelf();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement