⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 worldserver.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -