mob_gothik_minionAI(Creature *c) : CombatAI(c) { liveSide = IN_LIVE_SIDE(me); }
bool isOnSameSide(const Unit *pWho) { return (liveSide == IN_LIVE_SIDE(pWho)); }
bool operator() (const Unit *pTarget) { return (m_inLiveSide != IN_LIVE_SIDE(pTarget)); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim() || !CheckInRoom()) return; events.Update(diff); if (!thirtyPercentReached && HealthBelowPct(30) && phaseTwo) { thirtyPercentReached = true; if (instance) instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); } if (me->HasUnitState(UNIT_STAT_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch(eventId) { case EVENT_SUMMON: if (waves[waveCount].entry) { if ((waves[waveCount].mode == 2) && (getDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)) DoGothikSummon(waves[waveCount].entry); else if ((waves[waveCount].mode == 0) && (getDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)) DoGothikSummon(waves[waveCount].entry); else if (waves[waveCount].mode == 1) DoGothikSummon(waves[waveCount].entry); // if group is not splitted, open gate and merge both sides at ~ 2 minutes (wave 11) if (waveCount == 11) { if (!CheckGroupSplitted()) { if (instance) instance->SetData(DATA_GOTHIK_GATE, GO_STATE_ACTIVE); summons.DoAction(0, 0); summons.DoZoneInCombat(); mergedSides = true; } } if (waves[waveCount].mode == 1) events.ScheduleEvent(EVENT_SUMMON, waves[waveCount].time); else if ((waves[waveCount].mode == 2) && (getDifficulty() == RAID_DIFFICULTY_25MAN_NORMAL)) events.ScheduleEvent(EVENT_SUMMON, waves[waveCount].time); else if ((waves[waveCount].mode == 0) && (getDifficulty() == RAID_DIFFICULTY_10MAN_NORMAL)) events.ScheduleEvent(EVENT_SUMMON, waves[waveCount].time); else events.ScheduleEvent(EVENT_SUMMON, 0); ++waveCount; } else { phaseTwo = true; DoScriptText(SAY_TELEPORT, me); DoTeleportTo(PosGroundLiveSide); me->SetReactState(REACT_AGGRESSIVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_OOC_NOT_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); summons.DoAction(0, 0); summons.DoZoneInCombat(); events.ScheduleEvent(EVENT_BOLT, 1000); events.ScheduleEvent(EVENT_HARVEST, urand(3000, 15000)); events.ScheduleEvent(EVENT_TELEPORT, 20000); } break; case EVENT_BOLT: DoCast(me->getVictim(), RAID_MODE(SPELL_SHADOW_BOLT, H_SPELL_SHADOW_BOLT)); events.ScheduleEvent(EVENT_BOLT, 1000); break; case EVENT_HARVEST: DoCast(me->getVictim(), SPELL_HARVEST_SOUL, true); events.ScheduleEvent(EVENT_HARVEST, urand(20000, 25000)); break; case EVENT_TELEPORT: if (!thirtyPercentReached) { me->AttackStop(); if (IN_LIVE_SIDE(me)) { DoTeleportTo(PosGroundDeadSide); } else { DoTeleportTo(PosGroundLiveSide); } me->getThreatManager().resetAggro(NotOnSameSide(me)); if (Unit *pTarget = SelectTarget(SELECT_TARGET_NEAREST, 0)) { me->getThreatManager().addThreat(pTarget, 100.0f); AttackStart(pTarget); } events.ScheduleEvent(EVENT_TELEPORT, 20000); } break; } } DoMeleeAttackIfReady(); }
NotOnSameSide(Unit *pSource) : m_inLiveSide(IN_LIVE_SIDE(pSource)) {}
bool isOnSameSide(Unit const* who) const { return (liveSide == IN_LIVE_SIDE(who)); }
npc_gothik_minionAI(Creature* creature) : CombatAI(creature) { liveSide = IN_LIVE_SIDE(me); gateClose = false; }
bool operator() (Unit const* target) { return (_onLiveSide != IN_LIVE_SIDE(target)); }
NotOnSameSide(Unit* source) : _onLiveSide(IN_LIVE_SIDE(source)) { }