Skip to content

Add new functions related to underwater effects #3463

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
4 changes: 4 additions & 0 deletions Client/mods/deathmatch/logic/CClientGame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5482,6 +5482,10 @@ void CClientGame::ResetMapInfo()
g_pMultiplayer->SetGrainMultiplier(eGrainMultiplierType::ALL, 1.0f);
g_pMultiplayer->SetGrainLevel(0);

// Underwater effects
g_pMultiplayer->ResetUnderwaterDarkness();
g_pMultiplayer->ResetUnderwaterEffect();

// Water
GetManager()->GetWaterManager()->ResetWorldWaterLevel();

Expand Down
65 changes: 65 additions & 0 deletions Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ void CLuaCameraDefs::LoadFunctions()
{"getCameraGoggleEffect", ArgumentParserWarn<false, GetCameraGoggleEffect>},
{"getCameraFieldOfView", GetCameraFieldOfView},
{"getCameraDrunkLevel", ArgumentParserWarn<false, GetCameraDrunkLevel>},
{"getCameraUnderwaterEffect", ArgumentParser<GetCameraUnderwaterEffect>},
{"getCameraUnderwaterDarkness", ArgumentParser<GetCameraUnderwaterDarkness>},

// Cam set funcs
{"setCameraMatrix", SetCameraMatrix},
Expand All @@ -41,6 +43,11 @@ void CLuaCameraDefs::LoadFunctions()
{"setCameraViewMode", ArgumentParserWarn<false, SetCameraViewMode>},
{"setCameraGoggleEffect", SetCameraGoggleEffect},
{"setCameraDrunkLevel", ArgumentParserWarn<false, SetCameraDrunkLevel>},
{"setCameraUnderwaterEffectEnabled", ArgumentParser<SetCameraUnderwaterEffectEnabled>},
{"setCameraUnderwaterEffectSpeed", ArgumentParser<SetCameraUnderwaterEffectSpeed>},
{"setCameraUnderwaterDarkness", ArgumentParser<SetCameraUnderwaterDarkness>},
{"resetCameraUnderwaterEffect", ArgumentParser<ResetCameraUnderwaterEffect>},
{"resetCameraUnderwaterDarkness", ArgumentParser<ResetCameraUnderwaterDarkness>},
};

// Add functions
Expand Down Expand Up @@ -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<GetElementType>);
lua_classfunction(luaVM, "getUnderwaterEffect", ArgumentParser<GetCameraUnderwaterEffect>);
lua_classfunction(luaVM, "getUnderwaterDarkness", ArgumentParser<GetCameraUnderwaterDarkness>);

lua_classfunction(luaVM, "setPosition", OOP_SetCameraPosition);
lua_classfunction(luaVM, "setRotation", OOP_SetCameraRotation);
Expand All @@ -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<SetCameraUnderwaterEffectEnabled>);
lua_classfunction(luaVM, "setUnderwaterEffectSpeed", ArgumentParser<SetCameraUnderwaterEffectSpeed>);
lua_classfunction(luaVM, "setUnderwaterDarkness", ArgumentParser<SetCameraUnderwaterDarkness>);
lua_classfunction(luaVM, "resetUnderwaterEffect", ArgumentParser<ResetCameraUnderwaterEffect>);
lua_classfunction(luaVM, "resetUnderwaterDarkness", ArgumentParser<ResetCameraUnderwaterDarkness>);

lua_classvariable(luaVM, "interior", "setCameraInterior", "getCameraInterior");
lua_classvariable(luaVM, "target", "setCameraTarget", "getCameraTarget");
Expand Down Expand Up @@ -162,6 +176,22 @@ unsigned char CLuaCameraDefs::GetCameraDrunkLevel()
return g_pGame->GetPlayerInfo()->GetCamDrunkLevel();
}

CLuaMultiReturn<bool, float, float> CLuaCameraDefs::GetCameraUnderwaterEffect()
{
bool isEnabled;
float speed, frequency;
g_pMultiplayer->GetUnderwaterEffect(isEnabled, speed, frequency);
return {isEnabled, speed, frequency};
}

CLuaMultiReturn<bool, float> CLuaCameraDefs::GetCameraUnderwaterDarkness()
{
bool isEnabled;
float fullDarknessDepth;
g_pMultiplayer->GetUnderwaterDarkness(isEnabled, fullDarknessDepth);
return {isEnabled, fullDarknessDepth};
}

int CLuaCameraDefs::SetCameraMatrix(lua_State* luaVM)
{
CVector vecPosition;
Expand Down Expand Up @@ -464,6 +494,41 @@ 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<float> fFullDarknessDepth)
{
g_pMultiplayer->SetUnderwaterDarkness(bEnabled, fFullDarknessDepth.value_or(90.0f));

return true;
}

bool CLuaCameraDefs::ResetCameraUnderwaterEffect()
{
g_pMultiplayer->ResetUnderwaterEffect();

return true;
}

