コード例 #1
0
    boss_magtheridonAI(Creature *c) : ScriptedAI(c)
    {
        pInstance =me->GetInstanceData();
        me->SetFloatValue(UNIT_FIELD_BOUNDINGRADIUS, 10);
        me->SetFloatValue(UNIT_FIELD_COMBATREACH, 10);

        // target 7, random target with certain entry spell, need core fix
        SpellEntry *TempSpell;
        TempSpell = GET_SPELL(SPELL_BLAZE_TARGET);
        if (TempSpell && TempSpell->EffectImplicitTargetA[0] != 6)
        {
            TempSpell->EffectImplicitTargetA[0] = 6;
            TempSpell->EffectImplicitTargetB[0] = 0;
        }
        TempSpell = GET_SPELL(SPELL_QUAKE_TRIGGER);
        if (TempSpell && TempSpell->EffectTriggerSpell[0] != SPELL_QUAKE_KNOCKBACK)
        {
            TempSpell->EffectTriggerSpell[0] = SPELL_QUAKE_KNOCKBACK;
        }
    }
コード例 #2
0
ファイル: boss_kalecgos.cpp プロジェクト: Akenyshka/MythCore
 boss_kalecgosAI(Creature *c) : ScriptedAI(c)
 {
     pInstance = c->GetInstanceScript();
     SathGUID = 0;
     DoorGUID = 0;
     bJustReset = false;
     me->setActive(true);
     SpellEntry *TempSpell = GET_SPELL(SPELL_SPECTRAL_BLAST);
     if (TempSpell)
         TempSpell->EffectImplicitTargetB[0] = TARGET_UNIT_TARGET_ENEMY;
 }
コード例 #3
0
		boss_kazrogalAI(Creature *c) :
				hyjal_trashAI(c) {
			pInstance = c->GetInstanceScript();
			pGo = false;
			pos = 0;
			SpellEntry *TempSpell = GET_SPELL(SPELL_MARK);
			if (TempSpell && TempSpell->EffectImplicitTargetA[0] != 1) {
				TempSpell->EffectImplicitTargetA[0] = 1;
				TempSpell->EffectImplicitTargetB[0] = 0;
			}
		}
コード例 #4
0
 boss_drakkari_elementalAI(Creature* pCreature) : ScriptedAI(pCreature)
 {
     pInstance = pCreature->GetInstanceScript();
     
     SpellEntry* TempSpell;
     TempSpell = GET_SPELL(DUNGEON_MODE(SPELL_MOJO_VOLLEY_TRIGGERED,H_SPELL_MOJO_VOLLEY_TRIGGERED));
     if (TempSpell)
     {
         TempSpell->Effect[1] = NULL;
         TempSpell->MaxAffectedTargets = 1;
     }
 }
コード例 #5
0
 boss_anetheronAI(Creature* c) : hyjal_trashAI(c)
 {
     pInstance = c->GetInstanceData();
     pGo = false;
     pos = 0;
     SpellEntry *TempSpell = GET_SPELL(SPELL_SLEEP);
     if (TempSpell && TempSpell->EffectImplicitTargetA[0] != 1)
     {
         TempSpell->EffectImplicitTargetA[0] = 1;
         TempSpell->EffectImplicitTargetB[0] = 0;
     }
 }
コード例 #6
0
        boss_general_vezaxAI(Creature* c) : ScriptedAI(c)
        {
            m_pInstance = c->GetInstanceScript();
            VarporList = std::list<uint64>();
            SetImmuneToPushPullEffects(true);

            // add interrupt flag
            SpellEntry* tempSpell;
            tempSpell = GET_SPELL(SPELL_SEARING_FLAMES);
            if (tempSpell)
                tempSpell->InterruptFlags |= SPELL_INTERRUPT_FLAG_INTERRUPT;
        }
