118 lines
4.1 KiB
C++
118 lines
4.1 KiB
C++
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Crytek Network source code
|
|
//
|
|
// File: ServerStateMachine.h
|
|
// Description:
|
|
//
|
|
// History:
|
|
// -08/25/2001: Alberto Demichelis, created
|
|
// -01/26/2003: Martin Mittring, commented the stated
|
|
//
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#ifndef _SERVER_STATE_MACHINE_H_
|
|
#define _SERVER_STATE_MACHINE_H_
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
#include <platform.h>
|
|
#include "StateMachine.h"
|
|
#include "Interfaces.h"
|
|
|
|
#define STATUS_SRV_WAIT_FOR_CONNECT_RESP STATUS_BASE+1
|
|
#define STATUS_SRV_CONNECTED STATUS_BASE+2
|
|
#define STATUS_SRV_WAIT_FOR_CONTEXT_READY STATUS_BASE+3
|
|
#define STATUS_SRV_READY STATUS_BASE+4
|
|
#define STATUS_SRV_DISCONNECTED STATUS_BASE+5
|
|
|
|
//in signals
|
|
#define SIG_SRV_START SIGNAL_BASE+1
|
|
#define SIG_SRV_SETUP SIGNAL_BASE+2
|
|
#define SIG_SRV_CONNECT_RESP SIGNAL_BASE+3
|
|
#define SIG_SRV_CONTEXT_SETUP SIGNAL_BASE+4
|
|
#define SIG_SRV_CONTEXT_READY SIGNAL_BASE+5
|
|
#define SIG_SRV_DISCONNECT SIGNAL_BASE+6
|
|
#define SIG_SRV_ACTIVE_DISCONNECT SIGNAL_BASE+7
|
|
//out signals
|
|
#define SIG_SRV_SEND_CONNECT SIGNAL_BASE+8
|
|
#define SIG_SRV_SEND_DISCONNECT SIGNAL_BASE+9
|
|
#define SIG_SRV_SEND_CONTEXT_SETUP SIGNAL_BASE+10
|
|
#define SIG_SRV_NOTIFY_CONTEXT_READY SIGNAL_BASE+12
|
|
#define SIG_SRV_CONNECTED SIGNAL_BASE+13
|
|
#define SIG_SRV_DISCONNECTED SIGNAL_BASE+14
|
|
|
|
|
|
#define TM_CONNECT_RESP TIMER_BASE+1
|
|
|
|
#ifdef _DEBUG
|
|
#define TM_CONNECT_RESP_ET 200000
|
|
#else
|
|
#define TM_CONNECT_RESP_ET 20000
|
|
#endif
|
|
|
|
#define TM_CONTEXT_READY TIMER_BASE+2
|
|
#define TM_CONTEXT_READY_ET (5*60*1000) // 5 min to load the map
|
|
|
|
|
|
|
|
class CServerStateMachine :public CStateMachine
|
|
{
|
|
BEGIN_STATUS_MAP()
|
|
STATUS_ENTRY(STATUS_IDLE,HandleIDLE)
|
|
// goes to the next state when getting the CCPSetup packet (PlayerPassword,ProtocolVersion) from the client
|
|
// or to STATUS_SRV_DISCONNECTED when the version doesn't match
|
|
|
|
STATUS_ENTRY(STATUS_SRV_WAIT_FOR_CONNECT_RESP,HandleWAIT_FOR_CONNECT_RESP)
|
|
// goes to the next state when getting the CCPConnectResp packet (AuthorizationID) from the client
|
|
|
|
STATUS_ENTRY(STATUS_SRV_CONNECTED,HandleCONNECTED)
|
|
// goes to the next state when the authorization is ok
|
|
|
|
STATUS_ENTRY(STATUS_SRV_WAIT_FOR_CONTEXT_READY,HandleWAIT_FOR_CONTEXT_READY)
|
|
// the client is currently loading the map and we wait
|
|
// when getting the CCPContextReady packet (bHost,p_name,p_model) from the client
|
|
// we sends all entities to the client (CXServerSlot::OnContextReady) and go to the next state
|
|
|
|
STATUS_ENTRY(STATUS_SRV_READY,HandleREADY)
|
|
// goes back to STATUS_SRV_WAIT_FOR_CONTEXT_READY when CServerSlot::ContextSetup() was called
|
|
// to change the map/mod and sync the server variables once again
|
|
|
|
STATUS_ENTRY(STATUS_SRV_DISCONNECTED,HandleDISCONNECTED)
|
|
// when going in this state send the SIG_DISCONNECTED signal and the system will remove the client soon
|
|
|
|
END_STATUS_MAP()
|
|
|
|
public: // ---------------------------------------------------------------------
|
|
|
|
//! constructor
|
|
CServerStateMachine();
|
|
//! destructor
|
|
virtual ~CServerStateMachine();
|
|
//!
|
|
void Init(_IServerSlotServices *pParent);
|
|
|
|
private: // ---------------------------------------------------------------------
|
|
|
|
//status handlers
|
|
void HandleIDLE(unsigned int dwIncomingSignal,DWORD_PTR dwParam);
|
|
void HandleWAIT_FOR_CONNECT_RESP(unsigned int dwIncomingSignal,DWORD_PTR dwParam);
|
|
void HandleCONNECTED(unsigned int dwIncomingSignal,DWORD_PTR dwParam);
|
|
void HandleWAIT_FOR_CONTEXT_READY(unsigned int dwIncomingSignal,DWORD_PTR dwParam);
|
|
void HandleREADY(unsigned int dwIncomingSignal,DWORD_PTR dwParam);
|
|
void HandleDISCONNECTED(unsigned int dwIncomingSignal,DWORD_PTR dwParam);
|
|
|
|
void OnSignal(unsigned int dwOutgoingSignal,DWORD_PTR dwParam);
|
|
|
|
//tracing
|
|
void _Trace(char *s);
|
|
void _TraceStatus(unsigned int dwStatus);
|
|
|
|
_IServerSlotServices * m_pParent; //!< pointer to the parent object (is not released), is 0 is you forgot to call Init()
|
|
};
|
|
|
|
#endif //_SERVER_STATE_MACHINE_H_
|