DragonNest/GameCommon/DnForceAggroTargetBlow.cpp

356 lines
9.5 KiB
C++
Raw Permalink Normal View History

#include "StdAfx.h"
#include "DnForceAggroTargetBlow.h"
#ifdef _GAMESERVER
#include "DNAggroSystem.h"
#include "DnMonsterActor.h"
#include "DnStateBlow.h"
#endif
// #60235 [<5B><><EFBFBD><EFBFBD>Ʈ <20><EFBFBD><E5B7A1>] <20><><EFBFBD>׷<EFBFBD> <20><><EFBFBD>󿡰<EFBFBD> StateEffect ǥ<><C7A5> <20><><EFBFBD><EFBFBD>
CDnForceAggroTargetBlow::CDnForceAggroTargetBlow( DnActorHandle hActor, const char* szValue ) : CDnBlow( hActor )
{
m_StateBlow.emBlowIndex = STATE_BLOW::BLOW_254;
SetValue( szValue );
#ifdef _GAMESERVER
m_bFindRandomAggroTarget = false;
m_bFindPlayerActorOnly = false;
m_fForceIncreaseAggroValue = 0.f;
m_nServerGraphicBlowID = -1;
m_tLastRefreshTime = 0;
m_tLastFindTargetTime = 0;
m_nTargetEffectIndex = 0;
m_hTargetActor.Identity();
std::string str = m_StateBlow.szValue;
std::vector<std::string> tokens;
std::string delimiters = ";";
TokenizeA(str, tokens, delimiters);
if( tokens.size() == 4 )
{
m_bFindRandomAggroTarget = atoi( tokens[0].c_str() ) == 0 ? true : false;
m_bFindPlayerActorOnly = atoi( tokens[1].c_str() ) == 0 ? true : false;
m_fForceIncreaseAggroValue = (float)atof( tokens[2].c_str() );
m_nTargetEffectIndex = atoi( tokens[3].c_str() );
}
#endif
}
CDnForceAggroTargetBlow::~CDnForceAggroTargetBlow(void)
{
#if defined(_GAMESERVER)
if( m_hTargetActor && m_nServerGraphicBlowID != -1 )
{
m_hTargetActor->CmdRemoveStateEffectFromID( m_nServerGraphicBlowID );
}
#endif
}
void CDnForceAggroTargetBlow::OnBegin( LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::OnBegin( LocalTime, fDelta );
#ifdef _GAMESERVER
ForceAggroTarget();
#endif
}
void CDnForceAggroTargetBlow::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::OnEnd( LocalTime , fDelta );
#ifdef _GAMESERVER
if( m_hActor && m_hActor->IsMonsterActor() )
{
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>( m_hActor.GetPointer() );
if( pMonsterActor && pMonsterActor->GetAggroSystem() )
{
pMonsterActor->GetAggroSystem()->SetIgnoreFlag( false );
}
if( m_hTargetActor ) // DetachGraphic Effect
{
if( m_nTargetEffectIndex > 0 )
{
m_hTargetActor->CmdRemoveStateEffectFromID( m_nServerGraphicBlowID );
}
}
}
#endif
}
void CDnForceAggroTargetBlow::Process(LOCAL_TIME LocalTime, float fDelta )
{
CDnBlow::Process( LocalTime, fDelta );
#ifdef _GAMESERVER
// Target die or some kind of error process
if( m_hActor && m_hActor->IsMonsterActor() )
{
if( m_hActor->IsDie() )
{
if( m_hTargetActor )
{
m_hTargetActor->CmdRemoveStateEffectFromID( m_nServerGraphicBlowID );
}
m_nServerGraphicBlowID = -1;
SetState(STATE_BLOW::STATE_END);
return;
}
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>( m_hActor.GetPointer() );
if( pMonsterActor && pMonsterActor->GetAggroSystem() && pMonsterActor->GetAIBase() )
{
std::list<CDNAggroSystem::AggroStruct>& aggroList = pMonsterActor->GetAggroSystem()->GetAggroList();
if( !aggroList.empty() )
{
if( m_hTargetActor )
{
CDNAggroSystem::AggroStruct *Info = pMonsterActor->GetAggroSystem()->GetAggroStruct( m_hTargetActor );
if( !Info )
{
if( !m_hTargetActor->IsDie() )
{
if( m_nTargetEffectIndex > 0 )
{
m_hTargetActor->CmdRemoveStateEffectFromID( m_nServerGraphicBlowID );
m_hTargetActor = CDnActor::Identity();
}
}
if( LocalTime - m_tLastRefreshTime > 1000 )
{
ForceAggroTarget();
m_tLastRefreshTime = LocalTime;
}
}
}
else
{
if( LocalTime - m_tLastRefreshTime > 1000 )
{
ForceAggroTarget();
m_tLastRefreshTime = LocalTime;
}
}
}
else
{
if( m_fForceIncreaseAggroValue == 0 )
{
pMonsterActor->GetAggroSystem()->SetIgnoreFlag( false );
m_hTargetActor = CDnActor::Identity();
}
}
if( m_fForceIncreaseAggroValue != 0 )
{
if( LocalTime - m_tLastFindTargetTime > 1000 )
{
// <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD> Ai<41><69> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ⶧<CAB1><E2B6A7><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD> Ÿ<><C5B8><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ҽ<EFBFBD> <20>ֵ<EFBFBD><D6B5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>մϴ<D5B4>.
FindAggroTargetWhenProcessSkill();
m_tLastFindTargetTime = LocalTime;
}
}
else if( !m_hTargetActor || ( m_hTargetActor && m_hTargetActor->IsDie() ) )
{
if( LocalTime - m_tLastFindTargetTime > 1000 )
{
ForceAggroTarget();
m_tLastFindTargetTime = LocalTime;
}
}
}
}
#endif
}
#ifdef _GAMESERVER
void CDnForceAggroTargetBlow::ForceAggroTarget()
{
if( m_hActor && m_hActor->IsMonsterActor() )
{
bool bSuccess = false;
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>( m_hActor.GetPointer() );
if( pMonsterActor && pMonsterActor->GetAggroSystem() && pMonsterActor->GetAIBase() )
{
if( m_fForceIncreaseAggroValue == 0 )
{
pMonsterActor->GetAggroSystem()->SetIgnoreFlag( false );
}
if( m_bFindRandomAggroTarget )
{
DnActorHandle hResultActor;
hResultActor = FindRandomAggroTarget();
if( hResultActor )
{
if( pMonsterActor->GetAggroTarget() )
{
CDNAggroSystem::AggroStruct *Info = pMonsterActor->GetAggroSystem()->GetAggroStruct( pMonsterActor->GetAggroTarget() );
if( pMonsterActor->GetAggroTarget() == hResultActor )
{
pMonsterActor->GetAggroSystem()->AddAggro( hResultActor , (int)(Info->iAggro * m_fForceIncreaseAggroValue) , true );
}
else
{
pMonsterActor->SetAggroTarget( hResultActor , (int)(Info->iAggro * (1 + m_fForceIncreaseAggroValue)) );
}
}
pMonsterActor->GetAIBase()->ChangeTarget( hResultActor , false );
m_hTargetActor = hResultActor;
bSuccess = true;
}
}
else // m_bFindRandomAggroTarget == false
{
if( pMonsterActor->GetAggroTarget() )
{
CDNAggroSystem::AggroStruct *Info = pMonsterActor->GetAggroSystem()->GetAggroStruct( pMonsterActor->GetAggroTarget() );
pMonsterActor->GetAggroSystem()->AddAggro( pMonsterActor->GetAggroTarget() , (int)(Info->iAggro * m_fForceIncreaseAggroValue) , true );
m_hTargetActor = pMonsterActor->GetAggroTarget();
bSuccess = true;
}
else
{
bool bIsProvocationTarget = false;
m_hTargetActor = pMonsterActor->GetAggroSystem()->OnGetAggroTarget( bIsProvocationTarget );
pMonsterActor->GetAIBase()->ChangeTarget( m_hTargetActor , false );
if( pMonsterActor->GetAggroTarget() )
{
CDNAggroSystem::AggroStruct *Info = pMonsterActor->GetAggroSystem()->GetAggroStruct( pMonsterActor->GetAggroTarget() );
pMonsterActor->GetAggroSystem()->AddAggro( pMonsterActor->GetAggroTarget() , (int)(Info->iAggro * m_fForceIncreaseAggroValue) , true );
}
bSuccess = true;
}
}
if( m_fForceIncreaseAggroValue == 0 )
{
pMonsterActor->GetAggroSystem()->SetIgnoreFlag( true );
}
if( bSuccess && m_hTargetActor )
{
// AttachGraphic Effect
if( m_nTargetEffectIndex > 0 )
{
std::string strEffect = FormatA( "%d" , m_nTargetEffectIndex );
m_nServerGraphicBlowID = m_hTargetActor->CmdAddStateEffect( GetParentSkillInfo() , STATE_BLOW::BLOW_100, (int)(GetDurationTime() * 1000) , strEffect.c_str() );
}
}
}
}
}
DnActorHandle CDnForceAggroTargetBlow::FindRandomAggroTarget()
{
DnActorHandle hResultActor;
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>( m_hActor.GetPointer() );
if( pMonsterActor && pMonsterActor->GetAggroSystem() && pMonsterActor->GetAIBase() )
{
std::list<CDNAggroSystem::AggroStruct>& aggroList = pMonsterActor->GetAggroSystem()->GetAggroList();
if( !aggroList.empty() )
{
if( m_bFindPlayerActorOnly )
{
std::vector<DnActorHandle> vecActorList;
for( std::list<CDNAggroSystem::AggroStruct>::iterator itor = aggroList.begin() ; itor != aggroList.end() ; ++itor )
{
if( (*itor).hActor && (*itor).hActor->IsPlayerActor() )
vecActorList.push_back( (*itor).hActor );
}
if( !vecActorList.empty() )
{
int nRandomIndex = (int)( _rand(m_hActor->GetRoom()) % vecActorList.size());
hResultActor = vecActorList[nRandomIndex];
}
}
else
{
int nRandomIndex = (int)( _rand(m_hActor->GetRoom()) % aggroList.size());
std::list<CDNAggroSystem::AggroStruct>::iterator itor = aggroList.begin();
std::advance( itor , nRandomIndex );
hResultActor = (*itor).hActor;
}
}
}
return hResultActor;
}
void CDnForceAggroTargetBlow::FindAggroTargetWhenProcessSkill()
{
CDnMonsterActor* pMonsterActor = static_cast<CDnMonsterActor*>( m_hActor.GetPointer() );
if( pMonsterActor && pMonsterActor->GetAggroSystem() && pMonsterActor->GetAIBase() )
{
if( m_hActor->IsProcessSkill() )
{
bool bIsProvocationTarget = false;
DnActorHandle hActor = pMonsterActor->GetAggroSystem()->OnGetAggroTarget( bIsProvocationTarget );
if( hActor && m_hTargetActor != hActor )
{
if( m_nTargetEffectIndex > 0 )
{
if( m_hTargetActor )
{
m_hTargetActor->CmdRemoveStateEffectFromID( m_nServerGraphicBlowID );
}
}
pMonsterActor->GetAIBase()->ChangeTarget( hActor , false );
m_hTargetActor = hActor;
std::string strEffect = FormatA( "%d" , m_nTargetEffectIndex );
m_nServerGraphicBlowID = m_hTargetActor->CmdAddStateEffect( GetParentSkillInfo() , STATE_BLOW::BLOW_100, (int)(GetDurationTime() * 1000) , strEffect.c_str() );
}
}
}
}
#endif
#if defined(PRE_ADD_PREFIX_SYSTE_RENEW)
void CDnForceAggroTargetBlow::AddStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
void CDnForceAggroTargetBlow::RemoveStateEffectValue(const char* szOrigValue, const char* szAddValue, std::string& szNewValue)
{
char szBuff[128] = {0, };
szNewValue = szOrigValue;
}
#endif // PRE_ADD_PREFIX_SYSTE_RENEW