📄 gameserver.cpp
字号:
}
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 + -