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 7632881bad..0279709392 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 339110ff31..f53aa5af55 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 a13aca8be3..bec10bf61e 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 5668ca6dd4..abe1e23be3 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 38a15493fa..8b2356ac6d 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 5c5c4514f1..59026c2fd7 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 c7016c76f3..749602a09c 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 2d209976b3..c97d2f6166 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 e5e591ad5d..9f47ddd8d3 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 5807a7f3ed..cd500ea1ab 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 07c4f227e6..fa24aa4278 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 d62ad044f4..61646c6122 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 52695b056f..880358a300 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 388f38b443..f1a871c197 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 181798114c..ab3b2957ec 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 49032579b3..0cc053578c 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 aceac1b129..7f7041587b 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 f4583cc3c2..68b0389781 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 84c7518bc4..620c92b053 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 ce47455d70..44d5fe6731 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 bec10bf61e..bc2af81b99 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 abe1e23be3..1535e41dff 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 8b2356ac6d..573a05d3ec 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 41bb631907..2796bd4749 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 c97d2f6166..376bf85034 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 9f47ddd8d3..dd0319bdcc 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 fa24aa4278..8757db5516 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 880358a300..db163ed26e 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 f1a871c197..05f4903006 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 ab3b2957ec..787ce4e7c0 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 0cc053578c..86d9ec00e8 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 7f7041587b..48ea78ea71 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 44d5fe6731..d4dd810245 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 9cd102ed38..9f6d09a403 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 2796bd4749..7244e9c5c6 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 376bf85034..4c0cb0b909 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 dd0319bdcc..2e56406737 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 d4dd810245..38a6c06f57 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 7244e9c5c6..8331b3f7df 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 4c0cb0b909..d6672c43c1 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 cd500ea1ab..91c7d71d16 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 8757db5516..3b1c3da2f0 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 61646c6122..a9c9762f77 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 48ea78ea71..444ddaa532 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 68b0389781..37d33d8477 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 a9c9762f77..99d871bcaf 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 8331b3f7df..293eafe003 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 787ce4e7c0..6011337cf6 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 86d9ec00e8..80b9b33f2b 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(); };