Пример #1
0
        void UpdateAI(const uint32 diff)
        {
            if (pInstance && pInstance->GetData(DATA_PRINCEKELESETH_EVENT) == IN_PROGRESS)
            {
                if (isDead)
                {
                    if (Respawn_Time <= diff)
                    {
                        Resurrect();
                        Respawn_Time = 12000;
                    } else Respawn_Time -= diff;
                }
                else
                {
                    if (!UpdateVictim())
                        return;

                    if (Decrepify_Timer <= diff)
                    {
                        DoCast(me->getVictim(), SPELL_DECREPIFY);
                        Decrepify_Timer = 30000;
                    } else Decrepify_Timer -= diff;

                    DoMeleeAttackIfReady();
                }
            }else
            {
                if (me->isAlive())
                    me->DealDamage(me, me->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            }

        }
Пример #2
0
void AMech_RPGCharacter::OutOfCombat() {
	TArray<AMech_RPGCharacter*> charactersFound = UMiscLibrary::GetCharactersInRange(1500, this->GetActorLocation());

	for (AMech_RPGCharacter* character : charactersFound) {
		if (!character->IsDead() && character->IsEnemy(this) && character->inCombat) {
			SetInCombat();
			return;
		}
	}

	inCombat = false;
	OnStopFiring.Broadcast();

	if (OnOutOfCombat.IsBound()) OnOutOfCombat.Broadcast();

	//if (!isPlayer && !isAlly) {
	stats->SetVisibility(false, true);
	//}

	if (IsDead() && GetGroup()->GetPlayer() != nullptr) {
		Resurrect();

	}
	else if (IsDead()) {
		Reset();
		GetWorld()->GetTimerManager().SetTimer(TimerHandle_Invunrelbility, this, &AMech_RPGCharacter::RemoveFromPlay, 6.0F);
	}
}
Пример #3
0
 void SpellHit(Unit* /*pWho*/, const SpellEntry* pSpell)
 {
     if (pSpell->Id == SPELL_RESURRECT && !PhaseTwo)
     {
         Resurrect(me);
         IsResurrecting = false;
         ZathDead = false;
     }
 }
Пример #4
0
 void SpellHit(Unit* /*pWho*/, const SpellEntry* pSpell)
 {
     if (pSpell->Id == SPELL_RESURRECT)
     {
         Resurrect(me);
         IsResurrecting = false;
         ThekalDead = false;
     }
 }
Пример #5
0
 void Reset() override
 {
     Initialize();
     if (IsFakingDeath)
     {
         Resurrect(me);
         IsFakingDeath = false;
     }
 }
Пример #6
0
void boss_romuloAI::UpdateAI(const uint32 diff)
{
    if (!UpdateVictim() || IsFakingDeath)
        return;

    if (JulianneDead)
    {
        if (ResurrectTimer <= diff)
        {
            Creature* Julianne = (Unit::GetCreature((*me), JulianneGUID));
            if (Julianne && CAST_AI(boss_julianneAI, Julianne->AI())->IsFakingDeath)
            {
                DoScriptText(SAY_ROMULO_RESURRECT, me);
                Resurrect(Julianne);
                CAST_AI(boss_julianneAI, Julianne->AI())->IsFakingDeath = false;
                JulianneDead = false;
                ResurrectTimer = 10000;
            }
        }
        else ResurrectTimer -= diff;
    }

    if (BackwardLungeTimer <= diff)
    {
        Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true);
        if (pTarget && !me->HasInArc(M_PI, pTarget))
        {
            DoCast(pTarget, SPELL_BACKWARD_LUNGE);
            BackwardLungeTimer = urand(15000, 30000);
        }
    }
    else BackwardLungeTimer -= diff;

    if (DaringTimer <= diff)
    {
        DoCast(me, SPELL_DARING);
        DaringTimer = urand(20000, 40000);
    }
    else DaringTimer -= diff;

    if (DeadlySwatheTimer <= diff)
    {
        if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
            DoCast(pTarget, SPELL_DEADLY_SWATHE);
        DeadlySwatheTimer = urand(15000, 25000);
    }
    else DeadlySwatheTimer -= diff;

    if (PoisonThrustTimer <= diff)
    {
        DoCastVictim( SPELL_POISON_THRUST);
        PoisonThrustTimer = urand(10000, 20000);
    }
    else PoisonThrustTimer -= diff;

    DoMeleeAttackIfReady();
}
Пример #7
0
        void UpdateAI(uint32 diff) override
        {
            if (!UpdateVictim() || IsFakingDeath)
                return;

            if (JulianneDead)
            {
                if (ResurrectTimer <= diff)
                {
                    Creature* Julianne = (ObjectAccessor::GetCreature((*me), JulianneGUID));
                    if (Julianne && ENSURE_AI(boss_julianne::boss_julianneAI, Julianne->AI())->IsFakingDeath)
                    {
                        Talk(SAY_ROMULO_RESURRECT);
                        Resurrect(Julianne);
                        ENSURE_AI(boss_julianne::boss_julianneAI, Julianne->AI())->IsFakingDeath = false;
                        JulianneDead = false;
                        ResurrectTimer = 10000;
                    }
                } else ResurrectTimer -= diff;
            }

            if (BackwardLungeTimer <= diff)
            {
                Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true);
                if (target && !me->HasInArc(float(M_PI), target))
                {
                    DoCast(target, SPELL_BACKWARD_LUNGE);
                    BackwardLungeTimer = urand(15000, 30000);
                }
            } else BackwardLungeTimer -= diff;

            if (DaringTimer <= diff)
            {
                DoCast(me, SPELL_DARING);
                DaringTimer = urand(20000, 40000);
            } else DaringTimer -= diff;

            if (DeadlySwatheTimer <= diff)
            {
                if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                    DoCast(target, SPELL_DEADLY_SWATHE);
                DeadlySwatheTimer = urand(15000, 25000);
            } else DeadlySwatheTimer -= diff;

            if (PoisonThrustTimer <= diff)
            {
                DoCastVictim(SPELL_POISON_THRUST);
                PoisonThrustTimer = urand(10000, 20000);
            } else PoisonThrustTimer -= diff;

            DoMeleeAttackIfReady();
        }