コード例 #7
0
ファイル: boss_krystallus.cpp プロジェクト: Jekls/trinity
        boss_krystallusAI(Creature *c) : ScriptedAI(c)
        {
            pInstance = c->GetInstanceScript();

            //temporary to let ground slam effect not be interrupted
            SpellEntry *TempSpell;
            TempSpell = GET_SPELL(SPELL_GROUND_SLAM_TRIGGERED);
            if (TempSpell)
            { 
                TempSpell->InterruptFlags = 0;
            }
        }
コード例 #8
0
 boss_kazrogalAI(Creature *c) : hyjal_trashAI(c)
 {
     pInstance = c->GetInstanceScript();
     pGo = false;
     pos = 0;
     SpellEntry *TempSpell = GET_SPELL(SPELL_MARK);
     SpellEffectEntry const* spellEffect = TempSpell->GetSpellEffect(EFFECT_0);
     if (spellEffect && spellEffect->EffectImplicitTargetA != 1)
     {
         //spellEffect->EffectImplicitTargetA = 1;
         //spellEffect->EffectImplicitTargetB = 0;
     }
 }
コード例 #9
0
    boss_nalorakkAI(Creature* c) : ScriptedAI(c)
    {
        MoveEvent = true;
        MovePhase = 0;
        pInstance = c->GetInstanceData();

        // hack mangle as it affects Nalorakk instead of victim
        SpellEntry *TempSpell1 = GET_SPELL(42389);
        if (TempSpell1)
        {
            TempSpell1->EffectImplicitTargetA[1] = TARGET_UNIT_TARGET_ENEMY;
            TempSpell1->EffectImplicitTargetB[1] = 0;
        }
    }
コード例 #10
0
        void Reset()
        {
            m_uiColdFlameTimer = 900;

            SpellEntry* spell = GET_SPELL(SPELL_COLD_FLAME);
            if (spell)
                spell->EffectRadiusIndex[0] = 16; //prevent stack damage
            DoCast(me, SPELL_COLD_FLAME);

            me->SetVisible(false);
            DoStartNoMovement(me->getVictim());

            m_uiStage = 1;
            m_uiRadius = 2;
            m_uiOwnerEntry = 0;
        }
コード例 #11
0
ファイル: karazhan.cpp プロジェクト: ahuraa/blizzlikecore
 npc_barnesAI(Creature* c) : npc_escortAI(c)
 {
     RaidWiped = false;
     m_uiEventId = 0;
     pInstance = c->GetInstanceData();
     SpellEntry *TempSpell = GET_SPELL(29683);
     TempSpell->Effect[2] = 27;
     TempSpell->EffectBaseDice[2] = 1;
     TempSpell->EffectDieSides[2] = 1;
     TempSpell->EffectBasePoints[2] = 49;
     TempSpell->EffectImplicitTargetA[2] = 18;
     TempSpell->EffectImplicitTargetB[2] = 16;
     TempSpell->EffectRadiusIndex[2] = 7;
     TempSpell->EffectApplyAuraName[2] = 79;
     TempSpell->EffectMiscValue[2] = 127;
 }
コード例 #12
0
    boss_netherspiteAI(Creature* c) : ScriptedAI(c)
    {
        pInstance = c->GetInstanceData();

        for (int i=0; i<3; ++i)
        {
            PortalGUID[i] = 0;
            BeamTarget[i] = 0;
            BeamerGUID[i] = 0;
        }
        // need core fix
        for (int i=0; i<3; ++i)
        {
            if (SpellEntry *spell = GET_SPELL(PlayerBuff[i]))
                spell->AttributesEx |= SPELL_ATTR_EX_NEGATIVE;
        }
    }
コード例 #13
0
ファイル: boss_kologarn.cpp プロジェクト: ALive-WoW/RC2
            boss_kologarnAI(Creature* creature) : BossAI(creature, TYPE_KOLOGARN), vehicle(creature->GetVehicleKit()),
                left(false), right(false)
            {
                ASSERT(vehicle);

                me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);

                DoCast(SPELL_KOLOGARN_REDUCE_PARRY);
                SetCombatMovement(false);
                Reset();

                // should be triggered on caster?
                SpellEntry* tempSpell;
                tempSpell = GET_SPELL(SPELL_STONE_SHOUT);
                if (tempSpell)
                    tempSpell->EffectImplicitTargetA[0] = 1;
            }
