void EnterCombat(Unit* pWho) { if (!pWho) return; if (Creature* pBuddy = GetBuddy()) { if (!pBuddy->getVictim()) pBuddy->AI()->AttackStart(pWho); } Aggro(pWho); }
virtual void StartVoltron() { IF_MIMIRON_AI m_creature->Attack(mimironAI->m_creature->getVictim(), true); Events.Reset(); IsInUse = true; IsVoltron = true; SetCombatMovement(false); m_creature->SetDeathState(JUST_ALIVED); m_creature->SetHealth(m_creature->GetMaxHealth()/2); Aggro(m_creature->getVictim()); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); UpdateVoltronMovement(); }
/** * This function only calls Aggro, which is to be used for scripting purposes */ void ScriptedAI::EnterCombat(Unit* pEnemy) { if (pEnemy) Aggro(pEnemy); }
/** * This function only calls Aggro, which is to be used for scripting purposes */ void ScriptedAI::EnterCombat(Unit* enemy) { if (enemy) Aggro(enemy); }
void UpdateAI(const uint32 diff) { if (WaterTimer < diff) // every 1000ms { Map *map = m_creature->GetMap(); if(!map->IsDungeon()) return; Map::PlayerList const &players = map->GetPlayers(); if(players.getSize()==0) return; for(Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { Player* plr = itr->getSource(); if (!plr) continue; if (!(plr)->GetSession() || !(plr)->isAlive()) continue; if (!InCombat && plr->GetDistance(m_creature) < 2.25 && (plr->HasAura(33095, 2))) { if (TimeToSpawn%40 == 0) { DoYell(EMOTE_STOPFISHING, LANG_UNIVERSAL, NULL); } if (FirstVictim == 0) FirstVictim = plr; // Remember the first player who started fishing // the player is trying to catch fish TimeToSpawn--; // Time to spawn reduced for every fishing player by 1 per second } // --> more fishermen(and-women): faster spawn if (!InCombat && (TimeToSpawn<=1)) // effective up to TimeToSpawn seconds of fishing { if (pInstance) pInstance->SetData(DATA_THELURKERBELOWEVENT, IN_PROGRESS); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->RemoveFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED); DoCast(m_creature, SPELL_EMERGE); m_creature->setFaction(14); InCombat = true; if (FirstVictim) { if (FirstVictim->GetSession() && FirstVictim->isAlive()) m_creature->AddThreat(FirstVictim, 1.0f); // guarantee, that first fisher is first in ThreatList } Aggro(NULL); // Put anybody else into the fight (with 0.0 aggro) } if(plr && plr->GetDistance(m_creature ) > 5625) { if (plr->HasAura(SCALDING_WATER,0)) plr->RemoveAurasDueToSpell(SCALDING_WATER); if (plr->IsInWater() && !plr->isGameMaster() && !InCombat) { Fishy = plr->SummonCreature(MOB_COILFANG_FRENZY,plr->GetPositionX(),plr->GetPositionY(),plr->GetPositionZ(),plr->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,15000); if (Fishy) Fishy->AI()->AttackStart(plr); } }else{ if (plr->IsInWater()) { if (!plr->HasAura(SCALDING_WATER,0)) plr->CastSpell(plr,SCALDING_WATER,true); }else{ if (plr->HasAura(SCALDING_WATER,0)) plr->RemoveAurasDueToSpell(SCALDING_WATER); } } } WaterTimer = 1000; }else WaterTimer -= diff; //Return since we have no target if (!m_creature->SelectHostilTarget() || !m_creature->getVictim() ) return; if(!Submerged) { if(SpoutTimer < diff) { //Turning while spouting ;) bit fuzzy but working if (OrientationUpdated == -1) { OrientationUpdated = 0; Unit* target = NULL; target = SelectUnit(SELECT_TARGET_TOPAGGRO,0); m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0); //DoTextEmote(EMOTE_SPOUT,NULL); SpoutTimer = 5000; switch(rand()%2) { case 0: Clockwise = true; break; case 1: Clockwise = false; break; } guids.clear(); //clear targets return; } else { if(Clockwise) SpoutAngle += PI/100; else SpoutAngle -= PI/100; if(SpoutAngle > 2*PI) SpoutAngle -= 2*PI; if(SpoutAngle < 0) SpoutAngle += 2*PI; //So spin around ya evil fish m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0); m_creature->SetOrientation(SpoutAngle); m_creature->StopMoving(); //Spout part if(SVTimer < diff) { DoCast(m_creature, SPELL_SPOUT); SVTimer = 850; } SVTimer -= diff; OrientationUpdated++; SpoutTimer = 100; if (OrientationUpdated == 200) { SpoutTimer = 45000; OrientationUpdated = -1; WhirlTimer = 5000; Unit *victim = m_creature->getVictim(); if(victim) { m_creature->SetUInt64Value(UNIT_FIELD_TARGET, victim->GetGUID()); } } } }else SpoutTimer -= diff; if(PhaseTimer >= diff) PhaseTimer -= diff; //need to count the phase timer while spouting too if(OrientationUpdated != -1) return; //Whirl directly after a Spout and at random times if(WhirlTimer < diff) { WhirlTimer = rand()%5000 + 15000; DoCast(m_creature,SPELL_WHIRL); }else WhirlTimer -= diff; if(PhaseTimer < diff) { DoCast(m_creature,SPELL_SUBMERGE); PhaseTimer = 60000; Submerged = true; }else PhaseTimer -= diff; if(GeyserTimer < diff) { Unit* target = NULL; target = SelectUnit(SELECT_TARGET_RANDOM,1); GeyserTimer = rand()%15000 + 10000; if(target) DoCast(target,SPELL_GEYSER); }else GeyserTimer -= diff; if(WaterboltTimer < diff) { Unit* target = NULL; int i = 0; bool meleeTarget = false; target = SelectUnit(SELECT_TARGET_TOPAGGRO,0); if (!target) target = m_creature->getVictim(); while (target) { if( m_creature->IsWithinDistInMap(target, 6)) { meleeTarget = true; break; } target = SelectUnit(SELECT_TARGET_TOPAGGRO,i); i++; } if(!meleeTarget) { DoCast(m_creature->getVictim(),SPELL_WATERBOLT); WaterboltTimer = 3000; } else DoMeleeAttackIfReady(); // WTF ? (1) }else WaterboltTimer -= diff; DoMeleeAttackIfReady(); //(1) } else { if(PhaseTimer < diff) { Submerged = false; m_creature->RemoveAllAuras(); m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); m_creature->RemoveFlag(UNIT_NPC_EMOTESTATE, EMOTE_STATE_SUBMERGED); m_creature->RemoveFlag(UNIT_FIELD_BYTES_1,9); DoCast(m_creature, SPELL_EMERGE); Spawned = false; SpoutTimer = 5000; PhaseTimer = 120000; return; } else { /*if(!m_creature->isInCombat()) m_creature->SetInCombat();*/ PhaseTimer -= diff; } if(!Spawned) { m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[0][0],AddPos[0][1],AddPos[0][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[1][0],AddPos[1][1],AddPos[1][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[2][0],AddPos[2][1],AddPos[2][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[3][0],AddPos[3][1],AddPos[3][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[4][0],AddPos[4][1],AddPos[4][2]); SummonAdd(MOBID_COILFANG_AMBUSHER,AddPos[5][0],AddPos[5][1],AddPos[5][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[6][0],AddPos[6][1],AddPos[6][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[7][0],AddPos[7][1],AddPos[7][2]); SummonAdd(MOBID_COILFANG_GUARDIAN,AddPos[8][0],AddPos[8][1],AddPos[8][2]); Spawned = true; } } }
void UpdateAI(const uint32 diff) { if(!m_creature->SelectHostileTarget()) return; GameObject* Door = pInstance->instance->GetGameObject(pInstance->GetData64(DATA_GO_MASSIVE_DOOR)); if(Door) Door->SetGoState(GO_STATE_ACTIVE); // open the door if(!m_creature->getVictim() || !m_creature->isAlive()) return; if(ExhaustCheck_timer < diff) { //periodic exhaustion debuff check DELExhaustCandDOM(); DELExhaustCandSER(); DELExhaustCandPER(); ExhaustCheck_timer = 2000; }else ExhaustCheck_timer -= diff; if(Enrage_timer < diff) { if(!Enraged) { DoCast(m_creature,SPELL_ENRAGE); Enraged = true; } }else Enrage_timer -= diff; if(PortalPhase) { if(PortalPhase_timer < diff) { m_creature->CastSpell(m_creature, SPELL_BANISH_VISUAL,0); //DoScriptText(SAY_BANISH, m_creature); BanishPhase = true; PortalPhase = false; PLRonRedBeam = false; DestroyPortals(); if(!bReset) { RandomizeCoords(); } else { memcpy(&RandomedCoords, &BasicCoords, sizeof(BasicCoords)); // copy the basic coords at start bReset = false; } PortalPhase_timer = 60000; (*m_creature).GetMotionMaster()->MoveIdle(); }else PortalPhase_timer -= diff; if(!HasEmpowered) { if(Empowerment_timer < diff) { DoCast(m_creature,SPELL_EMPOWERMENT); HasEmpowered = true; }else Empowerment_timer -= diff; } if(!PortalsSpawned) { Creature* BeamerD = m_creature->SummonCreature(CREATURE_BLUEPORTAL,RandomedCoords[0][0],RandomedCoords[0][1],RandomedCoords[0][2],0,TEMPSUMMON_CORPSE_DESPAWN,0); if(BeamerD) { BeamerGUID[0] = BeamerD->GetGUID(); BeamerD->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686); BeamerD->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); BeamerD->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } Creature* BeamerS = m_creature->SummonCreature(CREATURE_GREENPORTAL,RandomedCoords[1][0],RandomedCoords[1][1],RandomedCoords[1][2],0,TEMPSUMMON_CORPSE_DESPAWN,0); if(BeamerS) { BeamerGUID[1] = BeamerS->GetGUID(); BeamerS->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686); BeamerS->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); BeamerS->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } Creature* BeamerP = m_creature->SummonCreature(CREATURE_REDPORTAL,RandomedCoords[2][0],RandomedCoords[2][1],RandomedCoords[2][2],0,TEMPSUMMON_CORPSE_DESPAWN,0); if(BeamerP) { BeamerGUID[2] = BeamerP->GetGUID(); BeamerP->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686); BeamerP->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); BeamerP->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } Creature* BeamerDhelp = m_creature->SummonCreature(CREATURE_BLUEPORTAL,RandomedCoords[0][0],RandomedCoords[0][1],RandomedCoords[0][2],0,TEMPSUMMON_CORPSE_DESPAWN,0); if(BeamerDhelp) { BeamerhelpGUID[0] = BeamerDhelp->GetGUID(); BeamerDhelp->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686); BeamerDhelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); BeamerDhelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } Creature* BeamerShelp = m_creature->SummonCreature(CREATURE_GREENPORTAL,RandomedCoords[1][0],RandomedCoords[1][1],RandomedCoords[1][2],0,TEMPSUMMON_CORPSE_DESPAWN,0); if(BeamerShelp) { BeamerhelpGUID[1] = BeamerShelp->GetGUID(); BeamerShelp->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686); BeamerShelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); BeamerShelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } Creature* BeamerPhelp = m_creature->SummonCreature(CREATURE_REDPORTAL,RandomedCoords[2][0],RandomedCoords[2][1],RandomedCoords[2][2],0,TEMPSUMMON_CORPSE_DESPAWN,0); if(BeamerPhelp) { BeamerhelpGUID[2] = BeamerPhelp->GetGUID(); BeamerPhelp->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686); BeamerPhelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); BeamerPhelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } BeamerD = ((Creature*)Unit::GetUnit((*m_creature), BeamerGUID[0])); if(BeamerD) BeamerD->CastSpell(BeamerD,BLUE_PORTAL,true); BeamerS = ((Creature*)Unit::GetUnit((*m_creature), BeamerGUID[1])); if(BeamerS) BeamerS->CastSpell(BeamerS,GREEN_PORTAL,true); BeamerP = ((Creature*)Unit::GetUnit((*m_creature), BeamerGUID[2])); if(BeamerP) BeamerP->CastSpell(BeamerP,RED_PORTAL,true); PortalsSpawned = true; //DoScriptText(SAY_PORTAL, m_crature); } if(Beam_initialtimer < diff) { if(Beam_periodictimer < diff) { //apply beam buff /*BlueNetherBeam(); GreenNetherBeam(); RedNetherBeam();*/ NetherBeam(0); // blue NetherBeam(1); // green NetherBeam(2); // red Beam_periodictimer = 1000; DoScriptText(EMOTE_PHASE_PORTAL, m_creature); }else Beam_periodictimer -= diff; }else Beam_initialtimer -= diff; if(Netherburn_timer < diff) { DoCast(m_creature,SPELL_NETHERBURN); Netherburn_timer = 5000; }else Netherburn_timer -= diff; if(Voidzone_timer < diff && !BanishPhase) { //function for spawning the Void Zones around the position of Netherspite voidZones_random = rand()%4; float fTmp1 = (rand()%2==0) ? -1 : 1; float fTmp2 = (rand()%2==0) ? -1 : 1; ZoneCoords[0]= m_creature->GetPositionX() + 5*fTmp1 + rand()%10; ZoneCoords[1]= m_creature->GetPositionY() + 5*fTmp2 + rand()%10; /*switch(voidZones_random) { case 0 : ZoneCoords[0]= m_creature->GetPositionX() + 5 + rand()%10; ZoneCoords[1]= m_creature->GetPositionY() + 5 + rand()%10; break; case 1: ZoneCoords[0]= m_creature->GetPositionX() + 5 + rand()%10; ZoneCoords[1]= m_creature->GetPositionY() - (5 + rand()%10); break; case 2: ZoneCoords[0]= m_creature->GetPositionX() - (5 + rand()%10); ZoneCoords[1]= m_creature->GetPositionY() + 5 + rand()%10; break; case 3: ZoneCoords[0]= m_creature->GetPositionX() - (5 + rand()%10); ZoneCoords[1]= m_creature->GetPositionY() - (5 + rand()%10); break; } */ Creature* uVoidZone = m_creature->SummonCreature(CREATURE_VOID_ZONE, ZoneCoords[0], ZoneCoords[1], m_creature->GetPositionZ() , 0 , TEMPSUMMON_CORPSE_DESPAWN, 0); if(uVoidZone) VoidZone[voidZones_counter++] = uVoidZone->GetGUID(); if(voidZones_counter >= 6) voidZones_counter=0; // use this, when the spell is fixed (you've to overwork this then): /* Unit* Zonetarget = SelectUnit(SELECT_TARGET_RANDOM,0); // No longer necessary if(Zonetarget) ZonetargetGUID = Zonetarget->GetGUID(); Zonetarget = Unit::GetUnit((*m_creature), ZonetargetGUID); if(Zonetarget->IsHostileTo(m_creature)) DoCast(Zonetarget,SPELL_VOIDZONE); */ Voidzone_timer = 15000; }else Voidzone_timer -= diff; } if(BanishPhase) { if(BanishPhase_timer < diff) { m_creature->RemoveAura(SPELL_BANISH_VISUAL,0); PortalPhase = true; BanishPhase = false; PortalsSpawned = false; PLRonRedBeam = false; BanishPhase_timer = 30000; DoResetThreat(); (*m_creature).GetMotionMaster()->MoveChase(m_creature->getVictim()); DoScriptText(EMOTE_PHASE_BANISH, m_creature); }else BanishPhase_timer -= diff; if(Netherbreath_timer < diff) { if (Unit* target = SelectUnit(SELECT_TARGET_RANDOM,0)) DoCast(target, SPELL_NETHERBREATH); Netherbreath_timer = 2500; }else Netherbreath_timer -= diff; } if(!PLRonRedBeam) { DoMeleeAttackIfReady(); } else { Unit* uTmp = Unit::GetUnit(*m_creature,CandidatesGUID[2]); //if(uTmp && uTmp->IsHostileTo(m_creature)) //DoStartAttackAndMovement(uTmp); /* after rev. 698: DoStartMovement() */ if (m_creature->Attack(uTmp, true)) { m_creature->AddThreat(uTmp, 0.0f); m_creature->SetInCombatWith(uTmp); uTmp->SetInCombatWith(m_creature); if (!InCombat) { InCombat = true; Aggro(uTmp); } DoStartMovement(uTmp); } } }
void AttackStart(Unit *u) { Aggro(u); ScriptedAI::AttackStartCaster(u, 25); }