void LogEntry3::ResumeSyncSend(void) { if (!SyncSendPaused) { return; } SyncSendPaused = FALSE; if (SyncNumber == CERROR) { return; } // We just unpaused and we're assigned a record number... tell everybody // else all about ourselves. for (r_slot R = 0; R < (r_slot) GetNumberOfBits(); R++) { SetInRoom(R, IsInRoom(R)); } }
void UpdateAI(uint32 diff) { if (spawnTimer) { spawnTimer += diff; if (spawnTimer >= 21500) { me->SetVisible(true); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetReactState(REACT_AGGRESSIVE); spawnTimer = 0; } return; } if (!IsInRoom()) return; if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case EVENT_BERSERK: Talk(EMOTE_ENRAGE); me->CastSpell(me, SPELL_BERSERK, true); events.PopEvent(); return; case EVENT_SPELL_CLEAVE: me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false); events.RepeatEvent(10000); return; case EVENT_SPELL_TAIL_SWEEP: me->CastSpell(me, RAID_MODE(SPELL_TAIL_SWEEP_10, SPELL_TAIL_SWEEP_25), false); events.RepeatEvent(10000); return; case EVENT_SPELL_LIFE_DRAIN: me->CastCustomSpell(RAID_MODE(SPELL_LIFE_DRAIN_10, SPELL_LIFE_DRAIN_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(2, 5), me, false); events.RepeatEvent(24000); return; case EVENT_SPELL_BLIZZARD: { Creature* cr; if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40.0f, true)) cr = me->SummonCreature(NPC_BLIZZARD, *target, TEMPSUMMON_TIMED_DESPAWN, 16000); else cr = me->SummonCreature(NPC_BLIZZARD, *me, TEMPSUMMON_TIMED_DESPAWN, 16000); if (cr) cr->GetMotionMaster()->MoveRandom(40); events.RepeatEvent(RAID_MODE(8000, 6500)); return; } case EVENT_FLIGHT_START: if (me->HealthBelowPct(11)) { events.PopEvent(); return; } events.RepeatEvent(45000); events.DelayEvents(35000); me->SetReactState(REACT_PASSIVE); me->AttackStop(); float x, y, z, o; me->GetHomePosition(x, y, z, o); me->GetMotionMaster()->MovePoint(POINT_CENTER, x, y, z); return; case EVENT_FLIGHT_LIFTOFF: me->GetMotionMaster()->MoveIdle(); me->SendMeleeAttackStop(me->GetVictim()); me->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF); me->SetDisableGravity(true); currentTarget = 0; events.PopEvent(); events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, 3000); iceboltCount = RAID_MODE(2, 3); return; case EVENT_FLIGHT_ICEBOLT: { events.PopEvent(); if (currentTarget) if (Unit* target = ObjectAccessor::GetUnit(*me, currentTarget)) me->SummonGameObject(GO_ICE_BLOCK, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 0); std::vector<Unit*> targets; ThreatContainer::StorageType::const_iterator i = me->getThreatManager().getThreatList().begin(); for (; i != me->getThreatManager().getThreatList().end(); ++i) if ((*i)->getTarget()->GetTypeId() == TYPEID_PLAYER) { bool inList = false; if (!blockList.empty()) for (std::list<uint64>::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr) if ((*i)->getTarget()->GetGUID() == *itr) { inList = true; break; } if (!inList) targets.push_back((*i)->getTarget()); } if (!targets.empty() && iceboltCount) { std::vector<Unit*>::iterator itr = targets.begin(); advance(itr, urand(0, targets.size()-1)); me->CastSpell(*itr, SPELL_ICEBOLT_CAST, false); blockList.push_back((*itr)->GetGUID()); currentTarget = (*itr)->GetGUID(); --iceboltCount; events.ScheduleEvent(EVENT_FLIGHT_ICEBOLT, (me->GetExactDist(*itr) / 13.0f)*IN_MILLISECONDS); } else events.ScheduleEvent(EVENT_FLIGHT_BREATH, 1000); return; } case EVENT_FLIGHT_BREATH: currentTarget = 0; Talk(EMOTE_BREATH); me->CastSpell(me, SPELL_FROST_MISSILE, false); events.ScheduleEvent(EVENT_FLIGHT_SPELL_EXPLOSION, 8500); events.PopEvent(); return; case EVENT_FLIGHT_SPELL_EXPLOSION: me->CastSpell(me, SPELL_FROST_EXPLOSION, true); events.PopEvent(); events.ScheduleEvent(EVENT_FLIGHT_START_LAND, 3000); return; case EVENT_FLIGHT_START_LAND: if (!blockList.empty()) for (std::list<uint64>::const_iterator itr = blockList.begin(); itr != blockList.end(); ++itr) if (Unit* block = ObjectAccessor::GetUnit(*me, *itr)) block->RemoveAurasDueToSpell(SPELL_ICEBOLT_TRIGGER); blockList.clear(); me->RemoveAllGameObjects(); events.ScheduleEvent(EVENT_LAND, 1000); events.PopEvent(); return; case EVENT_LAND: me->HandleEmoteCommand(EMOTE_ONESHOT_LAND); me->SetDisableGravity(false); events.PopEvent(); events.ScheduleEvent(EVENT_GROUND, 1500); return; case EVENT_GROUND: me->SetReactState(REACT_AGGRESSIVE); me->SetInCombatWithZone(); events.PopEvent(); return; case EVENT_HUNDRED_CLUB: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) { if (itr->GetSource()->GetResistance(SPELL_SCHOOL_FROST) > 100 && pInstance) { events.PopEvent(); pInstance->SetData(DATA_HUNDRED_CLUB, 0); return; } } events.RepeatEvent(5000); return; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!IsInRoom(me)) return; if (!UpdateVictim()) return; events.Update(diff); //if (me->HasUnitState(UNIT_STATE_CASTING)) // return; switch (events.GetEvent()) { case EVENT_SPELL_SPELL_DISRUPTION: me->CastSpell(me, SPELL_SPELL_DISRUPTION, false); events.RepeatEvent(10000); break; case EVENT_SPELL_DECEPIT_FEVER: me->CastSpell(me, RAID_MODE(SPELL_DECREPIT_FEVER_10, SPELL_DECREPIT_FEVER_25), false); events.RepeatEvent(20000); break; case EVENT_SWITCH_PHASE: StartFightPhase(currentPhase == PHASE_SLOW_DANCE ? PHASE_FAST_DANCE : PHASE_SLOW_DANCE); // no pop, there is reset in start fight break; case EVENT_ERUPT_SECTION: if (pInstance) { pInstance->SetData(DATA_HEIGAN_ERUPTION, currentSection); if (currentSection == 3) moveRight = false; else if (currentSection == 0) moveRight = true; moveRight ? currentSection++ : currentSection--; } if (currentPhase == PHASE_SLOW_DANCE && !urand(0,3)) Talk(SAY_TAUNT); events.RepeatEvent(currentPhase == PHASE_SLOW_DANCE ? 10000 : 4000); break; case EVENT_SAFETY_DANCE: { Map::PlayerList const& pList = me->GetMap()->GetPlayers(); for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr) { if (IsInRoom(itr->GetSource()) && !itr->GetSource()->IsAlive()) { events.PopEvent(); pInstance->SetData(DATA_DANCE_FAIL, 0); pInstance->SetData(DATA_IMMORTAL_FAIL, 0); return; } } events.RepeatEvent(5000); return; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!IsInRoom()) return; if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { case EVENT_SPELL_WEB_SPRAY: me->MonsterTextEmote("%s sprays strands of web everywhere!", 0, true); me->CastSpell(me, RAID_MODE(SPELL_WEB_SPRAY_10, SPELL_WEB_SPRAY_25), true); events.RepeatEvent(40000); break; case EVENT_SPELL_POISON_SHOCK: me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_POISON_SHOCK_10, SPELL_POISON_SHOCK_25), false); events.RepeatEvent(40000); break; case EVENT_SPELL_NECROTIC_POISON: me->CastSpell(me->GetVictim(), RAID_MODE(SPELL_NECROTIC_POISON_10, SPELL_NECROTIC_POISON_25), false); events.RepeatEvent(30000); break; case EVENT_SUMMON_SPIDERLINGS: me->MonsterTextEmote("Spiderlings appear on the web!", 0, true); for (uint8 i = 0; i < 8; ++i) me->SummonCreature(NPC_MAEXXNA_SPIDERLING, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation()); events.RepeatEvent(40000); break; case EVENT_HEALTH_CHECK: if (me->GetHealthPct() < 30) { me->CastSpell(me, RAID_MODE(SPELL_FRENZY_10, SPELL_FRENZY_25), true); events.PopEvent(); break; } events.RepeatEvent(1000); break; case EVENT_WEB_WRAP: me->MonsterTextEmote("%s spins her web into a cocoon!", 0, true); for (uint8 i = 0; i < RAID_MODE(1,2); ++i) if (Unit *target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0, true, -SPELL_WEB_WRAP)) { target->RemoveAura(RAID_MODE(SPELL_WEB_SPRAY_10, SPELL_WEB_SPRAY_25)); uint8 pos = urand(0,2); target->GetMotionMaster()->MoveJump(PosWrap[pos].GetPositionX(), PosWrap[pos].GetPositionY(), PosWrap[pos].GetPositionZ(), 20, 20); if (Creature *wrap = me->SummonCreature(NPC_WEB_WRAP, PosWrap[pos].GetPositionX(), PosWrap[pos].GetPositionY(), PosWrap[pos].GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 60000)) wrap->AI()->SetGUID(target->GetGUID()); } events.RepeatEvent(40000); break; } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) { if (!IsInRoom()) return; if (!UpdateVictim()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; switch (events.GetEvent()) { // GROUND case EVENT_SPELL_CURSE: me->CastCustomSpell(RAID_MODE(SPELL_CURSE_OF_THE_PLAGUEBRINGER_10, SPELL_CURSE_OF_THE_PLAGUEBRINGER_25), SPELLVALUE_MAX_TARGETS, RAID_MODE(3, 10), me, false); events.RepeatEvent(25000); break; case EVENT_SUMMON_PLAGUED_WARRIOR_ANNOUNCE: me->MonsterTextEmote("Noth the Plaguebringer summons forth Skeletal Warriors!", 0, true); Talk(SAY_SUMMON); events.RepeatEvent(25000); events.ScheduleEvent(EVENT_SUMMON_PLAGUED_WARRIOR_REAL, 4000); break; case EVENT_SUMMON_PLAGUED_WARRIOR_REAL: me->CastSpell(me, SPELL_SUMMON_PLAGUED_WARRIORS, true); SummonHelper(NPC_PLAGUED_WARRIOR, RAID_MODE(2,3)); events.PopEvent(); break; case EVENT_MOVE_TO_BALCONY: me->MonsterTextEmote("%s teleports to the balcony above!", 0, true); me->CastSpell(me, SPELL_TELEPORT, true); StartBalconyPhase(); //events.PopEvent(); events.Reset()!! break; case EVENT_SPELL_BLINK: DoResetThreat(); me->MonsterTextEmote("%s blinks away!", 0, true); me->CastSpell(me, RAID_MODE(SPELL_CRIPPLE_10, SPELL_CRIPPLE_25), false); me->CastSpell(me, SPELL_BLINK, true); events.RepeatEvent(30000); break; // BALCONY case EVENT_BALCONY_SUMMON_ANNOUNCE: me->MonsterTextEmote("%s raises more skeletons!", 0, true); events.RepeatEvent(25000); events.ScheduleEvent(EVENT_BALCONY_SUMMON_REAL, 4000); break; case EVENT_BALCONY_SUMMON_REAL: me->CastSpell(me, SPELL_SUMMON_PLAGUED_WARRIORS, true); // visual only if (totalPhase == 0) SummonHelper(NPC_PLAGUED_CHAMPION, RAID_MODE(2,4)); else if (totalPhase == 1) { SummonHelper(NPC_PLAGUED_CHAMPION, RAID_MODE(1,2)); SummonHelper(NPC_PLAGUED_GUARDIAN, RAID_MODE(1,2)); } else SummonHelper(NPC_PLAGUED_GUARDIAN, RAID_MODE(2,4)); events.PopEvent(); break; case EVENT_MOVE_TO_GROUND: me->MonsterTextEmote("%s teleports back into the battle!", 0, true); totalPhase++; StartGroundPhase(); me->NearTeleportTo(nothPosition.GetPositionX(), nothPosition.GetPositionY(), nothPosition.GetPositionZ(), nothPosition.GetOrientation(), true); events.PopEvent(); break; } if (me->HasReactState(REACT_AGGRESSIVE)) DoMeleeAttackIfReady(); }
//***************************************************************************** bool CSwordsman::IsTarget() const //Returns: whether player is a target to monsters { return IsInRoom() && (bIsMonsterTarget(this->wAppearance) || //other types that monsters attack this->bIsTarget); //explicitly marked as a monster target }