DS-Minetest
2017-06-23 16146231b8f8c8562c1d1fd4a2c84bcf4134c3c5
wrench/init.lua
@@ -20,19 +20,11 @@
dofile(modpath.."/technic.lua")
-- Boilerplate to support localized strings if intllib mod is installed.
local S
if rawget(_G, "intllib") then
   S = intllib.Getter()
else
   S = function(s) return s end
end
local S = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end
local function get_meta_type(name, metaname)
   local def = wrench.registered_nodes[name]
   if not def or not def.metas or not def.metas[metaname] then
      return nil
   end
   return def.metas[metaname]
   return def and def.metas and def.metas[metaname] or nil
end
local function get_pickup_name(name)
@@ -41,14 +33,21 @@
local function restore(pos, placer, itemstack)
   local name = itemstack:get_name()
   local node = minetest.get_node(pos)
   local meta = minetest.get_meta(pos)
   local inv = meta:get_inventory()
   local data = minetest.deserialize(itemstack:get_metadata())
   minetest.set_node(pos, {name = data.name})
   local lists = data.lists
   for listname, list in pairs(lists) do
      inv:set_list(listname, list)
   local data = itemstack:get_meta():get_string("data")
   data = (data ~= "" and data) or   itemstack:get_metadata()
   data = minetest.deserialize(data)
   if not data then
      minetest.remove_node(pos)
      minetest.log("error", placer:get_player_name().." wanted to place "..
            name.." at "..minetest.pos_to_string(pos)..
            ", but it had no data.")
      minetest.log("verbose", "itemstack: "..itemstack:to_string())
      return true
   end
   minetest.set_node(pos, {name = data.name, param2 = node.param2})
   for name, value in pairs(data.metas) do
      local meta_type = get_meta_type(data.name, name)
      if meta_type == wrench.META_TYPE_INT then
@@ -58,6 +57,10 @@
      elseif meta_type == wrench.META_TYPE_STRING then
         meta:set_string(name, value)
      end
   end
   local lists = data.lists
   for listname, list in pairs(lists) do
      inv:set_list(listname, list)
   end
   itemstack:take_item()
   return itemstack
@@ -100,8 +103,9 @@
      if not placer or not pos then
         return
      end
      if minetest.is_protected(pos, placer:get_player_name()) then
         minetest.record_protection_violation(pos, placer:get_player_name())
      local player_name = placer:get_player_name()
      if minetest.is_protected(pos, player_name) then
         minetest.record_protection_violation(pos, player_name)
         return
      end
      local name = minetest.get_node(pos).name
@@ -118,9 +122,9 @@
      local meta = minetest.get_meta(pos)
      if def.owned then
         local owner = meta:get_string("owner")
         if owner and owner ~= placer:get_player_name() then
            minetest.log("action", placer:get_player_name()..
               " tried to pick up a owned node belonging to "..
         if owner and owner ~= player_name then
            minetest.log("action", player_name..
               " tried to pick up an owned node belonging to "..
               owner.." at "..
               minetest.pos_to_string(pos))
            return
@@ -134,9 +138,6 @@
      local inv = meta:get_inventory()
      local lists = {}
      for _, listname in pairs(def.lists or {}) do
         if not inv:is_empty(listname) then
            empty = false
         end
         local list = inv:get_list(listname)
         for i, stack in pairs(list) do
            list[i] = stack:to_string()
@@ -144,20 +145,20 @@
         lists[listname] = list
      end
      metadata.lists = lists
      local metas = {}
      local item_meta = stack:get_meta()
      metadata.metas = {}
      for name, meta_type in pairs(def.metas or {}) do
         if meta_type == wrench.META_TYPE_INT then
            metas[name] = meta:get_int(name)
            metadata.metas[name] = meta:get_int(name)
         elseif meta_type == wrench.META_TYPE_FLOAT then
            metas[name] = meta:get_float(name)
            metadata.metas[name] = meta:get_float(name)
         elseif meta_type == wrench.META_TYPE_STRING then
            metas[name] = meta:get_string(name)
            metadata.metas[name] = meta:get_string(name)
         end
      end
      metadata.metas = metas
      stack:set_metadata(minetest.serialize(metadata))
      item_meta:set_string("data", minetest.serialize(metadata))
      minetest.remove_node(pos)
      itemstack:add_wear(65535 / 20)
      player_inv:add_item("main", stack)