diff options
Diffstat (limited to 'src/vehicles/Vehicle.cpp')
-rw-r--r-- | src/vehicles/Vehicle.cpp | 320 |
1 files changed, 193 insertions, 127 deletions
diff --git a/src/vehicles/Vehicle.cpp b/src/vehicles/Vehicle.cpp index d1054191..308a517e 100644 --- a/src/vehicles/Vehicle.cpp +++ b/src/vehicles/Vehicle.cpp @@ -34,6 +34,8 @@ #include "Coronas.h" #include "SaveBuf.h" +// LCS: done except trivial stuff + bool CVehicle::bWheelsOnlyCheat; bool CVehicle::bAllDodosCheat; bool CVehicle::bCheat3; @@ -50,6 +52,12 @@ bool CVehicle::bDisableRemoteDetonationOnContact; #ifndef MASTER bool CVehicle::m_bDisplayHandlingInfo; #endif +float CVehicle::rcHeliHeightLimit = 60.0f; +float CVehicle::WHEELSPIN_FALL_RATE = 0.7f; +float CVehicle::WHEELSPIN_RISE_RATE = 0.95f; +float CVehicle::WHEELSPIN_INAIR_TARGET_RATE = 10.0f; +float CVehicle::WHEELSPIN_TARGET_RATE = 1.0f; + void *CVehicle::operator new(size_t sz) throw() { return CPools::GetVehiclePool()->New(); } void *CVehicle::operator new(size_t sz, int handle) throw() { return CPools::GetVehiclePool()->New(handle); } @@ -72,6 +80,17 @@ CVehicle::CVehicle(uint8 CreatedBy) { int i; + m_fGasPedal = 0.0f; + m_fBrakePedal = 0.0f; + m_fWheelSpin = 0.0f; +#if defined FIX_BUGS || !defined GTA_PSP + bRewardVehicle = false; +#endif + m_vehLCS_29E = 0; + m_vehLCS_29C = 0; + m_vehLCS_2A3 = -1; + m_bSuperBrake = false; // probably for multiplayer + m_nCurrentGear = 1; m_fChangeGearTime = 0.0f; m_fSteerInput = 0.0f; @@ -82,9 +101,7 @@ CVehicle::CVehicle(uint8 CreatedBy) bIsLawEnforcer = false; bIsAmbulanceOnDuty = false; bIsFireTruckOnDuty = false; -#ifdef FIX_BUGS bIsHandbrakeOn = false; -#endif CCarCtrl::UpdateCarCount(this, false); m_fHealth = 1000.0f; bEngineOn = true; @@ -134,16 +151,14 @@ CVehicle::CVehicle(uint8 CreatedBy) bCreatedAsPoliceVehicle = false; bRestingOnPhysical = false; bParking = false; + m_bGarageTurnedLightsOff = false; + m_vehLCS_259 = -1; bCanPark = CGeneral::GetRandomNumberInRange(0.0f, 1.0f) < 0.0f; // never true. probably doesn't work very well bIsVan = false; bIsBus = false; bIsBig = false; bLowVehicle = false; - m_bombType = CARBOMB_NONE; - bDriverLastFrame = false; - m_pBombRigger = nil; - m_nSetPieceExtendedRangeTime = 0; m_nAlarmState = 0; m_nDoorLock = CARLOCK_UNLOCKED; @@ -157,6 +172,7 @@ CVehicle::CVehicle(uint8 CreatedBy) switch(GetModelIndex()){ case MI_HUNTER: case MI_ANGEL: + case MI_ANGEL2: case MI_FREEWAY: m_nRadioStation = V_ROCK; break; @@ -189,6 +205,8 @@ CVehicle::CVehicle(uint8 CreatedBy) CVehicle::~CVehicle() { + //TODO(LCS): clear something in music manager (?) + m_nAlarmState = 0; if (m_audioEntityId >= 0){ DMAudio.DestroyEntity(m_audioEntityId); @@ -218,8 +236,8 @@ void CVehicle::SetModelIndex(uint32 id) { CEntity::SetModelIndex(id); - m_aExtras[0] = CVehicleModelInfo::ms_compsUsed[0]; - m_aExtras[1] = CVehicleModelInfo::ms_compsUsed[1]; + m_aExtras[0] = CVehicleModelInfo::mspInfo->ms_compsUsed[0]; + m_aExtras[1] = CVehicleModelInfo::mspInfo->ms_compsUsed[1]; m_nNumMaxPassengers = CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(id); } @@ -247,6 +265,8 @@ void CVehicle::RemoveLighting(bool reset) { CRenderer::RemoveVehiclePedLights(this, reset); + SetAmbientColours(); + DeActivateDirectional(); } bool @@ -332,14 +352,16 @@ CVehicle::FlyingControl(eFlightModel flightModel) { float fSteerLR = CPad::GetPad(0)->GetSteeringLeftRight() / 128.0f; float fSteerUD = CPad::GetPad(0)->GetSteeringUpDown() / 128.0f; +/* float fGunUD = Abs(CPad::GetPad(0)->GetCarGunUpDown()); #ifdef FREE_CAM if(!CCamera::bFreeCam || (CCamera::bFreeCam && !CPad::IsAffectedByController)) #endif if(fGunUD > 1.0f) fSteerUD = -CPad::GetPad(0)->GetCarGunUpDown() / 128.0f; +*/ - float fSteerAngle = Atan2(fSteerUD, fSteerLR); + float fSteerAngle = fSteerUD != 0.0f && fSteerLR != 0.0f ? Atan2(fSteerUD, fSteerLR) : 0.0f; float fSteerMult = 1.0f; if(fSteerAngle > -PI/4.0f && fSteerAngle <= PI/4.0f) fSteerMult = 1.0f/Cos(fSteerAngle); @@ -440,7 +462,7 @@ CVehicle::FlyingControl(eFlightModel flightModel) m_vecTurnSpeed = Multiply3x3(GetMatrix(), vecTurnSpeed); ApplyTurnForce(-GetUp() * fResistance * m_fTurnMass, GetRight() + Multiply3x3(GetMatrix(), m_vecCentreOfMass)); - +/* float fMoveSpeed = m_vecMoveSpeed.MagnitudeSqr(); if(fMoveSpeed > SQR(1.5f)) m_vecMoveSpeed *= 1.5f/Sqrt(fMoveSpeed); @@ -448,6 +470,7 @@ CVehicle::FlyingControl(eFlightModel flightModel) float fTurnSpeed = m_vecTurnSpeed.MagnitudeSqr(); if(fTurnSpeed > SQR(0.2f)) m_vecTurnSpeed *= 0.2f/Sqrt(fTurnSpeed); +*/ break; } case FLIGHT_MODEL_RCHELI: @@ -464,6 +487,11 @@ CVehicle::FlyingControl(eFlightModel flightModel) return; float fUpSpeed = DotProduct(m_vecMoveSpeed, GetUp()); float fThrust = (CPad::GetPad(0)->GetAccelerate() - CPad::GetPad(0)->GetBrake()) / 255.0f; +#ifdef FREE_CAM + if(!CCamera::bFreeCam || (CCamera::bFreeCam && !CPad::IsAffectedByController)) +#endif + if(Abs(CPad::GetPad(0)->GetCarGunUpDown()) > 1.0f) + fThrust = CPad::GetPad(0)->GetCarGunUpDown() / 128.0f; if(fThrust < 0.0f) fThrust *= 2.0f; if(flightModel == FLIGHT_MODEL_RCHELI){ @@ -472,7 +500,7 @@ CVehicle::FlyingControl(eFlightModel flightModel) }else fThrust = flyingHandling->fThrust * fThrust + 0.95f; fThrust -= flyingHandling->fThrustFallOff * fUpSpeed; - if(flightModel == FLIGHT_MODEL_RCHELI && GetPosition().z > 40.0f) + if(flightModel == FLIGHT_MODEL_RCHELI && GetPosition().z > rcHeliHeightLimit) fThrust *= 10.0f/(GetPosition().z - 30.0f); else if(GetPosition().z > 80.0f) fThrust *= 10.0f/(GetPosition().z - 70.0f); @@ -515,11 +543,13 @@ CVehicle::FlyingControl(eFlightModel flightModel) if(Abs(CPad::GetPad(0)->GetCarGunLeftRight()) > 1.0f) fYaw = CPad::GetPad(0)->GetCarGunLeftRight() / 128.0f; } +/* #ifdef FREE_CAM if(!CCamera::bFreeCam || (CCamera::bFreeCam && !CPad::IsAffectedByController)) #endif if(Abs(CPad::GetPad(0)->GetCarGunUpDown()) > 1.0f) fPitch = -CPad::GetPad(0)->GetCarGunUpDown() / 128.0f; +*/ if (CPad::GetPad(0)->GetHorn()) { fYaw = 0.0f; fPitch = Clamp(flyingHandling->fPitchStab * DotProduct(m_vecMoveSpeed, GetForward()), -200.0f, 1.3f); @@ -713,7 +743,7 @@ CVehicle::BladeColSectorList(CPtrList &list, CColModel &rotorColModel, CMatrix & } ped->InflictDamage(this, WEAPONTYPE_RUNOVERBYCAR, 1000.0f, PEDPIECE_TORSO, localDir); - if(CGame::nastyGame && ped->GetIsOnScreen()){ + if(ped->GetIsOnScreen()){ for(i = 0; i < 16; i++) CParticle::AddParticle(PARTICLE_BLOOD_SMALL, ped->GetPosition(), CVector(dirToRotor.x, dirToRotor.y, 1.0f) * 0.01f); CParticle::AddParticle(PARTICLE_TEST, ped->GetPosition(), CVector(0.0f, 0.0f, 0.02f), nil, 0.1f); @@ -772,7 +802,9 @@ CVehicle::BladeColSectorList(CPtrList &list, CColModel &rotorColModel, CMatrix & } -float fBurstSpeedMax = 0.3f; +float WS_ALREADY_SPINNING_LOSS = 0.2f; +float WS_TRAC_FRAC_LIMIT = 0.3f; +float fBurstSpeedMax = 0.2f; float fBurstTyreMod = 0.13f; void @@ -800,13 +832,15 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon float contactSpeedFwd = DotProduct(wheelContactSpeed, wheelFwd); float contactSpeedRight = DotProduct(wheelContactSpeed, wheelRight); - if(*wheelState != WHEEL_STATE_NORMAL) + adhesion *= CTimer::GetTimeStep(); + if(*wheelState != WHEEL_STATE_NORMAL){ bAlreadySkidding = true; + adhesion *= pHandling->fTractionLoss; + if(*wheelState == WHEEL_STATE_SPINNING && (GetStatus() == STATUS_PLAYER || GetStatus() == STATUS_PLAYER_REMOTE)) + adhesion *= 1.0f - Abs(m_fGasPedal) * WS_ALREADY_SPINNING_LOSS; + } *wheelState = WHEEL_STATE_NORMAL; - adhesion *= CTimer::GetTimeStep(); - if(bAlreadySkidding) - adhesion *= pHandling->fTractionLoss; // moving sideways if(contactSpeedRight != 0.0f){ @@ -848,13 +882,15 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon if(!bBraking){ if(m_fGasPedal < 0.01f){ if(IsBike()) - brake = 0.6f * mod_HandlingManager.fWheelFriction / (pHandling->fMass + 200.0f); - else if(pHandling->fMass < 500.0f) - brake = 0.2f * mod_HandlingManager.fWheelFriction / pHandling->fMass; + brake = 0.6f * mod_HandlingManager.fWheelFriction / (pHandling->GetMass() + 200.0f); + else if(IsPlane()) + brake = 0.0f; + else if(pHandling->GetMass() < 500.0f) + brake = 0.1f * mod_HandlingManager.fWheelFriction / pHandling->GetMass(); else if(GetModelIndex() == MI_RCBANDIT) - brake = 0.2f * mod_HandlingManager.fWheelFriction / pHandling->fMass; + brake = 0.2f * mod_HandlingManager.fWheelFriction / pHandling->GetMass(); else - brake = mod_HandlingManager.fWheelFriction / pHandling->fMass; + brake = mod_HandlingManager.fWheelFriction / pHandling->GetMass(); #ifdef FIX_BUGS brake *= CTimer::GetTimeStepFix(); #endif @@ -878,7 +914,10 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon float speedSq = sq(right) + sq(fwd); if(sq(adhesion) < speedSq){ if(*wheelState != WHEEL_STATE_FIXED){ - if(bDriving && contactSpeedFwd < 0.2f) + float tractionLimit = WS_TRAC_FRAC_LIMIT; + if(contactSpeedFwd > 0.15f && (wheelId == CARWHEEL_FRONT_LEFT || wheelId == CARWHEEL_FRONT_RIGHT)) + tractionLimit *= 2.0f; + if(bDriving && tractionLimit*adhesion < Abs(fwd)) *wheelState = WHEEL_STATE_SPINNING; else *wheelState = WHEEL_STATE_SKIDDING; @@ -886,6 +925,8 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon float l = Sqrt(speedSq); float tractionLoss = bAlreadySkidding ? 1.0f : pHandling->fTractionLoss; + if(*wheelState == WHEEL_STATE_SPINNING && (GetStatus() == STATUS_PLAYER || GetStatus() == STATUS_PLAYER_REMOTE)) + tractionLoss *= 1.0f - Abs(m_fGasPedal) * WS_ALREADY_SPINNING_LOSS; right *= adhesion * tractionLoss / l; fwd *= adhesion * tractionLoss / l; } @@ -894,7 +935,7 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon CVector totalSpeed = fwd*wheelFwd + right*wheelRight; CVector turnDirection = totalSpeed; - bool separateTurnForce = false; // BUG: not initialized on PC + bool separateTurnForce = false; if(pHandling->fSuspensionAntidiveMultiplier > 0.0f){ if(bBraking){ separateTurnForce = true; @@ -920,14 +961,14 @@ CVehicle::ProcessWheel(CVector &wheelFwd, CVector &wheelRight, CVector &wheelCon turnDirection = direction; float impulse = speed*m_fMass; - float turnImpulse = turnSpeed*GetMass(wheelContactPoint, turnDirection); + float turnImpulse = turnSpeed*GetMass(wheelContactPoint - Multiply3x3(GetMatrix(), m_vecCentreOfMass), turnDirection); ApplyMoveForce(impulse * direction); ApplyTurnForce(turnImpulse * turnDirection, wheelContactPoint); } } -float fBurstBikeSpeedMax = 0.12f; +float fBurstBikeSpeedMax = 0.08f; float fBurstBikeTyreMod = 0.05f; float fTweakBikeWheelTurnForce = 2.0f; @@ -1122,6 +1163,84 @@ CVehicle::FindTyreNearestPoint(float x, float y) return piece - CAR_PIECE_WHEEL_LF; } +bool +CVehicle::PedsShouldScreamOnDisembarking(void) +{ + switch(GetModelIndex()){ + case MI_AMBULAN: + case MI_TAXI: + case MI_CABBIE: + return false; + default: + return true; + } +} + +void +CVehicle::OccupantsReactToDamage(CEntity *damagedBy) +{ + if (VehicleCreatedBy == RANDOM_VEHICLE && !IsBoat()){ + switch (GetStatus()) { + case STATUS_SIMPLE: + case STATUS_PHYSICS: + if(bIsLawEnforcer && + (GetModelIndex() == MI_POLICE || GetModelIndex() == MI_ENFORCER || + GetModelIndex() == MI_CHOPPER || GetModelIndex() == MI_PREDATOR) && + damagedBy == FindPlayerPed()){ + // Police gets angry + FindPlayerPed()->SetWantedLevelNoDrop(1); + }else if(pDriver && pDriver->CharCreatedBy != MISSION_CHAR && + pDriver->m_nPedType >= PEDTYPE_GANG1 && pDriver->m_nPedType <= PEDTYPE_GANG9 && + damagedBy == FindPlayerPed()){ + // Gang gets angry + SetStatus(STATUS_ABANDONED); + pDriver->SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, damagedBy); + int time = 200; + for (int i = 0; i < m_nNumMaxPassengers; i++) { + if (pPassengers[i] && + pPassengers[i]->m_objective != OBJECTIVE_KILL_CHAR_ON_FOOT && + pPassengers[i]->CharCreatedBy != MISSION_CHAR) { + pPassengers[i]->SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, damagedBy); + pPassengers[i]->m_objectiveTimer = CTimer::GetTimeInMilliseconds() + time; + time += 200; + } + } + }else if(AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_PLOUGH_THROUGH || + CGeneral::GetRandomNumberInRange(0.0f, 1.0f) > 0.5f && AutoPilot.m_nCarMission == MISSION_CRUISE){ + // Drive away like a maniac + if(pDriver && pDriver->m_objective != OBJECTIVE_LEAVE_CAR){ + if(AutoPilot.m_nDrivingStyle != DRIVINGSTYLE_PLOUGH_THROUGH) + AutoPilot.m_nCruiseSpeed *= 1.5f; + AutoPilot.m_nDrivingStyle = DRIVINGSTYLE_PLOUGH_THROUGH; + } + }else{ + // Leave vehicle + if (pDriver && pDriver->CharCreatedBy != MISSION_CHAR) { + SetStatus(STATUS_ABANDONED); + pDriver->bFleeAfterExitingCar = true; + pDriver->SetObjective(OBJECTIVE_LEAVE_CAR, this); + pDriver->Say(SOUND_PED_FLEE_SPRINT); + } + int time = 200; + for (int i = 0; i < m_nNumMaxPassengers; i++) { + if (pPassengers[i] && + pPassengers[i]->m_objective != OBJECTIVE_LEAVE_CAR && + pPassengers[i]->CharCreatedBy != MISSION_CHAR) { + pPassengers[i]->bFleeAfterExitingCar = true; + pPassengers[i]->SetObjective(OBJECTIVE_LEAVE_CAR, this); + pPassengers[i]->m_objectiveTimer = CTimer::GetTimeInMilliseconds() + time; + pPassengers[i]->Say(SOUND_PED_FLEE_SPRINT); + time += 200; + } + } + } + break; + default: + break; + } + } +} + void CVehicle::InflictDamage(CEntity *damagedBy, eWeaponType weaponType, float damage, CVector pos) { @@ -1207,7 +1326,7 @@ CVehicle::InflictDamage(CEntity *damagedBy, eWeaponType weaponType, float damage accuracy = 10; break; case WEAPONTYPE_PYTHON: - if(!((CPed*)damagedBy)->IsPlayer()) +// if(!((CPed*)damagedBy)->IsPlayer()) accuracy = 64; break; case WEAPONTYPE_SHOTGUN: @@ -1230,14 +1349,16 @@ CVehicle::InflictDamage(CEntity *damagedBy, eWeaponType weaponType, float damage break; } + // not in LCS (ifdef?) if(((CPed*)damagedBy)->IsPlayer() && (CCamera::m_bUseMouse3rdPerson || TheCamera.Using1stPersonWeaponMode())) accuracy = 0; - if(accuracy != 0 && !bTyresDontBurst && (CGeneral::GetRandomNumber()&0x7F) < accuracy){ + int difficulty = damagedBy == FindPlayerPed() ? 0x7F : 0xFF; + if(accuracy != 0 && !bTyresDontBurst && (CGeneral::GetRandomNumber()&difficulty) < accuracy){ if(IsBike()) BurstTyre(FindTyreNearestPoint(pos.x, pos.y) + CAR_PIECE_WHEEL_LF, false); - else if(GetVehicleAppearance() == VEHICLE_APPEARANCE_CAR) - BurstTyre(FindTyreNearestPoint(pos.x, pos.y) + CAR_PIECE_WHEEL_LF, true); + else// if(GetVehicleAppearance() == VEHICLE_APPEARANCE_CAR) + BurstTyre(FindTyreNearestPoint(pos.x, pos.y) + CAR_PIECE_WHEEL_LF, false); //true); } } @@ -1257,44 +1378,7 @@ CVehicle::InflictDamage(CEntity *damagedBy, eWeaponType weaponType, float damage float oldHealth = m_fHealth; if (m_fHealth > damage) { m_fHealth -= damage; - if (VehicleCreatedBy == RANDOM_VEHICLE && !IsBoat()){ - switch (GetStatus()) { - case STATUS_SIMPLE: - case STATUS_PHYSICS: - if(AutoPilot.m_nDrivingStyle == DRIVINGSTYLE_PLOUGH_THROUGH || - CGeneral::GetRandomNumberInRange(0.0f, 1.0f) > 0.5f && AutoPilot.m_nCarMission == MISSION_CRUISE){ - // Drive away like a maniac - if(pDriver && pDriver->m_objective != OBJECTIVE_LEAVE_CAR){ - if(AutoPilot.m_nDrivingStyle != DRIVINGSTYLE_PLOUGH_THROUGH) - AutoPilot.m_nCruiseSpeed *= 1.5f; - AutoPilot.m_nDrivingStyle = DRIVINGSTYLE_PLOUGH_THROUGH; - } - }else{ - // Leave vehicle - if (pDriver && pDriver->CharCreatedBy != MISSION_CHAR) { - SetStatus(STATUS_ABANDONED); - pDriver->bFleeAfterExitingCar = true; - pDriver->SetObjective(OBJECTIVE_LEAVE_CAR, this); - pDriver->Say(SOUND_PED_FLEE_SPRINT); - } - int time = 200; - for (int i = 0; i < m_nNumMaxPassengers; i++) { - if (pPassengers[i] && - pPassengers[i]->m_objective != OBJECTIVE_LEAVE_CAR && - pPassengers[i]->CharCreatedBy != MISSION_CHAR) { - pPassengers[i]->bFleeAfterExitingCar = true; - pPassengers[i]->SetObjective(OBJECTIVE_LEAVE_CAR, this); - pPassengers[i]->m_objectiveTimer = CTimer::GetTimeInMilliseconds() + time; - pPassengers[i]->Say(SOUND_PED_FLEE_SPRINT); - time += 200; - } - } - } - break; - default: - break; - } - } + OccupantsReactToDamage(damagedBy); if (oldHealth >= DAMAGE_HEALTH_TO_CATCH_FIRE && m_fHealth < DAMAGE_HEALTH_TO_CATCH_FIRE) { if (IsCar()) { CAutomobile* pThisCar = (CAutomobile*)this; @@ -1318,12 +1402,6 @@ CVehicle::InflictDamage(CEntity *damagedBy, eWeaponType weaponType, float damage BlowUpCar(damagedBy); } } -#ifdef FIX_BUGS // removing dumb case when shooting police car in player's own garage gives wanted level - if (GetModelIndex() == MI_POLICE && damagedBy == FindPlayerPed() && damagedBy != nil && !bHasBeenOwnedByPlayer) -#else - if (GetModelIndex() == MI_POLICE && damagedBy == FindPlayerPed()) -#endif - FindPlayerPed()->SetWantedLevelNoDrop(1); } void @@ -1356,7 +1434,7 @@ CVehicle::FireFixedMachineGuns(void) m_nGunFiringTime = CTimer::GetTimeInMilliseconds(); - source = GetMatrix() * CVector(2.0f, 2.5f, 1.0f); + source = GetMatrix() * CVector(0.95f, 9.3f, 0.85f); target = source + CVector(dx, dy, 0.0f) * 60.0f; target += CVector( ((CGeneral::GetRandomNumber() & 0xFF) - 128) * 0.015f, @@ -1365,7 +1443,7 @@ CVehicle::FireFixedMachineGuns(void) CWeapon::DoTankDoomAiming(this, pDriver, &source, &target); FireOneInstantHitRound(&source, &target, 15); - source = GetMatrix() * CVector(-2.0f, 2.5f, 1.0f); + source = GetMatrix() * CVector(-0.95f, 9.3f, 0.85f); target = source + CVector(dx, dy, 0.0f) * 60.0f; target += CVector( ((CGeneral::GetRandomNumber() & 0xFF) - 128) * 0.015f, @@ -1384,42 +1462,10 @@ CVehicle::FireFixedMachineGuns(void) } void -CVehicle::ActivateBomb(void) -{ - if(m_bombType == CARBOMB_TIMED){ - m_bombType = CARBOMB_TIMEDACTIVE; - m_nBombTimer = 7000; - m_pBlowUpEntity = FindPlayerPed(); - CGarages::TriggerMessage("GA_12", -1, 3000, -1); - DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_TIMED_ACTIVATED, 1.0f); - }else if(m_bombType == CARBOMB_ONIGNITION){ - m_bombType = CARBOMB_ONIGNITIONACTIVE; - CGarages::TriggerMessage("GA_12", -1, 3000, -1); - DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_ONIGNITION_ACTIVATED, 1.0f); - } -} - -void -CVehicle::ActivateBombWhenEntered(void) -{ - if(pDriver){ - if(!bDriverLastFrame && m_bombType == CARBOMB_ONIGNITIONACTIVE){ - // If someone enters the car and there is a bomb, detonate - m_nBombTimer = 1000; - m_pBlowUpEntity = m_pBombRigger; - if(m_pBlowUpEntity) - m_pBlowUpEntity->RegisterReference((CEntity**)&m_pBlowUpEntity); - DMAudio.PlayOneShot(m_audioEntityId, SOUND_BOMB_TICK, 1.0f); - } - bDriverLastFrame = true; - }else - bDriverLastFrame = false; -} - -void CVehicle::ExtinguishCarFire(void) { - if(GetStatus() != STATUS_WRECKED) +//TODO(LCS): check if this line was added in PC VC +// if(GetStatus() != STATUS_WRECKED) m_fHealth = Max(m_fHealth, 300.0f); if(m_pCarFire) m_pCarFire->Extinguish(); @@ -1438,6 +1484,7 @@ CVehicle::ShufflePassengersToMakeSpace(void) return false; if (pPassengers[1] && !(m_nGettingInFlags & CAR_DOOR_FLAG_LR) && + !(m_nGettingOutFlags & CAR_DOOR_FLAG_LR) && IsRoomForPedToLeaveCar(CAR_DOOR_LR, nil)) { if (!pPassengers[2] && !(m_nGettingInFlags & CAR_DOOR_FLAG_RR)) { pPassengers[2] = pPassengers[1]; @@ -1445,7 +1492,7 @@ CVehicle::ShufflePassengersToMakeSpace(void) pPassengers[2]->m_vehDoor = CAR_DOOR_RR; return true; } - if (!pPassengers[0] && !(m_nGettingInFlags & CAR_DOOR_FLAG_RF)) { + if (!pPassengers[0] && !pPassengers[1]->bOnlyAllowedToSitBehind && !(m_nGettingInFlags & CAR_DOOR_FLAG_RF)) { pPassengers[0] = pPassengers[1]; pPassengers[1] = nil; pPassengers[0]->m_vehDoor = CAR_DOOR_RF; @@ -1455,6 +1502,7 @@ CVehicle::ShufflePassengersToMakeSpace(void) } if (pPassengers[2] && !(m_nGettingInFlags & CAR_DOOR_FLAG_RR) && + !(m_nGettingOutFlags & CAR_DOOR_FLAG_RR) && IsRoomForPedToLeaveCar(CAR_DOOR_RR, nil)) { if (!pPassengers[1] && !(m_nGettingInFlags & CAR_DOOR_FLAG_LR)) { pPassengers[1] = pPassengers[2]; @@ -1462,7 +1510,7 @@ CVehicle::ShufflePassengersToMakeSpace(void) pPassengers[1]->m_vehDoor = CAR_DOOR_LR; return true; } - if (!pPassengers[0] && !(m_nGettingInFlags & CAR_DOOR_FLAG_RF)) { + if (!pPassengers[0] && !pPassengers[2]->bOnlyAllowedToSitBehind && !(m_nGettingInFlags & CAR_DOOR_FLAG_RF)) { pPassengers[0] = pPassengers[2]; pPassengers[2] = nil; pPassengers[0]->m_vehDoor = CAR_DOOR_RF; @@ -1472,8 +1520,9 @@ CVehicle::ShufflePassengersToMakeSpace(void) } if (pPassengers[0] && !(m_nGettingInFlags & CAR_DOOR_FLAG_RF) && + !(m_nGettingOutFlags & CAR_DOOR_FLAG_RF) && IsRoomForPedToLeaveCar(CAR_DOOR_RF, nil)) { - if (!pPassengers[1] && !(m_nGettingInFlags & CAR_DOOR_FLAG_LR)) { + if (!pPassengers[1] && !pPassengers[0]->bOnlyAllowedToSitInFront && !(m_nGettingInFlags & CAR_DOOR_FLAG_LR)) { pPassengers[1] = pPassengers[0]; pPassengers[0] = nil; pPassengers[1]->m_vehDoor = CAR_DOOR_LR; @@ -1547,7 +1596,8 @@ CVehicle::MakeNonDraggedPedsLeaveVehicle(CPed *ped1, CPed *ped2, CPlayerPed *&pl for(i = 0; i < numPeds2; i++) if(peds2[i]->IsFemale() || CGeneral::GetRandomTrueFalse()){ peds2[i]->m_leaveCarTimer = CTimer::GetTimeInMilliseconds() + 10000; - peds2[i]->bHeldHostageInCar = true; + if(peds2[i]->b1A4_2) + peds2[i]->bHeldHostageInCar = true; peds2[i]->bFleeAfterExitingCar = true; } } @@ -1576,12 +1626,13 @@ bool CVehicle::IsLawEnforcementVehicle(void) { switch(GetModelIndex()){ + case MI_FBICAR: case MI_POLICE: case MI_ENFORCER: case MI_PREDATOR: case MI_RHINO: case MI_BARRACKS: - case MI_FBIRANCH: +// case MI_FBIRANCH: case MI_VICECHEE: return true; default: @@ -1692,8 +1743,8 @@ CVehicle::CanPedOpenLocks(CPed *ped) m_nDoorLock == CARLOCK_LOCKED_PLAYER_INSIDE || m_nDoorLock == CARLOCK_LOCKED_BUT_CAN_BE_DAMAGED) return false; - if(ped->IsPlayer() && m_nDoorLock == CARLOCK_LOCKOUT_PLAYER_ONLY) - return false; +// if(ped->IsPlayer() && m_nDoorLock == CARLOCK_LOCKOUT_PLAYER_ONLY) +// return false; return true; } @@ -1838,6 +1889,9 @@ CVehicle::SetupPassenger(int n) void CVehicle::SetDriver(CPed *driver) { + m_vehLCS_258 = false; + bCraneMessageDone = false; + pDriver = driver; pDriver->RegisterReference((CEntity**)&pDriver); @@ -1850,8 +1904,7 @@ CVehicle::SetDriver(CPed *driver) case MI_TAXI: case MI_CABBIE: - case MI_ZEBRA: - case MI_KAUFMAN: + case MI_BORGNINE: CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 12; break; @@ -1927,6 +1980,7 @@ CVehicle::AddPassenger(CPed *passenger, uint8 n) void CVehicle::RemoveDriver(void) { + m_vehLCS_259 = -1; #ifdef FIX_BUGS if (GetStatus() != STATUS_WRECKED) #endif @@ -2021,6 +2075,16 @@ CVehicle::UpdatePassengerList(void) m_nNumPassengers = 0; } +bool +CVehicle::AreThereAnyPassengers(void) +{ + int i; + for(i = 0; i < m_nNumMaxPassengers; i++) + if(pPassengers[i]) + return true; + return false; +} + void CVehicle::ProcessCarAlarm(void) { @@ -2213,6 +2277,7 @@ CVehicle::HeliDustGenerate(CEntity *heli, float radius, float ground, int rnd) } } +/* #define GLARE_MIN_DIST (13.0f) #define GLARE_FULL_DIST (30.0f) #define GLARE_MIN_ANGLE (0.99f) @@ -2315,6 +2380,7 @@ CVehicle::DoSunGlare(void) } } } +*/ void CVehicle::KillPedsInVehicle(void) @@ -2390,10 +2456,10 @@ CVehicle::Save(uint8*& buf) ZeroSaveBuf(buf, 42); WriteSaveBuf(buf, m_nNumMaxPassengers); ZeroSaveBuf(buf, 3); - WriteSaveBuf(buf, field_1D0[0]); - WriteSaveBuf(buf, field_1D0[1]); - WriteSaveBuf(buf, field_1D0[2]); - WriteSaveBuf(buf, field_1D0[3]); + WriteSaveBuf(buf, m_vehLCS_230.x); + WriteSaveBuf(buf, m_vehLCS_230.y); + WriteSaveBuf(buf, m_vehLCS_230.z); + WriteSaveBuf(buf, m_vehLCS_230.w); ZeroSaveBuf(buf, 8); WriteSaveBuf(buf, m_fSteerAngle); WriteSaveBuf(buf, m_fGasPedal); @@ -2453,10 +2519,10 @@ CVehicle::Load(uint8*& buf) SkipSaveBuf(buf, 42); ReadSaveBuf(&m_nNumMaxPassengers, buf); SkipSaveBuf(buf, 3); - ReadSaveBuf(&field_1D0[0], buf); - ReadSaveBuf(&field_1D0[1], buf); - ReadSaveBuf(&field_1D0[2], buf); - ReadSaveBuf(&field_1D0[3], buf); + ReadSaveBuf(&m_vehLCS_230.x, buf); + ReadSaveBuf(&m_vehLCS_230.y, buf); + ReadSaveBuf(&m_vehLCS_230.z, buf); + ReadSaveBuf(&m_vehLCS_230.w, buf); SkipSaveBuf(buf, 8); ReadSaveBuf(&m_fSteerAngle, buf); ReadSaveBuf(&m_fGasPedal, buf); |