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

📄 gameserver.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}

	DISP_OK;
	//PacketHandler::Instance()->RegisterHandler_DM();

	DISPMSG(  "Initializing map allocator..." );
	g_MapAllocator.Init( stServerOptionInfo.m_wMapPool, stServerOptionInfo.m_wSectorPool, VILLAGE_SECTOR_SIZE, ROOM_SECTOR_SIZE );
	DISP_OK;

	DISPMSG(  "Initializing zone manager & drop formular..." );
	//肺流 檬扁拳
	g_TradeManager.Init( stServerOptionInfo.m_wTradePool );
	g_Ratio.Init();
	DISP_OK;

	// I/O 浚柳 檬扁拳
	DISPMSG(  "Initializing I/O engine..." );
	m_pIOCPServer = new IOCPServer;

	IOHANDLER_DESC desc;

	desc.dwIoHandlerKey					= SERVER_IOHANDLER;
	desc.dwMaxAcceptSession				= pServerEnv->ServerIoHandler.dwMaxAcceptSession;
	desc.dwMaxConnectSession			= pServerEnv->ServerIoHandler.dwMaxConnectSession;
	desc.dwSendBufferSize				= pServerEnv->ServerIoHandler.dwSendBufferSize;
	desc.dwRecvBufferSize				= pServerEnv->ServerIoHandler.dwRecvBufferSize;
	desc.dwTimeOut						= pServerEnv->ServerIoHandler.dwTimeOut;
	desc.dwNumberOfAcceptThreads		= pServerEnv->ServerIoHandler.dwNumberOfAcceptThreads;
	desc.dwNumberOfIoThreads			= pServerEnv->ServerIoHandler.dwNumberOfIoThreads;
	desc.dwNumberOfConnectThreads		= pServerEnv->ServerIoHandler.dwNumberOfConnectThreads;
	desc.dwMaxPacketSize				= pServerEnv->ServerIoHandler.dwMaxPacketSize;
	desc.fnCreateAcceptedObject			= CreateServerSideAcceptedObject;
	desc.fnDestroyAcceptedObject		= DestroyServerSideAcceptedObject;
	desc.fnDestroyConnectedObject		= DestroyServerSideConnectedObject;

	if( !m_pIOCPServer->Init( &desc, 1 ) )
	{
		DISP_FAIL;
		return FALSE;
	}
	DISP_OK;
	DISPMSG(  ">> server-side max connection: accept(%d), connect(%d)\n", desc.dwMaxAcceptSession, desc.dwMaxConnectSession );

	// 寇何肺 目池飘且 技记 按眉 积己
	m_pMasterServerSession	= ServerSessionFactory::Instance()->AllocServerSession( MASTER_SERVER );
	m_pGameDBProxySession	= ServerSessionFactory::Instance()->AllocServerSession( GAME_DBPROXY );
	m_pAgentServerSession	= ServerSessionFactory::Instance()->AllocServerSession( AGENT_SERVER );
	m_pGuildServerSession	= ServerSessionFactory::Instance()->AllocServerSession( GUILD_SERVER );

	pServerEnv = m_pFileParser->GetServerEnv();

	// ini 颇老肺何磐 付胶磐 辑滚 林家 悸泼
	if(pServerEnv->bGetServerInfoFromFile)
	{
		SetServerAddr( GAME_DBPROXY, pServerEnv->pszGameDBProxyServerIP,	pServerEnv->wGameDBProxyServerPort );
		SetServerAddr( AGENT_SERVER, pServerEnv->pszAgentServerInSideIP,	pServerEnv->wAgentServerInSidePort );
		SetServerAddr( GUILD_SERVER, pServerEnv->pszGuildServerIP,	pServerEnv->wGuildServerPort );
	}
	SetServerAddr( MASTER_SERVER, pServerEnv->pszMasterServerIP, pServerEnv->wMasterServerPort );

	// 府目池飘 林扁 汲沥
	m_ReconnectTimer.SetTimer( 1*1000 );

	return TRUE;
}

VOID GameServer::StartListen()
{
	SERVER_ENV * pServerEnv = m_pFileParser->GetServerEnv();

	if( !m_pIOCPServer->IsListening( SERVER_IOHANDLER ) )
	{
		DISPMSG( "[GameServer::StartListen] Starting listen(%s:%d)...\n", pServerEnv->ServerIoHandler.szIP, pServerEnv->ServerIoHandler.wPort );
		if( !m_pIOCPServer->StartListen( SERVER_IOHANDLER, pServerEnv->ServerIoHandler.szIP, pServerEnv->ServerIoHandler.wPort ) )
		{
			DISP_FAIL;
			return ;
		}
		DISP_OK;
	}
}

BOOL GameServer::Update( DWORD dwDeltaTick )
{
	m_pIOCPServer->Update();

	ServerSessionManager::Instance()->Update();


	//g_ZoneManager.Update( dwDeltaTick );
	g_GameZoneManager.Update( dwDeltaTick );

	g_DropManager.Process();

	UpdateFPS();

	// 林扁利栏肺 促弗 辑滚客狼 楷搬 惑怕甫 犬牢窍绊 蜡瘤矫挪促.
	if( m_ReconnectTimer.IsExpired() )
	{
		MaintainConnection();
	}

	return TRUE;
}

