Skip to content

Add resetElements argument to resetWaterLevel #2711

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 17 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions Client/mods/deathmatch/logic/CClientWater.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ bool CClientWater::Create()
g_pCore->GetConsole()->Printf("CClientWater::Create %d", GetID());
#endif

m_iDefaultLevel = GetLevel();

return true;
}

Expand Down Expand Up @@ -180,3 +182,18 @@ bool CClientWater::SetLevel(float fLevel, void* pChangeSource)
}
return true;
}

float CClientWater::GetLevel() const
{
float fLevel = 0.0f;
for (int i = 0; i < GetNumVertices(); i++)
{
fLevel += m_Vertices[i].fZ;
}
return fLevel / static_cast<float>(GetNumVertices());
}

void CClientWater::ResetLevel()
{
SetLevel(m_iDefaultLevel);
}
5 changes: 5 additions & 0 deletions Client/mods/deathmatch/logic/CClientWater.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,13 @@ class CClientWater final : public CClientEntity
void SetPosition(const CVector& vecPosition);
bool SetVertexPosition(int iVertexIndex, CVector& vecPosition, void* pChangeSource = nullptr);
bool SetLevel(float fWaterLevel, void* pChangeSource = nullptr);
float GetLevel() const;
void ResetLevel();
void Unlink();

void SetDimension(unsigned short usDimension);
void RelateDimension(unsigned short usWorldDimension);


private:
CWaterPoly* m_pPoly;
Expand All @@ -43,5 +46,7 @@ class CClientWater final : public CClientEntity
bool m_bShallow; // Shallow water?
std::vector<CVector> m_Vertices; // List of vertices for this water

float m_iDefaultLevel{};
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m_fDefaultLevel


friend class CClientWaterManager;
};
18 changes: 18 additions & 0 deletions Client/mods/deathmatch/logic/CClientWaterManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,24 @@ bool CClientWaterManager::SetAllElementWaterLevel(float fLevel, void* pChangeSou
return true;
}

bool CClientWaterManager::ResetAllElementWaterLevel()
{
for (CClientWater* pWater : m_List)
pWater->ResetLevel();
return true;
}
Comment on lines +107 to +112
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this function as a bool if it is unnecessary? The other functions are of type void and this one doesn't seem to need to return a value either


void CClientWaterManager::ResetElementWaterLevel(CClientWater* pWater)
{
pWater->ResetLevel();
}

void CClientWaterManager::ResetElementWaterLevel(std::vector<CClientWater*>& vecWaterElements)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

vector can be const?

{
for (CClientWater* pWater : vecWaterElements)
pWater->ResetLevel();
}

