void UpdateAI(const uint32 diff)
        {
            if (gateClose && (!isOnSameSide(me) || (me->getVictim() && !isOnSameSide(me->getVictim()))))
            {
                EnterEvadeMode();
                return;
            }

            CombatAI::UpdateAI(diff);
        }
        void EnterEvadeMode()
        {
            if (!gateClose)
            {
                CombatAI::EnterEvadeMode();
                return;
            }

            if (!_EnterEvadeMode())
                return;

            Map* pMap = me->GetMap();
            if (pMap->IsDungeon())
            {
                Map::PlayerList const &PlayerList = pMap->GetPlayers();
                if (!PlayerList.isEmpty())
                {
                    for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
                    {
                        if (i->getSource() && i->getSource()->isAlive() && isOnSameSide(i->getSource()))
                        {
                            AttackStart(i->getSource());
                            return;
                        }
                    }
                }
            }

            me->GetMotionMaster()->MoveIdle();
            Reset();
        }
Exemplo n.º 3
0
        void UpdateAI(uint32 diff) override
        {
            if (!UpdateVictim())
                return;

            if (!_gateIsOpen && !isOnSameSide(me->GetVictim()))
            { // reset threat, then try to find someone on same side as us to attack
                if (Player* newTarget = FindEligibleTarget(me, _gateIsOpen))
                {
                    me->RemoveAurasByType(SPELL_AURA_MOD_TAUNT);
                    me->getThreatManager().resetAllAggro();
                    me->AddThreat(newTarget, 1.0f);
                    AttackStart(newTarget);
                }
                else
                    EnterEvadeMode(EVADE_REASON_NO_HOSTILES);
            }

            _UpdateAI(diff);
        }
 void DamageTaken(Unit *attacker, uint32 &damage)
 {
     if (gateClose && !isOnSameSide(attacker))
         damage = 0;
 }
Exemplo n.º 5
0
 void DamageTaken(Unit* attacker, uint32 &damage) override
 { // do not allow minions to take damage before the gate is opened
     if (!_gateIsOpen && !isOnSameSide(attacker))
         damage = 0;
 }