#include "Stdafx.h" #include "MAAiProcessor.h" #include "DnMonsterActor.h" #include "DNAggroSystem.h" // °¡Àå ³ôÀº ¾î±×·Î¸¦ °®°í Àִ Ÿ°Ù void CMAAiChangeTargetByAggroProcessorByAggro::Process( DnActorHandle hActor ) { if( m_dwBeginTime == 0 ) OnBegin(); if( timeGetTime()-m_dwBeginTime >= m_uiInterval ) { m_dwBeginTime = timeGetTime(); if( !hActor->IsMonsterActor() ) { _ASSERT(0); return; } CDnMonsterActor* pMonster = static_cast(hActor.GetPointer()); if( !pMonster->GetAggroSystem() ) { _ASSERT(0); return; } DnActorHandle hPrevTarget = pMonster->GetAggroTarget(); bool bIsProvocationTarget; DnActorHandle hTarget = pMonster->GetAggroSystem()->OnGetAggroTarget( bIsProvocationTarget, hPrevTarget ); if( hTarget && pMonster->GetAIBase() ) { pMonster->GetAIBase()->ChangeTarget( hTarget, false ); } } } // °¡Àå °¡±î¿î °Å¸®¿¡ Àִ Ÿ°Ù void CMAAiChangeTargetProcessorByNearDiatance::Process( DnActorHandle hActor ) { if( m_dwBeginTime == 0 ) OnBegin(); if( timeGetTime()-m_dwBeginTime >= m_uiInterval ) { m_dwBeginTime = timeGetTime(); if( !hActor->IsMonsterActor() ) { _ASSERT(0); return; } CDnMonsterActor* pMonster = static_cast(hActor.GetPointer()); if( !pMonster->GetAggroSystem() ) { _ASSERT(0); return; } bool bIsProvocationTarget; DnActorHandle hCurTarget = pMonster->GetAggroSystem()->OnGetAggroTarget( bIsProvocationTarget ); std::list AggroList = pMonster->GetAggroSystem()->GetAggroList(); DnActorHandle hTarget; float fMin = FLT_MAX; for( std::list::iterator itor=AggroList.begin() ; itor!=AggroList.end() ; ++itor ) { if( !(*itor).hActor ) continue; // ÇöÀ矰ÙÀº Á¦¿Ü if( (*itor).hActor == hCurTarget ) continue; float fSQ = EtVec3LengthSq( &(*hActor->GetPosition()-*(*itor).hActor->GetPosition()) ); if( fSQ < fMin ) { fMin = fSQ; hTarget = (*itor).hActor; } } if( hTarget && pMonster->GetAIBase() ) { pMonster->GetAIBase()->ChangeTarget( hTarget, false ); } } } //***************************************************************************** // MAAiProcessManager //***************************************************************************** CMAAiProcessorManager::~CMAAiProcessorManager() { for( UINT i=0 ; iOnBegin(); } void CMAAiProcessorManager::End() { for( UINT i=0 ; iOnEnd(); } void CMAAiProcessorManager::Process( DnActorHandle hActor ) { for( UINT i=0 ; iProcess( hActor ); } bool CMAAiProcessorManager::bLoad( lua_tinker::table& t ) { // ChangeTarget const char* pszChangeTarget = t.get("changetarget"); if( pszChangeTarget ) { std::string strString(pszChangeTarget); std::vector vSplit; std::vector vTableID; boost::algorithm::split( vSplit, strString, boost::algorithm::is_any_of(",") ); for( UINT i=0 ; i