/* <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(); } } }
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; }
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; }