コード例 #1
0
    void UpdateAI(const uint32 uiDiff) override
    {
        // Return since we have no target
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        // MightyBlow_Timer
        if (m_uiMightyBlowTimer < uiDiff)
        {
            DoCastSpellIfCan(m_creature->getVictim(), SPELL_MIGHTYBLOW);
            m_uiMightyBlowTimer = 18000;
        }
        else
            m_uiMightyBlowTimer -= uiDiff;

        // HamString_Timer
        if (m_uiHamStringTimer < uiDiff)
        {
            DoCastSpellIfCan(m_creature->getVictim(), SPELL_HAMSTRING);
            m_uiHamStringTimer = 15000;
        }
        else
            m_uiHamStringTimer -= uiDiff;

        // Cleave_Timer
        if (m_uiCleaveTimer < uiDiff)
        {
            DoCastSpellIfCan(m_creature->getVictim(), SPELL_CLEAVE);
            m_uiCleaveTimer = 9000;
        }
        else
            m_uiCleaveTimer -= uiDiff;

        // Adds_Timer
        if (m_creature->GetHealthPercent() < 21.0f)
        {
            if (m_uiAddsTimer < uiDiff)
            {
                // summon 3 Adds every 25s
                SummonAdd(NPC_ANVILRAGE_RESERVIST);
                SummonAdd(NPC_ANVILRAGE_RESERVIST);
                SummonAdd(NPC_ANVILRAGE_RESERVIST);

                m_uiAddsTimer = 25000;
            }
            else
                m_uiAddsTimer -= uiDiff;
        }

        // Summon Medics
        if (!m_bSummonedMedics && m_creature->GetHealthPercent() < 21.0f)
        {
            SummonAdd(NPC_ANVILRAGE_MEDIC);
            SummonAdd(NPC_ANVILRAGE_MEDIC);
            m_bSummonedMedics = true;
        }

        DoMeleeAttackIfReady();
    }
コード例 #2
0
            void UpdateAI(uint32 diff) override
            {
                if (!UpdateVictim())
                    return;

                _events.Update(diff);

                while (uint32 eventId = _events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_MIGHTYBLOW:
                            DoCastVictim(SPELL_MIGHTYBLOW);
                            _events.ScheduleEvent(EVENT_MIGHTYBLOW, 18000);
                            break;
                        case EVENT_HAMSTRING:
                            DoCastVictim(SPELL_HAMSTRING);
                            _events.ScheduleEvent(EVENT_HAMSTRING, 15000);
                            break;
                        case EVENT_CLEAVE:
                            DoCastVictim(SPELL_CLEAVE);
                            _events.ScheduleEvent(EVENT_CLEAVE, 9000);
                            break;
                        case EVENT_MEDIC:
                            for (uint8 i = 0; i < 2; ++i)
                                SummonMedic(me->GetVictim());
                            break;
                        case EVENT_ADDS:
                            for (uint8 i = 0; i < 3; ++i)
                                SummonAdd(me->GetVictim());
                            _events.ScheduleEvent(EVENT_ADDS, 25000, 0, PHASE_TWO);
                            break;
                        default:
                            break;
                    }
                }

                DoMeleeAttackIfReady();
            }
