2024-12-21 10:04:04 +08:00
|
|
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
|
|
#include "DNIocpManager.h"
|
|
|
|
|
|
#include "DNServiceConnection.h"
|
|
|
|
|
|
#include "Log.h"
|
|
|
|
|
|
#include "DNServerPacket.h"
|
|
|
|
|
|
#include "DNEvent.h"
|
|
|
|
|
|
#if defined (_GAMESERVER)
|
|
|
|
|
|
extern TGameConfig g_Config;
|
|
|
|
|
|
#include "DNGameServerManager.h"
|
|
|
|
|
|
#include "DNDBConnection.h"
|
|
|
|
|
|
#include "DNDBConnectionManager.h"
|
|
|
|
|
|
#include "DNMasterConnection.h"
|
|
|
|
|
|
#include "DNMasterConnectionManager.h"
|
|
|
|
|
|
#include "CloseSystem.h"
|
|
|
|
|
|
#include "DNAuthManager.h"
|
|
|
|
|
|
#elif defined (_MASTERSERVER)
|
|
|
|
|
|
#include "DNDivisionManager.h"
|
|
|
|
|
|
#include "DNLoginConnection.h"
|
|
|
|
|
|
#include "DNUser.h"
|
|
|
|
|
|
#include "DNWaitUserManager.h"
|
|
|
|
|
|
#include "DNExtManager.h"
|
|
|
|
|
|
#include "DNWaitUserManager.h"
|
|
|
|
|
|
#include "DNVillageConnection.h"
|
|
|
|
|
|
#include "DNGuildWarManager.h"
|
|
|
|
|
|
extern TMasterConfig g_Config;
|
|
|
|
|
|
#elif defined (_VILLAGESERVER)
|
|
|
|
|
|
extern TVillageConfig g_Config;
|
|
|
|
|
|
#include "DNUserSessionManager.h"
|
|
|
|
|
|
#include "DNDBConnection.h"
|
|
|
|
|
|
#include "DNDBConnectionManager.h"
|
|
|
|
|
|
#include "DNCashConnection.h"
|
|
|
|
|
|
#include "CloseSystem.h"
|
|
|
|
|
|
#include "DNAuthManager.h"
|
|
|
|
|
|
#include "DNGameDataManager.h"
|
|
|
|
|
|
#elif defined (_DBSERVER)
|
|
|
|
|
|
#include "DNExtManager.h"
|
|
|
|
|
|
extern TDBConfig g_Config;
|
|
|
|
|
|
#elif defined (_LOGINSERVER)
|
|
|
|
|
|
extern TLoginConfig g_Config;
|
|
|
|
|
|
#include "DNUserConnectionManager.h"
|
|
|
|
|
|
#include "CloseSystem.h"
|
|
|
|
|
|
#include "DNMasterConnectionManager.h"
|
|
|
|
|
|
#include "DNAuthManager.h"
|
|
|
|
|
|
#include "DNSQLWorldManager.h"
|
|
|
|
|
|
#if defined( PRE_ADD_DWC )
|
|
|
|
|
|
#include "DNDWCChannelManager.h"
|
|
|
|
|
|
#endif // #if defined( PRE_ADD_DWC )
|
|
|
|
|
|
#elif defined (_LOGSERVER)
|
|
|
|
|
|
extern TLogConfig g_Config;
|
|
|
|
|
|
#elif defined(_CASHSERVER)
|
|
|
|
|
|
#include "DNExtManager.h"
|
|
|
|
|
|
extern TCashConfig g_Config;
|
|
|
|
|
|
#if defined(PRE_ADD_LIMITED_CASHITEM)
|
|
|
|
|
|
#include "DNLimitedCashItemRepository.h"
|
|
|
|
|
|
#endif //#if defined(PRE_ADD_LIMITED_CASHITEM)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( PRE_PVP_GAMBLEROOM )
|
|
|
|
|
|
#if defined( _VILLAGESERVER )
|
|
|
|
|
|
#include "DNPvPRoomManager.h"
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
CDNServiceConnection * g_pServiceConnection = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
CDNServiceConnection::CDNServiceConnection(int nManagedID)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_nManagedID = nManagedID;
|
|
|
|
|
|
m_dwReconnectTick = 0;
|
|
|
|
|
|
#if defined(_FINAL_BUILD)
|
|
|
|
|
|
Init( 1024*1024, 1024*1024 );
|
|
|
|
|
|
#else // #if defined(_FINAL_BUILD)
|
|
|
|
|
|
Init( 1024*100, 1024*100 );
|
|
|
|
|
|
#endif // #if defined(_FINAL_BUILD)
|
|
|
|
|
|
m_bIsInit = false;
|
|
|
|
|
|
|
|
|
|
|
|
m_nScopeCnt = 0;
|
|
|
|
|
|
memset(&m_nScopeElapsed, 0, sizeof(m_nScopeElapsed));
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_MASTERSERVER)
|
|
|
|
|
|
m_nManagedType = MANAGED_TYPE_MASTER;
|
|
|
|
|
|
#elif defined (_LOGINSERVER)
|
|
|
|
|
|
m_nManagedType = MANAGED_TYPE_LOGIN;
|
|
|
|
|
|
#elif defined (_GAMESERVER)
|
|
|
|
|
|
m_nManagedType = MANAGED_TYPE_GAME;
|
|
|
|
|
|
#elif defined (_VILLAGESERVER)
|
|
|
|
|
|
m_nManagedType = MANAGED_TYPE_VILLAGE;
|
|
|
|
|
|
#elif defined (_DBSERVER)
|
|
|
|
|
|
m_nManagedType = MANAGED_TYPE_DB;
|
|
|
|
|
|
#elif defined (_CASHSERVER)
|
|
|
|
|
|
m_nManagedType = MANAGED_TYPE_CASH;
|
|
|
|
|
|
#else
|
|
|
|
|
|
m_nManagedType = MANAGED_TYPE_LOG;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
m_bCloseServer = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CDNServiceConnection::~CDNServiceConnection()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_dwReconnectTick = 0;
|
|
|
|
|
|
m_bIsInit = false;
|
|
|
|
|
|
|
|
|
|
|
|
m_nScopeCnt = 0;
|
|
|
|
|
|
memset(&m_nScopeElapsed, 0, sizeof(m_nScopeElapsed));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int CDNServiceConnection::MessageProcess(int iMainCmd, int iSubCmd, char *pData, int iLen)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (iMainCmd)
|
|
|
|
|
|
{
|
|
|
|
|
|
case NETSERVICE_CONNECTED:
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceConnected * pPacket = (TServiceConnected*)pData;
|
|
|
|
|
|
|
|
|
|
|
|
SetSessionID(pPacket->nSessionID);
|
|
|
|
|
|
#if defined(_GAMESERVER)
|
|
|
|
|
|
BYTE cCount = 0;
|
|
|
|
|
|
BYTE cWorldID[WORLDCOUNTMAX];
|
|
|
|
|
|
memset(&cWorldID, 0, sizeof(cWorldID));
|
|
|
|
|
|
|
|
|
|
|
|
cCount = g_pMasterConnectionManager->GetWorldSetIDs(cWorldID);
|
|
|
|
|
|
|
|
|
|
|
|
SendRegistManager(m_nManagedID, m_nManagedType, g_Config.szVersion, g_Config.szResVersion, 0, cCount, cWorldID);
|
|
|
|
|
|
#elif defined(_VILLAGESERVER) || defined(_MASTERSERVER) || defined(_CASHSERVER)
|
|
|
|
|
|
SendRegistManager(m_nManagedID, m_nManagedType, g_Config.szVersion, g_Config.szResVersion, g_Config.nWorldSetID, 0, NULL);
|
|
|
|
|
|
#ifdef _MASTERSERVER
|
|
|
|
|
|
SendMeritInfo();
|
|
|
|
|
|
SendWorldInfo();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#else
|
|
|
|
|
|
SendRegistManager(m_nManagedID, m_nManagedType, g_Config.szVersion, g_Config.szResVersion, 0, 0, NULL);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
m_bIsInit = true;
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_MAKE_DUMP:
|
|
|
|
|
|
{
|
|
|
|
|
|
g_pIocpManager->StoreMiniDump();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_DETACHALLUSER:
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(_GAMESERVER) || defined (_VILLAGESERVER) || defined (_LOGINSERVER)
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _VILLAGESERVER
|
|
|
|
|
|
|
|
|
|
|
|
g_pUserSessionManager->DetachAllConnection();
|
|
|
|
|
|
#ifdef PRE_ADD_SEETMAINTENANCEFLAG
|
|
|
|
|
|
BYTE cThreadID;
|
|
|
|
|
|
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
|
|
|
|
|
|
if (pDBCon)
|
|
|
|
|
|
{
|
|
|
|
|
|
pDBCon->QuerySetMaintenanceFlag(cThreadID, 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif //#ifdef PRE_ADD_SEETMAINTENANCEFLAG
|
|
|
|
|
|
|
|
|
|
|
|
#elif _GAMESERVER
|
|
|
|
|
|
g_pGameServerManager->DestroyAllGameRoom();
|
|
|
|
|
|
#elif _LOGINSERVER
|
|
|
|
|
|
#if defined(_TW) && defined(_FINAL_BUILD)
|
|
|
|
|
|
g_pUserConnectionManager->SendAllLogOutTW();
|
|
|
|
|
|
#endif // #if defined(_TW)
|
|
|
|
|
|
#endif // _LOGINSERVER
|
|
|
|
|
|
|
|
|
|
|
|
//2010.11.19 haling <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʱ<EFBFBD>ȭ..<2E><><EFBFBD><EFBFBD> ī<><C4AB>Ʈ <20><><EFBFBD><EFBFBD>?
|
|
|
|
|
|
g_pAuthManager->QueryResetAuthServerClose();
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _LOGINSERVER
|
|
|
|
|
|
//ServiceClose Flow
|
|
|
|
|
|
//<2F>α<EFBFBD><CEB1>μ<EFBFBD><CEBC><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>쿡<EFBFBD><ECBFA1> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ٷ<EFBFBD> <20><><EFBFBD>Ḯ<EFBFBD><E1B8AE><EFBFBD><EFBFBD>
|
|
|
|
|
|
SendServiceClosed();
|
|
|
|
|
|
#endif //#ifdef _LOGINSERVER
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
m_bCloseServer = true;
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_EVENTUPDATE:
|
|
|
|
|
|
{
|
|
|
|
|
|
LoadWorldEvent();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_SIMPLECONFIGUPDATE:
|
|
|
|
|
|
{
|
|
|
|
|
|
//#ifdef PRE_MOD_RESTRICT_IDENTITY_IP
|
|
|
|
|
|
// LoadSimpleConfig();
|
|
|
|
|
|
//#endif //#ifdef PRE_MOD_RESTRICT_IDENTITY_IP
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_PING:
|
|
|
|
|
|
{
|
|
|
|
|
|
SendPong();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _MASTERSERVER
|
|
|
|
|
|
case NETSERVICE_NOTICE:
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!g_pDivisionManager) return ERROR_NONE;
|
|
|
|
|
|
TServiceNotice * pPacket = (TServiceNotice*)pData;
|
|
|
|
|
|
|
|
|
|
|
|
WCHAR wszChatMsg[CHATLENMAX] = { 0, };
|
|
|
|
|
|
_wcscpy(wszChatMsg, CHATLENMAX, pPacket->wszMsg, pPacket->nLen);
|
|
|
|
|
|
|
|
|
|
|
|
//Ÿ<>Ժ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
switch (pPacket->nNoticeType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case _NOTICETYPE_WORLD:
|
|
|
|
|
|
g_pDivisionManager->Notice(wszChatMsg, pPacket->nLen, pPacket->nSlideShowSec);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case _NOTICETYPE_EACHSERVER:
|
|
|
|
|
|
g_pDivisionManager->NoticeServer(pPacket->nManagedID, wszChatMsg, pPacket->nLen, pPacket->nSlideShowSec);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case _NOTICETYPE_CHANNEL:
|
|
|
|
|
|
g_pDivisionManager->NoticeChannel(pPacket->nChannelID, wszChatMsg, pPacket->nLen, pPacket->nSlideShowSec);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case _NOTICETYPE_ZONE:
|
|
|
|
|
|
g_pDivisionManager->NoticeZone(pPacket->nMapIdx, wszChatMsg, pPacket->nLen, pPacket->nSlideShowSec);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_SELECTJOIN:
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceSelectjoin * pPacket = (TServiceSelectjoin*)pData;
|
|
|
|
|
|
|
|
|
|
|
|
if (g_pDivisionManager->AddSelectJoin(pPacket->nSID, pPacket->wszCharacterName) == false)
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_CLEAR_SELECTJOIN:
|
|
|
|
|
|
{
|
|
|
|
|
|
g_pDivisionManager->ClearSelectJoin();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_CANCELNOTICE:
|
|
|
|
|
|
{
|
|
|
|
|
|
g_pDivisionManager->NoticeCancel();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_CHANNEL_CONTROL:
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceChannelControl * pPacket = (TServiceChannelControl*)pData;
|
|
|
|
|
|
if (g_pDivisionManager->ChannelControl(pPacket->nChannelID, pPacket->cVisibility == 0 ? false : true, pPacket->nChannelPopulation) == true)
|
|
|
|
|
|
g_pDivisionManager->SendVillageInfo();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_POPULATION_CONTROL:
|
|
|
|
|
|
{
|
|
|
|
|
|
TServicePopulationControl * pPacket = (TServicePopulationControl*)pData;
|
|
|
|
|
|
g_pDivisionManager->PopulationControl(pPacket->nServerType, pPacket->nManagedID, pPacket->cZeroPopulation == 0 ? false : true);
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_AFFINITY_CONTROL:
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceAffinityControl * pPacket = (TServiceAffinityControl*)pData;
|
|
|
|
|
|
g_pDivisionManager->SetGameConAffinityType(pPacket->nManagedID, pPacket->cAffinityType);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_USERRESTRAINT:
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceUserRestraint * pPacket = (TServiceUserRestraint*)pData;
|
|
|
|
|
|
g_pDivisionManager->UpdateUserRestraint(pPacket->nAccountDBID);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_USERBAN:
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceUserBan * pPacket = (TServiceUserBan*)pData;
|
|
|
|
|
|
|
|
|
|
|
|
CDNUser * pUser = NULL;
|
|
|
|
|
|
UINT nBanAccountDBID = 0;
|
|
|
|
|
|
switch (pPacket->eType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case _BANTYPE_ACCOUNTNAME:
|
|
|
|
|
|
{
|
|
|
|
|
|
pUser = g_pDivisionManager->GetUserByAccountName(pPacket->wszName);
|
|
|
|
|
|
if (pUser)
|
|
|
|
|
|
nBanAccountDBID = pUser->GetAccountDBID();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case _BANTYPE_ACCOUNTID:
|
|
|
|
|
|
{
|
|
|
|
|
|
nBanAccountDBID = pPacket->nAccountDBID;
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case _BANTYPE_CHARACTERNAME:
|
|
|
|
|
|
{
|
|
|
|
|
|
pUser = g_pDivisionManager->GetUserByName(pPacket->wszName);
|
|
|
|
|
|
if (pUser)
|
|
|
|
|
|
nBanAccountDBID = pUser->GetAccountDBID();
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (nBanAccountDBID > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_pDivisionManager->SendDetachUser(nBanAccountDBID);
|
|
|
|
|
|
g_pDivisionManager->SendAllLoginServerDetachUser(nBanAccountDBID);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_WORLDMAXUSER:
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceWordlMaxUser * pPacket = (TServiceWordlMaxUser*)pData;
|
|
|
|
|
|
g_pWaitUserManager->Initialize(pPacket->nChangeMaxUser);
|
|
|
|
|
|
g_Log.Log(LogType::_FILEDBLOG, L"WorldMaxUser Changed [%d]\n", pPacket->nChangeMaxUser);
|
|
|
|
|
|
|
|
|
|
|
|
SendWorldInfo();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_RELOADGUILDWARSCHEDULE:
|
|
|
|
|
|
{
|
|
|
|
|
|
TReloadGuildwarSchedule * pPacket = (TReloadGuildwarSchedule*)pData;
|
|
|
|
|
|
if( pPacket->nWorldID == 0 || pPacket->nWorldID == g_Config.nWorldSetID)
|
|
|
|
|
|
{
|
|
|
|
|
|
g_pGuildWarManager->SetResetSchedule(true);
|
|
|
|
|
|
g_Log.Log(LogType::_GUILDWAR, 0, 0, 0, 0, L"[GUILDWAR] NETSERVICE_RELOADGUILDWARSCHEDULE !!!\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(_GPK)
|
|
|
|
|
|
#if defined(_LOGINSERVER) || defined (_GAMESERVER) || defined(_VILLAGESERVER)
|
|
|
|
|
|
case NETSERVICE_RELOADDYNCODE:
|
|
|
|
|
|
{
|
|
|
|
|
|
char szSvrDir[MAX_PATH] = { 0, };
|
|
|
|
|
|
char szCltDir[MAX_PATH] = { 0, };
|
|
|
|
|
|
#if defined(WIN64)
|
|
|
|
|
|
sprintf_s(szSvrDir, MAX_PATH - 1, "./DynCodeBin64/Server");
|
|
|
|
|
|
sprintf_s(szCltDir, MAX_PATH - 1, "./DynCodeBin64/Client");
|
|
|
|
|
|
#else // WIN64
|
|
|
|
|
|
#if defined(BIT64)
|
|
|
|
|
|
sprintf(szSvrDir, "./DynCodeBin/Server64");
|
|
|
|
|
|
#else
|
|
|
|
|
|
sprintf(szSvrDir, "./DynCodeBin/Server");
|
|
|
|
|
|
#endif
|
|
|
|
|
|
sprintf(szCltDir, "./DynCodeBin/Client");
|
|
|
|
|
|
#endif // WIN64
|
|
|
|
|
|
|
|
|
|
|
|
int nBinCount = g_Config.pDynCode->LoadBinary(szSvrDir, szCltDir);
|
|
|
|
|
|
if (nBinCount == 0){
|
|
|
|
|
|
g_Log.Log(LogType::_FILEDBLOG, L"Load DynCode failed!!!\r\n");
|
|
|
|
|
|
SendGPKLoadFail();
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif //#if defined(_LOGINSERVER) || defined (_GAMESERVER) || defined(_VILLAGESERVER)
|
|
|
|
|
|
#endif //defined(_GPK)
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_SCHEDULE_SERVERCLOSE:
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(_GAMESERVER) || defined (_VILLAGESERVER) || defined (_LOGINSERVER)
|
|
|
|
|
|
TScheduleServiceClose * pPacket = (TScheduleServiceClose*)pData;
|
|
|
|
|
|
|
|
|
|
|
|
if (g_pCloseSystem == NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (g_pCloseSystem->AddClose(pPacket->_tOderedTime, pPacket->_tCloseTime) == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
_DANGER_POINT();
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
__time64_t _tNow;
|
|
|
|
|
|
time(&_tNow);
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _VILLAGESERVER
|
|
|
|
|
|
g_pUserSessionManager->SendCloseService(_tNow, pPacket->_tOderedTime, pPacket->_tCloseTime);
|
|
|
|
|
|
#elif _GAMESERVER
|
|
|
|
|
|
for (int i = 0; i < g_pGameServerManager->GetGameServerSize(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNRUDPGameServer * pServer = g_pGameServerManager->GetGameServerIndex(i);
|
|
|
|
|
|
if (pServer)
|
|
|
|
|
|
pServer->StoreExternalBuffer(0, iMainCmd, 0, pData, iLen, EXTERNALTYPE_SERVICEMANAGER);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#endif //#if defined(_GAMESERVER) || defined (_VILLAGESERVER) || defined (_LOGINSERVER)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_UPDATESALEDATA:
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(_CASHSERVER) || defined(_DBSERVER)
|
|
|
|
|
|
// ij<><C4B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ǹ<EFBFBD><C7B8><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> <20><><EFBFBD><EFBFBD> üũ
|
|
|
|
|
|
g_pExtManager->SetProhibitSaleList();
|
|
|
|
|
|
|
|
|
|
|
|
#elif defined(_VILLAGESERVER)
|
|
|
|
|
|
g_pCashConnection->SendSaleAbortList();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_UPDATEFARM:
|
|
|
|
|
|
{
|
|
|
|
|
|
TUpdateFarm * pPacket = (TUpdateFarm*)pData;
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
if (pPacket->bForceStart)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < g_pGameServerManager->GetGameServerSize(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
CDNRUDPGameServer * pServer = g_pGameServerManager->GetGameServerIndex(i);
|
|
|
|
|
|
if (pServer)
|
|
|
|
|
|
pServer->StoreExternalBuffer(0, iMainCmd, 0, pData, iLen, EXTERNALTYPE_SERVICEMANAGER);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
BYTE cThreadID;
|
|
|
|
|
|
CDNDBConnection * pDBCon = g_pDBConnectionManager->GetDBConnection(cThreadID);
|
|
|
|
|
|
if (pDBCon)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (pPacket->nWorldID == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
BYTE cWorldID[WORLDCOUNTMAX];
|
|
|
|
|
|
memset(&cWorldID, 0, sizeof(cWorldID));
|
|
|
|
|
|
|
|
|
|
|
|
BYTE cCount = g_pMasterConnectionManager->GetWorldSetIDs(cWorldID);
|
|
|
|
|
|
for (int i = 0; i < cCount && i < WORLDCOUNTMAX; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
pDBCon->QueryFarmList(cThreadID, cWorldID[i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
pDBCon->QueryFarmList(cThreadID, pPacket->nWorldID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else{
|
|
|
|
|
|
g_Log.Log(LogType::_FARM, L"UpdateFarm Failed [WorldID:%d] Con Not Found\n", pPacket->nWorldID);
|
|
|
|
|
|
g_Log.Log(LogType::_FILELOG, L"UpdateFarm Failed [WorldID:%d] Con Not Found\n", pPacket->nWorldID);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#elif _VILLAGESERVER
|
|
|
|
|
|
if (pPacket->bForceStart == true)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
|
|
|
|
|
|
BYTE cThreadID;
|
|
|
|
|
|
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
|
|
|
|
|
|
if (pDBCon)
|
|
|
|
|
|
{
|
|
|
|
|
|
pDBCon->QueryFarmList(cThreadID, g_Config.nWorldSetID);
|
|
|
|
|
|
#ifdef PRE_ADD_SEETMAINTENANCEFLAG
|
|
|
|
|
|
pDBCon->QuerySetMaintenanceFlag(cThreadID, 0);
|
|
|
|
|
|
#endif //#ifdef PRE_ADD_SEETMAINTENANCEFLAG
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
case NETSERVICE_UPDATEGUILDWAR_SCHEDULE:
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef _MASTERSERVER
|
|
|
|
|
|
// <20>ݷμ<DDB7><CEBC><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û
|
|
|
|
|
|
//CDNVillageConnection* pVillageConnection = g_pDivisionManager->GetVillageConnectionByVillageID( g_pDivisionManager->GetPvPLobbyVillageID() );
|
|
|
|
|
|
//if( pVillageConnection == NULL || pVillageConnection->GetActive() == false )
|
|
|
|
|
|
// return ERROR_NONE;
|
|
|
|
|
|
g_pGuildWarManager->SetResetSchedule(true);
|
|
|
|
|
|
g_Log.Log(LogType::_GUILDWAR, 0, 0, 0, 0, L"[GUILDWAR] NETSERVICE_UPDATEGUILDWAR_SCHEDULE !!!\n");
|
|
|
|
|
|
//pVillageConnection->SendGetGuildWarSchedule(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>û
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
#if defined (_LOGINSERVER)
|
|
|
|
|
|
case NETSERVICE_CREATEWORLDDB:
|
|
|
|
|
|
{
|
|
|
|
|
|
TCreateDB * pPacket = (TCreateDB*)pData;
|
|
|
|
|
|
if (g_pSQLWorldManager)
|
|
|
|
|
|
{
|
|
|
|
|
|
int nIndex = -1;
|
|
|
|
|
|
int nResult = g_pSQLWorldManager->CreateEachDB (pPacket->nWorldID, nIndex);
|
|
|
|
|
|
|
|
|
|
|
|
if (nIndex == -1)
|
|
|
|
|
|
SendLoginWorldDBResult(nResult, pPacket->nWorldID, NULL, 0);
|
|
|
|
|
|
else
|
|
|
|
|
|
SendLoginWorldDBResult(nResult, g_Config.WorldDB[nIndex].nWorldSetID, g_Config.WorldDB[nIndex].szIP,g_Config.WorldDB[nIndex].nPort);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif // #if defined(_LOGINSERVER)
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_EXTRELOAD:
|
|
|
|
|
|
{
|
|
|
|
|
|
TExtReload * pPacket = (TExtReload*)pData;
|
|
|
|
|
|
|
|
|
|
|
|
bool bReload = false;
|
|
|
|
|
|
#ifdef _VILLAGESERVER
|
|
|
|
|
|
bReload = g_pDataManager->LoadCashCommodityData(true);
|
|
|
|
|
|
if (bReload == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
SendReloadResult(bReload);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bReload = g_pDataManager->LoadCashPackageData(true);
|
|
|
|
|
|
if (bReload == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
SendReloadResult(bReload);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
SendReloadResult(bReload);
|
|
|
|
|
|
#elif defined (_CASHSERVER) || defined (_DBSERVER)
|
|
|
|
|
|
bReload = g_pExtManager->ReLoadCashCommodity();
|
|
|
|
|
|
if (bReload == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
SendReloadResult(bReload);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bReload = g_pExtManager->ReLoadCashPackage();
|
|
|
|
|
|
if (bReload == false)
|
|
|
|
|
|
{
|
|
|
|
|
|
SendReloadResult(bReload);
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
SendReloadResult(bReload);
|
|
|
|
|
|
#else
|
|
|
|
|
|
SendReloadResult(true);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_UPDATEGUILDWARE:
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined (_MASTERSERVER)
|
|
|
|
|
|
TUPdateGuildWare * pPacket = (TUPdateGuildWare*)pData;
|
|
|
|
|
|
if (g_pDivisionManager)
|
|
|
|
|
|
g_pDivisionManager->SendUpdateGuildWare(pPacket->nGuildID);
|
|
|
|
|
|
#endif //#if defined (_MASTERSERVER)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
case NETSERVICE_LIMITEITEM_CHANGEQUANTITY:
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(PRE_ADD_LIMITED_CASHITEM) && defined(_CASHSERVER)
|
|
|
|
|
|
TChangeLimitItemMax * pPacket = (TChangeLimitItemMax*)pData;
|
|
|
|
|
|
if (g_pLimitedCashItemRepository)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (g_pLimitedCashItemRepository->UpdateChangedLimitedItemMax(pPacket->nSN, pPacket->nLimiteMax) == false)
|
|
|
|
|
|
_DANGER_POINT_MSG(L"NETSERVICE_LIMITEITEM_CHANGEQUANTITY Fail");
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif //#if defined(PRE_ADD_LIMITED_CASHITEM) && defined(_CASHSERVER)
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
case NETSERVICE_UPDATEWORLDPVPROOM:
|
|
|
|
|
|
{
|
|
|
|
|
|
TApplyWorldPvPRoom * pPacket = (TApplyWorldPvPRoom*)pData;
|
|
|
|
|
|
#if defined( _VILLAGESERVER )
|
|
|
|
|
|
#if defined( PRE_WORLDCOMBINE_PVP )
|
|
|
|
|
|
if( g_Config.nCombinePartyWorld != g_Config.nWorldSetID )
|
|
|
|
|
|
{
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"UpdateWorldPvPRoom fail CombineWorld=%d WorldSetID=%d \n", g_Config.nCombinePartyWorld, g_Config.nWorldSetID);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
BYTE cThreadID;
|
|
|
|
|
|
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
|
|
|
|
|
|
if (pDBCon)
|
|
|
|
|
|
{
|
|
|
|
|
|
pDBCon->QueryUpdateWorldPvPRoom(cThreadID, g_Config.nWorldSetID);
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"UpdateWorldPvPRoom[WorldID:%d] sucess\n", g_Config.nWorldSetID);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case NETSERVICE_CREATEGAMBLEROOM:
|
|
|
|
|
|
{
|
|
|
|
|
|
TCreateGambleRoom * pPacket = (TCreateGambleRoom*)pData;
|
|
|
|
|
|
#if defined( _VILLAGESERVER )
|
|
|
|
|
|
#if defined( PRE_PVP_GAMBLEROOM )
|
|
|
|
|
|
CDNPvPRoomManager::GetInstance().SetGambleRoomData(pPacket->nRoomIndex, pPacket->bRegulation, pPacket->nGambleType, pPacket->nPrice, true);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case NETSERVICE_STOPGAMBLEROOM:
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( _VILLAGESERVER )
|
|
|
|
|
|
#if defined( PRE_PVP_GAMBLEROOM )
|
|
|
|
|
|
CDNPvPRoomManager::GetInstance().SetGambleRoomData(0, true, 0, 0, false);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case NETSERVICE_DELGAMBLEROOM:
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined( _VILLAGESERVER )
|
|
|
|
|
|
#if defined( PRE_PVP_GAMBLEROOM )
|
|
|
|
|
|
CDNPvPRoomManager::GetInstance().DelGambleRoom();
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case NETSERVICE_UPDATE_DWCSTATUS:
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined(PRE_ADD_DWC) && defined(_VILLAGESERVER)
|
|
|
|
|
|
BYTE cThreadID;
|
|
|
|
|
|
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
|
|
|
|
|
|
if (pDBCon)
|
|
|
|
|
|
{
|
|
|
|
|
|
pDBCon->QueryGetDWCChannelInfo(cThreadID, g_Config.nWorldSetID);
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"Update DWC Status\n");
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
#if defined(PRE_ADD_DWC) && defined(_LOGINSERVER)
|
|
|
|
|
|
g_pDWCChannelManager->UpdateInfo();
|
|
|
|
|
|
g_Log.Log(LogType::_NORMAL, L"Update DWC Status\n");
|
|
|
|
|
|
#endif
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
return ERROR_NONE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::Reconnect(DWORD CurTick)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_dwReconnectTick == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_dwReconnectTick = CurTick;
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (m_dwReconnectTick + 5000 < CurTick){
|
|
|
|
|
|
m_dwReconnectTick = CurTick;
|
|
|
|
|
|
if (!GetActive() && !GetConnecting())
|
|
|
|
|
|
{
|
|
|
|
|
|
SetConnecting(true);
|
|
|
|
|
|
if (g_pIocpManager->AddConnectionEx(this, CONNECTIONKEY_SERVICEMANAGER, m_szIP, m_wPort) < 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
SetConnecting(false);
|
|
|
|
|
|
g_Log.Log(LogType::_FILEDBLOG, L"ServiceManager Connect Failed(%S, %d)\r\n", m_szIP, m_wPort);
|
|
|
|
|
|
}
|
|
|
|
|
|
else {
|
|
|
|
|
|
g_Log.Log(LogType::_FILEDBLOG, L"ServiceManager Connected(%S, %d) Connecting..\r\n", m_szIP, m_wPort);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
if (GetActive())
|
|
|
|
|
|
{
|
|
|
|
|
|
SendReqeustServiceInfo();
|
|
|
|
|
|
SendHeartBeat(); // ServiceManager<65><72> <20>˴ٿ<CBB4> <20>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Socket<65><74><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>Ҷ<EFBFBD><D2B6><EFBFBD> <20><><EFBFBD><EFBFBD>. <20>Ϲ<EFBFBD><CFB9><EFBFBD><EFBFBD><EFBFBD> Ping<6E><67>.
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD> <20><><EFBFBD>پ<EFBFBD><D9BE><EFBFBD>~
|
|
|
|
|
|
static int s_nCallCnt = 0;
|
|
|
|
|
|
#ifdef _CH
|
|
|
|
|
|
//<2F>߱<EFBFBD><DFB1><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ
|
|
|
|
|
|
if ((s_nCallCnt%4) == 0)
|
|
|
|
|
|
#else
|
|
|
|
|
|
if ((s_nCallCnt%12) == 0)
|
|
|
|
|
|
#endif
|
|
|
|
|
|
{
|
|
|
|
|
|
ReportProcess();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (s_nCallCnt%720 == 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
LoadWorldEvent();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//#ifdef PRE_MOD_RESTRICT_IDENTITY_IP
|
|
|
|
|
|
// if (s_nCallCnt%1440 == 0)
|
|
|
|
|
|
// LoadSimpleConfig();
|
|
|
|
|
|
//#endif //#ifdef PRE_MOD_RESTRICT_IDENTITY_IP
|
|
|
|
|
|
|
|
|
|
|
|
s_nCallCnt++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::Disconnected()
|
|
|
|
|
|
{
|
|
|
|
|
|
m_dwReconnectTick = 0;
|
|
|
|
|
|
m_bIsInit = false;
|
|
|
|
|
|
|
|
|
|
|
|
m_nScopeCnt = 0;
|
|
|
|
|
|
memset(&m_nScopeElapsed, 0, sizeof(m_nScopeElapsed));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::ScopeElapsedTick(ULONG nDelta)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_Sync.Lock();
|
|
|
|
|
|
int cnt = m_nScopeCnt++&31;
|
|
|
|
|
|
m_nScopeElapsed[cnt] = nDelta;
|
|
|
|
|
|
m_Sync.UnLock();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::LoadWorldEvent()
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef _GAMESERVER
|
|
|
|
|
|
BYTE cThreadID;
|
|
|
|
|
|
CDNDBConnection * pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
|
|
|
|
|
|
if (pDBCon == NULL || g_pMasterConnectionManager == NULL || g_pEvent == NULL)
|
|
|
|
|
|
g_Log.Log(LogType::_EVENTLIST, L"EventQuery Failed GameServer\n");
|
|
|
|
|
|
|
|
|
|
|
|
if (pDBCon && g_pMasterConnectionManager && g_pEvent)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <int> vList;
|
|
|
|
|
|
g_pMasterConnectionManager->GetConnectedWorldID(&vList);
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < (int)vList.size(); i++)
|
|
|
|
|
|
pDBCon->QueryEventList(cThreadID, vList[i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
#elif _VILLAGESERVER
|
|
|
|
|
|
if (g_Config.nWorldSetID <= 0 || g_pEvent == NULL)
|
|
|
|
|
|
g_Log.Log(LogType::_EVENTLIST, L"EventQuery Failed VillageServer\n");
|
|
|
|
|
|
|
|
|
|
|
|
if (g_Config.nWorldSetID > 0 && g_pEvent)
|
|
|
|
|
|
{
|
|
|
|
|
|
BYTE cThreadID;
|
|
|
|
|
|
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
|
|
|
|
|
|
pDBCon->QueryEventList( cThreadID, g_Config.nWorldSetID);
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PRE_MOD_RESTRICT_IDENTITY_IP
|
|
|
|
|
|
void CDNServiceConnection::LoadSimpleConfig()
|
|
|
|
|
|
{
|
|
|
|
|
|
#ifdef _VILLAGESERVER
|
|
|
|
|
|
BYTE cThreadID;
|
|
|
|
|
|
CDNDBConnection* pDBCon = g_pDBConnectionManager->GetDBConnection( cThreadID );
|
|
|
|
|
|
pDBCon->QuerySimpleConfig(cThreadID);
|
|
|
|
|
|
#endif //#ifdef _VILLAGESERVER
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif //#ifdef PRE_MOD_RESTRICT_IDENTITY_IP
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendServiceClosed()
|
|
|
|
|
|
{
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_SERVICE_CLOSED, 0, NULL, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_MASTERSERVER)
|
|
|
|
|
|
void CDNServiceConnection::SendWorldInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceWorldInfo packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
packet.nWorldID = g_Config.nWorldSetID;
|
|
|
|
|
|
packet.nWorldMaxuser = g_pWaitUserManager->GetWorldMaxUser();
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_WORLDINFO, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendMeritInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <TMeritInfo> vList;
|
|
|
|
|
|
g_pExtManager->GetMeritList(&vList);
|
|
|
|
|
|
|
|
|
|
|
|
TServiceMeritInfo packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < (int)vList.size(); i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
memcpy(&packet.Info[packet.cCount], &vList[i], sizeof(TMeritInfo));
|
|
|
|
|
|
packet.cCount++;
|
|
|
|
|
|
|
|
|
|
|
|
if (packet.cCount >= MERITINFOMAX)
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_MERITINFO, 0, (char*)&packet, sizeof(packet) - sizeof(packet.Info) + (sizeof(TMeritInfo) * packet.cCount));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendVillageInfo(UINT nUserCnt, std::vector<TVillageInfo> * vList)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector <TVillageInfo>::iterator ii;
|
|
|
|
|
|
for (ii = vList->begin(); ii != vList->end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceChannelInfo packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
packet.nManagedID = (*ii).nManagedID;
|
|
|
|
|
|
packet.nWorldID = g_Config.nWorldSetID;
|
|
|
|
|
|
for (int j = 0; j < (int)(*ii).vOwnedChannelList.size(); j++)
|
|
|
|
|
|
{
|
|
|
|
|
|
packet.Info[packet.cCount].nChannelID = (*ii).vOwnedChannelList[j].nChannelID;
|
|
|
|
|
|
packet.Info[packet.cCount].nChannelIdx = (*ii).vOwnedChannelList[j].nChannelIdx;
|
|
|
|
|
|
packet.Info[packet.cCount].nMapIdx = (*ii).vOwnedChannelList[j].nMapIdx;
|
|
|
|
|
|
packet.Info[packet.cCount].nCurrentUserCount = (*ii).vOwnedChannelList[j].nCurrentUser;
|
|
|
|
|
|
packet.Info[packet.cCount].nMaxUserCount = (*ii).vOwnedChannelList[j].nChannelMaxUser;
|
|
|
|
|
|
packet.Info[packet.cCount].nChannelAttribute = (*ii).vOwnedChannelList[j].nAttribute;
|
|
|
|
|
|
packet.Info[packet.cCount].nMeritBonusID = (*ii).vOwnedChannelList[j].nMeritBonusID;
|
|
|
|
|
|
packet.Info[packet.cCount].bVisibility = (*ii).vOwnedChannelList[j].bVisibility;
|
|
|
|
|
|
_strcpy(packet.Info[packet.cCount].szIP, IPLENMAX, (*ii).szIP, (int)strlen((*ii).szIP));
|
|
|
|
|
|
packet.Info[packet.cCount].nPort = (*ii).nPort;
|
|
|
|
|
|
packet.Info[packet.cCount].nLimitLevel = (*ii).vOwnedChannelList[j].nLimitLevel;
|
|
|
|
|
|
packet.Info[packet.cCount].bShow = (*ii).vOwnedChannelList[j].bShow;
|
|
|
|
|
|
packet.Info[packet.cCount].nServerID = (*ii).vOwnedChannelList[j].nServerID;
|
|
|
|
|
|
packet.Info[packet.cCount].cThreadID = (*ii).vOwnedChannelList[j].cThreadID;
|
|
|
|
|
|
packet.cCount++;
|
|
|
|
|
|
}
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_CHANNELINFO, 0, (char*)&packet, sizeof(TServiceChannelInfo) - sizeof(packet.Info) + (sizeof(sChannelInfo) * packet.cCount));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendRportDelayedProcess(int nManagedID, ULONG nDelayedTick)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceDelayedReport packet; //SERVICE_SERVER_DELAYEDREPORT
|
|
|
|
|
|
memset(&packet, 0, sizeof(TServiceDelayedReport));
|
|
|
|
|
|
|
|
|
|
|
|
packet.nManagedID = nManagedID;
|
|
|
|
|
|
packet.nDelayedTick = nDelayedTick;
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_DELAYEDREPORT, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendQueryDelayedReport(int nManagedID, const char* szQueryName, DWORD dwThreadID, DWORD dwElapsed)
|
|
|
|
|
|
{
|
|
|
|
|
|
TQueryDelayedReport packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(TQueryDelayedReport));
|
|
|
|
|
|
|
|
|
|
|
|
packet.nMID = nManagedID;
|
|
|
|
|
|
packet.dwThreadID = dwThreadID;
|
|
|
|
|
|
packet.dwElasped = dwElapsed;
|
|
|
|
|
|
strncpy (packet.szQueryName, szQueryName, QUERYNAMESIZE-1);
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_QUERYDELAYREPORT, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendGameDelayedReport(WCHAR * wszLog)
|
|
|
|
|
|
{
|
|
|
|
|
|
TGameDelayedReport packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(TGameDelayedReport));
|
|
|
|
|
|
_wcscpy(packet.wszLog, _countof(packet.wszLog), wszLog, (int)wcslen(wszLog));
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_GAMEDELAYREPORT, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendVillageDelayedReport(WCHAR * wszLog)
|
|
|
|
|
|
{
|
|
|
|
|
|
TVillageDelayedReport packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(TVillageDelayedReport));
|
|
|
|
|
|
_wcscpy(packet.wszLog, _countof(packet.wszLog), wszLog, (int)wcslen(wszLog));
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_VILLAGEDELAYREPORT, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendHeartBeat()
|
|
|
|
|
|
{
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_HEARTBEAT, 0, NULL, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendReportUnrecoverBlock(bool bBlock, bool bPermannently)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceUnrecover packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(TServiceUnrecover));
|
|
|
|
|
|
|
|
|
|
|
|
packet.bBlock = bBlock;
|
|
|
|
|
|
packet.bPermannently = bPermannently;
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_UNRECOVERY, 0, (char*)&packet, sizeof(TServiceUnrecover));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendReloadResult(bool bResult)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServerExtReloadResult packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(TServerExtReloadResult));
|
|
|
|
|
|
|
|
|
|
|
|
packet.bResult = bResult;
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_EXT_RELOADRESULT, 0, (char*)&packet, sizeof(TServerExtReloadResult));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendLoginWorldDBResult(int nResult, int nWorldID, char* szIp, int nPort)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServerLoginWorldDResult packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
packet.nResult = nResult;
|
|
|
|
|
|
packet.nWorldID = nWorldID;
|
|
|
|
|
|
if (szIp)
|
|
|
|
|
|
_strcpy(packet.szIp, _countof(packet.szIp), szIp, (int)strlen(szIp));
|
|
|
|
|
|
packet.nPort = nPort;
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_LOGIN_WORDDBRESULT, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendDetectException(int nExceptionType)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServerException packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
packet.nMID = m_nManagedID;
|
|
|
|
|
|
packet.nType = nExceptionType;
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_EXCEPTION_REPORT, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::ReportProcess()
|
|
|
|
|
|
{
|
|
|
|
|
|
#if defined (_LOGINSERVER)
|
|
|
|
|
|
if (g_pUserConnectionManager && g_pMasterConnectionManager) {
|
|
|
|
|
|
#if defined(PRE_ADD_LOGIN_USERCOUNT)
|
|
|
|
|
|
SendReportLogin(g_pUserConnectionManager->GetUserCount() - g_pMasterConnectionManager->GetWaitUserAmount());
|
|
|
|
|
|
#else
|
|
|
|
|
|
SendReportLogin(g_pUserConnectionManager->GetCount() - g_pMasterConnectionManager->GetWaitUserAmount());
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
if (g_pSQLWorldManager)
|
|
|
|
|
|
g_pSQLWorldManager->ReportErrorWorldDB (this);
|
|
|
|
|
|
|
|
|
|
|
|
#elif defined (_GAMESERVER)
|
|
|
|
|
|
if (g_pGameServerManager)
|
|
|
|
|
|
{
|
|
|
|
|
|
UINT nUserCount, nRoomCount, nTotalRoomCount;
|
|
|
|
|
|
g_pGameServerManager->GetRoomUserCount(nUserCount, nRoomCount, nTotalRoomCount);
|
|
|
|
|
|
bool bZero = false;
|
|
|
|
|
|
bZero = g_pGameServerManager->GetZeroPopulation();
|
|
|
|
|
|
SendReportGame(bZero, nUserCount, nRoomCount, nTotalRoomCount);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
#elif defined (_VILLAGESERVER)
|
|
|
|
|
|
if (g_pUserSessionManager)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::map <int, int> Map;
|
|
|
|
|
|
UINT nCount = g_pUserSessionManager->GetUserCount(Map);
|
|
|
|
|
|
SendReportVillage(nCount, Map);
|
|
|
|
|
|
}
|
|
|
|
|
|
#elif defined (_MASTERSERVER)
|
|
|
|
|
|
if (g_pWaitUserManager)
|
|
|
|
|
|
{
|
|
|
|
|
|
SendReportMaster(g_Config.nWorldSetID, g_pWaitUserManager->GetWaitUserCount());
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendReqeustServiceInfo()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (m_bIsInit)
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_REQUESTSERVICE, 0, NULL, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendRegistManager(int nManagedID, int nType, const char * pVersion, const char * pResVersion, int nWorldID, BYTE cWorldCount/* = 0*/, BYTE * pWorldID/* = NULL*/)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServerManagedID packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
packet.nMID = nManagedID;
|
|
|
|
|
|
packet.nManagedType = nType;
|
|
|
|
|
|
|
|
|
|
|
|
if (cWorldCount > 0 && pWorldID != NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < cWorldCount; i++)
|
|
|
|
|
|
packet.cWorldID[i] = pWorldID[i];
|
|
|
|
|
|
packet.cWorldCount = cWorldCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (nWorldID > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
packet.cWorldCount = 1;
|
|
|
|
|
|
packet.cWorldID[0] = (BYTE)nWorldID;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_strcpy(packet.szVersion, NAMELENMAX, pVersion, (int)strlen(pVersion));
|
|
|
|
|
|
_strcpy(packet.szResVersion, NAMELENMAX, pResVersion, (int)strlen(pResVersion));
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_FINAL_BUILD)
|
|
|
|
|
|
packet.bFinalBuild = true;
|
|
|
|
|
|
#else
|
|
|
|
|
|
packet.bFinalBuild = false;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_REGIST_MANAGEDID, 0, (char*)&packet, sizeof(packet) - sizeof(packet.cWorldID) + (packet.cWorldCount * sizeof(BYTE)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendReportLogin(UINT nUserCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceReportLogin packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
packet.nUserCount = nUserCount;
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_USUAL_LOGINREPORT, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendReportVillage(UINT nUserCount, std::map <int, int> & Map)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceReportVillage packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
packet.nUserCount = nUserCount;
|
|
|
|
|
|
std::map <int, int>::iterator ii;
|
|
|
|
|
|
for (ii = Map.begin(); ii != Map.end(); ii++)
|
|
|
|
|
|
{
|
|
|
|
|
|
packet.Info[packet.nCount].nChannelID = (*ii).first;
|
|
|
|
|
|
packet.Info[packet.nCount].nChannelUserCount = (*ii).second;
|
|
|
|
|
|
packet.nCount++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_USUAL_VILLAGEREPORT, 0, (char*)&packet, sizeof(packet) - sizeof(packet.Info) + (packet.nCount * sizeof(TVillageUserReport)));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendReportMaster(int nWorldID, UINT nWaitUserCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceReportMaster packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(TServiceReportMaster));
|
|
|
|
|
|
|
|
|
|
|
|
packet.nWorldID = nWorldID;
|
|
|
|
|
|
packet.nWaitserCount = nWaitUserCount;
|
|
|
|
|
|
|
|
|
|
|
|
#if defined (_MASTERSERVER)
|
|
|
|
|
|
g_pDivisionManager->GetFarmInfo (&packet);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_USUAL_MASTERREPORT, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendReportGame(bool bZeropopulation, UINT nUserCount, UINT nRoomCount, UINT nTotalRoomCount)
|
|
|
|
|
|
{
|
|
|
|
|
|
TServiceReportGame packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(packet));
|
|
|
|
|
|
|
|
|
|
|
|
packet.cIsZeroPopulation = bZeropopulation == true ? 1 : 0;
|
|
|
|
|
|
packet.nUserCount = nUserCount;
|
|
|
|
|
|
packet.nRoomCount = nRoomCount;
|
|
|
|
|
|
packet.nTotalRoomCount = nTotalRoomCount;
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_USUAL_GAMEREPORT, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendPong()
|
|
|
|
|
|
{
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_PONG, 0, NULL, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void CDNServiceConnection::SendGPKLoadFail()
|
|
|
|
|
|
{
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_GPKRELOADFAIL, 0, NULL, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( _VILLAGESERVER )
|
|
|
|
|
|
void CDNServiceConnection::SendUpdateWorldPvPRoom(int nRetCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
TApplyWorldPvPRoom packet;
|
|
|
|
|
|
memset(&packet, 0, sizeof(TApplyWorldPvPRoom));
|
|
|
|
|
|
packet.nRetCode = nRetCode;
|
|
|
|
|
|
|
|
|
|
|
|
AddSendData(SERVICE_SERVER_UPDATEWORLDPVPROOM, 0, (char*)&packet, sizeof(packet));
|
|
|
|
|
|
}
|
|
|
|
|
|
#endif
|