void CClientWaterManager::ResetWorldWaterLevel()
{
g_pGame->GetWaterManager()->ResetWorldWaterLevel();
Expand Down
3 changes: 3 additions & 0 deletions Client/mods/deathmatch/logic/CClientWaterManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ class CClientWaterManager
bool SetPositionWaterLevel(const CVector& vecPosition, float fLevel, void* pChangeSource);
bool SetWorldWaterLevel(float fLevel, void* pChangeSource, bool bIncludeWorldNonSeaLevel, bool bIncludeWorldSeaLevel, bool bIncludeOutsideWorldLevel);
bool SetAllElementWaterLevel(float fLevel, void* pChangeSource);
bool ResetAllElementWaterLevel();
void ResetElementWaterLevel(CClientWater* pWater);
void ResetElementWaterLevel(std::vector<CClientWater*>& vecWaterElements);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

vector can be const?

void ResetWorldWaterLevel();

float GetWaveLevel();
Expand Down
42 changes: 37 additions & 5 deletions Client/mods/deathmatch/logic/luadefs/CLuaWaterDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,15 @@
*****************************************************************************/

#include "StdInc.h"
#include "lua/CLuaFunctionParser.h"

void CLuaWaterDefs::LoadFunctions()
{
constexpr static const std::pair<const char*, lua_CFunction> functions[]{
{"createWater", CreateWater},
{"testLineAgainstWater", TestLineAgainstWater},
{"resetWaterColor", ResetWaterColor},
{"resetWaterLevel", ResetWaterLevel},
{"resetWaterLevel", ArgumentParserWarn<false, ResetWaterLevel>},

{"setWaterColor", SetWaterColor},
{"setWaterLevel", SetWaterLevel},
Expand Down Expand Up @@ -140,11 +141,42 @@ int CLuaWaterDefs::TestLineAgainstWater(lua_State* luaVM)
return 1;
}

int CLuaWaterDefs::ResetWaterLevel(lua_State* luaVM)
bool CLuaWaterDefs::ResetWaterLevel(std::variant<std::monostate, bool, std::vector<CClientWater*>, CClientWater*> resetElements)
{
CStaticFunctionDefinitions::ResetWorldWaterLevel();
lua_pushboolean(luaVM, true);
return 1;
CClientWaterManager* pWaterManager = g_pClientGame->GetManager()->GetWaterManager();

switch (resetElements.index())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about using std::holds_alternative instead of an index here?

{
case 0:
CStaticFunctionDefinitions::ResetWorldWaterLevel();
break;

case 1:
{
if (std::get<bool>(resetElements) == true)
pWaterManager->ResetAllElementWaterLevel();
else
CStaticFunctionDefinitions::ResetWorldWaterLevel();

break;
}

case 2:
{
auto& vecWaterElements = std::get<std::vector<CClientWater*>>(resetElements);
pWaterManager->ResetElementWaterLevel(vecWaterElements);
break;
}

case 3:
{
auto pWaterElement = std::get<CClientWater*>(resetElements);
pWaterManager->ResetElementWaterLevel(pWaterElement);
break;
}
}

return true;
}

int CLuaWaterDefs::ResetWaterColor(lua_State* luaVM)
Expand Down
3 changes: 2 additions & 1 deletion Client/mods/deathmatch/logic/luadefs/CLuaWaterDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class CLuaWaterDefs : public CLuaDefs
static void AddClass(lua_State* luaVM);

LUA_DECLARE(CreateWater);
LUA_DECLARE(ResetWaterLevel);
LUA_DECLARE(ResetWaterColor);
LUA_DECLARE(TestLineAgainstWater);

Expand All @@ -32,4 +31,6 @@ class CLuaWaterDefs : public CLuaDefs
LUA_DECLARE(GetWaterLevel);
LUA_DECLARE(IsWaterDrawnLast);
LUA_DECLARE(GetWaterVertexPosition);

static bool ResetWaterLevel(std::variant<std::monostate, bool, std::vector<CClientWater*>, CClientWater*> resetElements);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resetElements can be const?

};
2 changes: 2 additions & 0 deletions Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9448,6 +9448,8 @@ CWater* CStaticFunctionDefinitions::CreateWater(CResource* pResource, CVector* p
return nullptr;
}

pWater->SetDefaultLevel(pWater->GetLevel());

if (pResource->IsClientSynced())
{
CEntityAddPacket Packet;
Expand Down
13 changes: 13 additions & 0 deletions Server/mods/deathmatch/logic/CWater.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
#include "CWaterManager.h"
#include "CLogger.h"

#include <net/rpc_enums.h>
#include "packets/CElementRPCPacket.h"
#include "CGame.h"

CWater::CWater(CWaterManager* pWaterManager, CElement* pParent, EWaterType waterType, bool bShallow) : CElement(pParent)
{
m_pWaterManager = pWaterManager;
Expand Down Expand Up @@ -201,3 +205,12 @@ bool CWater::IsVertexWithinWorld(int index)
{
return m_Vertices[index].fX >= -3000.0f && m_Vertices[index].fX <= 3000.0f && m_Vertices[index].fY >= -3000.0f && m_Vertices[index].fY <= 3000.0f;
}

void CWater::ResetLevel()
{
SetLevel(m_iDefaultLevel);

CBitStream BitStream;
BitStream.pBitStream->Write(m_iDefaultLevel);
g_pGame->GetPlayerManager()->BroadcastOnlyJoined(CElementRPCPacket(this, SET_ELEMENT_WATER_LEVEL, *BitStream.pBitStream));
}
4 changes: 4 additions & 0 deletions Server/mods/deathmatch/logic/CWater.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ class CWater final : public CElement
void SetPosition(const CVector& vecPosition);
float GetLevel() const;
void SetLevel(float fLevel);
void SetDefaultLevel(float fLevel) { m_iDefaultLevel = fLevel; }
void ResetLevel();

void Unlink();

Expand All @@ -57,4 +59,6 @@ class CWater final : public CElement
SFixedArray<CVector, 4> m_Vertices;
EWaterType m_WaterType;
bool m_bShallow;

float m_iDefaultLevel{};
};
17 changes: 17 additions & 0 deletions Server/mods/deathmatch/logic/CWaterManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,23 @@ void CWaterManager::SetAllElementWaterLevel(float fLevel)
}
}