コード例 #3
0
        void UpdateAI(const uint32 diff)
        {
            if (!InProgress)
                return;

            if (phase == PHASE_FILTHY_INVADERS_1)
            {
                me->SetOrientation(0.166467f);
                phase = PHASE_FILTHY_INVADERS_2;
                me->MonsterSay(SAY_1, LANG_UNIVERSAL, NULL);
            }

            if (summonMurlocTimer <= diff)
            {
                if (phase == PHASE_FILTHY_INVADERS_2)
                    SummonAdd(NPC_DEEP_MURLOC, 6);

                if (sumMurlocs.size() >= 6*3)
                    phase = PHASE_NULL;

                summonMurlocTimer = 5000;
            } else summonMurlocTimer -= diff;

            if (MindlasherTimer <= diff)
            {
                if (phase == PHASE_FILTHY_INVADERS_3)
                {
                    SummonAdd(NPC_MINDLASHER, 1);
                }

                if (sumMindlasher.size() >= 3 && !slasherphased)
                {
                    me->MonsterYell(SAY_2, LANG_UNIVERSAL, NULL);
                    phase = PHASE_NULL;
                    slasherphased = true;
                }

                if (phase != PHASE_FILTHY_INVADERS_3 && !sumonslasher)
                {
                    SummonAdd(NPC_MINDLASHER, 1);
                    phase = PHASE_FILTHY_INVADERS_3;
                    sumonslasher = true;
                }
                MindlasherTimer = 12000;
            } else MindlasherTimer -= diff;

            if (behemontTimer <= diff)
            {
                if (summonbehemont == false)
                {
                    SummonAdd(NPC_BEHEMOTH, 1);
                    summonbehemont = true;
                }
            } else behemontTimer -= diff;

            if (phase2_timer <= diff && phase != PHASE_BEAST_RETURN)
            {
                phase = PHASE_BEAST_RETURN;
                me->MonsterYell(SAY_3, LANG_UNIVERSAL, NULL);
            } else phase2_timer -= diff;

            if (phase == PHASE_BEAST_RETURN)
            {
                if (ozumatSummoned == false)
                {
                    SummonAdd(NPC_SAPPER, 3);
                    phase = PHASE_NULL;
                    ozumatSummoned = true;
                }
            }
            if (deadSappers >= 3 && phase != PHASE_TIDAL_SURGE)
                phase = PHASE_TIDAL_SURGE;

            if (phase == PHASE_TIDAL_SURGE)
            {
                if (flagged == false)
                {
                    SummonAdd(BOSS_OZUMAT, 1);
                    Ozumat->setFaction(14);
                    if (instance)
                        instance->DoCastSpellOnPlayers(76133);
                    me->MonsterYell(SAY_CLEANSED,LANG_UNIVERSAL, NULL);
                    flagged = true;
                }
            }
        }
コード例 #4
0
        void UpdateAI(const uint32 diff)
        {
            if (!InProgress)
                return;

            if (_wipeCheckTimer <= diff)
            {
                _wipeCheckTimer = 5000;
                Player* player = NULL;
                Trinity::AnyPlayerInObjectRangeCheck check(me, 60.0f);
                Trinity::PlayerSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(me, player, check);
                me->VisitNearbyWorldObject(60.0f, searcher);
                if (!player)
                    Reset();
            }
            else
                _wipeCheckTimer -= diff;

            if (phase == PHASE_FILTHY_INVADERS_1)
            {
                me->SetFacingTo(0.166467f);
                phase = PHASE_FILTHY_INVADERS_2;
                Talk(2);
                me->AddAura(SPELL_AURA_PURIFIED, me);
            }

            if (_ph == 0)
            {
                if (mui_event <= diff)
                {
                    switch (event)
                    {
                        case 0:
                           SummonAdd(NPC_DEEP_MURLOC, 6);
                           mui_event = 6000;
                           break;
                        case 1:
                           SummonAdd(NPC_MINDLASHER, 1);
                           mui_event = 15000;
                           break;
                        case 2:
                            SummonAdd(NPC_BEHEMOTH, 1);
                            mui_event = 10000;
                            break;
                        case 3:
                            SummonAdd(NPC_DEEP_MURLOC, 6);
                            mui_event = 9000;
                            break;
                        case 4:
                            SummonAdd(NPC_MINDLASHER, 1);
                            mui_event = 20000;
                            break;
                        case 5:
                            SummonAdd(NPC_DEEP_MURLOC, 6);
                            mui_event = 15000;
                            break;
                        case 6:
                            Talk(3);
                            SummonAdd(NPC_MINDLASHER, 1);
                            mui_event = 1000;
                            break;
                        case 7:
                            mui_event = 1000;
                            break;
                        case 8:
                            mui_event = 5000;
                            break;
                        case 9:
                            SummonAdd(NPC_SAPPER, 3);
                            me->RemoveAura(SPELL_AURA_PURIFIED);
                            mui_event = 9000;
                            Talk(4);
                            break;
                        case 10:
                            SummonAdd(NPC_BEAST, 1);
                            mui_event = 1000;
                            _ph = 1;
                            SummonAdd(BOSS_OZUMAT, 1);
                            Talk(5);
                            break;
                        default :
                            mui_event = 1000;
                            break;
                    }
                    if (event <= 11 && event != 7)
                        event++;
                }
                else
                    mui_event -= diff;
            }
            else if (_ph == 1)
            {
                if (mui_beast <= diff)
                {
                    SummonAdd(NPC_BEAST, 1);
                    mui_beast = 20000;
                }
                else mui_beast -= diff;
            }
            else if (_ph == 2)
            {
                if (mui_beast <= diff)
                {
                    if (Creature *Ozumat = Unit::GetCreature(*me, instance->GetData64(DATA_OZUMAT)))
                        Ozumat->AI()->DoAction(ACTION_CHANGE_PHASE);
                    _ph = 3;
                    mui_beast = 6000;
                }
                else mui_beast -= diff;
            }
            else if (_ph == 3)
            {
                if (mui_beast <= diff)
                {
                    Talk(7);
                    if (instance)
                        instance->DoCastSpellOnPlayers(SPELL_MAREE_POWER);
                    me->RemoveAura(83463);
                    _ph = 4;
                    mui_beast = 6000;
                }
                else mui_beast -= diff;
            }
        }
