Files
Sun1602/Server/WorldServer/WorldServer.h
T
2022-10-26 12:25:11 +08:00

158 lines
4.2 KiB
C++

#ifndef _WORLDSERVER_H_
#define _WORLDSERVER_H_
#define DISP_OK DISPMSG( " [OK]\n" );
#define DISP_FAIL DISPMSG( " Failed!\n" );
#include <windows.h>
#include <Singleton.h>
#include <map>
#include <const.h>
#include <Timer.h>
#include <ServerStruct.h>
#ifdef _JP_0_20101123_PMS
#include <PMS/PMSManager.h>
#endif
// 맵 로딩 위해 추가
#pragma warning(push)
#pragma warning(disable : 4100 4201)
#include <3DEngine/3DTerrain/3DTerrain.h>
#pragma warning(pop)
class IOCPServer;
class Session;
//class ServerSession;
//class NetworkObject;
#include "./ServerSession.h"
class ScriptParserManager;
#ifdef _JP_0_20101123_PMS
class PMSAnnounceRequest : public IAnnounceRequest
{
BOOL OnAnnounceReq(LPCSTR lpszMsg);
};
#endif
class WorldServer : public util::Singleton<WorldServer>
{
enum { CLIENT_IOHANDLER = 0,
SERVER_IOHANDLER = 1 };
friend NetworkObject* CallBackOnAccept( DWORD dwNetworkIndex );
friend VOID CallBackOnDisconnect( DWORD dwSessionIndex, NetworkObject *pNetworkObject );
public:
WorldServer();
~WorldServer();
VOID UpdateServerTitle();
BOOL Init();
VOID Release();
VOID Run();
BOOL Update();
VOID StartListen();
VOID StartListen( char *szIP, WORD wPort, char *szInnerIP, WORD wInnerPort );
VOID ConnectToServer( NetworkObject *pNetworkObject, char *pszIP, WORD wPort );
inline VOID Shutdown() { m_bShutdown = TRUE; }
inline BOOL IsOnShutdown() { return m_bShutdown; }
inline VOID SetServerKey( SERVER_KEY key ) { m_ServerKey = key;
#ifdef _JP_0_20101123_PMS
pms_manager_.SetCategory(key.m_dwKey);
#endif
}
inline SERVER_KEY GetServerKey() { return m_ServerKey; }
inline DWORD GetWorldID() { return m_ServerKey.GetWorldID(); }
inline DWORD GetChannelID() { return m_ServerKey.GetChannelID(); }
inline DWORD GetServerID() { return m_ServerKey.GetServerID(); }
#ifdef _JP_0_20101123_PMS
inline PMSManager* GetPMSManager() {return &pms_manager_;}
VOID SetPMSSessionCount();
VOID SetPMSChannelCount(DWORD channel_count);
#endif
VOID ConnectToDBProxyServer();
BOOL ProcessConsole();
VOID ReadAndSendNotice();
BOOL IsConnectedTo( eSERVER_TYPE eServerType );
VOID SetGameDBProxyServerAddr( TCHAR* tszDBProxyIP, WORD wDBProxyPort );
VOID ConnectToGameDBProxyServer();
VOID SendGameDBProxy( BYTE* pMsg, WORD wSize );
ServerSession* GetGameDBProxy() const;
inline eSERVER_TYPE GetServerType() { return WORLD_SERVER; }
HINSTANCE m_hDll3DTerrain; // DLL Instance
CLoadHelper * m_pLoadHelper;
FUNC_ContactTerrain m_fnContactTerrain; // 맵 정보 연결 function
inline BOOL CheckShoutInterval( DWORD &dwCheckTime )
{
if( m_dwGlobalTick > dwCheckTime + m_dwShoutInterval )
{
dwCheckTime = m_dwGlobalTick;
return TRUE;
}
return FALSE;
}
inline BOOL CheckWorldShoutInterval(DWORD &dwWorldCheckTime)
{
if(m_dwGlobalTick > dwWorldCheckTime + m_dwShoutInterval)
{
dwWorldCheckTime = m_dwGlobalTick;
return TRUE;
}
return FALSE;
}
VOID DisplayServerListInfo();
inline DWORD GetGlobalTick() { return m_dwGlobalTick; }
public:
static VOID StartWorldServer();
public:
inline ServerSession* GetMasterServerSession() { return m_pMasterServer; }
inline ePHASE_SHIFT GetPhaseStatus() { return m_PHASE_SHIFT; }
inline VOID SetPhaseStatus( ePHASE_SHIFT phase ) { m_PHASE_SHIFT = phase; }
private:
ePHASE_SHIFT m_PHASE_SHIFT;
private:
VOID UpdateFPS();
VOID DisplayServerInfo();
VOID MaintainConnection();
BOOL CreateSunLog();
BOOL CreateGameLog();
private:
#ifdef _JP_0_20101123_PMS
PMSManager pms_manager_;
#endif
ServerSession *m_pMasterServer;
ServerSession *m_pGameDBProxy;
IOCPServer *m_pIOCPServer;
BOOL m_bShutdown;
DWORD m_dwFPS;
util::Timer m_ReconnectTimer;
SERVER_KEY m_ServerKey;
util::Timer m_UserManagerTimer;
DWORD m_dwShoutInterval; // 외치기 간격
DWORD m_dwGlobalTick; // 프레임당 딱 한번 돌리는, 타이머를 쓰지 않는 개체들의 기준 시각
ScriptParserManager* m_pWorldScriptParserManager;
};
#endif // _WORLDSERVER_H_