DragonNest/GameCommon/IDnSkillProcessor.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

336 lines
No EOL
11 KiB
C++

#include "StdAfx.h"
#include "IDnSkillProcessor.h"
#include "DnPlayAniProcess.h"
#include "DnPartialPlayProcessor.h"
#include "DnChangeProjectileProcessor.h"
#include "DnDivideSEArgumentByTargets.h"
#include "DnImpactBlowProcessor.h"
#include "DnChangeActionStrProcessor.h"
#include "DnRangeSEProcessor.h"
#include "DnPetPlayAniProcess.h"
#include "DnCheckKeyProcessor.h"
#include "DnTableDB.h"
#ifdef _GAMESERVER
#include "DnAuraProcessor.h"
#include "DnApplySEWhenActionSetBlowEnabledProcessor.h"
#include "DnApplySEWhenTargetNormalHitProcessor.h"
#include "DnCallMySummonedMonsterProcessor.h"
#include "DnStateEffectApplyOnOffByBubbleProcessor.h"
#endif
#include "DnChangeActionStrByBubbleProcessor.h"
#if !defined( USE_BOOST_MEMPOOL )
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif // #if !defined( USE_BOOST_MEMPOOL )
IDnSkillProcessor::IDnSkillProcessor( DnActorHandle hActor ) : m_hHasActor( hActor ),
m_fTimeLength( 0.0f ),
m_iType( COUNT )
{
}
IDnSkillProcessor::~IDnSkillProcessor(void)
{
}
IDnSkillProcessor* IDnSkillProcessor::Create( DnActorHandle hActor, int iProcessorIndex, int iSkillLevelTableID, int* pIParamOffset, set<string>& vlUseActions )
{
IDnSkillProcessor* pNewProcessor = NULL;
DNTableFileFormat* pSkillLevelTable = GetDNTable( CDnTableDB::TSKILLLEVEL );
char caBuf[ 256 ];
ZeroMemory( caBuf, sizeof(caBuf) );
// 인자를 순차적으로 읽어들이므로 _GAMSERVER 디파인으로 구분한 것들과 아닌 발현타입이 섞여 있을 경우 문제가 될 수 있음.
switch( iProcessorIndex-1 )
{
//// none
//case 0:
//
// break;
// PlayAni
case PLAY_ANI:
{
// 적절한 파라메터를 뽑아주자.
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pActionName );
vlUseActions.insert( pActionName );
++(*pIParamOffset);
if( pActionName )
pNewProcessor = new CDnPlayAniProcess( hActor, pActionName );
}
break;
// Partial Play
case PARTIAL_PLAY_ANI:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pStartActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
vlUseActions.insert( pStartActionName );
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pLoopActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
vlUseActions.insert( pLoopActionName );
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pEndActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
vlUseActions.insert( pEndActionName );
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pTimeLength = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pMoveSpeed = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
_ASSERT( pStartActionName && pLoopActionName && pMoveSpeed && pTimeLength && pMoveSpeed );
if( pStartActionName && pLoopActionName && pMoveSpeed && pTimeLength && pMoveSpeed )
{
int iTimeLength = atoi( pTimeLength );
int iMoveSpeed = atoi( pMoveSpeed );
pNewProcessor = new CDnPartialPlayProcessor( hActor, pStartActionName, pLoopActionName, pEndActionName,
iTimeLength, (float)iMoveSpeed );
}
}
break;
// ChangePrj
case CHANGE_PROJECTILE:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pSourceWeaponID = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pChangeWeaponID = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
_ASSERT( pSourceWeaponID && pChangeWeaponID );
if( pSourceWeaponID && pChangeWeaponID )
{
int iSourceWeaponID = atoi( pSourceWeaponID );
int iChangeWeaponID = atoi( pChangeWeaponID );
pNewProcessor = new CDnChangeProjectileProcessor( hActor, iSourceWeaponID, iChangeWeaponID );
}
}
break;
// Divide State Effect Argument
case DIVIDE_STATE_EFFECT_ARG:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pSEArgument = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
_ASSERT( pSEArgument );
if( pSEArgument )
{
int iSEArgument = atoi( pSEArgument );
pNewProcessor = new CDnDivideSEArgumentByTargets( hActor, iSEArgument );
}
}
break;
// Impact Blow, 인자 없음
case IMPACT_BLOW:
{
pNewProcessor = new CDnImpactBlowProcessor( hActor );
}
break;
// Aura, 인자는 "범위"로 1개 받는다.
// 게임서버에서만 생성해서 사용됨
case AURA:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pRangeArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
#ifdef _GAMESERVER
_ASSERT( pRangeArg );
if( pRangeArg )
{
float fRange = (float)atof( pRangeArg );
pNewProcessor = new CDnAuraProcessor( hActor, fRange );
}
else
{
g_Log.Log( LogType::_ERROR, L"IDnSkillProcessor* IDnSkillProcessor::Create() - AURA Processor Create Fail!!\n" );
}
#endif
}
break;
// Change Action String
case CHANGE_ACTIONSTR:
{
//char *szAddStr = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, "_ProcessParam1" )->GetString();
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char *szAddStr = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
DNVector(std::string) szVecList;
char *szActionName;
for( int i=1; i<10; i++ ) {
sprintf_s( caBuf, "_ProcessParam%d", (*pIParamOffset) + 1 );
szActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
if( szActionName == NULL || strlen( szActionName ) == 0 || strcmp( szActionName, "0" ) == 0 ) continue;
++(*pIParamOffset);
szVecList.push_back( szActionName );
}
pNewProcessor = new CDnChangeActionStrProcessor( hActor, szAddStr, szVecList );
}
break;
// RangeStateEffect
// 겜 서버에서만 사용함. 인자는 범위, 확률, 대상에게 적용할 상태효과 이펙트 테이블 인덱스, processor 지속시간
case RANGE_STATE_EFFECT:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pRangeArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pProbArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pTargetEffectOutputID = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pDurationTime = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
#ifdef _GAMESERVER
_ASSERT( pRangeArg && pProbArg && pTargetEffectOutputID && pDurationTime );
if( pRangeArg && pProbArg && pTargetEffectOutputID && pDurationTime )
{
float fRange = (float)atof( pRangeArg );
float fProb = (float)atof( pProbArg );
int iTargetOutputID = atoi( pTargetEffectOutputID );
int iDurationTime = atoi( pDurationTime );
pNewProcessor = new CDnRangeSEProcessor( hActor, fRange, fProb, iTargetOutputID, iDurationTime );
}
else
g_Log.Log( LogType::_ERROR, L"IDnSkillProcessor* IDnSkillProcessor::Create() - RANGE_STATE_EFFECT Processor Create Fail!!\n" );
#endif // #ifdef _GAMESERVER
}
break;
// ApplySEWhenActionSetEnabled
// 겜 서버에서만 사용함. 인자 없음.
case APPLY_SE_WHEN_ACTIONSET_ENABLED:
#ifdef _GAMESERVER
pNewProcessor = new CDnApplySEWhenActionSetBlowEnabledProcessor( hActor );
#endif // #ifdef _GAMESERVER
break;
// ApplySEWhenTargetNormalHit
// 겜 서버에서만 사용. 인자는 확률 하나.
case APPLY_SE_WHEN_TARGET_NORMAL_HIT:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pProbArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
#ifdef _GAMESERVER
float fProb = (float)atof( pProbArg );
pNewProcessor = new CDnApplySEWhenTargetNormalHitProcessor( hActor, fProb );
#endif // #ifdef _GAMESERVER
}
break;
// CallMySummonedMonster
// 겜 서버에서만 사용. 인자는 내 옆으로 가져다 놓을 몬스터 IDs
case CALL_MY_SUMMONED_MONSTER:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pProbArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
#ifdef _GAMESERVER
int iSummonedMonsterIDToCall = (int)atoi( pProbArg );
pNewProcessor = new CDnCallMySummonedMonsterProcessor( hActor, iSummonedMonsterIDToCall );
#endif // #ifdef _GAMESERVER
}
break;
// ChangeActionStrByBubble
case CHANGE_ACTIONSTR_BY_BUBBLE:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
// 버블ID;버블갯수;버블ID;액션이름;버블갯수;액션이름.... 3개씩 쌍으로.
pNewProcessor = new CDnChangeActionStrByBubbleProcessor( hActor, pArg );
}
break;
case STATE_EFFECT_APPLY_ONOFF_BY_BUBBLE:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pArg = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
++(*pIParamOffset);
// 버블ID;버블갯수;[적용할상태효과의 인덱스1][적용할상태효과의 인덱스2];[적용할상태효과의 인덱스1][적용할상태효과의 인덱스2].... 3개씩 쌍으로.
#ifdef _GAMESERVER
pNewProcessor = new CDnStateEffectApplyOnOffByBubbleProcessor( hActor, pArg );
#endif // #ifdef _GAMESERVER
}
break;
case PLAY_PET_ANI:
{
sprintf_s( caBuf, "_ProcessParam%d", *pIParamOffset+1 );
char* pActionName = pSkillLevelTable->GetFieldFromLablePtr( iSkillLevelTableID, caBuf )->GetString();
_ASSERT( pActionName );
vlUseActions.insert( pActionName );
++(*pIParamOffset);
if( pActionName )
pNewProcessor = new CDnPetPlayAniProcess( hActor, pActionName );
}
break;
case CHECK_KEY:
{
sprintf_s(caBuf, "_ProcessParam%d", *pIParamOffset + 1);
char* pActionName = pSkillLevelTable->GetFieldFromLablePtr(iSkillLevelTableID, caBuf)->GetString();
_ASSERT(pActionName);
vlUseActions.insert(pActionName);
++(*pIParamOffset);
if (pActionName)
pNewProcessor = new CDnCheckKeyProcess(hActor, pActionName);
}
break;
}
return pNewProcessor;
}