#pragma once //================================================================================================== // < class SSQMsgRouterInAgent; //================================================================================================== // // // // - 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 { 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 { 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 { static const eSTATE value = USR_PORTAL_OBJECT_CREATED; static const DWORD timeout = 50 * second; struct sInfo { POSTYPE m_PosOfItem; } INFO; }; template<> struct State { static const eSTATE value = USR_PORTAL_TRANSACTION; static const DWORD timeout = 10 * minute; // Áß°£¿¡ Á¦°ÅµÇÁö ¾Êµµ·Ï Àå½Ã°£ °Ç´Ù. struct sInfo { POSTYPE m_PosOfItem; } INFO; }; template<> struct State { static const eSTATE value = USR_ENTERING_SSQ_FIELD; static const DWORD timeout = 5 * minute; struct sInfo { } INFO; }; template<> struct State { static const eSTATE value = USR_ENTERED_SSQ_FIELD; // proc-handler (DungeonSSQ) struct sInfo { } INFO; }; template<> struct State { static const eSTATE value = USR_ENTERED_ON_DEAD; static const DWORD timeout = 5 * second; struct sInfo { POSTYPE m_PosOfItem; } INFO; }; template<> struct State { static const eSTATE value = USR_LEAVED_SSQ_FIELD; // proc-handler (DungeonSSQ) struct sInfo { } INFO; }; template<> struct State { static const eSTATE value = USR_PORTAL_FAILED; struct sInfo { } INFO; }; template<> struct State { static const eSTATE value = USR_CLEAR_INFO; struct sInfo { } INFO; }; ISSQHandler(); ~ISSQHandler(); //---------------------------------------------------------------------------------------------- // inline eSTATE CurrentState() { return m_eState; } //template< eSTATE state > //BOOLEAN ChangeStatus(const State& state_info); BOOLEAN ChangeStatus(const State& state_info); BOOLEAN ChangeStatus(const State& state_info); BOOLEAN ChangeStatus(const State& state_info); BOOLEAN ChangeStatus(const State& state_info); BOOLEAN ChangeStatus(const State& state_info); BOOLEAN ChangeStatus(const State& state_info); BOOLEAN ChangeStatus(const State& state_info); BOOLEAN ChangeStatus(const State& state_info); BOOLEAN ChangeStatus(const State& state_info); //BOOLEAN ChangeStatus(const State& 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::sInfo m_FLD_USR_INFO; union { State::sInfo FLD_PORTAL_OBJECT; State::sInfo FLD_PORTAL_TRANS; State::sInfo FLD_SSQ_FIELD_ENTTRANS; State::sInfo FLD_SSQ_FIELD; State::sInfo FLD_SSQ_FIELD_LEAVED; State::sInfo FLD_ON_DEAD; State::sInfo FLD_PORTAL_FAIL; State::sInfo FLD_CLEAR_INFO; } m_Dup; };