392 lines
No EOL
14 KiB
C++
392 lines
No EOL
14 KiB
C++
|
|
|
|
#pragma once
|
|
|
|
#include "Define.h"
|
|
#include "CriticalSection.hpp"
|
|
#include "DNServerDef.h"
|
|
|
|
#include <map>
|
|
#include <vector>
|
|
|
|
// WORLD
|
|
|
|
typedef struct WORLDINFO
|
|
{
|
|
|
|
public:
|
|
WORLDINFO(INT nWorldID);
|
|
WORLDINFO(const WORLDINFO& pWorldInfo);
|
|
// virtual ~WORLDINFO() { }
|
|
|
|
VOID Set(INT nWorldID); // 불변 지정
|
|
VOID Set(const WORLDINFO* pWorldInfo); // 전체 지정
|
|
VOID SetChangeable(const WORLDINFO* pWorldInfo); // 가변 지정
|
|
VOID Reset();
|
|
BOOL IsSet() const { return(EV_WORLDID_DEF != m_WorldID); }
|
|
|
|
public:
|
|
// Common (불변)
|
|
INT m_WorldID;
|
|
|
|
// Common (가변)
|
|
INT m_MaxUserLimit;
|
|
WCHAR m_WorldName[WORLDNAMELENMAX];
|
|
|
|
} *LPWORLDINFO, * const LPCWORLDINFO;
|
|
|
|
|
|
// SERVERINFO
|
|
|
|
typedef struct SERVERINFO
|
|
{
|
|
|
|
public:
|
|
SERVERINFO(
|
|
EF_SERVERTYPE pServerType,
|
|
INT pServerID,
|
|
INT pNetLuncherID,
|
|
LPCTSTR pResourceRevision,
|
|
LPCTSTR pExeVersion,
|
|
INT nWorldID[WORLDCOUNTMAX],
|
|
UINT pIpAddr,
|
|
UINT pPublicIP
|
|
);
|
|
SERVERINFO(const SERVERINFO& pServerInfo);
|
|
// virtual ~SERVERINFO() { }
|
|
|
|
VOID Set( // 불변 지정
|
|
EF_SERVERTYPE pServerType,
|
|
INT pServerID,
|
|
INT pNetLuncherID,
|
|
LPCTSTR pResourceRevision,
|
|
LPCTSTR pExeVersion,
|
|
INT nWorldID[WORLDCOUNTMAX],
|
|
UINT pIpAddr,
|
|
UINT pPublicIP
|
|
);
|
|
VOID Set(const SERVERINFO* pServerInfo); // 전체 지정
|
|
VOID SetChangeable(const SERVERINFO* pServerInfo); // 가변 지정
|
|
virtual VOID Reset(BOOL pIsAll = TRUE);
|
|
BOOL IsSet() const { return(EV_SVS_NONE != m_ServerType); }
|
|
|
|
BOOL FindWorldID(INT nWorldID) const;
|
|
|
|
public:
|
|
// Common (불변)
|
|
EF_SERVERTYPE m_ServerType; // 서버 타입
|
|
INT m_ServerID; // 서버 ID
|
|
INT m_NetLuncherID; // 넷런처 ID
|
|
TCHAR m_ResourceRevision[EV_RSCSVNRVS_MAXLEN]; // 서버가 로드한 리소스의 SVN 리비전 번호
|
|
TCHAR m_ExeVersion[EV_SRVVER_MAXLEN]; // 서버의 실행파일 버전 (CCNet이할당하는 버전) (1, 2 번 자리 위주로 검사. 마지막 자리는 RB 패치 후 개별빌드일 때 증가)
|
|
INT m_WorldID[WORLDCOUNTMAX]; // 월드 ID (목록)
|
|
UINT m_IpAddr; // IP 주소
|
|
UINT m_PublicIP; // Public IP 주소
|
|
|
|
// Specific (불변)
|
|
|
|
// Common (가변)
|
|
EF_SERVERSTATE m_ServerState; // 서버 상태
|
|
|
|
// Specific (가변)
|
|
INT m_CurUserCount; // 현재 인원 수 (LO, GA, VI)
|
|
INT m_CurRoomCount; // 현재 방 개수 (GA)
|
|
INT m_MaxRoomCount; // 전체 방 개수 (GA)
|
|
INT m_TotalFarmUserCount;
|
|
|
|
INT m_MaxFarmCount;
|
|
UINT m_FarmDBID[Farm::Max::FARMCOUNT];
|
|
INT m_CurFarmUserCount[Farm::Max::FARMCOUNT];
|
|
bool m_bActivate[Farm::Max::FARMCOUNT];
|
|
INT m_FrameDelay[SERVERTYPE_MAX];
|
|
INT m_MeritID; // 메리트 ID (GA)
|
|
BOOL m_Visibility; // 개방 여부 (GA)
|
|
|
|
} *LPSERVERINFO, * const LPCSERVERINFO;
|
|
|
|
|
|
// CHANNEL (VI)
|
|
|
|
typedef struct CHANNELINFO
|
|
{
|
|
|
|
public:
|
|
CHANNELINFO(
|
|
INT pServerID,
|
|
INT pChannelID,
|
|
INT nWorldID,
|
|
INT pMapIndex,
|
|
INT pMaxUserCount,
|
|
INT pAttribute,
|
|
const WCHAR* wszMapName
|
|
);
|
|
CHANNELINFO(const CHANNELINFO& pChannelInfo);
|
|
// virtual ~CHANNELINFO() { }
|
|
|
|
VOID Set( // 불변 지정
|
|
INT pServerID,
|
|
INT pChannelID,
|
|
INT nWorldID,
|
|
INT pMapIndex,
|
|
INT pMaxUserCount,
|
|
INT pAttribute,
|
|
const WCHAR* wszMapName
|
|
);
|
|
|
|
VOID Set(const CHANNELINFO* pChannelInfo); // 전체 지정
|
|
VOID SetChangeable(const CHANNELINFO* pChannelInfo); // 가변 지정
|
|
VOID Reset();
|
|
BOOL IsSet() const { return(EV_CHANNELID_DEF != m_ChannelID); }
|
|
|
|
public:
|
|
// Common (불변)
|
|
INT m_ServerID; // VI
|
|
INT m_ChannelID; // 채널 ID
|
|
INT m_WorldID; // 월드 ID
|
|
INT m_MapIndex; // 맵 인덱스
|
|
INT m_MaxUserCount; // 최대 인원 수
|
|
INT m_Attribute; // 채널 속성
|
|
|
|
// Common (가변)
|
|
INT m_CurUserCount; // 현재 인원 수
|
|
INT m_MeritID; // 메리트 ID
|
|
BOOL m_Visibility; // 개방 여부
|
|
INT m_LimitLevel; // 입장 제한 레벨
|
|
BOOL m_IsMidShow; // DB 미드웨어 연결여부
|
|
INT m_nServerID;
|
|
CHAR m_cThreadID;
|
|
WCHAR m_wszMapName[MAPNAMELENMAX]; // 맵이름
|
|
|
|
} *LPCHANNELINFO, * const LPCCHANNELINFO;
|
|
|
|
|
|
// MERIT (GA, VI)
|
|
|
|
typedef struct MERITINFO
|
|
{
|
|
|
|
public:
|
|
MERITINFO(INT pMeritID, INT pMinLevel, INT pMaxLevel, INT pMeritType, INT pExtendValue);
|
|
MERITINFO(const MERITINFO& pMeritInfo);
|
|
|
|
VOID Set( // 불변 지정
|
|
INT pMeritID,
|
|
INT pMinLevel,
|
|
INT pMaxLevel,
|
|
INT pMeritType,
|
|
INT pExtendValue
|
|
);
|
|
VOID Set(const MERITINFO* pMeritInfo); // 전체 지정
|
|
VOID SetChangeable(const MERITINFO* pMeritInfo); // 가변 지정
|
|
VOID Reset();
|
|
BOOL IsSet() const { return(EV_MERITID_DEF != m_MeritID); }
|
|
|
|
public:
|
|
// Common (불변)
|
|
INT m_MeritID; // 메리트 ID
|
|
INT m_MinLevel; // 메리트 적용가능 최소레벨
|
|
INT m_MaxLevel; // 메리트 적용가능 최대레벨
|
|
INT m_MeritType; // 메리트 타입 (eMeritBonus 참조)
|
|
INT m_ExtendValue; // 추가 수치 (메리트 타입에 따라 다른 의미)
|
|
|
|
// Common (가변)
|
|
|
|
|
|
} *LPMERITINFO, * const LPCMERITINFO;
|
|
|
|
|
|
// NET LUNCHER
|
|
|
|
typedef struct NETLUNCHERINFO
|
|
{
|
|
|
|
public:
|
|
NETLUNCHERINFO(INT pNetLuncherID, UINT pIpAddr, UINT pPublicIP);
|
|
VOID Set(INT pNetLuncherID, UINT pIpAddr, UINT pPublicIP); // 불변 지정
|
|
|
|
NETLUNCHERINFO(const NETLUNCHERINFO& pNetLuncherInfo);
|
|
|
|
VOID Reset();
|
|
BOOL IsSet() const { return(EV_NETLUNCHER_DEF != m_NetLuncherID); }
|
|
|
|
public:
|
|
// Common (불변)
|
|
INT m_NetLuncherID; // 넷런처 ID
|
|
UINT m_IpAddr; // IP 주소
|
|
UINT m_PublicIP;
|
|
|
|
|
|
} *LPNETLUNCHERINFO, * const LPCNETLUNCHERINFO;
|
|
|
|
|
|
class CServiceInfo
|
|
{
|
|
public:
|
|
CServiceInfo ();
|
|
virtual ~CServiceInfo ();
|
|
|
|
|
|
public:
|
|
typedef CCriticalSection TP_LOCK;
|
|
typedef CLockAutoEx<TP_LOCK> TP_LOCKAUTO;
|
|
|
|
// WORLD
|
|
typedef std::map<INT, WORLDINFO> TP_LISTWRLD;
|
|
typedef TP_LISTWRLD::iterator TP_LISTWRLD_ITR;
|
|
typedef TP_LISTWRLD::const_iterator TP_LISTWRLD_CTR;
|
|
typedef std::vector<WORLDINFO> TP_LISTWRLDAUTO;
|
|
typedef TP_LISTWRLDAUTO::iterator TP_LISTWRLDAUTO_ITR;
|
|
typedef TP_LISTWRLDAUTO::const_iterator TP_LISTWRLDAUTO_CTR;
|
|
|
|
// SERVER
|
|
typedef std::map<INT, SERVERINFO> TP_LISTSERV;
|
|
typedef TP_LISTSERV::iterator TP_LISTSERV_ITR;
|
|
typedef TP_LISTSERV::const_iterator TP_LISTSERV_CTR;
|
|
typedef std::vector<SERVERINFO> TP_LISTSERVAUTO;
|
|
typedef TP_LISTSERVAUTO::iterator TP_LISTSERVAUTO_ITR;
|
|
typedef TP_LISTSERVAUTO::const_iterator TP_LISTSERVAUTO_CTR;
|
|
|
|
// CHANNEL (VI)
|
|
typedef std::map<DWORD64, CHANNELINFO> TP_LISTCHNL;
|
|
typedef TP_LISTCHNL::iterator TP_LISTCHNL_ITR;
|
|
typedef TP_LISTCHNL::const_iterator TP_LISTCHNL_CTR;
|
|
typedef std::vector<CHANNELINFO> TP_LISTCHNLAUTO;
|
|
typedef TP_LISTCHNLAUTO::iterator TP_LISTCHNLAUTO_ITR;
|
|
typedef TP_LISTCHNLAUTO::const_iterator TP_LISTCHNLAUTO_CTR;
|
|
|
|
// MERIT (GA, VI)
|
|
typedef std::map<INT, MERITINFO> TP_LISTMRIT;
|
|
typedef TP_LISTMRIT::iterator TP_LISTMRIT_ITR;
|
|
typedef TP_LISTMRIT::const_iterator TP_LISTMRIT_CTR;
|
|
typedef std::vector<MERITINFO> TP_LISTMRITAUTO;
|
|
typedef TP_LISTMRITAUTO::iterator TP_LISTMRITAUTO_ITR;
|
|
typedef TP_LISTMRITAUTO::const_iterator TP_LISTMRITAUTO_CTR;
|
|
|
|
// NET LUNCHER
|
|
typedef std::map<INT, NETLUNCHERINFO> TP_LISTNTLC;
|
|
typedef TP_LISTNTLC::iterator TP_LISTNTLC_ITR;
|
|
typedef TP_LISTNTLC::const_iterator TP_LISTNTLC_CTR;
|
|
typedef std::vector<NETLUNCHERINFO> TP_LISTNTLCAUTO;
|
|
typedef TP_LISTNTLCAUTO::iterator TP_LISTNTLCAUTO_ITR;
|
|
typedef TP_LISTNTLCAUTO::const_iterator TP_LISTNTLCAUTO_CTR;
|
|
|
|
public:
|
|
DWORD Open();
|
|
VOID Close();
|
|
BOOL IsOpen() const { return(m_IsOpen); }
|
|
|
|
INT GetTotalUserCount() const { return m_TotalUserCount; }
|
|
void SetTotalUserCount(INT pTotalUserCount) { m_TotalUserCount = pTotalUserCount; }
|
|
|
|
// WORLD
|
|
BOOL IsWorldEmpty(EF_SERVICEMNGRTYPE pType) const { return(m_ListWrld[pType].empty()); } // 동기화 않해도 무방 ?
|
|
WORLDINFO* AtWorld(EF_SERVICEMNGRTYPE pType, INT nWorldID, BOOL pDoLock = FALSE);
|
|
const WORLDINFO* AtWorld(EF_SERVICEMNGRTYPE pType, INT nWorldID, BOOL pDoLock = FALSE) const;
|
|
DWORD AddWorld(EF_SERVICEMNGRTYPE pType, INT nWorldID, BOOL pDoLock = FALSE);
|
|
DWORD AddWorld(EF_SERVICEMNGRTYPE pType, const WORLDINFO* pWorldInfo, BOOL pDoLock = FALSE);
|
|
VOID GetWorldList(EF_SERVICEMNGRTYPE pType, TP_LISTWRLDAUTO& pList, BOOL pDoLock = FALSE) const;
|
|
VOID ClearWorldList(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTWRLD_ITR BeginWorld(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTWRLD_CTR BeginWorld(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE) const;
|
|
TP_LISTWRLD_ITR EndWorld(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTWRLD_CTR EndWorld(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE) const;
|
|
|
|
// SERVER
|
|
BOOL IsServerEmpty(EF_SERVICEMNGRTYPE pType) const { return(m_ListServ[pType].empty()); } // 동기화 않해도 무방 ?
|
|
SERVERINFO* AtServer(EF_SERVICEMNGRTYPE pType, INT pServerID, BOOL pDoLock = FALSE);
|
|
const SERVERINFO* AtServer(EF_SERVICEMNGRTYPE pType, INT pServerID, BOOL pDoLock = FALSE) const;
|
|
DWORD AddServer(EF_SERVICEMNGRTYPE pType, const SERVERINFO* pServerInfo, BOOL pDoLock = FALSE);
|
|
VOID GetServerList(EF_SERVICEMNGRTYPE pType, TP_LISTSERVAUTO& pList, INT nWorldID = EV_WORLDID_ALL, BOOL pDoLock = FALSE) const;
|
|
VOID ClearServerList(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTSERV_ITR BeginServer(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTSERV_CTR BeginServer(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE) const;
|
|
TP_LISTSERV_ITR EndServer(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTSERV_CTR EndServer(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE) const;
|
|
|
|
// CHANNEL (VI)
|
|
BOOL IsChannelEmpty(EF_SERVICEMNGRTYPE pType) const { return(m_ListChnl[pType].empty()); } // 동기화 않해도 무방 ?
|
|
CHANNELINFO* AtChannel(EF_SERVICEMNGRTYPE pType, INT pServerID, INT pChannelID, BOOL pDoLock = FALSE);
|
|
const CHANNELINFO* AtChannel(EF_SERVICEMNGRTYPE pType, INT pServerID, INT pChannelID, BOOL pDoLock = FALSE) const;
|
|
DWORD AddChannel(EF_SERVICEMNGRTYPE pType, INT pServerID, INT pChannelID, INT nWorldID, INT pMapIndex, INT pMaxUserCount, INT pAttribute, const WCHAR* wszMapName, BOOL pDoLock = FALSE);
|
|
DWORD AddChannel(EF_SERVICEMNGRTYPE pType, const CHANNELINFO* pChannelInfo, BOOL pDoLock = FALSE);
|
|
VOID GetChannelList(EF_SERVICEMNGRTYPE pType, TP_LISTCHNLAUTO& pList, INT pServerID = EV_SERVERID_ALL, BOOL pDoLock = FALSE) const;
|
|
VOID ClearChannelList(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTCHNL_ITR BeginChannel(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTCHNL_CTR BeginChannel(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE) const;
|
|
TP_LISTCHNL_ITR EndChannel(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTCHNL_CTR EndChannel(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE) const;
|
|
|
|
// MERIT (GA, VI)
|
|
BOOL IsMeritEmpty(EF_SERVICEMNGRTYPE pType) const { return(m_ListMrit[pType].empty()); } // 동기화 않해도 무방 ?
|
|
MERITINFO* AtMerit(EF_SERVICEMNGRTYPE pType, INT pMeritID, BOOL pDoLock = FALSE);
|
|
const MERITINFO* AtMerit(EF_SERVICEMNGRTYPE pType, INT pMeritID, BOOL pDoLock = FALSE) const;
|
|
DWORD AddMerit(EF_SERVICEMNGRTYPE pType, INT pMeritID, INT pMinLevel, INT pMaxLevel, INT pMeritType, INT pExtendValue, BOOL pDoLock = FALSE);
|
|
DWORD AddMerit(EF_SERVICEMNGRTYPE pType, const MERITINFO* pMeritInfo, BOOL pDoLock = FALSE);
|
|
VOID GetMeritList(EF_SERVICEMNGRTYPE pType, TP_LISTMRITAUTO& pList, BOOL pDoLock = FALSE) const;
|
|
VOID ClearMeritList(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTMRIT_ITR BeginMerit(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTMRIT_CTR BeginMerit(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE) const;
|
|
TP_LISTMRIT_ITR EndMerit(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTMRIT_CTR EndMerit(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE) const;
|
|
|
|
// NET LUNCHER
|
|
BOOL IsNetLuncherEmpty(EF_SERVICEMNGRTYPE pType) const { return(m_ListNtlc[pType].empty()); } // 동기화 않해도 무방 ?
|
|
NETLUNCHERINFO* AtNetLuncher(EF_SERVICEMNGRTYPE pType, INT pNetLuncherID, BOOL pDoLock = FALSE);
|
|
const NETLUNCHERINFO* AtNetLuncher(EF_SERVICEMNGRTYPE pType, INT pNetLuncherID, BOOL pDoLock = FALSE) const;
|
|
DWORD AddNetLuncher(EF_SERVICEMNGRTYPE pType, const NETLUNCHERINFO* pNetLuncherInfo, BOOL pDoLock = FALSE);
|
|
VOID GetNetLuncherList(EF_SERVICEMNGRTYPE pType, TP_LISTNTLCAUTO& pList, BOOL pDoLock = FALSE) const;
|
|
VOID ClearNetLuncherList(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTNTLC_ITR BeginNetLuncher(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTNTLC_CTR BeginNetLuncher(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE) const;
|
|
TP_LISTNTLC_ITR EndNetLuncher(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
TP_LISTNTLC_CTR EndNetLuncher(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE) const;
|
|
|
|
BOOL GetRecvMode(EF_SERVICERECVTYPE pType) const;
|
|
VOID SetRecvMode(EF_SERVICERECVTYPE pType, BOOL pRecvMode);
|
|
VOID ResetAllRecvMode();
|
|
|
|
BOOL IsRecvTick(EF_SERVICERECVTYPE pType) const;
|
|
VOID SetRecvTick(EF_SERVICERECVTYPE pType);
|
|
DWORD GetRecvTickTerm(EF_SERVICERECVTYPE pType) const;
|
|
|
|
VOID ClearAllList(EF_SERVICEMNGRTYPE pType, BOOL pDoLock = FALSE);
|
|
VOID ApplyListTempToReal(BOOL pDoLock); // 임시 목록을 실제 목록에 일괄 적용
|
|
|
|
TP_LOCK* GetLock() const { return(&m_Lock); }
|
|
#if defined(_DEBUG)
|
|
BOOL IsLock() const { return(m_Lock.IsLock()); }
|
|
#endif // _DEBUG
|
|
|
|
LONG64 GetServiceInfoUpdateNo() const { return m_ServiceInfoUpdateNo; }
|
|
LONG64 IncServiceInfoUpdateNo() { return(++m_ServiceInfoUpdateNo); }
|
|
|
|
INT GetContainerVersion() const { return m_ContainerVersion; }
|
|
VOID SetContainerVersion(INT pContainerVersion) { m_ContainerVersion = pContainerVersion; }
|
|
|
|
void ResetDelayCount(EF_SERVICEMNGRTYPE pType);
|
|
void ResetFarmInfo(EF_SERVICEMNGRTYPE pType);
|
|
|
|
VOID SetFarmInfoResetFlag(EF_SERVICEMNGRTYPE pType, BOOL bIsReset){ m_IsFarmInfoReset[pType] = bIsReset; }
|
|
BOOL IsFarmInfoReset(EF_SERVICEMNGRTYPE pType){ return m_IsFarmInfoReset[pType]; }
|
|
private:
|
|
DWORD GetTickTerm(DWORD pOldTick, DWORD pCurTick) const;
|
|
|
|
private:
|
|
BOOL m_IsOpen;
|
|
BOOL m_IsFarmInfoReset[EV_SMT_CNT];
|
|
|
|
TP_LISTWRLD m_ListWrld[EV_SMT_CNT];
|
|
TP_LISTSERV m_ListServ[EV_SMT_CNT];
|
|
TP_LISTCHNL m_ListChnl[EV_SMT_CNT];
|
|
TP_LISTMRIT m_ListMrit[EV_SMT_CNT];
|
|
TP_LISTNTLC m_ListNtlc[EV_SMT_CNT];
|
|
|
|
INT m_TotalUserCount;
|
|
|
|
BOOL m_RecvMode[EV_SRT_CNT];
|
|
DWORD m_RecvTick[EV_SRT_CNT];
|
|
|
|
mutable TP_LOCK m_Lock;
|
|
LONG64 m_ServiceInfoUpdateNo;
|
|
INT m_ContainerVersion;
|
|
}; |