2024-12-21 10:04:04 +08:00
|
|
|
|
|
|
|
|
|
|
#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
|