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

130 lines
No EOL
3.8 KiB
C++

#include "Stdafx.h"
#include "DnWorldKeepOperationProp.h"
#include "DnPropStateTrigger.h"
#include "DNUserSession.h"
#include "DNGameRoom.h"
#include "DnWorld.h"
CDnWorldKeepOperationProp::CDnWorldKeepOperationProp(CMultiRoom * pRoom) : CDnWorldOperationProp(pRoom)
{
_ClearClickedInfo( NULL );
}
CDnWorldKeepOperationProp::~CDnWorldKeepOperationProp()
{
}
bool CDnWorldKeepOperationProp::Initialize( CEtWorldSector *pParentSector, const char *szPropName, EtVector3 &vPos, EtVector3 &vRotate, EtVector3 &vScale )
{
return CDnWorldOperationProp::Initialize( pParentSector, szPropName, vPos, vRotate, vScale );
}
void CDnWorldKeepOperationProp::Process(LOCAL_TIME LocalTime, float fDelta)
{
_CheckKeepProp(LocalTime);
CDnWorldOperationProp::Process(LocalTime, fDelta);
}
void CDnWorldKeepOperationProp::OnDispatchMessage( CDNUserSession *pSession, DWORD dwProtocol, BYTE *pPacket )
{
switch( dwProtocol )
{
case eProp::CS_CMDKEEPCLICKCANCLE:
OnCancelKeepOperationProp( pSession );
break;
}
CDnWorldOperationProp::OnDispatchMessage( pSession, dwProtocol, pPacket );
}
bool CDnWorldKeepOperationProp::OnClickKeepProp( CDNUserSession * pSession, int nOperationTime, int nStringID, const char * szActionName )
{
if (m_bClicked && m_nClickedUniqueID > 0)
{
_DANGER_POINT_MSG(L"µÎ¹øÀº ¸ø ´­·¯¿ä");
return false;
}
if (pSession)
{
m_bClicked = true;
m_nPropKeepClickTick = nOperationTime;
m_nClickedSessionID = pSession->GetSessionID();
m_nClickedUniqueID = pSession->GetActorHandle() ? pSession->GetActorHandle()->GetUniqueID() : -1;
m_PropClickedTime = GetLocalTime();
pSession->SetKeepOperationID(GetUniqueID());
SendKeepOperationStart( pSession->GetActorHandle(), nOperationTime, nStringID, szActionName );
return true;
}
return false;
}
void CDnWorldKeepOperationProp::OnCancelKeepOperationProp( CDNUserSession * pSession )
{
_ClearClickedInfo( pSession );
CDnWorld::GetInstance(GetRoom()).OnTriggerEventCallback( "CDnWorldProp::OnKeepOperationPropFail", GetLocalTime(), 0.f );
if( pSession )
SendKeepOperationResult( pSession->GetActorHandle(), false );
}
void CDnWorldKeepOperationProp::_CheckKeepProp(LOCAL_TIME LocalTime)
{
if ( m_bClicked && m_nClickedUniqueID > 0 && m_PropClickedTime + m_nPropKeepClickTick <= LocalTime)
{
CDNUserSession * pSession = GetGameRoom()->GetUserSession(m_nClickedSessionID);
if (pSession == NULL)
{
_DANGER_POINT_MSG(L"ÀÌ·¯¸é Ŭ¸¯Àº ÇØµÎ¼Ì´Âµ¥ Áß°£¿¡ ³ª°¡¼Ì°Å³ª.....ÇÏ´Â °æ¿ìÀÌ´Ù");
_ClearClickedInfo( NULL );
return;
}
_ClearClickedInfo( pSession );
CDnWorld::GetInstance(GetRoom()).OnTriggerEventCallback( "CDnWorldProp::OnKeepOperationPropSuccess", GetLocalTime(), 0.f );
SendKeepOperationResult( pSession->GetActorHandle(), true );
return;
}
}
void CDnWorldKeepOperationProp::_ClearClickedInfo( CDNUserSession * pSession )
{
m_bClicked = false;
m_nClickedSessionID = 0;
m_nClickedUniqueID = 0;
m_PropClickedTime = 0;
m_nPropKeepClickTick = 0;
if( pSession )
pSession->SetKeepOperationID( 0 );
}
void CDnWorldKeepOperationProp::SendKeepOperationStart( DnActorHandle hActor, int nOperationTime, int nStringID, const char * szActionName )
{
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
int nActorHandle = hActor->GetUniqueID();
int nActionIndex = hActor->GetElementIndex( szActionName );
Stream.Write( &nActionIndex, sizeof(int) );
Stream.Write( &nActorHandle, sizeof(int) );
Stream.Write( &nOperationTime, sizeof(int) );
Stream.Write( &nStringID, sizeof(int) );
Send( eProp::SC_CMDKEEPCLICKSTART, hActor, &Stream );
}
void CDnWorldKeepOperationProp::SendKeepOperationResult(DnActorHandle hActor, bool bRsult)
{
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &bRsult, sizeof(bool) );
Send( eProp::SC_CMDKEEPCLICK, hActor, &Stream );
}