Тема: [fix] Mirror Image
Показать сообщение отдельно
Старый 14.03.2010, 06:59   #8
SeT
Ученый
 
Аватар для SeT
 
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
SeT На верном пути
По умолчанию

Код:
/*######
## npc_mirror_image
######*/

struct MANGOS_DLL_DECL npc_mirror_imageAI : public ScriptedAI
{
    npc_mirror_imageAI(Creature* pCreature) : ScriptedAI(pCreature) {Reset();}

	uint32 m_uiFrostboltTimer;
	uint32 m_uiFireblastTimer;
	bool inCombat;

    void Reset() 
	{
		Unit *owner = m_creature->GetOwner();
		if (!owner)
			return;

		if (owner && !m_creature->hasUnitState(UNIT_STAT_FOLLOW))
		{
			m_creature->GetMotionMaster()->Clear(false);
			m_creature->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST, PET_FOLLOW_ANGLE);
		}
		// Inherit Master's Threat List (not yet implemented)
		//owner->CastSpell((Unit*)NULL, 58838, true);
		// here mirror image casts on summoner spell (not present in client dbc) 49866
		// here should be auras (not present in client dbc): 35657, 35658, 35659, 35660 selfcasted by mirror images (stats related?)
		// Clone Me!
		m_uiFrostboltTimer = 0;
		m_uiFireblastTimer = 6100;
		inCombat = false;
	}

	void AttackStart(Unit* pWho)
	{
		if (!pWho)
			return;

		if (m_creature->Attack(pWho, true))
		{
            m_creature->clearUnitState(UNIT_STAT_FOLLOW);
            // TMGs call CreatureRelocation which via MoveInLineOfSight can call this function
            // thus with the following clear the original TMG gets invalidated and crash, doh
            // hope it doesn't start to leak memory without this :-/
            //i_pet->Clear();
            m_creature->GetMotionMaster()->MoveChase(pWho);
            m_creature->getVictim()->AddThreat(m_creature);
            inCombat = true;
        }
	}

	void EnterEvadeMode()
	{
		if (m_creature->IsInEvadeMode() || !m_creature->isAlive())
			return;

		inCombat = false;
		Unit *owner = m_creature->GetCharmerOrOwner();

		m_creature->AttackStop();
		m_creature->CombatStop(true);
		if (owner && !m_creature->hasUnitState(UNIT_STAT_FOLLOW))
		{
			m_creature->GetMotionMaster()->Clear(false);
			m_creature->GetMotionMaster()->MoveFollow(owner, PET_FOLLOW_DIST,PET_FOLLOW_ANGLE);
		}
	}

	void UpdateAI(const uint32 diff)
	{
		if (!(m_creature->HasAura(45204)))
		{
			Unit *owner = m_creature->GetCharmerOrOwner();
			if (!owner)
				return;
			m_creature->CastSpell(m_creature, 45204, true, NULL, NULL, owner->GetGUID());
		}

		if (!(m_creature->HasAura(58836)))
		{
			Unit *owner = m_creature->GetCharmerOrOwner();
			if (!owner)
				return;
			m_creature->CastSpell(m_creature, 58836, true, NULL, NULL, owner->GetGUID());
		}
		
		if (/*!m_creature->SelectHostileTarget() || */!m_creature->getVictim())
		{
			Unit *owner = m_creature->GetCharmerOrOwner();
			if (owner && owner->getVictim())
				m_creature->AI()->AttackStart(owner->getVictim());
		}

		if (inCombat && !m_creature->getVictim())
		{
			EnterEvadeMode();
			return;
		}

		if (/*!m_creature->SelectHostileTarget() || */!m_creature->getVictim())
			return;

		if (m_uiFrostboltTimer <= diff)
		{
			DoCast(m_creature->getVictim(),59638);
			m_uiFrostboltTimer = 3100;
		}else m_uiFrostboltTimer -= diff;

		if (m_uiFireblastTimer <= diff)
		{
			DoCast(m_creature->getVictim(),59637,true);
			m_uiFireblastTimer = 6000;
		}else m_uiFireblastTimer -= diff;

		DoMeleeAttackIfReady();
	}
};

CreatureAI* GetAI_npc_mirror_image(Creature* pCreature)
{
    return new npc_mirror_imageAI(pCreature);
}
Моя версия.
SeT вне форума   Ответить с цитированием
5 пользователя(ей) сказали cпасибо:
Dimitrius (14.03.2010), Hantet (14.03.2010), Limpnau (17.03.2010), lucky (14.03.2010), MaxXx2021 (15.03.2010)