コード例 #5
0
    void UpdateAI(const uint32 diff)
    {

        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim() )
           return;

        m_creature->GetMotionMaster()->Clear(false);

        //Phase Switcher
         if (Phase2Timer < diff)
        {
            Phase1 = false;
            Spawned = false;
            Phase2Timer = 180000;
        }Phase2Timer -= diff;

        if (Phase1Timer < diff)
        {
            SpoutNow = true;
            Phase1 = true;
            Phase1Timer = 180000;
        }Phase1Timer -= diff;

        //Phase 1
        if (Phase1)
        {
            m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);

            if (!m_creature->SelectHostileTarget() || !m_creature->getVictim() )
                return;

            m_creature->GetMotionMaster()->Clear(false);

            // anty ranged high aggro
            if(BugTimer < diff)
            {
                if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0))
                    if(!m_creature->IsWithinDistInMap(pTarget, 3))
                        DoResetThreat();
                BugTimer = 5000;
            }BugTimer -= diff;

            // when switching 2phase 1 cast spout
            if (SpoutNow)
            {
                DoCast(m_creature->getVictim(), SPELL_SPOUT);
                SpoutNow = false;
                WhirlTimer = 14000;
            }

            if (SpoutTimer < diff)
            {
                DoCast(m_creature->getVictim(), SPELL_SPOUT);
                SpoutTimer = 35000;
                WhirlTimer = 14000;
            }
            else
                SpoutTimer -= diff; 
                
            // inwater Coilfang Frenzy Summon
            if (CoilfangFrenzyTimer < diff)
            {
                Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0);
                if(pTarget && !m_creature->IsWithinDistInMap(pTarget, 3))
                    if(pTarget->IsInWater())
                        SummonAdd(MOBID_COILFANG_FRENZY, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ());

                CoilfangFrenzyTimer = 1000;
            }else CoilfangFrenzyTimer -= diff;

            if (WhirlTimer < diff)
            {
                DoCast(m_creature, SPELL_WHIRL);
                WhirlTimer = 90000;
            }WhirlTimer -= diff;

            if(GeyserTimer < diff)
            {
                if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0))
                    DoCastSpellIfCan(pTarget, SPELL_GEYSER);
                GeyserTimer = urand(10000, 15000);
            }GeyserTimer -= diff;

            //melee range checker
            if(WaterBoltTimer < diff)
            {
                Unit* target = NULL;
                int i = 0;
                bool meleeTarget = false;
                target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0);
                if (!target)
                    target = m_creature->getVictim();

                while (target)
                {
                    if( m_creature->IsWithinDistInMap(target, 3))
                    {
                        meleeTarget = true;
                        break;
                    }
                    target = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,i);
                    i++;
                }

                if(!meleeTarget)
                {
                    if (Unit* pTarget = m_creature->SelectAttackingTarget(ATTACKING_TARGET_RANDOM,0))
                        DoCastSpellIfCan(pTarget,SPELL_WATER_BOLT);
                    else
                        DoCast(m_creature->getVictim(),SPELL_WATER_BOLT);
                    WaterBoltTimer = 3000;
                } else DoMeleeAttackIfReady();
                    
            }else WaterBoltTimer -= diff;

            DoMeleeAttackIfReady();
        }

        //Phase 2
        if(!Spawned)
        {
            m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
            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;
        }
    }
コード例 #6
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;
            }
        }
	}