예제 #1
0
파일: Mutex.cpp 프로젝트: CN-Zxcv/QService
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
}
예제 #2
0
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;
}
예제 #3
0
파일: Mutex.cpp 프로젝트: CN-Zxcv/QService
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));
    }
}
예제 #4
0
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;
}
예제 #5
0
파일: Mutex.cpp 프로젝트: CN-Zxcv/QService
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));
    }
}
예제 #6
0
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);
}
예제 #7
0
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;
}