int CMutex::Init(void) { #ifdef Q_OS_WIN32 m_Mutex = CreateMutex(NULL, FALSE, NULL); return (NULL == m_Mutex ? Q_Error() : Q_RTN_OK); #else return pthread_mutex_init(&m_Mutex, (const pthread_mutexattr_t*)NULL); #endif }
int KGameserverEyes::OnE2LCommonProtocol(BYTE* pData, size_t nLen) { KSubProtocolHead* pHead = (KSubProtocolHead*)pData; //printf("E2LCommand: %d\n", pHead->wSubProtocol); switch (pHead->wSubProtocol) { case e2l_gmcmd_def: { e2l_gmcmd* pCmd = (e2l_gmcmd*)pData; if (nLen < sizeof(e2l_gmcmd) || nLen != sizeof(e2l_gmcmd) + pCmd->nCmdLen || pCmd->nCmdLen <= 0) { ASSERT(FALSE); break; } pCmd->szName[sizeof(pCmd->szName) - 1] = '\0'; LPSTR pszCmd = (LPSTR)(pCmd + 1); pszCmd[pCmd->nCmdLen - 1] = '\0'; ExecuteGmCmd(pCmd, pszCmd); QLogPrintf(LOG_INFO, "[GM] from KingEye '%s'", pszCmd); } break; case e2l_queryrolelist_def: // 查询角色列表 { if (nLen != sizeof(e2l_queryrolelist)) { ASSERT(FALSE); break; } e2l_queryrolelist* pCmd = (e2l_queryrolelist*)pData; //QueryRoleList(pCmd->nSession, pCmd->szAccount); printf("E2LCommand: e2l_queryrolelist_def '%s'\n", pCmd->szAccount); } break; case e2l_mappedgmcmd_def: { e2l_gmmapcmd* pCmd = (e2l_gmmapcmd*)pData; if (nLen < sizeof(e2l_gmmapcmd) || nLen != sizeof(e2l_gmmapcmd) + pCmd->nParamLength) { ASSERT(FALSE); break; } ExecuteMappedGMCmd(pCmd); QLogPrintf(LOG_INFO, "[GM] from KingEye mapped '%s' '%.*s'", pCmd->szCmdKey, pCmd->nParamLength, pCmd + 1); } break; default: Q_Error("E2L subprotocol unrecognized: " << (INT)pHead->wSubProtocol); } return 1; }
void CMutex::Lock(void) { int iRtn = Q_RTN_OK; #ifdef Q_OS_WIN32 iRtn = WaitForSingleObject(m_Mutex, INFINITE); iRtn = (WAIT_OBJECT_0 == iRtn ? Q_RTN_OK : Q_Error()); #else iRtn = pthread_mutex_lock(&m_Mutex); #endif if (Q_RTN_OK != iRtn) { Q_EXCEPTION(iRtn, "%s", Q_Error2Str(iRtn)); } }
BOOL KPlayerBaseProcess::OnLeaveScene( LPCBYTE pData, UINT uDataLen ) { KS2C_SYNC_LEAVE* pReceived = (KS2C_SYNC_LEAVE*)pData; // get client scene IKScene* pScene = g_cOrpgWorld.GetScene(g_cOrpgWorld.m_dwClientSceneId); QCONFIRM_RET_FALSE(pScene); if (IS_NPC(pReceived->dwId)) { KNpc* pNpc = g_cNpcMgr.GetById(pReceived->dwId); QCONFIRM_RET_FALSE(pNpc); g_cOrpgWorld.RemoveNpc(pNpc->m_dwId); } else if (IS_PLAYER(pReceived->dwId)) { KPlayer* pPlayer = g_cPlayerMgr.GetById(pReceived->dwId); QCONFIRM_RET_FALSE(pPlayer); if (pReceived->dwId == g_cOrpgWorld.m_dwClientPlayerId) { pScene->RemovePlayer(pPlayer); // 是客户端玩家自己,卸载场景 g_cOrpgWorld.UnloadScene(g_cOrpgWorld.m_dwClientSceneId); } else { g_cOrpgWorld.RemovePlayer(pPlayer->m_dwId); } } else if (IS_DOODAD(pReceived->dwId)) { KDoodad* pDoodad = g_cDoodadMgr.GetById(pReceived->dwId); QCONFIRM_RET_FALSE(pDoodad); //g_cOrpgWorld.RemoveDoodad(pDoodad->m_dwId); g_cDoodadMgr.RemoveFromScene(pReceived->dwId); g_cDoodadMgr.DestroyDoodad(pReceived->dwId); //g_cOrpgWorld.RemoveFromScene(pDoodad->m_dwId); } else { Q_Error("Unknown SceneObject " << pReceived->dwId); } return TRUE; }
void CMutex::unLock(void) { int iRtn = Q_RTN_OK; #ifdef Q_OS_WIN32 BOOL bRtn = FALSE; bRtn = ReleaseMutex(m_Mutex); iRtn = (FALSE == bRtn ? Q_Error() : Q_RTN_OK); #else iRtn = pthread_mutex_unlock(&m_Mutex); #endif if (Q_RTN_OK != iRtn) { Q_EXCEPTION(iRtn, "%s", Q_Error2Str(iRtn)); } }
VOID KCharacterServer::SetVisible( BOOL bVisible ) { // 显身 --> 隐身 if (m_rcCharacter.m_bVisible && ! bVisible) { if (IS_PLAYER(m_rcCharacter.GetId())) { KPlayer& rPlayer = static_cast<KPlayer&>(m_rcCharacter); g_cPlayerBaseProcess.DoSyncVisible(&rPlayer, m_rcCharacter.GetId(), bVisible); } g_cPlayerBaseProcess.DoSyncLeave(m_rcCharacter); } // 隐身 --> 显身 if (bVisible && ! m_rcCharacter.m_bVisible) { IKScene* pScene = m_rcCharacter.GetScene(); QCONFIRM(pScene); if (pScene) { TKTraverseHelper<KPlayer> cTravHelper; pScene->TraverseNearbyPlayers(cTravHelper, &m_rcCharacter); if (IS_PLAYER(m_rcCharacter.GetId())) { KPlayer& rPlayer = static_cast<KPlayer&>(m_rcCharacter); g_cPlayerBaseProcess.DoSyncVisible(&rPlayer, m_rcCharacter.GetId(), bVisible); rPlayer.m_cPlayerServer.SyncToNeighborPlayers(cTravHelper.m_vObjList); } else if (IS_NPC(m_rcCharacter.GetId())) { KNpc& rNpc = static_cast<KNpc&>(m_rcCharacter); rNpc.m_cNpcServer.SyncToNeighborPlayers(cTravHelper.m_vObjList); } else { Q_Error("Unexpected SObj [" << m_rcCharacter.GetId() << "][" << m_rcCharacter.GetName() << "]"); } } } m_rcCharacter.SetVisible(bVisible); }
BOOL KNetConnectPlayer::ProcessPacket( INT nConnectId, LPCBYTE pData, UINT uDataLen ) { QCONFIRM_RET_FALSE(nConnectId > 0 && nConnectId <= m_nMaxConnId); QCONFIRM_RET_FALSE(pData); RxStat(pData, uDataLen); INT nPlayerIndex = m_pnConnId2PlayerIndex[nConnectId]; if (nPlayerIndex == 0) { // Process Login KC2S_LOGIN *pLL = (KC2S_LOGIN* )pData; QCONFIRM_RET_FALSE(pLL->byProtocol == emKPLBASE_PTC_C2S_LOGIN && uDataLen == sizeof(KC2S_LOGIN)); //Q_Printl("pLL->byProtocol="<<pLL->byProtocol <<" uDataLen=" <<uDataLen); DWORD dwClientIp = 0; USHORT uClientPort = 0; g_piSocketServer->GetRemoteAddress(nConnectId, dwClientIp, uClientPort); Q_Printl("[ClientLogin] from [" << inet_ntoa(*(struct in_addr*)&dwClientIp) << ":" << uClientPort << "] ConnectionToken" << KGuidHelper::GuidToString(pLL->guid) << " pLL->dwTinyTerminal=" << pLL->dwTinyTerminal); // 玩家已连接上,未发Login协议前应为0 QCONFIRM(m_pnConnId2PlayerIndex[nConnectId] == 0); QCONFIRM_RET_FALSE(pLL->byGameServerVersion <= KD_PROTOCOL_VERSION && pLL->byGameServerVersion >= KD_PROTOCOL_VERSION_LOWER_LIMIT); return OnClientLogin2(pLL->dwRoleId, pLL->guid, nConnectId, pLL->nHidden,pLL->dwTinyTerminal); } QCONFIRM_RET_FALSE(uDataLen >= sizeof(BYTE) * 2); // Check Protocol Size INT nPtcSize = KPTC_SIZE::GetSizeC2S(*pData, *(pData + 1)); if (nPtcSize > 0) { QCONFIRM_RET_FALSE((UINT)nPtcSize == uDataLen); } else // 变长 { QCONFIRM_RET_FALSE(uDataLen >= sizeof(BYTE) * 3 && *(LPWORD)(pData + 2) == uDataLen); } KPlayer* pPlayer = g_cPlayerMgr.GetByIndex(nPlayerIndex); QCONFIRM_RET_FALSE(pPlayer); // Doing 协议过滤 if ( KNSBASE_EXT::DoingProtocolFilter[pPlayer->GetMoveState()] && ! (*KNSBASE_EXT::DoingProtocolFilter[pPlayer->GetMoveState()])(*pPlayer, pData, uDataLen) ) { QLogPrintf(LOG_ERR, "[%s] Doing为[%d]时禁止发送[PF %u, P %u] 协议被屏蔽", pPlayer->GetName(), pPlayer->GetMoveState(), LPCBYTE(pData)[0], LPCBYTE(pData)[1]); return TRUE; } // base协议处理 if (*pData == 0) return g_cPlayerBaseProcess.ProcessProtocol(nPlayerIndex, pData, uDataLen); PLAYER_GAME_STATE eGameState = pPlayer->GetGameState(); if (eGameState != gsPlaying) { KPTC_HEADER_BASE* pHeader = (KPTC_HEADER_BASE*)pData; QLogPrintf(LOG_ERR, "Protocol[%u, %u] blocked, Player[%d][%s] GameState[%d] is not 'gsPlaying'", pHeader->byProtocolFamily, pHeader->byProtocol, pPlayer->m_dwId, pPlayer->GetName(), eGameState); // 其他状态不接受扩展协议 return TRUE; } // 子模块协议处理 IKModuleInterface* piModule = g_cModuleManager.GetModule(BYTE(*pData) - KD_MAX_BASE_PROTOCOL_HEADER); if (!piModule) { Q_Error("Unrecognized Protocol " << BYTE(*pData) << " " << BYTE(*(pData+ 1)) << " Size " << uDataLen); return FALSE; } piModule->ProcessProtocol(nPlayerIndex, pData, uDataLen); return TRUE; }