Files
Sun1602/Server/AgentServer/Zone/SSQ/ISSQHandler.h
T
2022-10-26 12:25:11 +08:00

195 lines
6.8 KiB
C++

#pragma once
//==================================================================================================
// <
class SSQMsgRouterInAgent;
//==================================================================================================
// <ISSQHandler>
//
// <Objective>
// - Warp Step : timeout 1minute
// - blah~
//
class ISSQHandler
{
public:
static const DWORD second = 1000;
static const DWORD minute = 60 * second;
static const BOOLEAN UPDATE_SUCCESS = TRUE;
static const BOOLEAN UPDATE_FAIL = FALSE;
enum eSTATE {
USR_NONE_STATE ,
MONSTER_STATE , // Monster 공간
USR_REGISTERED_SSQ_INDEXER , // CG_ZONE_EX_SSQ_JOIN_INFO_SYN 수신시
USR_PORTAL_OBJECT_CREATED , // AG_ZONE_SSQ_JOIN_INFO_ACK 수신후 Warp 가능 설정
USR_PORTAL_TRANSACTION , // CG_ZONE_EX_SSQ_JOIN_SYN 이후 CG_ZONE_EX_SSQ_JOIN_ACK까지.
USR_ENTERING_SSQ_FIELD , // AG_SYNC_PLAYER_ACK -> On_enteruser 발동시 -> 이후 entered이며, zone::users
USR_ENTERED_SSQ_FIELD , // CG_ZONE_EX_SSQ_JOIN_SYN 수신시
USR_ENTERED_ON_DEAD , // Player사망시
USR_LEAVED_SSQ_FIELD , // SSQ FIELD에서 빠져나갔을 경우,
USR_PORTAL_FAILED , // 포탈 통한 입장 실패(timeout, etc...)
USR_CLEAR_INFO , // 여러 가지 이유로 SSQ존에서 빠져나갔을 때... 좀더 생각하고 적용하기로 한다.
};
template< eSTATE state > struct State {
static const eSTATE value = state;
};
template<> struct State<MONSTER_STATE>
{
static const eSTATE value = MONSTER_STATE;
//static const DWORD timeout = 10 * second;
struct sInfo {
//PVOID m_pObject;
BOOLEAN m_IsPlayer;
DWORD m_ObjectKey;
const SSQMsgRouterInAgent* m_MsgRouter;
} INFO;
State(const BYTE objectKey, const SSQMsgRouterInAgent* pRouter)
{
//INFO.m_pObject = pUser;
INFO.m_IsPlayer = FALSE;
INFO.m_ObjectKey = objectKey;
INFO.m_MsgRouter = pRouter;
}
};
template<> struct State<USR_REGISTERED_SSQ_INDEXER>
{
static const eSTATE value = USR_REGISTERED_SSQ_INDEXER;
static const DWORD timeout = 10 * second;
struct sInfo {
User* m_pUser;
BOOLEAN m_IsPlayer;
DWORD m_ObjectKey;
const SSQMsgRouterInAgent* m_MsgRouter;
POSTYPE m_PosOfItem;
SLOTCODE m_ItemCode;
} INFO;
State(User* const pUser, const DWORD objectKey, const SSQMsgRouterInAgent* pRouter,
const POSTYPE posOfItem)
{
INFO.m_pUser = pUser;
INFO.m_IsPlayer = TRUE;
INFO.m_ObjectKey = objectKey;
INFO.m_MsgRouter = pRouter;
INFO.m_PosOfItem = posOfItem;
INFO.m_ItemCode = 0; // 나중에 게임서버 응답을 받고 그 정보로 설정된다.
}
};
template<> struct State<USR_PORTAL_OBJECT_CREATED>
{
static const eSTATE value = USR_PORTAL_OBJECT_CREATED;
static const DWORD timeout = 50 * second;
struct sInfo {
POSTYPE m_PosOfItem;
} INFO;
};
template<> struct State<USR_PORTAL_TRANSACTION>
{
static const eSTATE value = USR_PORTAL_TRANSACTION;
static const DWORD timeout = 10 * minute; // 중간에 제거되지 않도록 장시간 건다.
struct sInfo {
POSTYPE m_PosOfItem;
} INFO;
};
template<> struct State<USR_ENTERING_SSQ_FIELD>
{
static const eSTATE value = USR_ENTERING_SSQ_FIELD;
static const DWORD timeout = 5 * minute;
struct sInfo {
} INFO;
};
template<> struct State<USR_ENTERED_SSQ_FIELD>
{
static const eSTATE value = USR_ENTERED_SSQ_FIELD; // proc-handler (DungeonSSQ)
struct sInfo {
} INFO;
};
template<> struct State<USR_ENTERED_ON_DEAD>
{
static const eSTATE value = USR_ENTERED_ON_DEAD;
static const DWORD timeout = 5 * second;
struct sInfo {
POSTYPE m_PosOfItem;
} INFO;
};
template<> struct State<USR_LEAVED_SSQ_FIELD>
{
static const eSTATE value = USR_LEAVED_SSQ_FIELD; // proc-handler (DungeonSSQ)
struct sInfo {
} INFO;
};
template<> struct State<USR_PORTAL_FAILED>
{
static const eSTATE value = USR_PORTAL_FAILED;
struct sInfo {
} INFO;
};
template<> struct State<USR_CLEAR_INFO>
{
static const eSTATE value = USR_CLEAR_INFO;
struct sInfo {
} INFO;
};
ISSQHandler();
~ISSQHandler();
//----------------------------------------------------------------------------------------------
// <INTERFACEs>
inline eSTATE CurrentState() { return m_eState; }
//template< eSTATE state >
//BOOLEAN ChangeStatus(const State<state>& state_info);
BOOLEAN ChangeStatus(const State<MONSTER_STATE>& state_info);
BOOLEAN ChangeStatus(const State<USR_REGISTERED_SSQ_INDEXER>& state_info);
BOOLEAN ChangeStatus(const State<USR_PORTAL_OBJECT_CREATED>& state_info);
BOOLEAN ChangeStatus(const State<USR_PORTAL_TRANSACTION>& state_info);
BOOLEAN ChangeStatus(const State<USR_ENTERING_SSQ_FIELD>& state_info);
BOOLEAN ChangeStatus(const State<USR_ENTERED_SSQ_FIELD>& state_info);
BOOLEAN ChangeStatus(const State<USR_LEAVED_SSQ_FIELD>& state_info);
BOOLEAN ChangeStatus(const State<USR_ENTERED_ON_DEAD>& state_info);
BOOLEAN ChangeStatus(const State<USR_PORTAL_FAILED>& state_info);
//BOOLEAN ChangeStatus(const State<USR_CLEAR_INFO>& state_info);
inline BOOLEAN IsUserObject() const { return m_FLD_USR_INFO.m_IsPlayer; }
BOOLEAN IsPreparedReqTransaction();
BOOLEAN IsWarpObjectAlived();
BOOLEAN IsWarpTransaction();
inline VOID SetUsedItemCode(const SLOTCODE itemCode) { m_FLD_USR_INFO.m_ItemCode = itemCode; }
inline SLOTCODE GetUsedItemCode() const { return m_FLD_USR_INFO.m_ItemCode; }
BOOLEAN Update(); // FALSE면 제거
VOID Release(); // Update실패시 이 루틴을 먼저 호출해 준다.
private:
inline VOID ClearDupInfo() { ZeroMemory(&m_Dup, sizeof(m_Dup)); }
eSTATE m_eState;
ITimeout m_Timer; // Shared Function by State
State<USR_REGISTERED_SSQ_INDEXER>::sInfo m_FLD_USR_INFO;
union {
State<USR_PORTAL_OBJECT_CREATED>::sInfo FLD_PORTAL_OBJECT;
State<USR_PORTAL_TRANSACTION>::sInfo FLD_PORTAL_TRANS;
State<USR_ENTERING_SSQ_FIELD>::sInfo FLD_SSQ_FIELD_ENTTRANS;
State<USR_ENTERED_SSQ_FIELD>::sInfo FLD_SSQ_FIELD;
State<USR_LEAVED_SSQ_FIELD>::sInfo FLD_SSQ_FIELD_LEAVED;
State<USR_ENTERED_ON_DEAD>::sInfo FLD_ON_DEAD;
State<USR_PORTAL_FAILED>::sInfo FLD_PORTAL_FAIL;
State<USR_CLEAR_INFO>::sInfo FLD_CLEAR_INFO;
} m_Dup;
};