Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions depends.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
tubelib?
89 changes: 78 additions & 11 deletions pchest.lua
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
pchest={}

local tubelibEnabled = minetest.global_exists("tubelib")

minetest.register_craft({
output = "hook:pchest",
recipe = {
Expand All @@ -9,22 +11,38 @@ minetest.register_craft({
}
})

pchest.setpchest=function(pos,user)
pchest.setpchest=function(pos,user,item)
local meta = minetest.get_meta(pos)
meta:set_string("owner", user:get_player_name())
meta:set_int("state", 0)
meta:get_inventory():set_size("main", 32)
meta:get_inventory():set_size("trans", 1)
meta:set_string("formspec",
"size[8,8]" ..
"list[context;main;0,0;8,4;]" ..
"list[context;trans;0,0;0,0;]" ..
"list[current_player;main;0,4.3;8,4;]" ..
"listring[current_player;main]" ..
"listring[current_name;main]")
local tubelib = "true"
if item.meta.tubelib then
tubelib = item.meta.tubelib
end
meta:set_string("tubelib", tubelib)
pchest.setformspec(meta)
meta:set_string("infotext", "PChest by: " .. user:get_player_name())
end

pchest.setformspec = function (meta)
local header_space = 0
local fieldspec = ""
if tubelibEnabled then
header_space = 1
fieldspec = "checkbox[4,0;toggle_tubelib;Enable tubelib interaction;"..meta:get_string("tubelib").."]"
end
meta:set_string("formspec",
"size[8,".. (header_space+8) .."]" ..
fieldspec..
"list[context;main;0,".. (header_space+0) ..";8,4;]" ..
"list[context;trans;0,0;0,0;]" ..
"list[current_player;main;0,".. (header_space+4.3) ..";8,4;]" ..
"listring[current_player;main]" ..
"listring[current_name;main]")
end

minetest.register_tool("hook:pchest", {
description = "Portable locked chest",
inventory_image = "hook_extras_chest3.png",
Expand All @@ -35,7 +53,7 @@ minetest.register_tool("hook:pchest", {
local p=minetest.dir_to_facedir(user:get_look_dir())
local item=itemstack:to_table()
minetest.set_node(pointed_thing.above, {name = "hook:pchest_node",param1="",param2=p})
pchest.setpchest(pointed_thing.above,user)
pchest.setpchest(pointed_thing.above,user,item)

minetest.sound_play("default_place_node_hard", {pos=pointed_thing.above, gain = 1.0, max_hear_distance = 5})

Expand Down Expand Up @@ -121,6 +139,17 @@ minetest.register_node("hook:pchest_node", {
local m = minetest.get_meta(pos)
return m:get_string("owner") == "" and m:get_inventory():is_empty("main")
end,
on_receive_fields = function(pos, formname, fields, sender)
local name = sender:get_player_name()
local meta = minetest.get_meta(pos)
if name ~= meta:get_string("owner") then
return false
end
if fields.toggle_tubelib then
meta:set_string("tubelib", fields.toggle_tubelib)
end
pchest.setformspec(meta)
end,
on_punch = function(pos, node, player, pointed_thing)
local meta=minetest.get_meta(pos)
local name = player:get_player_name()
Expand All @@ -134,9 +163,47 @@ minetest.register_node("hook:pchest_node", {
table.insert(items,v:to_table())
end
local item = ItemStack("hook:pchest"):to_table()
item.meta={items=minetest.serialize(items)}
item.meta={items=minetest.serialize(items),tubelib=meta:get_string('tubelib')}
pinv:add_item("main", ItemStack(item))
minetest.set_node(pos, {name = "air"})
minetest.sound_play("default_dig_dig_immediate", {pos=pos, gain = 1.0, max_hear_distance = 5,})
end
})
})

if tubelibEnabled then
tubelib.register_node("hook:pchest_node", {}, {
on_pull_item = function(pos, side, player_name)
local meta = minetest.get_meta(pos)
if meta:get_string('tubelib') ~= 'true' then
return nil
end
local inv = meta:get_inventory()
for _, stack in pairs(inv:get_list("main")) do
if not stack:is_empty() then
return inv:remove_item("main", stack:get_name())
end
end
return nil
end,
on_push_item = function(pos, side, item, player_name)
local meta = minetest.get_meta(pos)
if meta:get_string('tubelib') ~= 'true' then
return false
end
local inv = meta:get_inventory()
if inv:room_for_item("main", item) then
inv:add_item("main", item)
return true
end
return false
end,
on_unpull_item = function(pos, side, item, player_name)
local inv = minetest.get_meta(pos):get_inventory()
if inv:room_for_item("main", item) then
inv:add_item("main", item)
return true
end
return false
end,
})
end