#include "stdafx.h" #include #include #include #include #include #include #include #include #include #include #include "ISSQHandler.h" #include "SSQControlInfos.hxx" #include "SSQUpdateCtrl.hxx" #include "SSQPacketProcess.hxx" #include "SSQControlManagerImpl.hxx" //================================================================================================== // // ISSQHandler::ISSQHandler() : m_eState(ISSQHandler::USR_NONE_STATE) { m_Timer.Disabled(); ZeroMemory(&m_FLD_USR_INFO, sizeof(m_FLD_USR_INFO)); ClearDupInfo(); } ISSQHandler::~ISSQHandler() { } //template< ISSQHandler::eSTATE state > //BOOLEAN //ISSQHandler::ChangeStatus(const State& state_info) //{ // return FALSE; //} BOOLEAN ISSQHandler::ChangeStatus(const State& state_info) { m_eState = state_info.value; m_Timer.Disabled(); m_FLD_USR_INFO.m_pUser = 0; m_FLD_USR_INFO.m_IsPlayer = state_info.INFO.m_IsPlayer; m_FLD_USR_INFO.m_ObjectKey = state_info.INFO.m_ObjectKey; m_FLD_USR_INFO.m_MsgRouter = state_info.INFO.m_MsgRouter; return TRUE; } BOOLEAN ISSQHandler::ChangeStatus(const State& state_info) { m_eState = state_info.value; m_Timer.SetNextTimeoutByCurTickBased(state_info.timeout); m_FLD_USR_INFO = state_info.INFO; //_NA_20110630_BATTLE_ZONE_RENEWAL WAVERIX_DEBUG_CODE( SUNLOG(eCRITICAL_LOG, "[USR_REGISTERED_SSQ_INDEXER] - timeout %u", state_info.timeout); ); return TRUE; } BOOLEAN ISSQHandler::ChangeStatus(const State& state_info) { m_eState = state_info.value; m_Timer.SetNextTimeoutByCurTickBased(state_info.timeout); m_Dup.FLD_PORTAL_OBJECT = state_info.INFO; WAVERIX_DEBUG_CODE( SUNLOG(eCRITICAL_LOG, "[USR_PORTAL_OBJECT_CREATED] - timeout %u", state_info.timeout); ); return TRUE; } BOOLEAN ISSQHandler::ChangeStatus(const State& state_info) { m_eState = state_info.value; m_Timer.SetNextTimeoutByCurTickBased(state_info.timeout); m_Dup.FLD_PORTAL_TRANS = state_info.INFO; WAVERIX_DEBUG_CODE( SUNLOG(eCRITICAL_LOG, "[USR_PORTAL_TRANSACTION] - timeout %u", state_info.timeout); ); return TRUE; } BOOLEAN ISSQHandler::ChangeStatus(const State& state_info) { ASSERT(USR_PORTAL_TRANSACTION == m_eState); User* const pUser = m_FLD_USR_INFO.m_pUser; //_NA_20110630_BATTLE_ZONE_RENEWAL m_eState = state_info.value; m_Timer.SetNextTimeoutByCurTickBased(state_info.timeout); m_Dup.FLD_SSQ_FIELD_ENTTRANS = state_info.INFO; WAVERIX_DEBUG_CODE( SUNLOG(eCRITICAL_LOG, "[USR_ENTERING_SSQ_FIELD] - timeout %u", state_info.timeout); ); return TRUE; } BOOLEAN ISSQHandler::ChangeStatus(const State& state_info) { ////////////////////////////////////////////////////////////////////////// // »õ·Î¿î »óŸ¦ À§ÇÑ Á¤º¸ ¼³Á¤ m_eState = state_info.value; m_Timer.Disabled(); m_Dup.FLD_SSQ_FIELD = state_info.INFO; WAVERIX_DEBUG_CODE( SUNLOG(eCRITICAL_LOG, "[USR_ENTERED_SSQ_FIELD] - timeout X"); ); return TRUE; } BOOLEAN ISSQHandler::ChangeStatus(const State& state_info) { //WAVERIX_SSQ_PORTAL_TRANSACTION_MODIFY ////////////////////////////////////////////////////////////////////////// // »õ·Î¿î »óŸ¦ À§ÇÑ Á¤º¸ ¼³Á¤ m_eState = state_info.value; m_Timer.Instance(); m_Dup.FLD_SSQ_FIELD_LEAVED = state_info.INFO; WAVERIX_DEBUG_CODE( SUNLOG(eCRITICAL_LOG, "[USR_LEAVED_SSQ_FIELD] - timeout X"); ); return TRUE; } BOOLEAN ISSQHandler::ChangeStatus(const State& state_info) { m_eState = state_info.value; m_Timer.SetNextTimeoutByCurTickBased(state_info.timeout); m_Dup.FLD_ON_DEAD = state_info.INFO; WAVERIX_DEBUG_CODE( SUNLOG(eCRITICAL_LOG, "["__FUNCTION__"] - timeout %u", state_info.timeout); ); return TRUE; } BOOLEAN ISSQHandler::ChangeStatus(const State& state_info) { switch(m_eState) { case USR_NONE_STATE: case MONSTER_STATE: break; case USR_REGISTERED_SSQ_INDEXER: case USR_PORTAL_OBJECT_CREATED: case USR_PORTAL_TRANSACTION: { User* const pUser = m_FLD_USR_INFO.m_pUser; const POSTYPE posOfItem = pUser->GetLockItemPosForInstanceDungeon(); if(INVALID_POSTYPE_VALUE != posOfItem) { MSG_AG_ITEM_UNLOCK_CMD msg; msg.m_ItemIndex = SI_INVENTORY; msg.m_ItemPos = m_FLD_USR_INFO.m_PosOfItem; // (f100528.2L) prevent a locked state // after an instance dungeon moving transaction failed msg.post_action_ = msg.eAction_MoveFailed; pUser->SendToLinkedServer(&msg, sizeof(msg)); pUser->SetLockItemPosForInstanceDungeon(INVALID_POSTYPE_VALUE); } switch(m_eState) { case USR_PORTAL_OBJECT_CREATED: case USR_PORTAL_TRANSACTION: { WAR_MSG_SINGLE_ASSEMBLER_SSQ_INFO_BRD< MSGSUB_SSQ_PROTOCOL_NOTICE_1TO1_PORTAL_CLOSED > assembler; assembler.Completion(); assembler.SendPacket(pUser); } break; } } break; case USR_ENTERING_SSQ_FIELD: case USR_ENTERED_SSQ_FIELD: case USR_CLEAR_INFO: case USR_LEAVED_SSQ_FIELD: break; }; // (WAVERIX) (090421) (BUG-FIX) ChangeStateÀε¥, »óÅ º¯°æÀÌ ¾ÈµÇ°í ÀÖÀ½. m_eState = state_info.value; return TRUE; } BOOLEAN ISSQHandler::IsPreparedReqTransaction() { if(USR_REGISTERED_SSQ_INDEXER == m_eState) { return !m_Timer.IsExpired(); } return FALSE; } BOOLEAN ISSQHandler::IsWarpObjectAlived() { if(USR_PORTAL_OBJECT_CREATED == m_eState) { return !m_Timer.IsExpired(); } return FALSE; } BOOLEAN ISSQHandler::IsWarpTransaction() { if(USR_PORTAL_TRANSACTION == m_eState) { return !m_Timer.IsExpired(); } return FALSE; } BOOLEAN ISSQHandler::Update() { switch(m_eState) { case USR_NONE_STATE: return UPDATE_FAIL; case MONSTER_STATE: return UPDATE_SUCCESS; case USR_REGISTERED_SSQ_INDEXER: { const BOOLEAN isClosed = !!m_Timer.IsExpired(); //!IsPreparedReqTransaction(); if(isClosed) { // Serializing SSQInfo to client WAVERIX_DEBUG_CODE( SUNLOG(eCRITICAL_LOG, "USR_REGISTERED_SSQ_INDEXER - closed\n"); ); } return isClosed ? UPDATE_FAIL : UPDATE_SUCCESS; } break; case USR_PORTAL_OBJECT_CREATED: { const BOOLEAN isClosed = !!m_Timer.IsExpired(); // !IsWarpObjectAlived(); if(isClosed) { // Serializing SSQInfo to client WAVERIX_DEBUG_CODE( SUNLOG(eCRITICAL_LOG, "USR_PORTAL_OBJECT_CREATED - closed\n"); ); } return isClosed ? UPDATE_FAIL : UPDATE_SUCCESS; }; break; case USR_PORTAL_TRANSACTION: { const BOOLEAN isClosed = !!m_Timer.IsExpired(); // !IsWarpTransaction(); if(isClosed) { // Serializing SSQInfo to client WAVERIX_DEBUG_CODE( SUNLOG(eCRITICAL_LOG, "USR_PORTAL_TRANSACTION - closed\n"); ); } return isClosed ? UPDATE_FAIL : UPDATE_SUCCESS; }; break; case USR_ENTERING_SSQ_FIELD: return UPDATE_SUCCESS; // ½Ã°£ Á¦¾î´Â Á»´õ °í¹ÎÇØº¸ÀÚ. case USR_ENTERED_SSQ_FIELD: return UPDATE_SUCCESS; // ´Ù¸¥ Á¦¾î°¡ µé¾î°¥ ¶§±îÁö ÀÏ´Ü ¼º°øÀ¸·Î ¹ÝȯÇÏÀÚ. case USR_PORTAL_FAILED: case USR_LEAVED_SSQ_FIELD: return UPDATE_FAIL; case USR_CLEAR_INFO: break; default: ASSERT(!"Invalid Tag"); break; }; return UPDATE_FAIL; } VOID ISSQHandler::Release() // Update½ÇÆÐ½Ã ÀÌ ·çƾÀ» ¸ÕÀú È£ÃâÇØ ÁØ´Ù. { ChangeStatus(State()); }