663 lines
23 KiB
C++
663 lines
23 KiB
C++
#pragma once
|
|
|
|
#include <MapInfoParser.h>
|
|
#include <ServerOptionParser.h>
|
|
#include <ServerOptionParserEx.h>
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
#include <ServerSessions/ServerSessionManager.h>
|
|
#include <ServerSessions/ServerSessionEx.h>
|
|
|
|
#include <UserSessions/User.h>
|
|
|
|
#include <AgentParty/AgentPartyManager.h>
|
|
|
|
#include "ZoneManager.h"
|
|
#include "Village.h"
|
|
#include "CHuntingRoom.h"
|
|
#include "HuntingField.h"
|
|
#include "HuntingRoom.h"
|
|
#include "MissionRoom.h"
|
|
#include "LobbyRoom.h"
|
|
#include "PVPRoom.h"
|
|
#include "CharSelect.h"
|
|
#include "InstanceDungeon.h"
|
|
#include "DungeonTopOfTrial.h"
|
|
#include "DungeonSSQ.h"
|
|
#include "DominationField.h"
|
|
// _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
#include "DungeonChaosZone.h"
|
|
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
|
|
#include "SpaField.h"
|
|
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
|
|
|
|
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
//
|
|
template< eZONETYPE _ZTYPE, typename _TYPE, DWORD _InitPool, DWORD _AddinPool >
|
|
struct zone_exinfo : zone_info< _ZTYPE, _TYPE >
|
|
{
|
|
static const DWORD size_init_pool = _InitPool;
|
|
static const DWORD size_addin_pool = _AddinPool;
|
|
};
|
|
|
|
template< eINSTANCE_DUNGEON_KIND _ZTYPE, typename _TYPE, DWORD _InitPool, DWORD _AddinPool >
|
|
struct indun_exinfo : public zone_exinfo< eZONETYPE_MAX, _TYPE, _InitPool, _AddinPool >
|
|
{
|
|
static const eINSTANCE_DUNGEON_KIND value = _ZTYPE;
|
|
};
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Hard-coding for intelli-sense
|
|
typedef zone_exinfo<eZONETYPE_LOBBY, LobbyRoom, 50, 50> LobbyRoom_Info;
|
|
typedef zone_exinfo<eZONETYPE_VILLAGE, Village, 5, 1> Village_Info;
|
|
typedef zone_exinfo<eZONETYPE_CHARSELECT, CharSelect, 1, 0> CharSelect_Info;
|
|
typedef zone_exinfo<eZONETYPE_MISSION, MissionRoom, 50, 50> MissionRoom_Info;
|
|
typedef zone_exinfo<eZONETYPE_HUNTING, HuntingRoom, 1, 1> HuntingRoom_Info;
|
|
typedef zone_exinfo<eZONETYPE_PVP, PVPRoom, 5, 5> PVPRoom_Info;
|
|
typedef zone_exinfo<eZONETYPE_FIELD, HuntingField, 30, 10> HuntingField_Info;
|
|
typedef zone_exinfo<eZONETYPE_DOMINATION_FIELD, DominationField, 30, 10> DominationField_Info;
|
|
typedef zone_exinfo<eZONETYPE_CHUNTING, CHuntingRoom, 50, 50> CHuntingRoom_Info;
|
|
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
|
|
typedef zone_exinfo<eZONETYPE_SPA_FIELD, SpaField, 1, 1> SpaField_Info;
|
|
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
// temporary type register
|
|
typedef zone_exinfo<eZONETYPE_INSTANCE, InstanceDungeon, 0, 0> InstanceDungeon_Info;
|
|
|
|
typedef indun_exinfo<INDUN_KIND_TOP_OF_TRIAL, DungeonTopOfTrial, 10, 10> DungeonTopOfTrial_Info;
|
|
typedef indun_exinfo<INDUN_KIND_SS_QUEST, DungeonSSQ, 5, 5> DungeonSSQ_Info;
|
|
typedef indun_exinfo<INDUN_KIND_100LEVEL_QUEST, Milestone100LevelQuest, 5, 5> Milestone100LevelQuest_Info;
|
|
// _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
typedef indun_exinfo<INDUN_KIND_CHAOS_ZONE, DungeonChaosZone, 10, 10> DungeonChaosZone_Info;
|
|
|
|
//#define REG_ZONE_NODE(_typeinfo)
|
|
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
// Instance Dungeon은 여기에 추가하지 말 것.
|
|
|
|
#ifdef _NA_008069_20150210_ADD_SPA_SYSTEM
|
|
#define REG_ZONE_LIST() \
|
|
REG_ZONE_NODE(LobbyRoom_Info) \
|
|
REG_ZONE_NODE(Village_Info ) \
|
|
REG_ZONE_NODE(CharSelect_Info) \
|
|
REG_ZONE_NODE(MissionRoom_Info) \
|
|
REG_ZONE_NODE(HuntingRoom_Info) \
|
|
REG_ZONE_NODE(PVPRoom_Info ) \
|
|
REG_ZONE_NODE(HuntingField_Info) \
|
|
REG_ZONE_NODE(DominationField_Info) \
|
|
REG_ZONE_NODE(CHuntingRoom_Info) \
|
|
REG_ZONE_NODE(SpaField_Info)
|
|
#else
|
|
#define REG_ZONE_LIST() \
|
|
REG_ZONE_NODE(LobbyRoom_Info) \
|
|
REG_ZONE_NODE(Village_Info ) \
|
|
REG_ZONE_NODE(CharSelect_Info) \
|
|
REG_ZONE_NODE(MissionRoom_Info) \
|
|
REG_ZONE_NODE(HuntingRoom_Info) \
|
|
REG_ZONE_NODE(PVPRoom_Info ) \
|
|
REG_ZONE_NODE(HuntingField_Info) \
|
|
REG_ZONE_NODE(DominationField_Info) \
|
|
REG_ZONE_NODE(CHuntingRoom_Info)
|
|
#endif //_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
|
|
// Instance Dungeon은 여기에 추가할 것
|
|
// _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
#define REG_INDUN_LIST() \
|
|
REG_ZONE_NODE(DungeonTopOfTrial_Info) \
|
|
REG_ZONE_NODE(DungeonSSQ_Info) \
|
|
REG_ZONE_NODE(Milestone100LevelQuest_Info) \
|
|
REG_ZONE_NODE(DungeonChaosZone_Info)
|
|
|
|
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
// <MoveZone Policyment>
|
|
// - ZoneCommon.h에 존재하는 MOVE_ZONE_CONTROL_LIST()에 등재된 목록을 구현한다.
|
|
// - 이동 조건 검사 필더들...
|
|
|
|
const RoomArgument&
|
|
RoomArgument::GetEmpty()
|
|
{
|
|
static RoomArgument emptyArgument;
|
|
return emptyArgument;
|
|
}
|
|
|
|
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
//
|
|
CheckMoveZonePolicyArgs::CheckMoveZonePolicyArgs()
|
|
: pUser(0)
|
|
, FromZoneType(eZONETYPE_MAX)
|
|
, ToZoneType(eZONETYPE_MAX)
|
|
, FromZoneKey(0)
|
|
, ToZoneKey(0)
|
|
, FromZonePtr(0)
|
|
, ToZonePtr(0)
|
|
, FromZoneTypeByObj(eZONETYPE_MAX)
|
|
, ToZoneTypeByObj(eZONETYPE_MAX)
|
|
{
|
|
}
|
|
|
|
CheckMoveZonePolicyArgs::CheckMoveZonePolicyArgs(
|
|
User* const _pUser,
|
|
const eZONETYPE _FromZoneType, const eZONETYPE _ToZoneType,
|
|
const KEYTYPE _FromZoneKey, const KEYTYPE _ToZoneKey,
|
|
ZoneInterface* const _FromZonePtr, // FromKey에 대한 Zone
|
|
ZoneInterface* const _ToZonePtr, // ToKey에 대한 Zone
|
|
const eZONETYPE _FromZoneTypeByObj, // FromZone의 실제 타입
|
|
const eZONETYPE _ToZoneTypeByObj) // ToZone의 실제 타입
|
|
: pUser(_pUser)
|
|
, FromZoneType(_FromZoneType)
|
|
, ToZoneType(_ToZoneType)
|
|
, FromZoneKey(_FromZoneKey)
|
|
, ToZoneKey(_ToZoneKey)
|
|
, FromZonePtr(_FromZonePtr)
|
|
, ToZonePtr(_ToZonePtr)
|
|
, FromZoneTypeByObj(_FromZoneTypeByObj)
|
|
, ToZoneTypeByObj(_ToZoneTypeByObj)
|
|
{
|
|
}
|
|
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_CHECK_SKIP> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_CHECK_SKIP;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// 특별한 제약이 없는 경우 키로 찾은 포인터만 검증하고 처리를 수행한다.
|
|
return ValidCheck() ? RC::RC_ROOM_SUCCESS : RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
};
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_STATIC_TO_STATIC> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_STATIC_TO_STATIC;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// (NOTE) - 이동형태 : FIELD<->FIELD, FIELD<->VILLAGE (튜토리얼 포함)
|
|
// MapEnterencePortal과 같은 검증이 있어야지만 찾아지는 문제가 있군요.
|
|
// 생각보다 일반화 어렵넹... 음...
|
|
// _NA_008069_20150210_ADD_SPA_SYSTEM
|
|
const DWORD GO_ACCEPT_MASK =
|
|
(1<<eZONETYPE_VILLAGE) | (1<<eZONETYPE_FIELD) | (1<<eZONETYPE_DOMINATION_FIELD) | (1<<eZONETYPE_SPA_FIELD);
|
|
|
|
if(!ValidCheck())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
BOOL bMoveAccept = !!(GO_ACCEPT_MASK & (1 << Args->FromZoneType));
|
|
bMoveAccept = bMoveAccept && (GO_ACCEPT_MASK & (1 << Args->ToZoneType));
|
|
|
|
return bMoveAccept ? RC::RC_ROOM_SUCCESS : RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
};
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_ROOM_TO_STATIC> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_ROOM_TO_STATIC;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// (NOTE) - 각종 ROOM->VILLAGE+FIELD+TUTORIAL
|
|
if(!ValidCheck())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
// 트리거에 의해 복귀하는 경우 RoomType은 Mission|Instance가 해당된다.
|
|
if(Args->ToZoneType != Args->ToZonePtr->GetType())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
const eZONETYPE ptrZoneType = Args->FromZonePtr->GetType();
|
|
if(Args->FromZoneType != ptrZoneType && // 트리거에 의한 경우 예외 처리
|
|
!(ptrZoneType == eZONETYPE_INSTANCE && Args->FromZoneType == eZONETYPE_MISSION))
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
switch(Args->FromZoneType)
|
|
{
|
|
case eZONETYPE_HUNTING:
|
|
case eZONETYPE_CHUNTING:
|
|
case eZONETYPE_MISSION:
|
|
case eZONETYPE_INSTANCE:
|
|
case eZONETYPE_PVP:
|
|
break;
|
|
default:
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
|
|
// (WAVERIX) (081021) (BUG-FIX) '타락한 사원'에서 'HUNTING_FIELD'로 복귀 안되는 문제 수정
|
|
// - 검사조건 변경: FromZoneType --> FromZoneTypeByObj
|
|
switch(Args->ToZoneTypeByObj)
|
|
{
|
|
case eZONETYPE_DOMINATION_FIELD:
|
|
case eZONETYPE_FIELD:
|
|
if(!(eZONETYPE_INSTANCE == Args->FromZoneTypeByObj ||
|
|
eZONETYPE_MISSION == Args->FromZoneTypeByObj))
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
break;
|
|
case eZONETYPE_TUTORIAL_FIELD:
|
|
// 저탑에서 에소드마을로 복귀할 수 없는 현상 수정(일본은 에소드마을에서 배틀존창 열기 가능)
|
|
//if(eZONETYPE_MISSION != Args->FromZoneTypeByObj)
|
|
// return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
break;
|
|
case eZONETYPE_VILLAGE:
|
|
break;
|
|
#ifdef _NA_006174_20121015_MOVE_ZONE_POLICY_AIRSHIP_FIELD_ADD
|
|
case eZONETYPE_AIRSHIP_FIELD:
|
|
break;
|
|
#endif // _NA_006174_20121015_MOVE_ZONE_POLICY_AIRSHIP_FIELD_ADD
|
|
//_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
case eZONETYPE_SPA_FIELD:
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
default:
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
|
|
return RC::RC_ROOM_SUCCESS;
|
|
}
|
|
};
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_VILLAGE_TO_LOBBY> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_VILLAGE_TO_LOBBY;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// (NOTE) - field에서 lobby로 이동도 가능 (TUTORIAL_FIELD)
|
|
// - 일단 모든 STATIC(VILLAGE+FIELD)에서 이동 가능하게 되었다.
|
|
if(!ValidCheck())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
if(Args->ToZoneType == Args->ToZonePtr->GetType())
|
|
{ // ToZoneTypeByObj ... 이것은 평가 애매...
|
|
if(Args->FromZoneType == Args->FromZoneTypeByObj)
|
|
return RC::RC_ROOM_SUCCESS;
|
|
|
|
if(Args->FromZoneType == eZONETYPE_FIELD)
|
|
return RC::RC_ROOM_SUCCESS;
|
|
|
|
if(Args->FromZoneTypeByObj == eZONETYPE_TUTORIAL_FIELD)
|
|
return RC::RC_ROOM_SUCCESS;
|
|
else if(Args->FromZoneTypeByObj == eZONETYPE_DOMINATION_FIELD)
|
|
return RC::RC_ROOM_SUCCESS;
|
|
else if(Args->FromZoneTypeByObj == eZONETYPE_SPA_FIELD)
|
|
{
|
|
//_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
// 온천에서는 로비로 이동할 수 없다
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
}
|
|
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
};
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_LOBBY_TO_VILLAGE> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_LOBBY_TO_VILLAGE;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// (NOTE) - LOBBY에서 FIELD로 이동도 가능 (TUTORIAL_FIELD)
|
|
// - (Exception)
|
|
// - LOBBY의 GetMapCode는 실제 가려는 ROOM의 MapCode를 보유하고 있다.
|
|
// - 아마 여기서 문제가 발생하는 것일 터...
|
|
if(!ValidCheck())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
if(Args->FromZoneType == Args->FromZonePtr->GetType())
|
|
{ // FromZoneTypeByObj ... 이것은 평가 애매...
|
|
if(Args->ToZoneType == Args->ToZoneTypeByObj)
|
|
return RC::RC_ROOM_SUCCESS;
|
|
|
|
if(Args->ToZoneType == eZONETYPE_FIELD)
|
|
return RC::RC_ROOM_SUCCESS;
|
|
//if(ToZoneTypeByObj == eZONETYPE_TUTORIAL_FIELD)
|
|
// return RC::RC_ROOM_SUCCESS;
|
|
if(Args->ToZoneType == eZONETYPE_FIELD)
|
|
return RC::RC_ROOM_SUCCESS;
|
|
}
|
|
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
};
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_VILLAGE_TO_HUNTING> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_VILLAGE_TO_HUNTING;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// (NOTE) - 마을에서 바로 HUNTING에 참가
|
|
if(!ValidCheck())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
if(eZONETYPE_VILLAGE == Args->FromZoneType && eZONETYPE_HUNTING == Args->ToZoneType)
|
|
return RC::RC_ROOM_SUCCESS;
|
|
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
};
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_ROOM_TO_LOBBY> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_ROOM_TO_LOBBY;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// (NOTE) - RELAY MISSION
|
|
if(!ValidCheck())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
if(eZONETYPE_MISSION == Args->FromZonePtr->GetType() && eZONETYPE_LOBBY == Args->ToZonePtr->GetType())
|
|
{
|
|
return RC::RC_ROOM_SUCCESS;
|
|
}
|
|
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
};
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_CHUNTING_TO_VILLAGE> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_CHUNTING_TO_VILLAGE;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// (NOTE) - CHUNTING->VILLAGE
|
|
if(!ValidCheck())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
if(eZONETYPE_CHUNTING == Args->FromZonePtr->GetType() && eZONETYPE_VILLAGE == Args->ToZonePtr->GetType())
|
|
{
|
|
return RC::RC_ROOM_SUCCESS;
|
|
}
|
|
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
};
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_HUNTING_TO_HUNTING> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_HUNTING_TO_HUNTING;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// (NOTE) - CHUNTING->VILLAGE
|
|
if(!ValidCheck())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
if(eZONETYPE_HUNTING == Args->FromZonePtr->GetType() && eZONETYPE_HUNTING == Args->ToZonePtr->GetType())
|
|
{
|
|
return RC::RC_ROOM_SUCCESS;
|
|
}
|
|
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
};
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_STATIC_TO_ROOM> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_STATIC_TO_ROOM;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// (090215) (NOTE) 포탈 생성후 입장하는 유저용
|
|
if(!ValidCheck())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
switch(Args->FromZoneType)
|
|
{
|
|
case eZONETYPE_VILLAGE:
|
|
case eZONETYPE_DOMINATION_FIELD:
|
|
case eZONETYPE_FIELD:
|
|
break;
|
|
//_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
case eZONETYPE_SPA_FIELD:
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
default:
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
|
|
switch(Args->ToZoneType)
|
|
{
|
|
case eZONETYPE_MISSION:
|
|
case eZONETYPE_INSTANCE:
|
|
break;
|
|
default:
|
|
return RC::RC_ROOM_INVALID_ROOM_TYPE;
|
|
}
|
|
|
|
const sMAPINFO* pMapInfo = Args->ToZonePtr->GetMapInfo();
|
|
//const sMAPINFO* pMapInfo =
|
|
// MapInfoParser::Instance()->FindMapInfo(Args->ToZonePtr->GetMapCode());
|
|
assert(pMapInfo);
|
|
|
|
if(Args->ToZoneType == eZONETYPE_MISSION)
|
|
CheckMission(pMapInfo);
|
|
if(Args->ToZoneType == eZONETYPE_INSTANCE)
|
|
CheckInstanceDungeon(pMapInfo);
|
|
|
|
return RC::RC_ROOM_SUCCESS;
|
|
}
|
|
|
|
RC::eROOM_RESULT CheckMission(const sMAPINFO* pMapInfo)
|
|
{
|
|
__UNUSED(pMapInfo);
|
|
// Character의 기본 제약 조건(선행 미션, 선행 퀘스트 등등)은 GameServer에서 검사된 상태
|
|
RC::eROOM_RESULT result = RC::RC_ROOM_SUCCESS;
|
|
result = Args->ToZonePtr->CanJoin(Args->pUser, eZONEPUBLIC_PUBLIC, "");
|
|
return result;
|
|
}
|
|
|
|
RC::eROOM_RESULT CheckInstanceDungeon(const sMAPINFO* pMapInfo)
|
|
{
|
|
__UNUSED(pMapInfo);
|
|
RC::eROOM_RESULT result = RC::RC_ROOM_SUCCESS;
|
|
result = Args->ToZonePtr->CanJoin(Args->pUser, eZONEPUBLIC_PUBLIC, "");
|
|
return result;
|
|
}
|
|
};
|
|
//─────────────────────────────────────────
|
|
template<>
|
|
class CheckMoveZonePolicy_Impl<MZTF_STATIC_TO_ROOM_FOR_UCUSER> : public CheckMoveZonePolicy
|
|
{
|
|
private:
|
|
static const eMOVE_ZONE_TYPE_FILTER movetype = MZTF_STATIC_TO_ROOM_FOR_UCUSER;
|
|
public:
|
|
virtual RC::eROOM_RESULT EnableCheck()
|
|
{
|
|
// (NOTE) - 비정상 종료후 복귀 요청시 처리되는 루틴
|
|
if(!ValidCheck())
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
|
|
switch(Args->FromZoneType)
|
|
{
|
|
case eZONETYPE_VILLAGE:
|
|
case eZONETYPE_DOMINATION_FIELD:
|
|
case eZONETYPE_FIELD:
|
|
break;
|
|
//_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
case eZONETYPE_SPA_FIELD:
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
default:
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
|
|
switch(Args->ToZoneType)
|
|
{
|
|
case eZONETYPE_MISSION:
|
|
case eZONETYPE_INSTANCE:
|
|
break;
|
|
default:
|
|
return RC::RC_ROOM_NOT_EXIST_ROOM;
|
|
}
|
|
|
|
return RC::RC_ROOM_SUCCESS;
|
|
}
|
|
};
|
|
|
|
|
|
//─────────────────────────────────────────
|
|
// <MoveZone Policyment Code-Generations>
|
|
#define MOVE_ZONE_CTRL_NODE_NAME(mztf) sCheckMoveZonePolicy_##mztf
|
|
//#define MOVE_ZONE_CTRL_NODE(eMOVE_ZONE_TYPE_FILTER)
|
|
|
|
#undef MOVE_ZONE_CTRL_NODE
|
|
#define MOVE_ZONE_CTRL_NODE(mztf) \
|
|
static CheckMoveZonePolicy_Impl<mztf> MOVE_ZONE_CTRL_NODE_NAME(mztf);
|
|
|
|
MOVE_ZONE_CONTROL_LIST(); // declare module variables
|
|
|
|
|
|
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
|
|
|
|
VOID
|
|
CheckMoveZonePolicy::_Clear()
|
|
{
|
|
//m_pImpl = NULL;
|
|
//USER.Set(NULL);
|
|
//FromZoneType.Set(eZONETYPE_MAX);
|
|
//ToZoneType.Set(eZONETYPE_MAX);
|
|
//FromZoneKey.Set(0);
|
|
//ToZoneKey.Set(0);
|
|
//FromZonePtr.Set(NULL);
|
|
//ToZonePtr.Set(NULL);
|
|
//FromZoneTypeByObj.Set(eZONETYPE_MAX);
|
|
//ToZoneTypeByObj.Set(eZONETYPE_MAX);
|
|
|
|
|
|
}
|
|
|
|
|
|
CheckMoveZonePolicy*
|
|
CheckMoveZonePolicy::_AlignInfo(const eMOVE_ZONE_TYPE_FILTER moveType,
|
|
User* const pUser,
|
|
const eZONETYPE fromZoneType,
|
|
const eZONETYPE toZoneType,
|
|
const KEYTYPE fromZoneKey,
|
|
const KEYTYPE toZoneKey)
|
|
{
|
|
if(!pUser)
|
|
return NULL;
|
|
|
|
switch(moveType)
|
|
{
|
|
#undef MOVE_ZONE_CTRL_NODE
|
|
#define MOVE_ZONE_CTRL_NODE(mztf) \
|
|
case (mztf): break;
|
|
|
|
MOVE_ZONE_CONTROL_LIST(); // case list
|
|
|
|
default:
|
|
SUNLOG(eCRITICAL_LOG, _T("[%s] Unhandled Check Type"), __FUNCTION__);
|
|
return NULL;
|
|
};
|
|
|
|
CheckMoveZonePolicy* pInstance = NULL;
|
|
ZoneInterface* const pFromZone = g_ZoneManager.FindZone(fromZoneKey);
|
|
ZoneInterface* const pToZone = g_ZoneManager.FindZone(toZoneKey);
|
|
|
|
// (WAVERIX) (090601) (BUG-FIX) GameServer의 응답을 받아 이동처리를 하는 경우, (case Lobby)
|
|
// pFromZone, pToZone은 null일 수 있다.
|
|
const sMAPINFO* pFromMapInfo = pFromZone ? pFromZone->GetMapInfo() : 0;
|
|
eZONETYPE fromZoneTypeByObj = pFromMapInfo ? (eZONETYPE)pFromMapInfo->byMKind : eZONETYPE_MAX;
|
|
|
|
const sMAPINFO* pToMapInfo = pToZone ? pToZone->GetMapInfo() : 0;
|
|
eZONETYPE toZoneTypeByObj = pToMapInfo ? (eZONETYPE)pToMapInfo->byMKind : eZONETYPE_MAX;
|
|
|
|
switch(moveType)
|
|
{
|
|
#undef MOVE_ZONE_CTRL_NODE
|
|
#define MOVE_ZONE_CTRL_NODE(mztf) \
|
|
case (mztf): \
|
|
pInstance = &MOVE_ZONE_CTRL_NODE_NAME(mztf); \
|
|
new (pInstance->Args) CheckMoveZonePolicyArgs \
|
|
(pUser \
|
|
, fromZoneType, toZoneType, fromZoneKey, toZoneKey \
|
|
, pFromZone, pToZone \
|
|
, fromZoneTypeByObj, toZoneTypeByObj); \
|
|
break;
|
|
|
|
MOVE_ZONE_CONTROL_LIST(); // case list
|
|
};
|
|
|
|
pInstance->m_pImpl = pInstance;
|
|
return pInstance;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// <ZoneKeyStreamAddin>
|
|
ZoneKeyStreamAddin::ZoneKeyStreamAddin(ZoneInterface* const pInterface)
|
|
{
|
|
ZoneType = pInterface->GetType();
|
|
switch(ZoneType)
|
|
{
|
|
case eZONETYPE_LOBBY :
|
|
case eZONETYPE_VILLAGE :
|
|
case eZONETYPE_CHARSELECT :
|
|
case eZONETYPE_MISSION :
|
|
case eZONETYPE_HUNTING :
|
|
//case eZONETYPE_QUEST :
|
|
case eZONETYPE_PVP :
|
|
//case eZONETYPE_EVENT :
|
|
//case eZONETYPE_GUILD :
|
|
//case eZONETYPE_SIEGE :
|
|
case eZONETYPE_FIELD :
|
|
case eZONETYPE_DOMINATION_FIELD:
|
|
case eZONETYPE_CHUNTING :
|
|
case eZONETYPE_TUTORIAL_FIELD:
|
|
case eZONETYPE_INSTANCE :
|
|
//_NA_008069_20150210_ADD_SPA_SYSTEM
|
|
case eZONETYPE_SPA_FIELD:
|
|
break;
|
|
default:
|
|
SUNLOG(eCRITICAL_LOG, "Invalid Zone Type [%u]", ZoneType);
|
|
ZoneType = eZONETYPE_MAX;
|
|
break;
|
|
}
|
|
|
|
ZoneSubType = INDUN_KIND_MAX;
|
|
if(eZONETYPE_INSTANCE == ZoneType)
|
|
{
|
|
BOOST_STATIC_ASSERT(INDUN_KIND_MAX == 7); // 추가 타입 존재시 하단 내용 추가할 것
|
|
InstanceDungeon* const pIndun = InstanceDungeon_Info::downcast(pInterface);
|
|
ZoneSubType = (WORD)pIndun->GetDungeonType();
|
|
switch(pIndun->GetDungeonType())
|
|
{
|
|
case INDUN_KIND_TOP_OF_TRIAL:
|
|
case INDUN_KIND_100LEVEL_QUEST: // 100레벨 체인지업, 이후 일반적인 퀘스트 맵으로 활용 가능
|
|
case INDUN_KIND_SS_QUEST: // 타락한 사원
|
|
case INDUN_KIND_EXT_03:
|
|
case INDUN_KIND_EXT_04:
|
|
case INDUN_KIND_MAYA_SCROLL:
|
|
// _NA_005026_20120527_CHAOS_ZONE_BATTLE_GROUND
|
|
case INDUN_KIND_CHAOS_ZONE:
|
|
break;
|
|
default:
|
|
SUNLOG(eCRITICAL_LOG, "Invalid Zone Sub Type [%u]", ZoneSubType);
|
|
ZoneSubType = INDUN_KIND_MAX;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|