aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHybridDog <ovvv@web.de>2019-03-07 08:31:25 +0100
committerLoïc Blot <nerzhul@users.noreply.github.com>2019-03-07 08:31:25 +0100
commit431d8a9b83be858193328fe59e75026fa023393f (patch)
treeb5773cb8dd581f4e65ff4977e148483b23ad4d0b
parent3066d76e33070f0ec598b522b519fd6c1ddaf10e (diff)
downloadminetest-431d8a9b83be858193328fe59e75026fa023393f.tar.gz
minetest-431d8a9b83be858193328fe59e75026fa023393f.tar.bz2
minetest-431d8a9b83be858193328fe59e75026fa023393f.zip
Abort when trying to set a not registered node (#7011)
I removed the MapNode constructor which takes a nodename and gives the node's id or CONTENT_IGNORE The code which used this constructor (two places) now handles the situation of not registered nodes correctly: * minetest.set_node and similar functions make minetest crash when a not registered node is passed * reverting a node with rollback aborts if the node is not registered
-rw-r--r--src/mapnode.cpp12
-rw-r--r--src/mapnode.h5
-rw-r--r--src/rollback_interface.cpp9
-rw-r--r--src/script/common/c_content.cpp8
4 files changed, 13 insertions, 21 deletions
diff --git a/src/mapnode.cpp b/src/mapnode.cpp
index 3b19160e1..9761a6611 100644
--- a/src/mapnode.cpp
+++ b/src/mapnode.cpp
@@ -44,18 +44,6 @@ static const u8 rot_to_wallmounted[] = {
MapNode
*/
-// Create directly from a nodename
-// If name is unknown, sets CONTENT_IGNORE
-MapNode::MapNode(const NodeDefManager *ndef, const std::string &name,
- u8 a_param1, u8 a_param2)
-{
- content_t id = CONTENT_IGNORE;
- ndef->getId(name, id);
- param0 = id;
- param1 = a_param1;
- param2 = a_param2;
-}
-
void MapNode::getColor(const ContentFeatures &f, video::SColor *color) const
{
if (f.palette) {
diff --git a/src/mapnode.h b/src/mapnode.h
index 6e48bce8c..7a3d30ddc 100644
--- a/src/mapnode.h
+++ b/src/mapnode.h
@@ -145,11 +145,6 @@ struct MapNode
param2(a_param2)
{ }
- // Create directly from a nodename
- // If name is unknown, sets CONTENT_IGNORE
- MapNode(const NodeDefManager *ndef, const std::string &name,
- u8 a_param1=0, u8 a_param2=0);
-
bool operator==(const MapNode &other) const noexcept
{
return (param0 == other.param0
diff --git a/src/rollback_interface.cpp b/src/rollback_interface.cpp
index 3ac15544c..1f904c4cc 100644
--- a/src/rollback_interface.cpp
+++ b/src/rollback_interface.cpp
@@ -139,7 +139,12 @@ bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gam
return false;
}
// Create rollback node
- MapNode n(ndef, n_old.name, n_old.param1, n_old.param2);
+ content_t id = CONTENT_IGNORE;
+ if (!ndef->getId(n_old.name, id)) {
+ // The old node is not registered
+ return false;
+ }
+ MapNode n(id, n_old.param1, n_old.param2);
// Set rollback node
try {
if (!map->addNodeWithEvent(p, n)) {
@@ -203,7 +208,7 @@ bool RollbackAction::applyRevert(Map *map, InventoryManager *imgr, IGameDef *gam
<< inventory_location << std::endl;
return false;
}
-
+
// If item was added, take away item, otherwise add removed item
if (inventory_add) {
// Silently ignore different current item
diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp
index 793485e25..361db226e 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -1093,7 +1093,7 @@ MapNode readnode(lua_State *L, int index, const NodeDefManager *ndef)
lua_getfield(L, index, "name");
if (!lua_isstring(L, -1))
throw LuaError("Node name is not set or is not a string!");
- const char *name = lua_tostring(L, -1);
+ std::string name = lua_tostring(L, -1);
lua_pop(L, 1);
u8 param1 = 0;
@@ -1108,7 +1108,11 @@ MapNode readnode(lua_State *L, int index, const NodeDefManager *ndef)
param2 = lua_tonumber(L, -1);
lua_pop(L, 1);
- return {ndef, name, param1, param2};
+ content_t id = CONTENT_IGNORE;
+ if (!ndef->getId(name, id))
+ throw LuaError("\"" + name + "\" is not a registered node!");
+
+ return {id, param1, param2};
}
/******************************************************************************/