the black temple for sd2 271 thx #include "../../sc_defines.h" #include "../../../../../game/TargetedMovementGenerator.h" #include "../../../../../shared/WorldPacket.h" #include "../../../../../game/SpellAuras.h" #include "../../../../../game/Player.h" #include "../../../../../game/GossipDef.h" //#define GOSSIP_ITEM " 我们将和伊利丹战斗! " #define GOSSIP_ITEM " 开启黑暗神殿大门! " #define SAY_KILL1 " 谁想成为下一个?! " #define SOUND_KILL1 11473 #define SAY_KILL2 " 太轻松了! " #define SOUND_KILL2 11472 /* Spells */ #define SPELL_ILLIDAN_KNEEL 39656 #define SPELL_PARASITIC 41914 #define SPELL_FLAME_CRASH 40832 #define SPELL_SHEAR 41032 #define SPELL_DRAW_SOUL 41303 #define SPELL_FLAME_BURST 41126 #define SPELL_FLAME_CRASH_EFFECT 40836 #define SPELL_AGONIZING_FLAMES 40932 #define SPELL_FIREBALL 40598 #define SPELL_EYEBLAST 40017 #define SPELL_MOLTENFLAME 40253 #define SPELL_DEMON_FIRE 40029 #define SPELL_DEMON_FORM 40506 #define SPELL_SHADOW_BLAST 41078 #define SPELL_DARK_BARRAGE 40585 #define SPELL_SHADOW_PRISON 40647 #define SPELL_DEATH_EFFECT 40220 #define SPELL_MAIEV_BLINK 41221 #define SPELL_CAGE_TRAP 40760 #define SPELL_POTION 40545 // Flames of Azzinoth uses this #define SPELL_FLAME_BLAST 40631 #define SPELL_SUMMON_BLAZE 40637 #define SPELL_BLAZE 40610 #define DEMON_FORM_DISPLAYID 21322 #define NORMAL_FORM_DISPLAYID 21135 /* Coordinates for summons */ #define ILLIDAN_X 671.840 #define ILLIDAN_Y 304.100 #define ILLIDAN_Z 353.192 #define POS_Z 354 #define X_GLAIVE1 678 #define Y_GLAIVE1 287 #define X_FLAME1 677 #define Y_FLAME1 290 #define X_GLAIVE2 678 #define Y_GLAIVE2 321 #define X_FLAME2 677 #define Y_FLAME2 319 #define MAIEV_X 692 #define MAIEV_Y 351 #define MAIEV_Z 352 #define FLY_X1 692 #define FLY_Y1 331 #define FLY_Z1 353 #define FLY_X2 713 #define FLY_Y2 309 #define FLY_Z2 366 #define FLY_X3 687 #define FLY_Y3 271 #define FLY_Z3 353 #define FLY_X4 650 #define FLY_Y4 285 #define FLY_Z4 353 #define FLY_X5 653 #define FLY_Y5 331 #define FLY_Z5 371 // Illidan Glaive - 21431 //Flame of Azzinoth - 21320 // Dark Illidan - 21322 struct MANGOS_DLL_DECL boss_illidanAI : public ScriptedAI { boss_illidanAI(Creature *c) : ScriptedAI(c) { pInstance = (c->GetInstanceData()) ? ((ScriptedInstance*)c->GetInstanceData()) : NULL; EnterEvadeMode(); } ScriptedInstance *pInstance; uint64 Flame1GUID; uint64 Flame2GUID; uint64 Glaive1GUID; uint64 Glaive2GUID; uint64 MaievGUID; uint64 AkamaGUID; uint64 MVGUID; Creature *Maiev; uint32 ShearTimer; uint32 FlameCrashTimer; uint32 DrawSoulTimer; uint32 ParasiticTimer; uint32 FlameBurstTimer; uint32 FireballTimer; uint32 EyeBlastTimer; uint32 AgonizingFlamesTimer; uint32 ShadowBlastTimer; uint32 DarkBarrageTimer; uint32 SummonTimer; uint32 DemonFormTimer; uint32 FlyTimer; uint32 gut; uint32 DeadFlameCount; uint32 TalkTimer; uint32 TalkCount; uint32 redTimer; uint32 phase; uint32 inDemonTimer; uint32 gutTime1; uint32 gutTime2; uint32 gutTime3; uint32 gutTime4; uint32 gutTime5; uint32 gutTime6; uint32 gutTime7; uint32 gutTime8; uint32 mvTimer; bool FlameOne; bool FlameTwo; bool DemonForm; bool HasSummoned; bool IsTalking; bool MVsafe; bool InCombat; void EnterEvadeMode(); void MoveInLineOfSight(Unit *who); void AttackStart(Unit *who); void UpdateAI(const uint32 diff); void ResetThreat(); void KilledUnit(Unit *victim); void JustDied(Unit *killer); void SpecialMove(float X, float Y, float Z, uint32 Time, Creature *creature); }; void boss_illidanAI::EnterEvadeMode() { Flame1GUID = 0; Flame2GUID = 0; Glaive1GUID = 0; Glaive2GUID = 0; MaievGUID = 0; AkamaGUID = 0; MVGUID = 0; gut = 1 ; inDemonTimer = 1000; ShearTimer = 20000; FlameCrashTimer = 30000; DrawSoulTimer = 45000; ParasiticTimer = 50000; FireballTimer = 5000; EyeBlastTimer = 30000; FlameBurstTimer = 30000; AgonizingFlamesTimer = 25000; DarkBarrageTimer = 15000; ShadowBlastTimer = 5000; DemonFormTimer = 0; SummonTimer = 35000; FlyTimer = 15000; redTimer = 30000; gutTime1 = 0; gutTime2 = 0; gutTime3 = 0; gutTime4 = 0; gutTime5 = 0; gutTime6 = 0; gutTime8 = 0; gutTime7 = 0; mvTimer = 60000; TalkTimer = 0; TalkCount = 0; phase = 1; DemonForm = false; IsTalking = false; HasSummoned = false; MVsafe = false; InCombat = false; m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X,1.5); m_creature->SetHover(false); (*m_creature).GetMotionMaster()->Clear(false); m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, NORMAL_FORM_DISPLAYID); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); // m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,0); m_creature->RemoveAllAuras(); m_creature->DeleteThreatList(); m_creature->CombatStop(); DoGoHome(); } void boss_illidanAI::KilledUnit(Unit *victim) { //if (phase == 5) //MVsafe = true; switch(rand()%2) { case 0: DoYell(SAY_KILL1, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_KILL1); break; case 1: DoYell(SAY_KILL2, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_KILL2); break; } } void boss_illidanAI::JustDied(Unit* killer) { m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } void boss_illidanAI::AttackStart(Unit *who) { if (!who) return; if (who->isTargetableForAttack() && who!= m_creature) { //Begin melee attack if we are within range DoStartMeleeAttack(who); if (!InCombat) { DoYell(" 你们这是自寻死路! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11466); // m_creature->RemoveAura(SPELL_ILLIDAN_KNEEL, 0); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); InCombat = true; } } } void boss_illidanAI::MoveInLineOfSight(Unit *who) { if (!who || m_creature->getVictim()) return; if (who->isTargetableForAttack() && who->isInAccessablePlaceFor(m_creature) && m_creature->IsHostileTo(who)) { float attackRadius = m_creature->GetAttackDistance(who); if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && m_creature->IsWithinLOSInMap(who)) { if(who->HasStealthAura()) who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); //Begin melee attack if we are within range DoStartMeleeAttack(who); if (!InCombat) { DoYell(" 你们这是自寻死路! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11466); // m_creature->RemoveAura(SPELL_ILLIDAN_KNEEL, 0); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); InCombat = true; } } } } void boss_illidanAI::UpdateAI(const uint32 diff) { // Maiev1GUID = pInstance->GetUnitGUID("MV"); // Creature* Maiev1 = ((Creature*)Unit::GetUnit((*m_creature), Maiev1GUID)); //Return since we have no target if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) { // if(!m_creature->HasAura(SPELL_ILLIDAN_KNEEL, 0)) // DoCast(m_creature, SPELL_ILLIDAN_KNEEL); return; } if(IsTalking) { if(TalkTimer < diff) { switch(TalkCount) { case 0: m_creature->RemoveAllAuras(); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 6); m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X,1.5); //m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, 21135); //Illidan->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); //Illidan->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 0); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, 0); //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); ; //Maiev1->RemoveFromWorld(); DoCast(m_creature->getVictim(), SPELL_SHADOW_PRISON); DoYell(" 你们就这点本事吗?这就是你们全部的能耐? ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11476); TalkTimer = 8000; TalkCount++; //} break; case 1: if(MaievGUID) { Creature* Maiev = NULL; Maiev = ((Creature*)Unit::GetUnit((*m_creature), MaievGUID)); if(Maiev && (Maiev->isAlive())) { //DoCast(Maiev, 40545); Maiev->CastSpell(Maiev, 40545,true); Maiev->SetUInt32Value(UNIT_NPC_EMOTESTATE, 5); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,0); Maiev->SetInFront(m_creature); Maiev->SetVisibility(VISIBILITY_ON); m_creature->SetInFront(Maiev); Maiev->Yell(" 他们的愤怒和我的相比简直不值一提!伊利丹,我们之间终于要决一胜负了! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(Maiev,11491); Maiev->SetInFront(m_creature); TalkTimer = 8000; TalkCount++; } } break; case 2: if(MaievGUID) { Creature* Maiev = NULL; Maiev = ((Creature*)Unit::GetUnit((*m_creature), MaievGUID)); if(Maiev && (Maiev->isAlive())) { Maiev->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); Maiev->SetVisibility(VISIBILITY_ON); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,6); DoYell(" 玛维,你怎么可能! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11477); Maiev->SetInFront(m_creature); m_creature->SetInFront(Maiev); TalkTimer = 5000; TalkCount++; } } break; case 3: if(MaievGUID) { Creature* Maiev = NULL; Maiev = ((Creature*)Unit::GetUnit((*m_creature), MaievGUID)); if(Maiev && (Maiev->isAlive())) { Maiev->SetUInt32Value(UNIT_NPC_EMOTESTATE, 5); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,0); Maiev->SetVisibility(VISIBILITY_ON); Maiev->SetInFront(m_creature); m_creature->SetInFront(Maiev); //m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); // m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Maiev->Yell(" 啊~~~我长久以来的追猎终于要结束了……今天,正义将得到申张! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(Maiev,11492); TalkTimer = 9000; TalkCount++; } } break; case 4: if(MaievGUID) { Creature* Maiev = NULL; Maiev = ((Creature*)Unit::GetUnit((*m_creature), MaievGUID)); if(Maiev && (Maiev->isAlive())) { m_creature->RemoveAllAuras(); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Mutate(new TargetedMovementGenerator(*m_creature->getVictim())); //Creature* Maiev1 = NULL; //Maiev1GUID = Maiev1->GetGUID(); //m_creature->AI()->AttackStart(Maiev); //Maiev->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //Maiev->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); //Maiev->SetVisibility(VISIBILITY_ON); Maiev->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); Maiev->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Maiev->AI()->AttackStart(m_creature); Maiev->AddThreat(m_creature, 500000); //((CreatureAI*)Akama->AI())->AttackStart(m_creature); Maiev->SetUInt32Value(UNIT_NPC_EMOTESTATE, 38); phase = 5; IsTalking = false; } } break; case 5: if(MaievGUID) { Creature* Maiev = NULL; Maiev = ((Creature*)Unit::GetUnit((*m_creature), MaievGUID)); if(Maiev && (Maiev->isAlive())) { //m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, 21135); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0); m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X,1); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); (*m_creature).GetMotionMaster()->Clear(); (*m_creature).GetMotionMaster()->Idle(); m_creature->RemoveAllAuras(); //m_creature->Relocate(692.168640,305.063019,354.164886,0.122792); //m_creature->SendMonsterMove(692.168640,305.063019,354.164886,0.122792,true,0);//返回中间 m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 404); Maiev->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); Maiev->Yell(" 唉!结束了,你被打败了。 ",LANG_UNIVERSAL,NULL); //Maiev1->SetVisibility(VISIBILITY_OFF); //Maiev1->RemoveFromWorld(); DoPlaySoundToSet(Maiev,11496); TalkTimer = 4000; TalkCount++; } } break; case 6: m_creature->RemoveAllAuras(); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 404); DoYell(" 你赢了,玛维!但是一个没有目标的猎手什么都不是!你离开了我,什么都不是…… ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11478); TalkTimer = 25000; TalkCount++; break; case 7: if(MaievGUID) { Creature* Maiev = NULL; Maiev = ((Creature*)Unit::GetUnit((*m_creature), MaievGUID)); if(Maiev && (Maiev->isAlive())) { m_creature->RemoveAllAuras(); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 404); Maiev->Yell(" 他说的对!我觉得很失落,我……什么都不是。 ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(Maiev,11497); TalkTimer = 10000; TalkCount++; } } break; case 8: if(MaievGUID) { Creature* Maiev = NULL; Maiev = ((Creature*)Unit::GetUnit((*m_creature), MaievGUID)); if(Maiev && (Maiev->isAlive())) { m_creature->RemoveAllAuras(); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 404); Maiev->Yell(" 再会,勇士们! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(Maiev,11498); Maiev->CastSpell(Maiev,34673,true); TalkTimer = 1000; TalkCount++; } } break; case 9: if(MaievGUID) { Creature* Maiev = NULL; Maiev = ((Creature*)Unit::GetUnit((*m_creature), MaievGUID)); if(Maiev && (Maiev->isAlive())) { Maiev->SetVisibility(VISIBILITY_OFF); m_creature->getVictim()->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_NORMAL, NULL, false); TalkTimer = 1000; } } break; } }else TalkTimer -= diff; return; } // if((!m_creature->isHover()) && (phase != 2) && (!IsTalking) && (!DemonForm)) // m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); if (phase == 1 ) { if (!m_creature->isHover()) { m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); m_creature->SetHover(true); } } if (phase == 5 && (!DemonForm) ) { if(redTimer < diff) { DoYell(" 你对真正的力量一无所知! ", LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, 11469); DoCast(m_creature->getVictim(), 41447);//变红 m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); redTimer = 60000; }else redTimer -= diff; } if (phase == 5 ) { Creature* Maiev = NULL; Maiev = ((Creature*)Unit::GetUnit((*m_creature), MaievGUID)); if(mvTimer < diff) { switch(rand()%3) { case 0: Maiev->Yell(" 感受我曾经感受过的痛苦吧 ", LANG_UNIVERSAL, NULL); DoPlaySoundToSet(Maiev,11494); Maiev->CastSpell(m_creature,40760,true); break; case 1: Maiev->Yell(" 这一次你不会有机会再去监狱了 ", LANG_UNIVERSAL, NULL); DoPlaySoundToSet(Maiev,11495); Maiev->CastSpell(m_creature,40760,true); break; case 2: Maiev->Yell(" 受死吧!你这魔鬼! ", LANG_UNIVERSAL, NULL); DoPlaySoundToSet(Maiev,11500); Maiev->CastSpell(Maiev,40545,true); break; } mvTimer = 60000; }else mvTimer -= diff; } if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 70) && (phase == 1)) { Creature* Glaive1 = NULL; Creature* Glaive2 = NULL; Creature* Flame1 = NULL; Creature* Flame2 = NULL; m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); // DoTextEmote("is entering phase 2", m_creature); phase = 2; m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,254); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Idle(); m_creature->Relocate(692.168640,305.063019,354.164886,0.122792); m_creature->SendMonsterMove(692.168640,305.063019,354.164886,0.122792,true,1000);//返回中间 m_creature->SetHover(true); m_creature->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0); DoYell(" 让艾辛诺斯的烈焰吞噬你们! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11480); Glaive1 = m_creature->SummonCreature(22996,m_creature->GetPositionX()-10,m_creature->GetPositionY()+20, m_creature->GetPositionZ(),0,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,300000); Glaive1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Glaive2 = m_creature->SummonCreature(22996,m_creature->GetPositionX()-10,m_creature->GetPositionY()-20, m_creature->GetPositionZ(),3,TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN,300000); Glaive2->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Flame1 = m_creature->SummonCreature(22997, m_creature->GetPositionX()+(rand()%25),m_creature->GetPositionY()-20, m_creature->GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if (target) Flame1->AI()->AttackStart(target); else Flame1->AI()->AttackStart(m_creature->getVictim()); Flame2 = m_creature->SummonCreature(22997, m_creature->GetPositionX()-(rand()%25),m_creature->GetPositionY()+20, m_creature->GetPositionZ(), 5, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 10000); if (target) Flame1->AI()->AttackStart(target); else Flame1->AI()->AttackStart(m_creature->getVictim()); if(Glaive1 && Flame1) { Glaive1GUID = Glaive1->GetGUID(); Flame1GUID = Flame1->GetGUID(); Glaive1->CastSpell(Flame1, 40227, true); } if(Glaive2 && Flame2) { Glaive2GUID = Glaive2->GetGUID(); Flame2GUID = Flame2->GetGUID(); Glaive2->CastSpell(Flame2, 40227, true); } HasSummoned = true; } if(HasSummoned && (phase == 2)) { if(Flame1GUID) { Creature* Flame1 = NULL; Flame1 = ((Creature*)Unit::GetUnit((*m_creature), Flame1GUID)); if(Flame1 && (!Flame1->isAlive())) { m_creature->SetHealth(m_creature->GetMaxHealth()*0.6); DeadFlameCount++; Flame1GUID = 0; } } if(Flame2GUID) { Creature* Flame2 = NULL; Flame2 = ((Creature*)Unit::GetUnit((*m_creature), Flame2GUID)); if(Flame2 && (!Flame2->isAlive())) { m_creature->SetHealth(m_creature->GetMaxHealth()*0.65); DeadFlameCount++; Flame2GUID = 0; } } if(!Flame1GUID && !Flame2GUID) { m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); // DoTextEmote("is entering phase 3", m_creature); phase = 3; m_creature->SetHealth(m_creature->GetMaxHealth()*0.65); if(Glaive1GUID) { Unit* Glaive1 = NULL; Glaive1 = Unit::GetUnit((*m_creature), Glaive1GUID); if(Glaive1) Glaive1->SetVisibility(VISIBILITY_OFF); Glaive1->DealDamage(Glaive1, Glaive1->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_NORMAL, NULL, false); } if(Glaive2GUID) { Unit* Glaive2 = NULL; Glaive2 = Unit::GetUnit((*m_creature), Glaive2GUID); if(Glaive2) Glaive2->SetVisibility(VISIBILITY_OFF); Glaive2->DealDamage(Glaive2, Glaive2->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_NORMAL, NULL, false); } m_creature->RemoveAllAuras(); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); DoYell(" 你们浪费了我太多时间,去死吧! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11474); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481); m_creature->Relocate(692.168640,305.063019,354.164886,0.122792); m_creature->SendMonsterMove(692.168640,305.063019,354.164886,0.122792,true,1000);//返回中间 m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,0); m_creature->SetHover(false); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Mutate(new TargetedMovementGenerator(*m_creature->getVictim())); Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target) { m_creature->AI()->AttackStart(target); m_creature->AddThreat(target, 50000); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Mutate(new TargetedMovementGenerator(*m_creature->getVictim())); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); } } } if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 60) && (phase == 3)) { phase = 10; } if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40) && (phase == 10)) { m_creature->RemoveAllAuras(); // DoYell("Entering Phase 4!", LANG_UNIVERSAL, NULL); // DoTextEmote("is entering phase 4", m_creature); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); //if(!pInstance) // return; //MVGUID = pInstance->GetUnitGUID("MV");//获取马尾ID23197 // Creature* MV = ((Creature*)Unit::GetUnit((*m_creature), MVGUID)); //Maiev1->RemoveFromWorld(); // if(MV && MV->isAlive()) // { // Creature* Maiev = NULL; if (!Maiev) Maiev = m_creature->SummonCreature(23197, (m_creature->GetPositionX() + 10), (m_creature->GetPositionY() + 5), m_creature->GetPositionZ(), 5, TEMPSUMMON_DEAD_DESPAWN, 10000); if(Maiev) { MaievGUID = Maiev->GetGUID(); Maiev->SetVisibility(VISIBILITY_ON); Maiev->CastSpell(Maiev, 30211,true); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Idle(); Maiev->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); Maiev->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); MVsafe = true ; DemonForm = false; IsTalking = true; TalkTimer = 0; TalkCount = 0; phase = 4; Maiev->SetInFront(m_creature); m_creature->SetInFront(Maiev); } //} } if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 2) && (phase == 5)) { m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); // DoYell("ILLIDAN MUST DIE!!..wait what? That's me! NOO!!", LANG_UNIVERSAL, NULL); m_creature->RemoveAllAuras(); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); if(MaievGUID) { Unit* Maiev = NULL; Maiev = Unit::GetUnit((*m_creature), MaievGUID); if(Maiev) { (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Idle(); (*Maiev).GetMotionMaster()->Clear(false); (*Maiev).GetMotionMaster()->Idle(); IsTalking = true; TalkTimer = 0; TalkCount = 5; phase = 6; } } } if(phase != 2 && (!DemonForm)) { if(ShearTimer < diff) { m_creature->StopMoving(); // DoYell("SHEAR!", LANG_UNIVERSAL, NULL); DoCast(m_creature->getVictim(), SPELL_SHEAR); ShearTimer = 20000; m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); }else ShearTimer -= diff; if(FlameCrashTimer < diff) { m_creature->StopMoving(); // DoYell("FLAME CRASH!", LANG_UNIVERSAL, NULL); DoCast(m_creature->getVictim(), SPELL_FLAME_CRASH); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); FlameCrashTimer = 35000; }else FlameCrashTimer -= diff; if(DrawSoulTimer < diff) { //DoYell("Draw Soul!", LANG_UNIVERSAL, NULL); DoCast(m_creature->getVictim(), SPELL_DRAW_SOUL); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); DrawSoulTimer = 40000; }else DrawSoulTimer -= diff; if(ParasiticTimer < diff) { // DoYell("Parasitic Shadowfiend!", LANG_UNIVERSAL, NULL); Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target) DoCast(target, SPELL_PARASITIC); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); ParasiticTimer = 50000; }else ParasiticTimer -= diff; if(m_creature->isAttackReady()) //m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,389); DoMeleeAttackIfReady(); } if(phase == 2) { if(!m_creature->isHover()) { m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,254); m_creature->SetHover(true); } if(FlyTimer < diff) { // DoTextEmote("is flying to a new position", NULL); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); switch(rand()%5) { case 0: SpecialMove(FLY_X1, FLY_Y1, FLY_Z1, 5000, m_creature); m_creature->Relocate(FLY_X1, FLY_Y1, FLY_Z1); break; case 1: SpecialMove(FLY_X2, FLY_Y2, FLY_Z2, 5000, m_creature); m_creature->Relocate(FLY_X2, FLY_Y2, FLY_Z2); break; case 2: SpecialMove(FLY_X3, FLY_Y3, FLY_Z3, 5000, m_creature); m_creature->Relocate(FLY_X3, FLY_Y3, FLY_Z3); break; case 3: SpecialMove(FLY_X4, FLY_Y4, FLY_Z4, 5000, m_creature); m_creature->Relocate(FLY_X4, FLY_Y4, FLY_Z4); break; case 4: SpecialMove(FLY_X5, FLY_Y5, FLY_Z5, 5000, m_creature); m_creature->Relocate(FLY_X5, FLY_Y5, FLY_Z5); break; } FlyTimer = 20000; FireballTimer += 5000; DarkBarrageTimer += 5000; }else FlyTimer -= diff; if(FireballTimer < diff) { Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target) DoCast(target, SPELL_FIREBALL); FireballTimer = 7000; }else FireballTimer -= diff; if(EyeBlastTimer < diff) { Creature* BlastTarget; BlastTarget = m_creature->SummonCreature(23069, m_creature->GetPositionX()+(rand()%35),m_creature->GetPositionY()+(rand()%35), m_creature->GetPositionZ(), 5, TEMPSUMMON_TIMED_DESPAWN, 20000); if(BlastTarget) { m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); DoTextEmote(" 他的眼睛放射出绿色的光芒…… ",NULL); DoPlaySoundToSet(m_creature,11481); DoYell(" 直视背叛者的双眼吧! ",LANG_UNIVERSAL,NULL); DoCast(BlastTarget, SPELL_EYEBLAST); } EyeBlastTimer = 90000; }else EyeBlastTimer -= diff; if(DarkBarrageTimer < diff) { m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); DoYell(" 你们这些乌合之众休想碰到我! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11479); Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target) DoCast(target, SPELL_DARK_BARRAGE); DarkBarrageTimer = 60000; FireballTimer += 10000; FlyTimer += 10000; }else DarkBarrageTimer -= diff; } if((phase == 10 || phase == 4 || phase == 5 )&& (!DemonForm)) { if(AgonizingFlamesTimer < diff) { DoPlaySoundToSet(m_creature,11467); DoYell(" 我可以感觉到你们的仇恨! ",LANG_UNIVERSAL,NULL); Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target) DoCast(target, SPELL_AGONIZING_FLAMES); AgonizingFlamesTimer = 25000; }else AgonizingFlamesTimer -= diff; } if(phase == 10 || phase == 5) { // if(DemonFormTimer < diff) // { if(!DemonForm && gut == 1) { gut ++; m_creature->RemoveAllAuras(); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, 0); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, 0); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,404); //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); //m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); ResetThreat(); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Idle(); //DoCast(m_creature,40398);//hover? DoYell("感受我体内的恶魔之力吧! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11475); //(*m_creature).GetMotionMaster()->Mutate(new TargetedMovementGenerator(*m_creature->getVictim())); gutTime1 = 3000; return; } if (gut == 2 && gutTime1 < diff) { gut ++; m_creature->RemoveAllAuras(); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); ResetThreat(); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Idle(); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 403); //DoCast(m_creature,40511);//hover? gutTime2 = 1000; return; }else gutTime1 -= diff; if (gut == 3 && gutTime2 < diff) { gut ++; DemonForm = true; m_creature->RemoveAllAuras(); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); ResetThreat(); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Idle(); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 405); gutTime3= 3000; return; } else gutTime2 -= diff; if (gut == 4 && gutTime3 < diff) { gut ++; DemonForm = true; m_creature->RemoveAllAuras(); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); ResetThreat(); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Idle(); //m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); //m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); DoCast(m_creature, SPELL_DEMON_FORM);//变身 m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X,2.5); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 53); gutTime4= 60000; return; } else gutTime3-= diff; if (gut == 5 && gutTime4 < diff) { gut ++; m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,404); m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X,1.5); ResetThreat(); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Idle(); //DoCast(m_creature,40511);//hover? gutTime5 = 3000; return; }else gutTime4-= diff; if (gut == 6 && gutTime5 < diff) { gut ++; m_creature->RemoveAllAuras(); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); m_creature->RemoveAura(SPELL_DEMON_FORM, 0); m_creature->RemoveAura(SPELL_DEMON_FORM, 1); m_creature->RemoveAura(SPELL_DEMON_FORM, 2); ResetThreat(); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Idle(); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 403); gutTime6 = 1000; return; }else gutTime5 -= diff; if (gut == 7 && gutTime6 < diff) { gut ++; m_creature->RemoveAllAuras(); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); ResetThreat(); (*m_creature).GetMotionMaster()->Clear(false); (*m_creature).GetMotionMaster()->Idle(); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 405); gutTime7= 3000; return; } else gutTime6 -= diff; if (gut == 8 && gutTime7 < diff) { gut ++; m_creature->RemoveAllAuras(); ResetThreat(); m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); (*m_creature).GetMotionMaster()->Clear(false); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 389); (*m_creature).GetMotionMaster()->Mutate(new TargetedMovementGenerator(*m_creature->getVictim())); m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, NORMAL_FORM_DISPLAYID); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481); DemonForm = false; gutTime8= 60000; return; }else gutTime7 -= diff; if (gut == 9 && gutTime8 < diff) { gut = 1; //DoYell(" 变人完事! ", LANG_UNIVERSAL, NULL); return; }else gutTime8-= diff; //DemonFormTimer = 15000; // }else DemonFormTimer -= diff; } if(DemonForm) { if(ShadowBlastTimer < diff) { Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0); DoCast(target, SPELL_SHADOW_BLAST); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 53); ShadowBlastTimer = 4000; }else ShadowBlastTimer -= diff; if(FlameBurstTimer < diff) { // DoYell("FLAME BURST!", LANG_UNIVERSAL, NULL); DoYell(" 感受一万年的仇恨吧! ", LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, 11470); DoCast(m_creature->getVictim(), SPELL_FLAME_BURST); FlameBurstTimer = 35000; }else FlameBurstTimer -= diff; if(SummonTimer < diff) { // DoYell("SUMMONING BEHOLDERS!", LANG_UNIVERSAL, NULL); for(uint32 i = 0; i<5; i++) { Creature* Demon = m_creature->SummonCreature(23375, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ(), 5, TEMPSUMMON_CORPSE_DESPAWN, 2000); if(Demon) { Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target) { Demon->AI()->AttackStart(target); Demon->AddThreat(target, 50000); (*Demon).GetMotionMaster()->Mutate(new TargetedMovementGenerator(*Demon->getVictim())); } } } SummonTimer = 35000; }else SummonTimer -= diff; if( m_creature->getVictim() && m_creature->IsWithinDistInMap(m_creature->getVictim(), ATTACK_DISTANCE)) { if( m_creature->isAttackReady() ) { m_creature->AttackerStateUpdate(m_creature->getVictim()); m_creature->resetAttackTimer(); } } } // if(DemonFormTimer < diff) // { //DoYell("LEAVING DEMON FORM", LANG_UNIVERSAL, NULL); // m_creature->RemoveAllAuras(); // ResetThreat(); // m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); // (*m_creature).GetMotionMaster()->Clear(false); // (*m_creature).GetMotionMaster()->Mutate(new TargetedMovementGenerator(*m_creature->getVictim())); // m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, NORMAL_FORM_DISPLAYID); // m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); // m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481); // m_creature->RemoveAura(SPELL_DEMON_FORM, 0); // m_creature->RemoveAura(SPELL_DEMON_FORM, 1); // m_creature->RemoveAura(SPELL_DEMON_FORM, 2); // DemonForm = false; // DemonFormTimer = 15000; // gut = 1; // }else DemonFormTimer -= diff; } void boss_illidanAI::ResetThreat() { std::list& m_threatlist = m_creature->getThreatManager().getThreatList(); std::list::iterator i = m_threatlist.begin(); for(i = m_threatlist.begin(); i != m_threatlist.end(); ++i) { Unit* pUnit = NULL; pUnit = Unit::GetUnit((*m_creature), (*i)->getUnitGuid()); if(pUnit) { m_creature->getThreatManager().modifyThreatPercent(pUnit, -100); } } } void boss_illidanAI::SpecialMove(float X, float Y, float Z, uint32 Time, Creature* creature) { WorldPacket data( SMSG_MONSTER_MOVE, (41+creature->GetPackGUID().size()) ); data.append(creature->GetPackGUID()); data << creature->GetPositionX() << creature->GetPositionY() << creature->GetPositionZ(); // unknown field - unrelated to orientation // seems to increment about 1000 for every 1.7 seconds // for now, we'll just use mstime data << getMSTime(); data << uint8(0); // walkback when walking from A to B data << uint32(0x0200); // flags /* Flags: 512: Floating, moving without walking/running */ data << Time; // Time in between points data << uint32(1); // 1 single waypoint data << X << Y << Z; // the single waypoint Point B creature->SendMessageToSet( &data, true ); } struct MANGOS_DLL_DECL flame_of_azzinothAI : public ScriptedAI { flame_of_azzinothAI(Creature *c) : ScriptedAI(c) {EnterEvadeMode();} uint32 FlameBlastTimer; uint32 BlazeTimer; bool InCombat; void EnterEvadeMode() { FlameBlastTimer = 5000; BlazeTimer = 0; InCombat = false; m_creature->RemoveAllAuras(); m_creature->DeleteThreatList(); m_creature->CombatStop(); DoGoHome(); } void AttackStart(Unit *who) { if (!who) return; if (who->isTargetableForAttack() && who!= m_creature) { //Begin melee attack if we are within range DoStartMeleeAttack(who); InCombat = true; } } void MoveInLineOfSight(Unit *who) { if (!who || m_creature->getVictim()) return; if (who->isTargetableForAttack() && who->isInAccessablePlaceFor(m_creature) && m_creature->IsHostileTo(who)) { float attackRadius = m_creature->GetAttackDistance(who); if (m_creature->IsWithinDistInMap(who, attackRadius) && m_creature->GetDistanceZ(who) <= CREATURE_Z_ATTACK_RANGE && m_creature->IsWithinLOSInMap(who)) { if(who->HasStealthAura()) who->RemoveSpellsCausingAura(SPELL_AURA_MOD_STEALTH); DoStartMeleeAttack(who); InCombat = true; } } } void UpdateAI(const uint32 diff) { //Check if we have a target if (!m_creature->SelectHostilTarget() || !m_creature->getVictim()) return; if(FlameBlastTimer < diff) { DoCast(m_creature, SPELL_FLAME_BLAST); FlameBlastTimer = 15000; }else FlameBlastTimer -= diff; if (BlazeTimer < diff) { DoCast(m_creature, SPELL_SUMMON_BLAZE); BlazeTimer = 10000; }else BlazeTimer -= diff; } }; struct MANGOS_DLL_DECL flamecrashAI : public ScriptedAI { flamecrashAI(Creature *c) : ScriptedAI(c) {EnterEvadeMode();} uint32 FlameCrashTimer; void EnterEvadeMode() { FlameCrashTimer = 1000; m_creature->RemoveAllAuras(); m_creature->DeleteThreatList(); m_creature->CombatStop(); DoGoHome(); } void AttackStart(Unit *who){ return; } void MoveInLineOfSight(Unit *who){ return; } void UpdateAI(const uint32 diff) { if(FlameCrashTimer < diff) { DoCast(m_creature, SPELL_FLAME_CRASH_EFFECT); FlameCrashTimer = 15000; }else FlameCrashTimer -= diff; } }; struct MANGOS_DLL_DECL demonfireAI : public ScriptedAI { demonfireAI(Creature *c) : ScriptedAI(c) {EnterEvadeMode();} uint32 DemonFireTimer; void EnterEvadeMode() { DemonFireTimer = 0; m_creature->RemoveAllAuras(); m_creature->DeleteThreatList(); m_creature->CombatStop(); DoGoHome(); } void AttackStart(Unit *who){ return; } void MoveInLineOfSight(Unit *who){ return; } void UpdateAI(const uint32 diff) { if(DemonFireTimer < diff) { DoCast(m_creature, SPELL_DEMON_FIRE); DemonFireTimer = 30000; }else DemonFireTimer -= diff; } }; struct MANGOS_DLL_DECL blazeAI : public ScriptedAI { blazeAI(Creature *c) : ScriptedAI(c) {EnterEvadeMode();} uint32 BlazeTimer; void EnterEvadeMode(){ BlazeTimer = 1000; } void AttackStart(Unit *who){ return; } void MoveInLineOfSight(Unit *who){ return; } void UpdateAI(const uint32 diff) { if(BlazeTimer < diff) { DoCast(m_creature, SPELL_BLAZE); BlazeTimer = 15000; }else BlazeTimer -= diff; } }; struct MANGOS_DLL_DECL cage_trap_triggerAI : public ScriptedAI { cage_trap_triggerAI(Creature *c) : ScriptedAI(c) { // if(c->GetInstanceData()) //pInstance = ((ScriptedInstance*)c->GetInstanceData()); EnterEvadeMode(); } //ScriptedInstance* pInstance; // uint64 IllidanGUID; uint32 CagedTimer; uint32 mvTimer; void EnterEvadeMode() { CagedTimer = 0; mvTimer = 0; m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetVisibility(VISIBILITY_OFF); m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X,2.5); m_creature->RemoveAllAuras(); m_creature->DeleteThreatList(); m_creature->CombatStop(); DoGoHome(); } void AttackStart(Unit *who){ return; } void MoveInLineOfSight(Unit *who){ return; } void UpdateAI(const uint32 diff) { } }; struct MANGOS_DLL_DECL boss_illidan1AI : public ScriptedAI { boss_illidan1AI(Creature *c) : ScriptedAI(c) { if(c->GetInstanceData()) pInstance = ((ScriptedInstance*)c->GetInstanceData()); EnterEvadeMode(); } ScriptedInstance* pInstance; uint64 IllidanGUID1; void EnterEvadeMode() { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,398); m_creature->SetFloatValue(OBJECT_FIELD_SCALE_X,1.5); m_creature->RemoveAllAuras(); m_creature->DeleteThreatList(); m_creature->CombatStop(); DoGoHome(); } void AttackStart(Unit *who){ return; } void MoveInLineOfSight(Unit *who){ return; } void UpdateAI(const uint32 diff) { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } }; struct MANGOS_DLL_DECL akamaAI : public ScriptedAI { akamaAI(Creature *c) : ScriptedAI(c) { if(c->GetInstanceData()) pInstance = ((ScriptedInstance*)c->GetInstanceData()); EnterEvadeMode(); } ScriptedInstance* pInstance; uint64 IllidanGUID; uint64 IllidanGUID1; uint32 WalkTime; uint32 TalkTimer; uint32 WalkTime1; uint32 TalkCount; uint32 DespawnTimer; uint32 wut; uint32 wutTime1; uint32 wutTime2; uint32 wutTime3; uint32 wutTime4; bool IsTalking; bool Despawn; void EnterEvadeMode() { if(pInstance) { pInstance->SetData("IllidanStormrageEvent", 0); // Not Started } IllidanGUID = NULL; IllidanGUID1 = NULL; wut = 1; wutTime1 = 0; wutTime2 = 0; wutTime3 = 0; wutTime4 = 0; WalkTime = 0; TalkTimer = 0; TalkCount = 0; //WalkCount = 0; IsTalking = false; DespawnTimer = 0; Despawn = false; m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); // m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, 20681); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); m_creature->SetVisibility(VISIBILITY_ON); //Illidan->SetVisibility(VISIBILITY_ON); m_creature->RemoveAllAuras(); m_creature->DeleteThreatList(); m_creature->CombatStop(); DoGoHome(); } void BeginEvent(Player* target) { if(!pInstance) return; IllidanGUID1 = pInstance->GetData64("IllidanStormrage"); Creature* Illidan1 = ((Creature*)Unit::GetUnit((*m_creature), IllidanGUID1)); Creature* Illidan = NULL; Illidan = m_creature->SummonCreature(2, 692.168640,305.063019,354.164886,0.122792, TEMPSUMMON_DEAD_DESPAWN, 100000); IllidanGUID = Illidan->GetGUID(); m_creature->SetUInt32Value(UNIT_NPC_FLAGS,0); Illidan->SetVisibility(VISIBILITY_OFF); Illidan1->SetVisibility(VISIBILITY_ON); if(Illidan && Illidan->isAlive()) { // DoYell("Checking and removing aura", LANG_UNIVERSAL, NULL); // if(Illidan->HasAura(SPELL_ILLIDAN_KNEEL, 0)) // Illidan->RemoveAura(SPELL_ILLIDAN_KNEEL, 0); //DoYell("Setting destination", LANG_UNIVERSAL, NULL); float destX = Illidan->GetPositionX() + 30; float destY = Illidan->GetPositionY(); float destZ = Illidan->GetPositionZ(); // DoYell("Setting Walk Time", LANG_UNIVERSAL, NULL); // DoYell("Sending Monster Move", LANG_UNIVERSAL, NULL); //m_creature->SendMonsterMove(destX, destY, destZ, 0, false, WalkTime); WalkTime = 10000; // SpecialMove (755.229614, 304.244415, 312.159668, 5000, m_creature); // SpecialMove (771.880676, 305.175659, 313.610596, 5000, m_creature); //SpecialMove (779.961548, 305.039795, 319.706055, 5000, m_creature); //SpecialMove (793.287415, 290.741547, 319.774963, 5000, m_creature); //SpecialMove (792.858276, 278.565430, 328.446716, 5000, m_creature); //SpecialMove (792.382019, 261.826965, 341.463715, 5000, m_creature); //SpecialMove (782.984314, 249.260162, 341.709167, 5000, m_creature); //SpecialMove (773.819031, 245.568298, 347.780304, 5000, m_creature); //SpecialMove (764.204895, 241.937164, 353.667877, 5000, m_creature); //SpecialMove (742.981079, 252.640411, 352.996094 5000, m_creature); //SpecialMove (733.58,306.13,352.996185, 5000, m_creature); //SpecialMove (715.58429,305.4794,353.25, 5000, m_creature); } } void DamageTaken(Unit *done_by, uint32 &damage) { if(damage > m_creature->GetHealth()) { if(done_by != m_creature) { damage = 0; m_creature->SetHealth(m_creature->GetMaxHealth()); } } } void UpdateAI(const uint32 diff) { //GameObject* Gate = _unit->GetMapMgr()->GetInterface()->GetGameObjectNearestCoords(774.7f, 304.6f, 314.85f, 185905); if(WalkTime > 0) { // if(WalkTime < diff) 这个应该是检测移动的循环 之前不能触发暂时屏蔽 // { if(IllidanGUID1) { Unit* Illidan = NULL; Illidan = Unit::GetUnit((*m_creature), IllidanGUID); Creature* Illidan1 = NULL; Illidan1 = ((Creature*)Unit::GetUnit((*m_creature), IllidanGUID1)); if(Illidan && Illidan->isAlive()) { m_creature->SetUInt32Value(UNIT_NPC_FLAGS,0);//设计阿卡马不允许选择 TalkCount = 0;//说话次数归0 IsTalking = true;//设计准备开始对话 WalkTime = 0;//取消移动循环条件 // DoYell("Illidan Alive, idling", LANG_UNIVERSAL, NULL); // (*m_creature).GetMotionMaster()->Clear(false); // (*m_creature).GetMotionMaster()->Idle(); // DoYell("AttackStart", LANG_UNIVERSAL, NULL); // AttackStart(Illidan); //DoYell("Set In Front", LANG_UNIVERSAL, NULL); //Illidan->SetInFront(m_creature); // m_creature->SetInFront(Illidan); //DoYell("Set In Combat", LANG_UNIVERSAL, NULL); //InCombat = true; // DoYell("Talk Count", LANG_UNIVERSAL, NULL); } } // }else WalkTime -= diff;  } if(IsTalking) { if(IllidanGUID && IllidanGUID1) { Unit* Illidan = NULL; Illidan = Unit::GetUnit((*m_creature), IllidanGUID); Creature* Illidan1 = NULL; Illidan1 = ((Creature*)Unit::GetUnit((*m_creature), IllidanGUID1)); if(TalkTimer < diff) { // DoYell("Reacquiring GUID", LANG_UNIVERSAL, NULL); switch(TalkCount) { case 0: // DoYell("Entering Illidan Block", LANG_UNIVERSAL, NULL); if(Illidan1 && Illidan1->isAlive()) { Illidan1->SetVisibility(VISIBILITY_ON); //Illidan->SetVisibility(VISIBILITY_OFF); DoYell(" 时机来临了,终于等到这一刻了! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature, 11380); Illidan->setFaction(35); Illidan1->SetUInt32Value(UNIT_NPC_EMOTESTATE, 398); //Illidan->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); //Illidan->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481); //Illidan->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 0); //Illidan->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 0); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Illidan1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); Illidan1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoCast(m_creature, 40545); TalkTimer = 8000;//阿卡马开门时间 TalkCount++; } break; case 1: if(Illidan1 && Illidan1->isAlive()) { if(pInstance) { DoYell(" 伊利丹会付出代价的! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature, 11381); pInstance->SetData("GrandmasterVorpil_Death", 0); } m_creature->InterruptSpell(CURRENT_GENERIC_SPELL); TalkTimer = 1000;//阿卡马打开大门结束 TalkCount++; } break; case 2: if(Illidan1 && Illidan1->isAlive()) { //DoYell(" 阿卡马第一步 ",LANG_UNIVERSAL,NULL); SpecialMove (771.880676, 305.175659, 313.610596, 3000, m_creature); m_creature->Relocate(771.880676, 305.175659, 313.610596); //m_creature->StopMoving(); TalkTimer = 3000;//阿卡马走路时间 TalkCount++; } break; case 3: if(Illidan1 && Illidan1->isAlive()) { //DoYell(" 阿卡马第2步 ",LANG_UNIVERSAL,NULL); SpecialMove (779.961548, 305.039795, 319.706055, 5000, m_creature); m_creature->Relocate(779.961548, 305.039795, 319.706055); TalkTimer = 5000;//阿卡马走路时间 TalkCount++; } break; case 4: if(Illidan1 && Illidan1->isAlive()) { //DoYell(" 阿卡马第3步 ",LANG_UNIVERSAL,NULL); SpecialMove (793.287415, 290.741547, 319.774963, 5000, m_creature); m_creature->Relocate(793.287415, 290.741547, 319.774963); TalkTimer = 5000;//阿卡马走路时间 TalkCount++; } break; case 5: if(Illidan1 && Illidan1->isAlive()) { //DoYell(" 阿卡马第4步 ",LANG_UNIVERSAL,NULL); SpecialMove (792.858276, 278.565430, 328.446716, 5000, m_creature); m_creature->Relocate(792.858276, 278.565430, 328.446716); TalkTimer = 5000;//阿卡马走路时间 TalkCount++; } break; case 6: if(Illidan1 && Illidan1->isAlive()) { //DoYell(" 阿卡马第5步 ",LANG_UNIVERSAL,NULL); SpecialMove (792.382019, 261.826965, 341.463715, 5000, m_creature); m_creature->Relocate(792.382019, 261.826965, 341.463715); TalkTimer = 5000;//阿卡马走路时间 TalkCount++; } break; case 7: if(Illidan1 && Illidan1->isAlive()) { //DoYell(" 阿卡马第6步 ",LANG_UNIVERSAL,NULL); SpecialMove (782.984314, 249.260162, 341.709167, 5000, m_creature); m_creature->Relocate(782.984314, 249.260162, 341.709167); TalkTimer = 5000;//阿卡马走路时间 TalkCount++; } break; case 8: if(Illidan1 && Illidan1->isAlive()) { //DoYell(" 阿卡马第7步 ",LANG_UNIVERSAL,NULL); SpecialMove (773.819031, 245.568298, 347.780304, 5000, m_creature); m_creature->Relocate(773.819031, 245.568298, 347.780304); TalkTimer = 5000;//阿卡马走路时间 TalkCount++; } break; case 9: if(Illidan1 && Illidan1->isAlive()) { //DoYell(" 阿卡马第8步 ",LANG_UNIVERSAL,NULL); SpecialMove (764.204895, 241.937164, 353.667877, 5000, m_creature); m_creature->Relocate(764.204895, 241.937164, 353.667877); TalkTimer = 5000;//阿卡马走路时间 TalkCount++; } break; case 10: if(Illidan1 && Illidan1->isAlive()) { //DoYell(" 阿卡马第9步 ",LANG_UNIVERSAL,NULL); SpecialMove (742.981079, 252.640411, 352.996094, 5000, m_creature); m_creature->Relocate(742.981079, 252.640411, 352.996094); TalkTimer = 5000;//阿卡马走路时间 TalkCount++; } break; case 11: if(Illidan1 && Illidan1->isAlive()) { //DoYell(" 阿卡马第10步 ",LANG_UNIVERSAL,NULL); SpecialMove (716.58429,305.4794,353.25, 10000, m_creature); m_creature->Relocate(716.58429,305.4794,353.25); TalkTimer = 10000;//阿卡马走路时间 TalkCount++; } break; case 12: if(Illidan1 && Illidan1->isAlive()) { DoYell(" 我们要终结你的统治,伊利丹。我的人民以及整个外域都将重获自由! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11389); //Akama->Yell(" 圣光会再次照耀这阴暗的太厅,我发誓! ",LANG_UNIVERSAL,NULL); //DoPlaySoundToSet(Akama,11387); Illidan1->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,25); Illidan1->SetVisibility(VISIBILITY_ON); Illidan->SetVisibility(VISIBILITY_OFF); //m_creature->SendMonsterMove(733.11804,306.13,352.996185,3.127908,true,0);// m_creature->SendMonsterMove(715.58429,305.4794,353.25,3.127908,true,0);// m_creature->Relocate(715.58429,305.4794,353.25,3.127908); TalkTimer = 10000; TalkCount++; } break; case 13: if(Illidan1 && Illidan1->isAlive()) { m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); Illidan1->SetUInt32Value(UNIT_NPC_EMOTESTATE, 6); Illidan1->SetVisibility(VISIBILITY_ON); //Illidan->SetVisibility(VISIBILITY_OFF); Illidan1->Yell(" 阿卡玛,你的两面三刀并没有让我感到意外。我早就应该把你和你那些畸形的同胞全部杀掉! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11463); TalkTimer = 12500; TalkCount++; } break; case 14: if(Illidan1 && Illidan1->isAlive()) { m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,25); DoYell(" 圣光会再次照耀这阴暗的大厅.我发誓! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature, 11387); Illidan1->SetUInt32Value(UNIT_NPC_EMOTESTATE, 6); Illidan1->SetVisibility(VISIBILITY_ON); //Illidan->SetVisibility(VISIBILITY_OFF); TalkTimer = 5500; TalkCount++; break; } case 15: if(Illidan1 && Illidan1->isAlive()) { Illidan1->SetVisibility(VISIBILITY_ON); //Illidan->SetVisibility(VISIBILITY_OFF); Illidan1->SetUInt32Value(UNIT_NPC_EMOTESTATE, 6); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); Illidan1->Yell(" 说的好,但是这毫无意义! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11464); TalkTimer = 7000; TalkCount++; } break; case 16: if(Illidan1 && Illidan1->isAlive()) { Illidan1->SetVisibility(VISIBILITY_ON); Illidan->SetVisibility(VISIBILITY_OFF); Illidan->SetUInt32Value(UNIT_NPC_EMOTESTATE, 406); Illidan1->SetUInt32Value(UNIT_NPC_EMOTESTATE, 0); DoYell(" 进行战斗,朋友们!杀了它,让我的人民摆脱诅咒! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11391); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE,25); TalkTimer = 8800; TalkCount++; } break; case 17: if(Illidan && Illidan->isAlive()) { Creature* Illidan = NULL; Illidan = ((Creature*)Unit::GetUnit((*m_creature), IllidanGUID)); //Unit* Illidan = NULL; //Illidan = Unit::GetUnit((*m_creature), IllidanGUID); Illidan1->SetVisibility(VISIBILITY_OFF); Illidan->SetVisibility(VISIBILITY_ON); Illidan->setFaction(1752); Illidan->RemoveAllAuras(); Illidan->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY, 45479); Illidan->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_DISPLAY+1, 45481); Illidan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); Illidan->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); Illidan->SetUInt32Value(UNIT_NPC_EMOTESTATE, 389); m_creature->SetUInt32Value(UNIT_NPC_EMOTESTATE, 38); //Illidan->MonsterYell(" 你们这是自寻死路! ",LANG_UNIVERSAL,NULL); //DoPlaySoundToSet(m_creature,11466); Illidan->SetHover(true); //(Illidan).GetMotionMaster()->Clear(false); //(Illidan).GetMotionMaster()->Mutate(new TargetedMovementGenerator(Illidan->getVictim())); (*Illidan).GetMotionMaster()->Clear(false); (*Illidan).GetMotionMaster()->Mutate(new TargetedMovementGenerator(*m_creature)); m_creature->AddThreat(Illidan, 500000.0f); Illidan->AddThreat(m_creature, 50000.0f); ((CreatureAI*)m_creature->AI())->AttackStart(Illidan); Illidan->AI()->AttackStart(m_creature); DoStartMeleeAttack(Illidan); Illidan->SetInFront(m_creature); m_creature->SetInFront(Illidan); if(IllidanGUID) { Illidan->AI()->AttackStart(m_creature); Unit* target; target = SelectUnit(SELECT_TARGET_RANDOM, 0); if(target) { Illidan->AI()->AttackStart(target); Illidan->SetUInt32Value(UNIT_NPC_EMOTESTATE, 389); Illidan->AddThreat(target, 50000); (*Illidan).GetMotionMaster()->Mutate(new TargetedMovementGenerator(*Illidan->getVictim())); //目标攻击语句重点参考 } } //Unit* target = NULL; //target = SelectUnit(SELECT_TARGET_RANDOM, 0); //if (target) //Illidan1->AddThreat(target, 50000.0f); //Illidan1->AI()->AttackStart(target); IsTalking = false; } break; case 18: if(Illidan && Illidan->isAlive() ) { Illidan->MonsterYell(" 来吧!我的手下!让这个叛徒付出代价! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11465); TalkTimer = 5000;//这里设计30秒一粒单开始叫小弟 Illidan->CastSpell(Illidan,41117,false); TalkCount++; } break; case 19: if(Illidan && Illidan->isAlive() ) { //Illidan->MonsterYell(" 来吧!我的手下!让这个叛徒付出代价! ",LANG_UNIVERSAL,NULL); //DoPlaySoundToSet(m_creature,11465); TalkTimer = 5000;//这里设计30秒一粒单开始叫小弟 Illidan->CastSpell(Illidan,41117,false); TalkCount++; } break; case 20: if(Illidan && Illidan->isAlive() ) { //Illidan->MonsterYell(" 来吧!我的手下!让这个叛徒付出代价! ",LANG_UNIVERSAL,NULL); //DoPlaySoundToSet(m_creature,11465); TalkTimer = 5000;//这里设计30秒一粒单开始叫小弟 Illidan->CastSpell(Illidan,41117,false); TalkCount++; } break; case 21: if(Illidan && Illidan->isAlive() ) { //Illidan->MonsterYell(" 来吧!我的手下!让这个叛徒付出代价! ",LANG_UNIVERSAL,NULL); //DoPlaySoundToSet(m_creature,11465); TalkTimer = 5000;//这里设计30秒一粒单开始叫小弟 Illidan->CastSpell(Illidan,41117,false); TalkCount++; } break; case 22: if(Illidan && Illidan->isAlive() ) { DoYell(" 我来对付这些渣子!进攻吧朋友们!向伊利丹发起进攻! ",LANG_UNIVERSAL,NULL); DoPlaySoundToSet(m_creature,11390); TalkTimer = 6000; DespawnTimer = 5000; Despawn = true; IsTalking = false; } break; } }else TalkTimer -= diff; return; } } if(!m_creature->SelectHostilTarget() || !m_creature->getVictim()) return; if(IllidanGUID) { Creature* Illidan = NULL; Illidan = ((Creature*)Unit::GetUnit((*m_creature), IllidanGUID)); if(Illidan && Illidan->isAlive()) { if((Illidan->GetHealth()*100 / Illidan->GetMaxHealth()) < 90 && (TalkCount < 18)) { IsTalking = true; TalkCount = 18; } if((Illidan->GetHealth()*100 / Illidan->GetMaxHealth()) < 90 && (TalkCount == 22)) { TalkCount = 23; } } } if(Despawn) { if(DespawnTimer < diff) { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); SpecialMove (745.94,365.729,352.996, 6000, m_creature); m_creature->Relocate(745.94,365.729,352.996); m_creature->SetVisibility(VISIBILITY_OFF); m_creature->RemoveFromWorld(); //m_creature->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686); m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_NORMAL, NULL, false); }else DespawnTimer -= diff; } if((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 30) { DoCast(m_creature, SPELL_POTION); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); //m_creature->SetHealth(m_creature->GetMaxHealth()); } } void SpecialMove(float X, float Y, float Z, uint32 Time,Creature* creature) { WorldPacket data( SMSG_MONSTER_MOVE , (41+m_creature->GetPackGUID().size()) ); data.append(m_creature->GetPackGUID()); data << m_creature->GetPositionX() << m_creature->GetPositionY() << m_creature->GetPositionZ(); // unknown field - unrelated to orientation // seems to increment about 1000 for every 1.7 seconds // for now, we'll just use mstime data << getMSTime(); data << uint8(0); // walkback when walking from A to B //data << uint32(0x0200); // flags data << uint32(0x01000);//走 //data << uint32(0x100);//跑 MOVEMENTFLAG_WALK = 0x00000100, //data << uint32(Run ? 0x00000100 : 0x00000000); /* Flags: 512: Floating, moving without walking/running */ data << Time; // Time in between points data << uint32(1); // 1 single waypoint data << X << Y << Z; // the single waypoint Point B m_creature->SendMessageToSet( &data, true ); } }; CreatureAI* GetAI_boss_illidan(Creature *_Creature) { return new boss_illidanAI (_Creature); } CreatureAI* GetAI_boss_illidan1(Creature *_Creature) { return new boss_illidan1AI (_Creature); } CreatureAI* GetAI_npc_akama_illidan(Creature *_Creature) { return new akamaAI (_Creature); } CreatureAI* GetAI_flame_of_azzinoth(Creature *_Creature) { return new flame_of_azzinothAI (_Creature); } CreatureAI* GetAI_flamecrash(Creature *_Creature) { return new flamecrashAI (_Creature); } CreatureAI* GetAI_demonfire(Creature *_Creature) { return new demonfireAI (_Creature); } CreatureAI* GetAI_blaze(Creature *_Creature) { return new blazeAI (_Creature); } CreatureAI* GetAI_cage_trap_trigger(Creature *_Creature) { return new cage_trap_triggerAI (_Creature); } bool GossipSelect_npc_akama_illidan(Player *player, Creature *_Creature, uint32 sender, uint32 action ) { if (action == GOSSIP_ACTION_INFO_DEF + 1)//Fight time if(player->GetSession()->GetSecurity() >= 3) { _Creature->Whisper(player->GetGUID(), " 请等一下,朋友们.我来开启神殿大门 "); player->PlayerTalkClass->CloseGossip(); ((akamaAI*)_Creature->AI())->BeginEvent(player); } else player->SEND_NOTIFICATION(" 您不是GM,无法触发伊利丹事件!如有特殊需要请联系原创作者 "); player->CLOSE_GOSSIP_MENU(); return true; } bool GossipHello_npc_akama_illidan(Player *player, Creature *_Creature) { player->ADD_GOSSIP_ITEM(0, GOSSIP_ITEM, GOSSIP_SENDER_MAIN, GOSSIP_ACTION_INFO_DEF + 1); //if(player->GetSession()->GetSecurity() >= 3 ) { player->PlayerTalkClass->SendGossipMenu(907, _Creature->GetGUID()); _Creature->Whisper(player->GetGUID()," 当心点朋友们,背叛者就在那边的大厅中冥想 "); //DoPlaySoundToSet(_Creature,11388); } return true; } void AddSC_boss_illidan() { Script *newscript; newscript = new Script; newscript->Name="boss_illidan"; newscript->GetAI = GetAI_boss_illidan; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="boss_illidan1"; newscript->GetAI = GetAI_boss_illidan1; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="flame_of_azzinoth"; newscript->GetAI = GetAI_flame_of_azzinoth; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="flame_crash"; newscript->GetAI = GetAI_flamecrash; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="demon_fire"; newscript->GetAI = GetAI_demonfire; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="blaze"; newscript->GetAI = GetAI_blaze; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="effect_caged"; newscript->GetAI = GetAI_cage_trap_trigger; m_scripts[nrscripts++] = newscript; newscript = new Script; newscript->Name="npc_akama_illidan"; newscript->GetAI = GetAI_npc_akama_illidan; newscript->pGossipHello = &GossipHello_npc_akama_illidan; newscript->pGossipSelect = &GossipSelect_npc_akama_illidan; m_scripts[nrscripts++] = newscript; }