392 lines
No EOL
28 KiB
C++
392 lines
No EOL
28 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;
|
||
}; |