Allow digging of unknown nodes
authorMatthew I <matttpt@gmail.com>
Mon, 30 Jul 2012 13:45:26 +0000 (09:45 -0400)
committerPerttu Ahola <celeron55@gmail.com>
Sun, 12 Aug 2012 13:04:18 +0000 (16:04 +0300)
This allows the removal of nodes with unknown types.
get_item_callback() (C++) would fail if a node has an unknown type.  Now it
will try using the callback from minetest.nodedef_default in this case.
Also, minetest.node_dig() (Lua) was altered to always allow digging when
the node definition is empty (i.e. unknown node).

builtin/item.lua
src/scriptapi.cpp

index 1b4b4d25a1ea24de7a7be44d4cb032027d0ab69b..4ed20e4f1a2133f24a1513dd35a22b74eb5b896c 100644 (file)
@@ -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 "
index b8b3cb73aebcfa1bbee1b4935420f35baca9c5af..a1975971f9a5946099be1a983ff5fbb42f8f8d99 100644 (file)
@@ -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);