#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 ); }