sdzen
2013-08-07 df644d7f7736fce4e92a75d53f44b3df6671ceeb
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",""},
   },
})
})