DWORD GameServer::ConnectToServer( NetworkObject * pNetworkObject, char * pszIP, WORD wPort )
{
	return m_pIOCPServer->Connect( SERVER_IOHANDLER, pNetworkObject, pszIP, wPort );
}

VOID GameServer::UpdateFPS()
{
	// FPS Check
	static int cnt = 0;
	static DWORD prevTick = GetTickCount();

	cnt++;

	DWORD curTick = GetTickCount();

	if( prevTick + 1000 < curTick )
	{
		m_dwFPS = cnt;
		//printf( "%d FPS", cnt );
		prevTick	= curTick;
		cnt			= 0;

		if( m_dwFPS < 10 )
		{
			DISPMSG(  "============================================================\n" );
			DISPMSG(  "[GameServer::UpdateFPS] FPS Warning!!! [%d] \n", m_dwFPS );
			DISPMSG(  "============================================================\n" );
		}
	}
}

VOID GameServer::DisplayPoolInfo()
{
	DISPMSG( "================= Pool Info =================\n" );
	ObjectFactory::Instance()->DisplayPoolInfo();
	g_GameZoneManager.DisplayPoolInfo();
	SkillFactory::Instance()->DisplayPoolInfo();
	
//	StatusFactory::Instance()->DisplayPoolInfo();
}

VOID GameServer::DisplayServerInfo()
{
	DISPMSG(  "=============== %s ===============\n", GetServerType2String(GetServerType()) );
	DISPMSG(  "Frame Per Second	: %d\n", m_dwFPS );
	DISPMSG(  "Server Connections	: %d\n", m_pIOCPServer->GetNumberOfConnections( SERVER_IOHANDLER ) );
	DISPMSG(  "Player Connections	: %d\n", PlayerManager::Instance()->GetNumberOfPlayers() );
	/*
	DISPMSG(  "Connection to Master Server [ %c ]\n", IsConnectedTo( MASTER_SERVER ) ? 'O' : 'X' );
	DISPMSG(  "Connection to Game DB Proxy [ %c ]\n", IsConnectedTo( GAME_DBPROXY ) ? 'O' : 'X' );
	DISPMSG(  "Connection to Agent Server  [ %c ]\n", IsConnectedTo( AGENT_SERVER ) ? 'O' : 'X' );
	*/

	//g_ZoneManager.zone_print();
	g_GameZoneManager.Display();
	g_GameGuildManager.DisplayerGuildInfo();

	// 烙矫 抛胶飘侩
	DISPMSG(  "PartyNum of PartyManager : %d \n", PartyManager::Instance()->GetPartyNum() );

	if( !m_pFileParser->GetServerEnv()->bGetServerInfoFromFile && !m_pMasterServerSession->IsConnected() )
	{
		DISPMSG(  ">> Warning: Not connected to master server.\n" );
	}
	if( !m_pGameDBProxySession->IsConnected() )
	{
		DISPMSG(  ">> Warning: Not connected to game DB proxy server.\n" );
	}
	if( !m_pAgentServerSession->IsConnected() )
	{
		DISPMSG(  ">> Warning: Not connected to agent server.\n" );
	}
}

VOID GameServer::MaintainConnection()
{
	// 霸烙 辑滚啊 辆丰吝捞搁 府畔
	if( m_bShutdown )						return;

	// Game DB proxy客 楷搬捞 谗绢廉 乐栏搁 促矫 立加阑 矫档茄促.
	if( !m_pGameDBProxySession->IsConnected() && !m_pGameDBProxySession->GetConnectIP().empty() )
	{
		ConnectTo( GAME_DBPROXY );
	}

	// Agent server客 楷搬捞 谗绢廉 乐栏搁 促矫 立加阑 矫档茄促.
	if( !m_pAgentServerSession->IsConnected() && !m_pAgentServerSession->GetConnectIP().empty() )
	{
		ConnectTo( AGENT_SERVER );
	}

	// Guild Server客 楷搬捞 谗绢廉 乐栏搁 促矫 立加阑 矫档茄促.
	if( !m_pGuildServerSession->IsConnected() && !m_pGuildServerSession->GetConnectIP().empty() )
	{
		ConnectTo( GUILD_SERVER );
	}

	// 辑滚 沥焊甫 付胶磐肺何磐 罐霸阐 技泼登绢 乐绰 版快 MasterServer客狼 楷搬捞 谗绢脸栏搁 立加 矫档
	if( !m_pFileParser->GetServerEnv()->bGetServerInfoFromFile )
	{
		if( !m_pMasterServerSession->IsConnected() && !m_pMasterServerSession->GetConnectIP().empty() )
		{
			ConnectTo( MASTER_SERVER );
		}
	}
}

