DragonNest/Server/DNGameServer/DnWorldOperationProp.cpp

159 lines
5.2 KiB
C++
Raw Permalink Normal View History

#include "stdafx.h"
#include "DnWorldOperationProp.h"
#include "DNProtocol.h"
#include "DnWorld.h"
#include "DnPropState.h"
#include "DnPropStateTrigger.h"
#include "DnPropOperatedCondition.h"
#include "DNUserSession.h"
CDnWorldOperationProp::CDnWorldOperationProp( CMultiRoom *pRoom )
: CDnWorldActProp( pRoom ), m_bIsOperated( false )
{
m_pTriggerActionState = NULL;
}
CDnWorldOperationProp::~CDnWorldOperationProp()
{
}
bool CDnWorldOperationProp::Initialize( CEtWorldSector *pParentSector, const char *szPropName, EtVector3 &vPos, EtVector3 &vRotate, EtVector3 &vScale )
{
// state <20><><EFBFBD><EFBFBD>
CDnPropState* pNormalState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::NORMAL );
CDnPropState* pTriggerState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::TRIGGER );
CDnPropStateTrigger* pPropStateTrigger = static_cast<CDnPropStateTrigger*>(pTriggerState);
pPropStateTrigger->SetFuncName( "CDnWorldProp::OnClickProp" );
m_pTriggerActionState = pPropStateTrigger;
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CDnPropCondition* pOpCondition = CDnPropCondition::Create( GetMySmartPtr(), CDnPropCondition::OPERATED );
static_cast<CDnPropOperatedCondition*>(pOpCondition)->SetRequireState( ON ); // 1 <20><>...
CDnPropCondition* pNULLCondition = CDnPropCondition::Create( GetMySmartPtr(), CDnPropCondition::NULL_CONDITION );
m_pFSM->AddCondition( pOpCondition );
m_pFSM->AddCondition( pNULLCondition );
m_pFSM->AddState( pNormalState );
m_pFSM->AddState( pTriggerState );
pNormalState->AddTransitState( pTriggerState, pOpCondition );
pTriggerState->AddTransitState( pNormalState, pNULLCondition );
m_pFSM->SetEntryState( pNormalState );
return CDnWorldActProp::Initialize( pParentSector, szPropName, vPos, vRotate, vScale );
}
void CDnWorldOperationProp::OnDispatchMessage( CDNUserSession *pSession, DWORD dwProtocol, BYTE *pPacket )
{
switch( dwProtocol ) {
case eProp::CS_CMDOPERATION:
{
if( false == IsShow() )
return;
#ifdef PRE_FIX_PROP_SHOW_BY_TRIGGER
if (IsVisible() == false)
return;
#else
#ifdef PRE_FIX_PROP_RANDOM_VISIBLE
if( false == m_bRandomResultIsVisible )
return;
#endif // #ifdef PRE_FIX_PROP_RANDOM_VISIBLE
#endif
CmdOperarionProp(pSession);
}
break;
};
CDnWorldActProp::OnDispatchMessage( pSession, dwProtocol, pPacket );
}
void CDnWorldOperationProp::OnSyncComplete( CDNUserSession* pBreakIntoGameSession )
{
if( !pBreakIntoGameSession || !pBreakIntoGameSession->GetActorHandle() )
return;
DiableActorManage( pBreakIntoGameSession->GetActorHandle(), m_bEnableOperator );
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &m_bEnableOperator, sizeof(bool) );
Send( eProp::SC_CMDENABLEOPERATOR, pBreakIntoGameSession->GetActorHandle(), &Stream );
CDnWorldActProp::OnSyncComplete( pBreakIntoGameSession );
}
void CDnWorldOperationProp::CmdEnableOperator( DnActorHandle hActor, bool bEnable )
{
m_bEnableOperator = bEnable;
DiableActorManage( hActor, bEnable );
BYTE pBuffer[128];
CPacketCompressStream Stream( pBuffer, 128 );
Stream.Write( &bEnable, sizeof(bool) );
Send( eProp::SC_CMDENABLEOPERATOR, hActor, &Stream );
}
void CDnWorldOperationProp::CmdOperarionProp(CDNUserSession * pSession)
{
#if !defined( PRE_TRIGGER_TEST )
if( std::find( m_hVecDisableActor.begin(), m_hVecDisableActor.end(), pSession->GetActorHandle() ) != m_hVecDisableActor.end() )
return;
#endif // #if defined( PRE_TRIGGER_TEST )
m_bIsOperated = true;
#if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
//<2F>ѹ<EFBFBD><D1B9><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƴ϶<C6B4><CFB6><EFBFBD> Ŭ<><C5AC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>
if( std::find( m_hVecClickActor.begin(), m_hVecClickActor.end(), pSession->GetActorHandle() ) == m_hVecClickActor.end() )
m_hVecClickActor.push_back(pSession->GetActorHandle());
#endif
// <20><><EFBFBD>ٷ<EFBFBD> <20><><EFBFBD>̽<EFBFBD>Ŵ. <20>޽<EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ؾ<EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD>ų<EFBFBD> <20>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ȴ<EFBFBD>.
// SetLastAccessActor( pSession->GetActorHandle() );
m_pTriggerActionState->AddFuncParam( "LastOperationActor", ( pSession->GetActorHandle() ) ? pSession->GetActorHandle()->GetUniqueID() : -1 );
m_pFSM->Process( 0, 0.0f );
//m_pFSM->ChangeState( m_pTriggerState, 0, 0.0f );
}
void CDnWorldOperationProp::DiableActorManage( DnActorHandle hActor, bool bEnable )
{
if( !hActor )
return;
if( bEnable ) {
DNVector(DnActorHandle)::iterator it = std::find( m_hVecDisableActor.begin(), m_hVecDisableActor.end(), hActor );
if( it == m_hVecDisableActor.end() ) return;
m_hVecDisableActor.erase( it );
}
else {
if( std::find( m_hVecDisableActor.begin(), m_hVecDisableActor.end(), hActor ) != m_hVecDisableActor.end() ) return;
m_hVecDisableActor.push_back( hActor );
}
}
#if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)
bool CDnWorldOperationProp::IsClickPropAndCheckUser(DnActorHandle hActor)
{
//<2F>ΰ<EFBFBD><CEB0≯<EFBFBD> ó<><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>
if(!hActor)
return true;
DNVector(DnActorHandle)::iterator iter = std::find( m_hVecDisableActor.begin(), m_hVecDisableActor.end(), hActor );
if( iter != m_hVecDisableActor.end() )
return true;
//Ŭ<><C5AC><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>޶<EFBFBD><DEB6><EFBFBD> <20><>û<EFBFBD>Ѱ<EFBFBD>. <20><><EFBFBD><EFBFBD>ó<EFBFBD><C3B3>
if( std::find( m_hVecClickActor.begin(), m_hVecClickActor.end(), hActor ) == m_hVecClickActor.end() )
return true;
//<2F><><EFBFBD><EFBFBD> <20>ȹ<EFBFBD><C8B9><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> üũ<C3BC><C5A9><EFBFBD>ش<EFBFBD>
m_hVecDisableActor.push_back( hActor );
return false;
}
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ADD_REWARD)