From 34f2894321a5c8424548fa98c2350168670aacd3 Mon Sep 17 00:00:00 2001
From: dokutan <54861821+dokutan@users.noreply.github.com>
Date: Fri, 01 May 2020 21:11:53 +0200
Subject: [PATCH] Update dependencies in manual.md (#547)

---
 technic_chests/register.lua |   49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/technic_chests/register.lua b/technic_chests/register.lua
index 61d49d3..9f63617 100644
--- a/technic_chests/register.lua
+++ b/technic_chests/register.lua
@@ -2,6 +2,7 @@
 
 local pipeworks = rawget(_G, "pipeworks")
 local fs_helpers = rawget(_G, "fs_helpers")
+local tubelib_exists = minetest.global_exists("tubelib")
 
 local allow_label = ""
 local tube_entry = ""
@@ -158,6 +159,16 @@
 	return function(pos, formname, fields, sender)
 		local meta = minetest.get_meta(pos)
 		local page = "main"
+
+		local owner = meta:get_string("owner")
+		if owner ~= "" then
+			-- prevent modification of locked chests
+			if owner ~= sender:get_player_name() then return end
+		elseif not fields.quit then
+			-- prevent modification of protected chests
+			if minetest.is_protected(pos, sender:get_player_name()) then return end
+		end
+
 		if fields.sort or (data.autosort and fields.quit and meta:get_int("autosort") == 1) then
 			sort_inventory(meta:get_inventory())
 		end
@@ -330,11 +341,45 @@
 	return def
 end
 
+local _TUBELIB_CALLBACKS = {
+	on_pull_item = function(pos, side, player_name)
+		if not minetest.is_protected(pos, player_name) then
+			local inv = minetest.get_meta(pos):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
+		end
+		return nil
+	end,
+	on_push_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,
+	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,
+}
+
 function technic.chests:register(name, data)
 	local def = technic.chests:definition(name, data)
 
 	local nn = "technic:"..name:lower()..(data.locked and "_locked" or "").."_chest"
 	minetest.register_node(":"..nn, def)
+
+	if tubelib_exists then
+		tubelib.register_node(nn, {}, _TUBELIB_CALLBACKS)
+	end
 
 	if data.color then
 		local mk_front
@@ -353,8 +398,10 @@
 			colordef.groups = self.groups_noinv
 			colordef.tiles = { def.tiles[1], def.tiles[2], def.tiles[3], def.tiles[4], def.tiles[5], mk_front("technic_chest_overlay"..postfix..".png") }
 			minetest.register_node(":"..nn..postfix, colordef)
+			if tubelib_exists then
+				tubelib.register_node(nn..postfix, {}, _TUBELIB_CALLBACKS)
+			end
 		end
 	end
-
 end
 

--
Gitblit v1.8.0