コード例 #14
0
        void AdjustCastSpeed()
        {
            // bad workaround for mojo frenzy aura
            SpellEntry *TempSpell;
            TempSpell = GET_SPELL(SPELL_TRANSFORMATION);
            uint32 value = 15;  //spell 55098 default
        
            if (HealthBelowPct(80)) value = 28;
            if (HealthBelowPct(65)) value = 21;
            if (HealthBelowPct(50)) value = 5;
            if (HealthBelowPct(40)) value = 130;
            if (HealthBelowPct(30)) value = 206;
            if (HealthBelowPct(20)) value = 110;
            if (HealthBelowPct(15)) value = 3;
            if (HealthBelowPct(10)) value = 2;

            if (TempSpell && value)
                TempSpell->CastingTimeIndex = value;
        }
コード例 #15
0
ファイル: boss_magus_telestra.cpp プロジェクト: Jekls/trinity
        boss_magus_telestraAI(Creature* c) : ScriptedAI(c)
        {
            pInstance = c->GetInstanceScript();

            //temporary, needs different target selection
            SpellEntry *TempSpell;
            TempSpell = GET_SPELL(SPELL_CRITTER);
            if (TempSpell)
            { 
                TempSpell->EffectImplicitTargetA[0] = 6;
                TempSpell->EffectImplicitTargetA[1] = 6;
                TempSpell->EffectImplicitTargetA[2] = 6;
                TempSpell->EffectImplicitTargetB[0] = 0;
                TempSpell->EffectImplicitTargetB[1] = 0;
                TempSpell->EffectImplicitTargetB[2] = 0;
                TempSpell->EffectRadiusIndex[0] = 0;
                TempSpell->EffectRadiusIndex[1] = 0;
                TempSpell->EffectRadiusIndex[2] = 0;
            }
        }
