Skip to content

Commit 5b72fb9

Browse files
authored
Add enginePreloadWorldArea function for preloading areas (#3646)
1 parent 590b248 commit 5b72fb9

File tree

7 files changed

+48
-0
lines changed

7 files changed

+48
-0
lines changed

Client/game_sa/CStreamingSA.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,3 +503,15 @@ void CStreamingSA::RemoveBigBuildings()
503503
{
504504
(reinterpret_cast<void(__cdecl*)()>(0x4093B0))();
505505
}
506+
507+
void CStreamingSA::LoadScene(const CVector* position)
508+
{
509+
auto CStreaming_LoadScene = (void(__cdecl*)(const CVector*))FUNC_CStreaming_LoadScene;
510+
CStreaming_LoadScene(position);
511+
}
512+
513+
void CStreamingSA::LoadSceneCollision(const CVector* position)
514+
{
515+
auto CStreaming_LoadSceneCollision = (void(__cdecl*)(const CVector*))FUNC_CStreaming_LoadSceneCollision;
516+
CStreaming_LoadSceneCollision(position);
517+
}

Client/game_sa/CStreamingSA.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#define FUNC_LoadAllRequestedModels 0x40EA10
2121
#define FUNC_CStreaming__HasVehicleUpgradeLoaded 0x407820
2222
#define FUNC_CStreaming_RequestSpecialModel 0x409d10
23+
#define FUNC_CStreaming_LoadScene 0x40EB70
24+
#define FUNC_CStreaming_LoadSceneCollision 0x40ED80
2325

2426
struct CArchiveInfo
2527
{
@@ -77,6 +79,9 @@ class CStreamingSA final : public CStreaming
7779
void MakeSpaceFor(std::uint32_t memoryToCleanInBytes) override;
7880
std::uint32_t GetMemoryUsed() const override;
7981

82+
void LoadScene(const CVector* position);
83+
void LoadSceneCollision(const CVector* position);
84+
8085
private:
8186
void AllocateArchive();
8287

Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,12 @@ ADD_ENUM(eModelLoadState::LOADSTATE_READING, "reading")
904904
ADD_ENUM(eModelLoadState::LOADSTATE_FINISHING, "finishing")
905905
IMPLEMENT_ENUM_CLASS_END("model-load-state")
906906

907+
IMPLEMENT_ENUM_CLASS_BEGIN(PreloadAreaOption)
908+
ADD_ENUM(PreloadAreaOption::MODELS, "models")
909+
ADD_ENUM(PreloadAreaOption::COLLISIONS, "collisions")
910+
ADD_ENUM(PreloadAreaOption::ALL, "all")
911+
IMPLEMENT_ENUM_CLASS_END("preload-area-option")
912+
907913
//
908914
// CResource from userdata
909915
//

Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ DECLARE_ENUM_CLASS(eFxParticleSystems);
8787
DECLARE_ENUM(ePools);
8888
DECLARE_ENUM(eWorldProperty);
8989
DECLARE_ENUM_CLASS(eModelLoadState);
90+
DECLARE_ENUM_CLASS(PreloadAreaOption);
9091

9192
class CRemoteCall;
9293

Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ void CLuaEngineDefs::LoadFunctions()
145145
{"engineGetPoolDefaultCapacity", ArgumentParser<EngineGetPoolDefaultCapacity>},
146146
{"engineGetPoolUsedCapacity", ArgumentParser<EngineGetPoolUsedCapacity>},
147147
{"engineSetPoolCapacity", ArgumentParser<EngineSetPoolCapacity>},
148+
{"enginePreloadWorldArea", ArgumentParser<EnginePreloadWorldArea>},
148149

149150
// CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics );
150151
// CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics );
@@ -2547,3 +2548,15 @@ eModelLoadState CLuaEngineDefs::EngineStreamingGetModelLoadState(std::uint16_t m
25472548

25482549
return g_pGame->GetStreaming()->GetStreamingInfo(modelId)->loadState;
25492550
}
2551+
2552+
void CLuaEngineDefs::EnginePreloadWorldArea(CVector position, std::optional<PreloadAreaOption> option)
2553+
{
2554+
if (!option.has_value())
2555+
option = PreloadAreaOption::ALL;
2556+
2557+
if (option == PreloadAreaOption::ALL || option == PreloadAreaOption::MODELS)
2558+
g_pGame->GetStreaming()->LoadScene(&position);
2559+
2560+
if (option == PreloadAreaOption::ALL || option == PreloadAreaOption::COLLISIONS)
2561+
g_pGame->GetStreaming()->LoadSceneCollision(&position);
2562+
}

Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ class CLuaEngineDefs : public CLuaDefs
9292
static bool EngineStreamingReleaseModel(lua_State* const luaVM, std::uint16_t modelId, std::optional<bool> removeReference);
9393
static eModelLoadState EngineStreamingGetModelLoadState(std::uint16_t modelId);
9494

95+
static void EnginePreloadWorldArea(CVector position, std::optional<PreloadAreaOption> option);
96+
9597
private:
9698
static void AddEngineColClass(lua_State* luaVM);
9799
static void AddEngineTxdClass(lua_State* luaVM);

Client/sdk/game/CStreaming.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ enum class eModelLoadState : std::uint32_t
3737
LOADSTATE_FINISHING = 4
3838
};
3939

40+
enum class PreloadAreaOption
41+
{
42+
MODELS = 0,
43+
COLLISIONS,
44+
ALL
45+
};
46+
4047
struct CStreamingInfo
4148
{
4249
uint16_t prevId = (uint16_t)-1;
@@ -68,4 +75,6 @@ class CStreaming
6875
virtual void MakeSpaceFor(std::uint32_t memoryToCleanInBytes) = 0;
6976
virtual std::uint32_t GetMemoryUsed() const = 0;
7077
virtual void RemoveBigBuildings() = 0;
78+
virtual void LoadScene(const CVector* position) = 0;
79+
virtual void LoadSceneCollision(const CVector* position) = 0;
7180
};

0 commit comments

Comments
 (0)