void CWaterManager::ResetAllElementWaterLevel()
{
for (CWater* pWater : m_List)
pWater->ResetLevel();
}

void CWaterManager::ResetElementWaterLevel(CWater* pWater)
{
pWater->ResetLevel();
}

void CWaterManager::ResetElementWaterLevel(std::vector<CWater*>& vecWaterElements)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

vector can be const?

{
for (CWater* pWater : vecWaterElements)
pWater->ResetLevel();
}

void CWaterManager::SetWorldWaterLevel(float fLevel, bool bIncludeWorldNonSeaLevel, bool bIncludeWorldSeaLevel, bool bIncludeOutsideWorldLevel)
{
if (bIncludeWorldSeaLevel)
Expand Down
3 changes: 3 additions & 0 deletions Server/mods/deathmatch/logic/CWaterManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ class CWaterManager
void ResetWorldWaterLevel();
void SetElementWaterLevel(CWater* pWater, float fLevel);
void SetAllElementWaterLevel(float fLevel);
void ResetAllElementWaterLevel();
void ResetElementWaterLevel(CWater* pWater);
void ResetElementWaterLevel(std::vector<CWater*>& vecWaterElements);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

vector can be const?


std::list<CWater*>::const_iterator IterBegin() { return m_List.begin(); }
std::list<CWater*>::const_iterator IterEnd() { return m_List.end(); }
Expand Down
43 changes: 38 additions & 5 deletions Server/mods/deathmatch/logic/luadefs/CLuaWaterDefs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,17 @@
#include "StdInc.h"
#include "CLuaWaterDefs.h"
#include "CWater.h"
#include "CWaterManager.h"
#include "CStaticFunctionDefinitions.h"
#include "CScriptArgReader.h"
#include "lua/CLuaFunctionParser.h"

void CLuaWaterDefs::LoadFunctions()
{
constexpr static const std::pair<const char*, lua_CFunction> functions[]{
{"createWater", CreateWater},
{"setWaterLevel", SetWaterLevel},
{"resetWaterLevel", ResetWaterLevel},
{"resetWaterLevel", ArgumentParserWarn<false, ResetWaterLevel>},
{"getWaterVertexPosition", GetWaterVertexPosition},
{"setWaterVertexPosition", SetWaterVertexPosition},
{"getWaterColor", GetWaterColor},
Expand Down Expand Up @@ -167,11 +169,42 @@ int CLuaWaterDefs::SetWaterLevel(lua_State* luaVM)
return 1;
}

int CLuaWaterDefs::ResetWaterLevel(lua_State* luaVM)
bool CLuaWaterDefs::ResetWaterLevel(std::variant<std::monostate, bool, std::vector<CWater*>, CWater*> resetElements)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resetElements can be const?

{
CStaticFunctionDefinitions::ResetWorldWaterLevel();
lua_pushboolean(luaVM, true);
return 1;
CWaterManager* pWaterManager = g_pGame->GetWaterManager();

switch (resetElements.index())
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do you think about using std::holds_alternative instead of an index here?

{
case 0:
CStaticFunctionDefinitions::ResetWorldWaterLevel();
break;

case 1:
{
if (std::get<bool>(resetElements) == true)
pWaterManager->ResetAllElementWaterLevel();
else
CStaticFunctionDefinitions::ResetWorldWaterLevel();

break;
}

case 2:
{
auto& vecWaterElements = std::get<std::vector<CWater*>>(resetElements);
pWaterManager->ResetElementWaterLevel(vecWaterElements);
break;
}

case 3:
{
auto pWaterElement = std::get<CWater*>(resetElements);
pWaterManager->ResetElementWaterLevel(pWaterElement);
break;
}
}

return true;
}

int CLuaWaterDefs::GetWaterVertexPosition(lua_State* luaVM)
Expand Down
5 changes: 3 additions & 2 deletions Server/mods/deathmatch/logic/luadefs/CLuaWaterDefs.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,11 @@ class CLuaWaterDefs : public CLuaDefs

LUA_DECLARE(CreateWater);
LUA_DECLARE(SetWaterLevel);
LUA_DECLARE(ResetWaterLevel);
LUA_DECLARE(GetWaterVertexPosition);
LUA_DECLARE(SetWaterVertexPosition);
LUA_DECLARE(GetWaterColor);
LUA_DECLARE(SetWaterColor);
LUA_DECLARE(ResetWaterColor);
};

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

resetElements can be const?

static bool ResetWaterLevel(std::variant<std::monostate, bool, std::vector<CWater*>, CWater*> resetElements);
};
Loading