From 8da41730dfc4a1ab77e786571d9ca1be41eddc14 Mon Sep 17 00:00:00 2001 From: FileEX Date: Thu, 9 Apr 2026 22:21:20 +0200 Subject: [PATCH 1/3] add engineSetRenderingListSize --- Client/game_sa/CGameSA.cpp | 4 + Client/game_sa/CLinkListSA.h | 102 ++++++++++++++++++ Client/game_sa/CLinkSA.h | 42 ++++++++ Client/game_sa/CVisibilityPluginsSA.cpp | 64 +++++++++++ Client/game_sa/CVisibilityPluginsSA.h | 26 +++++ .../logic/lua/CLuaFunctionParseHelpers.cpp | 5 + .../logic/lua/CLuaFunctionParseHelpers.h | 2 + .../logic/luadefs/CLuaEngineDefs.cpp | 13 +++ .../deathmatch/logic/luadefs/CLuaEngineDefs.h | 2 + Client/sdk/game/CVisibilityPlugins.h | 5 + Shared/sdk/enums/RenderingEntityListType.h | 18 ++++ 11 files changed, 283 insertions(+) create mode 100644 Client/game_sa/CLinkListSA.h create mode 100644 Client/game_sa/CLinkSA.h create mode 100644 Shared/sdk/enums/RenderingEntityListType.h diff --git a/Client/game_sa/CGameSA.cpp b/Client/game_sa/CGameSA.cpp index 59d55ae61ca..6be2f2da79c 100644 --- a/Client/game_sa/CGameSA.cpp +++ b/Client/game_sa/CGameSA.cpp @@ -253,6 +253,7 @@ CGameSA::CGameSA() CVehicleAudioSettingsManagerSA::StaticSetHooks(); CPointLightsSA::StaticSetHooks(); CBuildingRemovalSA::StaticSetHooks(); + CVisibilityPluginsSA::StaticSetHooks(); } catch (const std::bad_alloc& e) { @@ -479,6 +480,9 @@ void CGameSA::Reset() // Restore changed TXD IDs CModelInfoSA::StaticResetTextureDictionaries(); + // Restore visibility plugin lists + CVisibilityPluginsSA::ResetRenderingEntityLists(); + // Restore default world state RestoreGameWorld(); diff --git a/Client/game_sa/CLinkListSA.h b/Client/game_sa/CLinkListSA.h new file mode 100644 index 00000000000..785a5069be8 --- /dev/null +++ b/Client/game_sa/CLinkListSA.h @@ -0,0 +1,102 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto + * LICENSE: See LICENSE in the top level directory + * FILE: game_sa/CLinkListSA.h + * + * Multi Theft Auto is available from https://www.multitheftauto.com/ + * + *****************************************************************************/ +#pragma once + +#include "CLinkSA.h" +#include +#include + +template +class CLinkListSA +{ +public: + CLinkSA usedListHead{}; + CLinkSA usedListTail{}; + CLinkSA freeListHead{}; + CLinkSA freeListTail{}; + CLinkSA* entries{}; + + void* operator new(std::size_t size) { return ((void*(__cdecl*)(std::size_t))0x821195)(size); } + void* operator new[](std::size_t size) { return ((void*(__cdecl*)(std::size_t))0x821195)(size); } + void operator delete(void* ptr) { ((void(__cdecl*)(void*))0x8213AE)(ptr); } + void operator delete[](void* ptr) { ((void(__cdecl*)(void*))0x8213AE)(ptr); } + + void Init(std::size_t count) + { + if (count == 0) + return; + + usedListHead.next = &usedListTail; + usedListTail.prev = &usedListHead; + freeListHead.next = &freeListTail; + freeListTail.prev = &freeListHead; + + entries = new CLinkSA[count]; + for (std::int32_t i = count - 1; i >= 0; i--) + entries[i].Insert(&freeListHead); + } + + void Shutdown() { delete[] std::exchange(entries, nullptr); } + + void Insert(CLinkSA& link) { + link.Remove(); + link.Insert(&usedListHead); + } + + CLinkSA* Insert(T const& data) + { + CLinkSA* link = freeListHead.next; + if (link == &freeListTail) + return nullptr; + + link->data = data; + Insert(*link); + return link; + } + + CLinkSA* InsertSorted(T const& data) + { + CLinkSA* i = nullptr; + for (i = usedListHead.next; i != &usedListTail; i = i->next) + { + if (i->data.distance >= data.distance) + break; + } + + CLinkSA* link = freeListHead.next; + if (link == &freeListTail) + return nullptr; + + link->data = data; + link->Remove(); + link->Insert(i->prev); + return link; + } + + void Clear() + { + for (CLinkSA* link = usedListHead.next; link != &usedListTail; link = usedListHead.next) + Remove(link); + } + + auto Remove(CLinkSA* l) + { + l->Remove(); + l->Insert(&freeListHead); + return l; + } + + auto GetTail() { return usedListTail.prev; } + auto& GetTailLink() { return usedListTail; } + + auto GetHead() { return usedListHead.next; } + auto& GetHeadLink() { return usedListHead; } +}; +static_assert(sizeof(CLinkListSA) == 0x34, "Invalid size for CLinkListSA class!"); diff --git a/Client/game_sa/CLinkSA.h b/Client/game_sa/CLinkSA.h new file mode 100644 index 00000000000..cac0620de69 --- /dev/null +++ b/Client/game_sa/CLinkSA.h @@ -0,0 +1,42 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto + * LICENSE: See LICENSE in the top level directory + * FILE: game_sa/CLinkSA.h + * + * Multi Theft Auto is available from https://www.multitheftauto.com/ + * + *****************************************************************************/ + +#pragma once + +template +class CLinkSA +{ +public: + T data; + CLinkSA* prev; + CLinkSA* next; + + void* operator new(std::size_t size) { return ((void*(__cdecl*)(std::size_t))0x821195)(size); } + void* operator new[](std::size_t size) { return ((void*(__cdecl*)(std::size_t))0x821195)(size); } + void operator delete(void* ptr) { ((void(__cdecl*)(void*))0x8213AE)(ptr); } + void operator delete[](void* ptr) { ((void(__cdecl*)(void*))0x8213AE)(ptr); } + + void Remove() + { + next->prev = prev; + prev->next = next; + } + + // If `this` is already in another list, `Remove()` must first be called! (Not doing so will result in the list (`this` is in) getting corrupted) + void Insert(CLinkSA* after) + { + next = after->next; + next->prev = this; + + prev = after; + prev->next = this; + } +}; +static_assert(sizeof(CLinkSA) == 0xC, "Invalid size for CLinkSA class!"); diff --git a/Client/game_sa/CVisibilityPluginsSA.cpp b/Client/game_sa/CVisibilityPluginsSA.cpp index 5047bee368a..00fa2aeb4aa 100644 --- a/Client/game_sa/CVisibilityPluginsSA.cpp +++ b/Client/game_sa/CVisibilityPluginsSA.cpp @@ -14,6 +14,12 @@ #define FUNC_CVisibilityPlugins_InsertEntityIntoEntityList 0x733DD0 +// m_alphaEntitiesList +static RenderingListState alphaEntitiesList{(CLinkListSA*)0xC88120, (*(std::size_t*)0x733B05) / sizeof(CLinkSA), false}; + +// m_alphaUnderwaterEntityList +static RenderingListState underwaterEntitiesList{(CLinkListSA*)0xC88178, (*(std::size_t*)0x733BD5) / sizeof(CLinkSA), false}; + void CVisibilityPluginsSA::SetClumpAlpha(RpClump* pClump, int iAlpha) { DWORD dwFunc = FUNC_CVisiblityPlugins_SetClumpAlpha; @@ -62,3 +68,61 @@ bool CVisibilityPluginsSA::InsertEntityIntoEntityList(void* entity, float distan { return ((bool(_cdecl*)(void*, float, void*))FUNC_CVisibilityPlugins_InsertEntityIntoEntityList)(entity, distance, callback); } + +void CVisibilityPluginsSA::SetRenderingListSize(RenderingEntityListType listType, std::size_t elementsCount) +{ + RenderingListState& state = listType == RenderingEntityListType::ENTITY_LIST_TYPE_ALPHA ? alphaEntitiesList : underwaterEntitiesList; + if (state.size == elementsCount) + return; + + state.size = elementsCount; + state.pendingReinit = true; +} + +void CVisibilityPluginsSA::CheckRenderingList(RenderingListState& state) +{ + if (!state.pendingReinit) + return; + + ReInitRenderingList(state.list, state.size); + state.pendingReinit = false; +} + +void CVisibilityPluginsSA::ReInitRenderingList(CLinkListSA* list, std::size_t count) +{ + if (!list || count == 0) + return; + + list->Shutdown(); + list->Init(count); +} + +void* __fastcall CVisibilityPluginsSA::InsertAlphaEntityIntoSortedList(CLinkListSA* entitiesList, void*, AlphaObjectInfoSA* info) +{ + CheckRenderingList(alphaEntitiesList); + return entitiesList->InsertSorted(*info); +} + +void* __fastcall CVisibilityPluginsSA::InsertUnderwaterEntityIntoSortedList(CLinkListSA* entitiesList, void*, AlphaObjectInfoSA* info) +{ + CheckRenderingList(underwaterEntitiesList); + return entitiesList->InsertSorted(*info); +} + +void CVisibilityPluginsSA::ResetRenderingEntityLists() +{ + alphaEntitiesList.size = DEFAULT_MAX_ALPHA_ENTITIES; + underwaterEntitiesList.size = DEFAULT_MAX_UNDERWATER_ENTITIES; + + ReInitRenderingList(alphaEntitiesList.list, alphaEntitiesList.size); + ReInitRenderingList(underwaterEntitiesList.list, underwaterEntitiesList.size); +} + +void CVisibilityPluginsSA::StaticSetHooks() +{ + HookInstallCall(0x7345F2, (DWORD)InsertAlphaEntityIntoSortedList); // CVisibilityPlugins::InsertEntityIntoSortedList + HookInstallCall(0x733DF5, (DWORD)InsertAlphaEntityIntoSortedList); // CVisibilityPlugins::InsertObjectIntoSortedList + + HookInstallCall(0x7345D9, (DWORD)InsertUnderwaterEntityIntoSortedList); // CVisibilityPlugins::InsertEntityIntoSortedList + HookInstallCall(0x733DB5, (DWORD)InsertUnderwaterEntityIntoSortedList); // CVisibilityPlugins::InsertEntityIntoUnderwaterList +} diff --git a/Client/game_sa/CVisibilityPluginsSA.h b/Client/game_sa/CVisibilityPluginsSA.h index a7cbf2d8c54..b2beb21e340 100644 --- a/Client/game_sa/CVisibilityPluginsSA.h +++ b/Client/game_sa/CVisibilityPluginsSA.h @@ -12,10 +12,25 @@ #pragma once #include +#include "CLinkListSA.h" #define FUNC_CVisiblityPlugins_SetClumpAlpha 0x732B00 #define FUNC_CVisibilityPlugins_GetAtomicId 0x732370 +struct AlphaObjectInfoSA +{ + void* object; + void* callback; + float distance; +}; + +struct RenderingListState +{ + CLinkListSA* list; + std::size_t size; + bool pendingReinit; +}; + class CVisibilityPluginsSA : public CVisibilityPlugins { public: @@ -23,4 +38,15 @@ class CVisibilityPluginsSA : public CVisibilityPlugins int GetAtomicId(RwObject* pAtomic); bool InsertEntityIntoEntityList(void* entity, float distance, void* callback); + void SetRenderingListSize(RenderingEntityListType listType, std::size_t elementsCount) override; + + static void ResetRenderingEntityLists(); + static void StaticSetHooks(); + +private: + static void CheckRenderingList(RenderingListState& state); + static void ReInitRenderingList(CLinkListSA* list, std::size_t count); + + static void* __fastcall InsertAlphaEntityIntoSortedList(CLinkListSA* entitiesList, void*, AlphaObjectInfoSA* info); + static void* __fastcall InsertUnderwaterEntityIntoSortedList(CLinkListSA* entitiesList, void*, AlphaObjectInfoSA* info); }; diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp index 7ae83f8bfbb..5d6baef1a89 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.cpp @@ -992,6 +992,11 @@ ADD_ENUM(PostFXType::CONTRAST, "contrast") ADD_ENUM(PostFXType::SATURATION, "saturation") IMPLEMENT_ENUM_CLASS_END("postfx-type") +IMPLEMENT_ENUM_CLASS_BEGIN(RenderingEntityListType) +ADD_ENUM(RenderingEntityListType::ENTITY_LIST_TYPE_ALPHA, "alpha") +ADD_ENUM(RenderingEntityListType::ENTITY_LIST_TYPE_UNDERWATER, "underwater") +IMPLEMENT_ENUM_CLASS_END("rendering-entity-list-type") + // // CResource from userdata // diff --git a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h index bae91981974..7506af168c6 100644 --- a/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h +++ b/Client/mods/deathmatch/logic/lua/CLuaFunctionParseHelpers.h @@ -26,6 +26,7 @@ #include "enums/SoundEffectType.h" #include "enums/ObjectGroupPhysicalProperties.h" #include "enums/PostFXType.h" +#include "enums/RenderingEntityListType.h" enum eLuaType { @@ -104,6 +105,7 @@ DECLARE_ENUM_CLASS(taskType); DECLARE_ENUM(eEntityType); DECLARE_ENUM_CLASS(VehicleAudioSettingProperty); DECLARE_ENUM_CLASS(PostFXType); +DECLARE_ENUM_CLASS(RenderingEntityListType); class CRemoteCall; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp index ce01b71ffcd..111778cf35b 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.cpp @@ -14,9 +14,11 @@ #include #include #include +#include #include #include "CLuaEngineDefs.h" #include +#include //! Set the CModelCacheManager limits //! By passing `nil`/no value the original values are restored @@ -167,6 +169,7 @@ void CLuaEngineDefs::LoadFunctions() {"enginePreloadWorldArea", ArgumentParser}, {"engineRestreamModel", ArgumentParser}, {"engineRestream", ArgumentParser}, + {"engineSetRenderingListSize", ArgumentParser}, // CLuaCFunctions::AddFunction ( "engineReplaceMatchingAtomics", EngineReplaceMatchingAtomics ); // CLuaCFunctions::AddFunction ( "engineReplaceWheelAtomics", EngineReplaceWheelAtomics ); @@ -2792,3 +2795,13 @@ void CLuaEngineDefs::EngineRestream(std::optional option) { g_pClientGame->Restream(option); } + +void CLuaEngineDefs::EngineSetRenderingListSize(RenderingEntityListType listType, std::size_t elementsCount) +{ + if (listType == RenderingEntityListType::ENTITY_LIST_TYPE_ALPHA && elementsCount < DEFAULT_MAX_ALPHA_ENTITIES) + throw std::invalid_argument("Alpha entities list size cannot be less than 200"); + else if (listType == RenderingEntityListType::ENTITY_LIST_TYPE_UNDERWATER && elementsCount < DEFAULT_MAX_UNDERWATER_ENTITIES) + throw std::invalid_argument("Underwater entities list size cannot be less than 100"); + + g_pGame->GetVisibilityPlugins()->SetRenderingListSize(listType, elementsCount); +} diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h index 628e067e107..01c9034980a 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaEngineDefs.h @@ -99,6 +99,8 @@ class CLuaEngineDefs : public CLuaDefs static bool EngineRestreamModel(std::uint16_t modelId); static void EngineRestream(std::optional option); + static void EngineSetRenderingListSize(RenderingEntityListType listType, std::size_t elementsCount); + private: static void AddEngineColClass(lua_State* luaVM); static void AddEngineTxdClass(lua_State* luaVM); diff --git a/Client/sdk/game/CVisibilityPlugins.h b/Client/sdk/game/CVisibilityPlugins.h index 55765d64548..baa47815c83 100644 --- a/Client/sdk/game/CVisibilityPlugins.h +++ b/Client/sdk/game/CVisibilityPlugins.h @@ -10,10 +10,14 @@ *****************************************************************************/ #pragma once +#include "enums/RenderingEntityListType.h" #define ATOMIC_ID_FLAG_TWO_VERSIONS_UNDAMAGED 1 #define ATOMIC_ID_FLAG_TWO_VERSIONS_DAMAGED 2 +#define DEFAULT_MAX_ALPHA_ENTITIES 200 +#define DEFAULT_MAX_UNDERWATER_ENTITIES 100 + struct RpClump; struct RwObject; @@ -24,4 +28,5 @@ class CVisibilityPlugins virtual int GetAtomicId(RwObject* pAtomic) = 0; virtual bool InsertEntityIntoEntityList(void* entity, float distance, void* callback) = 0; + virtual void SetRenderingListSize(RenderingEntityListType listType, std::size_t elementsCount) = 0; }; diff --git a/Shared/sdk/enums/RenderingEntityListType.h b/Shared/sdk/enums/RenderingEntityListType.h new file mode 100644 index 00000000000..3f718f5fbdc --- /dev/null +++ b/Shared/sdk/enums/RenderingEntityListType.h @@ -0,0 +1,18 @@ +/***************************************************************************** + * + * PROJECT: Multi Theft Auto + * LICENSE: See LICENSE in the top level directory + * FILE: sdk/RenderingEntityListType.h + * PURPOSE: Header for common definitions + * + * Multi Theft Auto is available from https://www.multitheftauto.com/ + * + *****************************************************************************/ + +#pragma once + +enum class RenderingEntityListType +{ + ENTITY_LIST_TYPE_ALPHA, + ENTITY_LIST_TYPE_UNDERWATER, +}; From a8d05079d0a53d657ad7bc838d1a4bd2d6f7d4fb Mon Sep 17 00:00:00 2001 From: FileEX Date: Thu, 9 Apr 2026 23:20:04 +0200 Subject: [PATCH 2/3] clang fix --- Client/game_sa/CLinkListSA.h | 13 +++++++------ Client/game_sa/CLinkSA.h | 2 +- Client/game_sa/CVisibilityPluginsSA.cpp | 7 ++++--- Client/game_sa/CVisibilityPluginsSA.h | 6 +++--- Client/sdk/game/CVisibilityPlugins.h | 2 +- 5 files changed, 16 insertions(+), 14 deletions(-) diff --git a/Client/game_sa/CLinkListSA.h b/Client/game_sa/CLinkListSA.h index 785a5069be8..f3ae72fa616 100644 --- a/Client/game_sa/CLinkListSA.h +++ b/Client/game_sa/CLinkListSA.h @@ -17,10 +17,10 @@ template class CLinkListSA { public: - CLinkSA usedListHead{}; - CLinkSA usedListTail{}; - CLinkSA freeListHead{}; - CLinkSA freeListTail{}; + CLinkSA usedListHead{}; + CLinkSA usedListTail{}; + CLinkSA freeListHead{}; + CLinkSA freeListTail{}; CLinkSA* entries{}; void* operator new(std::size_t size) { return ((void*(__cdecl*)(std::size_t))0x821195)(size); } @@ -45,7 +45,8 @@ class CLinkListSA void Shutdown() { delete[] std::exchange(entries, nullptr); } - void Insert(CLinkSA& link) { + void Insert(CLinkSA& link) + { link.Remove(); link.Insert(&usedListHead); } @@ -86,7 +87,7 @@ class CLinkListSA Remove(link); } - auto Remove(CLinkSA* l) + auto Remove(CLinkSA* l) { l->Remove(); l->Insert(&freeListHead); diff --git a/Client/game_sa/CLinkSA.h b/Client/game_sa/CLinkSA.h index cac0620de69..69d6fbf2168 100644 --- a/Client/game_sa/CLinkSA.h +++ b/Client/game_sa/CLinkSA.h @@ -14,7 +14,7 @@ template class CLinkSA { public: - T data; + T data; CLinkSA* prev; CLinkSA* next; diff --git a/Client/game_sa/CVisibilityPluginsSA.cpp b/Client/game_sa/CVisibilityPluginsSA.cpp index 00fa2aeb4aa..f0333caad38 100644 --- a/Client/game_sa/CVisibilityPluginsSA.cpp +++ b/Client/game_sa/CVisibilityPluginsSA.cpp @@ -18,7 +18,8 @@ static RenderingListState alphaEntitiesList{(CLinkListSA*)0xC88120, (*(std::size_t*)0x733B05) / sizeof(CLinkSA), false}; // m_alphaUnderwaterEntityList -static RenderingListState underwaterEntitiesList{(CLinkListSA*)0xC88178, (*(std::size_t*)0x733BD5) / sizeof(CLinkSA), false}; +static RenderingListState underwaterEntitiesList{(CLinkListSA*)0xC88178, (*(std::size_t*)0x733BD5) / sizeof(CLinkSA), + false}; void CVisibilityPluginsSA::SetClumpAlpha(RpClump* pClump, int iAlpha) { @@ -120,8 +121,8 @@ void CVisibilityPluginsSA::ResetRenderingEntityLists() void CVisibilityPluginsSA::StaticSetHooks() { - HookInstallCall(0x7345F2, (DWORD)InsertAlphaEntityIntoSortedList); // CVisibilityPlugins::InsertEntityIntoSortedList - HookInstallCall(0x733DF5, (DWORD)InsertAlphaEntityIntoSortedList); // CVisibilityPlugins::InsertObjectIntoSortedList + HookInstallCall(0x7345F2, (DWORD)InsertAlphaEntityIntoSortedList); // CVisibilityPlugins::InsertEntityIntoSortedList + HookInstallCall(0x733DF5, (DWORD)InsertAlphaEntityIntoSortedList); // CVisibilityPlugins::InsertObjectIntoSortedList HookInstallCall(0x7345D9, (DWORD)InsertUnderwaterEntityIntoSortedList); // CVisibilityPlugins::InsertEntityIntoSortedList HookInstallCall(0x733DB5, (DWORD)InsertUnderwaterEntityIntoSortedList); // CVisibilityPlugins::InsertEntityIntoUnderwaterList diff --git a/Client/game_sa/CVisibilityPluginsSA.h b/Client/game_sa/CVisibilityPluginsSA.h index b2beb21e340..5f04ab1dd6f 100644 --- a/Client/game_sa/CVisibilityPluginsSA.h +++ b/Client/game_sa/CVisibilityPluginsSA.h @@ -19,9 +19,9 @@ struct AlphaObjectInfoSA { - void* object; - void* callback; - float distance; + void* object; + void* callback; + float distance; }; struct RenderingListState diff --git a/Client/sdk/game/CVisibilityPlugins.h b/Client/sdk/game/CVisibilityPlugins.h index baa47815c83..35278534769 100644 --- a/Client/sdk/game/CVisibilityPlugins.h +++ b/Client/sdk/game/CVisibilityPlugins.h @@ -15,7 +15,7 @@ #define ATOMIC_ID_FLAG_TWO_VERSIONS_UNDAMAGED 1 #define ATOMIC_ID_FLAG_TWO_VERSIONS_DAMAGED 2 -#define DEFAULT_MAX_ALPHA_ENTITIES 200 +#define DEFAULT_MAX_ALPHA_ENTITIES 200 #define DEFAULT_MAX_UNDERWATER_ENTITIES 100 struct RpClump; From f6fe671f042fa46fbe5e3f13f840658c627beeaa Mon Sep 17 00:00:00 2001 From: FileEX Date: Wed, 15 Apr 2026 01:54:13 +0200 Subject: [PATCH 3/3] Fix clang format --- Client/sdk/game/CVisibilityPlugins.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/sdk/game/CVisibilityPlugins.h b/Client/sdk/game/CVisibilityPlugins.h index b24e4394621..8be705cdfdc 100644 --- a/Client/sdk/game/CVisibilityPlugins.h +++ b/Client/sdk/game/CVisibilityPlugins.h @@ -29,7 +29,7 @@ class CVisibilityPlugins virtual int GetAtomicId(RwObject* pAtomic) = 0; virtual bool IsAtomicVisible(RpAtomic* atomic) const = 0; - + virtual bool InsertEntityIntoEntityList(void* entity, float distance, void* callback) = 0; virtual void SetRenderingListSize(RenderingEntityListType listType, std::size_t elementsCount) = 0; };