Beispiel #1
0
BOOL _stdcall IsFriendlyFire(PED_TYPE *pPlayer,DWORD *pdwEnt, int iWeapon, float fUnk, int PedPiece, BYTE byteUnk)
{
	CPlayerPool *pPlayerPool;
	CRemotePlayer *pRemotePlayer;
	CLocalPlayer *pLocalPlayer;
	BYTE byteRemotePlayerID;
	BYTE byteLocalPlayerTeam;

	if(pPlayer == GamePool_FindPlayerPed()) {
		if(pNetGame && pNetGame->m_byteFriendlyFire) {
			
			pPlayerPool = pNetGame->GetPlayerPool();
			pLocalPlayer = pPlayerPool->GetLocalPlayer();
			byteLocalPlayerTeam = pLocalPlayer->GetTeam();

			if(pLocalPlayer->IsWasted() || (byteLocalPlayerTeam == NO_TEAM)) return FALSE;

			byteRemotePlayerID = pPlayerPool->FindRemotePlayerIDFromGtaPtr((PED_TYPE *)pdwEnt);

			if(byteRemotePlayerID != INVALID_PLAYER_ID) {
				pRemotePlayer = pPlayerPool->GetAt(byteRemotePlayerID);
				if(pRemotePlayer->GetTeam() == byteLocalPlayerTeam) {
					return TRUE;
				} else {
					return FALSE;
				}
			}

			// didn't find pdwEnt in the player pool.
			// this is where we could check for a vehicle.
		}
	}

	return FALSE;	
}
Beispiel #2
0
void CRemotePlayer::HandleDeath()
{
	CPlayerPool *pPlayerPool = pNetGame->GetPlayerPool();
	CLocalPlayer *pLocalPlayer = NULL;

	if (pPlayerPool) pLocalPlayer = pPlayerPool->GetLocalPlayer();

	if (pLocalPlayer) {
		if (pLocalPlayer->IsSpectating() && pLocalPlayer->m_SpectateID == m_PlayerID) {
				//pLocalPlayer->ToggleSpectating(FALSE);
		}
	}

	if(m_pPlayerPed) {
		m_pPlayerPed->SetKeys(0,0,0);
		m_pPlayerPed->SetDead();
	}

	// Dead weapon pickups
	if (m_pPlayerPed && m_pPlayerPed->GetDistanceFromLocalPlayerPed() <= 100.0f)
	{
		MATRIX4X4 matPlayer;
		m_pPlayerPed->GetMatrix(&matPlayer);

		WEAPON_SLOT_TYPE * WeaponSlot = m_pPlayerPed->GetCurrentWeaponSlot();

		if (WeaponSlot->dwType != 0 &&
			WeaponSlot->dwType != WEAPON_GRENADE &&
			WeaponSlot->dwType != WEAPON_TEARGAS &&
			WeaponSlot->dwType != WEAPON_MOLTOV)
		{
			if(pNetGame->GetPickupPool()) {
				pNetGame->GetPickupPool()->New(pGame->GetWeaponModelIDFromWeapon(WeaponSlot->dwType),
					matPlayer.pos.X, matPlayer.pos.Y, matPlayer.pos.Z, WeaponSlot->dwAmmoInClip, m_PlayerID);
			}
		}
	}

	SetState(PLAYER_STATE_WASTED);
	ResetAllSyncAttributes();
}
Beispiel #3
0
void CVehiclePool::Process()
{
	// Process all vehicles in the vehicle pool.
	CVehicle *pVehicle;
	DWORD dwThisTime = GetTickCount();
	
	CPlayerPool* pPlayerPool = pNetGame->GetPlayerPool();
	CLocalPlayer* pLocalPlayer = pPlayerPool->GetLocalPlayer();

	int iLocalPlayersInRange = 0;
	if (pLocalPlayer)
		iLocalPlayersInRange = pLocalPlayer->DetermineNumberOfPlayersInLocalRange();

	ProcessWaitingList();

	for(VEHICLEID x = 0; x != MAX_VEHICLES; x++)
	{
		if(GetSlotState(x) == TRUE)
		{
			// It's in use.
			pVehicle = m_pVehicles[x];

			if(m_bIsActive[x])
			{
				if(pVehicle->IsDriverLocalPlayer()) {
					pVehicle->SetInvulnerable(FALSE);
				} else {
					pVehicle->SetInvulnerable(TRUE);
				}

				if (pVehicle->GetHealth() == 0.0f) // || pVehicle->IsWrecked()) // It's dead
				{
					if (pLocalPlayer->m_LastVehicle == x) // Notify server of death
					{
						NotifyVehicleDeath(x);
					}
					continue;
				}
	
				if( pVehicle->GetVehicleSubtype() != VEHICLE_SUBTYPE_BOAT &&
					pVehicle->HasSunk() ) // Not boat and has sunk.
				{
					if (pLocalPlayer->m_LastVehicle == x) {
						NotifyVehicleDeath(x);
					}
					continue;
				}
									
				// Active and in world.
				pLocalPlayer->ProcessUndrivenSync(x, pVehicle, iLocalPlayersInRange); // sync unoccupied vehicle if needed

				/* This has an impact on undriven passenger sync. check for driver instead 
				// Kye: This the source of the audio bug?
				if(!pVehicle->IsOccupied()) {
					pVehicle->SetEngineState(FALSE);
				} else {
					pVehicle->SetEngineState(TRUE);
				}*/

				// Update the actual ingame pointer if it's not the same as the one we have listed.
				if(pVehicle->m_pVehicle != m_pGTAVehicles[x]) {
					m_pGTAVehicles[x] = pVehicle->m_pVehicle;
				}

				pVehicle->ProcessMarkers();
			}
		}
	}
}
Beispiel #4
0
void CRemotePlayer::Process()
{
	CPlayerPool *pPool = pNetGame->GetPlayerPool();
	CVehiclePool *pVehiclePool = pNetGame->GetVehiclePool();
	CLocalPlayer *pLocalPlayer = pPool->GetLocalPlayer();
	MATRIX4X4 matVehicle;
	VECTOR vecMoveSpeed;

	if(IsActive())
	{
		if(m_pPlayerPed)
		{
			m_pPlayerPed->ProcessMarkers(
				pNetGame->m_bLimitGlobalChatRadius,
				pNetGame->m_fGlobalChatRadius,TRUE);

			if(GetTickCount() > m_dwWaitForEntryExitAnims) {
				HandleVehicleEntryExit();
			}

			// ---- ONFOOT NETWORK PROCESSING ----
			if( GetState() == PLAYER_STATE_ONFOOT &&
				m_byteUpdateFromNetwork == UPDATE_TYPE_ONFOOT )
			{	
				if(GetTickCount() > m_dwWaitForEntryExitAnims) {
					HandleVehicleEntryExit();
				}

				// If the user has sent X, Y or Z offsets we need to 'attach' him to the car using these offsets
				if ( !IsSurfingOrTurretMode() )
				{
					// If the user hasn't sent these, they're obviously not on the car, so we just sync
					// their normal movement/speed/etc.
					UpdateOnFootPositionAndSpeed(&m_ofSync.vecPos,&m_ofSync.vecMoveSpeed);
					UpdateOnfootTargetPosition();
				}

				// UPDATE ROTATION
				m_pPlayerPed->SetTargetRotation(m_ofSync.fRotation);
		
				// UPDATE CURRENT WEAPON
				if(m_pPlayerPed->IsAdded() && m_pPlayerPed->GetCurrentWeapon() != m_ofSync.byteCurrentWeapon) {
					m_pPlayerPed->SetArmedWeapon(m_ofSync.byteCurrentWeapon);

					// double check
					if(m_pPlayerPed->GetCurrentWeapon() != m_ofSync.byteCurrentWeapon) {
						m_pPlayerPed->GiveWeapon(m_ofSync.byteCurrentWeapon,9999);
						m_pPlayerPed->SetArmedWeapon(m_ofSync.byteCurrentWeapon);
					}
				}

				// First person weapon action hack
				if (IS_TARGETING(m_ofSync.wKeys)) {
					if (m_pPlayerPed->GetCurrentWeapon() == 34 ||
						m_pPlayerPed->GetCurrentWeapon() == 35 ||
						m_pPlayerPed->GetCurrentWeapon() == 36)
					{
						m_pPlayerPed->SetActionTrigger(12);
					}
				} else if (m_pPlayerPed->GetActionTrigger() == 12) {
					m_pPlayerPed->SetActionTrigger(1);
				}

				m_pCurrentVehicle = NULL;
				m_byteUpdateFromNetwork = UPDATE_TYPE_NONE;
			}

			// ---- DRIVER NETWORK PROCESSING ----
			else if(GetState() == PLAYER_STATE_DRIVER &&
				m_byteUpdateFromNetwork == UPDATE_TYPE_INCAR)
			{
				if(!m_pCurrentVehicle) return;
               
				// MATRIX
				DecompressNormalVector(&matVehicle.right,&m_icSync.cvecRoll);
				DecompressNormalVector(&matVehicle.up,&m_icSync.cvecDirection);

				matVehicle.pos.X = m_icSync.vecPos.X;
				matVehicle.pos.Y = m_icSync.vecPos.Y;
				matVehicle.pos.Z = m_icSync.vecPos.Z;

				// MOVE SPEED
				vecMoveSpeed.X = m_icSync.vecMoveSpeed.X;
				vecMoveSpeed.Y = m_icSync.vecMoveSpeed.Y;
				vecMoveSpeed.Z = m_icSync.vecMoveSpeed.Z;

				// Note: Train Speed and Tire Popping values are mutually exclusive, which means
				//       if one is set, the other one will be affected.

				if( m_pCurrentVehicle->GetModelIndex() == TRAIN_PASSENGER_LOCO ||
					m_pCurrentVehicle->GetModelIndex() == TRAIN_FREIGHT_LOCO ||
					m_pCurrentVehicle->GetModelIndex() == TRAIN_TRAM) {
					// TRAIN MATRIX UPDATE
					UpdateTrainDriverMatrixAndSpeed(&matVehicle,&vecMoveSpeed, m_icSync.fTrainSpeed);
				} else {

					// GENERIC VEHICLE MATRIX UPDATE
					UpdateInCarMatrixAndSpeed(matVehicle,vecMoveSpeed);
					UpdateIncarTargetPosition();
					
					// FOR TIRE POPPING
					if (pNetGame->m_bTirePopping) {
						if (m_pCurrentVehicle->GetVehicleSubtype() == VEHICLE_SUBTYPE_BIKE) {
							m_pCurrentVehicle->SetWheelPopped(0, m_icSync.byteTires[0]);
							m_pCurrentVehicle->SetWheelPopped(1, m_icSync.byteTires[1]);
						} 
						else if ( m_pCurrentVehicle->GetVehicleSubtype() == VEHICLE_SUBTYPE_CAR ) {
							m_pCurrentVehicle->SetWheelPopped(0, m_icSync.byteTires[0]);
							m_pCurrentVehicle->SetWheelPopped(1, m_icSync.byteTires[1]);
							m_pCurrentVehicle->SetWheelPopped(2, m_icSync.byteTires[2]);
							m_pCurrentVehicle->SetWheelPopped(3, m_icSync.byteTires[3]);
						}
					}
				}

				// HYDRA THRUSTERS
				if(m_pCurrentVehicle->GetModelIndex() == HYDRA) {
					m_pCurrentVehicle->SetHydraThrusters(m_icSync.dwHydraThrustAngle);
				}
		
				m_pCurrentVehicle->SetSirenOn(m_icSync.byteSirenOn);
				m_pCurrentVehicle->SetLandingGearState((eLandingGearState)m_icSync.byteLandingGearState);
		
				// VEHICLE HEALTH
				m_pCurrentVehicle->SetHealth(m_icSync.fCarHealth);

				// TRAILER AUTOMATIC ATTACHMENT AS THEY MOVE INTO IT
				if (m_pCurrentVehicle->GetDistanceFromLocalPlayerPed() < LOCKING_DISTANCE)
				{
					if (m_icSync.TrailerID && m_icSync.TrailerID < MAX_VEHICLES)
					{
						CVehicle* pRealTrailer = m_pCurrentVehicle->GetTrailer();
						CVehicle *pTrailerVehicle = pVehiclePool->GetAt(m_icSync.TrailerID);
						if (!pRealTrailer) {
							if (pTrailerVehicle) {
								m_pCurrentVehicle->SetTrailer(pTrailerVehicle);
								m_pCurrentVehicle->AttachTrailer();
							}
						}
					} 
					else
					{
						if (m_pCurrentVehicle->GetTrailer()) {
							m_pCurrentVehicle->DetachTrailer();
							m_pCurrentVehicle->SetTrailer(NULL);
						}
					}
				}
				else
				{
					m_pCurrentVehicle->SetTrailer(NULL);
				}

				// UPDATE CURRENT WEAPON (FOR DRIVER!)
				if( m_pPlayerPed->IsAdded() &&
					m_pPlayerPed->GetCurrentWeapon() != m_icSync.byteCurrentWeapon ) {
					m_pPlayerPed->SetArmedWeapon(m_icSync.byteCurrentWeapon);
					if(m_pPlayerPed->GetCurrentWeapon() != m_icSync.byteCurrentWeapon) {
						m_pPlayerPed->GiveWeapon(m_icSync.byteCurrentWeapon,9999);
						m_pPlayerPed->SetArmedWeapon(m_icSync.byteCurrentWeapon);
					}
				}
				m_byteUpdateFromNetwork = UPDATE_TYPE_NONE;
			}

			// ---- PASSENGER NETWORK PROCESSING ----
			else if(GetState() == PLAYER_STATE_PASSENGER && 
				m_byteUpdateFromNetwork == UPDATE_TYPE_PASSENGER)
			{
				if(!m_pCurrentVehicle) return;
				// UPDATE CURRENT WEAPON
				if( m_pPlayerPed->IsAdded() &&
					m_pPlayerPed->GetCurrentWeapon() != m_psSync.byteCurrentWeapon ) {
					m_pPlayerPed->SetArmedWeapon(m_psSync.byteCurrentWeapon);
					if(m_pPlayerPed->GetCurrentWeapon() != m_psSync.byteCurrentWeapon) {
						m_pPlayerPed->GiveWeapon(m_psSync.byteCurrentWeapon,9999);
						m_pPlayerPed->SetArmedWeapon(m_psSync.byteCurrentWeapon);
					}
				}
				// FOR INITIALISING PASSENGER DRIVEBY
				if(!m_bPassengerDriveByMode && m_pPlayerPed->GetActionTrigger() == ACTION_INCAR) {
					if(m_psSync.byteDriveBy) {
						if(m_pPlayerPed->IsAdded()) {
							if(m_pPlayerPed->StartPassengerDriveByMode()) {
								m_bPassengerDriveByMode = TRUE;
							}
						}
					}
				}
				m_byteUpdateFromNetwork = UPDATE_TYPE_NONE;
			}

			// ------ PROCESSED FOR ALL FRAMES ----- 
			if(GetState() == PLAYER_STATE_ONFOOT) {
				m_bPassengerDriveByMode = FALSE;
				ProcessSpecialActions(m_ofSync.byteSpecialAction);
				m_pPlayerPed->SetTargetRotation(m_ofSync.fRotation);
				m_pPlayerPed->SetKeys(m_ofSync.wKeys,m_ofSync.lrAnalog,m_ofSync.udAnalog);
				
				if(IsSurfingOrTurretMode()) {
					UpdateSurfing();
					m_pPlayerPed->SetGravityProcessing(0);
					m_pPlayerPed->SetCollisionChecking(0);
				} else {
					m_pPlayerPed->SetGravityProcessing(1);
					m_pPlayerPed->SetCollisionChecking(1);
				}
			}
			else if(GetState() == PLAYER_STATE_DRIVER) {
				m_bPassengerDriveByMode = FALSE;
				m_pPlayerPed->CheckVehicleParachute();
				
				// REMOVE PLAYER MODEL IN RC VEHICLE
				if(m_pCurrentVehicle && m_pCurrentVehicle->IsRCVehicle()) {
					m_pPlayerPed->Remove();
				}

				if(m_iIsInAModShop)	{
					VECTOR vec = {0.0f,0.0f,0.0f};
					m_pPlayerPed->SetKeys(0,0,0);
					if(m_pCurrentVehicle) m_pCurrentVehicle->SetMoveSpeedVector(vec);
				} else {
					m_pPlayerPed->SetKeys(m_icSync.wKeys,m_icSync.lrAnalog,m_icSync.udAnalog);
				}
			}
			else if(GetState() == PLAYER_STATE_PASSENGER) {
				m_pPlayerPed->CheckVehicleParachute();
				m_pPlayerPed->SetKeys(m_psSync.wKeys,0,0);
			}
			else {
				m_bPassengerDriveByMode = FALSE;
				m_pPlayerPed->SetKeys(0,0,0);
			}

			m_pPlayerPed->SetHealth(100.0f);
			//m_pPlayerPed->SetArmour(100.0f);
		}
	}
	else {
		// NOT ACTIVE
		if(m_pPlayerPed) {
			ResetAllSyncAttributes();
			m_pPlayerPed->Destroy();
			delete m_pPlayerPed;
			m_pPlayerPed = NULL;
		}
	}
}