BOOL GameServer::SendToGameDBPServer( MSG_BASE_FORWARD * pMsg, WORD wSize )
{
	ASSERT( m_pGameDBProxySession );
	return m_pGameDBProxySession->Send( (BYTE *)pMsg, wSize);
}
BOOL GameServer::SendToGuildServer( MSG_BASE_FORWARD * pMsg, WORD wSize )
{
	ASSERT( m_pGuildServerSession );
	return m_pGuildServerSession->Send( (BYTE *)pMsg, wSize);
}
VOID GameServer::ReloadData()
{
	// 府肺爹 窍瘤 给窍绰 巴!!!
	//MapInfoParser::Instance()->Reload();
	//TriggerParser::Instance()->Reload();

	// 葛电 颇辑 府肺爹

	ItemInfoParser::Instance()->Reload("data\\WeaponItemInfo.txt");
	ItemInfoParser::Instance()->Reload("data\\ArmorItemInfo.txt");
	ItemInfoParser::Instance()->Reload("data\\WasteItemInfo.txt");
	ItemInfoParser::Instance()->Reload("data\\AccessoryItemInfo.txt");

	NPCInfoParser::Instance()->Reload();
//	CharInfoParser::Instance()->Reload();
	ShopInfoParser::Instance()->Reload();
	SkillInfoParser::Instance()->Reload();
	RegenParser::Instance()->Reload();
	GroupParser::Instance()->Reload();
	StateInfoParser::Instance()->Reload();
	//ItemOptionParser::Instance()->Reload();
	ItemCompositeParser::Instance()->Reload();
	//RareItemDropParser::Instance()->Reload();
	//ItemDropParser::Instance()->Reload();

	MissionRewardParser::Instance()->Reload();
	FormulaRatioParser::Instance()->Reload();
	StyleQuickRegistInfoParser::Instance()->Reload();
	AIParamParser::Instance()->Reload();
	ServerOptionParser::Instance()->Reload();
	EnchantParser::Instance()->Reload();
//	GMList::Instance()->Reload(); => 府肺靛 力措肺 救凳!! 霖籍捞绰 滚弊 荐沥且 巴!!

	g_Ratio.Release();
	g_Ratio.Init();

	// 何啊利栏肺 府肺爹秦具 窍绰 巴
	g_DropManager.Reload();
}

VOID GameServer::SetServerAddr( eSERVER_TYPE eServerType, char *pszIP, WORD wPort )
{
	switch( eServerType )
	{
	case MASTER_SERVER:
		m_pMasterServerSession->SetAddr( pszIP, wPort );		break;
	case GAME_DBPROXY:
		return m_pGameDBProxySession->SetAddr( pszIP, wPort );	break;
	case AGENT_SERVER:
		return m_pAgentServerSession->SetAddr( pszIP, wPort );	break;
	case GUILD_SERVER:
		return m_pGuildServerSession->SetAddr( pszIP, wPort );	break;
	default:
		ASSERT( !"弊繁 辑滚 鸥涝篮 绝绢夸" );
	}
}

VOID GameServer::ConnectTo( eSERVER_TYPE eServerType )
{
	switch( eServerType )
	{
	case MASTER_SERVER:
		ConnectToServer( m_pMasterServerSession,
			(char*)m_pMasterServerSession->GetConnectIP().c_str(), m_pMasterServerSession->GetConnectPort() );
        break;

	case GAME_DBPROXY:
		ConnectToServer( m_pGameDBProxySession,
			(char*)m_pGameDBProxySession->GetConnectIP().c_str(), m_pGameDBProxySession->GetConnectPort() );
		break;

	case AGENT_SERVER:
		ConnectToServer( m_pAgentServerSession,
			(char*)m_pAgentServerSession->GetConnectIP().c_str(), m_pAgentServerSession->GetConnectPort() );
		break;
	case GUILD_SERVER:
		ConnectToServer( m_pGuildServerSession,
			(char*)m_pGuildServerSession->GetConnectIP().c_str(), m_pGuildServerSession->GetConnectPort() );
		break;

	default:
		ASSERT( !"弊繁 辑滚 鸥涝篮 绝绢夸" );
	}
}

BOOL GameServer::IsConnectedTo( eSERVER_TYPE eServerType )
{
	switch( eServerType )
	{
	case MASTER_SERVER:
		return m_pMasterServerSession->IsConnected();
	case GAME_DBPROXY:
		return m_pGameDBProxySession->IsConnected();
	case AGENT_SERVER:
		return m_pAgentServerSession->IsConnected();
	case GUILD_SERVER:
		return m_pGuildServerSession->IsConnected();
	}

	ASSERT( !"弊繁 辑滚 鸥涝篮 绝绢夸" );

	return FALSE;
}



///------------------------------------------------------------------------------------------------
/// 辑滚率 妮归
NetworkObject* CreateServerSideAcceptedObject()
{
	ServerSession * pServerSession = ServerSessionFactory::Instance()->AllocServerSession( TEMP_SERVER );
	return (NetworkObject*)pServerSession;
}

VOID DestroyServerSideAcceptedObject( NetworkObject *pNetworkObject )
{
	ServerSession *pServerSession = (ServerSession*)pNetworkObject;
	ServerSessionFactory::Instance()->FreeServerSession( (ServerSession *)pNetworkObject );
}

VOID DestroyServerSideConnectedObject( NetworkObject *pNetworkObject )
{
	__UNUSED(pNetworkObject);	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -