void ElementalDamageTaken(Unit* Done_by, uint32 &Damage, SpellSchoolMask damageSchoolMask)
 {
     if (Done_by->GetTypeId() == TYPEID_PLAYER)
     {
         switch (state)
         {
         case NORMAL_STATE_1:
         case NORMAL_STATE_2:
         case NORMAL_STATE_3:
             if (damageSchoolMask == SPELL_SCHOOL_MASK_FROST) //Only frost damage
             {
                 if (++HitCounter >= 200)
                 {
                     NextState(state);
                     HitCounter = 0;
                     ChangePhase(state);
                 }
             }
             break;
         case FROZEN_STATE_1:
         case FROZEN_STATE_2:
         case FROZEN_STATE_3:
             if (damageSchoolMask == SPELL_SCHOOL_MASK_NORMAL) //Only Physical Damage
             {
                 if (++HitCounter >= 200)
                 {
                     NextState(state);
                     HitCounter = 0;
                     ChangePhase(state);
                 }
             }
             break;
         }
     }
 }
Beispiel #2
0
 void EnterCombat(Unit* /*who*/) override
 {
     _EnterCombat();
     ChangePhase();
     events.ScheduleEvent(EVENT_BERSERK, 900000, GCD_CAST);
     events.ScheduleEvent(EVENT_FLAME, 20000, GCD_CAST);
 }
Beispiel #3
0
 void EnterCombat(Unit* /*who*/) override
 {
     _EnterCombat();
     ChangePhase();
     events.ScheduleEvent(EVENT_BERSERK, Minutes(15));
     events.ScheduleEvent(EVENT_FLAME, Seconds(20));
 }
static void DoSimpleDataIn(const uint8 *data_in, uint32 len)
{
 din.Write(data_in, len);

 cd.data_transfer_done = true;

 ChangePhase(PHASE_DATA_IN);
}
Beispiel #5
0
    void EnterCombat(Unit * /*who*/)
    {
        if (pInstance)
            pInstance->SetData(DATA_SUPREMUSEVENT, IN_PROGRESS);

        ChangePhase();
        events.ScheduleEvent(EVENT_BERSERK, 900000, GCD_CAST);
        events.ScheduleEvent(EVENT_FLAME, 20000, GCD_CAST);
    }
Beispiel #6
0
    void UpdateAI(const uint32 diff)
    {
        if (!UpdateVictim())
            return;

        events.Update(diff);

        while (uint32 eventId = events.ExecuteEvent())
        {
            switch(eventId)
            {
                case EVENT_BERSERK:
                    DoCast(me, SPELL_BERSERK, true);
                    break;
                case EVENT_FLAME:
                    DoCast(me, SPELL_MOLTEN_PUNCH);
                    events.DelayEvents(1500, GCD_CAST);
                    events.ScheduleEvent(EVENT_FLAME, 20000, GCD_CAST);
                    break;
                case EVENT_HATEFUL_STRIKE:
                    if (Unit *pTarget = CalculateHatefulStrikeTarget())
                        DoCast(pTarget, SPELL_HATEFUL_STRIKE);
                    events.DelayEvents(1000, GCD_CAST);
                    events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE);
                    break;
                case EVENT_SWITCH_TARGET:
                    if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
                    {
                        DoResetThreat();
                        me->AddThreat(pTarget, 5000000.0f);
                        DoScriptText(EMOTE_NEW_TARGET, me);
                    }
                    events.ScheduleEvent(EVENT_SWITCH_TARGET, 10000, 0, PHASE_CHASE);
                    break;
                case EVENT_VOLCANO:
                {
                    Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true);
                    if (!pTarget) pTarget = me->getVictim();
                    if (pTarget)
                    {
                        //DoCast(pTarget, SPELL_VOLCANIC_SUMMON);//movement bugged
                        me->SummonCreature(CREATURE_VOLCANO,pTarget->GetPositionX(),pTarget->GetPositionY(),pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN,30000);
                        DoScriptText(EMOTE_GROUND_CRACK, me);
                        events.DelayEvents(1500, GCD_CAST);
                    }
                    events.ScheduleEvent(EVENT_VOLCANO, 10000, GCD_CAST, PHASE_CHASE);
                    return;
                }
                case EVENT_SWITCH_PHASE:
                    ChangePhase();
                    break;
            }
        }

        DoMeleeAttackIfReady();
    }
