void EnterCombat(Unit *who) { DoAttackerAreaInCombat(who, 100); Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0); if(target) SendAttacker(target); }
void DoAggroPuls(const uint32 diff) { if(AreaInCombat_Timer <= diff) { DoAttackerAreaInCombat(me->getVictim(), 100); AreaInCombat_Timer = 5000; }else AreaInCombat_Timer -= diff; }
void EnterCombat(Unit* who) { DoScriptText(SAY_AGGRO, me); Phase = PHASE_1; events.ScheduleEvent(EVENT_CRYSTAL,30000); events.ScheduleEvent(EVENT_SUMMON,1000); me->RemoveAllAuras(); DoCast(SPELL_ARCANE_FIELD); if (instance) { for (std::list<uint64>::const_iterator itr = luiCrystals.begin(); itr != luiCrystals.end(); ++itr) { if (GameObject* temp = instance->instance->GetGameObject(*itr)) temp->SetGoState(GO_STATE_ACTIVE); } instance->SetData(DATA_NOVOS_EVENT, IN_PROGRESS); } me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoAttackerAreaInCombat(who,100); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if(pulse_Timer < diff) { DoAttackerAreaInCombat(me->getVictim(),50); pulse_Timer = 10000; }else pulse_Timer -= diff; if(TidalShieldTimer < diff) { if(TryDoCast(me, SPELL_TIDAL_SHIELD, true)) { ResetTimer(45000); TidalShieldTimer = 60000; } }else TidalShieldTimer -= diff; if(!me->HasAura(SPELL_BERSERK,0)) { if(EnrageTimer < diff) { DoScriptText(SAY_ENRAGE2, me); DoCast(me, SPELL_BERSERK, true); }else EnrageTimer -= diff; } if(SpecialYellTimer < diff) { switch(rand()%2) { case 0: DoScriptText(SAY_SPECIAL1, me); break; case 1: DoScriptText(SAY_SPECIAL2, me); break; } SpecialYellTimer = 25000 + (rand()%76)*1000; }else SpecialYellTimer -= diff; if(ImpalingSpineTimer < diff) { if(!me->IsNonMeleeSpellCasted(false)) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 80,true); if(!target) target = me->getVictim(); if(target) { DoCast(target, SPELL_IMPALING_SPINE); SpineTargetGUID = target->GetGUID(); //must let target summon, otherwise you cannot click the spine target->SummonGameObject(GOBJECT_SPINE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 0); switch(rand()%2) { case 0: DoScriptText(SAY_NEEDLE1, me); break; case 1: DoScriptText(SAY_NEEDLE2, me); break; } ImpalingSpineTimer = 21000; } } }else ImpalingSpineTimer -= diff; if(NeedleSpineTimer < diff) { if(TryDoCast(me, SPELL_NEEDLE_SPINE, true)) { //std::list<Unit*> target; //SelectUnitList(target, 3, SELECT_TARGET_RANDOM, 100, true); //for(std::list<Unit*>::iterator i = target.begin(); i != target.end(); ++i) // me->CastSpell(*i, 39835, true); NeedleSpineTimer = 3000; } }else NeedleSpineTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if(!UpdateVictim()) return; if(Phase1) { if(pulse_Timer < diff) { if(me->GetPositionZ() > (COORD_Z_HOME+15)) { EnterEvadeMode(); return; } DoAttackerAreaInCombat(me->getVictim(),50); pulse_Timer = 10000; }else pulse_Timer -= diff; } if(!me->HasAura(SPELL_BERSERK, 0)) { if(EnrageTimer < diff) { DoCast(me, SPELL_BERSERK); switch(rand()%2) { case 0: DoScriptText(SAY_ENRAGE1, me); break; case 1: DoScriptText(SAY_ENRAGE2, me); break; } }else EnrageTimer -= diff; } if(ArcingSmashTimer < diff) { DoCast(me->getVictim(),Phase1 ? SPELL_ARCING_SMASH_1 : SPELL_ARCING_SMASH_2); ArcingSmashTimer = 10000; }else ArcingSmashTimer -= diff; if(FelBreathTimer < diff) { DoCast(me->getVictim(),Phase1 ? SPELL_FELBREATH_1 : SPELL_FELBREATH_2); FelBreathTimer = 25000; }else FelBreathTimer -= diff; if(EjectTimer < diff) { DoCast(me->getVictim(),Phase1 ? SPELL_EJECT_1 : SPELL_EJECT_2); EjectTimer = 15000; }else EjectTimer -= diff; if(Charge_Timer < diff) { if(me->GetDistance2d(me->getVictim()) > 15) DoCast(me->getVictim(),SPELL_CHARGE); Charge_Timer = 10000; }else Charge_Timer -= diff; if(Phase1) { if(BewilderingStrikeTimer < diff) { DoCast(me->getVictim(), SPELL_BEWILDERING_STRIKE); //float mt_threat = DoGetThreat(me->getVictim()); //if (Unit *target = SelectTarget(SELECT_TARGET_TOPAGGRO, 1)) // me->AddThreat(target, mt_threat); BewilderingStrikeTimer = 20000; }else BewilderingStrikeTimer -= diff; //if(EjectTimer < diff) //{ // DoCast(me->getVictim(), SPELL_EJECT1); // DoModifyThreatPercent(me->getVictim(), -40); // EjectTimer = 15000; //}else EjectTimer -= diff; //if(AcidicWoundTimer < diff) //{ // DoCast(me->getVictim(), SPELL_ACIDIC_WOUND); // AcidicWoundTimer = 10000; //}else AcidicWoundTimer -= diff; if(BloodboilTimer < diff) { if(BloodboilCount < 5) // Only cast it five times. { CastBloodboil(); // Causes issues on windows, so is commented out. //DoCast(me->getVictim(), SPELL_BLOODBOIL); ++BloodboilCount; BloodboilTimer = 10000; } }else BloodboilTimer -= diff; } if(!Phase1) { //if(FelGeyserTimer < diff) //{ // DoCast(me->getVictim(), SPELL_FEL_GEYSER,true); // FelGeyserTimer = 30000; //}else FelGeyserTimer -= diff; if(me->getVictim() && me->getVictim()->IsImmunedToDamage(SPELL_SCHOOL_MASK_ALL)) me->getThreatManager().modifyThreatPercent(me->getVictim(),-100); } if(PhaseChangeTimer < diff) { if(Phase1) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0,100,true); if(target && target->isAlive()) { Phase1 = false; TargetThreat = DoGetThreat(target); TargetGUID = target->GetGUID(); if(DoGetThreat(target)) DoModifyThreatPercent(target, -100); me->AddThreat(target, 50000000.0f); target->CastSpell(me, SPELL_TAUNT_GURTOGG, true); me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, true); // If VMaps are disabled, this spell can call the whole instance DoCast(me, SPELL_INSIGNIFIGANCE, true); DoCast(target,SPELL_FEL_RAGE_1, true); DoCast(target,SPELL_FEL_RAGE_2, true); DoCast(target,SPELL_FEL_RAGE_3, true); DoCast(target,SPELL_FEL_RAGE_SCALE, true); DoCast(target,SPELL_FEL_GEYSER,true); //Cast this without triggered so that it appears in combat logs and shows visual. DoCast(me, SPELL_FEL_RAGE_SELF); switch(rand()%2) { case 0: DoScriptText(SAY_SPECIAL1, me); break; case 1: DoScriptText(SAY_SPECIAL2, me); break; } FelGeyserTimer = 1; PhaseChangeTimer = 30000; } }else // Encounter is a loop pretty much. Phase 1 -> Phase 2 -> Phase 1 -> Phase 2 till death or enrage { if(TargetGUID) RevertThreatOnTarget(TargetGUID); TargetGUID = 0; Phase1 = true; BloodboilTimer = 10000; BloodboilCount = 0; /*AcidicWoundTimer += 2000;*/ ArcingSmashTimer += 2000; FelBreathTimer += 2000; EjectTimer += 2000; PhaseChangeTimer = 65000; me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); me->ApplySpellImmune(0, IMMUNITY_EFFECT, SPELL_EFFECT_ATTACK_ME, false); } }else PhaseChangeTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if(!UpdateVictim()) return; if(pulse_Timer < diff) { DoAttackerAreaInCombat(me->getVictim(),50); pulse_Timer = 10000; }else pulse_Timer -= diff; if(((me->GetHealth()*100 / me->GetMaxHealth()) < 10) && !Enraged) { Enraged = true; DoCast(me, SPELL_ENRAGE, true); DoScriptText(SAY_ENRAGE, me); } CastBeam(diff); //if(BeamTimer < diff) //{ // if(!me->IsNonMeleeSpellCasted(false)) // { // switch(CurrentBeam) // { // case 0: // DoCast(me, SPELL_BEAM_SINISTER_TRIGGER); // break; // case 1: // DoCast(me, SPELL_BEAM_VILE_TRIGGER); // break; // case 2: // DoCast(me, SPELL_BEAM_WICKED_TRIGGER); // break; // case 3: // DoCast(me, SPELL_BEAM_SINFUL_TRIGGER); // break; // } // uint32 Beam = CurrentBeam; // while(CurrentBeam == Beam) // CurrentBeam = rand()%4; // BeamTimer = 30000; // } //}else BeamTimer -= diff; // Select 3 random targets (can select same target more than once), teleport to a random location then make them cast explosions until they get away from each other. if(FatalAttractionTimer < diff) { TeleportPlayers(); switch(rand()%2) { case 0: DoScriptText(SAY_SPELL2, me); break; case 1: DoScriptText(SAY_SPELL3, me); break; } FatalAttractionExplodeTimer = 2000; FatalAttractionTimer = 30000; }else FatalAttractionTimer -= diff; if(FatalAttractionExplodeTimer < diff) { Player* targets[3]; for(uint8 i = 0; i < 3; ++i) { if(TargetGUID[i]) targets[i] = Unit::GetPlayer(*me,TargetGUID[i]); else targets[i] = NULL; } if(targets[0] && targets[0]->isAlive()) { bool isNear = false; if(targets[1] && targets[1]->isAlive() && targets[0]->GetDistance2d(targets[1]) < 25) isNear = true; if(!isNear) if(targets[2] && targets[2]->isAlive() && targets[0]->GetDistance2d(targets[2]) < 25) isNear = true; if(isNear) targets[0]->CastSpell(targets[0],SPELL_ATTRACTION,true); else { targets[0]->RemoveAurasDueToSpell(SPELL_ATTRACTION_VIS); TargetGUID[0] = 0; targets[0] = NULL; } } if(targets[1] && targets[1]->isAlive()) { bool isNear = false; if(targets[0] && targets[0]->isAlive() && targets[1]->GetDistance2d(targets[0]) < 25) isNear = true; if(!isNear) if(targets[2] && targets[2]->isAlive() && targets[1]->GetDistance2d(targets[2]) < 25) isNear = true; if(isNear) targets[1]->CastSpell(targets[1],SPELL_ATTRACTION,true); else { targets[1]->RemoveAurasDueToSpell(SPELL_ATTRACTION_VIS); TargetGUID[1] = 0; targets[1] = NULL; } } if(targets[2] && targets[2]->isAlive()) { bool isNear = false; if(targets[0] && targets[0]->isAlive() && targets[2]->GetDistance2d(targets[0]) < 25) isNear = true; if(!isNear) if(targets[1] && targets[1]->isAlive() && targets[2]->GetDistance2d(targets[1]) < 25) isNear = true; if(isNear) targets[2]->CastSpell(targets[1],SPELL_ATTRACTION,true); else { targets[2]->RemoveAurasDueToSpell(SPELL_ATTRACTION_VIS); TargetGUID[2] = 0; targets[2] = NULL; } } bool allClear = true; for(uint8 i = 0; i < 3; i++) { if(TargetGUID[i] != 0) allClear = false; } if(allClear) FatalAttractionExplodeTimer = 60000; else FatalAttractionExplodeTimer = 1000; }else FatalAttractionExplodeTimer -= diff; if(ShriekTimer < diff) { if(TryDoCast(me->getVictim(), SPELL_SILENCING_SHRIEK)) ShriekTimer = 20000; }else ShriekTimer -= diff; //if(SaberTimer < diff) //{ // if(TryDoCast(me->getVictim(), SPELL_SABER_LASH)) // SaberTimer = 10000; //}else SaberTimer -= diff; //Enrage if(!me->HasAura(SPELL_BERSERK, 0)) if(EnrageTimer < diff) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_ENRAGE, me); }else EnrageTimer -= diff; //Random taunts if(RandomYellTimer < diff) { switch(rand()%3) { case 0: DoScriptText(SAY_TAUNT1, me); break; case 1: DoScriptText(SAY_TAUNT2, me); break; case 2: DoScriptText(SAY_TAUNT3, me); break; } }else RandomYellTimer -= diff; DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if(Intro) { if(AggroTimer < diff) { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); DoScriptText(SAY_AGGRO, me); me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_STATE_NONE); Intro = false; if(AggroTargetGUID) { Unit* pUnit = Unit::GetUnit((*me), AggroTargetGUID); if(pUnit) AttackStart(pUnit); DoZoneInCombat(); } else { EnterEvadeMode(); return; } }else AggroTimer -= diff; } if(!UpdateVictim() || Intro) return; if(pulse_Timer < diff) { DoAttackerAreaInCombat(me->getVictim(),50); pulse_Timer = 10000; }else pulse_Timer -= diff; //if(SummonShadowsTimer < diff) //{ // MindControlGhost(); // for(uint8 i = 0; i < 2; ++i) // { // Creature* Shadow = NULL; // float X = CalculateRandomLocation(me->GetPositionX(), 10); // //Shadow = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, X, me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0); // if(Shadow) // { // Unit *ptarget = SelectTarget(SELECT_TARGET_RANDOM, 1); // if(!ptarget) // ptarget = me->getVictim(); // if(ptarget) // Shadow->AI()->AttackStart(ptarget); // } // } // SummonShadowsTimer = 60000; //}else SummonShadowsTimer -= diff; if(SummonDoomBlossomTimer < diff) { if (Unit *ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) { if(TryDoCast(ptarget,SPELL_SUMMON_DOOM_BLOSSOM)) SummonDoomBlossomTimer = 35000; } }else SummonDoomBlossomTimer -= diff; if(IncinerateTimer < diff) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 300, true); if(!target) target = me->getVictim(); if(target) { if(TryDoCast(target, SPELL_INCINERATE)) { switch(rand()%2) { case 0: DoScriptText(SAY_SPECIAL1, me); break; case 1: DoScriptText(SAY_SPECIAL2, me); break; } IncinerateTimer = 10000 + (rand()%10) * 1000; } } }else IncinerateTimer -= diff; if(CrushingShadowsTimer < diff) { if(!me->IsNonMeleeSpellCasted(false)) { SpellEntry *spellInfo; spellInfo = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_CRUSHING_SHADOWS); if(spellInfo) { spellInfo->MaxAffectedTargets = 5; me->CastSpell(me,spellInfo,false); } CrushingShadowsTimer = 10000 + rand()%5000; } }else CrushingShadowsTimer -= diff; if(ShadowOfDeathTimer < diff) { if(!me->IsNonMeleeSpellCasted(false)) { Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 300, true); if(!target) target = me->getVictim(); if(target && target->isAlive() && target->GetTypeId() == TYPEID_PLAYER && !target->HasAura(SPELL_SHADOW_OF_DEATH,1) ) { // Custom ... becaus Effekt is not needed SpellEntry *spellInfo; spellInfo = (SpellEntry*)GetSpellStore()->LookupEntry(SPELL_SHADOW_OF_DEATH); if(spellInfo) { spellInfo->Effect[0] = 0; me->CastSpell(target,spellInfo,false); } //DoCast(target, SPELL_SHADOW_OF_DEATH); //me->CastCustomSpell(target,SPELL_SHADOW_OF_DEATH,NULL,NULL,NULL,false); /*GhostGUID = target->GetGUID();*/ ShadowOfDeathTimer = 30000; //SummonShadowsTimer = 53000; // Make it VERY close but slightly less so that we can check if the aura is still on the player } } }else ShadowOfDeathTimer -= diff; if(SummonShadowsTimer < diff) { if(!shadowtargets.empty()) { std::list<uint64> del_player; del_player.clear(); for(std::list<uint64>::iterator itr = shadowtargets.begin(); itr != shadowtargets.end(); ++itr) { Player* temp = Unit::GetPlayer(*me,*itr); if(temp) { if(temp->isDead() || !temp->HasAuraEffect(SPELL_SHADOW_OF_DEATH,1)) { float x,y,z; temp->GetPosition(x,y,z); Unit *ptarget; Creature* c_temp; c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x+3 ,y+3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0); ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0); if(!ptarget) ptarget = me->getVictim(); if(ptarget) c_temp->Attack(ptarget,true); c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x-3 ,y+3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0); ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0); if(!ptarget) ptarget = me->getVictim(); if(ptarget) c_temp->Attack(ptarget,true); c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x+3 ,y-3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0); ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0); if(!ptarget) ptarget = me->getVictim(); if(ptarget) c_temp->Attack(ptarget,true); c_temp = me->SummonCreature(CREATURE_SHADOWY_CONSTRUCT, x-3 ,y-3 , z , 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 0); ptarget = SelectTarget(SELECT_TARGET_RANDOM, 0); if(!ptarget) ptarget = me->getVictim(); if(ptarget) c_temp->Attack(ptarget,true); del_player.push_back(*itr); } }/*else del_player.push_back(*itr);*/ //Auskommentieren fixt ALT+F4 Exploit } for(std::list<uint64>::iterator itr = del_player.begin(); itr != del_player.end(); ++itr) { shadowtargets.remove(*itr); Player* sacrifice = Unit::GetPlayer(*me,*itr); if(sacrifice && sacrifice->isAlive()) { me->DealDamage(sacrifice,sacrifice->GetHealth()); } } } SummonShadowsTimer = 1000; }else SummonShadowsTimer -= diff; if(RandomYellTimer < diff) { switch(rand()%2) { case 0: DoScriptText(SAY_SPELL1, me); break; case 1: DoScriptText(SAY_SPELL2, me); break; } RandomYellTimer = 50000 + rand()%51 * 1000; }else RandomYellTimer -= diff; if(!me->HasAura(SPELL_BERSERK, 0)) { if(EnrageTimer < diff) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_ENRAGE, me); }else EnrageTimer -= diff; } DoMeleeAttackIfReady(); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if(pulse_Timer < diff) { if(me->getVictim() && me->getVictim()->GetTypeId() == TYPEID_PLAYER) DoAttackerGroupInCombat(((Player*)me->getVictim())); else DoAttackerAreaInCombat(me->getVictim(),50); pulse_Timer = 5000; }else pulse_Timer -= diff; if(!me->HasAura(SPELL_BERSERK, 0)) { if(BerserkTimer < diff) DoCast(me, SPELL_BERSERK); else BerserkTimer -= diff; } if(SummonFlameTimer < diff) { DoCast(me, SPELL_MOLTEN_PUNCH); SummonFlameTimer = 10000; }else SummonFlameTimer -= diff; if(Phase1) { if(HatefulStrikeTimer < diff) { if(Unit* target = CalculateHatefulStrikeTarget()) { DoCast(target, SPELL_HATEFUL_STRIKE); HatefulStrikeTimer = 5000; } }else HatefulStrikeTimer -= diff; } if(!Phase1) { if(SwitchTargetTimer < diff) { if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true)) { if(me->GetDistance2d(me->getVictim()) < 40) me->CastSpell(me->getVictim(),SPELL_CHARGE,false); DoResetThreat(); me->AddThreat(target, 5000000.0f); DoScriptText(EMOTE_NEW_TARGET, me); SwitchTargetTimer = 10000; } }else SwitchTargetTimer -= diff; if(SummonVolcanoTimer < diff) { if(Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true)) { DoCast(target, SPELL_VOLCANIC_SUMMON); DoScriptText(EMOTE_GROUND_CRACK, me); SummonVolcanoTimer = 10000; } }else SummonVolcanoTimer -= diff; } if(PhaseSwitchTimer < diff) { if(!Phase1) { Phase1 = true; DoResetThreat(); PhaseSwitchTimer = 60000; me->SetSpeed(MOVE_RUN, 1.2f); DoZoneInCombat(); me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, false); me->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, false); } else { Phase1 = false; DoResetThreat(); SwitchTargetTimer = 10000; SummonVolcanoTimer = 2000; PhaseSwitchTimer = 60000; me->SetSpeed(MOVE_RUN, 0.9f); DoZoneInCombat(); me->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true); me->ApplySpellImmune(0, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true); } }else PhaseSwitchTimer -= diff; DoMeleeAttackIfReady(); }