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