Beispiel #7
0
///////////////////////////////////////////////////////////////////////////////
/// @fn CBroker::RegisterModule
/// @description Places the module in to the list of schedulable phases. The
///   scheduler cycles through registered modules to do real-time round robin
///   scheduling.
/// @pre None
/// @post The module is registered with a phase duration specified by the
///   phase parameter.
/// @param m the identifier for the module.
/// @param phase the duration of the phase.
///////////////////////////////////////////////////////////////////////////////
void CBroker::RegisterModule(CBroker::ModuleIdent m, boost::posix_time::time_duration phase)
{
    Logger.Trace << __PRETTY_FUNCTION__ << std::endl;
    boost::mutex::scoped_lock schlock(m_schmutex);
    boost::system::error_code err;
    if(!IsModuleRegistered(m))
    {
        m_modules.push_back(PhaseTuple(m,phase));
        if(m_modules.size() == 1)
        {
            schlock.unlock();
            ChangePhase(err);
            schlock.lock();
        }
    }
}
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                   return;

                if (me->HealthBelowPct(51) && Phase == PHASE_NORMAL && PhaseCount == 0)
                {
                    ChangePhase();
                }

                if (SpawnCount == 0 && Phase == PHASE_50_PER)
                {
                    me->SetUInt32Value(UNIT_NPC_EMOTESTATE,0);
                    me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE + UNIT_FLAG_NON_ATTACKABLE);

                    SpawnCount = 8;
                    SetCombatMovement(true);
                    Phase = PHASE_NORMAL;
                    Phased = false;
                    me->SetReactState(REACT_AGGRESSIVE);
                    FlameBoltTimer = 7000;
                    RagingSmashTimer = 4000;
                    EarthSpikeTimer = 12000;
                }

                if (FlameBoltTimer <= diff && Phase == PHASE_NORMAL)
                {
                    DoCastAOE(SPELL_FLAME_BOLT);
                    FlameBoltTimer = 12000;
                } else FlameBoltTimer -= diff;

                if (RagingSmashTimer <= diff && Phase == PHASE_NORMAL)
                {
                    DoCastVictim(SPELL_RAGING_SMASH);
                    RagingSmashTimer = 8000;
                } else RagingSmashTimer -= diff;

                if (EarthSpikeTimer <= diff && Phase == PHASE_NORMAL)
                {
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                        DoCast(target, SPELL_EARTH_SPIKE);
                    EarthSpikeTimer = 15000;
                } else EarthSpikeTimer -= diff;

                DoMeleeAttackIfReady();
            }
Beispiel #9
0
 void ExecuteEvent(uint32 eventId) override
 {
     switch (eventId)
     {
         case EVENT_BERSERK:
             DoCast(me, SPELL_BERSERK, true);
             break;
         case EVENT_FLAME:
             DoCast(me, SPELL_MOLTEN_PUNCH);
             events.DelayEvents(1500, GCD_CAST);
             events.ScheduleEvent(EVENT_FLAME, 20000, GCD_CAST);
             break;
         case EVENT_HATEFUL_STRIKE:
             if (Unit* target = CalculateHatefulStrikeTarget())
                 DoCast(target, SPELL_HATEFUL_STRIKE);
             events.DelayEvents(1000, GCD_CAST);
             events.ScheduleEvent(EVENT_HATEFUL_STRIKE, 5000, GCD_CAST, PHASE_STRIKE);
             break;
         case EVENT_SWITCH_TARGET:
             if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100, true))
             {
                 DoResetThreat();
                 me->AddThreat(target, 5000000.0f);
                 Talk(EMOTE_NEW_TARGET);
             }
             events.ScheduleEvent(EVENT_SWITCH_TARGET, 10000, 0, PHASE_CHASE);
             break;
         case EVENT_VOLCANO:
             if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 999, true))
             {
                 //DoCast(target, SPELL_VOLCANIC_SUMMON);//movement bugged
                 me->SummonCreature(NPC_SUPREMUS_VOLCANO, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 30000);
                 Talk(EMOTE_GROUND_CRACK);
                 events.DelayEvents(1500, GCD_CAST);
             }
             events.ScheduleEvent(EVENT_VOLCANO, 10000, GCD_CAST, PHASE_CHASE);
             return;
         case EVENT_SWITCH_PHASE:
             ChangePhase();
             break;
         default:
             break;
     }
 }
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim())
                    return;

                if ((me->HealthBelowPct(34) && Phase == PHASE_NORMAL && PhaseCount == 1) || (me->HealthBelowPct(67) && Phase == PHASE_NORMAL && PhaseCount == 0))
                {
                    ChangePhase();
                }

                if (Phase == PHASE_SHIELD && FlameCount == 0)
                {
                    me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT);
                    FlameCount = 2;
                }

                if (!me->HasUnitState(UNIT_STATE_CASTING) && Phase == PHASE_SHIELD)
                {
                    Phase = PHASE_NORMAL;
                    RemoveSummons();
                }

                if (me->HasAura(SPELL_SHIELD_OF_LIGHT))
                    return;

                if (DivineReckoningTimer <= diff && Phase == PHASE_NORMAL)
                {
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                        DoCast(target, SPELL_DIVINE_RECKONING);
                    DivineReckoningTimer = urand(15000, 18000);
                }
                else DivineReckoningTimer -= diff;

                if (SearingFlameTimer <= diff && Phase == PHASE_NORMAL)
                {
                    if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                        target->CastSpell(target, SPELL_SEARING_FLAME_SUMM, true);
                    SearingFlameTimer = 8000;
                }
                else SearingFlameTimer -= diff;

                DoMeleeAttackIfReady();
            }
