📄 worldserver.cpp
字号:
#include "stdafx.h"
#include "WorldServer.h"
#include "PacketHandler.h"
#include "AccountDBProxySession.h"
#include "ServerSessionFactory.h"
#include "ServerSessionManager.h"
#include "WorldServerInfoParser.h"
#include "UserFactory.h"
#include "User.h"
#include "WaitingUserList.h"
#include "UserManager.h"
#include "ZoneFactory.h"
#include "ChannelManager.h"
#include <conio.h>
#include <IOCPServer.h>
#include <iostream>
#include <process.h>
#include <PacketStruct_CW.h>
#include <GMList.h>
#include "ViewPortManager.h"
// 滚傈 嘛扁
#include <Version.h>
#include <ServerBuildVersion.h>
#include <ServerGlobal.h>
#include <mapinfoparser.h>
//=================================================================================================
// 努扼率 妮归窃荐
//=================================================================================================
NetworkObject* CreateClientSideAcceptedObject()
{
return UserFactory::Instance()->Alloc( TEMP_USER );
}
VOID DestroyClientSideAcceptedObject( NetworkObject *pNetworkObject )
{
UserFactory::Instance()->Free( (User*)pNetworkObject );
}
VOID DestroyClientSideConnectedObject( NetworkObject *pNetworkObject )
{
assert( 0 );
}
//=================================================================================================
// 辑滚率 妮归窃荐
//=================================================================================================
NetworkObject* CreateServerSideAcceptedObject()
{
ServerSession *pServerSession = ServerSessionFactory::Instance()->AllocServerSession( TEMP_SERVER );
return (NetworkObject*)pServerSession;
}
VOID DestroyServerSideAcceptedObject( NetworkObject *pNetworkObject )
{
ServerSessionFactory::Instance()->FreeServerSession( (ServerSession*)pNetworkObject );
}
VOID DestroyServerSideConnectedObject( NetworkObject *pNetworkObject )
{
}
WorldServer::WorldServer()
{
m_pIOCPServer = NULL;
m_bShutdown = FALSE;
m_pMasterServer = NULL;
m_pGameDBProxy = NULL;
m_ServerKey = 0;
}
WorldServer::~WorldServer()
{
if( m_pIOCPServer ) delete m_pIOCPServer;
if( m_pMasterServer ) delete m_pMasterServer;
if( m_pGameDBProxy ) delete m_pGameDBProxy;
}
VOID WorldServer::Release()
{
if( m_pIOCPServer ) m_pIOCPServer->Shutdown();
UserFactory::Instance()->Release();
ZoneFactory::Instance()->Release();
UserManager::Instance()->Release();
WaitingUserList::Instance()->Release();
ChannelManager::Instance()->Release();
GMList::Instance()->Release();
if( m_pMasterServer )
{
m_pMasterServer->Release();
ServerSessionFactory::Instance()->FreeServerSession( (ServerSession*)m_pMasterServer );
m_pMasterServer = NULL;
}
if( m_pGameDBProxy )
{
m_pGameDBProxy->Release();
ServerSessionFactory::Instance()->FreeServerSession( (ServerSession*)m_pGameDBProxy );
m_pGameDBProxy = NULL;
}
// ViewPortManager::Instance()->Release();
MapInfoParser *pParser = MapInfoParser::Instance();
pParser->Release();
MapInfoParser::DestroyInstance();
SAFE_DELETE(g_pLOG);
SAFE_DELETE(g_pWorldLog);
SAFE_DELETE(g_pCountLog);
}
VOID WorldServer::UpdateServerTitle()
{
#ifdef _DEBUG
DisplayDebugInfo( GetServerType(), TRUE, C2S_HIGH_VERSION_NO, C2S_MIDDLE_VERSION_NO, C2S_LOW_VERSION_NO, SERVER_RELEASE_BUILD_NO, GetWorldID(), m_ServerKey.GetServerID() );
#else
DisplayDebugInfo( GetServerType(), FALSE, C2S_HIGH_VERSION_NO, C2S_MIDDLE_VERSION_NO, C2S_LOW_VERSION_NO, SERVER_RELEASE_BUILD_NO, GetWorldID(), GetChannelID(), m_ServerKey.GetServerID() );
#endif
}
BOOL WorldServer::Init()
{
// INI 颇老 颇教
if( !WorldServerInfoParser::Instance()->ParseINI( "WorldServer.ini" ) )
{
MessageOut(eCRITICAL_LOG, "WorldServer.ini parsing failed." );
return FALSE;
}
if( WorldServerInfoParser::Instance()->IsServerInfoFromFile() )
{
m_ServerKey.Set( WorldServerInfoParser::Instance()->GetWorldID(), 0, 0, 1 );
}
UpdateServerTitle();
//-------------------------------------------------------------------------------------------------
// 肺弊 颇老 沥焊 檬扁拳
//-------------------------------------------------------------------------------------------------
DISPMSG( "Creating GameLog File...\n" );
char *szLogPath = WorldServerInfoParser::Instance()->GetLogFilePath();
g_pLOG = new WorldLog;
CreateDirectory(szLogPath, NULL);
TCHAR szPath[100], szTextPath[100];
strncpy(szPath, szLogPath, 100);
strcat(szPath, "\\\\WORLD");
strncpy(szTextPath, szLogPath, 100);
strcat(szTextPath, "\\\\WORLD_TEXT");
if( !g_pLOG->Init( _T(szPath), _T("SUN_WORLD"), _T(szTextPath) ) )
{
//GAMELOG甫 巢扁瘤 臼嚼聪促.
}
DISP_OK;
//SUN Log File 檬扁拳
DISPMSG( "Creating SunLog File...\n" );
g_pWorldLog = new CSunLog;
SUNLOG_INFO* pSunLogInfo = WorldServerInfoParser::Instance()->GetSunLogInfo();
if(g_pWorldLog->Init(pSunLogInfo->bySunLogOption, (BYTE)pSunLogInfo->wSunLogfileLevel,
pSunLogInfo->pszSunLogfilePath, "World") == false)
{
//SunLog甫 父甸瘤 臼嚼聪促.
}
DISPMSG( "Creating CountLog File...\n" );
g_pCountLog = new CSunLog;
if(g_pCountLog->Init(1, (BYTE)pSunLogInfo->wSunLogfileLevel,
pSunLogInfo->pszSunLogfilePath, "Count") == false)
{
//SunLog甫 父甸瘤 臼嚼聪促.
}
//甘 肺爹 抛胶飘吝
// ViewPortManager::Instance()->TestLoadMap();
#ifndef _DEBUG
// DLL 肺爹
char *lpszDLL = "3DTerrain_s.dll";
#else
// DLL 肺爹
char *lpszDLL = "3DTerrain_sd.dll";
#endif
m_hDll3DTerrain = Load3DTerrainLibrary( lpszDLL, &m_fnContactTerrain);
if ( !m_hDll3DTerrain)
{
MessageOut( eCRITICAL_LOG, "dll loading failed.\n" );
return FALSE;
}
// 甘 沥焊 肺靛
MapInfoParser *pParser = MapInfoParser::Instance();
pParser->Init( 100 );
pParser->Load( "data\\",
"World.txt", "Field.txt" );
INI_IOHANDLER_DESC *pDesc;
// IO 浚柳 牢胶畔胶 积己 棺 檬扁拳
m_pIOCPServer = new IOCPServer;
IOHANDLER_DESC desc[2];
pDesc = WorldServerInfoParser::Instance()->GetClientIoDesc();
desc[0].dwIoHandlerKey = CLIENT_IOHANDLER;
desc[0].dwMaxAcceptSession = pDesc->dwMaxAcceptSession;
desc[0].dwMaxConnectSession = pDesc->dwMaxConnectSession;
desc[0].dwSendBufferSize = pDesc->dwSendBufferSize;
desc[0].dwRecvBufferSize = pDesc->dwRecvBufferSize;
desc[0].dwTimeOut = pDesc->dwTimeOut;
desc[0].dwMaxPacketSize = pDesc->dwMaxPacketSize;
desc[0].dwNumberOfIoThreads = pDesc->dwNumberOfIoThreads;
desc[0].dwNumberOfAcceptThreads = pDesc->dwNumberOfAcceptThreads;
desc[0].dwNumberOfConnectThreads = pDesc->dwNumberOfConnectThreads;
desc[0].fnCreateAcceptedObject = CreateClientSideAcceptedObject;
desc[0].fnDestroyAcceptedObject = DestroyClientSideAcceptedObject;
desc[0].fnDestroyConnectedObject = DestroyClientSideConnectedObject;
pDesc = WorldServerInfoParser::Instance()->GetServerIoDesc();
desc[1].dwIoHandlerKey = SERVER_IOHANDLER;
desc[1].dwMaxAcceptSession = pDesc->dwMaxAcceptSession;
desc[1].dwMaxConnectSession = pDesc->dwMaxConnectSession;
desc[1].dwSendBufferSize = pDesc->dwSendBufferSize;
desc[1].dwRecvBufferSize = pDesc->dwRecvBufferSize;
desc[1].dwTimeOut = pDesc->dwTimeOut;
desc[1].dwMaxPacketSize = pDesc->dwMaxPacketSize;
desc[1].dwNumberOfIoThreads = pDesc->dwNumberOfIoThreads;
desc[1].dwNumberOfAcceptThreads = pDesc->dwNumberOfAcceptThreads;
desc[1].dwNumberOfConnectThreads = pDesc->dwNumberOfConnectThreads;
desc[1].fnCreateAcceptedObject = CreateServerSideAcceptedObject;
desc[1].fnDestroyAcceptedObject = DestroyServerSideAcceptedObject;
desc[1].fnDestroyConnectedObject = DestroyServerSideConnectedObject;
m_pIOCPServer->Init( desc, 2 );
UserFactory::Instance()->Init( desc[0].dwMaxAcceptSession );
ZoneFactory::Instance()->Init();
UserManager::Instance()->Init();
WaitingUserList::Instance()->Init();
ChannelManager::Instance()->Init();
m_pGameDBProxy = (ServerSession*)ServerSessionFactory::Instance()->AllocServerSession( GAME_DBPROXY );
if( WorldServerInfoParser::Instance()->IsServerInfoFromFile() )
{
//GMList 肺爹(烙矫)
GMList::Instance()->Load( "data\\GMList.txt", "data\\SuperUserList.txt" );
// 霸烙DB橇遏矫 辑滚 楷搬 沥焊 技泼
m_pGameDBProxy->SetAddr( WorldServerInfoParser::Instance()->GetGameDBProxyIP(),
WorldServerInfoParser::Instance()->GetGameDBProxyPort() );
MessageOut(eCRITICAL_LOG, "GameDBProxy server address(%s:%d)", WorldServerInfoParser::Instance()->GetGameDBProxyIP(),
WorldServerInfoParser::Instance()->GetGameDBProxyPort() );
}
// 菩哦 勤甸矾 殿废
PacketHandler::Instance()->RegisterPackets();
m_pMasterServer = (ServerSession*)ServerSessionFactory::Instance()->AllocServerSession( MASTER_SERVER );
// 付胶磐 辑滚 楷搬 沥焊 技泼
m_pMasterServer->SetAddr( WorldServerInfoParser::Instance()->GetMasterServerIP(),
WorldServerInfoParser::Instance()->GetMasterServerPort() );
MessageOut(eCRITICAL_LOG, "Master server address(%s:%d)", WorldServerInfoParser::Instance()->GetMasterServerIP(),
WorldServerInfoParser::Instance()->GetMasterServerPort() );
m_ReconnectTimer.SetTimer( 1000 );
return TRUE;
}
VOID WorldServer::StartListen()
{
if( !m_pIOCPServer->IsListening( CLIENT_IOHANDLER ) )
{
INI_IOHANDLER_DESC *pDesc = WorldServerInfoParser::Instance()->GetClientIoDesc();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -