DragonNest/Server/DNGameServer/DnActionBase.cpp

692 lines
44 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>#include "StdAfx.h"
#include "DnActionBase.h"
#include "DnRenderBase.h"
#include "DnWeapon.h"
#include "DnProjectile.h"
#include "DNGameServerManager.h"
#include "PerfCheck.h"
#include "DnActionSpecificInfo.h"
CDnActionBase::CDnActionBase()
{
m_pRender = NULL;
ResetActionBase();
m_CustomActionTime = 0;
m_fCustomPrevFrame = 0.f;
// t<EFBFBD> <EFBFBD><EFBFBD>x<EFBFBD>0<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Д<EFBFBD> l<EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD>Ȍ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>\<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD≯<EFBFBD>0<EFBFBD> <EFBFBD>L<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>.
m_pProjectileCountInfo = NULL;
m_pCheckPreSignalFunc = CDnActionBase::CheckPreSignal;
m_pCheckPostSignalFunc = CDnActionBase::CheckPostSignal;
}
void CDnActionBase::ResetActionBase()
{
m_LocalTime = 0;
m_ActionTime = 0;
m_nActionIndex = -1;
m_nPrevActionIndex = -1;
m_fPrevFrame = 0.f;
m_fFrame = 0.f;
m_fQueueBlendFrame = m_fQueueStartFrame = 0.f;
m_nCustomActionIndex = -1;
m_nLoopCount = 0;
m_fFPS = 60.f;
m_bCustomProcessSignal = false;
}
CDnActionBase::~CDnActionBase()
{
FreeAction();
}
bool CDnActionBase::Initialize( CDnRenderBase *pRender )
{
m_pRender = pRender;
return true;
}
void CDnActionBase::ProcessAction( LOCAL_TIME LocalTime, float fDelta )
{
m_LocalTime = LocalTime;
if( !m_szActionQueue.empty() )
{
if( m_fQueueBlendFrame == -1 )
{
ActionElementStruct *pStruct = GetElement( m_nActionIndex );
if( pStruct ) {
m_fQueueBlendFrame = (float)pStruct->dwBlendFrame;
}
}
SetAction( m_szActionQueue.c_str(), m_fQueueStartFrame, m_fQueueBlendFrame );
m_szActionQueue.clear();
}
if( m_nActionIndex == -1 )
return;
ActionElementStruct *pStruct = GetElement( m_nActionIndex );
if( 0.0f < m_fFPS )
m_fFrame = ( ( m_LocalTime - m_ActionTime ) / 1000.f ) * m_fFPS;
else
return;
if( !pStruct ) return;
if( m_fFrame < 0.f ) m_fFrame = (float)pStruct->dwLength + 1.f;
if( m_fFrame > (float)pStruct->dwLength )
{
ProcessSignal( pStruct, m_fFrame, m_fPrevFrame );
if( m_pRender && m_nVecAniIndexList[m_nActionIndex] != -1 ) {
EtVector3 vDist;
m_pRender->CalcAniDistance( m_nVecAniIndexList[m_nActionIndex], (float)pStruct->dwLength, m_fPrevFrame, vDist );
m_pRender->AddAniDistance( vDist );
}
if( m_nLoopCount > 0 || m_nLoopCount == -1 )
{
if( m_nLoopCount > 0 )
m_nLoopCount--;
OnLoopAction( m_fFrame, m_fPrevFrame );
float fTemp = m_fFrame - (float)pStruct->dwLength;
if( pStruct->szNextActionName == pStruct->szName ) {
fTemp += (float)pStruct->dwNextActionFrame;
if( fTemp > (float)pStruct->dwLength ) fTemp = (float)pStruct->dwLength;
}
SetAction( m_szAction.c_str(), fTemp, 0.f, true );
OnNextAction( m_szAction.c_str() , pStruct->szNextActionName.c_str() );
}
else
{
OnFinishAction(m_szAction.c_str(), LocalTime);
if( pStruct->szNextActionName.empty() )
{
m_nPrevActionIndex = m_nActionIndex;
m_nActionIndex = -1;
m_fFrame = -1.f;
m_szAction.clear();
return;
}
else
{
SetAction( pStruct->szNextActionName.c_str(), ( pStruct->dwNextActionFrame == 0 ) ? 0.f : (float)pStruct->dwNextActionFrame - 0.001f, (float)pStruct->dwBlendFrame );
if( m_fFrame > 0.f )
m_fPrevFrame -= 1.f;
OnNextAction( m_szAction.c_str() , pStruct->szNextActionName.c_str() );
}
}
if( m_nActionIndex == -1 )
return;
pStruct = GetElement( m_nActionIndex );
if( !pStruct )
return;
}
if( m_nCustomActionIndex != -1 )
{
ActionElementStruct *pCustomStruct = GetElement( m_nCustomActionIndex );
if( pCustomStruct ) {
float fFrame = ( ( m_LocalTime - m_CustomActionTime ) / 1000.f ) * m_fFPS;
if( fFrame > (float)pCustomStruct->dwLength )
{
ResetCustomAction();
ProcessSignal( pCustomStruct, fFrame, m_fCustomPrevFrame );
}
else
{
m_bCustomProcessSignal = true;
float fTemp = m_fCustomPrevFrame;
ProcessSignal( pCustomStruct, fFrame, m_fCustomPrevFrame );
m_bCustomProcessSignal = false;
if( m_fCustomPrevFrame == fTemp )
{
if( fFrame == m_fCustomPrevFrame )
m_fCustomPrevFrame = fFrame + 0.001f;
else
m_fCustomPrevFrame = fFrame;
}
}
}
}
// CanMove <EFBFBD> True t<EFBFBD><EFBFBD><EFBFBD> CustomAction t<EFBFBD> <EFBFBD>‰<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Input Signal <EFBFBD><EFBFBD>@<EFBFBD> t<EFBFBD>ٳ<EFBFBD><EFBFBD> <EFBFBD>ǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD>̬<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD>X<EFBFBD>0<EFBFBD> \<EFBFBD><EFBFBD><EFBFBD> |<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Դœ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..
// t<EFBFBD><EFBFBD> X<EFBFBD>t<EFBFBD> CanMove <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> True <EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD> Input Signal <EFBFBD><EFBFBD>D<EFBFBD> #<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>X<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Move <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ֈǔ<EFBFBD> Signal<EFBFBD><EFBFBD>t<EFBFBD> ȩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> J<EFBFBD><<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> #<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
// ProcessSignal( pStruct, m_fFrame, m_fPrevFrame );
else
{
ProcessSignal( pStruct, m_fFrame, m_fPrevFrame );
}
if( m_fFrame == m_fPrevFrame )
m_fPrevFrame = m_fFrame + 0.001f;
else
m_fPrevFrame = m_fFrame;
}
void CDnActionBase::ProcessSignal( ActionElementStruct *pStruct, float fFrame, float fPrevFrame )
{
CEtActionSignal *pSignal;
for( DWORD i=0; i<pStruct->pVecSignalList.size(); i++ ) {
pSignal = pStruct->pVecSignalList[i];
if( pSignal->CheckSignal( fPrevFrame, fFrame ) == true )
{
LOCAL_TIME StartTime = m_LocalTime - (LOCAL_TIME)( 1000.f / m_fFPS * ( fFrame - pSignal->GetStartFrame() ) );
LOCAL_TIME EndTime = m_LocalTime + (LOCAL_TIME)( 1000.f / m_fFPS * ( pSignal->GetEndFrame() - fFrame ) );
OnSignal( (SignalTypeEnum)pSignal->GetSignalIndex(), pSignal->GetData(), m_LocalTime, StartTime, EndTime, pSignal->GetSignalListArrayIndex() );
}
if( !m_szActionQueue.empty() ) break;
}
}
void CDnActionBase::SetAction( const char *szActionName, float fFrame, float fBlendFrame, bool bLoop )
{
if (szActionName == NULL) return;
int nIndex = GetElementIndex( szActionName );
if( nIndex == -1 ) {
#ifdef _DEBUG
OutputDebug( "Can't find Action : %s, %s\n", m_szFileName.c_str(), szActionName );
#endif
return;
}
std::string szPrevAction = m_szAction;
m_nPrevActionIndex = m_nActionIndex;
m_nActionIndex = nIndex;
m_szAction = szActionName;
m_fFrame = m_fPrevFrame = (float)fFrame;
m_ActionTime = m_LocalTime - (LOCAL_TIME)( fFrame / m_fFPS * 1000.f );
if( m_ActionTime < 0 ) m_ActionTime = 0;
if( m_pRender && m_nVecAniIndexList[nIndex] != -1 )
{
m_pRender->ChangeAnimation( m_nVecAniIndexList[nIndex], fFrame, fBlendFrame );
if( bLoop ) m_pRender->SetPrevFrame( 0.f );
}
OnChangeAction( szPrevAction.c_str() );
}
void CDnActionBase::SetActionQueue( const char *szActionName, int nLoopCount, float fBlendFrame, float fStartFrame )
{
m_szActionQueue = szActionName;
m_fQueueBlendFrame = fBlendFrame;
m_fQueueStartFrame = fStartFrame;
m_nLoopCount = nLoopCount;
OnChangeActionQueue( m_szAction.c_str() );
}
const char *CDnActionBase::GetCurrentAction()
{
if( !m_szActionQueue.empty() ) return m_szActionQueue.c_str();
return m_szAction.c_str();
}
void CDnActionBase::SetCustomAction( const char *szActionName, float fFrame )
{
m_szCustomAction = szActionName;
m_CustomActionTime = m_LocalTime - (LOCAL_TIME)( fFrame / m_fFPS * 1000.f );
m_nCustomActionIndex = GetElementIndex( szActionName );
m_fCustomPrevFrame = fFrame - 1.f;
}
bool CDnActionBase::IsCustomAction()
{
return ( m_nCustomActionIndex == -1 ) ? false : true;
}
void CDnActionBase::ResetCustomAction()
{
m_szCustomAction.clear();
m_nCustomActionIndex = -1;
}
#include "DNConfig.h"
extern TGameConfig g_Config;
bool CDnActionBase::LoadAction( const char *szFullPathName )
{
m_ProjectileCountInfoForInit.Clear();
m_SkillChainInfoForInit.Clear();
m_PassiveSkillInfoForInit.Clear();
m_BasicAttackInfoForInit.Clear();
bool bResult = false;
bResult = CEtActionBase::LoadAction( szFullPathName );
if( bResult ) CacheAniIndex();
if( bResult )
{
if( false == m_ProjectileCountInfoForInit.mapMaxProjectileCountInAction.empty() ||
false == m_ProjectileCountInfoForInit.mapSendActionWeapon.empty() )
{
if (g_Config.bPreLoad && g_Config.bAllLoaded)
{
//լ<EFBFBD>\<EFBFBD>ܴ<EFBFBD> <EFBFBD>8Ȉ<EFBFBD><<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>ٳ<EFBFBD><EFBFBD> t<EFBFBD>x<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>$<EFBFBD>t<EFBFBD> H<EFBFBD>(<EFBFBD><EFBFBD><EFBFBD>! |<EFBFBD><EFBFBD><EFBFBD> \<EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>
g_Log.Log(LogType::_PRELOADED_DYNAMICLOAD, L"DynamicLoad [%S]\n", szFullPathName);
}
CDnActionSpecificInfo::GetInstance().AddProjectileSignalInfo( szFullPathName, m_ProjectileCountInfoForInit );
}
m_pProjectileCountInfo = CDnActionSpecificInfo::GetInstance().FindProjectileSignalInfo( szFullPathName );
if( false == m_SkillChainInfoForInit.setSkillChainAction.empty() )
{
if (g_Config.bPreLoad && g_Config.bAllLoaded)
{
//լ<EFBFBD>\<EFBFBD>ܴ<EFBFBD> <EFBFBD>8Ȉ<EFBFBD><<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>ٳ<EFBFBD><EFBFBD> t<EFBFBD>x<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>$<EFBFBD>t<EFBFBD> H<EFBFBD>(<EFBFBD><EFBFBD><EFBFBD>! |<EFBFBD><EFBFBD><EFBFBD> \<EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>
g_Log.Log(LogType::_PRELOADED_DYNAMICLOAD, L"DynamicLoad [%S]\n", szFullPathName);
}
CDnActionSpecificInfo::GetInstance().AddSkillChainActionSet( szFullPathName, m_SkillChainInfoForInit );
}
m_pSetSkillChainAction = CDnActionSpecificInfo::GetInstance().FindSkillChainActionSet( szFullPathName );
if( false == m_PassiveSkillInfoForInit.mapPassiveSkillInfo.empty() )
{
if (g_Config.bPreLoad && g_Config.bAllLoaded)
{
//լ<EFBFBD>\<EFBFBD>ܴ<EFBFBD> <EFBFBD>8Ȉ<EFBFBD><<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>ٳ<EFBFBD><EFBFBD> t<EFBFBD>x<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>$<EFBFBD>t<EFBFBD> H<EFBFBD>(<EFBFBD><EFBFBD><EFBFBD>! |<EFBFBD><EFBFBD><EFBFBD> \<EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>
g_Log.Log(LogType::_PRELOADED_DYNAMICLOAD, L"DynamicLoad [%S]\n", szFullPathName);
}
CDnActionSpecificInfo::GetInstance().AddPassiveSkillInfo( szFullPathName, m_PassiveSkillInfoForInit );
}
m_pPassiveSkillInfo = CDnActionSpecificInfo::GetInstance().FindPassiveSkillInfo( szFullPathName );
if( false == m_BasicAttackInfoForInit.mapBasicAttackInfo.empty() )
{
if (g_Config.bPreLoad && g_Config.bAllLoaded)
{
//լ<EFBFBD>\<EFBFBD>ܴ<EFBFBD> <EFBFBD>8Ȉ<EFBFBD><<EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>0<EFBFBD>ٳ<EFBFBD><EFBFBD> t<EFBFBD>x<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>$<EFBFBD>t<EFBFBD> H<EFBFBD>(<EFBFBD><EFBFBD><EFBFBD>! |<EFBFBD><EFBFBD><EFBFBD> \<EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>
g_Log.Log(LogType::_PRELOADED_DYNAMICLOAD, L"DynamicLoad [%S]\n", szFullPathName);
}
CDnActionSpecificInfo::GetInstance().AddBasicAttackActionInfo( szFullPathName, m_BasicAttackInfoForInit );
}
m_pBasicAttackInfo = CDnActionSpecificInfo::GetInstance().FindBasicAttackInfo( szFullPathName );
}
return bResult;
}
void CDnActionBase::FreeAction()
{
CEtActionBase::FreeAction();
}
void CDnActionBase::CacheAniIndex()
{
m_nVecAniIndexList.clear();
// <EFBFBD><EFBFBD><EFBFBD> d<EFBFBD><EFBFBD> , <EFBFBD><EFBFBD>L<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>x<EFBFBD>0<EFBFBD>|<EFBFBD> <<EFBFBD>$<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ɣ<EFBFBD> <EFBFBD>l<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>`<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> |<EFBFBD><EFBFBD><EFBFBD> empty() <EFBFBD><EFBFBD>l<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> empty()
// <EFBFBD>Ǵ<EFBFBD>|<EFBFBD> \<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>l<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD≯l<EFBFBD>p<EFBFBD>|<EFBFBD> <EFBFBD>ԯ|<EFBFBD>`<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>µ<EFBFBD>Ȳ<EFBFBD><EFBFBD>.
if (m_pVecActionElementList == NULL || m_pVecActionElementList->empty() )
return;
for( DWORD i=0; i<m_pVecActionElementList->size(); i++ ) {
int nIndex = -1;
if( m_pRender && (*m_pVecActionElementList)[i] && !(*m_pVecActionElementList)[i]->szLinkAniName.empty() ) {
nIndex = m_pRender->GetAniIndex( (*m_pVecActionElementList)[i]->szLinkAniName.c_str() );
}
m_nVecAniIndexList.push_back( nIndex );
}
}
void CDnActionBase::CheckPreSignal( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal, int nSignalIndex, CEtActionBase *pActionBase )
{
/*
<EFBFBD><EFBFBD>X<EFBFBD>.. <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD> Room <EFBFBD><EFBFBD>x<EFBFBD>0<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ǔ<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD>..
This|<EFBFBD> <EFBFBD>Ŵ<EFBFBD><EFBFBD> #<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȍ<EFBFBD> <EFBFBD>t<EFBFBD> H<EFBFBD>)<EFBFBD>Ȳ<EFBFBD><EFBFBD>.
<EFBFBD>ܴ<EFBFBD><EFBFBD> (CMultiRoom*)g_pGameServerManager->GetRootRoom() <EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD>Ŵ<EFBFBD><EFBFBD> K<EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>Ŵ<EFBFBD>$<EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>ij t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><<EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> H<EFBFBD><EFBFBD><EFBFBD><EFBFBD> GetRootRoom() D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD>~
*/
switch( pSignal->GetSignalIndex() ) {
case STE_Input:
{
if( pSignal->GetStartFrame() == 0 && pSignal->GetEndFrame() == pElement->dwLength ) {
pSignal->SetStartFrame( -1 );
}
// <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD>x<EFBFBD> ՘<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>8<EFBFBD> <EFBFBD>ǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>X<EFBFBD>t<EFBFBD>P<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> u<EFBFBD>D<EFBFBD> ɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( pActionBase )
{
CDnActionBase* pDnActionBase = static_cast<CDnActionBase*>( pActionBase );
pDnActionBase->InsertBasicAttackInfo( nElementIndex, pSignal );
pDnActionBase->InsertSkillChainInfo( pElement, nElementIndex, pSignal );
pDnActionBase->InsertBasicShootActionCoolTime( pElement, nElementIndex, pSignal );
}
}
break;
case STE_InputHasPassiveSkill:
{
InputHasPassiveSkillStruct *pStruct = (InputHasPassiveSkillStruct *)pSignal->GetData();
if( pSignal->GetStartFrame() == 0 && pSignal->GetEndFrame() == pElement->dwLength ) {
pSignal->SetStartFrame( -1 );
}
if( !pStruct->szEXSkillChangeAction ) pSignal->InsertStrTable( (char*)&pStruct->szEXSkillChangeAction, std::string("") );
if( pActionBase ) {
((CDnActionBase*)pActionBase)->InsertPassiveSkillInfo( nElementIndex, pSignal );
}
}
break;
case STE_Projectile:
{
ProjectileStruct *pStruct = (ProjectileStruct *)pSignal->GetData();
pStruct->nProjectileIndex = -1;
if( !g_pGameServerManager ) break;
// 4<EFBFBD>0<EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0x<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ɣ<EFBFBD> t<EFBFBD>|<EFBFBD>tǸŸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>p<EFBFBD> 4<EFBFBD>0<EFBFBD>X<EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ij]<EFBFBD> t<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ň<EFBFBD>0<EFBFBD> L<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD>
// 4<EFBFBD>0<EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 t<EFBFBD>|<EFBFBD><EFBFBD><EFBFBD> break <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> tδƸ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> \<EFBFBD><EFBFBD><EFBFBD>.
// t<EFBFBD> a<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD>ǔ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> \<EFBFBD><EFBFBD> /<EFBFBD><EFBFBD>|<EFBFBD> ȥ<EFBFBD>t<EFBFBD>T<EFBFBD><EFBFBD><EFBFBD>.
// t<EFBFBD>|<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (ӷ<EFBFBD>t<EFBFBD> $<EFBFBD>t<EFBFBD> a<EFBFBD>X<EFBFBD>t<EFBFBD> <EFBFBD> <EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> \<EFBFBD><EFBFBD> /<EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD>0<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>ij]<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if( pActionBase )
((CDnActionBase*)pActionBase)->InsertProjectileCountInfo( nElementIndex, pSignal );
if( pStruct->nWeaponTableID == 0 ) break;
CDnProjectile *pProjectile = new CDnProjectile( (CMultiRoom*)g_pGameServerManager->GetRootRoom(), CDnActor::Identity(), false , false );
pProjectile->CDnWeapon::Initialize( pStruct->nWeaponTableID, -1 );
pProjectile->CDnWeapon::CreateObject();
pStruct->nProjectileIndex = pProjectile->GetMyIndex();
}
break;
case STE_SendAction_Weapon:
{
if( pActionBase )
((CDnActionBase*)pActionBase)->InsertSendActionProjectileCountInfo( nElementIndex, pSignal );
}
break;
case STE_Gravity:
{
GravityStruct *pStruct = (GravityStruct *)pSignal->GetData();
if( !pStruct->vOffset ) pSignal->InsertVec3Table( (EtVector3*)&pStruct->vOffset, EtVector3( 0.f, 0.f, 0.f ) );
}
break;
default:
{
if( pActionBase )
{
CDnActionBase* pDnActionBase = static_cast<CDnActionBase*>( pActionBase );
pDnActionBase->InsertStandChangeSEShootSkillCoolTime( pElement, nElementIndex, pSignal );
}
}
break;
}
}
void CDnActionBase::CheckPostSignal( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal, int nSignalIndex, CEtActionBase *pActionBase )
{
if( !g_pGameServerManager ) return;
if( !g_pGameServerManager->GetRootRoom() ) return;
switch( pSignal->GetSignalIndex() ) {
case STE_Projectile:
{
ProjectileStruct *pStruct = (ProjectileStruct *)pSignal->GetData();
if( pStruct->nWeaponTableID == 0 ) break;
if( pStruct->nProjectileIndex == -1 ) break;
DnWeaponHandle hWeapon = CDnWeapon::GetSmartPtr( (CMultiRoom*)g_pGameServerManager->GetRootRoom(), pStruct->nProjectileIndex );
SAFE_RELEASE_SPTR( hWeapon );
}
break;
}
}
void CDnActionBase::InsertBasicAttackInfo( int nElementIndex, CEtActionSignal *pSignal )
{
InputStruct* pInputStruct = (InputStruct*)(pSignal->GetData());
CDnActionSpecificInfo::S_BASIC_ATTACK_INPUT_SIGNAL_INFO BasicActionSignalInfo;
BasicActionSignalInfo.strChangeActionName = pInputStruct->szChangeAction;
int iStartFrame = pSignal->GetStartFrame() < 0 ? 0 : pSignal->GetStartFrame();
BasicActionSignalInfo.dwStartFrame = iStartFrame;
BasicActionSignalInfo.dwEndFrame = pSignal->GetEndFrame();
m_BasicAttackInfoForInit.mapBasicAttackInfo[ nElementIndex ].push_back( BasicActionSignalInfo );
}
void CDnActionBase::InsertSkillChainInfo( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal )
{
InputStruct* pInputStruct = (InputStruct*)(pSignal->GetData());
if( TRUE == pInputStruct->bSkillChain )
{
m_SkillChainInfoForInit.setSkillChainAction.insert( nElementIndex );
m_SkillChainInfoForInit.mapCanChainToThisAction[ nElementIndex ].push_back( pInputStruct->szChangeAction );
}
}
void CDnActionBase::InsertBasicShootActionCoolTime( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal )
{
InputStruct* pInputStruct = (InputStruct*)(pSignal->GetData());
// 0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>X<EFBFBD> a<EFBFBD>X<EFBFBD>t<EFBFBD> pick, jump a<EFBFBD>X<EFBFBD>t<EFBFBD> D<EFBFBD>̲ <EFBFBD><EFBFBD>.
const char* pActionName = pElement->szName.c_str();
if( strstr(pActionName, "Shoot_") )
{
if( stricmp("Pick", pInputStruct->szChangeAction) != 0 &&
stricmp("Jump", pInputStruct->szChangeAction) != 0 )
{
// <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>x<EFBFBD> a<EFBFBD>X<EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>T<EFBFBD>|<EFBFBD>ij <EFBFBD><EFBFBD><EFBFBD><EFBFBD> n<EFBFBD><EFBFBD><EFBFBD> Ŵ<EFBFBD><EFBFBD><EFBFBD>.
int iStartFrame = pSignal->GetStartFrame() < 0 ? 0 : pSignal->GetStartFrame();
m_ProjectileCountInfoForInit.mapBasicShootActionCoolTime[ nElementIndex ] = DWORD(((float)iStartFrame / m_fFPS) * 1000);
}
}
}
void CDnActionBase::InsertStandChangeSEShootSkillCoolTime( ActionElementStruct *pElement, int nElementIndex, CEtActionSignal *pSignal )
{
if( m_ProjectileCountInfoForInit.mapBasicShootActionCoolTime.end() == m_ProjectileCountInfoForInit.mapBasicShootActionCoolTime.find( nElementIndex ) )
{
const char* pActionName = pElement->szName.c_str();
// <EFBFBD>ˆ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ф<EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD>ij <EFBFBD><EFBFBD><EFBFBD>Є<EFBFBD>t<EFBFBD> <EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD>%<EFBFBD>D<EFBFBD> <EFBFBD>D<EFBFBD> a<EFBFBD>X<EFBFBD>t<EFBFBD> <EFBFBD> <EFBFBD>t<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD> L<EFBFBD>8<EFBFBD><EFBFBD><EFBFBD>..
// }<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> J<EFBFBD><EFBFBD><EFBFBD>̹ <EFBFBD><EFBFBD>0<EFBFBD><EFBFBD> <EFBFBD>ˆɤ<EFBFBD><EFBFBD>Ф´<EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD>X<EFBFBD> ȴ<EFBFBD> 8<EFBFBD>t<EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Є<EFBFBD><<EFBFBD>\<EFBFBD> $<EFBFBD><EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
// <EFBFBD>ˆɤ<EFBFBD><EFBFBD>Ф´<EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> t<EFBFBD> input <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>%<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
// p<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>ij ȹ,<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD>ˆ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ф<EFBFBD>@<EFBFBD> l<EFBFBD>p<EFBFBD><EFBFBD> <EFBFBD><<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD>@<EFBFBD> )<EFBFBD><EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD>̬<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
if( strcmp(pActionName, "Skill_SiegeStance_Attack") == 0 ||
strcmp(pActionName, "Skill_Demolition_Attack1") == 0 ||
strcmp(pActionName, "Skill_Demolition_Attack2") == 0 )
{
m_ProjectileCountInfoForInit.mapBasicShootActionCoolTime[ nElementIndex ] = DWORD(((float)pElement->dwLength / m_fFPS) * 1000);
}
else
if( strcmp(pActionName, "Skill_FlashStance_AttackL") == 0 ||
strcmp(pActionName, "Skill_FlashStance_AttackR") == 0 )
{
// ՘<EFBFBD>l<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ф”<EFBFBD> ՘<EFBFBD>l<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ф<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>a<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> input <<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><<EFBFBD><EFBFBD><EFBFBD>\<EFBFBD> input <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> l<EFBFBD><EFBFBD>L<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> Ĭ<EFBFBD><EFBFBD>t<EFBFBD> T<EFBFBD><EFBFBD><EFBFBD>.
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> ֬ǔ<EFBFBD> <EFBFBD>@<EFBFBD> <EFBFBD>‘<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2<EFBFBD>X<EFBFBD> Input <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>‘<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<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><EFBFBD> <EFBFBD>‘<EFBFBD><EFBFBD><EFBFBD><EFBFBD> Input <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> 0<EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Є<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD>T<EFBFBD><EFBFBD><EFBFBD>.
int iSmallestStartFrame = INT_MAX;
int iNumSignals = (int)pElement->pVecSignalList.size();
for( int iSignal = 0; iSignal < iNumSignals; ++iSignal )
{
CEtActionSignal* pSignal = pElement->pVecSignalList.at( iSignal );
if( STE_Input == pSignal->GetSignalIndex() )
{
InputStruct* pInputStruct = (InputStruct*)(pSignal->GetData());
if( stricmp("Pick", pInputStruct->szChangeAction) != 0 &&
stricmp("Jump", pInputStruct->szChangeAction) != 0 )
{
int iStartFrame = pSignal->GetStartFrame() < 0 ? 0 : pSignal->GetStartFrame();
if( iStartFrame < iSmallestStartFrame )
{
iSmallestStartFrame = iStartFrame;
}
}
}
}
if( INT_MAX != iSmallestStartFrame )
{
m_ProjectileCountInfoForInit.mapBasicShootActionCoolTime[ nElementIndex ] = DWORD(((float)iSmallestStartFrame / m_fFPS) * 1000);
}
}
}
}
void CDnActionBase::InsertPassiveSkillInfo( int nElementIndex, CEtActionSignal *pSignal )
{
InputHasPassiveSkillStruct* pStruct = (InputHasPassiveSkillStruct*)(pSignal->GetData());
CDnActionSpecificInfo::S_PASSIVESKILL_SIGNAL_INFO PassiveSignalInfo;
PassiveSignalInfo.iSkillID = pStruct->nSkillIndex;
PassiveSignalInfo.strChangeActionName = pStruct->szChangeAction;
PassiveSignalInfo.strEXSkillChangeActionName = pStruct->szEXSkillChangeAction;
m_PassiveSkillInfoForInit.mapPassiveSkillInfo[ nElementIndex ].push_back( PassiveSignalInfo );
}
void CDnActionBase::InsertProjectileCountInfo( int nElementIndex, CEtActionSignal *pSignal )
{
ProjectileStruct *pStruct = (ProjectileStruct *)pSignal->GetData();
map<int, int>::iterator iter = m_ProjectileCountInfoForInit.mapMaxProjectileCountInAction.find( nElementIndex );
if( iter != m_ProjectileCountInfoForInit.mapMaxProjectileCountInAction.end() )
m_ProjectileCountInfoForInit.mapMaxProjectileCountInAction[ nElementIndex ]++;
else
m_ProjectileCountInfoForInit.mapMaxProjectileCountInAction.insert( make_pair(nElementIndex, 1) );
// 4<EFBFBD>0<EFBFBD> L<EFBFBD>t<EFBFBD><EFBFBD> IDij <EFBFBD>D<EFBFBD>T<EFBFBD><EFBFBD><EFBFBD>. |<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>a<EFBFBD>X<EFBFBD> (ӷ<EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> <<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD>,
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> /<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>l<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> \<EFBFBD><EFBFBD>\<EFBFBD> 4<EFBFBD>0<EFBFBD> <EFBFBD><EFBFBD>8<EFBFBD> <EFBFBD>ԯ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD>.... D<EFBFBD> <EFBFBD><EFBFBD>h<EFBFBD>...
m_ProjectileCountInfoForInit.mapUsingProjectileWeaponTableIDs[ nElementIndex ].insert( pStruct->nWeaponTableID );
// <EFBFBD>¬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ԯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ļij\<EFBFBD>, D<EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> 0<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> a<EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (ӷ<EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD> ȹl<EFBFBD> <EFBFBD>Ô<EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD>
// ɹ0<EFBFBD> <EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (ӷ<EFBFBD>D<EFBFBD> <EFBFBD>X<EFBFBD>D<EFBFBD> L<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ij <EFBFBD><EFBFBD>l<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>.
m_ProjectileCountInfoForInit.mapProjectileSignalFrameOffset[ nElementIndex ].push_back( pSignal->GetStartFrame() );
}
void CDnActionBase::InsertSendActionProjectileCountInfo( int nElementIndex, CEtActionSignal *pSignal )
{
SendAction_WeaponStruct *pStruct = (SendAction_WeaponStruct *)pSignal->GetData();
if( 2 <= pStruct->nWeaponIndex )
return;
CDnActionSpecificInfo::S_WEAPONACTION_INFO WeaponActionInfo;
WeaponActionInfo.iWeaponIndex = pStruct->nWeaponIndex;
WeaponActionInfo.iFrame = pSignal->GetStartFrame();
if( 0 < strlen(pStruct->szActionName) )
WeaponActionInfo.strActionName = pStruct->szActionName;
map<int, vector<CDnActionSpecificInfo::S_WEAPONACTION_INFO> >::iterator iter = m_ProjectileCountInfoForInit.mapSendActionWeapon.find( nElementIndex );
if( m_ProjectileCountInfoForInit.mapSendActionWeapon.end() == iter )
{
// \<EFBFBD><EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L<EFBFBD>.
vector<CDnActionSpecificInfo::S_WEAPONACTION_INFO> vlWeaponActionInfo;
vlWeaponActionInfo.push_back( WeaponActionInfo );
m_ProjectileCountInfoForInit.mapSendActionWeapon.insert( make_pair(nElementIndex, vlWeaponActionInfo) );
}
else
{
// P<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>0є<EFBFBD> <EFBFBD><EFBFBD>0<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>. (ex)l<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
iter->second.push_back( WeaponActionInfo );
}
}
void CDnActionBase::SetFPS( float fValue )
{
if( 0.0f < fValue )
{
m_ActionTime = m_LocalTime - (LOCAL_TIME)( m_fFrame / fValue * 1000.f );
if( IsCustomAction() ) {
float fFrame = ( ( m_LocalTime - m_CustomActionTime ) / 1000.f ) * m_fFPS;
m_CustomActionTime = m_LocalTime - (LOCAL_TIME)( fFrame / fValue * 1000.f );
}
}
else
{
// fValue <EFBFBD> 0.0f \<EFBFBD> 8֜<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
m_ActionTime = m_LocalTime;
if( IsCustomAction() ) {
m_CustomActionTime = m_LocalTime;
}
}
m_fFPS = fValue;
if( m_pRender )
m_pRender->SetFPS( fValue );
}
float CDnActionBase::GetFPS()
{
return m_fFPS;
}
bool CDnActionBase::IsIgnoreSignal( int nSignalIndex )
{
switch( nSignalIndex ) {
case STE_DnNullSignal:
case STE_Sound:
case STE_Particle:
case STE_EnvironmentEffect:
case STE_ShowWeapon:
case STE_AlphaBlending:
case STE_AttachTrail:
case STE_CameraEffect_Shake:
case STE_FX:
case STE_CanRotate:
case STE_ActionObject:
case STE_ObjectVisible:
case STE_AttachSwordTrail:
case STE_ShowSwordTrail:
case STE_CameraEffect_RadialBlur:
case STE_Decal:
case STE_HeadLook:
case STE_ShaderCustomParameter:
case STE_ChangeWeaponLink:
case STE_FreezeCamera:
case STE_SocialAction:
case STE_HideExposureInfo:
case STE_PhysicsSkip:
case STE_Particle_LoopEnd:
case STE_FX_LoopEnd:
case STE_OutlineFilter:
case STE_Billboard:
case STE_EyeLightTrail:
case STE_PointLight:
case STE_OtherSelfEffect:
case STE_ImmediatelyAttach:
case STE_Dialogue:
case STE_AttachLine:
case STE_SyncChangeAction:
case STE_CannonTargeting:
case STE_SkillChecker:
case STE_CameraEffect_Swing:
return true;
}
return false;
}