From df644d7f7736fce4e92a75d53f44b3df6671ceeb Mon Sep 17 00:00:00 2001
From: sdzen <sdzen@techie.com>
Date: Wed, 07 Aug 2013 02:08:22 +0200
Subject: [PATCH] Merge pull request #76 from kol0/patch-2

---
 wrench/init.lua |  373 +++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 315 insertions(+), 58 deletions(-)

diff --git a/wrench/init.lua b/wrench/init.lua
index 0950349..2c64d78 100644
--- a/wrench/init.lua
+++ b/wrench/init.lua
@@ -1,29 +1,221 @@
+--[[
+	Wrench mod
+		Adds a wrench that allows the player to pickup nodes that contain an inventory with items or metadata that needs perserving.
+		The wrench has the same tool capability as the normal hand.
+		To pickup a node simply right click on it. If the node contains a formspec, you will need to shift+right click instead.
+	supported_nodes
+		This table stores all nodes that are compatible with the wrench mod.
+		Syntax:
+			[<node name>] = {
+				name = "wrench:<temporary node name>",
+				lists = {"<inventory list name>"},
+				metas = {{string="<meta name>"},{int="<meta name>"},{float="<meta name>"}},
+				owner_protection[optional] = 1,
+				store_meta_always[optional] = 1,
+			}
+			<temporary node name> - can be anything as long as it is unique
+			[optional] - parameters do not have to be included
+			owner_protection - nodes that are protected by owner requirements (Ex. locked chests)
+			store_meta_always - when nodes are broken this ensures metadata and inventory is always stored (Ex. active state for machines)
+--]]
 local supported_nodes = {
-["default:chest"] = {name="wrench:default_chest", lists={"main"}},
-["default:furnace"] = {name="wrench:default_furnace", lists={"fuel", "src", "dst"}},
-["default:furnace_active"] = {name="wrench:default_furnace", lists={"fuel", "src", "dst"}},
-["technic:iron_chest"] = {name="wrench:technic_iron_chest", lists={"main"}},
-["technic:iron_locked_chest"] = {name="wrench:technic_iron_locked_chest", lists={"main"}},
-["technic:copper_chest"] = {name="wrench:technic_copper_chest", lists={"main"}},
-["technic:copper_locked_chest"] = {name="wrench:technic_copper_locked_chest", lists={"main"}},
-["technic:silver_chest"] = {name="wrench:technic_silver_chest", lists={"main"}},
-["technic:silver_locked_chest"] = {name="wrench:technic_silver_locked_chest", lists={"main"}},
-["technic:gold_chest"] = {name="wrench:technic_gold_chest", lists={"main"}},
-["technic:gold_locked_chest"] = {name="wrench:technic_gold_locked_chest", lists={"main"}},
-["technic:mithril_chest"] = {name="wrench:technic_mithril_chest", lists={"main"}},
-["technic:mithril_locked_chest"] = {name="wrench:technic_mithril_locked_chest", lists={"main"}},
-["technic:electric_furnace"] = {name="wrench:technic_electric_furnace", lists={"src", "dst"}},
-["technic:electric_furnace_active"] = {name="wrench:technic_electric_furnace_active", lists={"src", "dst"}},
-["technic:mv_electric_furnace"] = {name="wrench:technic_mv_electric_furnace", lists={"src", "dst", "upgrade1", "upgrade2"}},
-["technic:mv_electric_furnace_active"] = {name="wrench:technic_mv_electric_furnace_active", lists={"src", "dst", "upgrade1", "upgrade2"}},
-["technic:coal_alloy_furnace"] = {name="wrench:technic_coal_alloy_furnace", lists={"fuel", "src", "src2", "dst"}},
-["technic:coal_alloy_furnace_active"] = {name="wrench:technic_coal_alloy_furnace_active", lists={"fuel", "src", "src2", "dst"}},
-["technic:alloy_furnace"] = {name="wrench:technic_alloy_furnace", lists={"src", "src2", "dst"}},
-["technic:alloy_furnace_active"] = {name="wrench:technic_alloy_furnace_active", lists={"src", "src2", "dst"}},
-["technic:mv_alloy_furnace"] = {name="wrench:technic_mv_alloy_furnace", lists={"src", "src2", "dst", "upgrade1", "upgrade2"}},
-["technic:mv_alloy_furnace_active"] = {name="wrench:technic_mv_alloy_furnace_active", lists={"src", "src2", "dst", "upgrade1", "upgrade2"}},
-["technic:grinder"] = {name="wrench:technic_grinder", lists={"src", "dst"}},
-["technic:grinder_active"] = {name="wrench:technic_grinder_active", lists={"src", "dst"}},
+["default:chest"] = {
+	name="wrench:default_chest",
+	lists={"main"},
+	metas={},
+},
+["default:chest_locked"] = {
+	name="wrench:default_chest_locked",
+	lists={"main"},
+	metas={{string="owner"},{string="infotext"}},
+	owner_protection=1,
+},
+["default:furnace"] = {
+	name="wrench:default_furnace",
+	lists={"fuel", "src", "dst"},
+	metas={{string="infotext"},{float="fuel_totaltime"},{float="fuel_time"},{float="src_totaltime"},{float="src_time"}},
+},
+["default:furnace_active"] = {
+	name="wrench:default_furnace",
+	lists={"fuel", "src", "dst"},
+	metas={{string="infotext"},{float="fuel_totaltime"},{float="fuel_time"},{float="src_totaltime"},{float="src_time"}},
+	store_meta_always=1,
+},
+["default:sign_wall"] = {
+	name="wrench:default_sing_wall",
+	lists={},
+	metas={{string="infotext"},{string="text"}},
+},
+["technic:iron_chest"] = {
+	name="wrench:technic_iron_chest",
+	lists={"main"},
+	metas={},
+},
+["technic:iron_locked_chest"] = {
+	name="wrench:technic_iron_locked_chest",
+	lists={"main"},
+	metas={{string="infotext"},{string="owner"}},
+	owner_protection=1,
+},
+["technic:copper_chest"] = {
+	name="wrench:technic_copper_chest",
+	lists={"main"},
+	metas={},
+},
+["technic:copper_locked_chest"] = {
+	name="wrench:technic_copper_locked_chest",
+	lists={"main"},
+	metas={{string="infotext"},{string="owner"}},
+	owner_protection=1,
+},
+["technic:silver_chest"] = {
+	name="wrench:technic_silver_chest",
+	lists={"main"},
+	metas={{string="infotext"},{string="formspec"}},
+},
+["technic:silver_locked_chest"] = {
+	name="wrench:technic_silver_locked_chest",
+	lists={"main"},
+	metas={{string="infotext"},{string="owner"},{string="formspec"}},
+	owner_protection=1,
+	},
+["technic:gold_chest"] = {
+	name="wrench:technic_gold_chest",
+	lists={"main"},
+	metas={{string="infotext"},{string="formspec"}},
+},
+["technic:gold_locked_chest"] = {
+	name="wrench:technic_gold_locked_chest",
+	lists={"main"},
+	metas={{string="infotext"},{string="owner"},{string="formspec"}},
+	owner_protection=1,
+},
+["technic:mithril_chest"] = {
+	name="wrench:technic_mithril_chest",
+	lists={"main"},
+	metas={{string="infotext"},{string="formspec"}},
+},
+["technic:mithril_locked_chest"] = {
+	name="wrench:technic_mithril_locked_chest",
+	lists={"main"},
+	metas={{string="infotext"},{string="owner"},{string="formspec"}},
+	owner_protection=1,
+},
+["technic:electric_furnace"] = {
+	name="wrench:technic_electric_furnace",
+	lists={"src", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="src_time"}},
+},
+["technic:electric_furnace_active"] = {
+	name="wrench:technic_electric_furnace_active",
+	lists={"src", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="src_time"}},
+	store_meta_always=1,
+},
+["technic:mv_electric_furnace"] = {
+	name="wrench:technic_mv_electric_furnace",
+	lists={"src", "dst", "upgrade1", "upgrade2"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="MV_EU_demand"},{int="MV_EU_input"},{int="tube_time"},{int="src_time"}},
+},
+["technic:mv_electric_furnace_active"] = {
+	name="wrench:technic_mv_electric_furnace_active",
+	lists={"src", "dst", "upgrade1", "upgrade2"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="MV_EU_demand"},{int="MV_EU_input"},{int="tube_time"},{int="src_time"}},
+	store_meta_always=1,
+},
+["technic:coal_alloy_furnace"] = {
+	name="wrench:technic_coal_alloy_furnace",
+	lists={"fuel", "src", "src2", "dst"},
+	metas={{string="infotext"},{float="fuel_totaltime"},{float="fuel_time"},{float="src_totaltime"},{float="src_time"}},
+},
+["technic:coal_alloy_furnace_active"] = {
+	name="wrench:technic_coal_alloy_furnace_active",
+	lists={"fuel", "src", "src2", "dst"},
+	metas={{string="infotext"},{float="fuel_totaltime"},{float="fuel_time"},{float="src_totaltime"},{float="src_time"}},
+	store_meta_always=1,
+},
+["technic:alloy_furnace"] = {
+	name="wrench:technic_alloy_furnace",
+	lists={"src", "src2", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="tube_time"},{int="src_time"}},
+},
+["technic:alloy_furnace_active"] = {
+	name="wrench:technic_alloy_furnace_active",
+	lists={"src", "src2", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="tube_time"},{int="src_time"}},
+	store_meta_always=1,
+},
+["technic:mv_alloy_furnace"] = {
+	name="wrench:technic_mv_alloy_furnace",
+	lists={"src", "src2", "dst", "upgrade1", "upgrade2"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="MV_EU_demand"},{int="MV_EU_input"},{int="tube_time"},{int="src_time"}},
+},
+["technic:mv_alloy_furnace_active"] = {
+	name="wrench:technic_mv_alloy_furnace_active",
+	lists={"src", "src2", "dst", "upgrade1", "upgrade2"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="MV_EU_demand"},{int="MV_EU_input"},{int="tube_time"},{int="src_time"}},
+	store_meta_always=1,
+},
+["technic:tool_workshop"] = {
+	name="wrench:technic_tool_workshop",
+	lists={"src"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"}},
+},
+["technic:grinder"] = {
+	name="wrench:technic_grinder",
+	lists={"src", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="src_time"}},
+},
+["technic:grinder_active"] = {
+	name="wrench:technic_grinder_active",
+	lists={"src", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="src_time"}},
+	store_meta_always=1,
+},
+["technic:mv_grinder"] = {
+	name="wrench:technic_mv_grinder",
+	lists={"src", "dst", "upgrade1", "upgrade2"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="MV_EU_demand"},{int="MV_EU_input"},{int="tube_time"},{int="src_time"}},
+},
+["technic:mv_grinder_active"] = {
+	name="wrench:technic_mv_grinder_active",
+	lists={"src", "dst", "upgrade1", "upgrade2"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="MV_EU_demand"},{int="MV_EU_input"},{int="tube_time"},{int="src_time"}},
+	store_meta_always=1,
+},
+["technic:extractor"] = {
+	name="wrench:technic_extractor",
+	lists={"src", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="src_time"}},
+},
+["technic:extractor_active"] = {
+	name="wrench:technic_extractor_active",
+	lists={"src", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="src_time"}},
+	store_meta_always=1,
+},
+["technic:compressor"] = {
+	name="wrench:technic_compressor",
+	lists={"src", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="src_time"}},
+},
+["technic:compressor_active"] = {
+	name="wrench:technic_compressor_active",
+	lists={"src", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="src_time"}},
+	store_meta_always=1,
+},
+["technic:cnc"] = {
+	name="wrench:technic_cnc",
+	lists={"src", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="src_time"},{string="cnc_product"}},
+},
+["technic:cnc_active"] = {
+	name="wrench:technic_cnc_active",
+	lists={"src", "dst"},
+	metas={{string="infotext"},{string="formspec"},{int="state"},{int="LV_EU_demand"},{int="LV_EU_input"},{int="src_time"},{string="cnc_product"}},
+	store_meta_always=1,
+},
 }
 local chest_mark_colors = {
     {'_black','Black'},
@@ -44,8 +236,38 @@
     {'','None'}
 }
 for i=1,15,1 do
