259 lines
6.7 KiB
C++
259 lines
6.7 KiB
C++
#include "stdafx.h"
|
|
#include "ZoneControl.h"
|
|
|
|
//
|
|
#include <SinTable.h>
|
|
#include <SCPlayer.h>
|
|
//
|
|
|
|
#include "WiseMapInfo.h"
|
|
|
|
#include <Information/Zone/ZoneManager.h>
|
|
#include <Information/Zone/GameZone.h>
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
//
|
|
|
|
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;
|
|
}
|
|
|
|
|
|
|
|
|
|
|