mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
Refactor CSM restriction code a bit
This also fixes find_node_near restrictions being ineffective.
This commit is contained in:
parent
4d668f32a6
commit
b0260b5ec8
@ -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++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user