DragonNest/Server/DNGameServer/DnBuffProp.cpp

123 lines
7.8 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>#include "StdAfx.h"
#include "DnBuffProp.h"
#include "DnPropStateScanActor.h"
#include "DnPropActionCondition.h"
#include "SMScanActor.h"
#include "boost/shared_ptr.hpp"
CDnBuffProp::CDnBuffProp( CMultiRoom* pRoom ) : CDnWorldActProp( pRoom ),
CDnDamageBase( DamageObjectTypeEnum::Prop )
{
}
CDnBuffProp::~CDnBuffProp(void)
{
ReleasePostCustomParam();
}
bool CDnBuffProp::Initialize( CEtWorldSector *pParentSector, const char *szPropName, EtVector3 &vPos, EtVector3 &vRotate, EtVector3 &vScale )
{
if( CDnWorldActProp::Initialize( pParentSector, szPropName, vPos, vRotate, vScale ) == false ) return false;
if( m_hMonster ) *m_hMonster->GetMatEx() = *GetMatEx();
return true;
}
bool CDnBuffProp::InitializeTable( int nTableID )
{
if( CDnWorldActProp::InitializeTable( nTableID ) == false )
return false;
bool bResult = false;
// TODO: BuffProp <EFBFBD>Ѕ<EFBFBD> <EFBFBD><EFBFBD>4<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>|<EFBFBD>h<EFBFBD>.
if( GetData() )
{
BuffStruct* pStruct = (BuffStruct*)(GetData());
int nSkillTableID = pStruct->nSkillTableID;
int nSkillLevel = pStruct->nSkillLevel;
float fCheckRange = pStruct->fCheckRange; // a<EFBFBD>0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
bResult = InitializeMonsterActorProp( pStruct->nMonsterTableID );
// <EFBFBD>ǻ<EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
_ASSERT( nSkillTableID != 0 && nSkillLevel != 0 );
if( nSkillTableID == 0 || nSkillLevel == 0 )
return false;
set<int>* pSetTargetActorIDs = NULL;
set<int> setTargetActorIDs;
if( bResult )
{
// <EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>0<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ň<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD> K<EFBFBD><EFBFBD>.
if( 3 == pStruct->nTeam )
{
// <EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>0<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ň<EFBFBD>D<EFBFBD> L<EFBFBD>̹ <EFBFBD><EFBFBD>x<EFBFBD>0<EFBFBD> K<EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
pSetTargetActorIDs = &setTargetActorIDs;
string strTargetActorIDs = pStruct->TargetActorID;
if( strTargetActorIDs.at( strTargetActorIDs.length()-1 ) != ';' )
strTargetActorIDs.push_back( ';' );
int iFoundPos = -1;
while( true )
{
int iStartPos = iFoundPos + 1;
iFoundPos = static_cast<int>(strTargetActorIDs.find_first_of( ';', iStartPos ));
if( string::npos != iFoundPos )
{
string strTargetID = strTargetActorIDs.substr( iStartPos, iFoundPos -iStartPos );
int iTargetID = atoi( strTargetID.c_str() );
setTargetActorIDs.insert( iTargetID );
}
else
break;
}
}
m_BuffPropComponent.Initialize( GetRoom(), pStruct->nTeam, nSkillTableID, nSkillLevel, pSetTargetActorIDs );
// state <EFBFBD><EFBFBD> <EFBFBD>0<EFBFBD>T<EFBFBD>.
// Idle a<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> D<EFBFBD>4<EFBFBD><EFBFBD><EFBFBD>ij X<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD><EFBFBD><EFBFBD>, Activate a<EFBFBD>X<EFBFBD>t<EFBFBD> <EFBFBD>‰<EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> x<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ō<EFBFBD> <EFBFBD>¬<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ňǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ш<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CDnPropState* pNormalState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::NORMAL );
CDnPropState* pScanState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::SCAN_ACTOR );
CDnPropCondition* pNormalToScan = CDnPropCondition::Create( GetMySmartPtr(), CDnPropCondition::ACTION_CHECK );
CDnPropCondition* pScanToNormal = CDnPropCondition::Create( GetMySmartPtr(), CDnPropCondition::ACTION_CHECK );
static_cast<CDnPropStateScanActor*>(pScanState)->SetRange( fCheckRange );
static_cast<CDnPropActionCondition*>(pNormalToScan)->SetActionName( "Activate" );
static_cast<CDnPropActionCondition*>(pScanToNormal)->SetActionName( "Idle" );
m_pFSM->AddCondition( pNormalToScan );
m_pFSM->AddCondition( pScanToNormal );
m_pFSM->AddState( pNormalState );
m_pFSM->AddState( pScanState );
pNormalState->AddTransitState( pScanState, pNormalToScan );
pScanState->AddTransitState( pNormalState, pScanToNormal );
m_pFSM->SetEntryState( pNormalState );
}
}
return bResult;
}
void CDnBuffProp::OnMessage( const boost::shared_ptr<IStateMessage>& pMessage )
{
m_BuffPropComponent.OnMessage( pMessage );
}
void CDnBuffProp::OnChangeAction( const char *szPrevAction )
{
if( (0 == strcmp( szPrevAction, "Activate" ) && 0 == strcmp( GetCurrentAction(), "Idle" )) ||
(0 == strcmp( szPrevAction, "Off" ) && 0 == strcmp(GetCurrentAction(), "Idle")) ) // off a<EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> idle \<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ս<EFBFBD>ij <EFBFBD><EFBFBD>L<EFBFBD>.
{
// ȩ<EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
m_BuffPropComponent.RemoveAffectedStateEffects();
}
}