void JustDied(Unit* Killer)
    {
        DoScriptText(SAY_DEATH, m_creature);

        if (Creature* lakka = GetClosestCreatureWithEntry(me, NPC_LAKKA, 25.0f))
            DoScriptText(SAY_LAKKA, lakka);

        //despawn der adds
        for (int i = 0; i < 16; ++i) {
            Unit *elec = Unit::GetUnit(*m_creature, elementarc[i]);
            if (elec && elec->isAlive())
                elec->DealDamage(elec, elec->GetHealth(), DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            elementarc[i] = 0;

            Unit *ele = Unit::GetUnit(*m_creature, elementar[i]);
            if (ele && ele->isAlive())
                ele->DealDamage(ele, ele->GetHealth(), DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            elementar[i] = 0;

            Unit *elea = Unit::GetUnit(*m_creature, elementara[i]);
            if (elea && elea->isAlive())
                elea->DealDamage(elea, elea->GetHealth(), DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            elementara[i] = 0;

            Unit *eleb = Unit::GetUnit(*m_creature, elementarb[i]);
            if (eleb && eleb->isAlive())
                eleb->DealDamage(eleb, eleb->GetHealth(), DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            elementarb[i] = 0;
        }

        if(pInstance)
            pInstance->SetData(DATA_DARKWEAVEREVENT, DONE);
    }
Example #2
0
    void BeginOutro()
    {
        debug_log("SD2: KALEC: Beginning Outro");

        if (!pInstance)
        {
            error_log(ERROR_INST_DATA);
            return;
        }

        Unit* Sathrovarr = Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_SATHROVARR));
        if (Sathrovarr)
        {
            Sathrovarr->DealDamage(Sathrovarr, Sathrovarr->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);

            Sathrovarr->Relocate(KALECGOS_ARENA_X, KALECGOS_ARENA_Y, KALECGOS_ARENA_Z);
            Sathrovarr->SendMonsterMove(KALECGOS_ARENA_X, KALECGOS_ARENA_Y, KALECGOS_ARENA_Z, 0, 0, 0);
        }

        Creature* Kalec = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_KALECGOS_HUMAN)));
        if (Kalec)
        {
            Kalec->DeleteThreatList();
            Kalec->SetVisibility(VISIBILITY_OFF);
        }

        m_creature->GetMotionMaster()->MoveIdle();
        m_creature->setFaction(35);
    }
