aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/lua_api.txt1
-rw-r--r--games/minimal/mods/default/init.lua34
-rw-r--r--src/scriptapi.cpp15
3 files changed, 50 insertions, 0 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index 3f640da4c..8b2b81c75 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -926,6 +926,7 @@ Player-only: (no-op for other objects)
InvRef: Reference to an inventory
methods:
+- is_empty(listname): return true if list is empty
- get_size(listname): get size of a list
- set_size(listname, size): set size of a list
- get_stack(listname, i): get a copy of stack index i in list
diff --git a/games/minimal/mods/default/init.lua b/games/minimal/mods/default/init.lua
index 4468d1e0e..1ffe24837 100644
--- a/games/minimal/mods/default/init.lua
+++ b/games/minimal/mods/default/init.lua
@@ -1147,6 +1147,11 @@ minetest.register_node("default:chest", {
local inv = meta:get_inventory()
inv:set_size("main", 8*4)
end,
+ can_dig = function(pos,player)
+ local meta = minetest.env:get_meta(pos);
+ local inv = meta:get_inventory()
+ return inv:is_empty("main")
+ end,
on_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
minetest.log("action", player:get_player_name()..
@@ -1200,6 +1205,11 @@ minetest.register_node("default:chest_locked", {
local inv = meta:get_inventory()
inv:set_size("main", 8*4)
end,
+ can_dig = function(pos,player)
+ local meta = minetest.env:get_meta(pos);
+ local inv = meta:get_inventory()
+ return inv:is_empty("main")
+ end,
on_metadata_inventory_move = function(pos, from_list, from_index,
to_list, to_index, count, player)
local meta = minetest.env:get_meta(pos)
@@ -1270,6 +1280,18 @@ minetest.register_node("default:furnace", {
inv:set_size("src", 1)
inv:set_size("dst", 4)
end,
+ can_dig = function(pos,player)
+ local meta = minetest.env:get_meta(pos);
+ local inv = meta:get_inventory()
+ if not inv:is_empty("fuel") then
+ return false
+ elseif not inv:is_empty("dst") then
+ return false
+ elseif not inv:is_empty("src") then
+ return false
+ end
+ return true
+ end,
})
minetest.register_node("default:furnace_active", {
@@ -1291,6 +1313,18 @@ minetest.register_node("default:furnace_active", {
inv:set_size("src", 1)
inv:set_size("dst", 4)
end,
+ can_dig = function(pos,player)
+ local meta = minetest.env:get_meta(pos);
+ local inv = meta:get_inventory()
+ if not inv:is_empty("fuel") then
+ return false
+ elseif not inv:is_empty("dst") then
+ return false
+ elseif not inv:is_empty("src") then
+ return false
+ end
+ return true
+ end,
})
function hacky_swap_node(pos,name)
diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp
index 9744aaa33..e231a9879 100644
--- a/src/scriptapi.cpp
+++ b/src/scriptapi.cpp
@@ -1718,6 +1718,20 @@ private:
return 0;
}
+ // is_empty(self, listname) -> true/false
+ static int l_is_empty(lua_State *L)
+ {
+ InvRef *ref = checkobject(L, 1);
+ const char *listname = luaL_checkstring(L, 2);
+ InventoryList *list = getlist(L, ref, listname);
+ if(list && list->getUsedSlots() > 0){
+ lua_pushboolean(L, false);
+ } else {
+ lua_pushboolean(L, true);
+ }
+ return 1;
+ }
+
// get_size(self, listname)
static int l_get_size(lua_State *L)
{
@@ -1944,6 +1958,7 @@ public:
};
const char InvRef::className[] = "InvRef";
const luaL_reg InvRef::methods[] = {
+ method(InvRef, is_empty),
method(InvRef, get_size),
method(InvRef, set_size),
method(InvRef, get_stack),