Files
2022-10-26 12:25:11 +08:00

188 lines
5.4 KiB
C++

#pragma once
#include "VMOp.Type.h"
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//
// enum eMOLASIG_TYPE
// {
// SIGMSG_NORMAL = 0x4400
// };
//
// struct eMOLASIG_MSG
// {
// eMOLASIG_TYPE _TYPE;
// };
//
#pragma pack(push, 1)
struct SIGMSG
{
// MOLA_RCG_T1_xxx
static const eMOLASIG_TYPE CONTROL_STOP = (eMOLASIG_TYPE)MOLA_RCG_T1_020;
static const eMOLASIG_TYPE CONTROL_START = (eMOLASIG_TYPE)MOLA_RCG_T1_021;
static const eMOLASIG_TYPE NOTIFY_HEARTBEAT = (eMOLASIG_TYPE)MOLA_RCG_T1_023;
static const eMOLASIG_TYPE NETWORK_MSG_RECVED = (eMOLASIG_TYPE)MOLA_RCG_T1_024;
static const eMOLASIG_TYPE NETWORK_MSG_SENDING = (eMOLASIG_TYPE)MOLA_RCG_T1_025;
static const eMOLASIG_TYPE NOTIFY_WORKNODE = (eMOLASIG_TYPE)MOLA_RCG_T1_026;
};
struct sSIG_CONTROL_START : eMOLASIG_MSG
{
sSIG_CONTROL_START()
{
_TYPE = SIGMSG::CONTROL_START;
}
};
struct sSIG_CONTROL_STOP : eMOLASIG_MSG
{
sSIG_CONTROL_STOP()
{
_TYPE = SIGMSG::CONTROL_STOP;
}
};
struct sSIG_NOTIFY_HEARTBEAT : eMOLASIG_MSG
{
sSIG_NOTIFY_HEARTBEAT( DWORD dwCount ) : m_dwCount(dwCount)
{
_TYPE = SIGMSG::NOTIFY_HEARTBEAT;
}
DWORD m_dwCount;
};
struct sSIG_NETWORK_NTF : eMOLASIG_MSG
{
sSIG_NETWORK_NTF( eMOLASIG_TYPE sigMSG, MSG_BASE* pMSG, WORD wSIZE ) : m_pMSG(pMSG), m_wSIZE(wSIZE)
{
_TYPE = sigMSG;
}
MSG_BASE* m_pMSG;
WORD m_wSIZE;
};
struct sSIG_NETWORK_RECVED_NTF : sSIG_NETWORK_NTF
{
sSIG_NETWORK_RECVED_NTF( MSG_BASE* pMSG ) : sSIG_NETWORK_NTF(SIGMSG::NETWORK_MSG_RECVED, pMSG, 0) {}
};
struct sSIG_NETWORK_SENDING_NTF : sSIG_NETWORK_NTF
{
sSIG_NETWORK_SENDING_NTF( MSG_BASE* pMSG, WORD wSIZE ) : sSIG_NETWORK_NTF(SIGMSG::NETWORK_MSG_SENDING, pMSG, wSIZE) {}
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// IWzASM CmdBlock
struct sCONTROL_INFORMATION
{
BYTE TRANSACTION_SENDING_PACKET; // 패킷 전송할 것이 있는 경우, LOCK 용
BYTE ENABLE_SEND_PACKET; // 패킷 전송이 가능한지 여부
BYTE IS_CONNECTED_WITH_GAMESERVER; // 게임서버와 접속 여부
BYTE LOCATED_BATTLESCENE; // Client입장에서 BattleScene에 속해있는지의 여부
DWORD MSGROUNDKEYforSENDING; // 메시지 전송시 첨부되는 키
BYTE* MSGforSENDING; // 보낼수 있는 경우 보낼 패킷 포인터
WORD MSGSZforSENDING; // 보낼수 있는 경우 보낼 패킷 크기
};
#pragma pack(pop)
class VMOpCPU;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <IVMOpGenerater>
class IVMOpGenerater : public IVMOp
{
public: static const DWORD SECOND = 1000;
static const DWORD MINUTE = 60*SECOND;
static const DWORD INTERVAL_MOLA_HEARTBEAT = 1*SECOND; // 패킷을 보낼 수 있는 시점에 한번 패킷을 전송한다.
public: IVMOpGenerater();
~IVMOpGenerater();
virtual BOOL DoInit();
virtual BOOL DoProcess();
virtual BOOL IsComplete();
virtual BOOL DoRelease();
// Control Interface
virtual VOID OnMsg( eMOLASIG_MSG* pSIG_MSG );
public: inline BOOL& Enabled() { return m_bEnabled; }
inline DWORD GetUpdateCount() { return m_dwUpdateCount; }
public: // <FIELDs>
BOOL m_bEnabled; // DoProcess 수행여부
ITimeout m_UpdateInterval; // 매 1초의 Heartbeat
DWORD m_dwUpdateLoopCount; // DoProcess 호출 수
DWORD m_dwUpdateCount; // Timeout 만족수
WzASM_EIP* m_SetNextStartAction;
WzASM_EIP* m_SetEnable; //
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <IVMOpScheduler>
class IVMOpScheduler : public IVMOp
{
public: static const DWORD SECOND = 1000;
static const DWORD MINUTE = 60*SECOND;
static const DWORD INTERVAL_CHECKER = 3*SECOND;
static const DWORD INTERVAL_SEND_DELAY = 5*SECOND;
static const DWORD INTERVAL_MOLA_HEARTBEAT = 1*MINUTE; // 패킷을 보낼 수 있는 시점에 한번 패킷을 전송한다.
public: IVMOpScheduler();
~IVMOpScheduler();
virtual BOOL DoInit();
virtual BOOL DoProcess();
virtual BOOL IsComplete();
virtual BOOL DoRelease();
// Control Interface
virtual VOID OnMsg( eMOLASIG_MSG* pSIG_MSG );
public: inline BOOL& Enabled() { return m_bEnabled; }
public: static uREG_PV HANDLER_IBF_MakeSendRoundKey( uREG_NODE* pNODE ); // 한번 보낼 때마다 갱신되는 값
static uREG_PV HANDLER_IBF_VerifyObject( uREG_NODE* pNODE ); // 오브젝트 무결성 검사
public: // <FIELDs>
BOOL m_bEnabled; // DoProcess 수행여부
ITimeout m_CheckInterval; // 이 루틴이 검사를 시작하는 시점
ITimeout m_SendIntervalBySendMsg; // 메시지 전송이 필요할 경우
WzASM_EIP* m_EIPCheckInterval;
WzASM_EIP* m_EIPSendIntervalBySendMsg;
sCONTROL_INFORMATION* m_pCONTROL_INFO; // 패킷 컨트롤 정보
struct {
DWORD m_dwHBLastedUpdateTick; // 가장 최근에 갱신된 틱
DWORD m_dwHBIncreaseCount; // 갱신된 회수
DWORD m_dwHBRandomKey; // 갱신된 랜덤키
};
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <IVMOpPPU> - Passive Processor Unit
class IVMOpPPU : public IVMOp
{
public: IVMOpPPU();
~IVMOpPPU();
virtual BOOL DoInit();
virtual BOOL DoProcess();
virtual BOOL IsComplete();
virtual BOOL DoRelease();
// Control Interface
virtual VOID OnMsg( eMOLASIG_MSG* pSIG_MSG );
public: inline BOOL& Enabled() { return m_bEnabled; }
public: // <FIELDs>
BOOL m_bEnabled; // DoProcess 수행여부
};