Ejemplo n.º 1
0
/* <8ee12> ../cstrike/dlls/func_tank.cpp:424 */
void CFuncTank::__MAKE_VHOOK(Use)(CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value)
{
	// player controlled turret
	if (pev->spawnflags & SF_TANK_CANCONTROL)
	{
		if (pActivator->Classify() != CLASS_PLAYER)
			return;

		if (value == 2 && useType == USE_SET)
		{
			ControllerPostFrame();
		}
		else if (!m_pController && useType != USE_OFF)
		{
			((CBasePlayer*)pActivator)->m_pTank = this;
			StartControl((CBasePlayer*)pActivator);
		}
		else
		{
			StopControl();
		}
	}
	else
	{
		if (!ShouldToggle(useType, IsActive()))
			return;

		if (IsActive())
			TankDeactivate();
		else
			TankActivate();
	}
}
void CFuncTank::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
{
	if ( m_spawnflags & SF_TANK_CANCONTROL )
	{  
		// player controlled turret
		CBasePlayer *pPlayer = ToBasePlayer( pActivator );
		if ( !pPlayer )
			return;

		if ( value == 2 && useType == USE_SET )
		{
			ControllerPostFrame();
		}
		else if ( !m_pController && useType != USE_OFF )
		{
			// The player must be within the func_tank controls
			Assert( m_hControlVolume );
			if ( !m_hControlVolume->IsTouching( pPlayer ) )
				return;

			pPlayer->SetUseEntity( this );
			StartControl( pPlayer );
		}
		else
		{
			StopControl();
		}
	}
	else
	{
		if ( !ShouldToggle( useType, IsActive() ) )
			return;

		if ( IsActive() )
		{
			TankDeactivate();
		}
		else
		{
			TankActivate();
		}
	}
}
Ejemplo n.º 3
0
CControl::~CControl()
{
	delete m_Traces;

	StopControl();

	for (int i = 0; i < m_numTuners; i++)
		delete m_infoTuners[i].transportTuner;

	delete m_infoTuners;

	if (m_infoMsg->RequestMsg)
		delete[]m_infoMsg->RequestMsg;

	if (m_infoMsg->setValue)
		delete[]m_infoMsg->setValue;

	if (m_infoMsg)
		delete m_infoMsg;
}
Ejemplo n.º 4
0
int CControl::TreatReceivedData()
{
	char log_output[1024];
	memset(log_output, 0, 1024);
	int i = 0, err = 0;
	int activity = 0;
	SOCKET sock = 0, acceptSocket = 0;
	char* ipClientHDHR = new char[16];
	memset(ipClientHDHR, 0, 16);
	strcpy(ipClientHDHR, "");
	int portClientHDHR = 0;
	int listSocketsFull = 1;

	//FD_SET structure of sockets is clean
	FD_ZERO(&readfds);

	//The main socket is added to the structure FD_SET
	FD_SET(mainSocket, &readfds);

	//Sockets children are added to the structure FD_SET
	for (i = 0; i < m_numClientSockets; i++)
	{
		sock = m_clientSockets[i].clientSocket;

		if (sock > 0)
			FD_SET(sock, &readfds);
	}

	//Expecting while no activity is received of any socket.
	activity = select(FD_SETSIZE, &readfds, NULL, NULL, NULL);

	if (activity == SOCKET_ERROR)
	{
		err = WSAGetLastError();
		_snprintf(log_output, 1024 - 2, "CONTROL    :: Error at select call (sockets). Error code: %d\n", err);
		m_Traces->WriteTrace(log_output, ERR);

		wdControlErr++;
		if (wdControlErr >= wdControlErr_Count)
		{
			if (m_Traces->IsLevelWriteable(LEVEL_TRZ_2))
				m_Traces->WriteTrace("CONTROL    :: RESTART FORCED by repeated errors in main loop of control treatment sockets\n", LEVEL_TRZ_2);

			wdControlErr = 0;

			StopControl();
			StartHDHRServer();

			if (m_Traces->IsLevelWriteable(LEVEL_TRZ_2))
				m_Traces->WriteTrace("CONTROL    :: RESTARTED CONTROL Process\n", LEVEL_TRZ_2);
		}

		delete[]ipClientHDHR;
		return 0;
	}

	//It receives event in the main socket, there is a new connection
	if (FD_ISSET(mainSocket, &readfds))
	{
		if (!m_libHDHR.Accept(ipClientHDHR, &portClientHDHR, &acceptSocket))
		{
			delete[]ipClientHDHR;
			return 0;
		}

		//New socket is added to the list
		for (i = 0; i < m_numClientSockets; i++)
		{
			if (m_clientSockets[i].clientSocket == 0)
			{
				listSocketsFull = 0;
				m_clientSockets[i].clientSocket = acceptSocket;
				m_clientSockets[i].IP = CString(ipClientHDHR);
				m_clientSockets[i].port = portClientHDHR;

				if (m_Traces->IsLevelWriteable(LEVEL_TRZ_5))
				{
					_snprintf(log_output, 1024 - 2, "CONTROL    :: New client socket connection [%s:%d] : Socket %d\n", ipClientHDHR, portClientHDHR, acceptSocket);
					m_Traces->WriteTrace(log_output, LEVEL_TRZ_5);
				}
				break;
			}
		}
		if (listSocketsFull)
		{
			if (m_Traces->IsLevelWriteable(LEVEL_TRZ_2))
			{
				_snprintf(log_output, 1024 - 2, "CONTROL    :: Client sockets list is FULL [%s:%d] : Socket %d can not be saved and treated.\n", ipClientHDHR, portClientHDHR, acceptSocket);
				m_Traces->WriteTrace(log_output, LEVEL_TRZ_2);
			}
		}
	}

	//Events are treated (reception of data) of the sockets of the list
	for (i = 0; i < m_numClientSockets; i++)
	{
		sock = m_clientSockets[i].clientSocket;

		if (FD_ISSET(sock, &readfds))
		{
			setClientSocket(sock); //The socket to be treated in this iteration is saved
			AssignClientIP(m_clientSockets[i].IP);
			setCliHDHRPort(m_clientSockets[i].port);

			if (ReceiveTCPDataHDHR() == 0)
			{
				err = WSAGetLastError();
				if (err == WSAECONNRESET || err == 0) //The client close the connection
				{
					//The socket is closed and is updated to 0 in the list
					shutdown(sock, SD_BOTH);
					closesocket(sock);
					m_clientSockets[i].clientSocket = 0;
					m_clientSockets[i].port = 0;
					m_clientSockets[i].IP = CString("");

					if (m_Traces->IsLevelWriteable(LEVEL_TRZ_5))
					{
						_snprintf(log_output, 1024 - 2, "CONTROL    :: Client socket disconnected   [%s:%d] : Socket %d\n", ipClientHDHR, portClientHDHR, sock);
						m_Traces->WriteTrace(log_output, LEVEL_TRZ_5);
					}
				}
				else
				{
					_snprintf(log_output, 1024 - 2, "CONTROL    :: Error at RECV (sockets). Error code: %d\n", err);
					m_Traces->WriteTrace(log_output, ERR);
					if (err == WSAECONNABORTED)
					{
						//The socket is closed and is updated to 0 in the list
						shutdown(sock, SD_BOTH);
						closesocket(sock);
						m_clientSockets[i].clientSocket = 0;
						m_clientSockets[i].port = 0;
						m_clientSockets[i].IP = CString("");
						if (m_Traces->IsLevelWriteable(LEVEL_TRZ_5))
						{
							_snprintf(log_output, 1024 - 2, "CONTROL    :: Closing socket which had error              [%s:%d] : Socket %d\n", ipClientHDHR, portClientHDHR, sock);
							m_Traces->WriteTrace(log_output, LEVEL_TRZ_5);
						}
					}

					wdControlErr++;
					if (wdControlErr >= wdControlErr_Count)
					{
						if (m_Traces->IsLevelWriteable(LEVEL_TRZ_2))
							m_Traces->WriteTrace("CONTROL    :: RESTART FORCED by repeated errors in main loop of control treatment sockets\n", LEVEL_TRZ_2);
						wdControlErr = 0;
						
						StopControl();
						StartHDHRServer();

						if (m_Traces->IsLevelWriteable(LEVEL_TRZ_2))
							m_Traces->WriteTrace("CONTROL    :: RESTARTED CONTROL Process\n", LEVEL_TRZ_2);
					}

					delete[] ipClientHDHR;
					return 0;
				}
			}
		}
	}

	wdControlErr = 0;

	if (ipClientHDHR)
		delete []ipClientHDHR;

	return 1;
}