From caa5c4fc2920e7b0c44acb976bf4525738b1d308 Mon Sep 17 00:00:00 2001 From: Nico <122193236+Nico8340@users.noreply.github.com> Date: Thu, 30 Jan 2025 22:31:57 +0100 Subject: [PATCH] Fix incorrect behavior of `onPlayerChangesWorldSpecialProperty` event (#3994) * Logic * Defs * Deallocate --- Client/mods/deathmatch/logic/CClientGame.cpp | 43 ++++++++----------- Client/mods/deathmatch/logic/CClientGame.h | 4 +- .../logic/luadefs/CLuaWorldDefs.cpp | 20 +++++++-- .../deathmatch/logic/luadefs/CLuaWorldDefs.h | 4 +- 4 files changed, 39 insertions(+), 32 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index e860393472..b233e578ab 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -5998,7 +5998,7 @@ bool CClientGame::IsGlitchEnabled(unsigned char ucGlitch) return ucGlitch < NUM_GLITCHES && m_Glitches[ucGlitch]; } -bool CClientGame::SetWorldSpecialProperty(WorldSpecialProperty property, bool isEnabled) noexcept +bool CClientGame::SetWorldSpecialProperty(const WorldSpecialProperty property, const bool enabled) noexcept { switch (property) { @@ -6006,66 +6006,58 @@ bool CClientGame::SetWorldSpecialProperty(WorldSpecialProperty property, bool is case WorldSpecialProperty::AIRCARS: case WorldSpecialProperty::EXTRABUNNY: case WorldSpecialProperty::EXTRAJUMP: - g_pGame->SetCheatEnabled(EnumToString(property), isEnabled); + g_pGame->SetCheatEnabled(EnumToString(property), enabled); break; case WorldSpecialProperty::RANDOMFOLIAGE: - g_pGame->SetRandomFoliageEnabled(isEnabled); + g_pGame->SetRandomFoliageEnabled(enabled); break; case WorldSpecialProperty::SNIPERMOON: - g_pGame->SetMoonEasterEggEnabled(isEnabled); + g_pGame->SetMoonEasterEggEnabled(enabled); break; case WorldSpecialProperty::EXTRAAIRRESISTANCE: - g_pGame->SetExtraAirResistanceEnabled(isEnabled); + g_pGame->SetExtraAirResistanceEnabled(enabled); break; case WorldSpecialProperty::UNDERWORLDWARP: - g_pGame->SetUnderWorldWarpEnabled(isEnabled); + g_pGame->SetUnderWorldWarpEnabled(enabled); break; case WorldSpecialProperty::VEHICLESUNGLARE: - g_pGame->SetVehicleSunGlareEnabled(isEnabled); + g_pGame->SetVehicleSunGlareEnabled(enabled); break; case WorldSpecialProperty::CORONAZTEST: - g_pGame->SetCoronaZTestEnabled(isEnabled); + g_pGame->SetCoronaZTestEnabled(enabled); break; case WorldSpecialProperty::WATERCREATURES: - g_pGame->SetWaterCreaturesEnabled(isEnabled); + g_pGame->SetWaterCreaturesEnabled(enabled); break; case WorldSpecialProperty::BURNFLIPPEDCARS: - g_pGame->SetBurnFlippedCarsEnabled(isEnabled); + g_pGame->SetBurnFlippedCarsEnabled(enabled); break; case WorldSpecialProperty::FIREBALLDESTRUCT: - g_pGame->SetFireballDestructEnabled(isEnabled); + g_pGame->SetFireballDestructEnabled(enabled); break; case WorldSpecialProperty::EXTENDEDWATERCANNONS: - g_pGame->SetExtendedWaterCannonsEnabled(isEnabled); + g_pGame->SetExtendedWaterCannonsEnabled(enabled); break; case WorldSpecialProperty::ROADSIGNSTEXT: - g_pGame->SetRoadSignsTextEnabled(isEnabled); + g_pGame->SetRoadSignsTextEnabled(enabled); break; case WorldSpecialProperty::TUNNELWEATHERBLEND: - g_pGame->SetTunnelWeatherBlendEnabled(isEnabled); + g_pGame->SetTunnelWeatherBlendEnabled(enabled); break; case WorldSpecialProperty::IGNOREFIRESTATE: - g_pGame->SetIgnoreFireStateEnabled(isEnabled); + g_pGame->SetIgnoreFireStateEnabled(enabled); break; case WorldSpecialProperty::FLYINGCOMPONENTS: - m_pVehicleManager->SetSpawnFlyingComponentEnabled(isEnabled); + m_pVehicleManager->SetSpawnFlyingComponentEnabled(enabled); break; default: return false; } - if (g_pNet->CanServerBitStream(eBitStreamVersion::WorldSpecialPropertyEvent)) { - NetBitStreamInterface* stream = g_pNet->AllocateNetBitStream(); - stream->WriteString(EnumToString(property)); - stream->WriteBit(isEnabled); - g_pNet->SendPacket(PACKET_ID_PLAYER_WORLD_SPECIAL_PROPERTY, stream, PACKET_PRIORITY_HIGH, PACKET_RELIABILITY_RELIABLE_ORDERED); - g_pNet->DeallocateNetBitStream(stream); - } - return true; } -bool CClientGame::IsWorldSpecialProperty(WorldSpecialProperty property) +bool CClientGame::IsWorldSpecialProperty(const WorldSpecialProperty property) { switch (property) { @@ -6103,6 +6095,7 @@ bool CClientGame::IsWorldSpecialProperty(WorldSpecialProperty property) case WorldSpecialProperty::FLYINGCOMPONENTS: return m_pVehicleManager->IsSpawnFlyingComponentEnabled(); } + return false; } diff --git a/Client/mods/deathmatch/logic/CClientGame.h b/Client/mods/deathmatch/logic/CClientGame.h index b5819d8ee2..401cf5dee5 100644 --- a/Client/mods/deathmatch/logic/CClientGame.h +++ b/Client/mods/deathmatch/logic/CClientGame.h @@ -410,8 +410,8 @@ class CClientGame bool SetGlitchEnabled(unsigned char cGlitch, bool bEnabled); bool IsGlitchEnabled(unsigned char cGlitch); - bool SetWorldSpecialProperty(WorldSpecialProperty property, bool isEnabled) noexcept; - bool IsWorldSpecialProperty(WorldSpecialProperty property); + bool SetWorldSpecialProperty(const WorldSpecialProperty property, const bool enabled) noexcept; + bool IsWorldSpecialProperty(const WorldSpecialProperty property); bool SetCloudsEnabled(bool bEnabled); bool GetCloudsEnabled(); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp index 32d838a332..5f93d1fbc2 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.cpp @@ -1266,14 +1266,28 @@ int CLuaWorldDefs::SetOcclusionsEnabled(lua_State* luaVM) return 1; } -bool CLuaWorldDefs::IsWorldSpecialPropertyEnabled(WorldSpecialProperty property) +bool CLuaWorldDefs::IsWorldSpecialPropertyEnabled(const WorldSpecialProperty property) noexcept { return m_pClientGame->IsWorldSpecialProperty(property); } -bool CLuaWorldDefs::SetWorldSpecialPropertyEnabled(WorldSpecialProperty property, bool isEnabled) +bool CLuaWorldDefs::SetWorldSpecialPropertyEnabled(const WorldSpecialProperty property, const bool enabled) noexcept { - return m_pClientGame->SetWorldSpecialProperty(property, isEnabled); + if (!m_pClientGame->SetWorldSpecialProperty(property, enabled)) + return false; + + if (!g_pNet->CanServerBitStream(eBitStreamVersion::WorldSpecialPropertyEvent)) + return true; + + if (auto stream = g_pNet->AllocateNetBitStream()) + { + stream->WriteString(EnumToString(property)); + stream->WriteBit(enabled); + g_pNet->SendPacket(PACKET_ID_PLAYER_WORLD_SPECIAL_PROPERTY, stream, PACKET_PRIORITY_HIGH, PACKET_RELIABILITY_RELIABLE_ORDERED); + g_pNet->DeallocateNetBitStream(stream); + } + + return true; } int CLuaWorldDefs::SetCloudsEnabled(lua_State* luaVM) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h index 7cf1eb91d7..1eb5e6da30 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaWorldDefs.h @@ -34,7 +34,7 @@ class CLuaWorldDefs : public CLuaDefs LUA_DECLARE(GetGaragePosition); LUA_DECLARE(GetGarageSize); LUA_DECLARE(GetGarageBoundingBox); - static bool IsWorldSpecialPropertyEnabled(WorldSpecialProperty property); + static bool IsWorldSpecialPropertyEnabled(const WorldSpecialProperty property) noexcept; LUA_DECLARE(GetBlurLevel); LUA_DECLARE(GetTrafficLightState); LUA_DECLARE(AreTrafficLightsLocked); @@ -57,7 +57,7 @@ class CLuaWorldDefs : public CLuaDefs LUA_DECLARE(SetMinuteDuration); LUA_DECLARE(SetWaveHeight); LUA_DECLARE(SetGarageOpen); - static bool SetWorldSpecialPropertyEnabled(WorldSpecialProperty property, bool isEnabled); + static bool SetWorldSpecialPropertyEnabled(const WorldSpecialProperty property, const bool enabled) noexcept; LUA_DECLARE(SetBlurLevel); LUA_DECLARE(ResetBlurLevel); LUA_DECLARE(SetJetpackMaxHeight);