From 2c3ac63d58464d3c9376f7f985065471dfcced5a Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 12 Jun 2024 02:43:07 +0200 Subject: [PATCH 1/8] underwater effect functions --- .../logic/luadefs/CLuaCameraDefs.cpp | 60 +++++++++++++++++++ .../deathmatch/logic/luadefs/CLuaCameraDefs.h | 8 +++ Client/multiplayer_sa/CMultiplayerSA.h | 6 ++ .../CMultiplayerSA_Postprocess.cpp | 52 +++++++++++++++- Client/sdk/multiplayer/CMultiplayer.h | 6 ++ 5 files changed, 131 insertions(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp index b4ef233a9a9..4ed002fbaad 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp @@ -29,6 +29,8 @@ void CLuaCameraDefs::LoadFunctions() {"getCameraGoggleEffect", ArgumentParserWarn}, {"getCameraFieldOfView", GetCameraFieldOfView}, {"getCameraDrunkLevel", ArgumentParserWarn}, + {"getCameraUnderwaterEffect", ArgumentParser}, + {"getCameraUnderwaterDarkness", ArgumentParser}, // Cam set funcs {"setCameraMatrix", SetCameraMatrix}, @@ -41,6 +43,11 @@ void CLuaCameraDefs::LoadFunctions() {"setCameraViewMode", ArgumentParserWarn}, {"setCameraGoggleEffect", SetCameraGoggleEffect}, {"setCameraDrunkLevel", ArgumentParserWarn}, + {"setCameraUnderwaterEffectEnabled", ArgumentParser}, + {"setCameraUnderwaterEffectSpeed", ArgumentParser}, + {"setCameraUnderwaterDarkness", ArgumentParser}, + {"resetCameraUnderwaterEffect", ArgumentParser}, + {"resetCameraUnderwaterDarkness", ArgumentParser}, }; // Add functions @@ -68,6 +75,8 @@ void CLuaCameraDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "getFarClipDistance", "getFarClipDistance"); lua_classfunction(luaVM, "getNearClipDistance", "getNearClipDistance"); lua_classfunction(luaVM, "getType", ArgumentParser); + lua_classfunction(luaVM, "getUnderwaterEffect", ArgumentParser); + lua_classfunction(luaVM, "getUnderwaterDarkness", ArgumentParser); lua_classfunction(luaVM, "setPosition", OOP_SetCameraPosition); lua_classfunction(luaVM, "setRotation", OOP_SetCameraRotation); @@ -80,6 +89,11 @@ void CLuaCameraDefs::AddClass(lua_State* luaVM) lua_classfunction(luaVM, "setClip", "setCameraClip"); lua_classfunction(luaVM, "setFarClipDistance", "setFarClipDistance"); lua_classfunction(luaVM, "setNearClipDistance", "setNearClipDistance"); + lua_classfunction(luaVM, "setUnderwaterEffectEnabled", ArgumentParser); + lua_classfunction(luaVM, "setUnderwaterEffectSpeed", ArgumentParser); + lua_classfunction(luaVM, "setUnderwaterDarkness", ArgumentParser); + lua_classfunction(luaVM, "resetUnderwaterEffect", ArgumentParser); + lua_classfunction(luaVM, "resetUnderwaterDarkness", ArgumentParser); lua_classvariable(luaVM, "interior", "setCameraInterior", "getCameraInterior"); lua_classvariable(luaVM, "target", "setCameraTarget", "getCameraTarget"); @@ -162,6 +176,16 @@ unsigned char CLuaCameraDefs::GetCameraDrunkLevel() return g_pGame->GetPlayerInfo()->GetCamDrunkLevel(); } +CLuaMultiReturn CLuaCameraDefs::GetCameraUnderwaterEffect() +{ + return g_pMultiplayer->GetUnderwaterEffect(); +} + +CLuaMultiReturn CLuaCameraDefs::GetCameraUnderwaterDarkness() +{ + return g_pMultiplayer->GetUnderwaterDarkness(); +} + int CLuaCameraDefs::SetCameraMatrix(lua_State* luaVM) { CVector vecPosition; @@ -464,6 +488,42 @@ int CLuaCameraDefs::SetCameraGoggleEffect(lua_State* luaVM) return 1; } +bool CLuaCameraDefs::SetCameraUnderwaterEffectEnabled(bool bEnabled) +{ + g_pMultiplayer->SetUnderwaterEffectEnabled(bEnabled); + + return true; +} + +bool CLuaCameraDefs::SetCameraUnderwaterEffectSpeed(float fSpeed, float fFrequency) +{ + g_pMultiplayer->SetUnderwaterEffectSpeed(fSpeed, fFrequency); + + return true; +} + +bool CLuaCameraDefs::SetCameraUnderwaterDarkness(bool bEnabled, std::optional fFullDarknessDepth) +{ + g_pMultiplayer->SetUnderwaterDarkness(bEnabled, fFullDarknessDepth.value_or(90.0f)); + + return true; +} + +bool CLuaCameraDefs::ResetCameraUnderwaterEffect() +{ + g_pMultiplayer->SetUnderwaterEffectEnabled(false); + g_pMultiplayer->SetUnderwaterEffectSpeed(0.0015f, 0.04f); + + return true; +} + +bool CLuaCameraDefs::ResetCameraUnderwaterDarkness() +{ + g_pMultiplayer->SetUnderwaterDarkness(true, 90.0f); + + return true; +} + bool CLuaCameraDefs::SetCameraDrunkLevel(short drunkLevel) { if (drunkLevel < 0 || drunkLevel > 255) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h index 9fd1fe030e0..e7484a07c54 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h @@ -31,6 +31,8 @@ class CLuaCameraDefs : public CLuaDefs static std::string GetCameraGoggleEffect(); LUA_DECLARE(GetCameraFieldOfView); static unsigned char GetCameraDrunkLevel(); + static CLuaMultiReturn GetCameraUnderwaterEffect(); + static CLuaMultiReturn GetCameraUnderwaterDarkness(); // Cam set funcs LUA_DECLARE(SetCameraMatrix); @@ -43,6 +45,12 @@ class CLuaCameraDefs : public CLuaDefs LUA_DECLARE(SetCameraGoggleEffect); static bool SetCameraDrunkLevel(short drunkLevel); + static bool SetCameraUnderwaterEffectEnabled(bool bEnabled); + static bool SetCameraUnderwaterEffectSpeed(float fSpeed, float fFrequency); + static bool SetCameraUnderwaterDarkness(bool bEnabled, std::optional fFullDarknessDepth); + static bool ResetCameraUnderwaterEffect(); + static bool ResetCameraUnderwaterDarkness(); + // For OOP only LUA_DECLARE(OOP_GetCameraPosition); LUA_DECLARE(OOP_SetCameraPosition); diff --git a/Client/multiplayer_sa/CMultiplayerSA.h b/Client/multiplayer_sa/CMultiplayerSA.h index fd81a188283..52642fe0dce 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.h +++ b/Client/multiplayer_sa/CMultiplayerSA.h @@ -200,6 +200,12 @@ class CMultiplayerSA : public CMultiplayer bool IsNightVisionEnabled(); bool IsThermalVisionEnabled(); + std::tuple GetUnderwaterEffect(); + std::tuple GetUnderwaterDarkness(); + void SetUnderwaterEffectEnabled(bool bEnabled); + void SetUnderwaterEffectSpeed(float fSpeed, float fFrequency); + void SetUnderwaterDarkness(bool bEnabled, float fFullDarknessDepth); + void AllowWindowsCursorShowing(bool bAllow); CShotSyncData* GetLocalShotSyncData(); diff --git a/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp b/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp index 79491f3ad9a..e0ad695bd81 100644 --- a/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp @@ -154,6 +154,38 @@ void CMultiplayerSA::SetNightVisionEnabled(bool bEnabled, bool bNoiseEnabled) } } +void CMultiplayerSA::SetUnderwaterEffectEnabled(bool bEnabled) +{ + if (bEnabled) + { + MemPutFast(0xC402D3, 1); + } + else + { + MemPutFast(0xC402D3, 0); + } +} + +void CMultiplayerSA::SetUnderwaterEffectSpeed(float fSpeed, float fFrequency) +{ + MemPutFast(0x8D5138, fSpeed); + MemPutFast(0x8D513C, fFrequency); +} + +void CMultiplayerSA::SetUnderwaterDarkness(bool bEnabled, float fFullDarknessDepth) +{ + if (bEnabled) + { + MemPutFast(0x8D5144, 1); + } + else + { + MemPutFast(0x8D5144, 0); + } + + MemPutFast(0x8D5148, fFullDarknessDepth); +} + void CMultiplayerSA::SetThermalVisionEnabled(bool bEnabled, bool bNoiseEnabled) { if (bEnabled) @@ -184,8 +216,26 @@ bool CMultiplayerSA::IsThermalVisionEnabled() return (*(BYTE*)0xC402B9 == 1); } -void CMultiplayerSA::InitHooks_Postprocess() +std::tuple CMultiplayerSA::GetUnderwaterEffect() +{ + bool bEnabled = (*(BYTE*)0xC402D3 == 1); + float fSpeed = (*(float*)0x8D5138); + float fFrequency = (*(float*)0x8D513C); + + return std::tuple(bEnabled, fSpeed, fFrequency); +} + + +std::tuple CMultiplayerSA::GetUnderwaterDarkness() { + bool bEnabled = (*(BYTE*)0x8D5144); + float fFullDarknessDepth = (*(float*)0x8D5148); + + return std::tuple(bEnabled, fFullDarknessDepth); +} + +void CMultiplayerSA::InitHooks_Postprocess() + { HookInstallCall(HOOKPOS_GrainEffect_NightModifier, (DWORD)GrainEffect::NightModifier::ApplyEffect); HookInstallCall(HOOKPOS_GrainEffect_InfraredModifier, (DWORD)GrainEffect::InfraredModifier::ApplyEffect); HookInstallCall(HOOKPOS_GrainEffect_RainModifier, (DWORD)GrainEffect::RainModifier::ApplyEffect); diff --git a/Client/sdk/multiplayer/CMultiplayer.h b/Client/sdk/multiplayer/CMultiplayer.h index 23c6f2ac15f..1091f6a4d91 100644 --- a/Client/sdk/multiplayer/CMultiplayer.h +++ b/Client/sdk/multiplayer/CMultiplayer.h @@ -407,4 +407,10 @@ class CMultiplayer virtual unsigned int EntryInfoNodePool_NoOfUsedSpaces() const noexcept = 0; virtual unsigned int PtrNodeSingleLinkPool_NoOfUsedSpaces() const noexcept = 0; virtual unsigned int PtrNodeDoubleLinkPool_NoOfUsedSpaces() const noexcept = 0; + + virtual std::tuple GetUnderwaterEffect() = 0; + virtual std::tuple GetUnderwaterDarkness() = 0; + virtual void SetUnderwaterEffectEnabled(bool bEnabled) = 0; + virtual void SetUnderwaterEffectSpeed(float fSpeed, float fFrequency) = 0; + virtual void SetUnderwaterDarkness(bool bEnabled, float fFullDarknessDepth) = 0; }; From 70fdd7b815684bbc12c5c240e7f2771bca8eba2b Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 12 Jun 2024 13:47:13 +0200 Subject: [PATCH 2/8] conditional operator, check if client is underwater --- .../CMultiplayerSA_Postprocess.cpp | 22 ++++--------------- 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp b/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp index e0ad695bd81..4a84a8a1f52 100644 --- a/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp @@ -156,14 +156,7 @@ void CMultiplayerSA::SetNightVisionEnabled(bool bEnabled, bool bNoiseEnabled) void CMultiplayerSA::SetUnderwaterEffectEnabled(bool bEnabled) { - if (bEnabled) - { - MemPutFast(0xC402D3, 1); - } - else - { - MemPutFast(0xC402D3, 0); - } + MemPutFast(0xC402D3, bEnabled ? 1 : 0); } void CMultiplayerSA::SetUnderwaterEffectSpeed(float fSpeed, float fFrequency) @@ -174,14 +167,7 @@ void CMultiplayerSA::SetUnderwaterEffectSpeed(float fSpeed, float fFrequency) void CMultiplayerSA::SetUnderwaterDarkness(bool bEnabled, float fFullDarknessDepth) { - if (bEnabled) - { - MemPutFast(0x8D5144, 1); - } - else - { - MemPutFast(0x8D5144, 0); - } + MemPutFast(0x8D5144, bEnabled ? 1 : 0); MemPutFast(0x8D5148, fFullDarknessDepth); } @@ -218,7 +204,7 @@ bool CMultiplayerSA::IsThermalVisionEnabled() std::tuple CMultiplayerSA::GetUnderwaterEffect() { - bool bEnabled = (*(BYTE*)0xC402D3 == 1); + bool bEnabled = (*(BYTE*)0xC402D3 == 1) || (*(float*)0xC8132C) >= 0.535f; float fSpeed = (*(float*)0x8D5138); float fFrequency = (*(float*)0x8D513C); @@ -235,7 +221,7 @@ std::tuple CMultiplayerSA::GetUnderwaterDarkness() } void CMultiplayerSA::InitHooks_Postprocess() - { +{ HookInstallCall(HOOKPOS_GrainEffect_NightModifier, (DWORD)GrainEffect::NightModifier::ApplyEffect); HookInstallCall(HOOKPOS_GrainEffect_InfraredModifier, (DWORD)GrainEffect::InfraredModifier::ApplyEffect); HookInstallCall(HOOKPOS_GrainEffect_RainModifier, (DWORD)GrainEffect::RainModifier::ApplyEffect); From dd153dbd775b2a23ede32479e53276663da9f989 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 12 Jun 2024 22:25:26 +0200 Subject: [PATCH 3/8] reset underwater effects on server connect --- Client/mods/deathmatch/logic/CClientGame.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 34946f71415..b91eb1bbfa3 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -5492,6 +5492,11 @@ void CClientGame::ResetMapInfo() g_pMultiplayer->SetGrainMultiplier(eGrainMultiplierType::ALL, 1.0f); g_pMultiplayer->SetGrainLevel(0); + //Underwater effects + g_pMultiplayer->SetUnderwaterDarkness(true, 90.0f); + g_pMultiplayer->SetUnderwaterEffectEnabled(false); + g_pMultiplayer->SetUnderwaterEffectSpeed(0.0015f, 0.04f); + // Water GetManager()->GetWaterManager()->ResetWorldWaterLevel(); From b333f63d1dfa22a0952aacf9f77f45bbe4be3d3a Mon Sep 17 00:00:00 2001 From: Jakub Starzak Date: Mon, 24 Jun 2024 17:13:26 +0200 Subject: [PATCH 4/8] add space --- Client/mods/deathmatch/logic/CClientGame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index b91eb1bbfa3..98a3ab057e6 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -5492,7 +5492,7 @@ void CClientGame::ResetMapInfo() g_pMultiplayer->SetGrainMultiplier(eGrainMultiplierType::ALL, 1.0f); g_pMultiplayer->SetGrainLevel(0); - //Underwater effects + // Underwater effects g_pMultiplayer->SetUnderwaterDarkness(true, 90.0f); g_pMultiplayer->SetUnderwaterEffectEnabled(false); g_pMultiplayer->SetUnderwaterEffectSpeed(0.0015f, 0.04f); From a384e4b58bc8b1d75c0b243b3f49fde772694802 Mon Sep 17 00:00:00 2001 From: Jakub Date: Wed, 26 Jun 2024 23:36:33 +0200 Subject: [PATCH 5/8] update after review --- Client/mods/deathmatch/logic/CClientGame.cpp | 5 +- .../logic/luadefs/CLuaCameraDefs.cpp | 15 +++-- .../deathmatch/logic/luadefs/CLuaCameraDefs.h | 6 +- Client/multiplayer_sa/CMultiplayerSA.h | 12 ++-- .../CMultiplayerSA_Postprocess.cpp | 58 ++++++++++++------- Client/sdk/multiplayer/CMultiplayer.h | 12 ++-- 6 files changed, 67 insertions(+), 41 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index 37a784673dd..6d9e6b6c9c7 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -5483,9 +5483,8 @@ void CClientGame::ResetMapInfo() g_pMultiplayer->SetGrainLevel(0); // Underwater effects - g_pMultiplayer->SetUnderwaterDarkness(true, 90.0f); - g_pMultiplayer->SetUnderwaterEffectEnabled(false); - g_pMultiplayer->SetUnderwaterEffectSpeed(0.0015f, 0.04f); + g_pMultiplayer->ResetUnderwaterDarkness(); + g_pMultiplayer->ResetUnderwaterEffect(); // Water GetManager()->GetWaterManager()->ResetWorldWaterLevel(); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp index 4ed002fbaad..c2a133cb1f1 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp @@ -178,12 +178,18 @@ unsigned char CLuaCameraDefs::GetCameraDrunkLevel() CLuaMultiReturn CLuaCameraDefs::GetCameraUnderwaterEffect() { - return g_pMultiplayer->GetUnderwaterEffect(); + bool isEnabled; + float speed, frequency; + g_pMultiplayer->GetUnderwaterEffect(isEnabled, speed, frequency); + return {isEnabled, speed, frequency}; } CLuaMultiReturn CLuaCameraDefs::GetCameraUnderwaterDarkness() { - return g_pMultiplayer->GetUnderwaterDarkness(); + bool isEnabled; + float fullDarknessDepth; + g_pMultiplayer->GetUnderwaterDarkness(isEnabled, fullDarknessDepth); + return {isEnabled, fullDarknessDepth}; } int CLuaCameraDefs::SetCameraMatrix(lua_State* luaVM) @@ -511,15 +517,14 @@ bool CLuaCameraDefs::SetCameraUnderwaterDarkness(bool bEnabled, std::optionalSetUnderwaterEffectEnabled(false); - g_pMultiplayer->SetUnderwaterEffectSpeed(0.0015f, 0.04f); + g_pMultiplayer->ResetUnderwaterEffect(); return true; } bool CLuaCameraDefs::ResetCameraUnderwaterDarkness() { - g_pMultiplayer->SetUnderwaterDarkness(true, 90.0f); + g_pMultiplayer->ResetUnderwaterDarkness(); return true; } diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h index e7484a07c54..5a40a641b1a 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h @@ -45,9 +45,9 @@ class CLuaCameraDefs : public CLuaDefs LUA_DECLARE(SetCameraGoggleEffect); static bool SetCameraDrunkLevel(short drunkLevel); - static bool SetCameraUnderwaterEffectEnabled(bool bEnabled); - static bool SetCameraUnderwaterEffectSpeed(float fSpeed, float fFrequency); - static bool SetCameraUnderwaterDarkness(bool bEnabled, std::optional fFullDarknessDepth); + static bool SetCameraUnderwaterEffectEnabled(bool isEnabled); + static bool SetCameraUnderwaterEffectSpeed(float speed, float frequency); + static bool SetCameraUnderwaterDarkness(bool isEnabled, std::optional fullDarknessDepth); static bool ResetCameraUnderwaterEffect(); static bool ResetCameraUnderwaterDarkness(); diff --git a/Client/multiplayer_sa/CMultiplayerSA.h b/Client/multiplayer_sa/CMultiplayerSA.h index 07694ca334c..a3e5b4dcfdb 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.h +++ b/Client/multiplayer_sa/CMultiplayerSA.h @@ -201,11 +201,13 @@ class CMultiplayerSA : public CMultiplayer bool IsNightVisionEnabled(); bool IsThermalVisionEnabled(); - std::tuple GetUnderwaterEffect(); - std::tuple GetUnderwaterDarkness(); - void SetUnderwaterEffectEnabled(bool bEnabled); - void SetUnderwaterEffectSpeed(float fSpeed, float fFrequency); - void SetUnderwaterDarkness(bool bEnabled, float fFullDarknessDepth); + void GetUnderwaterEffect(bool& isEnabled, float& speed, float& frequency); + void GetUnderwaterDarkness(bool& isEnabled, float& fullDarknessDepth); + void SetUnderwaterEffectEnabled(bool isEnabled) override; + void SetUnderwaterEffectSpeed(float speed, float frequency) override; + void SetUnderwaterDarkness(bool isEnabled, float fullDarknessDepth) override; + void ResetUnderwaterEffect() override; + void ResetUnderwaterDarkness() override; void AllowWindowsCursorShowing(bool bAllow); diff --git a/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp b/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp index 4a84a8a1f52..0e3213fbf94 100644 --- a/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp @@ -15,6 +15,18 @@ #define HOOKPOS_GrainEffect_RainModifier 0x705078 #define HOOKPOS_GrainEffect_OverlayModifier 0x705091 +#define VAR_CPostEffects_WaterEnable 0xC402D3 +#define VAR_CPostEffects_WaterSpeed 0x8D5138 +#define VAR_CPostEffects_WaterFreq 0x8D513C +#define VAR_CPostEffects_WaterDepthDarkessEnabled 0x8D5144 +#define VAR_CPostEffects_WaterFullDarknessDepth 0x8D5148 +#define VAR_CPostEffects_WaterFxStartUnderWaterness 0x8D514C +#define VAR_CWeather_UnderWaterness 0xC8132C + +#define DEFAULT_UNDERWATER_EFFECT_SPEED ( 0.0015f ) +#define DEFAULT_UNDERWATER_EFFECT_FREQUENCY ( 0.04f ) +#define DEFAULT_UNDERWATER_FULL_DARKNESS_DEPTH ( 90.0f ) + namespace GrainEffect { @@ -154,22 +166,33 @@ void CMultiplayerSA::SetNightVisionEnabled(bool bEnabled, bool bNoiseEnabled) } } -void CMultiplayerSA::SetUnderwaterEffectEnabled(bool bEnabled) +void CMultiplayerSA::SetUnderwaterEffectEnabled(bool isEnabled) { - MemPutFast(0xC402D3, bEnabled ? 1 : 0); + MemPutFast(VAR_CPostEffects_WaterEnable, isEnabled ? 1 : 0); } -void CMultiplayerSA::SetUnderwaterEffectSpeed(float fSpeed, float fFrequency) +void CMultiplayerSA::SetUnderwaterEffectSpeed(float speed, float frequency) { - MemPutFast(0x8D5138, fSpeed); - MemPutFast(0x8D513C, fFrequency); + MemPutFast(VAR_CPostEffects_WaterSpeed, speed); + MemPutFast(VAR_CPostEffects_WaterFreq, frequency); +} + +void CMultiplayerSA::SetUnderwaterDarkness(bool isEnabled, float fullDarknessDepth) +{ + MemPutFast(VAR_CPostEffects_WaterDepthDarkessEnabled, isEnabled ? 1 : 0); + + MemPutFast(VAR_CPostEffects_WaterFullDarknessDepth, fullDarknessDepth); } -void CMultiplayerSA::SetUnderwaterDarkness(bool bEnabled, float fFullDarknessDepth) +void CMultiplayerSA::ResetUnderwaterEffect() { - MemPutFast(0x8D5144, bEnabled ? 1 : 0); + this->SetUnderwaterEffectEnabled(false); + this->SetUnderwaterEffectSpeed(DEFAULT_UNDERWATER_EFFECT_SPEED, DEFAULT_UNDERWATER_EFFECT_FREQUENCY); +} - MemPutFast(0x8D5148, fFullDarknessDepth); +void CMultiplayerSA::ResetUnderwaterDarkness() +{ + this->SetUnderwaterDarkness(false, DEFAULT_UNDERWATER_FULL_DARKNESS_DEPTH); } void CMultiplayerSA::SetThermalVisionEnabled(bool bEnabled, bool bNoiseEnabled) @@ -202,22 +225,17 @@ bool CMultiplayerSA::IsThermalVisionEnabled() return (*(BYTE*)0xC402B9 == 1); } -std::tuple CMultiplayerSA::GetUnderwaterEffect() +void CMultiplayerSA::GetUnderwaterEffect(bool& isEnabled, float& speed, float& frequency) { - bool bEnabled = (*(BYTE*)0xC402D3 == 1) || (*(float*)0xC8132C) >= 0.535f; - float fSpeed = (*(float*)0x8D5138); - float fFrequency = (*(float*)0x8D513C); - - return std::tuple(bEnabled, fSpeed, fFrequency); + isEnabled = (*(uint8_t*)VAR_CPostEffects_WaterEnable == 1) || (*(float*)VAR_CWeather_UnderWaterness) >= (*(float*)VAR_CPostEffects_WaterFxStartUnderWaterness); + speed = (*(float*)VAR_CPostEffects_WaterSpeed); + frequency = (*(float*)VAR_CPostEffects_WaterFreq); } - -std::tuple CMultiplayerSA::GetUnderwaterDarkness() +void CMultiplayerSA::GetUnderwaterDarkness(bool& isEnabled, float& fullDarknessDepth) { - bool bEnabled = (*(BYTE*)0x8D5144); - float fFullDarknessDepth = (*(float*)0x8D5148); - - return std::tuple(bEnabled, fFullDarknessDepth); + isEnabled = (*(uint8_t*)VAR_CPostEffects_WaterDepthDarkessEnabled); + fullDarknessDepth = (*(float*)VAR_CPostEffects_WaterFullDarknessDepth); } void CMultiplayerSA::InitHooks_Postprocess() diff --git a/Client/sdk/multiplayer/CMultiplayer.h b/Client/sdk/multiplayer/CMultiplayer.h index b13df10f98d..da6b4b0c17f 100644 --- a/Client/sdk/multiplayer/CMultiplayer.h +++ b/Client/sdk/multiplayer/CMultiplayer.h @@ -410,9 +410,11 @@ class CMultiplayer virtual unsigned int PtrNodeSingleLinkPool_NoOfUsedSpaces() const noexcept = 0; virtual unsigned int PtrNodeDoubleLinkPool_NoOfUsedSpaces() const noexcept = 0; - virtual std::tuple GetUnderwaterEffect() = 0; - virtual std::tuple GetUnderwaterDarkness() = 0; - virtual void SetUnderwaterEffectEnabled(bool bEnabled) = 0; - virtual void SetUnderwaterEffectSpeed(float fSpeed, float fFrequency) = 0; - virtual void SetUnderwaterDarkness(bool bEnabled, float fFullDarknessDepth) = 0; + virtual void GetUnderwaterEffect(bool& isEnabled, float& speed, float& frequency) = 0; + virtual void GetUnderwaterDarkness(bool& isEnabled, float& fullDarknessDepth) = 0; + virtual void SetUnderwaterEffectEnabled(bool isEnabled) = 0; + virtual void SetUnderwaterEffectSpeed(float speed, float frequency) = 0; + virtual void SetUnderwaterDarkness(bool isEnabled, float fullDarknessDepth) = 0; + virtual void ResetUnderwaterEffect() = 0; + virtual void ResetUnderwaterDarkness() = 0; }; From b4c5104392c5e958633376cb370ded227b0096d7 Mon Sep 17 00:00:00 2001 From: Jakub Starzak Date: Mon, 20 Jan 2025 18:37:28 +0100 Subject: [PATCH 6/8] CR changes --- .../logic/luadefs/CLuaCameraDefs.cpp | 10 +++++----- .../deathmatch/logic/luadefs/CLuaCameraDefs.h | 10 +++++----- Client/multiplayer_sa/CMultiplayerSA.h | 12 +++++------ .../CMultiplayerSA_Postprocess.cpp | 20 +++++++++---------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp index c2a133cb1f1..f6e9c613ca4 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp @@ -176,7 +176,7 @@ unsigned char CLuaCameraDefs::GetCameraDrunkLevel() return g_pGame->GetPlayerInfo()->GetCamDrunkLevel(); } -CLuaMultiReturn CLuaCameraDefs::GetCameraUnderwaterEffect() +CLuaMultiReturn CLuaCameraDefs::GetCameraUnderwaterEffect() noexcept { bool isEnabled; float speed, frequency; @@ -184,7 +184,7 @@ CLuaMultiReturn CLuaCameraDefs::GetCameraUnderwaterEffect() return {isEnabled, speed, frequency}; } -CLuaMultiReturn CLuaCameraDefs::GetCameraUnderwaterDarkness() +CLuaMultiReturn CLuaCameraDefs::GetCameraUnderwaterDarkness() noexcept { bool isEnabled; float fullDarknessDepth; @@ -494,7 +494,7 @@ int CLuaCameraDefs::SetCameraGoggleEffect(lua_State* luaVM) return 1; } -bool CLuaCameraDefs::SetCameraUnderwaterEffectEnabled(bool bEnabled) +bool CLuaCameraDefs::SetCameraUnderwaterEffectEnabled(bool bEnabled) noexcept { g_pMultiplayer->SetUnderwaterEffectEnabled(bEnabled); @@ -515,14 +515,14 @@ bool CLuaCameraDefs::SetCameraUnderwaterDarkness(bool bEnabled, std::optionalResetUnderwaterEffect(); return true; } -bool CLuaCameraDefs::ResetCameraUnderwaterDarkness() +bool CLuaCameraDefs::ResetCameraUnderwaterDarkness() noexcept { g_pMultiplayer->ResetUnderwaterDarkness(); diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h index 5a40a641b1a..0b83d70514c 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h +++ b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h @@ -31,8 +31,8 @@ class CLuaCameraDefs : public CLuaDefs static std::string GetCameraGoggleEffect(); LUA_DECLARE(GetCameraFieldOfView); static unsigned char GetCameraDrunkLevel(); - static CLuaMultiReturn GetCameraUnderwaterEffect(); - static CLuaMultiReturn GetCameraUnderwaterDarkness(); + static CLuaMultiReturn GetCameraUnderwaterEffect() noexcept; + static CLuaMultiReturn GetCameraUnderwaterDarkness() noexcept; // Cam set funcs LUA_DECLARE(SetCameraMatrix); @@ -45,11 +45,11 @@ class CLuaCameraDefs : public CLuaDefs LUA_DECLARE(SetCameraGoggleEffect); static bool SetCameraDrunkLevel(short drunkLevel); - static bool SetCameraUnderwaterEffectEnabled(bool isEnabled); + static bool SetCameraUnderwaterEffectEnabled(bool isEnabled) noexcept; static bool SetCameraUnderwaterEffectSpeed(float speed, float frequency); static bool SetCameraUnderwaterDarkness(bool isEnabled, std::optional fullDarknessDepth); - static bool ResetCameraUnderwaterEffect(); - static bool ResetCameraUnderwaterDarkness(); + static bool ResetCameraUnderwaterEffect() noexcept; + static bool ResetCameraUnderwaterDarkness() noexcept; // For OOP only LUA_DECLARE(OOP_GetCameraPosition); diff --git a/Client/multiplayer_sa/CMultiplayerSA.h b/Client/multiplayer_sa/CMultiplayerSA.h index a3e5b4dcfdb..a78466ed711 100644 --- a/Client/multiplayer_sa/CMultiplayerSA.h +++ b/Client/multiplayer_sa/CMultiplayerSA.h @@ -201,13 +201,13 @@ class CMultiplayerSA : public CMultiplayer bool IsNightVisionEnabled(); bool IsThermalVisionEnabled(); - void GetUnderwaterEffect(bool& isEnabled, float& speed, float& frequency); - void GetUnderwaterDarkness(bool& isEnabled, float& fullDarknessDepth); - void SetUnderwaterEffectEnabled(bool isEnabled) override; - void SetUnderwaterEffectSpeed(float speed, float frequency) override; + void GetUnderwaterEffect(bool& isEnabled, float& speed, float& frequency) const noexcept; + void GetUnderwaterDarkness(bool& isEnabled, float& fullDarknessDepth) const noexcept; + void SetUnderwaterEffectEnabled(bool isEnabled) const noexcept override; + void SetUnderwaterEffectSpeed(float speed, float frequency) const noexcept override; void SetUnderwaterDarkness(bool isEnabled, float fullDarknessDepth) override; - void ResetUnderwaterEffect() override; - void ResetUnderwaterDarkness() override; + void ResetUnderwaterEffect() noexcept override; + void ResetUnderwaterDarkness() noexcept override; void AllowWindowsCursorShowing(bool bAllow); diff --git a/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp b/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp index 0e3213fbf94..05381c05677 100644 --- a/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp +++ b/Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp @@ -131,7 +131,7 @@ void CMultiplayerSA::SetGrainLevel(BYTE ucLevel) GrainEffect::dwGrainStrength = static_cast(ucLevel); if (bEnable == bOverridden) - return; + return; if (bEnable) { @@ -166,12 +166,12 @@ void CMultiplayerSA::SetNightVisionEnabled(bool bEnabled, bool bNoiseEnabled) } } -void CMultiplayerSA::SetUnderwaterEffectEnabled(bool isEnabled) +void CMultiplayerSA::SetUnderwaterEffectEnabled(bool isEnabled) const noexcept { - MemPutFast(VAR_CPostEffects_WaterEnable, isEnabled ? 1 : 0); + MemPutFast(VAR_CPostEffects_WaterEnable, isEnabled ? 1 : 0); } -void CMultiplayerSA::SetUnderwaterEffectSpeed(float speed, float frequency) +void CMultiplayerSA::SetUnderwaterEffectSpeed(float speed, float frequency) const noexcept { MemPutFast(VAR_CPostEffects_WaterSpeed, speed); MemPutFast(VAR_CPostEffects_WaterFreq, frequency); @@ -179,18 +179,18 @@ void CMultiplayerSA::SetUnderwaterEffectSpeed(float speed, float frequency) void CMultiplayerSA::SetUnderwaterDarkness(bool isEnabled, float fullDarknessDepth) { - MemPutFast(VAR_CPostEffects_WaterDepthDarkessEnabled, isEnabled ? 1 : 0); + MemPutFast(VAR_CPostEffects_WaterDepthDarkessEnabled, isEnabled ? 1 : 0); MemPutFast(VAR_CPostEffects_WaterFullDarknessDepth, fullDarknessDepth); } -void CMultiplayerSA::ResetUnderwaterEffect() +void CMultiplayerSA::ResetUnderwaterEffect() noexcept { this->SetUnderwaterEffectEnabled(false); this->SetUnderwaterEffectSpeed(DEFAULT_UNDERWATER_EFFECT_SPEED, DEFAULT_UNDERWATER_EFFECT_FREQUENCY); } -void CMultiplayerSA::ResetUnderwaterDarkness() +void CMultiplayerSA::ResetUnderwaterDarkness() noexcept { this->SetUnderwaterDarkness(false, DEFAULT_UNDERWATER_FULL_DARKNESS_DEPTH); } @@ -225,16 +225,16 @@ bool CMultiplayerSA::IsThermalVisionEnabled() return (*(BYTE*)0xC402B9 == 1); } -void CMultiplayerSA::GetUnderwaterEffect(bool& isEnabled, float& speed, float& frequency) +void CMultiplayerSA::GetUnderwaterEffect(bool& isEnabled, float& speed, float& frequency) const noexcept { isEnabled = (*(uint8_t*)VAR_CPostEffects_WaterEnable == 1) || (*(float*)VAR_CWeather_UnderWaterness) >= (*(float*)VAR_CPostEffects_WaterFxStartUnderWaterness); speed = (*(float*)VAR_CPostEffects_WaterSpeed); frequency = (*(float*)VAR_CPostEffects_WaterFreq); } -void CMultiplayerSA::GetUnderwaterDarkness(bool& isEnabled, float& fullDarknessDepth) +void CMultiplayerSA::GetUnderwaterDarkness(bool& isEnabled, float& fullDarknessDepth) const noexcept { - isEnabled = (*(uint8_t*)VAR_CPostEffects_WaterDepthDarkessEnabled); + isEnabled = (*(std::uint8_t*)VAR_CPostEffects_WaterDepthDarkessEnabled); fullDarknessDepth = (*(float*)VAR_CPostEffects_WaterFullDarknessDepth); } From 5e12c2adf65aafc42188ee188a2dc60553a32965 Mon Sep 17 00:00:00 2001 From: Jakub Starzak Date: Mon, 20 Jan 2025 18:45:06 +0100 Subject: [PATCH 7/8] add to ResetWorldProperties --- Client/mods/deathmatch/logic/CClientGame.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Client/mods/deathmatch/logic/CClientGame.cpp b/Client/mods/deathmatch/logic/CClientGame.cpp index dcb73b17389..7c65ef82c79 100644 --- a/Client/mods/deathmatch/logic/CClientGame.cpp +++ b/Client/mods/deathmatch/logic/CClientGame.cpp @@ -406,7 +406,7 @@ CClientGame::~CClientGame() m_bBeingDeleted = true; // Remove active projectile references to local player if (auto pLocalPlayer = g_pClientGame->GetLocalPlayer()) - g_pGame->GetProjectileInfo()->RemoveEntityReferences(pLocalPlayer->GetGameEntity()); + g_pGame->GetProjectileInfo()->RemoveEntityReferences(pLocalPlayer->GetGameEntity()); // Stop all explosions. Unfortunately this doesn't fix the crash // if a vehicle is destroyed while it explodes. @@ -1026,7 +1026,7 @@ void CClientGame::DoPulsePostFrame() } auto taskManager = pLocalPlayer->GetTaskManager(); - auto task = taskManager->GetActiveTask(); + auto task = taskManager->GetActiveTask(); auto pVehicle = pLocalPlayer->GetOccupiedVehicle(); bool useZoneName = true; @@ -1080,7 +1080,7 @@ void CClientGame::DoPulsePostFrame() discordState = taskState.strState; useZoneName = taskState.bUseZone; - } + } if (useZoneName) { @@ -6928,6 +6928,10 @@ void CClientGame::ResetWorldProperties(const ResetWorldPropsInfo& resetPropsInfo GetManager()->GetWaterManager()->ResetWorldWaterLevel(); GetManager()->GetWaterManager()->SetWaveLevel(0.0f); + // Underwater effects + g_pMultiplayer->ResetUnderwaterDarkness(); + g_pMultiplayer->ResetUnderwaterEffect(); + // Reset volumetric shadows g_pGame->GetSettings()->ResetVolumetricShadows(); From 518690f50671f3257685f268827c6468492d4636 Mon Sep 17 00:00:00 2001 From: Jakub Starzak Date: Mon, 20 Jan 2025 19:17:59 +0100 Subject: [PATCH 8/8] optional frequency --- Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp index aab59cd106f..d6e2e7d36ad 100644 --- a/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp +++ b/Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp @@ -506,9 +506,9 @@ bool CLuaCameraDefs::SetCameraUnderwaterEffectEnabled(bool bEnabled) noexcept return true; } -bool CLuaCameraDefs::SetCameraUnderwaterEffectSpeed(float fSpeed, float fFrequency) +bool CLuaCameraDefs::SetCameraUnderwaterEffectSpeed(float fSpeed, std::optional fFrequency) { - g_pMultiplayer->SetUnderwaterEffectSpeed(fSpeed, fFrequency); + g_pMultiplayer->SetUnderwaterEffectSpeed(fSpeed, fFrequency.value_or(0.04f)); return true; } @@ -634,4 +634,4 @@ bool CLuaCameraDefs::ResetShakeCamera() noexcept { m_pManager->GetCamera()->ResetShakeCamera(); return true; -} \ No newline at end of file +}