diff options
Diffstat (limited to '')
-rw-r--r-- | src/control/CarAI.cpp | 4 | ||||
-rw-r--r-- | src/control/CarCtrl.cpp | 6 | ||||
-rw-r--r-- | src/control/Script.cpp | 77 | ||||
-rw-r--r-- | src/control/Script.h | 1 | ||||
-rw-r--r-- | src/core/Game.h | 23 | ||||
-rw-r--r-- | src/entities/Entity.cpp | 2 | ||||
-rw-r--r-- | src/entities/Entity.h | 2 |
7 files changed, 111 insertions, 4 deletions
diff --git a/src/control/CarAI.cpp b/src/control/CarAI.cpp index 571a62d2..0330d80d 100644 --- a/src/control/CarAI.cpp +++ b/src/control/CarAI.cpp @@ -146,7 +146,7 @@ void CCarAI::UpdateCarAI(CVehicle* pVehicle) case MISSION_BLOCKPLAYER_CLOSE: if (FindSwitchDistanceFar(pVehicle) >= (FindPlayerCoors() - pVehicle->GetPosition()).Magnitude2D() || pVehicle->AutoPilot.m_bIgnorePathfinding) { - if (FindPlayerVehicle() && FindPlayerVehicle()->GetMoveSpeed().Magnitude() < 0.05f) + if (FindPlayerVehicle() && FindPlayerVehicle()->GetMoveSpeed().Magnitude() < 0.04f) #ifdef FIX_BUGS pVehicle->m_nTimeBlocked += CTimer::GetTimeStepInMilliseconds(); #else @@ -155,7 +155,7 @@ void CCarAI::UpdateCarAI(CVehicle* pVehicle) else pVehicle->m_nTimeBlocked = 0; if (!FindPlayerVehicle() || FindPlayerVehicle()->IsUpsideDown() || - FindPlayerVehicle()->GetMoveSpeed().Magnitude() < 0.05f && pVehicle->m_nTimeBlocked > TIME_COPS_WAIT_TO_EXIT_AFTER_STOPPING) { + FindPlayerVehicle()->GetMoveSpeed().Magnitude() < 0.04f && pVehicle->m_nTimeBlocked > TIME_COPS_WAIT_TO_EXIT_AFTER_STOPPING) { if (pVehicle->bIsLawEnforcer && (pVehicle->GetModelIndex() != MI_RHINO || pVehicle->m_randomSeed > 10000) && (FindPlayerCoors() - pVehicle->GetPosition()).Magnitude2D() < 10.0f) { diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index 6a5d37f3..6eac44df 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -90,14 +90,16 @@ uint32 aCarsToKeepTime[MAX_CARS_TO_KEEP]; void CCarCtrl::GenerateRandomCars() { - if (CCutsceneMgr::IsRunning()) + if (CCutsceneMgr::IsRunning()) { + CountDownToCarsAtStart = 2; return; + } if (NumRandomCars < 30){ if (CountDownToCarsAtStart == 0){ GenerateOneRandomCar(); } else if (--CountDownToCarsAtStart == 0) { - for (int i = 0; i < 50; i++) + for (int i = 0; i < 100; i++) GenerateOneRandomCar(); CTheCarGenerators::GenerateEvenIfPlayerIsCloseCounter = 20; } diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 2bb945d3..750ed026 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -13,6 +13,7 @@ #include "CarGen.h" #include "CivilianPed.h" #include "Clock.h" +#include "ColStore.h" #include "CopPed.h" #include "Coronas.h" #include "Cranes.h" @@ -174,6 +175,31 @@ void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type) { for (int i = 0; i < MAX_CLEANUP; i++){ if (m_sEntities[i].type == type && m_sEntities[i].id == id){ + switch (m_sEntities[i].type) { + case CLEANUP_CAR: + { + CVehicle* v = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id); + if (v) + PossiblyWakeThisEntity(v); + break; + } + case CLEANUP_CHAR: + { + CPed* p = CPools::GetPedPool()->GetAt(m_sEntities[i].id); + if (p) + PossiblyWakeThisEntity(p); + break; + } + case CLEANUP_OBJECT: + { + CObject* o = CPools::GetObjectPool()->GetAt(m_sEntities[i].id); + if (o) + PossiblyWakeThisEntity(o); + break; + } + default: + break; + } m_sEntities[i].id = 0; m_sEntities[i].type = CLEANUP_UNUSED; m_nCount--; @@ -181,6 +207,48 @@ void CMissionCleanup::RemoveEntityFromList(int32 id, uint8 type) } } +static void PossiblyWakeThisEntity(CPhysical* pEntity) +{ + if (!pEntity->m_bIsStaticWaitingForCollision) + return; + if (CColStore::HasCollisionLoaded(pEntity->GetPosition())) { + pEntity->m_bIsStaticWaitingForCollision = false; + if (!pEntity->IsStatic()) + pEntity->AddToMovingList(); + } +} + +void CMissionCleanup::CheckIfCollisionHasLoadedForMissionObject() +{ + for (int i = 0; i < MAX_CLEANUP; i++) { + switch (m_sEntities[i].type) { + case CLEANUP_CAR: + { + CVehicle* v = CPools::GetVehiclePool()->GetAt(m_sEntities[i].id); + if (v) + PossiblyWakeThisEntity(v); + break; + } + case CLEANUP_CHAR: + { + CPed* p = CPools::GetPedPool()->GetAt(m_sEntities[i].id); + if (p) + PossiblyWakeThisEntity(p); + break; + } + case CLEANUP_OBJECT: + { + CObject* o = CPools::GetObjectPool()->GetAt(m_sEntities[i].id); + if (o) + PossiblyWakeThisEntity(o); + break; + } + default: + break; + } + } +} + void CMissionCleanup::Process() { CPopulation::m_AllRandomPedsThisType = -1; @@ -646,6 +714,7 @@ void CTheScripts::Process() float timeStep = CTimer::GetTimeStepInMilliseconds(); UpsideDownCars.UpdateTimers(); StuckCars.Process(); + MissionCleanup.CheckIfCollisionHasLoadedForMissionObject(); DrawScriptSpheres(); if (FailCurrentMission) --FailCurrentMission; @@ -1728,6 +1797,8 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) ped->SetPosition(pos); ped->SetOrientation(0.0f, 0.0f, 0.0f); CTheScripts::ClearSpaceForMissionEntity(pos, ped); + if (m_bIsMissionScript) + ped->m_bIsStaticWaitingForCollision = true; CWorld::Add(ped); ped->m_nZoneLevel = CTheZones::GetLevelFromPosition(pos); CPopulation::ms_nTotalMissionPeds++; @@ -1946,6 +2017,8 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) boat->AutoPilot.m_nCarMission = MISSION_NONE; boat->AutoPilot.m_nTempAction = TEMPACT_NONE; /* Animation ID? */ boat->AutoPilot.m_nCruiseSpeed = boat->AutoPilot.m_fMaxTrafficSpeed = 20.0f; + if (m_bIsMissionScript) + boat->m_bIsStaticWaitingForCollision = true; CWorld::Add(boat); handle = CPools::GetVehiclePool()->GetIndex(boat); } @@ -1970,6 +2043,8 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) car->bEngineOn = false; car->m_nZoneLevel = CTheZones::GetLevelFromPosition(pos); car->bHasBeenOwnedByPlayer = true; + if (m_bIsMissionScript) + car->m_bIsStaticWaitingForCollision = true; CWorld::Add(car); handle = CPools::GetVehiclePool()->GetIndex(car); } @@ -7346,6 +7421,8 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) ped->SetPosition(pos); ped->SetOrientation(0.0f, 0.0f, 0.0f); CTheScripts::ClearSpaceForMissionEntity(pos, ped); + if (m_bIsMissionScript) + ped->m_bIsStaticWaitingForCollision = true; CWorld::Add(ped); ped->m_nZoneLevel = CTheZones::GetLevelFromPosition(pos); CPopulation::ms_nTotalMissionPeds++; diff --git a/src/control/Script.h b/src/control/Script.h index a44fc7c1..85e36cbd 100644 --- a/src/control/Script.h +++ b/src/control/Script.h @@ -131,6 +131,7 @@ public: void AddEntityToList(int32, uint8); void RemoveEntityFromList(int32, uint8); void Process(); + void CheckIfCollisionHasLoadedForMissionObject(); }; struct CUpsideDownCarCheckEntry diff --git a/src/core/Game.h b/src/core/Game.h index eacf5141..2bd468ba 100644 --- a/src/core/Game.h +++ b/src/core/Game.h @@ -8,6 +8,29 @@ enum eLevelName { LEVEL_SUBURBAN }; +enum eVisibilityArea +{ + VIS_MAIN_MAP = 0, + VIS_HOTEL, + VIS_MANSION, + VIS_BANK, + VIS_MALL, + VIS_STRIP_CLUB, + VIS_LAWYERS, + VIS_COFFEE_SHOP, + VIS_CONCERT_HALL, + VIS_STUDIO, + VIS_RIFLE_RANGE, + VIS_BIKER_BAR, + VIS_POLICE_STATION, + VIS_EVERYWHERE, + VIS_DIRT, + VIS_BLOOD, + VIS_OVALRING, + VIS_MALIBU_CLUB, + VIS_PRINT_WORKS, +}; + class CGame { public: diff --git a/src/entities/Entity.cpp b/src/entities/Entity.cpp index 453ee806..830a0574 100644 --- a/src/entities/Entity.cpp +++ b/src/entities/Entity.cpp @@ -74,6 +74,8 @@ CEntity::CEntity(void) bDistanceFade = false; m_flagE2 = false; + m_bIsStaticWaitingForCollision = false; + m_scanCode = 0; m_modelIndex = -1; m_rwObject = nil; diff --git a/src/entities/Entity.h b/src/entities/Entity.h index 0534de27..e821550a 100644 --- a/src/entities/Entity.h +++ b/src/entities/Entity.h @@ -84,6 +84,7 @@ public: // flagsE uint32 m_flagE2 : 1; // TODO(MIAMI) + uint32 m_bIsStaticWaitingForCollision : 1; // this is used by script created entities - they are static until the collision is loaded below them uint16 m_scanCode; uint16 m_randomSeed; @@ -98,6 +99,7 @@ public: eEntityStatus GetStatus() const { return (eEntityStatus)m_status; } void SetStatus(eEntityStatus status) { m_status = status; } CColModel *GetColModel(void) { return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel(); } + bool IsStatic(void) { return bIsStatic && m_bIsStaticWaitingForCollision; } #ifdef COMPATIBLE_SAVES void SaveEntityFlags(uint8*& buf); void LoadEntityFlags(uint8*& buf); |