-	supported_nodes["technic:gold_chest"..chest_mark_colors[i][1]] = {name="wrench:technic_gold_chest"..chest_mark_colors[i][1], lists={"main"}}
-	supported_nodes["technic:gold_locked_chest"..chest_mark_colors[i][1]] = {name="wrench:technic_gold_locked_chest"..chest_mark_colors[i][1], lists={"main"}}
+	supported_nodes["technic:gold_chest"..chest_mark_colors[i][1]] = {
+		name="wrench:technic_gold_chest"..chest_mark_colors[i][1],
+		lists={"main"},
+		metas={{string="infotext"},{string="formspec"}},
+	}
+	supported_nodes["technic:gold_locked_chest"..chest_mark_colors[i][1]] = {
+		name="wrench:technic_gold_locked_chest"..chest_mark_colors[i][1],
+		lists={"main"},
+		metas={{string="infotext"},{string="owner"},{string="formspec"}},
+		owner_protection=1,
+	}
+end
+for i=0,8,1 do
+	if i==0 then i="" end
+	supported_nodes["technic:battery_box"..i] = {
+		name="wrench:technic_battery_box"..i,
+		lists={"src", "dst"},
+		metas={{string="infotext"},{string="formspec"},{int="LV_EU_demand"},{int="LV_EU_supply"},{int="LV_EU_input"},{int="internal_EU_charge"},{float="last_side_shown"}},
+		store_meta_always=1,
+	}
+	supported_nodes["technic:mv_battery_box"..i] = {
+		name="wrench:technic_mv_battery_box"..i,
+		lists={"src", "dst"},
+		metas={{string="infotext"},{string="formspec"},{int="MV_EU_demand"},{int="MV_EU_supply"},{int="MV_EU_input"},{int="internal_EU_charge"},{float="last_side_shown"}},
+		store_meta_always=1,
+	}
+	supported_nodes["technic:hv_battery_box"..i] = {
+		name="wrench:technic_hv_battery_box"..i,
+		lists={"src", "dst"},
+		metas={{string="infotext"},{string="formspec"},{int="HV_EU_demand"},{int="HV_EU_supply"},{int="HV_EU_input"},{int="internal_EU_charge"},{float="last_side_shown"}},
+		store_meta_always=1,
+	}
 end
 
 local function convert_to_original_name(name)