コード例 #16
0
        void UpdateAI(const uint32 diff)
        {
            //Return since we have no target
            if (!UpdateVictim())
                return;

            if (!bGoToColossus && HealthBelowPct(50))
            {
                if (Creature *pColossus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
                {
                    if (!CAST_AI(boss_drakkari_colossus::boss_drakkari_colossusAI,pColossus->AI())->HealthBelowPct(6))
                    {
                        me->InterruptNonMeleeSpells(true);
                        DoCast(pColossus, SPELL_MERGE);
                        me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
                        me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
                        bGoToColossus = true;
                    }
                }
            }

            if (bGoToColossus)
            {
                if (uiDisappearTimer <= diff)
                {
                    if (Creature *pColossus = Unit::GetCreature(*me, pInstance ? pInstance->GetData64(DATA_DRAKKARI_COLOSSUS) : 0))
                    {
                        CAST_AI(boss_drakkari_colossus::boss_drakkari_colossusAI, pColossus->AI())->CreatureState(pColossus, true);
                        CAST_AI(boss_drakkari_colossus::boss_drakkari_colossusAI, pColossus->AI())->bHealth1 = false;
                    }
                    me->DisappearAndDie();
                } else uiDisappearTimer -= diff;
            }

            if (uiSurgeTimer <= diff)
            {
                DoCast(me->getVictim(), SPELL_SURGE);
                uiSurgeTimer = urand(15000, 25000);
            } else uiSurgeTimer -= diff;

            if (uiMojoWaveTimer <= diff)
            {
                if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                {
                    DoCast(pTarget, DUNGEON_MODE(SPELL_MOJO_WAVE, H_SPELL_MOJO_WAVE));
                    uiMojoWaveTimer = urand(10000, 20000);
                }
            } else uiMojoWaveTimer -= diff;
            
            // switch mojo volley max targets 1<->2
            if (uiSwitchTimer <= diff)
            {
                uint32 maxtargets = urand(1,2);
                SpellEntry* TempSpell;
                TempSpell = GET_SPELL(DUNGEON_MODE(SPELL_MOJO_VOLLEY_TRIGGERED,H_SPELL_MOJO_VOLLEY_TRIGGERED));
                if (TempSpell)
                    TempSpell->MaxAffectedTargets = maxtargets;

                uiSwitchTimer = 2*IN_MILLISECONDS;
            } else uiSwitchTimer -= diff;

            DoMeleeAttackIfReady();
        }
コード例 #17
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
        {
            if (check_Timer <= diff)
            {
                if (!me->IsNonMeleeSpellCasted(false))
                    DoCast(me,SPELL_EVOCATION);
                check_Timer = 5000;
            } else check_Timer -= diff;
            return;
        }

        if (Firenova)
        {
            if (Firenova_Timer <= diff)
            {
                DoCast(me,HeroicMode ? H_SPELL_FIRE_NOVA : SPELL_FIRE_NOVA,true);
                Firenova = false;
                ShadowVolley_Timer = 2000;
            } else Firenova_Timer -=diff;

            return;
        }

        if (ShadowVolley_Timer <= diff)
        {
            DoCast(me,HeroicMode ? H_SPELL_SHADOW_BOLT_VOLLEY : SPELL_SHADOW_BOLT_VOLLEY);
            ShadowVolley_Timer = 5000+rand()%8000;
        } else ShadowVolley_Timer -=diff;

        if (Corruption_Timer <= diff)
        {
            DoCast(me,SPELL_CORRUPTION);
            Corruption_Timer = 30000+rand()%20000;
        } else Corruption_Timer -=diff;

        if (BurningNova_Timer <= diff)
        {
            if (me->IsNonMeleeSpellCasted(false))
                me->InterruptNonMeleeSpells(true);

            DoScriptText(SAY_NOVA, me);

            if (SpellEntry *nova = GET_SPELL(SPELL_BURNING_NOVA))
            {
                for (uint32 i = 0; i < 3; ++i)
                    if (nova->Effect[i] == SPELL_EFFECT_APPLY_AURA)
                    {
                        Aura *Aur = new BurningNovaAura(nova, i, me, me);
                        me->AddAura(Aur);
                    }
            }

            if (HeroicMode)
                DoTeleportAll(me->GetPositionX(),me->GetPositionY(),me->GetPositionZ(),me->GetOrientation());

            BurningNova_Timer = 20000+rand()%8000;
            Firenova_Timer= 5000;
            Firenova = true;
        } else BurningNova_Timer -=diff;

        DoMeleeAttackIfReady();
    }
コード例 #18
0
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                {
                    if (check_Timer <= diff)
                    {
                        if (!me->IsNonMeleeSpellCasted(false))
                            DoCast(me, SPELL_EVOCATION);
                        check_Timer = 5000;
                    }
                    else
                        check_Timer -= diff;
                    return;
                }

                if (Firenova)
                {
                    if (Firenova_Timer <= diff)
                    {
                        DoCast(me, SPELL_FIRE_NOVA, true);
                        Firenova = false;
                        ShadowVolley_Timer = 2000;
                    }
                    else
                        Firenova_Timer -=diff;

                    return;
                }

                if (ShadowVolley_Timer <= diff)
                {
                    DoCast(me, SPELL_SHADOW_BOLT_VOLLEY);
                    ShadowVolley_Timer = 5000+rand()%8000;
                }
                else
                    ShadowVolley_Timer -=diff;

                if (Corruption_Timer <= diff)
                {
                    DoCast(me, SPELL_CORRUPTION);
                    Corruption_Timer = 30000+rand()%20000;
                }
                else
                    Corruption_Timer -=diff;

                if (BurningNova_Timer <= diff)
                {
                    if (me->IsNonMeleeSpellCasted(false))
                        me->InterruptNonMeleeSpells(true);

                    DoScriptText(SAY_NOVA, me);

                    if (SpellEntry *nova = GET_SPELL(SPELL_BURNING_NOVA))
                    {
                        if (Aura * aura = Aura::TryCreate(nova, me, me))
                            aura->ApplyForTargets();
                    }

                    if (IsHeroic())
                        DoTeleportAll(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation());

                    BurningNova_Timer = 20000+rand()%8000;
                    Firenova_Timer= 5000;
                    Firenova = true;
                }
                else
                    BurningNova_Timer -=diff;

                DoMeleeAttackIfReady();
            }
