From ce202aee7fbf3deb1be8bdd99da976d178c92d95 Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Fri, 21 Nov 2025 20:56:53 +0100 Subject: [PATCH 1/7] Initial commit of grass set/get feature --- Client/mods/deathmatch/logic/CClientGame.cpp | 1 + .../mods/deathmatch/logic/CPacketHandler.cpp | 13 +++++++ .../logic/luadefs/CLuaWorldDefs.cpp | 26 +++++++++++++- .../deathmatch/logic/luadefs/CLuaWorldDefs.h | 3 ++ .../mods/deathmatch/logic/rpc/CWorldRPCs.cpp | 18 ++++++++++ Client/mods/deathmatch/logic/rpc/CWorldRPCs.h | 2 ++ Client/multiplayer_sa/CMultiplayerSA.cpp | 18 ++++++++++ Client/multiplayer_sa/CMultiplayerSA.h | 3 ++ Client/sdk/multiplayer/CMultiplayer.h | 3 ++ Server/mods/deathmatch/logic/CGame.cpp | 3 ++ Server/mods/deathmatch/logic/CGame.h | 18 ++++++++++ Server/mods/deathmatch/logic/CMapManager.cpp | 8 ++++- .../logic/CStaticFunctionDefinitions.cpp | 34 +++++++++++++++++++ .../logic/CStaticFunctionDefinitions.h | 3 ++ .../logic/luadefs/CLuaWorldDefs.cpp | 28 ++++++++++++++- .../deathmatch/logic/luadefs/CLuaWorldDefs.h | 4 +++ .../logic/packets/CMapInfoPacket.cpp | 12 +++++++ .../deathmatch/logic/packets/CMapInfoPacket.h | 4 +++ Shared/sdk/net/rpc_enums.h | 3 ++ 19 files changed, 201 insertions(+), 3 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 7632881badd..0279709392f 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -6985,6 +6985,7 @@ void CClientGame::ResetWorldProperties(const ResetWorldPropsInfo& resetPropsInfo g_pMultiplayer->ResetSunSize(); g_pMultiplayer->RestoreWindVelocity(); g_pMultiplayer->ResetColorFilter(); + g_pMultiplayer->ResetGrassDrawDistance(); g_pGame->GetWeather()->ResetAmountOfRain(); } diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index 339110ff311..f53aa5af55d 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -2544,6 +2544,19 @@ void CPacketHandler::Packet_MapInfo(NetBitStreamInterface& bitStream) g_pMultiplayer->SetFogDistance(fFogDistance); } + // Grass draw distance + bool bOverrideGrassDrawDistance = false; + float fGrassCloseDistance, fGrassFarDistance; + if (!bitStream.ReadBit(bOverrideGrassDrawDistance)) + return; + if (bOverrideGrassDrawDistance) + { + if (!bitStream.Read(fGrassCloseDistance) || !bitStream.Read(fGrassFarDistance)) + return; + + g_pMultiplayer->SetGrassDrawDistance(fGrassCloseDistance, fGrassFarDistance); + } + // Aircraft max height float fAircraftMaxHeight = 800; if (!bitStream.Read(fAircraftMaxHeight)) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp index a13aca8be32..bec10bf61ec 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp @@ -149,7 +149,12 @@ void CLuaWorldDefs::LoadFunctions() {"isTimeFrozen", ArgumentParser}, {"isVolumetricShadowsEnabled", ArgumentParser}, {"isDynamicPedShadowsEnabled", ArgumentParser}, - {"testSphereAgainstWorld", ArgumentParser}}; + {"testSphereAgainstWorld", ArgumentParser}, + + // Grass draw distance functions + {"getGrassDrawDistance", ArgumentParser}, + {"setGrassDrawDistance", ArgumentParser}, + {"resetGrassDrawDistance", ArgumentParser}}; // Add functions for (const auto& [name, func] : functions) @@ -1818,6 +1823,25 @@ int CLuaWorldDefs::ResetFogDistance(lua_State* luaVM) return 1; } +CLuaMultiReturn CLuaWorldDefs::GetGrassDrawDistance() +{ + float fCloseDistance, fFarDistance; + g_pMultiplayer->GetGrassDrawDistance(fCloseDistance, fFarDistance); + return {fCloseDistance, fFarDistance}; +} + +bool CLuaWorldDefs::SetGrassDrawDistance(float closeDistance, float farDistance) +{ + g_pMultiplayer->SetGrassDrawDistance(closeDistance, farDistance); + return true; +} + +bool CLuaWorldDefs::ResetGrassDrawDistance() +{ + g_pMultiplayer->ResetGrassDrawDistance(); + return true; +} + int CLuaWorldDefs::GetSunColor(lua_State* luaVM) { unsigned char ucCoreRed, ucCoreGreen, ucCoreBlue, ucCoronaRed, ucCoronaGreen, ucCoronaBlue; diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h index 5668ca6dd48..abe1e23be33 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h @@ -90,6 +90,9 @@ class CLuaWorldDefs : public CLuaDefs LUA_DECLARE(GetFogDistance); LUA_DECLARE(SetFogDistance); LUA_DECLARE(ResetFogDistance); + static CLuaMultiReturn GetGrassDrawDistance(); + static bool SetGrassDrawDistance(float closeDistance, float farDistance); + static bool ResetGrassDrawDistance(); LUA_DECLARE(GetSunColor); LUA_DECLARE(SetSunColor); LUA_DECLARE(ResetSunColor); diff --git a/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp index 38a15493fad..8b2356ac6d4 100644 --- a/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp @@ -73,6 +73,9 @@ void CWorldRPCs::LoadFunctions() AddHandler(SET_WORLD_SPECIAL_PROPERTY, SetWorldSpecialPropertyEnabled, "SetWorldSpecialPropertyEnabled"); AddHandler(RESET_WORLD_PROPERTIES, ResetWorldProperties, "ResetWorldProperties"); + + AddHandler(SET_GRASS_DRAW_DISTANCE, SetGrassDrawDistance, "SetGrassDrawDistance"); + AddHandler(RESET_GRASS_DRAW_DISTANCE, ResetGrassDrawDistance, "ResetGrassDrawDistance"); } void CWorldRPCs::SetTime(NetBitStreamInterface& bitStream) @@ -354,6 +357,16 @@ void CWorldRPCs::SetFogDistance(NetBitStreamInterface& bitStream) } } +void CWorldRPCs::SetGrassDrawDistance(NetBitStreamInterface& bitStream) +{ + float fCloseDistance, fFarDistance; + + if (bitStream.Read(fCloseDistance) && bitStream.Read(fFarDistance)) + { + g_pMultiplayer->SetGrassDrawDistance(fCloseDistance, fFarDistance); + } +} + void CWorldRPCs::SetAircraftMaxHeight(NetBitStreamInterface& bitStream) { float fMaxHeight; @@ -414,6 +427,11 @@ void CWorldRPCs::ResetFogDistance(NetBitStreamInterface& bitStream) g_pMultiplayer->RestoreFogDistance(); } +void CWorldRPCs::ResetGrassDrawDistance(NetBitStreamInterface& bitStream) +{ + g_pMultiplayer->ResetGrassDrawDistance(); +} + void CWorldRPCs::SetWeaponProperty(NetBitStreamInterface& bitStream) { unsigned char ucWeapon = 0; diff --git a/Client/mods/deathmatch/logic/rpc/CWorldRPCs.h b/Client/mods/deathmatch/logic/rpc/CWorldRPCs.h index 5c5c4514f1d..59026c2fd7a 100644 --- a/Client/mods/deathmatch/logic/rpc/CWorldRPCs.h +++ b/Client/mods/deathmatch/logic/rpc/CWorldRPCs.h @@ -66,4 +66,6 @@ class CWorldRPCs : public CRPCFunctions DECLARE_RPC(SetSyncIntervals); DECLARE_RPC(SetWorldSpecialPropertyEnabled); DECLARE_RPC(ResetWorldProperties); + DECLARE_RPC(SetGrassDrawDistance); + DECLARE_RPC(ResetGrassDrawDistance); }; diff --git a/Client/multiplayer_sa/CMultiplayerSA.cpp b/Client/multiplayer_sa/CMultiplayerSA.cpp index c7016c76f3d..749602a09c0 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA.cpp @@ -2064,6 +2064,24 @@ void CMultiplayerSA::RestoreFogDistance() } } +void CMultiplayerSA::SetGrassDrawDistance(float fCloseDistance, float fFarDistance) +{ + MemPutFast(0xC02DBC, fCloseDistance); + MemPutFast(0x8D132C, fFarDistance); +} + +void CMultiplayerSA::GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance) const +{ + fCloseDistance = *(float*)0xC02DBC; + fFarDistance = *(float*)0x8D132C; +} + +void CMultiplayerSA::ResetGrassDrawDistance() +{ + MemPutFast(0xC02DBC, 3.0f); + MemPutFast(0x8D132C, 60.0f); +} + void CMultiplayerSA::GetSunColor(unsigned char& ucCoreRed, unsigned char& ucCoreGreen, unsigned char& ucCoreBlue, unsigned char& ucCoronaRed, unsigned char& ucCoronaGreen, unsigned char& ucCoronaBlue) { diff --git a/Client/multiplayer_sa/CMultiplayerSA.h b/Client/multiplayer_sa/CMultiplayerSA.h index 2d209976b3c..c97d2f61660 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.h +++ b/Client/multiplayer_sa/CMultiplayerSA.h @@ -192,6 +192,9 @@ void InitHooks(); float GetFogDistance(); void SetFogDistance(float fDistance); void RestoreFogDistance(); + void SetGrassDrawDistance(float fCloseDistance, float fFarDistance); + void GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance) const; + void ResetGrassDrawDistance(); void GetSunColor(unsigned char& ucCoreRed, unsigned char& ucCoreGreen, unsigned char& ucCoreBlue, unsigned char& ucCoronaRed, unsigned char& ucCoronaGreen, unsigned char& ucCoronaBlue); void SetSunColor(unsigned char ucCoreRed, unsigned char ucCoreGreen, unsigned char ucCoreBlue, unsigned char ucCoronaRed, unsigned char ucCoronaGreen, diff --git a/Client/sdk/multiplayer/CMultiplayer.h b/Client/sdk/multiplayer/CMultiplayer.h index e5e591ad5d3..9f47ddd8d3b 100644 --- a/Client/sdk/multiplayer/CMultiplayer.h +++ b/Client/sdk/multiplayer/CMultiplayer.h @@ -299,6 +299,9 @@ class CMultiplayer virtual void SetFogDistance(float fDistance) = 0; virtual float GetFogDistance() = 0; virtual void RestoreFogDistance() = 0; + virtual void SetGrassDrawDistance(float fCloseDistance, float fFarDistance) = 0; + virtual void GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance) const = 0; + virtual void ResetGrassDrawDistance() = 0; virtual void GetSunColor(unsigned char& ucCoreRed, unsigned char& ucCoreGreen, unsigned char& ucCoreBlue, unsigned char& ucCoronaRed, unsigned char& ucCoronaGreen, unsigned char& ucCoronaBlue) = 0; virtual void SetSunColor(unsigned char ucCoreRed, unsigned char ucCoreGreen, unsigned char ucCoreBlue, unsigned char ucCoronaRed, diff --git a/Server/mods/deathmatch/logic/CGame.cpp b/Server/mods/deathmatch/logic/CGame.cpp index 5807a7f3edf..cd500ea1ab8 100644 --- a/Server/mods/deathmatch/logic/CGame.cpp +++ b/Server/mods/deathmatch/logic/CGame.cpp @@ -219,6 +219,9 @@ CGame::CGame() : m_FloodProtect(4, 30000, 30000) // Max of 4 connecti m_bOverrideWindVelocity = false; m_bOverrideFarClip = false; m_bOverrideFogDistance = false; + m_bOverrideGrassDrawDistance = false; + m_fGrassCloseDistance = 3.0f; + m_fGrassFarDistance = 60.0f; m_bOverrideMoonSize = false; m_pASE = NULL; diff --git a/Server/mods/deathmatch/logic/CGame.h b/Server/mods/deathmatch/logic/CGame.h index 07c4f227e65..fa24aa42781 100644 --- a/Server/mods/deathmatch/logic/CGame.h +++ b/Server/mods/deathmatch/logic/CGame.h @@ -404,6 +404,20 @@ class CGame float GetFogDistance() { return m_fFogDistance; } void SetFogDistance(float& fFogDistance) { m_fFogDistance = fFogDistance; } + bool HasGrassDrawDistance() { return m_bOverrideGrassDrawDistance; } + void SetHasGrassDrawDistance(bool bOverrideGrassDrawDistance) { m_bOverrideGrassDrawDistance = bOverrideGrassDrawDistance; } + + void GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance) + { + fCloseDistance = m_fGrassCloseDistance; + fFarDistance = m_fGrassFarDistance; + } + void SetGrassDrawDistance(float fCloseDistance, float fFarDistance) + { + m_fGrassCloseDistance = fCloseDistance; + m_fGrassFarDistance = fFarDistance; + } + float GetAircraftMaxHeight() { return m_fAircraftMaxHeight; } void SetAircraftMaxHeight(float fMaxHeight) { m_fAircraftMaxHeight = fMaxHeight; } @@ -640,6 +654,10 @@ class CGame bool m_bOverrideFogDistance; float m_fFogDistance; + bool m_bOverrideGrassDrawDistance; + float m_fGrassCloseDistance; + float m_fGrassFarDistance; + SGarageStates m_bGarageStates; // FPS statistics diff --git a/Server/mods/deathmatch/logic/CMapManager.cpp b/Server/mods/deathmatch/logic/CMapManager.cpp index d62ad044f42..61646c61228 100644 --- a/Server/mods/deathmatch/logic/CMapManager.cpp +++ b/Server/mods/deathmatch/logic/CMapManager.cpp @@ -519,6 +519,11 @@ void CMapManager::OnPlayerJoin(CPlayer& Player) bool bOverrideFogDistance = g_pGame->HasFogDistance(); float fFogDistance = g_pGame->GetFogDistance(); + // Grass draw distance + bool bOverrideGrassDrawDistance = g_pGame->HasGrassDrawDistance(); + float fGrassCloseDistance, fGrassFarDistance; + g_pGame->GetGrassDrawDistance(fGrassCloseDistance, fGrassFarDistance); + marker.Set("FirstBit"); // Send the packet to the given player @@ -528,7 +533,8 @@ void CMapManager::OnPlayerJoin(CPlayer& Player) fJetpackMaxHeight, bOverrideWaterColor, ucWaterRed, ucWaterGreen, ucWaterBlue, ucWaterAlpha, bInteriorSoundsEnabled, bOverrideRainLevel, fRainLevel, bOverrideSunSize, fSunSize, bOverrideSunColor, ucCoreR, ucCoreG, ucCoreB, ucCoronaR, ucCoronaG, ucCoronaB, bOverrideWindVelocity, fWindVelX, fWindVelY, fWindVelZ, bOverrideFarClipDistance, fFarClip, bOverrideFogDistance, - fFogDistance, fAircraftMaxHeight, fAircraftMaxVelocity, bOverrideMoonSize, iMoonSize)); + fFogDistance, bOverrideGrassDrawDistance, fGrassCloseDistance, fGrassFarDistance, fAircraftMaxHeight, fAircraftMaxVelocity, + bOverrideMoonSize, iMoonSize)); marker.Set("SendMapInfoPacket"); diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 52695b056fc..880358a3000 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -10686,6 +10686,17 @@ bool CStaticFunctionDefinitions::GetFogDistance(float& fFogDist) return false; } +bool CStaticFunctionDefinitions::GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance) +{ + if (g_pGame->HasGrassDrawDistance()) + { + g_pGame->GetGrassDrawDistance(fCloseDistance, fFarDistance); + return true; + } + + return false; +} + bool CStaticFunctionDefinitions::GetAircraftMaxHeight(float& fMaxHeight) { fMaxHeight = g_pGame->GetAircraftMaxHeight(); @@ -10870,6 +10881,19 @@ bool CStaticFunctionDefinitions::SetFogDistance(float fFogDist) return true; } +bool CStaticFunctionDefinitions::SetGrassDrawDistance(float fCloseDistance, float fFarDistance) +{ + g_pGame->SetGrassDrawDistance(fCloseDistance, fFarDistance); + g_pGame->SetHasGrassDrawDistance(true); + + CBitStream BitStream; + BitStream.pBitStream->Write(fCloseDistance); + BitStream.pBitStream->Write(fFarDistance); + m_pPlayerManager->BroadcastOnlyJoined(CLuaPacket(SET_GRASS_DRAW_DISTANCE, *BitStream.pBitStream)); + + return true; +} + bool CStaticFunctionDefinitions::SetAircraftMaxHeight(float fMaxHeight) { g_pGame->SetAircraftMaxHeight(fMaxHeight); @@ -10962,6 +10986,16 @@ bool CStaticFunctionDefinitions::ResetFogDistance() return true; } +bool CStaticFunctionDefinitions::ResetGrassDrawDistance() +{ + g_pGame->SetHasGrassDrawDistance(false); + + CBitStream BitStream; + m_pPlayerManager->BroadcastOnlyJoined(CLuaPacket(RESET_GRASS_DRAW_DISTANCE, *BitStream.pBitStream)); + + return true; +} + bool CStaticFunctionDefinitions::RemoveWorldModel(unsigned short usModel, float fRadius, const CVector& vecPosition, char cInterior) { g_pGame->GetBuildingRemovalManager()->CreateBuildingRemoval(usModel, fRadius, vecPosition, cInterior); diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h index 388f38b4439..f1a871c1970 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -605,6 +605,7 @@ class CStaticFunctionDefinitions static bool GetWindVelocity(float& fVelX, float& fVelY, float& fVelZ); static bool GetFarClipDistance(float& fFarClip); static bool GetFogDistance(float& fFogDist); + static bool GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance); static bool GetAircraftMaxHeight(float& fMaxHeight); static bool GetOcclusionsEnabled(bool& bEnabled); static bool GetMoonSize(int& iSize); @@ -644,6 +645,7 @@ class CStaticFunctionDefinitions static bool SetWindVelocity(float fVelX, float fVelY, float fVelZ); static bool SetFarClipDistance(float fFarClip); static bool SetFogDistance(float fFogDist); + static bool SetGrassDrawDistance(float fCloseDistance, float fFarDistance); static bool SetAircraftMaxHeight(float fMaxHeight); static bool SetAircraftMaxVelocity(float fVelocity); static bool SetOcclusionsEnabled(bool bEnabled); @@ -653,6 +655,7 @@ class CStaticFunctionDefinitions static bool ResetWindVelocity(); static bool ResetFarClipDistance(); static bool ResetFogDistance(); + static bool ResetGrassDrawDistance(); static bool RemoveWorldModel(unsigned short usModel, float fRadius, const CVector& vecPosition, char cInterior); static bool RestoreWorldModel(unsigned short usModel, float fRadius, const CVector& vecPosition, char cInterior); static bool RestoreAllWorldModels(); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp index 181798114c7..ab3b2957eca 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp @@ -93,7 +93,12 @@ void CLuaWorldDefs::LoadFunctions() {"isGarageOpen", isGarageOpen}, {"isGlitchEnabled", isGlitchEnabled}, {"isWorldSpecialPropertyEnabled", ArgumentParserWarn}, - {"areTrafficLightsLocked", areTrafficLightsLocked}}; + {"areTrafficLightsLocked", areTrafficLightsLocked}, + + // Grass draw distance functions + {"getGrassDrawDistance", ArgumentParser}, + {"setGrassDrawDistance", ArgumentParser}, + {"resetGrassDrawDistance", ArgumentParser}}; // Add functions for (const auto& [name, func] : functions) @@ -797,6 +802,17 @@ int CLuaWorldDefs::getFogDistance(lua_State* luaVM) return 1; } +std::variant, bool> CLuaWorldDefs::GetGrassDrawDistance() +{ + float fCloseDistance, fFarDistance; + bool bSuccess = CStaticFunctionDefinitions::GetGrassDrawDistance(fCloseDistance, fFarDistance); + + if (bSuccess) + return std::make_tuple(fCloseDistance, fFarDistance); + + return false; +} + int CLuaWorldDefs::setInteriorSoundsEnabled(lua_State* luaVM) { CScriptArgReader argStream(luaVM); @@ -983,6 +999,11 @@ int CLuaWorldDefs::setFogDistance(lua_State* luaVM) return 1; } +bool CLuaWorldDefs::SetGrassDrawDistance(float closeDistance, float farDistance) +{ + return CStaticFunctionDefinitions::SetGrassDrawDistance(closeDistance, farDistance); +} + int CLuaWorldDefs::resetRainLevel(lua_State* luaVM) { if (CStaticFunctionDefinitions::ResetRainLevel()) @@ -1060,6 +1081,11 @@ int CLuaWorldDefs::resetFogDistance(lua_State* luaVM) return 1; } +bool CLuaWorldDefs::ResetGrassDrawDistance() +{ + return CStaticFunctionDefinitions::ResetGrassDrawDistance(); +} + int CLuaWorldDefs::RemoveWorldModel(lua_State* luaVM) { CScriptArgReader argStream(luaVM); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h index 49032579b38..0cc053578c1 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h @@ -96,4 +96,8 @@ class CLuaWorldDefs : public CLuaDefs LUA_DECLARE(resetMoonSize); static void ResetWorldProperties(std::optional resetSpecialWorldProperties, std::optional resetWorldProperties, std::optional resetWeatherProperties, std::optional resetLODs, std::optional resetSounds, std::optional resetGlitches, std::optional resetJetpackWeapons) noexcept; + + static bool SetGrassDrawDistance(float closeDistance, float farDistance); + static std::variant, bool> GetGrassDrawDistance(); + static bool ResetGrassDrawDistance(); }; diff --git a/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp b/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp index aceac1b129f..7f7041587bc 100644 --- a/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp @@ -28,6 +28,7 @@ CMapInfoPacket::CMapInfoPacket(unsigned char ucWeather, unsigned char ucWeatherB unsigned char ucSunCoreR, unsigned char ucSunCoreG, unsigned char ucSunCoreB, unsigned char ucSunCoronaR, unsigned char ucSunCoronaG, unsigned char ucSunCoronaB, bool bOverrideWindVelocity, float fWindVelX, float fWindVelY, float fWindVelZ, bool bOverrideFarClipDistance, float fFarClip, bool bOverrideFogDistance, float fFogDistance, + bool bOverrideGrassDrawDistance, float fGrassCloseDistance, float fGrassFarDistance, float fAircraftMaxHeight, float fAircraftMaxVelocity, bool bOverrideMoonSize, int iMoonSize) { m_ucWeather = ucWeather; @@ -80,6 +81,9 @@ CMapInfoPacket::CMapInfoPacket(unsigned char ucWeather, unsigned char ucWeatherB m_fFarClip = fFarClip; m_bOverrideFogDistance = bOverrideFogDistance; m_fFogDistance = fFogDistance; + m_bOverrideGrassDrawDistance = bOverrideGrassDrawDistance; + m_fGrassCloseDistance = fGrassCloseDistance; + m_fGrassFarDistance = fGrassFarDistance; m_fAircraftMaxHeight = fAircraftMaxHeight; m_fAircraftMaxVelocity = fAircraftMaxVelocity; m_bOverrideMoonSize = bOverrideMoonSize; @@ -264,6 +268,14 @@ bool CMapInfoPacket::Write(NetBitStreamInterface& BitStream) const BitStream.Write(m_fFogDistance); } + // Grass draw distance + BitStream.WriteBit(m_bOverrideGrassDrawDistance); + if (m_bOverrideGrassDrawDistance) + { + BitStream.Write(m_fGrassCloseDistance); + BitStream.Write(m_fGrassFarDistance); + } + BitStream.Write(m_fAircraftMaxHeight); BitStream.Write(m_fAircraftMaxVelocity); diff --git a/Server/mods/deathmatch/logic/packets/CMapInfoPacket.h b/Server/mods/deathmatch/logic/packets/CMapInfoPacket.h index f4583cc3c20..68b03897816 100644 --- a/Server/mods/deathmatch/logic/packets/CMapInfoPacket.h +++ b/Server/mods/deathmatch/logic/packets/CMapInfoPacket.h @@ -39,6 +39,7 @@ class CMapInfoPacket final : public CPacket unsigned char ucSunCoreB = 0, unsigned char ucSunCoronaR = 0, unsigned char ucSunCoronaG = 0, unsigned char ucSunCoronaB = 0, bool bOverrideWindVelocity = false, float fWindVelX = 0, float fWindVelY = 0, float fWindVelZ = 0, bool bOverrideFarClipDistance = false, float fFarClip = 0, bool bOverrideFogDistance = false, float fFogDistance = 0, + bool bOverrideGrassDrawDistance = false, float fGrassCloseDistance = 3.0f, float fGrassFarDistance = 60.0f, float fAircraftMaxHeight = 800, float fAircraftMaxVelocity = 1.5f, bool bOverrideMoonSize = false, int iMoonSize = 3); ePacketID GetPacketID() const { return PACKET_ID_MAP_INFO; }; @@ -93,6 +94,9 @@ class CMapInfoPacket final : public CPacket float m_fFarClip; bool m_bOverrideFogDistance; float m_fFogDistance; + bool m_bOverrideGrassDrawDistance; + float m_fGrassCloseDistance; + float m_fGrassFarDistance; float m_fAircraftMaxHeight; float m_fAircraftMaxVelocity; bool m_bOverrideMoonSize; diff --git a/Shared/sdk/net/rpc_enums.h b/Shared/sdk/net/rpc_enums.h index 84c7518bc45..620c92b053a 100644 --- a/Shared/sdk/net/rpc_enums.h +++ b/Shared/sdk/net/rpc_enums.h @@ -293,5 +293,8 @@ enum eElementRPCFunctions SET_ELEMENT_ON_FIRE, + SET_GRASS_DRAW_DISTANCE, + RESET_GRASS_DRAW_DISTANCE, + NUM_RPC_FUNCS // Add above this line }; From 360e379acceb385865bfca35a16cb143090630b4 Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Sat, 22 Nov 2025 17:01:24 +0100 Subject: [PATCH 2/7] Requested changes & fixes --- .../mods/deathmatch/logic/CPacketHandler.cpp | 6 +++--- .../logic/luadefs/CLuaWorldDefs.cpp | 12 +++++------ .../deathmatch/logic/luadefs/CLuaWorldDefs.h | 4 ++-- .../mods/deathmatch/logic/rpc/CWorldRPCs.cpp | 6 +++--- Client/multiplayer_sa/CMultiplayerSA.cpp | 16 +++++++-------- Client/multiplayer_sa/CMultiplayerSA.h | 11 +++++++--- Client/sdk/multiplayer/CMultiplayer.h | 4 ++-- Server/mods/deathmatch/logic/CGame.h | 16 +++++++-------- .../logic/CStaticFunctionDefinitions.cpp | 18 +++++++---------- .../logic/CStaticFunctionDefinitions.h | 6 +++--- .../logic/luadefs/CLuaWorldDefs.cpp | 20 +++++++++---------- .../deathmatch/logic/luadefs/CLuaWorldDefs.h | 6 +++--- .../logic/packets/CMapInfoPacket.cpp | 16 +++++++-------- 13 files changed, 70 insertions(+), 71 deletions(-) diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index ce47455d70c..44d5fe6731d 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -2550,15 +2550,15 @@ void CPacketHandler::Packet_MapInfo(NetBitStreamInterface& bitStream) // Grass draw distance bool bOverrideGrassDrawDistance = false; - float fGrassCloseDistance, fGrassFarDistance; + float grassCloseDistance, grassFarDistance; if (!bitStream.ReadBit(bOverrideGrassDrawDistance)) return; if (bOverrideGrassDrawDistance) { - if (!bitStream.Read(fGrassCloseDistance) || !bitStream.Read(fGrassFarDistance)) + if (!bitStream.Read(grassCloseDistance) || !bitStream.Read(grassFarDistance)) return; - g_pMultiplayer->SetGrassDrawDistance(fGrassCloseDistance, fGrassFarDistance); + g_pMultiplayer->SetGrassDrawDistance(grassCloseDistance, grassFarDistance); } // Aircraft max height diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp index bec10bf61ec..bc2af81b994 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp @@ -1825,21 +1825,19 @@ int CLuaWorldDefs::ResetFogDistance(lua_State* luaVM) CLuaMultiReturn CLuaWorldDefs::GetGrassDrawDistance() { - float fCloseDistance, fFarDistance; - g_pMultiplayer->GetGrassDrawDistance(fCloseDistance, fFarDistance); - return {fCloseDistance, fFarDistance}; + float closeDistance, farDistance; + g_pMultiplayer->GetGrassDrawDistance(closeDistance, farDistance); + return {closeDistance, farDistance}; } -bool CLuaWorldDefs::SetGrassDrawDistance(float closeDistance, float farDistance) +void CLuaWorldDefs::SetGrassDrawDistance(float closeDistance, float farDistance) { g_pMultiplayer->SetGrassDrawDistance(closeDistance, farDistance); - return true; } -bool CLuaWorldDefs::ResetGrassDrawDistance() +void CLuaWorldDefs::ResetGrassDrawDistance() { g_pMultiplayer->ResetGrassDrawDistance(); - return true; } int CLuaWorldDefs::GetSunColor(lua_State* luaVM) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h index abe1e23be33..1535e41dffd 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h @@ -91,8 +91,8 @@ class CLuaWorldDefs : public CLuaDefs LUA_DECLARE(SetFogDistance); LUA_DECLARE(ResetFogDistance); static CLuaMultiReturn GetGrassDrawDistance(); - static bool SetGrassDrawDistance(float closeDistance, float farDistance); - static bool ResetGrassDrawDistance(); + static void SetGrassDrawDistance(float closeDistance, float farDistance); + static void ResetGrassDrawDistance(); LUA_DECLARE(GetSunColor); LUA_DECLARE(SetSunColor); LUA_DECLARE(ResetSunColor); diff --git a/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp b/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp index 8b2356ac6d4..573a05d3ec6 100644 --- a/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp +++ b/Client/mods/deathmatch/logic/rpc/CWorldRPCs.cpp @@ -359,11 +359,11 @@ void CWorldRPCs::SetFogDistance(NetBitStreamInterface& bitStream) void CWorldRPCs::SetGrassDrawDistance(NetBitStreamInterface& bitStream) { - float fCloseDistance, fFarDistance; + float closeDistance, farDistance; - if (bitStream.Read(fCloseDistance) && bitStream.Read(fFarDistance)) + if (bitStream.Read(closeDistance) && bitStream.Read(farDistance)) { - g_pMultiplayer->SetGrassDrawDistance(fCloseDistance, fFarDistance); + g_pMultiplayer->SetGrassDrawDistance(closeDistance, farDistance); } } diff --git a/Client/multiplayer_sa/CMultiplayerSA.cpp b/Client/multiplayer_sa/CMultiplayerSA.cpp index 41bb631907d..2796bd4749f 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA.cpp @@ -2064,22 +2064,22 @@ void CMultiplayerSA::RestoreFogDistance() } } -void CMultiplayerSA::SetGrassDrawDistance(float fCloseDistance, float fFarDistance) +void CMultiplayerSA::SetGrassDrawDistance(float closeDistance, float farDistance) { - MemPutFast(0xC02DBC, fCloseDistance); - MemPutFast(0x8D132C, fFarDistance); + MemPutFast(VAR_CGrassCloseDist, closeDistance); + MemPutFast(VAR_CGrassFarDist, farDistance); } -void CMultiplayerSA::GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance) const +void CMultiplayerSA::GetGrassDrawDistance(float& closeDistance, float& farDistance) const { - fCloseDistance = *(float*)0xC02DBC; - fFarDistance = *(float*)0x8D132C; + closeDistance = *(float*)VAR_CGrassCloseDist; + farDistance = *(float*)VAR_CGrassFarDist; } void CMultiplayerSA::ResetGrassDrawDistance() { - MemPutFast(0xC02DBC, 3.0f); - MemPutFast(0x8D132C, 60.0f); + MemPutFast(VAR_CGrassCloseDist, DEFAULT_GRASS_CLOSE_DISTANCE); + MemPutFast(VAR_CGrassFarDist, DEFAULT_GRASS_FAR_DISTANCE); } void CMultiplayerSA::GetSunColor(unsigned char& ucCoreRed, unsigned char& ucCoreGreen, unsigned char& ucCoreBlue, unsigned char& ucCoronaRed, diff --git a/Client/multiplayer_sa/CMultiplayerSA.h b/Client/multiplayer_sa/CMultiplayerSA.h index c97d2f61660..376bf850342 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.h +++ b/Client/multiplayer_sa/CMultiplayerSA.h @@ -21,6 +21,11 @@ class CRemoteDataSA; #define DEFAULT_NEAR_CLIP_DISTANCE ( 0.3f ) #define DEFAULT_SHADOWS_OFFSET ( 0.013f ) // GTA default = 0.06f +#define DEFAULT_GRASS_CLOSE_DISTANCE ( 3.0f ) +#define DEFAULT_GRASS_FAR_DISTANCE ( 60.0f ) + +#define VAR_CGrassCloseDist 0xC02DBC +#define VAR_CGrassFarDist 0x8D132C enum eRadioStationID { @@ -192,9 +197,9 @@ void InitHooks(); float GetFogDistance(); void SetFogDistance(float fDistance); void RestoreFogDistance(); - void SetGrassDrawDistance(float fCloseDistance, float fFarDistance); - void GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance) const; - void ResetGrassDrawDistance(); + void SetGrassDrawDistance(float closeDistance, float farDistance) override; + void GetGrassDrawDistance(float& closeDistance, float& farDistance) const override; + void ResetGrassDrawDistance() override; void GetSunColor(unsigned char& ucCoreRed, unsigned char& ucCoreGreen, unsigned char& ucCoreBlue, unsigned char& ucCoronaRed, unsigned char& ucCoronaGreen, unsigned char& ucCoronaBlue); void SetSunColor(unsigned char ucCoreRed, unsigned char ucCoreGreen, unsigned char ucCoreBlue, unsigned char ucCoronaRed, unsigned char ucCoronaGreen, diff --git a/Client/sdk/multiplayer/CMultiplayer.h b/Client/sdk/multiplayer/CMultiplayer.h index 9f47ddd8d3b..dd0319bdccc 100644 --- a/Client/sdk/multiplayer/CMultiplayer.h +++ b/Client/sdk/multiplayer/CMultiplayer.h @@ -299,8 +299,8 @@ class CMultiplayer virtual void SetFogDistance(float fDistance) = 0; virtual float GetFogDistance() = 0; virtual void RestoreFogDistance() = 0; - virtual void SetGrassDrawDistance(float fCloseDistance, float fFarDistance) = 0; - virtual void GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance) const = 0; + virtual void SetGrassDrawDistance(float closeDistance, float farDistance) = 0; + virtual void GetGrassDrawDistance(float& closeDistance, float& farDistance) const = 0; virtual void ResetGrassDrawDistance() = 0; virtual void GetSunColor(unsigned char& ucCoreRed, unsigned char& ucCoreGreen, unsigned char& ucCoreBlue, unsigned char& ucCoronaRed, unsigned char& ucCoronaGreen, unsigned char& ucCoronaBlue) = 0; diff --git a/Server/mods/deathmatch/logic/CGame.h b/Server/mods/deathmatch/logic/CGame.h index fa24aa42781..8757db55168 100644 --- a/Server/mods/deathmatch/logic/CGame.h +++ b/Server/mods/deathmatch/logic/CGame.h @@ -404,18 +404,18 @@ class CGame float GetFogDistance() { return m_fFogDistance; } void SetFogDistance(float& fFogDistance) { m_fFogDistance = fFogDistance; } - bool HasGrassDrawDistance() { return m_bOverrideGrassDrawDistance; } - void SetHasGrassDrawDistance(bool bOverrideGrassDrawDistance) { m_bOverrideGrassDrawDistance = bOverrideGrassDrawDistance; } + bool HasGrassDrawDistance() const noexcept { return m_bOverrideGrassDrawDistance; } + void SetHasGrassDrawDistance(bool bOverrideGrassDrawDistance) noexcept { m_bOverrideGrassDrawDistance = bOverrideGrassDrawDistance; } - void GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance) + void GetGrassDrawDistance(float& closeDistance, float& farDistance) const noexcept { - fCloseDistance = m_fGrassCloseDistance; - fFarDistance = m_fGrassFarDistance; + closeDistance = m_fGrassCloseDistance; + farDistance = m_fGrassFarDistance; } - void SetGrassDrawDistance(float fCloseDistance, float fFarDistance) + void SetGrassDrawDistance(float closeDistance, float farDistance) noexcept { - m_fGrassCloseDistance = fCloseDistance; - m_fGrassFarDistance = fFarDistance; + m_fGrassCloseDistance = closeDistance; + m_fGrassFarDistance = farDistance; } float GetAircraftMaxHeight() { return m_fAircraftMaxHeight; } diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp index 880358a3000..db163ed26e7 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp @@ -10686,11 +10686,11 @@ bool CStaticFunctionDefinitions::GetFogDistance(float& fFogDist) return false; } -bool CStaticFunctionDefinitions::GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance) +bool CStaticFunctionDefinitions::GetGrassDrawDistance(float& closeDistance, float& farDistance) { if (g_pGame->HasGrassDrawDistance()) { - g_pGame->GetGrassDrawDistance(fCloseDistance, fFarDistance); + g_pGame->GetGrassDrawDistance(closeDistance, farDistance); return true; } @@ -10881,17 +10881,15 @@ bool CStaticFunctionDefinitions::SetFogDistance(float fFogDist) return true; } -bool CStaticFunctionDefinitions::SetGrassDrawDistance(float fCloseDistance, float fFarDistance) +void CStaticFunctionDefinitions::SetGrassDrawDistance(float closeDistance, float farDistance) { - g_pGame->SetGrassDrawDistance(fCloseDistance, fFarDistance); + g_pGame->SetGrassDrawDistance(closeDistance, farDistance); g_pGame->SetHasGrassDrawDistance(true); CBitStream BitStream; - BitStream.pBitStream->Write(fCloseDistance); - BitStream.pBitStream->Write(fFarDistance); + BitStream.pBitStream->Write(closeDistance); + BitStream.pBitStream->Write(farDistance); m_pPlayerManager->BroadcastOnlyJoined(CLuaPacket(SET_GRASS_DRAW_DISTANCE, *BitStream.pBitStream)); - - return true; } bool CStaticFunctionDefinitions::SetAircraftMaxHeight(float fMaxHeight) @@ -10986,14 +10984,12 @@ bool CStaticFunctionDefinitions::ResetFogDistance() return true; } -bool CStaticFunctionDefinitions::ResetGrassDrawDistance() +void CStaticFunctionDefinitions::ResetGrassDrawDistance() { g_pGame->SetHasGrassDrawDistance(false); CBitStream BitStream; m_pPlayerManager->BroadcastOnlyJoined(CLuaPacket(RESET_GRASS_DRAW_DISTANCE, *BitStream.pBitStream)); - - return true; } bool CStaticFunctionDefinitions::RemoveWorldModel(unsigned short usModel, float fRadius, const CVector& vecPosition, char cInterior) diff --git a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h index f1a871c1970..05f49030064 100644 --- a/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h +++ b/Server/mods/deathmatch/logic/CStaticFunctionDefinitions.h @@ -605,7 +605,7 @@ class CStaticFunctionDefinitions static bool GetWindVelocity(float& fVelX, float& fVelY, float& fVelZ); static bool GetFarClipDistance(float& fFarClip); static bool GetFogDistance(float& fFogDist); - static bool GetGrassDrawDistance(float& fCloseDistance, float& fFarDistance); + static bool GetGrassDrawDistance(float& closeDistance, float& farDistance); static bool GetAircraftMaxHeight(float& fMaxHeight); static bool GetOcclusionsEnabled(bool& bEnabled); static bool GetMoonSize(int& iSize); @@ -645,7 +645,7 @@ class CStaticFunctionDefinitions static bool SetWindVelocity(float fVelX, float fVelY, float fVelZ); static bool SetFarClipDistance(float fFarClip); static bool SetFogDistance(float fFogDist); - static bool SetGrassDrawDistance(float fCloseDistance, float fFarDistance); + static void SetGrassDrawDistance(float closeDistance, float farDistance); static bool SetAircraftMaxHeight(float fMaxHeight); static bool SetAircraftMaxVelocity(float fVelocity); static bool SetOcclusionsEnabled(bool bEnabled); @@ -655,7 +655,7 @@ class CStaticFunctionDefinitions static bool ResetWindVelocity(); static bool ResetFarClipDistance(); static bool ResetFogDistance(); - static bool ResetGrassDrawDistance(); + static void ResetGrassDrawDistance(); static bool RemoveWorldModel(unsigned short usModel, float fRadius, const CVector& vecPosition, char cInterior); static bool RestoreWorldModel(unsigned short usModel, float fRadius, const CVector& vecPosition, char cInterior); static bool RestoreAllWorldModels(); diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp index ab3b2957eca..787ce4e7c0e 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp @@ -802,15 +802,15 @@ int CLuaWorldDefs::getFogDistance(lua_State* luaVM) return 1; } -std::variant, bool> CLuaWorldDefs::GetGrassDrawDistance() +CLuaMultiReturn CLuaWorldDefs::GetGrassDrawDistance() { - float fCloseDistance, fFarDistance; - bool bSuccess = CStaticFunctionDefinitions::GetGrassDrawDistance(fCloseDistance, fFarDistance); + float closeDistance, farDistance; + bool bSuccess = CStaticFunctionDefinitions::GetGrassDrawDistance(closeDistance, farDistance); if (bSuccess) - return std::make_tuple(fCloseDistance, fFarDistance); - - return false; + return {closeDistance, farDistance}; + + return {}; } int CLuaWorldDefs::setInteriorSoundsEnabled(lua_State* luaVM) @@ -999,9 +999,9 @@ int CLuaWorldDefs::setFogDistance(lua_State* luaVM) return 1; } -bool CLuaWorldDefs::SetGrassDrawDistance(float closeDistance, float farDistance) +void CLuaWorldDefs::SetGrassDrawDistance(float closeDistance, float farDistance) { - return CStaticFunctionDefinitions::SetGrassDrawDistance(closeDistance, farDistance); + CStaticFunctionDefinitions::SetGrassDrawDistance(closeDistance, farDistance); } int CLuaWorldDefs::resetRainLevel(lua_State* luaVM) @@ -1081,9 +1081,9 @@ int CLuaWorldDefs::resetFogDistance(lua_State* luaVM) return 1; } -bool CLuaWorldDefs::ResetGrassDrawDistance() +void CLuaWorldDefs::ResetGrassDrawDistance() { - return CStaticFunctionDefinitions::ResetGrassDrawDistance(); + CStaticFunctionDefinitions::ResetGrassDrawDistance(); } int CLuaWorldDefs::RemoveWorldModel(lua_State* luaVM) diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h index 0cc053578c1..86d9ec00e8a 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h @@ -97,7 +97,7 @@ class CLuaWorldDefs : public CLuaDefs static void ResetWorldProperties(std::optional resetSpecialWorldProperties, std::optional resetWorldProperties, std::optional resetWeatherProperties, std::optional resetLODs, std::optional resetSounds, std::optional resetGlitches, std::optional resetJetpackWeapons) noexcept; - static bool SetGrassDrawDistance(float closeDistance, float farDistance); - static std::variant, bool> GetGrassDrawDistance(); - static bool ResetGrassDrawDistance(); + static void SetGrassDrawDistance(float closeDistance, float farDistance); + static CLuaMultiReturn GetGrassDrawDistance(); + static void ResetGrassDrawDistance(); }; diff --git a/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp b/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp index 7f7041587bc..48ea78ea710 100644 --- a/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp @@ -268,14 +268,6 @@ bool CMapInfoPacket::Write(NetBitStreamInterface& BitStream) const BitStream.Write(m_fFogDistance); } - // Grass draw distance - BitStream.WriteBit(m_bOverrideGrassDrawDistance); - if (m_bOverrideGrassDrawDistance) - { - BitStream.Write(m_fGrassCloseDistance); - BitStream.Write(m_fGrassFarDistance); - } - BitStream.Write(m_fAircraftMaxHeight); BitStream.Write(m_fAircraftMaxVelocity); @@ -369,5 +361,13 @@ bool CMapInfoPacket::Write(NetBitStreamInterface& BitStream) const bool bOcclusionsEnabled = g_pGame->GetOcclusionsEnabled(); BitStream.WriteBit(bOcclusionsEnabled); + // Grass draw distance + BitStream.WriteBit(m_bOverrideGrassDrawDistance); + if (m_bOverrideGrassDrawDistance) + { + BitStream.Write(m_fGrassCloseDistance); + BitStream.Write(m_fGrassFarDistance); + } + return true; } From 702733041385d71434423583abc4ee7bf1321fd2 Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Sat, 22 Nov 2025 17:40:10 +0100 Subject: [PATCH 3/7] Crash fix --- .../mods/deathmatch/logic/CPacketHandler.cpp | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index 44d5fe6731d..d4dd810245a 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -2548,19 +2548,6 @@ void CPacketHandler::Packet_MapInfo(NetBitStreamInterface& bitStream) g_pMultiplayer->SetFogDistance(fFogDistance); } - // Grass draw distance - bool bOverrideGrassDrawDistance = false; - float grassCloseDistance, grassFarDistance; - if (!bitStream.ReadBit(bOverrideGrassDrawDistance)) - return; - if (bOverrideGrassDrawDistance) - { - if (!bitStream.Read(grassCloseDistance) || !bitStream.Read(grassFarDistance)) - return; - - g_pMultiplayer->SetGrassDrawDistance(grassCloseDistance, grassFarDistance); - } - // Aircraft max height float fAircraftMaxHeight = 800; if (!bitStream.Read(fAircraftMaxHeight)) @@ -2680,6 +2667,19 @@ void CPacketHandler::Packet_MapInfo(NetBitStreamInterface& bitStream) bitStream.ReadBit(bOcclusionsEnabled); g_pGame->GetWorld()->SetOcclusionsEnabled(bOcclusionsEnabled); + + // Grass draw distance + bool bOverrideGrassDrawDistance = false; + float fGrassCloseDistance, fGrassFarDistance; + if (!bitStream.ReadBit(bOverrideGrassDrawDistance)) + return; + if (bOverrideGrassDrawDistance) + { + if (!bitStream.Read(fGrassCloseDistance) || !bitStream.Read(fGrassFarDistance)) + return; + + g_pMultiplayer->SetGrassDrawDistance(fGrassCloseDistance, fGrassFarDistance); + } } void CPacketHandler::Packet_PartialPacketInfo(NetBitStreamInterface& bitStream) From e7d776350be39a5bf1f1db583af9bea976286792 Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Sat, 22 Nov 2025 17:45:21 +0100 Subject: [PATCH 4/7] Keep base gta logic for grass --- Client/core/CSettings.cpp | 3 ++ Client/multiplayer_sa/CMultiplayerSA.cpp | 44 ++++++++++++++++++++++-- Client/multiplayer_sa/CMultiplayerSA.h | 3 ++ Client/sdk/multiplayer/CMultiplayer.h | 1 + 4 files changed, 49 insertions(+), 2 deletions(-) diff --git a/Client/core/CSettings.cpp b/Client/core/CSettings.cpp index 9cd102ed38a..9f6d09a403b 100644 --- a/Client/core/CSettings.cpp +++ b/Client/core/CSettings.cpp @@ -4359,6 +4359,9 @@ void CSettings::SaveData() if (CGUIListItem* pQualitySelected = m_pComboFxQuality->GetSelectedItem()) { gameSettings->SetFXQuality((int)pQualitySelected->GetData()); + + // Update grass draw distance to reflect new FX quality setting + g_pCore->GetMultiplayer()->RefreshGrassDrawDistance(); } // Aspect ratio diff --git a/Client/multiplayer_sa/CMultiplayerSA.cpp b/Client/multiplayer_sa/CMultiplayerSA.cpp index 2796bd4749f..7244e9c5c6a 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA.cpp @@ -16,6 +16,7 @@ #include #include #include +#include class CEventDamageSAInterface; @@ -594,6 +595,8 @@ CMultiplayerSA::CMultiplayerSA() m_fMaddDoggPoolLevel = 1082.73f; m_dwLastStaticAnimGroupID = eAnimGroup::ANIM_GROUP_DEFAULT; m_dwLastStaticAnimID = eAnimID::ANIM_ID_WALK; + m_fGrassCloseDistance = DEFAULT_GRASS_CLOSE_DISTANCE; + m_fGrassFarDistance = DEFAULT_GRASS_FAR_DISTANCE; } CMultiplayerSA::~CMultiplayerSA() @@ -2066,8 +2069,24 @@ void CMultiplayerSA::RestoreFogDistance() void CMultiplayerSA::SetGrassDrawDistance(float closeDistance, float farDistance) { + // Store unscaled values + m_fGrassCloseDistance = closeDistance; + m_fGrassFarDistance = farDistance; + + // Apply FX quality scaling + // 0 = low, 1 = medium, 2 = high, 3 = very high + CGameSettings* pSettings = pGameInterface ? pGameInterface->GetSettings() : nullptr; + const unsigned int fxQuality = pSettings ? pSettings->GetFXQuality() : 2; + float actualFarDistance = farDistance; + + // Keep base GTA:SA logic + if (fxQuality < 2) + { + actualFarDistance = farDistance / 2.0f; + } + MemPutFast(VAR_CGrassCloseDist, closeDistance); - MemPutFast(VAR_CGrassFarDist, farDistance); + MemPutFast(VAR_CGrassFarDist, actualFarDistance); } void CMultiplayerSA::GetGrassDrawDistance(float& closeDistance, float& farDistance) const @@ -2078,8 +2097,29 @@ void CMultiplayerSA::GetGrassDrawDistance(float& closeDistance, float& farDistan void CMultiplayerSA::ResetGrassDrawDistance() { + // Store unscaled default values + m_fGrassCloseDistance = DEFAULT_GRASS_CLOSE_DISTANCE; + m_fGrassFarDistance = DEFAULT_GRASS_FAR_DISTANCE; + + // Apply FX quality scaling + // 0 = low, 1 = medium, 2 = high, 3 = very high + CGameSettings* pSettings = pGameInterface ? pGameInterface->GetSettings() : nullptr; + const unsigned int fxQuality = pSettings ? pSettings->GetFXQuality() : 2; + float actualFarDistance = DEFAULT_GRASS_FAR_DISTANCE; + + if (fxQuality < 2) + { + actualFarDistance = DEFAULT_GRASS_FAR_DISTANCE / 2.0f; + } + MemPutFast(VAR_CGrassCloseDist, DEFAULT_GRASS_CLOSE_DISTANCE); - MemPutFast(VAR_CGrassFarDist, DEFAULT_GRASS_FAR_DISTANCE); + MemPutFast(VAR_CGrassFarDist, actualFarDistance); +} + +void CMultiplayerSA::RefreshGrassDrawDistance() +{ + // Re-apply stored grass distances with current FX quality + SetGrassDrawDistance(m_fGrassCloseDistance, m_fGrassFarDistance); } void CMultiplayerSA::GetSunColor(unsigned char& ucCoreRed, unsigned char& ucCoreGreen, unsigned char& ucCoreBlue, unsigned char& ucCoronaRed, diff --git a/Client/multiplayer_sa/CMultiplayerSA.h b/Client/multiplayer_sa/CMultiplayerSA.h index 376bf850342..4c0cb0b9090 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.h +++ b/Client/multiplayer_sa/CMultiplayerSA.h @@ -200,6 +200,7 @@ void InitHooks(); void SetGrassDrawDistance(float closeDistance, float farDistance) override; void GetGrassDrawDistance(float& closeDistance, float& farDistance) const override; void ResetGrassDrawDistance() override; + void RefreshGrassDrawDistance() override; void GetSunColor(unsigned char& ucCoreRed, unsigned char& ucCoreGreen, unsigned char& ucCoreBlue, unsigned char& ucCoronaRed, unsigned char& ucCoronaGreen, unsigned char& ucCoronaBlue); void SetSunColor(unsigned char ucCoreRed, unsigned char ucCoreGreen, unsigned char ucCoreBlue, unsigned char ucCoronaRed, unsigned char ucCoronaGreen, @@ -399,6 +400,8 @@ void InitHooks(); eAnimID m_dwLastStaticAnimID; DWORD m_dwLastAnimArrayAddress; float m_fShadowsOffset; + float m_fGrassCloseDistance; + float m_fGrassFarDistance; bool m_isRapidVehicleStopFixEnabled{false}; diff --git a/Client/sdk/multiplayer/CMultiplayer.h b/Client/sdk/multiplayer/CMultiplayer.h index dd0319bdccc..2e56406737f 100644 --- a/Client/sdk/multiplayer/CMultiplayer.h +++ b/Client/sdk/multiplayer/CMultiplayer.h @@ -302,6 +302,7 @@ class CMultiplayer virtual void SetGrassDrawDistance(float closeDistance, float farDistance) = 0; virtual void GetGrassDrawDistance(float& closeDistance, float& farDistance) const = 0; virtual void ResetGrassDrawDistance() = 0; + virtual void RefreshGrassDrawDistance() = 0; virtual void GetSunColor(unsigned char& ucCoreRed, unsigned char& ucCoreGreen, unsigned char& ucCoreBlue, unsigned char& ucCoronaRed, unsigned char& ucCoronaGreen, unsigned char& ucCoronaBlue) = 0; virtual void SetSunColor(unsigned char ucCoreRed, unsigned char ucCoreGreen, unsigned char ucCoreBlue, unsigned char ucCoronaRed, From ffee407dd3dd9e88bffb8372b0c34f902f1b7f52 Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Sat, 22 Nov 2025 17:49:35 +0100 Subject: [PATCH 5/7] remove remaining hungarian notations & fixes --- .../mods/deathmatch/logic/CPacketHandler.cpp | 12 +++++------ Client/multiplayer_sa/CMultiplayerSA.cpp | 14 ++++++------- Client/multiplayer_sa/CMultiplayerSA.h | 4 ++-- Server/mods/deathmatch/logic/CGame.cpp | 6 +++--- Server/mods/deathmatch/logic/CGame.h | 18 ++++++++--------- Server/mods/deathmatch/logic/CMapManager.cpp | 8 ++++---- .../logic/packets/CMapInfoPacket.cpp | 20 +++++++++---------- .../deathmatch/logic/packets/CMapInfoPacket.h | 10 +++++----- 8 files changed, 46 insertions(+), 46 deletions(-) diff --git a/Client/mods/deathmatch/logic/CPacketHandler.cpp b/Client/mods/deathmatch/logic/CPacketHandler.cpp index d4dd810245a..38a6c06f57c 100644 --- a/Client/mods/deathmatch/logic/CPacketHandler.cpp +++ b/Client/mods/deathmatch/logic/CPacketHandler.cpp @@ -2669,16 +2669,16 @@ void CPacketHandler::Packet_MapInfo(NetBitStreamInterface& bitStream) g_pGame->GetWorld()->SetOcclusionsEnabled(bOcclusionsEnabled); // Grass draw distance - bool bOverrideGrassDrawDistance = false; - float fGrassCloseDistance, fGrassFarDistance; - if (!bitStream.ReadBit(bOverrideGrassDrawDistance)) + bool overrideGrassDrawDistance = false; + float grassCloseDistance, grassFarDistance; + if (!bitStream.ReadBit(overrideGrassDrawDistance)) return; - if (bOverrideGrassDrawDistance) + if (overrideGrassDrawDistance) { - if (!bitStream.Read(fGrassCloseDistance) || !bitStream.Read(fGrassFarDistance)) + if (!bitStream.Read(grassCloseDistance) || !bitStream.Read(grassFarDistance)) return; - g_pMultiplayer->SetGrassDrawDistance(fGrassCloseDistance, fGrassFarDistance); + g_pMultiplayer->SetGrassDrawDistance(grassCloseDistance, grassFarDistance); } } diff --git a/Client/multiplayer_sa/CMultiplayerSA.cpp b/Client/multiplayer_sa/CMultiplayerSA.cpp index 7244e9c5c6a..8331b3f7dfc 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA.cpp @@ -595,8 +595,8 @@ CMultiplayerSA::CMultiplayerSA() m_fMaddDoggPoolLevel = 1082.73f; m_dwLastStaticAnimGroupID = eAnimGroup::ANIM_GROUP_DEFAULT; m_dwLastStaticAnimID = eAnimID::ANIM_ID_WALK; - m_fGrassCloseDistance = DEFAULT_GRASS_CLOSE_DISTANCE; - m_fGrassFarDistance = DEFAULT_GRASS_FAR_DISTANCE; + m_grassCloseDistance = DEFAULT_GRASS_CLOSE_DISTANCE; + m_grassFarDistance = DEFAULT_GRASS_FAR_DISTANCE; } CMultiplayerSA::~CMultiplayerSA() @@ -2070,8 +2070,8 @@ void CMultiplayerSA::RestoreFogDistance() void CMultiplayerSA::SetGrassDrawDistance(float closeDistance, float farDistance) { // Store unscaled values - m_fGrassCloseDistance = closeDistance; - m_fGrassFarDistance = farDistance; + m_grassCloseDistance = closeDistance; + m_grassFarDistance = farDistance; // Apply FX quality scaling // 0 = low, 1 = medium, 2 = high, 3 = very high @@ -2098,8 +2098,8 @@ void CMultiplayerSA::GetGrassDrawDistance(float& closeDistance, float& farDistan void CMultiplayerSA::ResetGrassDrawDistance() { // Store unscaled default values - m_fGrassCloseDistance = DEFAULT_GRASS_CLOSE_DISTANCE; - m_fGrassFarDistance = DEFAULT_GRASS_FAR_DISTANCE; + m_grassCloseDistance = DEFAULT_GRASS_CLOSE_DISTANCE; + m_grassFarDistance = DEFAULT_GRASS_FAR_DISTANCE; // Apply FX quality scaling // 0 = low, 1 = medium, 2 = high, 3 = very high @@ -2119,7 +2119,7 @@ void CMultiplayerSA::ResetGrassDrawDistance() void CMultiplayerSA::RefreshGrassDrawDistance() { // Re-apply stored grass distances with current FX quality - SetGrassDrawDistance(m_fGrassCloseDistance, m_fGrassFarDistance); + SetGrassDrawDistance(m_grassCloseDistance, m_grassFarDistance); } void CMultiplayerSA::GetSunColor(unsigned char& ucCoreRed, unsigned char& ucCoreGreen, unsigned char& ucCoreBlue, unsigned char& ucCoronaRed, diff --git a/Client/multiplayer_sa/CMultiplayerSA.h b/Client/multiplayer_sa/CMultiplayerSA.h index 4c0cb0b9090..d6672c43c1a 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.h +++ b/Client/multiplayer_sa/CMultiplayerSA.h @@ -400,8 +400,8 @@ void InitHooks(); eAnimID m_dwLastStaticAnimID; DWORD m_dwLastAnimArrayAddress; float m_fShadowsOffset; - float m_fGrassCloseDistance; - float m_fGrassFarDistance; + float m_grassCloseDistance; + float m_grassFarDistance; bool m_isRapidVehicleStopFixEnabled{false}; diff --git a/Server/mods/deathmatch/logic/CGame.cpp b/Server/mods/deathmatch/logic/CGame.cpp index cd500ea1ab8..91c7d71d169 100644 --- a/Server/mods/deathmatch/logic/CGame.cpp +++ b/Server/mods/deathmatch/logic/CGame.cpp @@ -219,9 +219,9 @@ CGame::CGame() : m_FloodProtect(4, 30000, 30000) // Max of 4 connecti m_bOverrideWindVelocity = false; m_bOverrideFarClip = false; m_bOverrideFogDistance = false; - m_bOverrideGrassDrawDistance = false; - m_fGrassCloseDistance = 3.0f; - m_fGrassFarDistance = 60.0f; + m_overrideGrassDrawDistance = false; + m_grassCloseDistance = 3.0f; + m_grassFarDistance = 60.0f; m_bOverrideMoonSize = false; m_pASE = NULL; diff --git a/Server/mods/deathmatch/logic/CGame.h b/Server/mods/deathmatch/logic/CGame.h index 8757db55168..3b1c3da2f09 100644 --- a/Server/mods/deathmatch/logic/CGame.h +++ b/Server/mods/deathmatch/logic/CGame.h @@ -404,18 +404,18 @@ class CGame float GetFogDistance() { return m_fFogDistance; } void SetFogDistance(float& fFogDistance) { m_fFogDistance = fFogDistance; } - bool HasGrassDrawDistance() const noexcept { return m_bOverrideGrassDrawDistance; } - void SetHasGrassDrawDistance(bool bOverrideGrassDrawDistance) noexcept { m_bOverrideGrassDrawDistance = bOverrideGrassDrawDistance; } + bool HasGrassDrawDistance() const noexcept { return m_overrideGrassDrawDistance; } + void SetHasGrassDrawDistance(bool overrideGrassDrawDistance) noexcept { m_overrideGrassDrawDistance = overrideGrassDrawDistance; } void GetGrassDrawDistance(float& closeDistance, float& farDistance) const noexcept { - closeDistance = m_fGrassCloseDistance; - farDistance = m_fGrassFarDistance; + closeDistance = m_grassCloseDistance; + farDistance = m_grassFarDistance; } void SetGrassDrawDistance(float closeDistance, float farDistance) noexcept { - m_fGrassCloseDistance = closeDistance; - m_fGrassFarDistance = farDistance; + m_grassCloseDistance = closeDistance; + m_grassFarDistance = farDistance; } float GetAircraftMaxHeight() { return m_fAircraftMaxHeight; } @@ -654,9 +654,9 @@ class CGame bool m_bOverrideFogDistance; float m_fFogDistance; - bool m_bOverrideGrassDrawDistance; - float m_fGrassCloseDistance; - float m_fGrassFarDistance; + bool m_overrideGrassDrawDistance; + float m_grassCloseDistance; + float m_grassFarDistance; SGarageStates m_bGarageStates; diff --git a/Server/mods/deathmatch/logic/CMapManager.cpp b/Server/mods/deathmatch/logic/CMapManager.cpp index 61646c61228..a9c9762f774 100644 --- a/Server/mods/deathmatch/logic/CMapManager.cpp +++ b/Server/mods/deathmatch/logic/CMapManager.cpp @@ -520,9 +520,9 @@ void CMapManager::OnPlayerJoin(CPlayer& Player) float fFogDistance = g_pGame->GetFogDistance(); // Grass draw distance - bool bOverrideGrassDrawDistance = g_pGame->HasGrassDrawDistance(); - float fGrassCloseDistance, fGrassFarDistance; - g_pGame->GetGrassDrawDistance(fGrassCloseDistance, fGrassFarDistance); + bool overrideGrassDrawDistance = g_pGame->HasGrassDrawDistance(); + float grassCloseDistance, grassFarDistance; + g_pGame->GetGrassDrawDistance(grassCloseDistance, grassFarDistance); marker.Set("FirstBit"); @@ -533,7 +533,7 @@ void CMapManager::OnPlayerJoin(CPlayer& Player) fJetpackMaxHeight, bOverrideWaterColor, ucWaterRed, ucWaterGreen, ucWaterBlue, ucWaterAlpha, bInteriorSoundsEnabled, bOverrideRainLevel, fRainLevel, bOverrideSunSize, fSunSize, bOverrideSunColor, ucCoreR, ucCoreG, ucCoreB, ucCoronaR, ucCoronaG, ucCoronaB, bOverrideWindVelocity, fWindVelX, fWindVelY, fWindVelZ, bOverrideFarClipDistance, fFarClip, bOverrideFogDistance, - fFogDistance, bOverrideGrassDrawDistance, fGrassCloseDistance, fGrassFarDistance, fAircraftMaxHeight, fAircraftMaxVelocity, + fFogDistance, overrideGrassDrawDistance, grassCloseDistance, grassFarDistance, fAircraftMaxHeight, fAircraftMaxVelocity, bOverrideMoonSize, iMoonSize)); marker.Set("SendMapInfoPacket"); diff --git a/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp b/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp index 48ea78ea710..444ddaa5321 100644 --- a/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp +++ b/Server/mods/deathmatch/logic/packets/CMapInfoPacket.cpp @@ -27,9 +27,9 @@ CMapInfoPacket::CMapInfoPacket(unsigned char ucWeather, unsigned char ucWeatherB bool bOverrideRainLevel, float fRainLevel, bool bOverrideSunSize, float fSunSize, bool bOverrideSunColor, unsigned char ucSunCoreR, unsigned char ucSunCoreG, unsigned char ucSunCoreB, unsigned char ucSunCoronaR, unsigned char ucSunCoronaG, unsigned char ucSunCoronaB, bool bOverrideWindVelocity, float fWindVelX, float fWindVelY, - float fWindVelZ, bool bOverrideFarClipDistance, float fFarClip, bool bOverrideFogDistance, float fFogDistance, - bool bOverrideGrassDrawDistance, float fGrassCloseDistance, float fGrassFarDistance, - float fAircraftMaxHeight, float fAircraftMaxVelocity, bool bOverrideMoonSize, int iMoonSize) + float fWindVelZ, bool bOverrideFarClipDistance, float fFarClip, bool bOverrideFogDistance, float fFogDistance, float fAircraftMaxHeight, + float fAircraftMaxVelocity, bool bOverrideMoonSize, int iMoonSize, bool overrideGrassDrawDistance, float grassCloseDistance, + float grassFarDistance) { m_ucWeather = ucWeather; m_ucWeatherBlendingTo = ucWeatherBlendingTo; @@ -81,9 +81,9 @@ CMapInfoPacket::CMapInfoPacket(unsigned char ucWeather, unsigned char ucWeatherB m_fFarClip = fFarClip; m_bOverrideFogDistance = bOverrideFogDistance; m_fFogDistance = fFogDistance; - m_bOverrideGrassDrawDistance = bOverrideGrassDrawDistance; - m_fGrassCloseDistance = fGrassCloseDistance; - m_fGrassFarDistance = fGrassFarDistance; + m_overrideGrassDrawDistance = overrideGrassDrawDistance; + m_grassCloseDistance = grassCloseDistance; + m_grassFarDistance = grassFarDistance; m_fAircraftMaxHeight = fAircraftMaxHeight; m_fAircraftMaxVelocity = fAircraftMaxVelocity; m_bOverrideMoonSize = bOverrideMoonSize; @@ -362,11 +362,11 @@ bool CMapInfoPacket::Write(NetBitStreamInterface& BitStream) const BitStream.WriteBit(bOcclusionsEnabled); // Grass draw distance - BitStream.WriteBit(m_bOverrideGrassDrawDistance); - if (m_bOverrideGrassDrawDistance) + BitStream.WriteBit(m_overrideGrassDrawDistance); + if (m_overrideGrassDrawDistance) { - BitStream.Write(m_fGrassCloseDistance); - BitStream.Write(m_fGrassFarDistance); + BitStream.Write(m_grassCloseDistance); + BitStream.Write(m_grassFarDistance); } return true; diff --git a/Server/mods/deathmatch/logic/packets/CMapInfoPacket.h b/Server/mods/deathmatch/logic/packets/CMapInfoPacket.h index 68b03897816..37d33d84775 100644 --- a/Server/mods/deathmatch/logic/packets/CMapInfoPacket.h +++ b/Server/mods/deathmatch/logic/packets/CMapInfoPacket.h @@ -39,8 +39,8 @@ class CMapInfoPacket final : public CPacket unsigned char ucSunCoreB = 0, unsigned char ucSunCoronaR = 0, unsigned char ucSunCoronaG = 0, unsigned char ucSunCoronaB = 0, bool bOverrideWindVelocity = false, float fWindVelX = 0, float fWindVelY = 0, float fWindVelZ = 0, bool bOverrideFarClipDistance = false, float fFarClip = 0, bool bOverrideFogDistance = false, float fFogDistance = 0, - bool bOverrideGrassDrawDistance = false, float fGrassCloseDistance = 3.0f, float fGrassFarDistance = 60.0f, - float fAircraftMaxHeight = 800, float fAircraftMaxVelocity = 1.5f, bool bOverrideMoonSize = false, int iMoonSize = 3); + float fAircraftMaxHeight = 800, float fAircraftMaxVelocity = 1.5f, bool bOverrideMoonSize = false, int iMoonSize = 3, + bool overrideGrassDrawDistance = false, float grassCloseDistance = 3.0f, float grassFarDistance = 60.0f); ePacketID GetPacketID() const { return PACKET_ID_MAP_INFO; }; unsigned long GetFlags() const { return PACKET_HIGH_PRIORITY | PACKET_RELIABLE | PACKET_SEQUENCED; }; @@ -94,9 +94,9 @@ class CMapInfoPacket final : public CPacket float m_fFarClip; bool m_bOverrideFogDistance; float m_fFogDistance; - bool m_bOverrideGrassDrawDistance; - float m_fGrassCloseDistance; - float m_fGrassFarDistance; + bool m_overrideGrassDrawDistance; + float m_grassCloseDistance; + float m_grassFarDistance; float m_fAircraftMaxHeight; float m_fAircraftMaxVelocity; bool m_bOverrideMoonSize; From cb810812213b9a72537689f0cc61a83f0c19b836 Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Sat, 22 Nov 2025 17:54:03 +0100 Subject: [PATCH 6/7] fix --- Server/mods/deathmatch/logic/CMapManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Server/mods/deathmatch/logic/CMapManager.cpp b/Server/mods/deathmatch/logic/CMapManager.cpp index a9c9762f774..99d871bcaff 100644 --- a/Server/mods/deathmatch/logic/CMapManager.cpp +++ b/Server/mods/deathmatch/logic/CMapManager.cpp @@ -533,8 +533,8 @@ void CMapManager::OnPlayerJoin(CPlayer& Player) fJetpackMaxHeight, bOverrideWaterColor, ucWaterRed, ucWaterGreen, ucWaterBlue, ucWaterAlpha, bInteriorSoundsEnabled, bOverrideRainLevel, fRainLevel, bOverrideSunSize, fSunSize, bOverrideSunColor, ucCoreR, ucCoreG, ucCoreB, ucCoronaR, ucCoronaG, ucCoronaB, bOverrideWindVelocity, fWindVelX, fWindVelY, fWindVelZ, bOverrideFarClipDistance, fFarClip, bOverrideFogDistance, - fFogDistance, overrideGrassDrawDistance, grassCloseDistance, grassFarDistance, fAircraftMaxHeight, fAircraftMaxVelocity, - bOverrideMoonSize, iMoonSize)); + fFogDistance, fAircraftMaxHeight, fAircraftMaxVelocity, bOverrideMoonSize, iMoonSize, overrideGrassDrawDistance, grassCloseDistance, + grassFarDistance)); marker.Set("SendMapInfoPacket"); From 0130737bc1bbad9c861cbad9ec8f0db3f0799109 Mon Sep 17 00:00:00 2001 From: Xenius97 Date: Sat, 22 Nov 2025 23:21:51 +0100 Subject: [PATCH 7/7] Refactor GetGrassDrawDistance to return a variant type for improved error handling --- Client/multiplayer_sa/CMultiplayerSA.cpp | 31 +++++++------------ .../logic/luadefs/CLuaWorldDefs.cpp | 8 +++-- .../deathmatch/logic/luadefs/CLuaWorldDefs.h | 2 +- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/Client/multiplayer_sa/CMultiplayerSA.cpp b/Client/multiplayer_sa/CMultiplayerSA.cpp index 8331b3f7dfc..293eafe003d 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA.cpp @@ -2074,19 +2074,14 @@ void CMultiplayerSA::SetGrassDrawDistance(float closeDistance, float farDistance m_grassFarDistance = farDistance; // Apply FX quality scaling - // 0 = low, 1 = medium, 2 = high, 3 = very high CGameSettings* pSettings = pGameInterface ? pGameInterface->GetSettings() : nullptr; const unsigned int fxQuality = pSettings ? pSettings->GetFXQuality() : 2; - float actualFarDistance = farDistance; - - // Keep base GTA:SA logic - if (fxQuality < 2) - { - actualFarDistance = farDistance / 2.0f; - } + + if (fxQuality) + farDistance /= 2.0f; MemPutFast(VAR_CGrassCloseDist, closeDistance); - MemPutFast(VAR_CGrassFarDist, actualFarDistance); + MemPutFast(VAR_CGrassFarDist, farDistance); } void CMultiplayerSA::GetGrassDrawDistance(float& closeDistance, float& farDistance) const @@ -2100,20 +2095,18 @@ void CMultiplayerSA::ResetGrassDrawDistance() // Store unscaled default values m_grassCloseDistance = DEFAULT_GRASS_CLOSE_DISTANCE; m_grassFarDistance = DEFAULT_GRASS_FAR_DISTANCE; - + // Apply FX quality scaling - // 0 = low, 1 = medium, 2 = high, 3 = very high CGameSettings* pSettings = pGameInterface ? pGameInterface->GetSettings() : nullptr; const unsigned int fxQuality = pSettings ? pSettings->GetFXQuality() : 2; - float actualFarDistance = DEFAULT_GRASS_FAR_DISTANCE; - - if (fxQuality < 2) - { - actualFarDistance = DEFAULT_GRASS_FAR_DISTANCE / 2.0f; - } - + + float farDistance = DEFAULT_GRASS_FAR_DISTANCE; + + if (fxQuality) + farDistance /= 2.0f; + MemPutFast(VAR_CGrassCloseDist, DEFAULT_GRASS_CLOSE_DISTANCE); - MemPutFast(VAR_CGrassFarDist, actualFarDistance); + MemPutFast(VAR_CGrassFarDist, farDistance); } void CMultiplayerSA::RefreshGrassDrawDistance() diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp index 787ce4e7c0e..6011337cf61 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp +++ b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp @@ -802,15 +802,17 @@ int CLuaWorldDefs::getFogDistance(lua_State* luaVM) return 1; } -CLuaMultiReturn CLuaWorldDefs::GetGrassDrawDistance() +std::variant> CLuaWorldDefs::GetGrassDrawDistance() { float closeDistance, farDistance; bool bSuccess = CStaticFunctionDefinitions::GetGrassDrawDistance(closeDistance, farDistance); if (bSuccess) - return {closeDistance, farDistance}; + { + return CLuaMultiReturn(closeDistance, farDistance); + } - return {}; + return false; } int CLuaWorldDefs::setInteriorSoundsEnabled(lua_State* luaVM) diff --git a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h index 86d9ec00e8a..80b9b33f2be 100644 --- a/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h +++ b/Server/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h @@ -98,6 +98,6 @@ class CLuaWorldDefs : public CLuaDefs static void ResetWorldProperties(std::optional resetSpecialWorldProperties, std::optional resetWorldProperties, std::optional resetWeatherProperties, std::optional resetLODs, std::optional resetSounds, std::optional resetGlitches, std::optional resetJetpackWeapons) noexcept; static void SetGrassDrawDistance(float closeDistance, float farDistance); - static CLuaMultiReturn GetGrassDrawDistance(); + static std::variant> GetGrassDrawDistance(); static void ResetGrassDrawDistance(); };