Example #3
0
    void Reset()
    {
        FrostBolt_Timer = (rand()%60)*1000;                 //It won't be more than a minute without cast it
        FrostBoltNova_Timer = 15000;                        //Cast every 15 seconds
        ChainsOfKelthuzad_Timer = (rand()%30+30)*1000;      //Cast no sooner than once every 30 seconds
        ManaDetonation_Timer = 20000;                       //Seems to cast about every 20 seconds
        ShadowFisure_Timer = 25000;                         //25 seconds
        FrostBlast_Timer = (rand()%30+30)*1000;             //Random time between 30-60 seconds
        GuardiansOfIcecrown_Timer = 5000;                   //5 seconds for summoning each Guardian of Icecrown in phase 3

        for (int i=0; i<5; i++)
        {
            if (GuardiansOfIcecrown[i])
        {
            //delete creature
            Unit* pUnit = Unit::GetUnit((*me), GuardiansOfIcecrown[i]);
            if (pUnit && pUnit->isAlive())
                pUnit->DealDamage(pUnit, pUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            GuardiansOfIcecrown[i] = 0;
        }
        }

        Phase1_Timer = 310000;                              //Phase 1 lasts 5 minutes and 10 seconds
        Phase2 = false;
        Phase3 = false;
    }
Example #4
0
    void UpdateAI(const uint32 diff)
    {
        //Check if we have a target
        if (!UpdateVictim())
            return;

        //EvadeTimer
        if (!me->IsWithinMeleeRange(me->getVictim()))
        {
            if (EvadeTimer <= diff)
            {
                Unit* p = Unit::GetUnit(*me, Portal);
                if (p)
                    p->DealDamage(p, me->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false);

                //Dissapear and reappear at new position
                me->SetVisibility(VISIBILITY_OFF);

                Unit* pTarget = NULL;
                pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
                if (!pTarget)
                {
                    me->DealDamage(me, me->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false);
                    return;
                }

                if (!pTarget->HasAura(SPELL_DIGESTIVE_ACID, 0))
                {
                    me->GetMap()->CreatureRelocation(me, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0);
                    Unit* p = DoSpawnCreature(MOB_SMALL_PORTAL,0,0,0,0,TEMPSUMMON_CORPSE_DESPAWN, 0);
                    if (p)
                        Portal = p->GetGUID();

                    GroundRuptureTimer = 500;
                    HamstringTimer = 2000;
                    EvadeTimer = 5000;
                    AttackStart(pTarget);
                }

                me->SetVisibility(VISIBILITY_ON);

            } else EvadeTimer -= diff;
        }

        //GroundRuptureTimer
        if (GroundRuptureTimer <= diff)
        {
            DoCast(me->getVictim(),SPELL_GROUND_RUPTURE);
            GroundRuptureTimer = 30000;
        } else GroundRuptureTimer -= diff;

        //HamstringTimer
        if (HamstringTimer <= diff)
        {
            DoCast(me->getVictim(),SPELL_HAMSTRING);
            HamstringTimer = 5000;
        } else HamstringTimer -= diff;

        DoMeleeAttackIfReady();
    }
Example #5
0
/* Actual Spell Code */
bool HandleDummySpell(uint32 uSpellId, uint32 i, Spell *pSpell)
{
    script_debuglog("Dummy spell call for spell %u = Life Tap, dmg: %u", uSpellId, pSpell->damage);
    // obtain our target
    Unit *target = pSpell->GetUnitTarget();
    if(target == NULL)
    {
        script_errorlog("Dummy spell %u (Life Tap) called with null unittarget!", uSpellId);
        return false;
    }

    // take the health from the player (20, etc)
    target->DealDamage(target, pSpell->damage, 0, 0, 0);

    // add the mana to the players mana (but check if we're bigger than max mana)
    // UNIT_FIELD_POWER1 == Mana

    uint32 new_val = target->GetUInt32Value(UNIT_FIELD_POWER1);
    uint32 max_val = target->GetUInt32Value(UNIT_FIELD_MAXPOWER1);
    new_val += pSpell->damage;

    // (new_val > max_val ? max_val : new_val)
    // means: if(new_val > max_val) use max_val as mana value
    //        else use new_val as the mana val

    target->SetUInt32Value(UNIT_FIELD_POWER1, (new_val > max_val ? max_val : new_val));

    // success.
    return true;
}
Example #6
0
 void HandleEffectPeriodic(AuraEffect const* /*aurEff*/)
 {
     sLog->outString("Perioidic Aura Effect is does a tick on target!");
     Unit* target = GetTarget();
     // aura targets damage self on tick
     target->DealDamage(target, 100);
 }
Example #7
0
        void HandleScript(SpellEffIndex /*effIndex*/)
        {
            Unit* caster = GetCaster();
            Unit* target = GetHitUnit();

            if (!caster || !target)
                return;

            if (AuraPtr smash = caster->GetAura(SPELL_SMASH_AURA))
            {
                int32 stacks = smash->GetStackAmount();
                if (stacks)
                {
                    if (stacks > 1)
                        smash->SetStackAmount(stacks - 1);
                    else
                        caster->RemoveAurasDueToSpell(SPELL_SMASH_AURA);
                }
            }

            const SpellInfo* SmashSpell = sSpellMgr->GetSpellInfo(SPELL_SMASH, caster->GetMap()->GetDifficulty());
            if (SmashSpell)
            {
                std::list<Creature*> verminList;
                GetCreatureListWithEntryInGrid(verminList, caster, NPC_BOPPER,   6.0f);
                GetCreatureListWithEntryInGrid(verminList, caster, NPC_HOPPER,   6.0f);
                GetCreatureListWithEntryInGrid(verminList, caster, NPC_HOPPLING, 6.0f);

                if (!verminList.empty())
                    for (auto vermin: verminList)
                        caster->DealDamage(vermin, vermin->GetHealth(), NULL, SPELL_DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SmashSpell);
            }
        }
Example #8
0
 void DestroyVoidZone() {
     for(int i= 0; i<7;i++) {
                     if(VoidZone[i]) {
             Unit* uVoidZone = Unit::GetUnit((*m_creature), VoidZone[i]);
             if(uVoidZone)
                 uVoidZone->DealDamage(uVoidZone, uVoidZone->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
             VoidZone[i] = NULL;
         }
     }
 }
 void AxesCleanup()
 {
     for(int i=0; i<2;++i)
     {
         Unit *axe = Unit::GetUnit(*m_creature, axes[i]);
         if (axe && axe->isAlive())
             axe->DealDamage(axe, axe->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
         axes[i] = 0;
     }
 }
 void JustDied(Unit *killer)
 {
     std::vector<uint64>::iterator itr;
     for(itr=addsGuid.begin(); itr!=addsGuid.end(); itr++)
     {
         Unit* zombie = Unit::GetUnit((*m_creature), (*itr));
         if(zombie && zombie->isAlive())
             zombie->DealDamage(zombie, zombie->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
     }
     addsGuid.clear();
     if(pInstance) pInstance->SetData(TYPE_GLUTH, DONE);
 }
bool Hysteria(uint32 i, Aura* pAura, bool apply)
{
	if(! apply)
		return true;

	Unit* target = pAura->GetTarget();

	uint32 dmg = (uint32) target->GetMaxHealth() * (pAura->GetSpellProto()->EffectBasePoints[i] + 1) / 100;
	target->DealDamage(target, dmg, 0, 0, 0);

	return true;
}
Example #12
0
 void DeSpawnAdds()
 {
     for(uint8 i = 0; i < 4 ; ++i)
     {
         Unit* Temp = NULL;
         if (AddGUID[i])
         {
             Temp = Unit::GetUnit((*m_creature),AddGUID[i]);
             if (Temp && Temp->isAlive())
                 Temp->DealDamage(Temp, Temp->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
         }
     }
 }
 void destroyPortals()
 {
     if (sumportals)
     {
         for (uint8 i = 0; i < 5; ++i)
         {
             Unit *Portal = Unit::GetUnit((*me), PortalsGuid[i]);
             if (Portal && Portal->isAlive())
                 Portal->DealDamage(Portal, Portal->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
             PortalsGuid[i] = 0;
         }
         sumportals = false;
     }
 }
void ShieldScript::HandleOnEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount)
{
    Unit* caster = GetCaster();
    Unit* attacker = dmgInfo.GetAttacker();

    if (!caster || !attacker)
        return;

    absorbAmount = dmgInfo.GetDamage();

    // Deal the damage and show it on caster's log
    caster->DealDamage(attacker, (uint32)(absorbAmount*0.25f), NULL, dmgInfo.GetDamageType(), dmgInfo.GetSchoolMask());
    caster->SendSpellNonMeleeDamageLog(attacker, GetSpellInfo()->Id, (uint32) (absorbAmount*0.25f),  dmgInfo.GetSchoolMask(), 0, 0, true, 0);
}
            void JustDied(Unit* /*victim*/)
            {
                if (instance)
                    instance->SetData(DATA_HEXLORDEVENT, DONE);

                me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, 0);
                DoPlaySoundToSet(me, SOUND_YELL_DEATH);

                for (uint8 i = 0; i < 4 ; ++i)
                {
                    Unit* Temp = Unit::GetUnit((*me), AddGUID[i]);
                    if (Temp && Temp->isAlive())
                        Temp->DealDamage(Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
                }
            }
Example #16
0
    void JustDied(Unit *victim)
    {
        DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL);
        DoPlaySoundToSet(m_creature, SOUND_DEATH);

        //despawn copy
        if(Demon)
        {
            Unit *pUnit = NULL;
            pUnit = Unit::GetUnit((*m_creature), Demon);

            if(pUnit)
                pUnit->DealDamage(pUnit, pUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
        }

        if(pInstance)
            pInstance->SetData(DATA_LEOTHERASTHEBLINDEVENT, 0);
    }
    void JustDied(Unit *killer)
    {
        for(uint8 i = 0; i < 2; ++i)
        {
            if(PortalGUID[i])
            {
                Unit* Portal = Unit::GetUnit((*me), PortalGUID[i]);
                if(Portal)
                    Portal->DealDamage(Portal, Portal->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);

                PortalGUID[i] = 0;
            }
        }

        DoScriptText(SAY_DEATH, me);

        if(pInstance)
            pInstance->SetData(DATA_TERESTIAN, DONE);
    }
Example #18
0
    uint32 NextStep(uint32 Step)
    {
        Unit* Spark = Unit::GetUnit((*me), SparkGUID);

        switch(Step)
        {
        case 0: return 99999;
        case 1:
            //DespawnNagaFlag(true);
            DoScriptText(EMOTE_SPARK, Spark);
            return 1000;
        case 2:
            DoScriptText(GEEZLE_SAY_1, me, Spark);
            if (Spark)
            {
                Spark->SetInFront(me);
                me->SetInFront(Spark);
            }
            return 5000;
        case 3: DoScriptText(SPARK_SAY_2, Spark); return 7000;
        case 4: DoScriptText(SPARK_SAY_3, Spark); return 8000;
        case 5: DoScriptText(GEEZLE_SAY_4, me, Spark); return 8000;
        case 6: DoScriptText(SPARK_SAY_5, Spark); return 9000;
        case 7: DoScriptText(SPARK_SAY_6, Spark); return 8000;
        case 8: DoScriptText(GEEZLE_SAY_7, me, Spark); return 2000;
        case 9:
            me->GetMotionMaster()->MoveTargetedHome();
            if (Spark)
                Spark->GetMotionMaster()->MovePoint(0, -5030.95f, -11291.99f, 7.97f);
            return 20000;
        case 10:
            if (Spark)
                Spark->DealDamage(Spark,Spark->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            //DespawnNagaFlag(false);
            me->SetVisibility(VISIBILITY_OFF);
        default: return 99999999;
        }
    }
    void Reset()
    {
        for(uint8 i = 0; i < 2; ++i)
        {
            if(PortalGUID[i])
            {
                Unit* Portal = Unit::GetUnit((*me), PortalGUID[i]);
                if(Portal)
                    Portal->DealDamage(Portal, Portal->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);

                PortalGUID[i] = 0;
            }
        }

        CheckKilrekTimer    = 30000;
        SacrificeTimer      = 30000;
        ShadowboltTimer     =  5000;
        SummonTimer         = 10000;
        BerserkTimer        = 600000;

        SummonedPortals     = false;
        Berserk             = false;

        if (pInstance)
            pInstance->SetData(TYPE_TERESTIAN, NOT_STARTED);

        me->RemoveAurasDueToSpell(SPELL_BROKEN_PACT);

        if (Minion* Kilrek = me->GetFirstMinion())
        {
            if (!Kilrek->isAlive())
            {
                Kilrek->UnSummon();
                DoCast(me, SPELL_SUMMON_IMP, true);
            }
        }
        else DoCast(me, SPELL_SUMMON_IMP, true);
    }
Example #20
0
    void DestroyPortals() {
        //we destroy portals during banish phase or when we die
        Unit* BeamerD = NULL;
        Unit* BeamerDhelp = NULL;
        BeamerD = Unit::GetUnit((*m_creature), BeamerGUID[0]);
        BeamerDhelp = Unit::GetUnit((*m_creature), BeamerhelpGUID[0]);
        if (BeamerD && BeamerD->isAlive()) {
            BeamerD->DealDamage(BeamerD, BeamerD->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            BeamerGUID[0] = 0;
        }
        if (BeamerDhelp && BeamerDhelp->isAlive()) {
            BeamerDhelp->DealDamage(BeamerDhelp, BeamerDhelp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            BeamerhelpGUID[0] = 0;
        }
 
        Unit* BeamerS = NULL;
        Unit* BeamerShelp = NULL;
        BeamerS = Unit::GetUnit((*m_creature), BeamerGUID[1]);
        BeamerShelp = Unit::GetUnit((*m_creature), BeamerhelpGUID[1]);
        if (BeamerS && BeamerS->isAlive()) {
            BeamerS->DealDamage(BeamerS, BeamerS->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            BeamerGUID[1] = 0;
        }
        if (BeamerShelp && BeamerShelp->isAlive()) {
            BeamerShelp->DealDamage(BeamerShelp, BeamerShelp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            BeamerhelpGUID[1] = 0;
        }
 
        Unit* BeamerP = NULL;
        Unit* BeamerPhelp = NULL;
        BeamerP = Unit::GetUnit((*m_creature), BeamerGUID[2]);
        BeamerPhelp = Unit::GetUnit((*m_creature), BeamerhelpGUID[2]);
        if (BeamerP && BeamerP->isAlive()) {
            BeamerP->DealDamage(BeamerP, BeamerP->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            BeamerGUID[2] = 0;
        }
        if (BeamerPhelp && BeamerPhelp->isAlive()) {
            BeamerPhelp->DealDamage(BeamerPhelp, BeamerPhelp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
            BeamerhelpGUID[2] = 0;
        }
    }
Example #21
0
        uint32 NextStep(uint32 Step)
        {
            Unit* arca = Unit::GetUnit(*me, ArcanagosGUID);
            Map* map = me->GetMap();
            switch (Step)
            {
            case 0: return 9999999;
            case 1:
                me->MonsterYell(SAY_DIALOG_MEDIVH_1, LANG_UNIVERSAL, 0);
                return 10000;
            case 2:
                if (arca)
                    CAST_CRE(arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_2, LANG_UNIVERSAL, 0);
                return 20000;
            case 3:
                me->MonsterYell(SAY_DIALOG_MEDIVH_3, LANG_UNIVERSAL, 0);
                return 10000;
            case 4:
                if (arca)
                    CAST_CRE(arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL, 0);
                return 20000;
            case 5:
                me->MonsterYell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL, 0);
                return 20000;
            case 6:
                if (arca)
                    CAST_CRE(arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL, 0);
                return 10000;
            case 7:
                FireArcanagosTimer = 500;
                return 5000;
            case 8:
                FireMedivhTimer = 500;
                DoCast(me, SPELL_MANA_SHIELD);
                return 10000;
            case 9:
                me->MonsterTextEmote(EMOTE_DIALOG_MEDIVH_7, 0, false);
                return 10000;
            case 10:
                if (arca)
                    DoCast(arca, SPELL_CONFLAGRATION_BLAST, false);
                return 1000;
            case 11:
                if (arca)
                    CAST_CRE(arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, 0);
                return 5000;
            case 12:
                arca->GetMotionMaster()->MovePoint(0, -11010.82f, -1761.18f, 156.47f);
                arca->setActive(true);
                arca->InterruptNonMeleeSpells(true);
                arca->SetSpeed(MOVE_FLIGHT, 2.0f);
                return 10000;
            case 13:
                me->MonsterYell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, 0);
                return 10000;
            case 14:
                me->SetVisible(false);
                me->ClearInCombat();

                if (map->IsDungeon())
                {
                    InstanceMap::PlayerList const &PlayerList = map->GetPlayers();
                    for (InstanceMap::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
                    {
                        if (i->getSource()->isAlive())
                        {
                            if (i->getSource()->GetQuestStatus(9645) == QUEST_STATUS_INCOMPLETE)
                                i->getSource()->CompleteQuest(9645);
                        }
                    }
                }
                return 50000;
            case 15:
                arca->DealDamage(arca, arca->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
                return 5000;
            default : return 9999999;
            }

        }
Example #22
0
 void JustDied(Unit*)
 {
     Unit* p = Unit::GetUnit(*me, Portal);
     if (p)
         p->DealDamage(p, p->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false);
 }
Example #23
0
    bool NetherBeam(int beamerID) {
                if(beamerID < 0 || beamerID > 2)
                        return false;
 
                Map *map = m_creature->GetMap();
        if(!map->IsDungeon())
                        return false;
 
        Unit* uBeamer = Unit::GetUnit(*m_creature, BeamerGUID[beamerID]);
                if(!uBeamer)
                        return false;
 
        Unit* uBeamerHelp = Unit::GetUnit(*m_creature, BeamerhelpGUID[beamerID]);
                if(!uBeamerHelp)
                        return false;
 
        CandidatesGUID[beamerID] = m_creature->GetGUID();
        Unit* uCandidate = Unit::GetUnit(*m_creature, CandidatesGUID[beamerID]);
                if(!uCandidate)
                        return false;
 
                int spell_exhaustion    = -1;
                Unit* uLastCandidate    = NULL;
                int creature_portal             = -1;
                int spell_plr                   = -1;
                int spell_creature              = -1;
                int spell_beam                  = -1;
 
                // switch beam specific settings/variables
                uLastCandidate = Unit::GetUnit(*m_creature, LastCandidatesGUID[beamerID]);
                switch(beamerID) {
                case 0: // blue
                        spell_exhaustion        = SPELL_EXHAUSTION_DOM;
                        //uLastCandidate                = lastDOMcandidate;
                        creature_portal         = CREATURE_BLUEPORTAL;
                        spell_plr                       = SPELL_DOMINANCE_PLR;
                        spell_creature          = SPELL_DOMINANCE_NS;
                        spell_beam                      = SPELL_BEAM_DOM;
                        break;
                case 1: // green
                        spell_exhaustion        = SPELL_EXHAUSTION_SER;
                        //uLastCandidate                = lastSERcandidate;
                        creature_portal         = CREATURE_GREENPORTAL;
                        spell_plr                       = SPELL_SERENITY_PLR;
                        spell_creature          = SPELL_SERENITY_NS;
                        spell_beam                      = SPELL_BEAM_SER;
                        break;
                case 2: // red
                        spell_exhaustion        = SPELL_EXHAUSTION_PER;
                        //uLastCandidate                = lastPERcandidate;
                        creature_portal         = CREATURE_REDPORTAL;
                        spell_plr                       = SPELL_PERSEVERENCE_PLR;
                        spell_creature          = SPELL_PERSEVERENCE_NS;
                        spell_beam                      = SPELL_BEAM_PER;
                        break;
                default:
                        return false; // oO? something got wrong...
                }
 
                // step throught each player in the list and check, if he is in the beam
        Map::PlayerList const &PlayerList = map->GetPlayers();
        for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) {
            if(i->getSource() && i->getSource()->isAlive()) {
                                plr = Unit::GetUnit(*m_creature, i->getSource()->GetGUID());
                                BossDist = m_creature->GetDistance2d(uBeamer);
                                BossAngle = m_creature->GetAngle(uBeamer);
                                PlrDist = plr->GetDistance2d(uBeamer);
                                PlrAngle = plr->GetAngle(uBeamer);
 
                                if((BossAngle - degrad10) < PlrAngle    // is in range?
                                &&  PlrAngle < (BossAngle + degrad10)   // is in range?
                                &&  PlrDist < BossDist                                  // is in range?
                                && !plr->HasAura(spell_exhaustion,0)    // hasn't yet the spell?
                                &&  plr->isAlive())     {                                       // is alive?
                                        uCandidate = plr;                                       // ok, take him as candidate
                                        if(beamerID==2) // red beam
                                                PLRonRedBeam = true;
                                }
                        }
        }
 
                if(uCandidate == m_creature) {
                        if(uCandidate != uLastCandidate) {
                                if(uBeamer) {
                    uBeamer->DealDamage(uBeamerHelp, uBeamerHelp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
                    if(uBeamerHelp) {
                        BeamerhelpGUID[beamerID] = 0;
                        uBeamerHelp = NULL;
                        uBeamerHelp = uBeamer->SummonCreature(creature_portal,RandomedCoords[beamerID][0],RandomedCoords[beamerID][1],RandomedCoords[beamerID][2],0,TEMPSUMMON_CORPSE_DESPAWN,0);
                        BeamerhelpGUID[beamerID] = uBeamerHelp->GetGUID();
                        uBeamerHelp->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
                        uBeamerHelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                        uBeamerHelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    }
                }
                uLastCandidate = uCandidate;
            }
 
            uBeamerHelp = Unit::GetUnit(*m_creature, BeamerhelpGUID[beamerID]);
            if(uBeamer)
                uBeamer->CastSpell(m_creature,spell_creature,true);
            if(uBeamerHelp)
                uBeamerHelp->CastSpell(uCandidate,spell_beam,true);
                } else {
            if(uCandidate != uLastCandidate) {
                                if(uBeamer) {
                    uBeamer->DealDamage(uBeamerHelp, uBeamerHelp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
                    if(uBeamerHelp) {
                        BeamerhelpGUID[beamerID] = 0;
                        uBeamerHelp = NULL;
                        uBeamerHelp = uBeamer->SummonCreature(creature_portal,RandomedCoords[beamerID][0],RandomedCoords[beamerID][1],RandomedCoords[beamerID][2],0,TEMPSUMMON_CORPSE_DESPAWN,0);
                        BeamerhelpGUID[beamerID] = uBeamerHelp->GetGUID();
                        uBeamerHelp->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686);
                        uBeamerHelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                        uBeamerHelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                    }
                }
                uLastCandidate = uCandidate;
                ExhaustHandler(uCandidate,beamerID);
            }
 
            uBeamerHelp = Unit::GetUnit(*m_creature, BeamerhelpGUID[beamerID]);
            if(uBeamer)
                uBeamer->CastSpell(uCandidate,spell_plr,true);
            if(uBeamerHelp)
                                uBeamerHelp->CastSpell(uCandidate,spell_beam,true);
        }
 
                LastCandidatesGUID[beamerID] = uLastCandidate->GetGUID();
                CandidatesGUID[beamerID] = uCandidate->GetGUID();
 
                return true;
    }
Example #24
0
    void UpdateAI(const uint32 diff)
    {
        if (!m_creature->SelectHostileTarget() || !m_creature->getVictim())
            return;

        if (!DrainingCrystal)
        {
            uint32 maxPowerMana = m_creature->GetMaxPower(POWER_MANA);
            if (maxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / maxPowerMana) < 10))
            {
                if (DrainLifeTimer < diff)
                {
                    DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DRAIN_LIFE);
                    DrainLifeTimer = 10000;
                }else DrainLifeTimer -= diff;

                // Heroic only
                if (!m_bIsRegularMode)
                {
                    if (DrainManaTimer < diff)
                    {
                        DoCast(SelectUnit(SELECT_TARGET_RANDOM, 1), SPELL_DRAIN_MANA);
                        DrainManaTimer = 10000;
                    }else DrainManaTimer -= diff;
                }
            }

            if (FelExplosionTimer < diff)
            {
                if (!m_creature->IsNonMeleeSpellCasted(false))
                {
                    DoCast(m_creature, SPELL_FEL_EXPLOSION);
                    FelExplosionTimer = 2000;
                }
            }else FelExplosionTimer -= diff;

            // If below 10% mana, start recharging
            maxPowerMana = m_creature->GetMaxPower(POWER_MANA);
            if (maxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / maxPowerMana) < 10))
            {
                if (DrainCrystalTimer < diff)
                {
                    SelectNearestCrystal();

                    if (m_bIsRegularMode)
                        DrainCrystalTimer = urand(20000, 25000);
                    else
                        DrainCrystalTimer = urand(10000, 15000);

                }else DrainCrystalTimer -= diff;
            }

        }else
        {
            if (IsDraining)
            {
                if (EmpowerTimer < diff)
                {
                    IsDraining = false;
                    DrainingCrystal = false;

                    DoScriptText(SAY_EMPOWERED, m_creature);

                    Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID);
                    if (CrystalChosen && CrystalChosen->isAlive())
                        // Use Deal Damage to kill it, not setDeathState.
                        CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);

                    CrystalGUID = 0;

                    m_creature->GetMotionMaster()->Clear();
                    m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
                }else EmpowerTimer -= diff;
            }
        }

        DoMeleeAttackIfReady();                             // No need to check if we are draining crystal here, as the spell has a stun.
    }
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        if (!DrainingCrystal)
        {
            uint32 maxPowerMana = me->GetMaxPower(POWER_MANA);
            if (maxPowerMana && ((me->GetPower(POWER_MANA)*100 / maxPowerMana) < 10))
            {
                if (DrainLifeTimer <= diff)
                {
                    DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DRAIN_LIFE);
                    DrainLifeTimer = 10000;
                } else DrainLifeTimer -= diff;

                // Heroic only
                if (Heroic)
                {
                    if (DrainManaTimer <= diff)
                    {
                        DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DRAIN_MANA);
                        DrainManaTimer = 10000;
                    } else DrainManaTimer -= diff;
                }
            }

            if (FelExplosionTimer <= diff)
            {
                if (!me->IsNonMeleeSpellCasted(false))
                {
                    DoCast(me, SPELL_FEL_EXPLOSION);
                    FelExplosionTimer = 2000;
                }
            } else FelExplosionTimer -= diff;

            // If below 10% mana, start recharging
            maxPowerMana = me->GetMaxPower(POWER_MANA);
            if (maxPowerMana && ((me->GetPower(POWER_MANA)*100 / maxPowerMana) < 10))
            {
                if (DrainCrystalTimer <= diff)
                {
                    SelectNearestCrystal();
                    if (Heroic)   DrainCrystalTimer = 10000 + rand()%5000;
                    else         DrainCrystalTimer = 20000 + rand()%5000;
                } else DrainCrystalTimer -= diff;
            }

        } else
        {
            if (IsDraining)
            {
                if (CheckTimer <= diff)
                {
                    Unit* CrystalChosen = Unit::GetUnit(*me, CrystalGUID);
                    if (CrystalChosen)
                    {
                        if (CrystalChosen->GetUInt32Value(UNIT_CHANNEL_SPELL) == SPELL_MANA_RAGE)
                        {
                            me->StopMoving();
                        } else{
                            IsDraining = false;
                            DrainingCrystal = false;

                            DoScriptText(SAY_EMPOWERED, me);

                            Unit* CrystalChosen = Unit::GetUnit(*me, CrystalGUID);
                            if (CrystalChosen && CrystalChosen->isAlive())
                                // Use Deal Damage to kill it, not setDeathState.
                                CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);
                            CrystalGUID = 0;

                            me->GetMotionMaster()->Clear();
                            me->GetMotionMaster()->MoveChase(me->getVictim());
                        }
                    }
                    CheckTimer = 1000;
                } else CheckTimer -= diff;
            }
        }
        DoMeleeAttackIfReady();                             // No need to check if we are draining crystal here, as the spell has a stun.
    }