Пример #8
0
        void Reset()
        {
            RomuloGUID = 0;
            Phase = PHASE_JULIANNE;

            BlindingPassionTimer = 30000;
            DevotionTimer = 15000;
            EternalAffectionTimer = 25000;
            PowerfulAttractionTimer = 5000;
            SummonRomuloTimer = 10000;
            DrinkPoisonTimer = 0;
            ResurrectSelfTimer = 0;

            if (IsFakingDeath)
            {
                Resurrect(me);
                IsFakingDeath = false;
            }

            SummonedRomulo = false;
            RomuloDead = false;
        }
Пример #9
0
    void UpdateAI(const uint32 diff)
    {
        if (m_uiHealTimer)
        {
            if (m_uiHealTimer <= diff)
            {
                Resurrect();
                m_bHasRessed = true;
                m_uiHealTimer = 0;
            }
            else
            {
                m_uiHealTimer -= diff;
                return;
            }
        }

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

        DoMeleeAttackIfReady();
    }
Пример #10
0
void boss_julianne::boss_julianneAI::UpdateAI(const uint32 diff)
{
    if (EntryYellTimer)
    {
        if (EntryYellTimer <= diff)
        {
            DoScriptText(SAY_JULIANNE_ENTER, me);
            EntryYellTimer = 0;
        } else EntryYellTimer -= diff;
    }

    if (AggroYellTimer)
    {
        if (AggroYellTimer <= diff)
        {
            DoScriptText(SAY_JULIANNE_AGGRO, me);
            me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
            me->setFaction(16);
            AggroYellTimer = 0;
        } else AggroYellTimer -= diff;
    }

    if (DrinkPoisonTimer)
    {
        //will do this 2secs after spell hit. this is time to display visual as expected
        if (DrinkPoisonTimer <= diff)
        {
            PretendToDie(me);
            Phase = PHASE_ROMULO;
            SummonRomuloTimer = 10000;
            DrinkPoisonTimer = 0;
        } else DrinkPoisonTimer -= diff;
    }

    if (Phase == PHASE_ROMULO && !SummonedRomulo)
    {
        if (SummonRomuloTimer <= diff)
        {
            if (Creature* pRomulo = me->SummonCreature(CREATURE_ROMULO, ROMULO_X, ROMULO_Y, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, HOUR*2*IN_MILLISECONDS))
            {
                RomuloGUID = pRomulo->GetGUID();
                CAST_AI(boss_romulo::boss_romuloAI, pRomulo->AI())->JulianneGUID = me->GetGUID();
                CAST_AI(boss_romulo::boss_romuloAI, pRomulo->AI())->Phase = PHASE_ROMULO;
                DoZoneInCombat(pRomulo);

                pRomulo->setFaction(16);
            }
            SummonedRomulo = true;
        } else SummonRomuloTimer -= diff;
    }

    if (ResurrectSelfTimer)
    {
        if (ResurrectSelfTimer <= diff)
        {
            Resurrect(me);
            Phase = PHASE_BOTH;
            IsFakingDeath = false;

            if (me->getVictim())
                AttackStart(me->getVictim());

            ResurrectSelfTimer = 0;
            ResurrectTimer = 1000;
        } else ResurrectSelfTimer -= diff;
    }

    if (!UpdateVictim() || IsFakingDeath)
        return;

    if (RomuloDead)
    {
        if (ResurrectTimer <= diff)
        {
            Creature* Romulo = (Unit::GetCreature((*me), RomuloGUID));
            if (Romulo && CAST_AI(boss_romulo::boss_romuloAI, Romulo->AI())->IsFakingDeath)
            {
                DoScriptText(SAY_JULIANNE_RESURRECT, me);
                Resurrect(Romulo);
                CAST_AI(boss_romulo::boss_romuloAI, Romulo->AI())->IsFakingDeath = false;
                RomuloDead = false;
                ResurrectTimer = 10000;
            }
        } else ResurrectTimer -= diff;
    }

    if (BlindingPassionTimer <= diff)
    {
        if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
            DoCast(pTarget, SPELL_BLINDING_PASSION);
        BlindingPassionTimer = urand(30000,45000);
    } else BlindingPassionTimer -= diff;

    if (DevotionTimer <= diff)
    {
        DoCast(me, SPELL_DEVOTION);
        DevotionTimer = urand(15000,45000);
    } else DevotionTimer -= diff;

    if (PowerfulAttractionTimer <= diff)
    {
        DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_POWERFUL_ATTRACTION);
        PowerfulAttractionTimer = urand(5000,30000);
    } else PowerfulAttractionTimer -= diff;

    if (EternalAffectionTimer <= diff)
    {
        if (urand(0,1) && SummonedRomulo)
        {
            Creature* Romulo = (Unit::GetCreature((*me), RomuloGUID));
            if (Romulo && Romulo->isAlive() && !RomuloDead)
                DoCast(Romulo, SPELL_ETERNAL_AFFECTION);
        } else DoCast(me, SPELL_ETERNAL_AFFECTION);

        EternalAffectionTimer = urand(45000,60000);
    } else EternalAffectionTimer -= diff;

    DoMeleeAttackIfReady();
}
Пример #11
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        if (!PhaseTwo)
        {
            // Transform to Phase 2
            if (LorkhanDead && ZathDead && ThekalDead)
            {
                me->InterruptNonMeleeSpells(false);
                DoCast(me, SPELL_TIGER_FORM);
                Resurrect(me);
                me->SetUInt32Value(UNIT_FIELD_BYTES_1, 0);
                const CreatureTemplate *cinfo = me->GetCreatureTemplate();
                me->SetBaseWeaponDamage(BASE_ATTACK, MINDAMAGE, (cinfo->mindmg +((cinfo->mindmg / 100) * 40)));
                me->SetBaseWeaponDamage(BASE_ATTACK, MAXDAMAGE, (cinfo->maxdmg +((cinfo->maxdmg / 100) * 40)));
                me->UpdateDamagePhysical(BASE_ATTACK);
                DoResetThreat();
                PhaseTwo = true;
                DoScriptText(SAY_TRANSFORM, me);
            }

            if (ThekalDead)
                return;

            // Resurrecting
            if (LorkhanDead || ZathDead)
                if (!IsResurrecting && (CheckDeath_Timer - 2000) <= diff)
                {
                    if (ZathDead)
                        if (Unit* pZath = Unit::GetUnit(*me, ZathGUID))
                            pZath->CastSpell(pZath, SPELL_RESURRECT, false, 0, 0, pZath->GetGUID());
                    if (LorkhanDead)
                        if (Unit* pLorkhan = Unit::GetUnit(*me, LorkhanGUID))
                            pLorkhan->CastSpell(pLorkhan, SPELL_RESURRECT, false, 0, 0, pLorkhan->GetGUID());
                    IsResurrecting = true;
                }
                else
                    CheckDeath_Timer -= diff;

            // Mortal Cleave Timer
            if (MortalCleave_Timer <= diff)
            {
                DoCast(me->getVictim(), SPELL_MORTALCLEAVE);
                MortalCleave_Timer = 15000 + rand()%5000;
            }
            else
                MortalCleave_Timer -= diff;

            // Silence Timer
            if (Silence_Timer <= diff)  // Cast on a random target in range?
            {
                DoCast(me->getVictim(), SPELL_SILENCE);
                Silence_Timer = 20000 + rand()%5000;
            }
            else
                Silence_Timer -= diff;
        }
        else
        // Phase 2 spells
        {
            // Enrage below 25% health
            if (!Enraged && (me->GetHealth() < (me->GetMaxHealth() * 0.25)))
            {
                DoCast(me, SPELL_ENRAGE);
                Enraged = true;
            }

            // Charge Timer
            if (Charge_Timer <= diff)
            {
                if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM, 0))
                {
                    DoCast(pTarget, SPELL_CHARGE);
                    DoResetThreat();
                    AttackStart(pTarget);
                }
                Charge_Timer = 15000 + rand()%7000;
            }
            else
                Charge_Timer -= diff;

            // Frenzy Timer
            if (Frenzy_Timer <= diff)
            {
                DoCast(me, SPELL_FRENZY);
                Frenzy_Timer = 30000;
            }
            else
                Frenzy_Timer -= diff;

            // Force Punch Timer
            if (ForcePunch_Timer <= diff)
            {
                DoCast(me->getVictim(), SPELL_SILENCE);
                ForcePunch_Timer = 16000 + rand()%5000;
            }
            else
                ForcePunch_Timer -= diff;

            // Summon Zulian Guardians
            if (SummonTigers_Timer <= diff)
            {
                DoCast(me->getVictim(), SPELL_SUMMONTIGERS);
                SummonTigers_Timer = 10000 + rand()%4000;
            }
            else
                SummonTigers_Timer -= diff;
        }

        DoMeleeAttackIfReady();
    }
Пример #12
0
 void Reset()
 {
     m_uiHealTimer = 0;
     m_bHasRessed = false;
     Resurrect();
 }