Beispiel #11
0
            void UpdateAI(const uint32 diff)
            {
                if (!UpdateVictim() && !me->HasAura(SPELL_SHIELD_OF_LIGHT))
                    return;

                if ((me->HealthBelowPct(34) && Phase == PHASE_NORMAL && PhaseCount == 1) ||
                    (me->HealthBelowPct(67) && Phase == PHASE_NORMAL && PhaseCount == 0))
                {
                    ChangePhase();
                }

                if (Phase == PHASE_SHIELD && FlameCount == 0)
                {
                    me->RemoveAurasDueToSpell(SPELL_SHIELD_OF_LIGHT);
                    FlameCount = 2;
                }

                if (!me->HasUnitState(UNIT_STAT_CASTING) && Phase == PHASE_SHIELD)
                {
                    Phase = PHASE_NORMAL;
                    RemoveSummons();
                }

                events.Update(diff);

                while (uint32 eventId = events.ExecuteEvent())
                {
                    switch (eventId)
                    {
                        case EVENT_REKOCKING:
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                                DoCast(target, SPELL_DIVINE_RECKONING);
                            events.ScheduleEvent(EVENT_REKOCKING, urand(15000, 18000));
                            break;
                        case EVENT_FLAMES:
                            if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true))
                                target->CastSpell(target, SPELL_SEARING_FLAME_SUMM, true);
                            events.ScheduleEvent(EVENT_FLAMES, 8000);
                            break;
                    }
                }
                DoMeleeAttackIfReady();
            }
Beispiel #12
0
 void ExecuteEvent(uint32 eventId) override
 {
     switch (eventId)
     {
         case EVENT_BERSERK:
             DoCastSelf(SPELL_BERSERK, true);
             break;
         case EVENT_FLAME:
             DoCast(SPELL_MOLTEN_PUNCH);
             events.Repeat(Seconds(15), Seconds(20));
             break;
         case EVENT_HATEFUL_STRIKE:
             if (Unit* target = CalculateHatefulStrikeTarget())
                 DoCast(target, SPELL_HATEFUL_STRIKE);
             events.Repeat(Seconds(5));
             break;
         case EVENT_SWITCH_TARGET:
             if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 100.0f, true))
             {
                 DoResetThreat();
                 me->AddThreat(target, 1000000.0f);
                 DoCast(target, SPELL_CHARGE);
                 Talk(EMOTE_NEW_TARGET);
             }
             events.Repeat(Seconds(10));
             break;
         case EVENT_VOLCANO:
             DoCastAOE(SPELL_VOLCANIC_SUMMON, true);
             Talk(EMOTE_GROUND_CRACK);
             events.Repeat(Seconds(10));
             break;
         case EVENT_SWITCH_PHASE:
             ChangePhase();
             break;
         default:
             break;
     }
 }
static void SendStatusAndMessage(uint8 status, uint8 message)
{
 // This should never ever happen, but that doesn't mean it won't. ;)
 if(din.CanRead())
 {
  printf("BUG: %d bytes still in SCSI CD FIFO\n", din.CanRead());
  din.Flush();
 }

 cd.message_pending = message;

 cd.status_sent = FALSE;
 cd.message_sent = FALSE;


 if(status == STATUS_GOOD)
  cd_bus.DB = 0x00;
 else
  cd_bus.DB = 0x01;


 ChangePhase(PHASE_STATUS);
}
static void VirtualReset(void)
{
 din.Flush();

 cdda.CDDADivAcc = (int64)System_Clock * 65536 / 44100;
 CDReadTimer = 0;

 pce_lastsapsp_timestamp = monotonic_timestamp;

 SectorAddr = SectorCount = 0;
 read_sec_start = read_sec = 0;
 read_sec_end = ~0;

 cdda.PlayMode = PLAYMODE_SILENT;
 cdda.CDDAReadPos = 0;
 cdda.CDDAStatus = CDDASTATUS_STOPPED;
 cdda.CDDADiv = 0;

 cdda.ScanMode = 0;
 cdda.scan_sec_end = 0;

 ChangePhase(PHASE_BUS_FREE);
}