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();
 }
Example #3
0
/**
 * This function only calls Aggro, which is to be used for scripting purposes
 */
void ScriptedAI::EnterCombat(Unit* pEnemy)
{
    if (pEnemy)
        Aggro(pEnemy);
}
Example #4
0
/**
 * This function only calls Aggro, which is to be used for scripting purposes
 */
void ScriptedAI::EnterCombat(Unit* enemy)
{
    if (enemy)
        Aggro(enemy);
}
Example #5
0
	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;
            }
        }
	}
Example #6
0
    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);
                        }
        }
    }
Example #7
0
 void AttackStart(Unit *u)
 {
     Aggro(u);
     ScriptedAI::AttackStartCaster(u, 25);
 }