#include "stdafx.h" #include "ServiceSession.h" #include "DNServerPacket.h" #include "ServiceManager.h" #include "DNBAM.h" #include "Log.h" #include "DNServerDef.h" const UINT ONEHOURTICK = (1000 * 60 * 60); const UINT ONEMINTICK = (1000 * 60); extern TServiceManagerConfig g_Config; extern CLog s_CountLog; extern CLog g_ExceptionReportLog; extern CLog g_DBDelayLog; extern CLog g_GameDelayLog; extern CLog g_VillageDelayLog; extern CLog g_DBErrorLog; extern CLog g_DBSystemErrorLog; CServiceSession::CServiceSession() { Init(1024 * 100, 1024 * 100); m_nMID = 0; m_nCreateSessionTick = timeGetTime(); m_bIsServiceClose = false; m_nLastPingTick = 0; m_nLastIdleTick = 0; m_nLastReportedTick = 0; m_nLastDelayedTick = 0; m_nLoginUserCount = 0; m_nVillageUserCount = 0; m_nGameUserCount = 0; m_nReportedCount = 0; m_nGameRoomCount = 0; m_nTotalRoomCount = 0; m_bZeroPopulation = false; m_bUnrecoveryBlock = false; m_nUnrecoveryTick = 0; m_nVillageFaultSafeCount = 0; m_bFaultSafeDump = false; m_nLastIdleLogTick = 0; m_bPermanentlyBlock = false; } CServiceSession::~CServiceSession() { if (g_pServiceManager) g_pServiceManager->EjectService(m_nMID); } int CServiceSession::IdleProcess(ULONG nCurTick) { //¼­·Î󸮰¡ ´Þ¶ó¼­ ±¸Â÷³ª¼­ ³ª´©¾î¼­ 󸮵Ǵµ¥ °ãÄ¡´Â ºÎºÐÀÌ »ý±è...Á¤¸®ÇÏÀÚ ¤»¤»¤»¾ðÁ¨°¡..?..-_-; -2hogi if (GetActive() == false || m_nCreateSessionTick == 0) return SERVICEPROCESS_NONE; if (GetType() == MANAGED_TYPE_VILLAGE) { if (m_nLastPingTick <= 0) { if (m_nLastIdleTick <= 0 || m_nLastIdleTick + DNProcessCheck::UpdateInterval < nCurTick) { SendPing(); m_nLastIdleTick = nCurTick; } } else { if (m_nLastPingTick + DNProcessCheck::DisconnectInterval < nCurTick) { if (m_nVillageFaultSafeCount <= 0) g_Log.Log(LogType::_FILELOG, L"VillageServer FaultSafe Pre Alarm [SID:%d][ip:%S]\n", GetMID(), GetIp()); if (m_nVillageFaultSafeCount > 1 && m_nVillageFaultSafeCount%7 == 0 && m_bFaultSafeDump == false) { SendMakeDump(); //°­Á¦´ýÇÁ ¹ß»ý½ÃŲ´Ù. m_bFaultSafeDump = true; } m_nVillageFaultSafeCount++; } if (m_nLastPingTick + (DNProcessCheck::DisconnectInterval * 10) < nCurTick) //Á» ´Ã¸®ÀÚ { return SERVICEPROCESS_DELAYED; } } } if (GetType() == MANAGED_TYPE_GAME) { //check faultsafe //bool bRestart = !wcsicmp(g_Config.wszRegion, L"kor") ? false : true; bool bRestart = true; if (m_bUnrecoveryBlock && bRestart && m_nUnrecoveryTick > 0) { if (ONEHOURTICK/6 + m_nUnrecoveryTick < nCurTick) { g_Log.Log(LogType::_ERROR, L"GameServer UnrecoverBlock Over10Min Check[SID:%d]\n", GetMID()); if (ONEHOURTICK + m_nUnrecoveryTick < nCurTick || m_nGameUserCount < 20) //Çѽð£ÀÌ Áö³ª°¬´Ù. return SERVICEPROCESS_FAULTSAFE; } } } if (m_nLastIdleLogTick + ONEMINTICK < nCurTick) { switch (GetType()) { case MANAGED_TYPE_GAME: { s_CountLog.Log(LogType::_FILELOG, L"gamecount [%d][%d]\n", m_nGameUserCount, GetMID()); break; } case MANAGED_TYPE_VILLAGE: { s_CountLog.Log(LogType::_FILELOG, L"villagecount [%d][%d]\n", m_nVillageUserCount, GetMID()); break; } case MANAGED_TYPE_LOGIN: { s_CountLog.Log(LogType::_FILELOG, L"logincount [%d][%d]\n", m_nLoginUserCount, GetMID()); break; } } m_nLastIdleLogTick = nCurTick; } return SERVICEPROCESS_NONE; } int CServiceSession::MessageProcess(int iMainCmd, int iSubCmd, char *pData, int iLen) { switch (iMainCmd) { case SERVICE_SERVER_REQUESTSERVICE: { SendSessionInfo(); return ERROR_NONE; } case SERVICE_SERVER_REGIST_MANAGEDID: { TServerManagedID * pPacket = (TServerManagedID*)pData; if (sizeof(TServerManagedID) - sizeof(pPacket->cWorldID) + (sizeof(BYTE) * pPacket->cWorldCount) != iLen) { g_Log.Log(LogType::_ERROR, L"OnlineServiceServer Fail Check Service[IP:%S]\n", GetIp()); return ERROR_NONE; } m_nMID = pPacket->nMID; m_nManagedType = pPacket->nManagedType; m_nCreateSessionTick = 0; if (g_pServiceManager->OnlineServiceServer(pPacket->nMID, GetSessionID(), pPacket->szVersion, pPacket->szResVersion, this, pPacket->cWorldCount, pPacket->cWorldID, pPacket->bFinalBuild)) { strcpy_s(m_szVersion, pPacket->szVersion); strcpy_s(m_szResVersion, pPacket->szResVersion); } else g_Log.Log(LogType::_FILELOG, L"OnlineServiceServer Fail [SID:%d]\n", pPacket->nMID); if( g_pServiceManager->CheckAllServiceOnline() ) g_Log.Log(LogType::_FILELOG, L"All Services Online\n"); return ERROR_NONE; } case SERVICE_SERVER_USUAL_LOGINREPORT: { TServiceReportLogin * pPacket = (TServiceReportLogin*)pData; m_nLastReportedTick = timeGetTime(); m_nLastDelayedTick = 0; g_pServiceManager->ReportServiceInfoLogin(m_nMID, pPacket->nUserCount); //#if defined(_KR) // g_pBAM->CurrentConnections(L"DN_LoginUser", pPacket->nUserCount); //#endif // #if defined(_KR) m_nLoginUserCount = pPacket->nUserCount; return ERROR_NONE; } case SERVICE_SERVER_USUAL_VILLAGEREPORT: { TServiceReportVillage * pPacket = (TServiceReportVillage*)pData; if (pPacket->nCount >= VILLAGECHANNELMAX) { _DANGER_POINT(); return ERROR_NONE; } m_nVillageUserCount = pPacket->nUserCount; g_pServiceManager->ReportServiceInfoVillage(m_nMID, pPacket->nUserCount, pPacket->nCount, pPacket->Info); return ERROR_NONE; } case SERVICE_SERVER_USUAL_MASTERREPORT: { TServiceReportMaster * pPacket = (TServiceReportMaster*)pData; g_pServiceManager->ReportServiceMaster(GetMID(), pPacket->nWorldID, pPacket->nWaitserCount); g_pServiceManager->UpdateFarmStatus(pPacket); return ERROR_NONE; } case SERVICE_SERVER_USUAL_GAMEREPORT: { TServiceReportGame * pPacket = (TServiceReportGame*)pData; m_nLastReportedTick = timeGetTime(); m_nLastDelayedTick = 0; g_pServiceManager->ReportServiceInfoGame(m_nMID, pPacket->nUserCount, pPacket->nRoomCount); //#if defined(_KR) // g_pBAM->CurrentConnections(L"DN_GameUser", pPacket->nUserCount); //#endif // #if defined(_KR) m_nGameUserCount = pPacket->nUserCount; m_bZeroPopulation = pPacket->cIsZeroPopulation > 0 ? true : false; m_nGameRoomCount = pPacket->nRoomCount; m_nTotalRoomCount = pPacket->nTotalRoomCount; return ERROR_NONE; } case SERVICE_SERVER_SERVICE_CLOSED: { g_pServiceManager->ReportedServiceClosed(GetMID()); return ERROR_NONE; } case SERVICE_SERVER_EXCEPTION_REPORT: { TServerException * pPacket = (TServerException*)pData; g_pServiceManager->SendExceptionReport(m_nMID, pPacket->nType, NULL); switch (pPacket->nType) { case _EXCEPTIONTYPE_ROOMCRASH: g_ExceptionReportLog.Log(LogType::_FILELOG, L"Server Exception Report MID[%d][Type:%s]\n", GetMID(), L"Room Crash"); break; case _EXCEPTIONTYPE_SESSIONCRASH: g_ExceptionReportLog.Log(LogType::_FILELOG, L"Server Exception Report MID[%d][Type:%s]\n", GetMID(), L"Session Crash"); break; default: g_ExceptionReportLog.Log(LogType::_FILELOG, L"Server Exception Report MID[%d][Type:%d]\n", GetMID(), pPacket->nType); break; } return ERROR_NONE; } case SERVICE_SERVER_DELAYEDREPORT: { TServiceDelayedReport * pPacket = (TServiceDelayedReport*)pData; g_pServiceManager->TerminateServiceEach(pPacket->nManagedID, NULL, true); g_Log.Log(LogType::_FILELOG, L"DataBase MiddleWare Delayed Over 60Second MID[%d]\n", GetMID()); g_pServiceManager->AddServerDelayMID(SERVERTYPE_DB, m_nMID); g_pServiceManager->SendExceptionReport(m_nMID, _EXCEPTIONTYPE_DBMW_DELAYED, "DataBase MiddleWare Delayed Over 60Second"); g_DBDelayLog.Log(LogType::_FILELOG, L"DataBase MiddleWare Delayed Over 60Second MID[%d] WID[%d]\n", GetMID(), g_pServiceManager->GetDBWorldIDBySID(GetMID())); return ERROR_NONE; } case SERVICE_SERVER_QUERYDELAYREPORT: { TQueryDelayedReport * pPacket = (TQueryDelayedReport*)pData; g_DBDelayLog.Log(LogType::_FILELOG, L"[Query Over Time:%S] MID:%d WID:%d ThreadID:%d time=%d ms\n", pPacket->szQueryName, GetMID(), g_pServiceManager->GetDBWorldIDBySID(GetMID()), pPacket->dwThreadID, pPacket->dwElasped ); return ERROR_NONE; } case SERVICE_SERVER_GAMEDELAYREPORT: { TGameDelayedReport* pPacket = (TGameDelayedReport*)pData; g_GameDelayLog.Log(LogType::_FILELOG, L"%s \r\n", pPacket->wszLog); g_pServiceManager->AddServerDelayMID(SERVERTYPE_GAME, m_nMID); return ERROR_NONE; } case SERVICE_SERVER_DBERROR_REPORT: { TQueryErrorReport* pPacket = (TQueryErrorReport*)pData; if (pPacket->unLogType == LogType::_DBSYSTEM_ERROR) { g_DBSystemErrorLog.Log(LogType::_FILELOG, L"[MID:%d][Server:%d][World:%d][ACC:%d][CHRID:%lld][SID:%d] %s", GetMID(), pPacket->unServerType, pPacket->unWorldSetID, pPacket->uiAccountDBID, pPacket->biCharDBID, pPacket->uiSessionID, pPacket->wszBuf); } else { g_DBErrorLog.Log(LogType::_FILELOG, L"[MID:%d][Server:%d][World:%d][ACC:%d][CHRID:%lld][SID:%d] %s", GetMID(), pPacket->unServerType, pPacket->unWorldSetID, pPacket->uiAccountDBID, pPacket->biCharDBID, pPacket->uiSessionID, pPacket->wszBuf); } return ERROR_NONE; } case SERVICE_SERVER_VILLAGEDELAYREPORT: { TVillageDelayedReport* pPacket = (TVillageDelayedReport*)pData; g_VillageDelayLog.Log(LogType::_FILELOG, L"%s \r\n", pPacket->wszLog); return ERROR_NONE; } case SERVICE_SERVER_UNRECOVERY: { TServiceUnrecover * pPacket = (TServiceUnrecover*)pData; if (m_bPermanentlyBlock) { g_Log.Log(LogType::_ZEROPOPULATION, L"SERVICE_SERVER_UNRECOVERY if (m_bPermanentlyBlock) bBLock[%s] bPermannently[%s]\n", pPacket->bBlock == true ? L"True" : L"False", pPacket->bPermannently == true ? L"True" : L"False"); return ERROR_NONE; } m_bUnrecoveryBlock = pPacket->bBlock; m_nUnrecoveryTick = m_bUnrecoveryBlock == true ? timeGetTime() : 0; m_bPermanentlyBlock = pPacket->bPermannently; int nMasterSID[WORLDCOUNTMAX]; memset(nMasterSID, 0, sizeof(nMasterSID)); if (g_pServiceManager->GetMasterSIDByGameSID(GetMID(), nMasterSID)) { for (int j = 0; j < WORLDCOUNTMAX; j++) { if (nMasterSID[j] <= 0) continue; g_pServiceManager->PopulationControl(nMasterSID[j], GetMID(), m_bUnrecoveryBlock); } } return ERROR_NONE; } case SERVICE_SERVER_PONG: { m_nLastPingTick = 0; return ERROR_NONE; } case SERVICE_SERVER_GPKRELOADFAIL: { g_Log.Log(LogType::_ERROR, L"GPK ReloadFail [SID:%d][IP:%S]\n", GetMID(), GetIp()); return ERROR_NONE; } case SERVICE_SERVER_CHANNELINFO: { TServiceChannelInfo * pPacket = (TServiceChannelInfo*)pData; g_pServiceManager->UpdateChannelInfo(pPacket); return ERROR_NONE; } case SERVICE_SERVER_MERITINFO: { TServiceMeritInfo * pPacket = (TServiceMeritInfo*)pData; g_pServiceManager->UpdateMeritInfo(pPacket); return ERROR_NONE; } case SERVICE_SERVER_WORLDINFO: { TServiceWorldInfo * pPacket = (TServiceWorldInfo*)pData; g_pServiceManager->UpdateWorldMaxUser(pPacket); return ERROR_NONE; } case SERVICE_SERVER_EXT_RELOADRESULT: { TServerExtReloadResult * pPacket = (TServerExtReloadResult*)pData; g_pServiceManager->CompleteLiveExtReload(GetMID(), pPacket->bResult); return ERROR_NONE; } case SERVICE_SERVER_LOGIN_WORDDBRESULT: { TServerLoginWorldDResult * pPacket = (TServerLoginWorldDResult*)pData; switch (pPacket->nResult) { case 0: g_Log.Log(LogType::_NORMAL, L"LoginServer[%d] success to create WorldDB[ID:%d][IP:%S][PORT:%d]\n", GetMID(), pPacket->nWorldID, pPacket->szIp, pPacket->nPort); break; case 1: g_Log.Log(LogType::_ERROR, L"LoginServer[%d] fail to connect WorldDB[ID:%d][IP:%S][PORT:%d]\n", GetMID(), pPacket->nWorldID, pPacket->szIp, pPacket->nPort); break; case 2: g_Log.Log(LogType::_ERROR, L"LoginServer[%d] WorldDB version error[ID:%d][IP:%S][PORT:%d]\n", GetMID(), pPacket->nWorldID, pPacket->szIp, pPacket->nPort); break; case 3: g_Log.Log(LogType::_ERROR, L"LoginServer[%d] can not find WorldDB [ID:%d]\n", GetMID(), pPacket->nWorldID); break; case 4: g_Log.Log(LogType::_ERROR, L"LoginServer[%d] already create WorldDB [ID:%d][IP:%S][PORT:%d]\n", GetMID(), pPacket->nWorldID, pPacket->szIp, pPacket->nPort); break; } return ERROR_NONE; } case SERVICE_SERVER_UPDATEWORLDPVPROOM: { TApplyWorldPvPRoom * pPacket = (TApplyWorldPvPRoom*)pData; if( pPacket->nRetCode ) g_Log.Log(LogType::_FILELOG, L"Update WorldPvPRoom fail Code = %d\n", pPacket->nRetCode); else g_Log.Log(LogType::_FILELOG, L"Update WorldPvPRoom Success\n"); return ERROR_NONE; } } return ERROR_NONE; } void CServiceSession::SendSessionInfo() { TServiceConnected packet; packet.nSessionID = GetSessionID(); AddSendData(NETSERVICE_CONNECTED, 0, (char*)&packet, sizeof(packet)); } void CServiceSession::SendNoticeMassage(int nNoticeType, int nManagedID, int nChannelID, int nMapIdx, int nSec, const char * pMsg) { TServiceNotice packet; memset(&packet, 0, sizeof(packet)); packet.nNoticeType = nNoticeType; packet.nManagedID = nManagedID; packet.nChannelID = nChannelID; packet.nMapIdx = nMapIdx; packet.nSlideShowSec = nSec; MultiByteToWideChar(CP_ACP, 0, pMsg, -1, packet.wszMsg, CHATLENMAX); packet.nLen = (USHORT)wcslen(packet.wszMsg); AddSendData(NETSERVICE_NOTICE, 0, (char*)&packet, sizeof(packet) - sizeof(packet.wszMsg) + (packet.nLen * sizeof(WCHAR))); } void CServiceSession::SendNoticeCancel() { AddSendData(NETSERVICE_CANCELNOTICE, 0, NULL, 0); } void CServiceSession::SendMakeDump() { AddSendData(NETSERVICE_MAKE_DUMP, 0, NULL, 0); } void CServiceSession::SendChangeWorldMaxuser(UINT nWorldMaxUser) { TServiceWordlMaxUser packet; memset(&packet, 0, sizeof(TServiceWordlMaxUser)); packet.nChangeMaxUser = nWorldMaxUser; AddSendData(NETSERVICE_WORLDMAXUSER, 0, (char*)&packet, sizeof(TServiceWordlMaxUser)); } void CServiceSession::SendChannelControl(int nChannelID, bool bVisibility, int nChannelPopulation) { TServiceChannelControl packet; memset(&packet, 0, sizeof(packet)); packet.nChannelID = nChannelID; packet.cVisibility = bVisibility == true ? 1 : 0; packet.nChannelPopulation = nChannelPopulation; AddSendData(NETSERVICE_CHANNEL_CONTROL, 0, (char*)&packet, sizeof(packet)); } void CServiceSession::SendPopulationControl(int nServerType, int nManagedID, bool bZeroPopulation) { TServicePopulationControl packet; memset(&packet, 0, sizeof(packet)); packet.nServerType = nServerType; packet.nManagedID = nManagedID; packet.cZeroPopulation = bZeroPopulation == true ? 1 : 0; AddSendData(NETSERVICE_POPULATION_CONTROL, 0, (char*)&packet, sizeof(packet)); } void CServiceSession::SendGameAffinity(int nManagedID, int nType) { TServiceAffinityControl packet; memset(&packet, 0, sizeof(packet)); packet.nManagedID = nManagedID; packet.cAffinityType = (BYTE)nType; AddSendData(NETSERVICE_AFFINITY_CONTROL, 0, (char*)&packet, sizeof(packet)); } void CServiceSession::SendUpdateEvent() { AddSendData(NETSERVICE_EVENTUPDATE, 0, NULL, 0); } void CServiceSession::SendUpdateSimpleConfig() { AddSendData(NETSERVICE_SIMPLECONFIGUPDATE, 0, NULL, 0); } void CServiceSession::SendCloseService() { m_bIsServiceClose = true; AddSendData(NETSERVICE_DETACHALLUSER, 0, NULL, 0); } void CServiceSession::SendUserRestraint(UINT nAccountDBID) { TServiceUserRestraint packet; memset(&packet, 0, sizeof(TServiceUserRestraint)); packet.nAccountDBID = nAccountDBID; AddSendData(NETSERVICE_USERRESTRAINT, 0, (char*)&packet, sizeof(packet)); } void CServiceSession::SendUserBan(const WCHAR * pName, UINT nAccountDBID, eBanFileType eType) { TServiceUserBan packet; memset(&packet, 0, sizeof(TServiceUserBan)); packet.eType = eType; packet.nAccountDBID = nAccountDBID; if (pName) { if (wcslen(pName) >= NAMELENMAX) { g_Log.Log(LogType::_FILELOG, L"ChracterName Size OverFlow [%s]\n", pName); return ; } ::wcsncpy_s(packet.wszName, _countof(packet.wszName), pName, _countof(packet.wszName)); } AddSendData(NETSERVICE_USERBAN, 0, (char*)&packet, sizeof(packet)); } void CServiceSession::SendPing() { AddSendData(NETSERVICE_PING, 0, NULL, 0); if (m_nLastPingTick <= 0) m_nLastPingTick = timeGetTime(); } void CServiceSession::SendSelectJoin(int nSID, const WCHAR * pwszCharacterName) { TServiceSelectjoin packet; memset(&packet, 0, sizeof(TServiceSelectjoin)); packet.nSID = nSID; if (wcslen(pwszCharacterName) >= NAMELENMAX) { g_Log.Log(LogType::_FILELOG, L"ChracterName Size OverFlow [%s]\n", pwszCharacterName); return ; } ::wcsncpy_s(packet.wszCharacterName, _countof(packet.wszCharacterName), pwszCharacterName, wcslen(pwszCharacterName)); AddSendData(NETSERVICE_SELECTJOIN, 0, (char*)&packet, sizeof(TServiceSelectjoin)); } void CServiceSession::SendClearSelectjoin() { AddSendData(NETSERVICE_CLEAR_SELECTJOIN, 0, NULL, 0); } void CServiceSession::SendScheduleCloseService(__time64_t _tOderedTime, __time64_t _tCloseTime) { TScheduleServiceClose packet; memset(&packet, 0, sizeof(packet)); packet._tOderedTime = _tOderedTime; packet._tCloseTime = _tCloseTime; AddSendData(NETSERVICE_SCHEDULE_SERVERCLOSE, 0, (char*)&packet, sizeof(TScheduleServiceClose)); } void CServiceSession::SendUpdateSaleData() { AddSendData(NETSERVICE_UPDATESALEDATA, 0, NULL, 0); } void CServiceSession::SendUpdateFarm(int nWorldID, bool bForceStart) { TUpdateFarm packet; memset(&packet, 0, sizeof(TUpdateFarm)); packet.nWorldID = nWorldID; packet.bForceStart = bForceStart; AddSendData(NETSERVICE_UPDATEFARM, 0, (char*)&packet, sizeof(TUpdateFarm)); } void CServiceSession::SendUpdateGuildWarSchedule() { AddSendData(NETSERVICE_UPDATEGUILDWAR_SCHEDULE, 0, NULL, 0); } void CServiceSession::SendUpdateGuildWare(int nGuildID) { TUPdateGuildWare packet; memset(&packet, 0, sizeof(TUPdateGuildWare)); packet.nGuildID = nGuildID; AddSendData(NETSERVICE_UPDATEGUILDWARE, 0, (char*)&packet, sizeof(TUPdateGuildWare)); } void CServiceSession::SendExtReload(int nType) { TExtReload packet; memset(&packet, 0, sizeof(TExtReload)); packet.nType = nType; AddSendData(NETSERVICE_EXTRELOAD, 0, (char*)&packet, sizeof(TExtReload)); } void CServiceSession::SendCreatEachDB(int nWorldID) { TCreateDB packet; memset(&packet, 0, sizeof(TCreateDB)); packet.nWorldID = nWorldID; AddSendData(NETSERVICE_CREATEWORLDDB, 0, (char*)&packet, sizeof(TCreateDB)); } void CServiceSession::SendReloadSchedule(int nWorldID) { TReloadGuildwarSchedule packet; memset(&packet, 0, sizeof(TReloadGuildwarSchedule)); packet.nWorldID = nWorldID; AddSendData(NETSERVICE_RELOADGUILDWARSCHEDULE, 0, (char*)&packet, sizeof(TReloadGuildwarSchedule)); } void CServiceSession::SendChangeLimitedItemMax(int nSN, int nLimitMax) { TChangeLimitItemMax packet; memset(&packet, 0, sizeof(TChangeLimitItemMax)); packet.nSN = nSN; packet.nLimiteMax = nLimitMax; AddSendData(NETSERVICE_LIMITEITEM_CHANGEQUANTITY, 0, (char*)&packet, sizeof(TReloadGuildwarSchedule)); } void CServiceSession::SendReloadDynCode() { AddSendData(NETSERVICE_RELOADDYNCODE, 0, NULL, 0); } bool CServiceSession::IsCompleteConnected(ULONG nCurTick) { if (m_nCreateSessionTick <= 0) return true; if (m_nCreateSessionTick + ONEMINTICK < nCurTick) return false; return true; } void CServiceSession::SendUpdateWorldPvPRoom() { TApplyWorldPvPRoom packet; memset(&packet, 0, sizeof(TApplyWorldPvPRoom)); AddSendData(NETSERVICE_UPDATEWORLDPVPROOM, 0, (char*)&packet, sizeof(TApplyWorldPvPRoom)); } void CServiceSession::SendCreateGambleRoom(int nRoomIndex, int nRegulation, int nGambleType, int nPrice ) { TCreateGambleRoom packet; memset(&packet, 0, sizeof(TCreateGambleRoom)); packet.nRoomIndex = nRoomIndex; packet.bRegulation = (bool)nRegulation; packet.nGambleType = nGambleType; packet.nPrice = nPrice; AddSendData(NETSERVICE_CREATEGAMBLEROOM, 0, (char*)&packet, sizeof(TCreateGambleRoom)); } void CServiceSession::SendStopGambleRoom() { TStopGambleRoom packet; memset(&packet, 0, sizeof(TStopGambleRoom)); AddSendData(NETSERVICE_STOPGAMBLEROOM, 0, (char*)&packet, sizeof(TStopGambleRoom)); } void CServiceSession::SendDelGambleRoom() { TDelGambleRoom packet; memset(&packet, 0, sizeof(TDelGambleRoom)); AddSendData(NETSERVICE_DELGAMBLEROOM, 0, (char*)&packet, sizeof(TDelGambleRoom)); } void CServiceSession::SendUpdateDWCStatus() { TUpdateDWCStatus packet; memset(&packet, 0, sizeof(TUpdateDWCStatus)); AddSendData(NETSERVICE_UPDATE_DWCSTATUS, 0, (char*)&packet, sizeof(TUpdateDWCStatus)); }