@@ -54,35 +276,48 @@
 	end
 end
 
-for name,_ in pairs(supported_nodes) do
+for name,info in pairs(supported_nodes) do
 	local olddef = minetest.registered_nodes[name]
 	if olddef ~= nil then
 		local newdef = {}
 		for key,value in pairs(olddef) do
 			newdef[key] = value
 		end
-		name = supported_nodes[name].name
 		newdef.stack_max = 1
 		newdef.description = newdef.description.." with items"
+		newdef.groups = {}
 		newdef.groups.not_in_creative_inventory = 1
 		newdef.on_construct = nil
 		newdef.on_destruct = nil
 		newdef.after_place_node = function(pos, placer, itemstack)
-			if olddef.after_place_node ~= nil then olddef.after_place_node(pos, placer, itemstack) end
-			if not placer:is_player() then return end
-			local node = minetest.get_node(pos)
-			local item = convert_to_original_name(itemstack:get_name())
-			minetest.set_node(pos, {name = item, param2 = node.param2})
-			local inv = minetest.get_meta(pos):get_inventory()
-			local data = minetest.deserialize(itemstack:get_metadata())
-			for listname,list in pairs(data) do
-				inv:set_list(listname, list)
-			end
+			minetest.set_node(pos, {name = convert_to_original_name(itemstack:get_name()),
+												param2 = minetest.get_node(pos).param2})
+				local meta = minetest.get_meta(pos)
+				local inv = meta:get_inventory()
+				local item_meta =itemstack:to_table()
+				local data = minetest.deserialize(item_meta["metadata"])
+				local lists = data.lists
+				for listname,list in pairs(lists) do
+					inv:set_list(listname, list)
+				end
+				local metas = data.metas
+				local temp = nil
+				for i=1,#metas,1 do
+					temp = metas[i]
+					if temp.string ~= nil then
+						meta:set_string(temp.string, temp.value)
+					end
+					if temp.int ~= nil then
+						meta:set_int(temp.int, temp.value)
+					end
+					if temp.float ~= nil then
+						meta:set_float(temp.float, temp.value)
+					end
+				end
 		end
