diff options
Diffstat (limited to '')
-rw-r--r-- | src/vehicles/CarGen.cpp | 58 |
1 files changed, 32 insertions, 26 deletions
diff --git a/src/vehicles/CarGen.cpp b/src/vehicles/CarGen.cpp index 130bf1e9..97955595 100644 --- a/src/vehicles/CarGen.cpp +++ b/src/vehicles/CarGen.cpp @@ -18,6 +18,8 @@ #include "Zones.h" #include "Occlusion.h" +// --MIAMI: file done + uint8 CTheCarGenerators::ProcessCounter; uint32 CTheCarGenerators::NumOfCarGenerators; CCarGenerator CTheCarGenerators::CarGeneratorArray[NUM_CARGENS]; @@ -42,7 +44,6 @@ uint32 CCarGenerator::CalcNextGen() return CTimer::GetTimeInMilliseconds() + 4; } -//TODO(MIAMI): check for more changes - so far only -1 mi is accounted for void CCarGenerator::DoInternalProcessing() { int mi; @@ -53,6 +54,7 @@ void CCarGenerator::DoInternalProcessing() m_nTimer += 4; return; } + CStreaming::RequestModel(m_nModelIndex, STREAMFLAGS_DEPENDENCY); mi = m_nModelIndex; } else { @@ -73,29 +75,25 @@ void CCarGenerator::DoInternalProcessing() return; } } - CStreaming::RequestModel(mi, STREAMFLAGS_DEPENDENCY); if (!CStreaming::HasModelLoaded(mi)) return; CVehicle* pVehicle; + + CVector pos; if (CModelInfo::IsBoatModel(mi)){ CBoat* pBoat = new CBoat(mi, PARKED_VEHICLE); + pos = m_vecPos; pVehicle = pBoat; - pBoat->bIsStatic = false; - pBoat->bEngineOn = false; - CVector pos = m_vecPos; if (pos.z <= -100.0f) pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y); - pos.z += pBoat->GetDistanceFromCentreOfMassToBaseOfModel(); - pBoat->SetPosition(pos); - pBoat->SetOrientation(0.0f, 0.0f, DEGTORAD(m_fAngle)); - pBoat->SetStatus(STATUS_ABANDONED); - pBoat->m_nDoorLock = CARLOCK_UNLOCKED; + pBoat->bExtendedRange = false; }else{ - bool groundFound = false; - CVector pos = m_vecPos; + bool groundFound; + pos = m_vecPos; if (pos.z > -100.0f){ pos.z = CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z, &groundFound); }else{ + groundFound = false; CColPoint cp; CEntity* pEntity; groundFound = CWorld::ProcessVerticalLine(CVector(pos.x, pos.y, 1000.0f), -1000.0f, @@ -107,7 +105,7 @@ void CCarGenerator::DoInternalProcessing() debug("CCarGenerator::DoInternalProcessing - can't find ground z for new car x = %f y = %f \n", m_vecPos.x, m_vecPos.y); return; } - if (CModelInfo::IsBikeModel(mi)) { + if (CModelInfo::GetModelInfo(mi)->GetModelType() == VEHICLE_TYPE_BIKE) { CBike* pBike = new CBike(mi, PARKED_VEHICLE); pBike->bIsStanding = true; pVehicle = pBike; @@ -116,16 +114,16 @@ void CCarGenerator::DoInternalProcessing() CAutomobile* pCar = new CAutomobile(mi, PARKED_VEHICLE); pVehicle = pCar; } - pVehicle->bIsStatic = false; - pVehicle->bEngineOn = false; - pos.z += pVehicle->GetDistanceFromCentreOfMassToBaseOfModel(); - pVehicle->SetPosition(pos); - pVehicle->SetOrientation(0.0f, 0.0f, DEGTORAD(m_fAngle)); - pVehicle->SetStatus(STATUS_ABANDONED); + // pVehicle->GetDistanceFromCentreOfMassToBaseOfModel(); pVehicle->bLightsOn = false; - pVehicle->m_nDoorLock = CARLOCK_UNLOCKED; - } + pVehicle->bIsStatic = false; + pVehicle->bEngineOn = false; + pos.z += pVehicle->GetDistanceFromCentreOfMassToBaseOfModel(); + pVehicle->SetPosition(pos); + pVehicle->SetOrientation(0.0f, 0.0f, DEGTORAD(m_fAngle)); + pVehicle->SetStatus(STATUS_ABANDONED); + pVehicle->m_nDoorLock = CARLOCK_UNLOCKED; CWorld::Add(pVehicle); if (CGeneral::GetRandomNumberInRange(0, 100) < m_nAlarm) pVehicle->m_nAlarmState = -1; @@ -173,6 +171,8 @@ void CCarGenerator::Process() m_nVehicleHandle = -1; m_bIsBlocking = true; pVehicle->bExtendedRange = false; + if (m_nModelIndex < 0) + m_nModelIndex = -1; } void CCarGenerator::Setup(float x, float y, float z, float angle, int32 mi, int16 color1, int16 color2, uint8 force, uint8 alarm, uint8 lock, uint16 min_delay, uint16 max_delay) @@ -217,8 +217,8 @@ bool CCarGenerator::CheckIfWithinRangeOfAnyPlayers() float farclip = 110.0f * TheCamera.GenerationDistMultiplier; float nearclip = farclip - 20.0f; bool canBeRemoved = (m_nModelIndex > 0 && CModelInfo::IsBoatModel(m_nModelIndex) && 165.0f * TheCamera.GenerationDistMultiplier > distance && - TheCamera.IsSphereVisible(m_vecPos, 0.0f) && COcclusion::IsPositionOccluded(m_vecPos, 0.0f)); - if (distance >= farclip || canBeRemoved){ + TheCamera.IsSphereVisible(m_vecPos, 0.0f) && !COcclusion::IsPositionOccluded(m_vecPos, 0.0f)); + if (distance >= farclip && !canBeRemoved){ if (m_bIsBlocking) m_bIsBlocking = false; return false; @@ -227,7 +227,7 @@ bool CCarGenerator::CheckIfWithinRangeOfAnyPlayers() return true; if (m_bIsBlocking) return false; - if (distance < nearclip) + if (distance < nearclip && !m_bForceSpawn) return false; return DotProduct2D(direction, FindPlayerSpeed()) <= 0; } @@ -246,8 +246,9 @@ void CTheCarGenerators::Process() int32 CTheCarGenerators::CreateCarGenerator(float x, float y, float z, float angle, int32 mi, int16 color1, int16 color2, uint8 force, uint8 alarm, uint8 lock, uint16 min_delay, uint16 max_delay) { - CarGeneratorArray[NumOfCarGenerators].Setup(x, y, z, angle, mi, color1, color2, force, alarm, lock, min_delay, max_delay); - return NumOfCarGenerators++; + if (NumOfCarGenerators < NUM_CARGENS) + CarGeneratorArray[NumOfCarGenerators++].Setup(x, y, z, angle, mi, color1, color2, force, alarm, lock, min_delay, max_delay); + return NumOfCarGenerators - 1; } void CTheCarGenerators::Init() @@ -279,6 +280,11 @@ VALIDATESAVEBUF(*size) void CTheCarGenerators::LoadAllCarGenerators(uint8* buffer, uint32 size) { + NumOfCarGenerators = 0; + GenerateEvenIfPlayerIsCloseCounter = 0; + CurrentActiveCount = 0; + ProcessCounter = 0; + const int32 nGeneralDataSize = sizeof(NumOfCarGenerators) + sizeof(CurrentActiveCount) + sizeof(ProcessCounter) + sizeof(GenerateEvenIfPlayerIsCloseCounter) + sizeof(int16); Init(); INITSAVEBUF |