2024-12-21 10:04:04 +08:00
|
|
|
|
#include "StdAfx.h"
|
|
|
|
|
|
#include "DnBubbleEventHandler.h"
|
|
|
|
|
|
#include "DnObserverEventMessage.h"
|
|
|
|
|
|
#include "DnBubbleSystem.h"
|
|
|
|
|
|
#include "DnPlayerActor.h"
|
|
|
|
|
|
#include "DnBlow.h"
|
|
|
|
|
|
#include "DnTableDB.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace BubbleSystem
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
IDnBubbleEventHandler* IDnBubbleEventHandler::Create( int iEventHandlerType, DnActorHandle hActor, const char* pArgument )
|
|
|
|
|
|
{
|
|
|
|
|
|
IDnBubbleEventHandler* pEventHandler = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
switch( iEventHandlerType )
|
|
|
|
|
|
{
|
|
|
|
|
|
case GETTING_BUBBLE:
|
|
|
|
|
|
pEventHandler = new CDnGettingBubbleHandler;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case REMOVE_BUBBLE:
|
|
|
|
|
|
pEventHandler = new CDnRemoveBubbleHandler;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case UPDATE_BUBBLE_STATE_EFFECT:
|
|
|
|
|
|
pEventHandler = new CDnUpdateStateEffectHandler;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case ENCHANT_SKILL_ONCE:
|
|
|
|
|
|
pEventHandler = new CDnEnchantSkillOnce;
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
pEventHandler->Initialize( hActor, pArgument );
|
|
|
|
|
|
|
|
|
|
|
|
return pEventHandler;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CDnGettingBubbleHandler
|
|
|
|
|
|
void CDnGettingBubbleHandler::Initialize( DnActorHandle hActor, const char* pArgument )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || NULL == pArgument )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
m_hActor = hActor;
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<string> vlTokens;
|
|
|
|
|
|
string strArgument( pArgument );
|
|
|
|
|
|
TokenizeA( strArgument, vlTokens, ";" );
|
|
|
|
|
|
|
|
|
|
|
|
_ASSERT( 2 == (int)vlTokens.size() );
|
|
|
|
|
|
|
|
|
|
|
|
m_iBubbleTypeID = atoi( vlTokens.at(0).c_str() );
|
|
|
|
|
|
m_fDurationTime = (float)(atoi( vlTokens.at(1).c_str() )) / 1000.0f;
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE>ٸ<EFBFBD> <20><> <20>̻<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20>Ѵ<EFBFBD>.
|
|
|
|
|
|
m_iAllowedMaxBubbleCount = 0;
|
|
|
|
|
|
DNTableFileFormat* pBubbleDefineTable = GetDNTable( CDnTableDB::TSKILLBUBBLEDEFINE );
|
|
|
|
|
|
if( pBubbleDefineTable->IsExistItem( m_iBubbleTypeID ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_iAllowedMaxBubbleCount = pBubbleDefineTable->GetFieldFromLablePtr( m_iBubbleTypeID, "_BubbleLimit" )->GetInteger();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDnGettingBubbleHandler::ProcessEvent( CDnBubbleSystem* pBubbleSystem, ::IDnObserverNotifyEvent* pEvent )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20>߰<EFBFBD><DFB0><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
|
|
|
|
|
|
int iNowBubbleCount = pBubbleSystem->GetBubbleCountByTypeID( m_iBubbleTypeID );
|
|
|
|
|
|
if( iNowBubbleCount < m_iAllowedMaxBubbleCount )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnBubbleSystem::S_CREATE_BUBBLE Info;
|
|
|
|
|
|
Info.iBubbleTypeID = m_iBubbleTypeID;
|
|
|
|
|
|
Info.iIconIndex = m_iIconIndex;
|
|
|
|
|
|
Info.fDurationTime = m_fDurationTime;
|
|
|
|
|
|
pBubbleSystem->AddBubble( Info );
|
|
|
|
|
|
|
|
|
|
|
|
int iAddedBubbleCount = pBubbleSystem->GetBubbleCountByTypeID( m_iBubbleTypeID );
|
|
|
|
|
|
|
|
|
|
|
|
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
if( m_hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>õ<EFBFBD> <20>Ŀ<EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>.
|
|
|
|
|
|
char acBuffer[ 32 ] = { 0 };
|
|
|
|
|
|
CPacketCompressStream Stream( acBuffer, 32 );
|
|
|
|
|
|
Stream.Write( &m_iBubbleTypeID, sizeof(m_iBubbleTypeID) );
|
|
|
|
|
|
Stream.Write( &m_iIconIndex, sizeof(m_iIconIndex) );
|
|
|
|
|
|
Stream.Write( &m_fDurationTime, sizeof(m_fDurationTime) );
|
|
|
|
|
|
Stream.Write( &iAddedBubbleCount, sizeof(iNowBubbleCount) );
|
|
|
|
|
|
|
|
|
|
|
|
m_hActor->Send( eActor::SC_ADDBUBBLE, &Stream );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0AC><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ӽð<D3BD><C3B0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
|
|
|
|
|
|
if( 0 < pBubbleSystem->GetBubbleCountByTypeID( m_iBubbleTypeID ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD>ӽð<D3BD> <20><><EFBFBD><EFBFBD>.
|
|
|
|
|
|
pBubbleSystem->SetDurationTime( m_iBubbleTypeID, m_fDurationTime );
|
|
|
|
|
|
|
|
|
|
|
|
char acBuffer[ 32 ] = { 0 };
|
|
|
|
|
|
CPacketCompressStream Stream( acBuffer, 32 );
|
|
|
|
|
|
Stream.Write( &m_iBubbleTypeID, sizeof(int) );
|
|
|
|
|
|
Stream.Write( &m_iIconIndex, sizeof(m_iIconIndex) );
|
|
|
|
|
|
Stream.Write( &m_fDurationTime, sizeof(float) );
|
|
|
|
|
|
Stream.Write( &iNowBubbleCount, sizeof(int) );
|
|
|
|
|
|
|
|
|
|
|
|
m_hActor->Send( eActor::SC_REFRESH_BUBBLE_DURATIONTIME, &Stream );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// CDnRemoveBubbleHandler
|
|
|
|
|
|
void CDnRemoveBubbleHandler::Initialize( DnActorHandle hActor, const char* pArgument )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || NULL == pArgument )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
m_hActor = hActor;
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<string> vlTokens;
|
|
|
|
|
|
string strArgument( pArgument );
|
|
|
|
|
|
TokenizeA( strArgument, vlTokens, ";" );
|
|
|
|
|
|
|
|
|
|
|
|
_ASSERT( 2 == (int)vlTokens.size() );
|
|
|
|
|
|
|
|
|
|
|
|
m_iBubbleTypeID = atoi( vlTokens.at(0).c_str() );
|
|
|
|
|
|
m_iRemoveCount = atoi( vlTokens.at(1).c_str() );
|
|
|
|
|
|
|
|
|
|
|
|
SecureZeroMemory( &m_PacketBuffer, sizeof(m_PacketBuffer) );
|
|
|
|
|
|
m_pPacketStream.reset( new CPacketCompressStream( &m_PacketBuffer, sizeof(m_PacketBuffer) ) );
|
|
|
|
|
|
m_pPacketStream->Write( &m_iBubbleTypeID, sizeof(m_iBubbleTypeID) );
|
|
|
|
|
|
m_pPacketStream->Write( &m_iRemoveCount, sizeof(m_iRemoveCount) );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDnRemoveBubbleHandler::ProcessEvent( CDnBubbleSystem* pBubbleSystem, ::IDnObserverNotifyEvent* pEvent )
|
|
|
|
|
|
{
|
|
|
|
|
|
pBubbleSystem->RemoveBubbleByTypeID( m_iBubbleTypeID, m_iRemoveCount );
|
|
|
|
|
|
|
|
|
|
|
|
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
|
if( m_hActor )
|
|
|
|
|
|
{
|
|
|
|
|
|
m_hActor->Send( eActor::SC_REMOVEBUBBLE, m_pPacketStream.get() );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
// CDnUpdateStateEffectHandler
|
|
|
|
|
|
void CDnUpdateStateEffectHandler::Initialize( DnActorHandle hActor, const char* pArgument )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || NULL == pArgument )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
m_hActor = hActor;
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<string> vlTokens;
|
|
|
|
|
|
string strArgument( pArgument );
|
|
|
|
|
|
TokenizeA( strArgument, vlTokens, ";" );
|
|
|
|
|
|
|
|
|
|
|
|
_ASSERT( 2 == (int)vlTokens.size() );
|
|
|
|
|
|
|
|
|
|
|
|
m_iBubbleTypeID = atoi( vlTokens.at(0).c_str() );
|
|
|
|
|
|
m_iSkillID = atoi( vlTokens.at(1).c_str() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDnUpdateStateEffectHandler::ProcessEvent( CDnBubbleSystem* pBubbleSystem, ::IDnObserverNotifyEvent* /*pEvent*/ )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
pBubbleSystem->RemoveBubbleStateBlow( m_iBubbleTypeID );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ش<EFBFBD>.
|
|
|
|
|
|
int iLevel = pBubbleSystem->GetBubbleCountByTypeID( m_iBubbleTypeID );
|
|
|
|
|
|
m_hSkill = CDnSkill::CreateSkill( m_hActor, m_iSkillID, iLevel );
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ų <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20><><EFBFBD>ų<EFBFBD> <20>߸<EFBFBD><DFB8><EFBFBD> <20><><EFBFBD><EFBFBD>. pvp/pve <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ͱ<EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD> <20>Ѵ<EFBFBD>.
|
|
|
|
|
|
if( !m_hSkill )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
int iNumStateEffect = m_hSkill->GetStateEffectCount();
|
|
|
|
|
|
for( int iSE = 0; iSE < iNumStateEffect; ++iSE )
|
|
|
|
|
|
{
|
|
|
|
|
|
const CDnSkill::StateEffectStruct* pSE = m_hSkill->GetStateEffectFromIndex( iSE );
|
|
|
|
|
|
if( CDnSkill::ApplySelf == pSE->ApplyType )
|
|
|
|
|
|
{
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF> <20>߰<EFBFBD> <20><>Ŷ. <20><><EFBFBD>⼭ <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> CDnBubbleSystem <20>ʿ<EFBFBD><CABF><EFBFBD>
|
|
|
|
|
|
// ó<><C3B3><EFBFBD>Ѵ<EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD><CFB4><EFBFBD>..
|
|
|
|
|
|
int iBlowID = m_hActor->CmdAddStateEffect( NULL, (STATE_BLOW::emBLOW_INDEX)pSE->nID, -1, pSE->szValue.c_str() );
|
|
|
|
|
|
_ASSERT( -1 != iBlowID );
|
|
|
|
|
|
if( -1 != iBlowID )
|
|
|
|
|
|
{
|
|
|
|
|
|
pBubbleSystem->AddBubbleStateBlow( m_iBubbleTypeID, iBlowID );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SAFE_RELEASE_SPTR( m_hSkill );
|
|
|
|
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
// CDnEnchantSkillOnce
|
|
|
|
|
|
void CDnEnchantSkillOnce::Initialize( DnActorHandle hActor, const char* pArgument )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( !hActor || NULL == pArgument )
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
m_hActor = hActor;
|
|
|
|
|
|
_ASSERT( m_hActor->IsPlayerActor() );
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<string> vlTokens;
|
|
|
|
|
|
string strArgument( pArgument );
|
|
|
|
|
|
TokenizeA( strArgument, vlTokens, ";" );
|
|
|
|
|
|
|
|
|
|
|
|
_ASSERT( 2 == (int)vlTokens.size() );
|
|
|
|
|
|
|
|
|
|
|
|
m_iTargetSkillID = atoi( vlTokens.at(0).c_str() );
|
|
|
|
|
|
m_iEnchantSkillID = atoi( vlTokens.at(1).c_str() );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDnEnchantSkillOnce::ProcessEvent( CDnBubbleSystem* pBubbleSystem, ::IDnObserverNotifyEvent* /*pEvent*/ )
|
|
|
|
|
|
{
|
|
|
|
|
|
if( m_hActor->IsPlayerActor() )
|
|
|
|
|
|
{
|
|
|
|
|
|
CDnPlayerActor* pPlayerActor = static_cast<CDnPlayerActor*>(m_hActor.GetPointer());
|
|
|
|
|
|
pPlayerActor->ApplyEnchantSkillOnceFromBubble( m_iTargetSkillID, m_iEnchantSkillID );
|
|
|
|
|
|
|
|
|
|
|
|
// Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE> <20><>ų<EFBFBD><C5B3> <20><>ȭ<EFBFBD><C8AD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ѹ<EFBFBD><D1B9><EFBFBD> <20><>ȭ ó<><C3B3><EFBFBD><EFBFBD>.
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ű<EFBFBD><C5B0> <20><><EFBFBD>̹Ƿ<CCB9> <20><><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>Ŷ<EFBFBD><C5B6><EFBFBD><EFBFBD> <20><><EFBFBD>۵ǰ<DBB5> <20>ֱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
// <20><><EFBFBD>Ӽ<EFBFBD><D3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ѹ<EFBFBD> <20>ٲٴ<D9B2> <20><> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>.
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD> Ŭ<><C5AC><EFBFBD>̾<EFBFBD>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> <20><>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><>ȭ<EFBFBD><C8AD>ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD> <20>Ѵ<EFBFBD>.
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
}
|