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

132 lines
No EOL
3.9 KiB
C++

#include "StdAfx.h"
#include "DnChangeActionStrByBubbleProcessor.h"
#include "DnPlayerActor.h"
#include "DnBubbleSystem.h"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
CDnChangeActionStrByBubbleProcessor::CDnChangeActionStrByBubbleProcessor( DnActorHandle hActor, const char* pArg ) : IDnSkillProcessor( hActor )
{
m_iType = CHANGE_ACTIONSTR_BY_BUBBLE;
if( pArg )
{
// 버블ID;버블갯수;액션이름;버블ID;버블갯수;액션이름.... 3개씩 쌍으로.
vector<string> strTokens;
TokenizeA( pArg, strTokens, ";" );
if (strTokens.size() == 0 || strcmp(pArg,"0") == 0) return;
for( int i = 0; i < (int)strTokens.size(); i += 3 )
{
S_ACTION_BY_BUBBLE ActionByBubble;
ActionByBubble.iBubbleID = atoi(strTokens.at( i ).c_str());
ActionByBubble.iBubbleCount = atoi(strTokens.at( i+1 ).c_str());
ActionByBubble.strActionName = strTokens.at( i+2 ).c_str();
m_vlActionByBubble.push_back( ActionByBubble );
}
}
}
CDnChangeActionStrByBubbleProcessor::~CDnChangeActionStrByBubbleProcessor(void)
{
}
void CDnChangeActionStrByBubbleProcessor::SetHasActor( DnActorHandle hActor )
{
_ASSERT( hActor && "void CDnChangeActionStrByBubbleProcessor::SetHasActor( DnActorHandle hActor ), Actor is NULL!!" );
IDnSkillProcessor::SetHasActor( hActor );
}
void CDnChangeActionStrByBubbleProcessor::OnBegin( LOCAL_TIME LocalTime, float fDelta, DnSkillHandle hParentSkill )
{
}
void CDnChangeActionStrByBubbleProcessor::Process( LOCAL_TIME LocalTime, float fDelta )
{
}
void CDnChangeActionStrByBubbleProcessor::OnEnd( LOCAL_TIME LocalTime, float fDelta )
{
}
bool CDnChangeActionStrByBubbleProcessor::IsFinished( void )
{
return true;
}
const char *CDnChangeActionStrByBubbleProcessor::GetChangeActionNameAndRemoveNeedBubble( bool* pBChanged/* = NULL*/ )
{
if( false == m_hHasActor->IsPlayerActor() )
return NULL;
const char* pResult = NULL;
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>(m_hHasActor.GetPointer());
BubbleSystem::CDnBubbleSystem* pBubbleSystem = pPlayerActor->GetBubbleSystem();
// 현재 액션 변경 조건에 맞는게 있는가 확인.
// 가장 큰 갯수로 처리한다.
int iGreatestCount = 0;
const S_ACTION_BY_BUBBLE* pSelectedActionByBubble = NULL;
for( int i = 0; i < (int)m_vlActionByBubble.size(); ++i )
{
const S_ACTION_BY_BUBBLE& ActionByBubble = m_vlActionByBubble.at( i );
int iNowBubbleCount = pBubbleSystem->GetBubbleCountByTypeID( ActionByBubble.iBubbleID );
if( ActionByBubble.iBubbleCount <= iNowBubbleCount )
{
if( iGreatestCount < ActionByBubble.iBubbleCount )
{
iGreatestCount = ActionByBubble.iBubbleCount;
pSelectedActionByBubble = &ActionByBubble;
}
}
}
if( pSelectedActionByBubble )
{
if( pBChanged )
*pBChanged = true;
// 버블 소모.. 모양새는 별로 안좋지만 이 시점이 가장 명확한듯.
// 액션이 바뀌는 것은 스킬 사용한 클라에서 먼저 스킬을 사용하고 서버로 보내는 형식이기 때문에,
// 클라에서 액션이 바뀌었는지 여부를 서버의 응답으로 알아내기 전 타이밍이어야 하므로 직접 클라에서도 판단하고
// 서버에서도 판단하여 서버/클라/다른클라 각자 버블 갯수를 줄인다.
// 다른 클라도 마찬가지. 스킬 사용 패킷 받고 나서 스킬 사용할 때 버블 갯수 판단하여 액션을 바꾼다.
pBubbleSystem->RemoveBubbleByTypeID( pSelectedActionByBubble->iBubbleID, pSelectedActionByBubble->iBubbleCount );
pResult = pSelectedActionByBubble->strActionName.c_str();
}
return pResult;
}
void CDnChangeActionStrByBubbleProcessor::CopyFrom( IDnSkillProcessor* pProcessor )
{
if( pProcessor )
{
m_vlActionByBubble.clear();
CDnChangeActionStrByBubbleProcessor *pCopyProcessor = static_cast<CDnChangeActionStrByBubbleProcessor*>(pProcessor);
if( pCopyProcessor->GetBubbleActionList()->empty() == false )
{
m_vlActionByBubble.resize( pCopyProcessor->GetBubbleActionList()->size() );
std::copy( pCopyProcessor->GetBubbleActionList()->begin(), pCopyProcessor->GetBubbleActionList()->end(), m_vlActionByBubble.begin() );
}
}
}