From bb0541404d79e91cde0ffe2dac8506df134e18b7 Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 6 May 2020 09:24:12 +0200 Subject: [PATCH 1/3] updated librw --- librw | 2 +- premake5.lua | 92 ++++++++++++++++++++++++++++++++++++++++++++ src/fakerw/fake.cpp | 3 +- src/fakerw/rwcore.h | 10 ++--- src/render/Lines.cpp | 2 + src/skel/win/win.cpp | 2 - 6 files changed, 101 insertions(+), 10 deletions(-) diff --git a/librw b/librw index b3ad490d..40eae78e 160000 --- a/librw +++ b/librw @@ -1 +1 @@ -Subproject commit b3ad490d1be3c1f41b416d3ceeaff3453bd2d28d +Subproject commit 40eae78e793f234e332aff08265c41683faeb7f7 diff --git a/premake5.lua b/premake5.lua index 1c313a10..cfba8e01 100644 --- a/premake5.lua +++ b/premake5.lua @@ -192,3 +192,95 @@ project "re3" libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") } libdirs { path.join(_OPTIONS["glfwdir"], "lib-" .. string.gsub(_ACTION, "vs", "vc")) } links { "opengl32", "glew32s", "glfw3" } + + +project "reVC" + kind "WindowedApp" + targetname "reVC" + targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" + targetextension ".exe" + characterset ("MBCS") + linkoptions "/SAFESEH:NO" + + defines { "MIAMI" } + + files { "src/*.*" } + files { "src/animation/*.*" } + files { "src/audio/*.*" } + files { "src/control/*.*" } + files { "src/core/*.*" } + files { "src/entities/*.*" } + files { "src/math/*.*" } + files { "src/modelinfo/*.*" } + files { "src/objects/*.*" } + files { "src/peds/*.*" } + files { "src/render/*.*" } + files { "src/rw/*.*" } + files { "src/save/*.*" } + files { "src/skel/*.*" } + files { "src/skel/win/*.*" } + files { "src/skel/glfw/*.*" } + files { "src/text/*.*" } + files { "src/vehicles/*.*" } + files { "src/weapons/*.*" } + files { "src/extras/*.*" } + files { "eax/*.*" } + + includedirs { "src" } + includedirs { "src/animation" } + includedirs { "src/audio" } + includedirs { "src/control" } + includedirs { "src/core" } + includedirs { "src/entities" } + includedirs { "src/math" } + includedirs { "src/modelinfo" } + includedirs { "src/objects" } + includedirs { "src/peds" } + includedirs { "src/render" } + includedirs { "src/rw" } + includedirs { "src/save/" } + includedirs { "src/skel/" } + includedirs { "src/skel/win" } + includedirs { "src/skel/glfw" } + includedirs { "src/text" } + includedirs { "src/vehicles" } + includedirs { "src/weapons" } + includedirs { "src/extras" } + includedirs { "eax" } + + includedirs { "milessdk/include" } + includedirs { "eax" } + + libdirs { "milessdk/lib" } + + setpaths("$(GTA_VC_RE_DIR)/", "$(TargetFileName)", "") + + filter "platforms:*RW33*" + staticruntime "on" + includedirs { "rwsdk/include/d3d8" } + libdirs { "rwsdk/lib/d3d8/release" } + links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtcharse" } + defines { "RWLIBS" } + linkoptions "/SECTION:_rwcseg,ER!W /MERGE:_rwcseg=.text" + + filter "platforms:*librw*" + defines { "LIBRW" } + files { "src/fakerw/*.*" } + includedirs { "src/fakerw" } + includedirs { Librw } + if(_OPTIONS["with-librw"]) then + libdirs { "lib/%{cfg.platform}/%{cfg.buildcfg}" } + end + links { "rw" } + + filter "platforms:*d3d*" + includedirs { "dxsdk/include" } + libdirs { "dxsdk/lib" } + + filter "platforms:*d3d9*" + links { "d3d9" } + + filter "platforms:*gl3_glfw*" + libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") } + libdirs { path.join(_OPTIONS["glfwdir"], "lib-" .. string.gsub(_ACTION, "vs", "vc")) } + links { "opengl32", "glew32s", "glfw3" } diff --git a/src/fakerw/fake.cpp b/src/fakerw/fake.cpp index 76d7865c..e569dea9 100644 --- a/src/fakerw/fake.cpp +++ b/src/fakerw/fake.cpp @@ -429,8 +429,7 @@ void RwIm3DVertexSetU(RwIm3DVertex *vert, RwReal u) { vert->setU(u); } void RwIm3DVertexSetV(RwIm3DVertex *vert, RwReal v) { vert->setV(v); } void RwIm3DVertexSetRGBA(RwIm3DVertex *vert, RwUInt8 r, RwUInt8 g, RwUInt8 b, RwUInt8 a) { vert->setColor(r, g, b, a); } -// WARNING: ignoring flags -void *RwIm3DTransform(RwIm3DVertex *pVerts, RwUInt32 numVerts, RwMatrix *ltm, RwUInt32 flags) { im3d::Transform(pVerts, numVerts, ltm); return pVerts; } +void *RwIm3DTransform(RwIm3DVertex *pVerts, RwUInt32 numVerts, RwMatrix *ltm, RwUInt32 flags) { im3d::Transform(pVerts, numVerts, ltm, flags); return pVerts; } RwBool RwIm3DEnd(void) { im3d::End(); return true; } RwBool RwIm3DRenderLine(RwInt32 vert1, RwInt32 vert2) { RwImVertexIndex indices[2]; diff --git a/src/fakerw/rwcore.h b/src/fakerw/rwcore.h index 22e29737..31bc5541 100644 --- a/src/fakerw/rwcore.h +++ b/src/fakerw/rwcore.h @@ -20,11 +20,11 @@ typedef RwUInt16 RwImVertexIndex; enum RwIm3DTransformFlags { - rwIM3D_VERTEXUV = 1, - rwIM3D_ALLOPAQUE = 2, - rwIM3D_NOCLIP = 4, - rwIM3D_VERTEXXYZ = 8, - rwIM3D_VERTEXRGBA = 16, + rwIM3D_VERTEXUV = rw::im3d::VERTEXUV, + rwIM3D_ALLOPAQUE = rw::im3d::ALLOPAQUE, + rwIM3D_NOCLIP = rw::im3d::NOCLIP, + rwIM3D_VERTEXXYZ = rw::im3d::VERTEXXYZ, + rwIM3D_VERTEXRGBA = rw::im3d::VERTEXRGBA, }; void RwIm2DVertexSetCameraX(RwIm2DVertex *vert, RwReal camx); diff --git a/src/render/Lines.cpp b/src/render/Lines.cpp index b5c85149..84d3683b 100644 --- a/src/render/Lines.cpp +++ b/src/render/Lines.cpp @@ -60,6 +60,8 @@ CLines::RenderLineWithClipping(float x1, float y1, float z1, float x2, float y2, col2.green = c2>>16; col2.blue = c2>>8; col2.alpha = c2; +// HACK HACK until i got im3d fixed +RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil); RwIm3DVertexSetRGBA(&v[0], col1.red, col1.green, col1.blue, col1.alpha); RwIm3DVertexSetRGBA(&v[1], col2.red, col2.green, col2.blue, col2.alpha); diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp index d20cc0bf..ec72bf7e 100644 --- a/src/skel/win/win.cpp +++ b/src/skel/win/win.cpp @@ -1884,13 +1884,11 @@ WinMain(HINSTANCE instance, StaticPatcher::Apply(); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE); -/* // TODO: make this an option somewhere AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); -*/ /* * Initialize the platform independent data. From edd9301d7f6ae01725cfc1331d018e7b65565657 Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 6 May 2020 09:59:04 +0200 Subject: [PATCH 2/3] reverting fuckup --- librw | 2 +- premake5.lua | 92 -------------------------------------------- src/render/Lines.cpp | 2 - src/skel/win/win.cpp | 2 + 4 files changed, 3 insertions(+), 95 deletions(-) diff --git a/librw b/librw index 40eae78e..bdbc92d8 160000 --- a/librw +++ b/librw @@ -1 +1 @@ -Subproject commit 40eae78e793f234e332aff08265c41683faeb7f7 +Subproject commit bdbc92d86eef28344e01c992d55a9c4f43629f84 diff --git a/premake5.lua b/premake5.lua index f8e3af81..fbd2e011 100644 --- a/premake5.lua +++ b/premake5.lua @@ -198,95 +198,3 @@ project "re3" libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") } libdirs { path.join(_OPTIONS["glfwdir"], "lib-" .. string.gsub(_ACTION, "vs", "vc")) } links { "opengl32", "glew32s", "glfw3" } - - -project "reVC" - kind "WindowedApp" - targetname "reVC" - targetdir "bin/%{cfg.platform}/%{cfg.buildcfg}" - targetextension ".exe" - characterset ("MBCS") - linkoptions "/SAFESEH:NO" - - defines { "MIAMI" } - - files { "src/*.*" } - files { "src/animation/*.*" } - files { "src/audio/*.*" } - files { "src/control/*.*" } - files { "src/core/*.*" } - files { "src/entities/*.*" } - files { "src/math/*.*" } - files { "src/modelinfo/*.*" } - files { "src/objects/*.*" } - files { "src/peds/*.*" } - files { "src/render/*.*" } - files { "src/rw/*.*" } - files { "src/save/*.*" } - files { "src/skel/*.*" } - files { "src/skel/win/*.*" } - files { "src/skel/glfw/*.*" } - files { "src/text/*.*" } - files { "src/vehicles/*.*" } - files { "src/weapons/*.*" } - files { "src/extras/*.*" } - files { "eax/*.*" } - - includedirs { "src" } - includedirs { "src/animation" } - includedirs { "src/audio" } - includedirs { "src/control" } - includedirs { "src/core" } - includedirs { "src/entities" } - includedirs { "src/math" } - includedirs { "src/modelinfo" } - includedirs { "src/objects" } - includedirs { "src/peds" } - includedirs { "src/render" } - includedirs { "src/rw" } - includedirs { "src/save/" } - includedirs { "src/skel/" } - includedirs { "src/skel/win" } - includedirs { "src/skel/glfw" } - includedirs { "src/text" } - includedirs { "src/vehicles" } - includedirs { "src/weapons" } - includedirs { "src/extras" } - includedirs { "eax" } - - includedirs { "milessdk/include" } - includedirs { "eax" } - - libdirs { "milessdk/lib" } - - setpaths("$(GTA_VC_RE_DIR)/", "$(TargetFileName)", "") - - filter "platforms:*RW33*" - staticruntime "on" - includedirs { "rwsdk/include/d3d8" } - libdirs { "rwsdk/lib/d3d8/release" } - links { "rwcore", "rpworld", "rpmatfx", "rpskin", "rphanim", "rtbmp", "rtquat", "rtcharse" } - defines { "RWLIBS" } - linkoptions "/SECTION:_rwcseg,ER!W /MERGE:_rwcseg=.text" - - filter "platforms:*librw*" - defines { "LIBRW" } - files { "src/fakerw/*.*" } - includedirs { "src/fakerw" } - includedirs { Librw } - if(_OPTIONS["with-librw"]) then - libdirs { "lib/%{cfg.platform}/%{cfg.buildcfg}" } - end - links { "rw" } - - filter "platforms:*d3d*" - includedirs { "dxsdk/include" } - libdirs { "dxsdk/lib" } - - filter "platforms:*d3d9*" - links { "d3d9" } - - filter "platforms:*gl3_glfw*" - libdirs { path.join(_OPTIONS["glewdir"], "lib/Release/Win32") } - libdirs { path.join(_OPTIONS["glfwdir"], "lib-" .. string.gsub(_ACTION, "vs", "vc")) } - links { "opengl32", "glew32s", "glfw3" } diff --git a/src/render/Lines.cpp b/src/render/Lines.cpp index 84d3683b..b5c85149 100644 --- a/src/render/Lines.cpp +++ b/src/render/Lines.cpp @@ -60,8 +60,6 @@ CLines::RenderLineWithClipping(float x1, float y1, float z1, float x2, float y2, col2.green = c2>>16; col2.blue = c2>>8; col2.alpha = c2; -// HACK HACK until i got im3d fixed -RwRenderStateSet(rwRENDERSTATETEXTURERASTER, nil); RwIm3DVertexSetRGBA(&v[0], col1.red, col1.green, col1.blue, col1.alpha); RwIm3DVertexSetRGBA(&v[1], col2.red, col2.green, col2.blue, col2.alpha); diff --git a/src/skel/win/win.cpp b/src/skel/win/win.cpp index ec72bf7e..d20cc0bf 100644 --- a/src/skel/win/win.cpp +++ b/src/skel/win/win.cpp @@ -1884,11 +1884,13 @@ WinMain(HINSTANCE instance, StaticPatcher::Apply(); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE); +/* // TODO: make this an option somewhere AllocConsole(); freopen("CONIN$", "r", stdin); freopen("CONOUT$", "w", stdout); freopen("CONOUT$", "w", stderr); +*/ /* * Initialize the platform independent data. From cbfc45b3f72468e7880bec852773955d3886b5ff Mon Sep 17 00:00:00 2001 From: aap Date: Wed, 6 May 2020 12:23:26 +0200 Subject: [PATCH 3/3] some work on zones --- src/audio/PoliceRadio.cpp | 4 +- src/control/Replay.cpp | 4 +- src/control/Script.cpp | 30 ++++++------ src/core/FileLoader.cpp | 4 +- src/core/Streaming.cpp | 2 +- src/core/User.cpp | 12 ++--- src/core/ZoneCull.cpp | 2 +- src/core/Zones.cpp | 99 ++++++++++++++++++++------------------- src/core/Zones.h | 15 +++--- src/entities/Entity.cpp | 2 +- src/peds/Population.cpp | 2 +- 11 files changed, 90 insertions(+), 86 deletions(-) diff --git a/src/audio/PoliceRadio.cpp b/src/audio/PoliceRadio.cpp index 5470a1af..ec02368e 100644 --- a/src/audio/PoliceRadio.cpp +++ b/src/audio/PoliceRadio.cpp @@ -306,7 +306,7 @@ cAudioManager::SetupCrimeReport() if (i == ARRAY_SIZE(m_sPoliceRadioQueue.crimes)) return false; audioZoneId = CTheZones::FindAudioZone(&m_sPoliceRadioQueue.crimes[i].position); if (audioZoneId >= 0 && audioZoneId < NUMAUDIOZONES) { - zone = &CTheZones::ZoneArray[CTheZones::AudioZoneArray[audioZoneId]]; + zone = CTheZones::GetAudioZone(audioZoneId); for (int j = 0; j < NUMAUDIOZONES; j++) { if (strcmp(zone->name, ZoneSfx[j].m_aName) == 0) { sampleIndex = ZoneSfx[j].m_nSampleIndex; @@ -722,7 +722,7 @@ cAudioManager::PlaySuspectLastSeen(float x, float y, float z) if (MusicManager.m_nMusicMode != MUSICMODE_CUTSCENE && 60 - m_sPoliceRadioQueue.policeChannelTimer > 9) { audioZone = CTheZones::FindAudioZone(&vec); if (audioZone >= 0 && audioZone < NUMAUDIOZONES) { - zone = &CTheZones::ZoneArray[CTheZones::AudioZoneArray[audioZone]]; + zone = CTheZones::GetAudioZone(audioZone); for (int i = 0; i < NUMAUDIOZONES; i++) { if (strcmp(zone->name, ZoneSfx[i].m_aName) == 0) { sample = ZoneSfx[i].m_nSampleIndex; diff --git a/src/control/Replay.cpp b/src/control/Replay.cpp index fd5448cc..707f1d87 100644 --- a/src/control/Replay.cpp +++ b/src/control/Replay.cpp @@ -987,7 +987,7 @@ void CReplay::FinishPlayback(void) Mode = MODE_RECORD; if (bDoLoadSceneWhenDone){ CVector v_ls(LoadSceneX, LoadSceneY, LoadSceneZ); - CGame::currLevel = CTheZones::GetLevelFromPosition(v_ls); + CGame::currLevel = CTheZones::GetLevelFromPosition(&v_ls); CCollision::SortOutCollisionAfterLoad(); CStreaming::LoadScene(v_ls); } @@ -1101,7 +1101,7 @@ void CReplay::TriggerPlayback(uint8 cam_mode, float cam_x, float cam_y, float ca LoadSceneZ = TheCamera.GetPosition().z; CVector ff_coord; FindFirstFocusCoordinate(&ff_coord); - CGame::currLevel = CTheZones::GetLevelFromPosition(ff_coord); + CGame::currLevel = CTheZones::GetLevelFromPosition(&ff_coord); CCollision::SortOutCollisionAfterLoad(); CStreaming::LoadScene(ff_coord); } diff --git a/src/control/Script.cpp b/src/control/Script.cpp index 2bb945d3..a274c289 100644 --- a/src/control/Script.cpp +++ b/src/control/Script.cpp @@ -1729,7 +1729,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) ped->SetOrientation(0.0f, 0.0f, 0.0f); CTheScripts::ClearSpaceForMissionEntity(pos, ped); CWorld::Add(ped); - ped->m_nZoneLevel = CTheZones::GetLevelFromPosition(pos); + ped->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); CPopulation::ms_nTotalMissionPeds++; ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped); StoreParameters(&m_nIp, 1); @@ -1968,7 +1968,7 @@ int8 CRunningScript::ProcessCommands100To199(int32 command) car->AutoPilot.m_nCruiseSpeed = car->AutoPilot.m_fMaxTrafficSpeed = 9.0f; car->AutoPilot.m_nCurrentLane = car->AutoPilot.m_nNextLane = 0; car->bEngineOn = false; - car->m_nZoneLevel = CTheZones::GetLevelFromPosition(pos); + car->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); car->bHasBeenOwnedByPlayer = true; CWorld::Add(car); handle = CPools::GetVehiclePool()->GetIndex(car); @@ -2674,7 +2674,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) m_nIp += KEY_LENGTH_IN_SCRIPT; /* why only if zone != 1? */ CVector pos = pPlayer->GetPos(); CZone* pZone = CTheZones::GetZone(zoneToCheck); - UpdateCompareFlag(CTheZones::PointLiesWithinZone(pos, pZone)); + UpdateCompareFlag(CTheZones::PointLiesWithinZone(&pos, pZone)); return 0; } case COMMAND_IS_PLAYER_PRESSING_HORN: @@ -2773,7 +2773,7 @@ int8 CRunningScript::ProcessCommands200To299(int32 command) #endif pPed->m_pVehicleAnim = CAnimManager::BlendAnimation(pPed->GetClump(), ASSOCGRP_STD, anim, 100.0f); pPed->StopNonPartialAnims(); - pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(pPed->GetPosition()); + pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); CWorld::Add(pPed); ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); StoreParameters(&m_nIp, 1); @@ -3026,7 +3026,7 @@ int8 CRunningScript::ProcessCommands300To399(int32 command) if (zone != -1) m_nIp += KEY_LENGTH_IN_SCRIPT; CVector pos = pPed->bInVehicle ? pPed->m_pMyVehicle->GetPosition() : pPed->GetPosition(); - UpdateCompareFlag(CTheZones::PointLiesWithinZone(pos, CTheZones::GetZone(zone))); + UpdateCompareFlag(CTheZones::PointLiesWithinZone(&pos, CTheZones::GetZone(zone))); return 0; } case COMMAND_SET_CAR_DENSITY: @@ -3964,7 +3964,7 @@ int8 CRunningScript::ProcessCommands400To499(int32 command) #endif pPed->m_pVehicleAnim = CAnimManager::BlendAnimation(pPed->GetClump(), ASSOCGRP_STD, anim, 100.0f); pPed->StopNonPartialAnims(); - pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(pPed->GetPosition()); + pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); CWorld::Add(pPed); ScriptParams[0] = CPools::GetPedPool()->GetIndex(pPed); StoreParameters(&m_nIp, 1); @@ -5880,7 +5880,7 @@ int8 CRunningScript::ProcessCommands700To799(int32 command) continue; if (pPed->bIsLeader || pPed->m_leader) continue; - if (!CTheZones::PointLiesWithinZone(pPed->GetPosition(), pZone)) + if (!CTheZones::PointLiesWithinZone(&pPed->GetPosition(), pZone)) continue; if (pos.z - PED_FIND_Z_OFFSET > pPed->GetPosition().z) continue; @@ -6536,7 +6536,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) continue; if (pVehicle->VehicleCreatedBy != RANDOM_VEHICLE) continue; - if (!CTheZones::PointLiesWithinZone(pVehicle->GetPosition(), pZone)) + if (!CTheZones::PointLiesWithinZone(&pVehicle->GetPosition(), pZone)) continue; handle = CPools::GetVehiclePool()->GetIndex(pVehicle); pVehicle->VehicleCreatedBy = MISSION_VEHICLE; @@ -7347,7 +7347,7 @@ int8 CRunningScript::ProcessCommands800To899(int32 command) ped->SetOrientation(0.0f, 0.0f, 0.0f); CTheScripts::ClearSpaceForMissionEntity(pos, ped); CWorld::Add(ped); - ped->m_nZoneLevel = CTheZones::GetLevelFromPosition(pos); + ped->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); CPopulation::ms_nTotalMissionPeds++; ScriptParams[0] = CPools::GetPedPool()->GetIndex(ped); StoreParameters(&m_nIp, 1); @@ -8178,7 +8178,7 @@ int8 CRunningScript::ProcessCommands900To999(int32 command) car->AutoPilot.m_nCruiseSpeed = car->AutoPilot.m_fMaxTrafficSpeed = 9.0f; car->AutoPilot.m_nCurrentLane = car->AutoPilot.m_nNextLane = 0; car->bEngineOn = false; - car->m_nZoneLevel = CTheZones::GetLevelFromPosition(pos); + car->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pos); CWorld::Add(car); return 0; } @@ -8504,7 +8504,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) CVehicle* pVehicle = CPools::GetVehiclePool()->GetAt(ScriptParams[0]); assert(pVehicle); if (ScriptParams[1]) - pVehicle->m_nZoneLevel = CTheZones::GetLevelFromPosition(pVehicle->GetPosition()); + pVehicle->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pVehicle->GetPosition()); else pVehicle->m_nZoneLevel = LEVEL_NONE; return 0; @@ -8515,7 +8515,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) CPed* pPed = CPools::GetPedPool()->GetAt(ScriptParams[0]); assert(pPed); if (ScriptParams[1]) - pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(pPed->GetPosition()); + pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); else pPed->m_nZoneLevel = LEVEL_NONE; return 0; @@ -8920,7 +8920,7 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command) if (ScriptParams[1]) pPed->m_nZoneLevel = LEVEL_IGNORE; else - pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(pPed->GetPosition()); + pPed->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pPed->GetPosition()); return 0; } case COMMAND_GET_CHASE_CAR: @@ -9119,7 +9119,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) if (ScriptParams[1]) pVehicle->m_nZoneLevel = LEVEL_IGNORE; else - pVehicle->m_nZoneLevel = CTheZones::GetLevelFromPosition(pVehicle->GetPosition()); + pVehicle->m_nZoneLevel = CTheZones::GetLevelFromPosition(&pVehicle->GetPosition()); return 0; } case COMMAND_MAKE_CRAIGS_CAR_A_BIT_STRONGER: @@ -9465,7 +9465,7 @@ int8 CRunningScript::ProcessCommands1100To1199(int32 command) continue; if (pPed->bIsLeader || pPed->m_leader) continue; - if (!CTheZones::PointLiesWithinZone(pPed->GetPosition(), pZone)) + if (!CTheZones::PointLiesWithinZone(&pPed->GetPosition(), pZone)) continue; if (pos.z - PED_FIND_Z_OFFSET > pPed->GetPosition().z) continue; diff --git a/src/core/FileLoader.cpp b/src/core/FileLoader.cpp index a2654369..25c43778 100644 --- a/src/core/FileLoader.cpp +++ b/src/core/FileLoader.cpp @@ -1088,7 +1088,7 @@ CFileLoader::LoadObjectInstance(const char *line) entity = new CBuilding; entity->SetModelIndexNoCreate(id); entity->GetMatrix() = CMatrix(xform); - entity->m_level = CTheZones::GetLevelFromPosition(entity->GetPosition()); + entity->m_level = CTheZones::GetLevelFromPosition(&entity->GetPosition()); if(mi->IsSimple()){ if(mi->m_isBigBuilding) entity->SetupBigBuilding(); @@ -1105,7 +1105,7 @@ CFileLoader::LoadObjectInstance(const char *line) CWorld::Add(entity); if(IsGlass(entity->GetModelIndex())) entity->bIsVisible = false; - entity->m_level = CTheZones::GetLevelFromPosition(entity->GetPosition()); + entity->m_level = CTheZones::GetLevelFromPosition(&entity->GetPosition()); } RwMatrixDestroy(xform); diff --git a/src/core/Streaming.cpp b/src/core/Streaming.cpp index da9e7d33..dab8bafb 100644 --- a/src/core/Streaming.cpp +++ b/src/core/Streaming.cpp @@ -2422,7 +2422,7 @@ CStreaming::LoadScene(const CVector &pos) CStreamingInfo *si, *prev; eLevelName level; - level = CTheZones::GetLevelFromPosition(pos); + level = CTheZones::GetLevelFromPosition(&pos); debug("Start load scene\n"); for(si = ms_endRequestedList.m_prev; si != &ms_startRequestedList; si = prev){ prev = si->m_prev; diff --git a/src/core/User.cpp b/src/core/User.cpp index 50eb7d9d..f906ae44 100644 --- a/src/core/User.cpp +++ b/src/core/User.cpp @@ -32,15 +32,15 @@ void CPlaceName::Process() { CVector pos = CWorld::Players[CWorld::PlayerInFocus].GetPos(); - CZone *navigZone = CTheZones::FindSmallestZonePositionType(&pos, ZONE_TYPE1); - CZone *audioZone = CTheZones::FindSmallestZonePositionType(&pos, ZONE_AUDIO); + CZone *navigZone = CTheZones::FindSmallestZonePositionType(&pos, ZONE_NAVIG); + CZone *defaultZone = CTheZones::FindSmallestZonePositionType(&pos, ZONE_DEFAULT); if (navigZone == nil) m_pZone = nil; - if (audioZone == nil) m_pZone2 = nil; + if (defaultZone == nil) m_pZone2 = nil; if (navigZone == m_pZone) { - if (audioZone == m_pZone2 || m_pZone != nil) { - if (navigZone != nil || audioZone != nil) { + if (defaultZone == m_pZone2 || m_pZone != nil) { + if (navigZone != nil || defaultZone != nil) { if (m_nAdditionalTimer != 0) m_nAdditionalTimer--; } else { @@ -49,7 +49,7 @@ CPlaceName::Process() m_pZone2 = nil; } } else { - m_pZone2 = audioZone; + m_pZone2 = defaultZone; m_nAdditionalTimer = 250; } } else { diff --git a/src/core/ZoneCull.cpp b/src/core/ZoneCull.cpp index 780c180e..6dcd0f18 100644 --- a/src/core/ZoneCull.cpp +++ b/src/core/ZoneCull.cpp @@ -533,7 +533,7 @@ CCullZone::IsEntityCloseEnoughToZone(CEntity *entity, bool checkLevel) if (lodDist > distToZone) return true; if (!checkLevel) return false; - return CTheZones::GetLevelFromPosition(pos) == CTheZones::GetLevelFromPosition(CVector(minx, miny, minz)); + return CTheZones::GetLevelFromPosition(&pos) == CTheZones::GetLevelFromPosition(&CVector(minx, miny, minz)); } bool diff --git a/src/core/Zones.cpp b/src/core/Zones.cpp index 804708b4..22c0735a 100644 --- a/src/core/Zones.cpp +++ b/src/core/Zones.cpp @@ -23,6 +23,8 @@ CZoneInfo CTheZones::ZoneInfoArray[2*NUMZONES]; #define SWAPF(a, b) { float t; t = a; a = b; b = t; } +inline bool IsNormalZone(int type) { return type == ZONE_DEFAULT || type == ZONE_NAVIG || type == ZONE_INFO; } + static void CheckZoneInfo(CZoneInfo *info) { @@ -58,6 +60,9 @@ CTheZones::Init(void) AudioZoneArray[i] = -1; NumberOfAudioZones = 0; + for(i = 0; i < NUMZONES; i++) + memset(&ZoneArray[i], 0, sizeof(CZone)); + CZoneInfo *zonei; int x = 1000/6; for(i = 0; i < 2*NUMZONES; i++){ @@ -81,10 +86,13 @@ CTheZones::Init(void) zonei->gangThreshold[8] = zonei->gangThreshold[7]; CheckZoneInfo(zonei); } - TotalNumberOfZoneInfos = 1; // why 1? - for(i = 0; i < NUMZONES; i++) - memset(&ZoneArray[i], 0, sizeof(CZone)); + TotalNumberOfZoneInfos = 1; // why 1? + TotalNumberOfZones = 1; + + m_CurrLevel = LEVEL_NONE; + m_pPlayersZone = &ZoneArray[0]; + strcpy(ZoneArray[0].name, "CITYZON"); ZoneArray[0].minx = -4000.0f; ZoneArray[0].miny = -4000.0f; @@ -93,15 +101,14 @@ CTheZones::Init(void) ZoneArray[0].maxy = 4000.0f; ZoneArray[0].maxz = 500.0f; ZoneArray[0].level = LEVEL_NONE; - TotalNumberOfZones = 1; - - m_CurrLevel = LEVEL_NONE; - m_pPlayersZone = &ZoneArray[0]; for(i = 0; i < NUMMAPZONES; i++){ memset(&MapZoneArray[i], 0, sizeof(CZone)); MapZoneArray[i].type = ZONE_MAPZONE; } + + TotalNumberOfMapZones = 1; + strcpy(MapZoneArray[0].name, "THEMAP"); MapZoneArray[0].minx = -4000.0f; MapZoneArray[0].miny = -4000.0f; @@ -110,7 +117,6 @@ CTheZones::Init(void) MapZoneArray[0].maxy = 4000.0f; MapZoneArray[0].maxz = 500.0f; MapZoneArray[0].level = LEVEL_NONE; - TotalNumberOfMapZones = 1; } void @@ -119,7 +125,7 @@ CTheZones::Update(void) CVector pos; pos = FindPlayerCoors(); m_pPlayersZone = FindSmallestZonePosition(&pos); - m_CurrLevel = GetLevelFromPosition(pos); + m_CurrLevel = GetLevelFromPosition(&pos); } void @@ -128,8 +134,8 @@ CTheZones::CreateZone(char *name, eZoneType type, float maxx, float maxy, float maxz, eLevelName level) { - CZone *zone; char *p; + char tmpname[8]; if(minx > maxx) SWAPF(minx, maxx); if(miny > maxy) SWAPF(miny, maxy); @@ -139,21 +145,22 @@ CTheZones::CreateZone(char *name, eZoneType type, for(p = name; *p; p++) if(islower(*p)) *p = toupper(*p); // add zone - zone = &ZoneArray[TotalNumberOfZones++]; - strncpy(zone->name, name, 7); - zone->name[7] = '\0'; - zone->type = type; - zone->minx = minx; - zone->miny = miny; - zone->minz = minz; - zone->maxx = maxx; - zone->maxy = maxy; - zone->maxz = maxz; - zone->level = level; - if(type == ZONE_AUDIO || type == ZONE_TYPE1 || type == ZONE_TYPE2){ - zone->zoneinfoDay = TotalNumberOfZoneInfos++; - zone->zoneinfoNight = TotalNumberOfZoneInfos++; + strncpy(tmpname, name, 7); + tmpname[7] = '\0'; + strcpy(ZoneArray[TotalNumberOfZones].name, tmpname); + ZoneArray[TotalNumberOfZones].type = type; + ZoneArray[TotalNumberOfZones].minx = minx; + ZoneArray[TotalNumberOfZones].miny = miny; + ZoneArray[TotalNumberOfZones].minz = minz; + ZoneArray[TotalNumberOfZones].maxx = maxx; + ZoneArray[TotalNumberOfZones].maxy = maxy; + ZoneArray[TotalNumberOfZones].maxz = maxz; + ZoneArray[TotalNumberOfZones].level = level; + if(IsNormalZone(type)){ + ZoneArray[TotalNumberOfZones].zoneinfoDay = TotalNumberOfZoneInfos++; + ZoneArray[TotalNumberOfZones].zoneinfoNight = TotalNumberOfZoneInfos++; } + TotalNumberOfZones++; } void @@ -259,11 +266,11 @@ CTheZones::ZoneIsEntirelyContainedWithinOtherZone(CZone *inner, CZone *outer) inner->minz < outer->minz || inner->maxz > outer->maxz){ CVector vmin(inner->minx, inner->miny, inner->minz); - if(PointLiesWithinZone(vmin, outer)) + if(PointLiesWithinZone(&vmin, outer)) sprintf(tmp, "Overlapping zones %s and %s\n", inner->name, outer->name); CVector vmax(inner->maxx, inner->maxy, inner->maxz); - if(PointLiesWithinZone(vmax, outer)) + if(PointLiesWithinZone(&vmax, outer)) sprintf(tmp, "Overlapping zones %s and %s\n", inner->name, outer->name); return false; @@ -272,15 +279,15 @@ CTheZones::ZoneIsEntirelyContainedWithinOtherZone(CZone *inner, CZone *outer) } bool -CTheZones::PointLiesWithinZone(const CVector &v, CZone *zone) +CTheZones::PointLiesWithinZone(const CVector *v, CZone *zone) { - return zone->minx <= v.x && v.x <= zone->maxx && - zone->miny <= v.y && v.y <= zone->maxy && - zone->minz <= v.z && v.z <= zone->maxz; + return zone->minx <= v->x && v->x <= zone->maxx && + zone->miny <= v->y && v->y <= zone->maxy && + zone->minz <= v->z && v->z <= zone->maxz; } eLevelName -CTheZones::GetLevelFromPosition(CVector const &v) +CTheZones::GetLevelFromPosition(CVector const *v) { int i; // char tmp[116]; @@ -300,7 +307,7 @@ CTheZones::FindSmallestZonePosition(const CVector *v) CZone *zone = ZoneArray[0].child; while(zone) // if in zone, descent into children - if(PointLiesWithinZone(*v, zone)){ + if(PointLiesWithinZone(v, zone)){ best = zone; zone = zone->child; // otherwise try next zone @@ -319,7 +326,7 @@ CTheZones::FindSmallestZonePositionType(const CVector *v, eZoneType type) CZone *zone = ZoneArray[0].child; while(zone) // if in zone, descent into children - if(PointLiesWithinZone(*v, zone)){ + if(PointLiesWithinZone(v, zone)){ if(zone->type == type) best = zone; zone = zone->child; @@ -333,18 +340,14 @@ CZone* CTheZones::FindSmallestZonePositionILN(const CVector *v) { CZone *best = nil; - if(ZoneArray[0].type == ZONE_AUDIO || - ZoneArray[0].type == ZONE_TYPE1 || - ZoneArray[0].type == ZONE_TYPE2) + if(IsNormalZone(ZoneArray[0].type)) best = &ZoneArray[0]; // zone to test next CZone *zone = ZoneArray[0].child; while(zone) // if in zone, descent into children - if(PointLiesWithinZone(*v, zone)){ - if(zone->type == ZONE_AUDIO || - zone->type == ZONE_TYPE1 || - zone->type == ZONE_TYPE2) + if(PointLiesWithinZone(v, zone)){ + if(IsNormalZone(zone->type)) best = zone; zone = zone->child; // otherwise try next zone @@ -532,7 +535,7 @@ CTheZones::SetCarDensity(uint16 zoneid, uint8 day, uint16 cardensity) { CZone *zone; zone = GetZone(zoneid); - if(zone->type == ZONE_AUDIO || zone->type == ZONE_TYPE1 || zone->type == ZONE_TYPE2) + if(IsNormalZone(zone->type)) ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight].carDensity = cardensity; } @@ -541,7 +544,7 @@ CTheZones::SetPedDensity(uint16 zoneid, uint8 day, uint16 peddensity) { CZone *zone; zone = GetZone(zoneid); - if(zone->type == ZONE_AUDIO || zone->type == ZONE_TYPE1 || zone->type == ZONE_TYPE2) + if(IsNormalZone(zone->type)) ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight].pedDensity = peddensity; } @@ -550,7 +553,7 @@ CTheZones::SetPedGroup(uint16 zoneid, uint8 day, uint16 pedgroup) { CZone *zone; zone = GetZone(zoneid); - if(zone->type == ZONE_AUDIO || zone->type == ZONE_TYPE1 || zone->type == ZONE_TYPE2) + if(IsNormalZone(zone->type)) ZoneInfoArray[day ? zone->zoneinfoDay : zone->zoneinfoNight].pedGroup = pedgroup; } @@ -560,7 +563,7 @@ CTheZones::FindAudioZone(CVector *pos) int i; for(i = 0; i < NumberOfAudioZones; i++) - if(PointLiesWithinZone(*pos, GetZone(AudioZoneArray[i]))) + if(PointLiesWithinZone(pos, GetAudioZone(i))) return i; return -1; } @@ -568,11 +571,11 @@ CTheZones::FindAudioZone(CVector *pos) eLevelName CTheZones::FindZoneForPoint(const CVector &pos) { - if(PointLiesWithinZone(pos, GetZone(FindZoneByLabelAndReturnIndex("IND_ZON")))) + if(PointLiesWithinZone(&pos, GetZone(FindZoneByLabelAndReturnIndex("IND_ZON")))) return LEVEL_INDUSTRIAL; - if(PointLiesWithinZone(pos, GetZone(FindZoneByLabelAndReturnIndex("COM_ZON")))) + if(PointLiesWithinZone(&pos, GetZone(FindZoneByLabelAndReturnIndex("COM_ZON")))) return LEVEL_COMMERCIAL; - if(PointLiesWithinZone(pos, GetZone(FindZoneByLabelAndReturnIndex("SUB_ZON")))) + if(PointLiesWithinZone(&pos, GetZone(FindZoneByLabelAndReturnIndex("SUB_ZON")))) return LEVEL_SUBURBAN; return LEVEL_NONE; } @@ -582,7 +585,7 @@ CTheZones::AddZoneToAudioZoneArray(CZone *zone) { int i, z; - if(zone->type != ZONE_AUDIO) + if(zone->type != ZONE_DEFAULT) return; /* This is a bit stupid */ diff --git a/src/core/Zones.h b/src/core/Zones.h index bb1585dc..67800569 100644 --- a/src/core/Zones.h +++ b/src/core/Zones.h @@ -5,9 +5,9 @@ enum eZoneType { - ZONE_AUDIO, - ZONE_TYPE1, // this should be NAVIG - ZONE_TYPE2, // this should be INFO...but all except MAPINFO get zoneinfo?? + ZONE_DEFAULT, + ZONE_NAVIG, + ZONE_INFO, ZONE_MAPZONE, }; @@ -51,8 +51,6 @@ public: class CTheZones { -public: - static eLevelName m_CurrLevel; static CZone *m_pPlayersZone; static int16 FindIndex; @@ -64,6 +62,8 @@ public: static CZone MapZoneArray[NUMMAPZONES]; static uint16 TotalNumberOfZoneInfos; static CZoneInfo ZoneInfoArray[2*NUMZONES]; +public: + static eLevelName m_CurrLevel; static void Init(void); static void Update(void); @@ -76,12 +76,13 @@ public: float maxx, float maxy, float maxz, eLevelName level); static CZone *GetZone(uint16 i) { return &ZoneArray[i]; } + static CZone *GetAudioZone(uint16 i) { return &ZoneArray[AudioZoneArray[i]]; } static void PostZoneCreation(void); static void InsertZoneIntoZoneHierarchy(CZone *zone); static bool InsertZoneIntoZoneHierRecursive(CZone *z1, CZone *z2); static bool ZoneIsEntirelyContainedWithinOtherZone(CZone *z1, CZone *z2); - static bool PointLiesWithinZone(const CVector &v, CZone *zone); - static eLevelName GetLevelFromPosition(CVector const &v); + static bool PointLiesWithinZone(const CVector *v, CZone *zone); + static eLevelName GetLevelFromPosition(const CVector *v); static CZone *FindSmallestZonePosition(const CVector *v); static CZone *FindSmallestZonePositionType(const CVector *v, eZoneType type); static CZone *FindSmallestZonePositionILN(const CVector *v); diff --git a/src/entities/Entity.cpp b/src/entities/Entity.cpp index e2b91552..ec50dd30 100644 --- a/src/entities/Entity.cpp +++ b/src/entities/Entity.cpp @@ -331,7 +331,7 @@ CEntity::SetupBigBuilding(void) bIsBIGBuilding = true; bStreamingDontDelete = true; bUsesCollision = false; - m_level = CTheZones::GetLevelFromPosition(GetPosition()); + m_level = CTheZones::GetLevelFromPosition(&GetPosition()); if(m_level == LEVEL_NONE){ if(mi->GetTxdSlot() != CTxdStore::FindTxdSlot("generic")){ mi->SetTexDictionary("generic"); diff --git a/src/peds/Population.cpp b/src/peds/Population.cpp index ce781983..1566ba3d 100644 --- a/src/peds/Population.cpp +++ b/src/peds/Population.cpp @@ -396,7 +396,7 @@ CPopulation::FindCollisionZoneForCoors(CVector *coors, int *safeZoneOut, eLevelN if (*safeZoneOut >= 0) *levelOut = LEVEL_NONE; else - *levelOut = CTheZones::GetLevelFromPosition(*coors); + *levelOut = CTheZones::GetLevelFromPosition(coors); } void