summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin/item.lua3
-rw-r--r--src/scriptapi.cpp10
2 files changed, 11 insertions, 2 deletions
diff --git a/builtin/item.lua b/builtin/item.lua
index 1b4b4d25a..4ed20e4f1 100644
--- a/builtin/item.lua
+++ b/builtin/item.lua
@@ -262,7 +262,8 @@ function minetest.node_dig(pos, node, digger)
minetest.debug("node_dig")
local def = ItemStack({name=node.name}):get_definition()
- if not def.diggable or (def.can_dig and not def.can_dig(pos,digger)) then
+ -- Check if def ~= 0 because we always want to be able to remove unknown nodes
+ if #def ~= 0 and not def.diggable or (def.can_dig and not def.can_dig(pos,digger)) then
minetest.debug("not diggable")
minetest.log("info", digger:get_player_name() .. " tried to dig "
.. node.name .. " which is not diggable "
diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp
index b8b3cb73a..a1975971f 100644
--- a/src/scriptapi.cpp
+++ b/src/scriptapi.cpp
@@ -5510,6 +5510,8 @@ void scriptapi_on_player_receive_fields(lua_State *L,
// If that is nil or on error, return false and stack is unchanged
// If that is a function, returns true and pushes the
// function onto the stack
+// If minetest.registered_items[name] doesn't exist, minetest.nodedef_default
+// is tried instead so unknown items can still be manipulated to some degree
static bool get_item_callback(lua_State *L,
const char *name, const char *callbackname)
{
@@ -5522,9 +5524,15 @@ static bool get_item_callback(lua_State *L,
// Should be a table
if(lua_type(L, -1) != LUA_TTABLE)
{
+ // Report error and clean up
errorstream<<"Item \""<<name<<"\" not defined"<<std::endl;
lua_pop(L, 1);
- return false;
+
+ // Try minetest.nodedef_default instead
+ lua_getglobal(L, "minetest");
+ lua_getfield(L, -1, "nodedef_default");
+ lua_remove(L, -2);
+ luaL_checktype(L, -1, LUA_TTABLE);
}
lua_getfield(L, -1, callbackname);
lua_remove(L, -2);