#include "stdafx.h" #include "ZoneControl.h" // #include #include // #include "WiseMapInfo.h" #include #include ////////////////////////////////////////////////////////////////////////// // ZoneControl::ZoneControl() { m_pUser = NULL; m_pGameZone = NULL; m_bMapPosCmdBlock = TRUE; m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_ARG_CLEAR] = _CMD_ZONE_ARG_CLEAR; m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_GET_CUR_INFO] = _CMD_ZONE_GET_CUR_INFO; m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_MOV_START] = _CMD_ZONE_MOV_START; m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_MOV_END] = _CMD_ZONE_MOV_END; m_ZONE_HANDLERS[eZONE_MOV_CMD::CMD_ZONE_CLEAR] = _CMD_ZONE_CLEAR; ZoneMoveCmd(eZONE_MOV_CMD::CMD_ZONE_CLEAR, NULL); m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_ARG_CLEAR] = _CMD_POS_ARG_CLEAR; m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_GET_CUR_INFO] = _CMD_POS_GET_CUR_INFO; m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_SET_CUR_INFO] = _CMD_POS_SET_CUR_INFO; m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_CALC_MOV_DIRECTION]= _CMD_POS_CALC_MOV_DIRECTION; m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_CALC_MOV_TARGET] = _CMD_POS_CALC_MOV_TARGET; m_POS_HANDLERS[eMAP_POS_CMD::CMD_POS_CLEAR] = _CMD_POS_CLEAR; MapPosCmd(eMAP_POS_CMD::CMD_POS_CLEAR, NULL); m_ZONE_CTRL_INFO.Clear(); } ZoneControl::~ZoneControl() { } ////////////////////////////////////////////////////////////////////////// // BOOL ZoneControl::ZoneMoveCmd(eZONE_MOV_CMD IN zCMD, sZONE_MOVINFO_ARG* IN OUT pARG) { if((DWORD)zCMD < eZONE_MOV_CMD::CMD_ZONE_MAX) return (this->*m_ZONE_HANDLERS[zCMD])(pARG); return FALSE; } BOOL ZoneControl::_CMD_ZONE_ARG_CLEAR(sZONE_MOVINFO_ARG* IN OUT pARG) { if(pARG) { ZeroMemory(pARG, sizeof(*pARG)); return TRUE; } return FALSE; } BOOL ZoneControl::_CMD_ZONE_GET_CUR_INFO(sZONE_MOVINFO_ARG* OUT pARG) { if(pARG) { CopyMemory(pARG, &m_ZONE_MOV_INFO, sizeof(*pARG)); return TRUE; } return FALSE; } // 1) _CMD_ZONE_GET_CUR_INFO // 2) À̵¿ÇÒ À§Ä¡ ¼³Á¤ // 3) _CMD_ZONE_MOV_START BOOL ZoneControl::_CMD_ZONE_MOV_START(sZONE_MOVINFO_ARG* IN pARG) { sZONE_MOVINFO_ARG& rINFO = m_ZONE_MOV_INFO; if(pARG && (pARG->ZONETYPE_CUR == rINFO.ZONETYPE_CUR)) { if(!_IsZoneTransaction()) { sZONE_MOVINFO_ARG& rARG = *pARG; rINFO.ZONETYPE_NEXT = rARG.ZONETYPE_NEXT; rINFO.FIELDCODE_NEXT = rARG.FIELDCODE_NEXT; _GetZoneStateByMoving(rINFO.ZONESTATE_CUR); if(ePRS_BEFORE_ENTER_ZONE != rINFO.ZONESTATE_CUR) { // NULLÀÌ ¾Æ´Ñ °æ¿ì Release ÇÊ¿äÇÒ µí ÇÏÁö¸¸ ÀÏ´Ü! // ±×¸®°í ¹Ù²ï °æ¿ì¿¡ ´ëÇÑ º¸¿ÏÃ¥Àº? m_pGameZone = ZoneManager::GetMap(rINFO.FIELDCODE_NEXT); return TRUE; } DEBUGGING_CODE_L1("UNEXPECTED ZONESTATE"); } } return FALSE; } BOOL ZoneControl::_CMD_ZONE_MOV_END(sZONE_MOVINFO_ARG* IN pARG) { sZONE_MOVINFO_ARG& rINFO = m_ZONE_MOV_INFO; if(_IsZoneTransaction()) { rINFO.ZONETYPE_CUR = rINFO.ZONETYPE_NEXT; rINFO.FIELDCODE_CUR = rINFO.FIELDCODE_NEXT; m_pGameZone->SetCurrentField(rINFO.FIELDCODE_CUR); _GetZoneStateByMoved(rINFO.ZONESTATE_CUR); if(ePRS_NOT_AT_ZONE != rINFO.ZONESTATE_CUR) return TRUE; DEBUGGING_CODE_L1("UNEXPECTED ZONESTATE"); } return FALSE; } BOOL ZoneControl::_CMD_ZONE_CLEAR(sZONE_MOVINFO_ARG* pARG) { sZONE_MOVINFO_ARG& rINFO = m_ZONE_MOV_INFO; rINFO.ZONETYPE_CUR = eZONETYPE_MAX; rINFO.FIELDCODE_CUR = 0; rINFO.ZONESTATE_CUR = ePRS_NOT_AT_ZONE; rINFO.ZONETYPE_NEXT = eZONETYPE_MAX; rINFO.FIELDCODE_NEXT = 0; return TRUE; } void ZoneControl::_GetZoneStateByMoving(eZONE_STATE& rzsSTATE) { sZONE_MOVINFO_ARG& rINFO = m_ZONE_MOV_INFO; eZONETYPE rZT = rINFO.ZONETYPE_NEXT; switch(rZT) { case eZONETYPE_LOBBY: rzsSTATE = ePRS_BEFORE_ENTER_LOBBY; break; case eZONETYPE_VILLAGE: rzsSTATE = ePRS_BEFORE_ENTER_VILLAGE; break; case eZONETYPE_CHARSELECT: rzsSTATE = ePRS_BEFORE_ENTER_CHARSELECT; rINFO.FIELDCODE_NEXT = 11001; break; case eZONETYPE_MISSION: rzsSTATE = ePRS_BEFORE_ENTER_MISSION; break; case eZONETYPE_HUNTING: rzsSTATE = ePRS_BEFORE_ENTER_HUNTING; break; //case eZONETYPE_QUEST: rzsSTATE = case eZONETYPE_PVP: rzsSTATE = ePRS_BEFORE_ENTER_PVP; break; //case eZONETYPE_EVENT: rzsSTATE = //case eZONETYPE_GUILD: rzsSTATE = //case eZONETYPE_SIEGE: rzsSTATE = case eZONETYPE_FIELD: rzsSTATE = ePRS_BEFORE_ENTER_FIELD; break; case eZONETYPE_CHUNTING: rzsSTATE = ePRS_BEFORE_ENTER_CHUNTING; break; case eZONETYPE_TUTORIAL_FIELD: rzsSTATE = ePRS_BEFORE_ENTER_FIELD; break; case eZONETYPE_INSTANCE: rzsSTATE = ePRS_BEFORE_ENTER_INSTNACE; break; default: rzsSTATE = ePRS_BEFORE_ENTER_ZONE; break; } } void ZoneControl::_GetZoneStateByMoved(eZONE_STATE& rzsSTATE) { sZONE_MOVINFO_ARG& rINFO = m_ZONE_MOV_INFO; eZONE_STATE rSTATE = rINFO.ZONESTATE_CUR; switch(rSTATE) { case ePRS_BEFORE_ENTER_LOBBY: rzsSTATE = ePRS_AT_LOBBY; break; case ePRS_BEFORE_ENTER_VILLAGE: rzsSTATE = ePRS_AT_VILLAGE; break; case ePRS_BEFORE_ENTER_CHARSELECT: rzsSTATE = ePRS_AT_CHARSELECT; break; case ePRS_BEFORE_ENTER_MISSION: rzsSTATE = ePRS_AT_MISSION; break; case ePRS_BEFORE_ENTER_HUNTING: rzsSTATE = ePRS_AT_HUNTING; break; //cas rzsSTATE = case ePRS_BEFORE_ENTER_PVP: rzsSTATE = ePRS_AT_PVP; break; //cas rzsSTATE = //cas rzsSTATE = //cas rzsSTATE = case ePRS_BEFORE_ENTER_FIELD: rzsSTATE = ePRS_AT_FIELD; break; case ePRS_BEFORE_ENTER_CHUNTING: rzsSTATE = ePRS_AT_CHUNTING; break; case ePRS_BEFORE_ENTER_INSTNACE: rzsSTATE = ePRS_AT_INSTANCE; break; default: rzsSTATE = ePRS_NOT_AT_ZONE; break; } } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// BOOL ZoneControl::MapPosCmd(eMAP_POS_CMD IN zCMD, sMAP_POS_ARG* IN OUT pARG) { if((DWORD)zCMD < eMAP_POS_CMD::CMD_POS_MAX) return (this->*m_POS_HANDLERS[zCMD])(pARG); return FALSE; } BOOL ZoneControl::_CMD_POS_ARG_CLEAR(sMAP_POS_ARG* IN pARG) { if(pARG) { ZeroMemory(pARG, sizeof(*pARG)); return TRUE; } return FALSE; } BOOL ZoneControl::_CMD_POS_GET_CUR_INFO(sMAP_POS_ARG* OUT pARG) { if(pARG) { CopyMemory(pARG, &m_MAP_POS_INFO, sizeof(*pARG)); return TRUE; } return FALSE; } BOOL ZoneControl::_CMD_POS_SET_CUR_INFO(sMAP_POS_ARG* IN pARG) { if((!m_bMapPosCmdBlock) && pARG) { CopyMemory(&m_MAP_POS_INFO, pARG, sizeof(*pARG)); return TRUE; } return FALSE; } BOOL ZoneControl::_CMD_POS_CALC_MOV_DIRECTION(sMAP_POS_ARG* IN pARG) { return FALSE; } BOOL ZoneControl::_CMD_POS_CALC_MOV_TARGET(sMAP_POS_ARG* IN pARG) { return FALSE; } BOOL ZoneControl::_CMD_POS_CLEAR(sMAP_POS_ARG* IN pARG) { return FALSE; }