bool CLuaCameraDefs::ResetCameraUnderwaterDarkness()
{
g_pMultiplayer->ResetUnderwaterDarkness();

return true;
}

bool CLuaCameraDefs::SetCameraDrunkLevel(short drunkLevel)
{
if (drunkLevel < 0 || drunkLevel > 255)
Expand Down
8 changes: 8 additions & 0 deletions Client/mods/deathmatch/logic/luadefs/CLuaCameraDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ class CLuaCameraDefs : public CLuaDefs
static std::string GetCameraGoggleEffect();
LUA_DECLARE(GetCameraFieldOfView);
static unsigned char GetCameraDrunkLevel();
static CLuaMultiReturn<bool, float, float> GetCameraUnderwaterEffect();
static CLuaMultiReturn<bool, float> GetCameraUnderwaterDarkness();

// Cam set funcs
LUA_DECLARE(SetCameraMatrix);
Expand All @@ -43,6 +45,12 @@ class CLuaCameraDefs : public CLuaDefs
LUA_DECLARE(SetCameraGoggleEffect);
static bool SetCameraDrunkLevel(short drunkLevel);

static bool SetCameraUnderwaterEffectEnabled(bool isEnabled);
static bool SetCameraUnderwaterEffectSpeed(float speed, float frequency);
static bool SetCameraUnderwaterDarkness(bool isEnabled, std::optional<float> fullDarknessDepth);
static bool ResetCameraUnderwaterEffect();
static bool ResetCameraUnderwaterDarkness();

// For OOP only
LUA_DECLARE(OOP_GetCameraPosition);
LUA_DECLARE(OOP_SetCameraPosition);
Expand Down
8 changes: 8 additions & 0 deletions Client/multiplayer_sa/CMultiplayerSA.h
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,14 @@ 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 SetUnderwaterDarkness(bool isEnabled, float fullDarknessDepth) override;
void ResetUnderwaterEffect() override;
void ResetUnderwaterDarkness() override;

void AllowWindowsCursorShowing(bool bAllow);

CShotSyncData* GetLocalShotSyncData();
Expand Down
54 changes: 54 additions & 0 deletions Client/multiplayer_sa/CMultiplayerSA_Postprocess.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
{

Expand Down Expand Up @@ -154,6 +166,35 @@ void CMultiplayerSA::SetNightVisionEnabled(bool bEnabled, bool bNoiseEnabled)
}
}

void CMultiplayerSA::SetUnderwaterEffectEnabled(bool isEnabled)
{
MemPutFast<uint8_t>(VAR_CPostEffects_WaterEnable, isEnabled ? 1 : 0);
}

void CMultiplayerSA::SetUnderwaterEffectSpeed(float speed, float frequency)
{
MemPutFast<float>(VAR_CPostEffects_WaterSpeed, speed);
MemPutFast<float>(VAR_CPostEffects_WaterFreq, frequency);
}

void CMultiplayerSA::SetUnderwaterDarkness(bool isEnabled, float fullDarknessDepth)
{
MemPutFast<uint8_t>(VAR_CPostEffects_WaterDepthDarkessEnabled, isEnabled ? 1 : 0);

MemPutFast<float>(VAR_CPostEffects_WaterFullDarknessDepth, fullDarknessDepth);
}

void CMultiplayerSA::ResetUnderwaterEffect()
{
this->SetUnderwaterEffectEnabled(false);
this->SetUnderwaterEffectSpeed(DEFAULT_UNDERWATER_EFFECT_SPEED, DEFAULT_UNDERWATER_EFFECT_FREQUENCY);
}

void CMultiplayerSA::ResetUnderwaterDarkness()
{
this->SetUnderwaterDarkness(false, DEFAULT_UNDERWATER_FULL_DARKNESS_DEPTH);
}

void CMultiplayerSA::SetThermalVisionEnabled(bool bEnabled, bool bNoiseEnabled)
{
if (bEnabled)
Expand Down Expand Up @@ -184,6 +225,19 @@ bool CMultiplayerSA::IsThermalVisionEnabled()
return (*(BYTE*)0xC402B9 == 1);
}

void CMultiplayerSA::GetUnderwaterEffect(bool& isEnabled, float& speed, float& frequency)
{
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)
{
isEnabled = (*(uint8_t*)VAR_CPostEffects_WaterDepthDarkessEnabled);
fullDarknessDepth = (*(float*)VAR_CPostEffects_WaterFullDarknessDepth);
}

void CMultiplayerSA::InitHooks_Postprocess()
{
HookInstallCall(HOOKPOS_GrainEffect_NightModifier, (DWORD)GrainEffect::NightModifier::ApplyEffect);
Expand Down
8 changes: 8 additions & 0 deletions Client/sdk/multiplayer/CMultiplayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -409,4 +409,12 @@ 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 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;
};
Loading