-		minetest.register_node(name, newdef)
+		minetest.register_node(info.name, newdef)
 	end
 end
-
 
 minetest.register_tool("wrench:wrench", {
 	description = "Wrench",
@@ -104,19 +339,24 @@
 		local name = minetest.get_node(pos).name
 		local support = supported_nodes[name]
 		if support == nil then return end
-		if name:find("_locked_chest") ~= nil then
-			local meta = minetest.get_meta(pos)
-			if not has_locked_chest_privilege(meta, placer) then
-				minetest.log("action", player:get_player_name()..
-				" tried to destroy a locked chest belonging to "..
-				meta:get_string("owner").." at "..
-				minetest.pos_to_string(pos))
-				return
+		local meta = minetest.get_meta(pos)
+		if support.owner_protection ~= nil then
+			local owner = meta:get_string("owner")
+			if owner ~= nil then
+				if owner ~= placer:get_player_name() then
+					minetest.log("action", placer:get_player_name()..
+					" tried to destroy a locked chest belonging to "..
+					owner.." at "..
+					minetest.pos_to_string(pos))
+					return
+				end
 			end
 		end
+		
 		local lists = support.lists
-		local inv = minetest.get_meta(pos):get_inventory()
+		local inv = meta:get_inventory()
 		local empty = true
+		local metadata_str = {}
 		local list_str = {}
 		for i=1,#lists,1 do
 			if not inv:is_empty(lists[i]) then empty = false end
@@ -126,17 +366,34 @@
 			end
 			list_str[lists[i]] = list
 		end
+		metadata_str.lists = list_str
+		
+		local metas = support.metas
+		local meta_str = {}
+		for i=1,#metas,1 do
+			local temp = metas[i]
+			if temp.string ~= nil then
+				meta_str[i] = {string = temp.string, value = meta:get_string(temp.string)}
+			end
+			if temp.int ~= nil then
+				meta_str[i] = {int = temp.int, value = meta:get_int(temp.int)}
+			end
+			if temp.float ~= nil then
+				meta_str[i] = {float = temp.float, value = meta:get_float(temp.float)}
+			end
+		end
+		metadata_str.metas = meta_str
+		
 		inv = placer:get_inventory()
-		local stack = {}
-		stack.name = name
+		local stack = {name = name}
 		if inv:room_for_item("main", stack) then
 			minetest.remove_node(pos)
 			itemstack:add_wear(65535/20)
-			if empty then
+			if empty and #lists > 0 and support.store_meta_always == nil then
 				inv:add_item("main", stack)
 			else
 				stack.name = supported_nodes[name].name
-				stack.metadata = minetest.serialize(list_str)
+				stack.metadata = minetest.serialize(metadata_str)
 				inv:add_item("main", stack)
 			end
 		end
@@ -147,8 +404,8 @@
 minetest.register_craft({
 	output = "wrench:wrench",
 	recipe = {
-	{"default:iron_lump","","default:iron_lump"},
-	{"","default:iron_lump",""},
-	{"","default:iron_lump",""},
+	{"default:steel_ingot","","default:steel_ingot"},
+	{"","default:steel_ingot",""},
+	{"","default:steel_ingot",""},
 	},
-})
\ No newline at end of file
+})

--
Gitblit v1.8.0