Refactor CSM restriction code a bit

This also fixes find_node_near restrictions being ineffective.
This commit is contained in:
sfan5 2019-11-08 22:57:03 +01:00
parent 4d668f32a6
commit b0260b5ec8
4 changed files with 27 additions and 32 deletions

@ -1313,7 +1313,7 @@ void Client::removeNode(v3s16 p)
* @param is_valid_position * @param is_valid_position
* @return * @return
*/ */
MapNode Client::getNode(v3s16 p, bool *is_valid_position) MapNode Client::CSMGetNode(v3s16 p, bool *is_valid_position)
{ {
if (checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOOKUP_NODES)) { if (checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOOKUP_NODES)) {
v3s16 ppos = floatToInt(m_env.getLocalPlayer()->getPosition(), BS); v3s16 ppos = floatToInt(m_env.getLocalPlayer()->getPosition(), BS);
@ -1325,6 +1325,18 @@ MapNode Client::getNode(v3s16 p, bool *is_valid_position)
return m_env.getMap().getNode(p, is_valid_position); return m_env.getMap().getNode(p, is_valid_position);
} }
int Client::CSMClampRadius(v3s16 pos, int radius)
{
if (!checkCSMRestrictionFlag(CSMRestrictionFlags::CSM_RF_LOOKUP_NODES))
return radius;
// This is approximate and will cause some allowed nodes to be excluded
v3s16 ppos = floatToInt(m_env.getLocalPlayer()->getPosition(), BS);
u32 distance = ppos.getDistanceFrom(pos);
if (distance >= m_csm_restriction_noderange)
return 0;
return std::min<int>(radius, m_csm_restriction_noderange - distance);
}
void Client::addNode(v3s16 p, MapNode n, bool remove_metadata) void Client::addNode(v3s16 p, MapNode n, bool remove_metadata)
{ {
//TimeTaker timer1("Client::addNode()"); //TimeTaker timer1("Client::addNode()");

@ -261,14 +261,10 @@ public:
// Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent) // Causes urgent mesh updates (unlike Map::add/removeNodeWithEvent)
void removeNode(v3s16 p); void removeNode(v3s16 p);
/** // helpers to enforce CSM restrictions
* Helper function for Client Side Modding MapNode CSMGetNode(v3s16 p, bool *is_valid_position);
* CSM restrictions are applied there, this should not be used for core engine int CSMClampRadius(v3s16 pos, int radius);
* @param p
* @param is_valid_position
* @return
*/
MapNode getNode(v3s16 p, bool *is_valid_position);
void addNode(v3s16 p, MapNode n, bool remove_metadata = true); void addNode(v3s16 p, MapNode n, bool remove_metadata = true);
void setPlayerControl(PlayerControl &control); void setPlayerControl(PlayerControl &control);

@ -36,6 +36,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/string.h" #include "util/string.h"
#include "nodedef.h" #include "nodedef.h"
#define checkCSMRestrictionFlag(flag) \
( getClient(L)->checkCSMRestrictionFlag(CSMRestrictionFlags::flag) )
// get_current_modname() // get_current_modname()
int ModApiClient::l_get_current_modname(lua_State *L) int ModApiClient::l_get_current_modname(lua_State *L)
{ {
@ -106,11 +109,8 @@ int ModApiClient::l_send_chat_message(lua_State *L)
// If server disabled this API, discard // If server disabled this API, discard
// clang-format off if (checkCSMRestrictionFlag(CSM_RF_CHAT_MESSAGES))
if (getClient(L)->checkCSMRestrictionFlag(
CSMRestrictionFlags::CSM_RF_CHAT_MESSAGES))
return 0; return 0;
// clang-format on
std::string message = luaL_checkstring(L, 1); std::string message = luaL_checkstring(L, 1);
getClient(L)->sendChatMessage(utf8_to_wide(message)); getClient(L)->sendChatMessage(utf8_to_wide(message));
@ -127,12 +127,8 @@ int ModApiClient::l_clear_out_chat_queue(lua_State *L)
// get_player_names() // get_player_names()
int ModApiClient::l_get_player_names(lua_State *L) int ModApiClient::l_get_player_names(lua_State *L)
{ {
// clang-format off if (checkCSMRestrictionFlag(CSM_RF_READ_PLAYERINFO))
if (getClient(L)->checkCSMRestrictionFlag(
CSMRestrictionFlags::CSM_RF_READ_PLAYERINFO)) {
return 0; return 0;
}
// clang-format on
const std::list<std::string> &plist = getClient(L)->getConnectedPlayerNames(); const std::list<std::string> &plist = getClient(L)->getConnectedPlayerNames();
lua_createtable(L, plist.size(), 0); lua_createtable(L, plist.size(), 0);
@ -201,7 +197,7 @@ int ModApiClient::l_get_node_or_nil(lua_State *L)
// Do it // Do it
bool pos_ok; bool pos_ok;
MapNode n = getClient(L)->getNode(pos, &pos_ok); MapNode n = getClient(L)->CSMGetNode(pos, &pos_ok);
if (pos_ok) { if (pos_ok) {
// Return node // Return node
pushnode(L, n, getClient(L)->ndef()); pushnode(L, n, getClient(L)->ndef());
@ -308,11 +304,8 @@ int ModApiClient::l_get_item_def(lua_State *L)
IItemDefManager *idef = gdef->idef(); IItemDefManager *idef = gdef->idef();
assert(idef); assert(idef);
// clang-format off if (checkCSMRestrictionFlag(CSM_RF_READ_ITEMDEFS))
if (getClient(L)->checkCSMRestrictionFlag(
CSMRestrictionFlags::CSM_RF_READ_ITEMDEFS))
return 0; return 0;
// clang-format on
if (!lua_isstring(L, 1)) if (!lua_isstring(L, 1))
return 0; return 0;
@ -339,11 +332,8 @@ int ModApiClient::l_get_node_def(lua_State *L)
if (!lua_isstring(L, 1)) if (!lua_isstring(L, 1))
return 0; return 0;
// clang-format off if (checkCSMRestrictionFlag(CSM_RF_READ_NODEDEFS))
if (getClient(L)->checkCSMRestrictionFlag(
CSMRestrictionFlags::CSM_RF_READ_NODEDEFS))
return 0; return 0;
// clang-format on
std::string name = readParam<std::string>(L, 1); std::string name = readParam<std::string>(L, 1);
const ContentFeatures &cf = ndef->get(ndef->getId(name)); const ContentFeatures &cf = ndef->get(ndef->getId(name));

@ -769,11 +769,8 @@ int ModApiEnvMod::l_find_node_near(lua_State *L)
#ifndef SERVER #ifndef SERVER
// Client API limitations // Client API limitations
if (getClient(L) && if (getClient(L))
getClient(L)->checkCSMRestrictionFlag( radius = getClient(L)->CSMClampRadius(pos, radius);
CSMRestrictionFlags::CSM_RF_LOOKUP_NODES)) {
radius = std::max<int>(radius, getClient(L)->getCSMNodeRangeLimit());
}
#endif #endif
for (int d = start_radius; d <= radius; d++) { for (int d = start_radius; d <= radius; d++) {