コード例 #19
0
 mob_coilfang_ambusherAI(Creature *c) : Scripted_NoMovementAI(c)
 {
     SpellEntry *TempSpell = GET_SPELL(SPELL_SHOOT);
     if (TempSpell)
         TempSpell->Effect[0] = 2;//change spell effect from weapon % dmg to simple phisical dmg
 }
コード例 #20
0
    void UpdateAI(const uint32 diff)
    {
        //Return since we have no target
        if (m_creature->HasAura(AURA_BANISH) || !UpdateVictim())
        {
            if (BanishTimer<= diff)
            {
                CheckBanish();//no need to check every update tick
                BanishTimer = 1000;
            } else BanishTimer -= diff;
            return;
        }
        if (m_creature->HasAura(SPELL_WHIRLWIND))
            if (Whirlwind_Timer <= diff)
            {
                Unit *newTarget = SelectUnit(SELECT_TARGET_RANDOM, 0);
                if (newTarget)
                {
                    DoResetThreat();
                    m_creature->GetMotionMaster()->Clear();
                    m_creature->GetMotionMaster()->MovePoint(0,newTarget->GetPositionX(),newTarget->GetPositionY(),newTarget->GetPositionZ());
                }
                Whirlwind_Timer = 2000;
            } else Whirlwind_Timer -= diff;

        // reseting after changing forms and after ending whirlwind
        if (NeedThreatReset && !m_creature->HasAura(SPELL_WHIRLWIND))
        {
            // when changing forms seting timers (or when ending whirlwind - to avoid adding new variable i use Whirlwind_Timer to countdown 2s while whirlwinding)
            if (DemonForm)
                InnerDemons_Timer = 30000;
            else
                Whirlwind_Timer =  15000;

            NeedThreatReset = false;
            DoResetThreat();
            m_creature->GetMotionMaster()->Clear();
            m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim());
        }

        //Enrage_Timer (10 min)
        if (Berserk_Timer < diff && !EnrageUsed)
        {
            m_creature->InterruptNonMeleeSpells(false);
            DoCast(m_creature, SPELL_BERSERK);
            EnrageUsed = true;
        } else Berserk_Timer -= diff;

        if (!DemonForm)
        {
            //Whirldind Timer
            if (!m_creature->HasAura(SPELL_WHIRLWIND))
            {
                if (Whirlwind_Timer <= diff)
                {
                    DoCast(m_creature, SPELL_WHIRLWIND);
                    // while whirlwinding this variable is used to countdown target's change
                    Whirlwind_Timer = 2000;
                    NeedThreatReset = true;
                } else Whirlwind_Timer -= diff;
            }
            //Switch_Timer

            if (!IsFinalForm)
                if (SwitchToDemon_Timer <= diff)
                {
                    //switch to demon form
                    m_creature->RemoveAurasDueToSpell(SPELL_WHIRLWIND,0);
                    m_creature->SetDisplayId(MODEL_DEMON);
                    DoScriptText(SAY_SWITCH_TO_DEMON, m_creature);
                    m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID  , 0);
                    m_creature->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0);
                    DemonForm = true;
                    NeedThreatReset = true;
                    SwitchToDemon_Timer = 45000;
                } else SwitchToDemon_Timer -= diff;
            DoMeleeAttackIfReady();
        }
        else
        {
            //ChaosBlast_Timer
            if (!m_creature->getVictim())
                return;
            if (m_creature->IsWithinDist(m_creature->getVictim(), 30))
                m_creature->StopMoving();
            if (ChaosBlast_Timer <= diff)
            {
                // will cast only when in range of spell
                if (m_creature->IsWithinDist(m_creature->getVictim(), 30))
                {
                    //DoCast(m_creature->getVictim(), SPELL_CHAOS_BLAST, true);
                    int damage = 100;
                    m_creature->CastCustomSpell(m_creature->getVictim(), SPELL_CHAOS_BLAST, &damage, NULL, NULL, false, NULL, NULL, m_creature->GetGUID());
                }
                ChaosBlast_Timer = 3000;
            } else ChaosBlast_Timer -= diff;
            //Summon Inner Demon
            if (InnerDemons_Timer <= diff)
            {
                std::list<HostilReference *>& ThreatList = m_creature->getThreatManager().getThreatList();
                std::vector<Unit *> TargetList;
                for (std::list<HostilReference *>::iterator itr = ThreatList.begin(); itr != ThreatList.end(); ++itr)
                {
                    Unit *tempTarget = Unit::GetUnit(*m_creature, (*itr)->getUnitGuid());
                    if (tempTarget && tempTarget->GetTypeId() == TYPEID_PLAYER && tempTarget->GetGUID() != m_creature->getVictim()->GetGUID() && TargetList.size()<5)
                        TargetList.push_back(tempTarget);
                }
                SpellEntry *spell = GET_SPELL(SPELL_INSIDIOUS_WHISPER);
                for (std::vector<Unit *>::iterator itr = TargetList.begin(); itr != TargetList.end(); ++itr)
                {
                    if ((*itr) && (*itr)->isAlive())
                    {
                        Creature * demon = m_creature->SummonCreature(INNER_DEMON_ID, (*itr)->GetPositionX()+10, (*itr)->GetPositionY()+10, (*itr)->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000);
                        if (demon)
                        {
                            demon->AI()->AttackStart((*itr));
                            CAST_AI(mob_inner_demonAI, demon->AI())->victimGUID = (*itr)->GetGUID();

                            (*itr)->AddAura(SPELL_INSIDIOUS_WHISPER, *itr);

                            if (InnerDemon_Count > 4)
                                InnerDemon_Count = 0;

                            //Safe storing of creatures
                            InnderDemon[InnerDemon_Count] = demon->GetGUID();

                            //Update demon count
                            ++InnerDemon_Count;
                        }
                    }
                }
                DoScriptText(SAY_INNER_DEMONS, m_creature);

                InnerDemons_Timer = 999999;
            } else InnerDemons_Timer -= diff;

            //Switch_Timer
            if (SwitchToHuman_Timer <= diff)
            {
                //switch to nightelf form
                m_creature->SetDisplayId(MODEL_NIGHTELF);
                m_creature->LoadEquipment(m_creature->GetEquipmentId());

                CastConsumingMadness();
                DespawnDemon();

                DemonForm = false;
                NeedThreatReset = true;

                SwitchToHuman_Timer = 60000;
            } else SwitchToHuman_Timer -= diff;
        }

        if (!IsFinalForm && (m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 15)
        {
            //at this point he divides himself in two parts
            CastConsumingMadness();
            DespawnDemon();
            Creature *Copy = NULL;
            Copy = DoSpawnCreature(DEMON_FORM, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 6000);
            if (Copy)
             {
                 Demon = Copy->GetGUID();
                if (m_creature->getVictim())
                    Copy->AI()->AttackStart(m_creature->getVictim());
            }
            //set nightelf final form
            IsFinalForm = true;
            DemonForm = false;

            DoScriptText(SAY_FINAL_FORM, m_creature);
            m_creature->SetDisplayId(MODEL_NIGHTELF);
            m_creature->LoadEquipment(m_creature->GetEquipmentId());
        }
    }