Zefram
2014-08-13 38e85e9775b132b0ce504d8d795632668eb47852
technic/machines/other/frames.lua
@@ -3,6 +3,8 @@
frames = {}
local infinite_stacks = minetest.setting_getbool("creative_mode") and minetest.get_modpath("unified_inventory") == nil
local frames_pos = {}
-- Helpers
@@ -79,14 +81,14 @@
end
local function add_table(table,toadd)
   local i=1
   local i = 1
   while true do
      o=table[i]
      if o==toadd then return end
      if o==nil then break end
      i=i+1
      o = table[i]
      if o == toadd then return end
      if o == nil then break end
      i = i+1
   end
   table[i]=toadd
   table[i] = toadd
end
local function move_nodes_vect(poslist,vect,must_not_move,owner)
@@ -108,48 +110,41 @@
         return
      end]]
   end
   nodelist={}
   frameslist = {}
   for _,pos in ipairs(poslist) do
      local node=minetest.get_node(pos)
      local meta=minetest.get_meta(pos):to_table()
      nodelist[#(nodelist)+1]={pos=pos,node=node,meta=meta}
      if frames_pos[pos_to_string(pos)] then
         frameslist[#frameslist+1] = {pos=pos, name=frames_pos[pos_to_string(pos)]}
         frames_pos[pos_to_string(pos)] = nil
      end
   local nodelist = {}
   for _, pos in ipairs(poslist) do
      local node = minetest.get_node(pos)
      local meta = minetest.get_meta(pos):to_table()
      nodelist[#(nodelist)+1] = {oldpos = pos, pos = vector.add(pos, vect), node = node, meta = meta}
   end
   objects={}
   for _,pos in ipairs(poslist) do
   local objects = {}
   for _, pos in ipairs(poslist) do
      for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do
         add_table(objects,object)
         local entity = object:get_luaentity()
         if not entity or not mesecon:is_mvps_unmov(entity.name) then
            add_table(objects, object)
         end
      end
   end
   for _,obj in ipairs(objects) do
      obj:setpos(vector.add(obj:getpos(),vect))
      le=obj:get_luaentity()
      if le and le.name == "pipeworks:tubed_item" then
         le.start_pos=vector.add(le.start_pos,vect)
      end
   end
   for _, n in ipairs(frameslist) do
      local npos=vector.add(n.pos,vect)
      frames_pos[pos_to_string(npos)] = n.name
   for _, obj in ipairs(objects) do
      obj:setpos(vector.add(obj:getpos(), vect))
   end
   for _,n in ipairs(nodelist) do
      local npos=vector.add(n.pos,vect)
      minetest.set_node(npos,n.node)
      local meta=minetest.get_meta(npos)
      local npos = n.pos
      minetest.set_node(npos, n.node)
      local meta = minetest.get_meta(npos)
      meta:from_table(n.meta)
      for __,pos in ipairs(poslist) do
         if npos.x==pos.x and npos.y==pos.y and npos.z==pos.z then
         if npos.x == pos.x and npos.y == pos.y and npos.z == pos.z then
            table.remove(poslist, __)
            break
         end
      end
   end
   for __,pos in ipairs(poslist) do
   for __, pos in ipairs(poslist) do
      minetest.remove_node(pos)
   end
   for _, callback in ipairs(mesecon.on_mvps_move) do
      callback(nodelist)
   end
end
@@ -227,6 +222,7 @@
      paramtype = "light",
      frame=1,
      drop="technic:frame_111111",
      sunlight_propagates = true,
      frame_connect_all=function(nodename)
         l2={}
         l1={{x=-1,y=0,z=0},{x=1,y=0,z=0},{x=0,y=-1,z=0},{x=0,y=1,z=0},{x=0,y=0,z=-1},{x=0,y=0,z=1}}
@@ -272,10 +268,12 @@
         else
            minetest.set_node(pos, {name = itemstack:get_name()})
         end
         itemstack:take_item()
         if not infinite_stacks then
            itemstack:take_item()
         end
         return itemstack
      end,
      on_rightclick = function(pos, node, placer, itemstack)
      on_rightclick = function(pos, node, placer, itemstack, pointed_thing)
         if is_supported_node(itemstack:get_name()) then
            if minetest.is_protected(pos, placer:get_player_name()) then
               minetest.log("action", placer:get_player_name()
@@ -319,6 +317,11 @@
            obj:get_luaentity():set_node({name=node.name})
            
            return itemstack
         else
            --local pointed_thing = {type = "node", under = pos}
            if pointed_thing then
               minetest.item_place_node(itemstack, placer, pointed_thing)
            end
         end
      end,
   })
@@ -539,11 +542,15 @@
      nnode.name = frames_pos[pos_to_string(nnodepos)]
   end
   local meta = minetest.get_meta(pos)
   if meta:get_int("last_moved") == minetest.get_gametime() then
      return
   end
   local owner = meta:get_string("owner")
   if minetest.registered_nodes[nnode.name].frame==1 then
      local connected_nodes=get_connected_nodes(nnodepos)
      move_nodes_vect(connected_nodes,dir,pos,owner)
   end
   minetest.get_meta(vector.add(pos, dir)):set_int("last_moved", minetest.get_gametime())
end
minetest.register_node("technic:frame_motor",{
@@ -795,11 +802,11 @@
})
minetest.register_tool("technic:template_tool",{
   description = S("Template tool"),
   description = S("Template Tool"),
   inventory_image = "technic_template_tool.png",
   on_use = function(itemstack, puncher, pointed_thing)
      local pos = pointed_thing.under
      if pos == nil or (minetest.is_protected and minetest.is_protected(pos, placer:get_player_name())) then
      if pos == nil or (minetest.is_protected and minetest.is_protected(pos, puncher:get_player_name())) then
         return nil
      end
      local node = minetest.get_node(pos)
@@ -840,15 +847,19 @@
   local dir = minetest.facedir_to_dir(node.param2)
   local nnode=minetest.get_node(nnodepos)
   local meta = minetest.get_meta(pos)
   if meta:get_int("last_moved") == minetest.get_gametime() then
      return
   end
   local owner = meta:get_string("owner")
   if nnode.name == "technic:template" then
      local connected_nodes=get_template_nodes(nnodepos)
      move_nodes_vect(connected_nodes,dir,pos,owner)
   end
   minetest.get_meta(vector.add(pos, dir)):set_int("last_moved", minetest.get_gametime())
end
minetest.register_node("technic:template_motor",{
   description = S("Template motor"),
   description = S("Template Motor"),
   tiles = {"pipeworks_filter_top.png^[transformR90", "technic_lv_cable.png", "technic_lv_cable.png",
      "technic_lv_cable.png", "technic_lv_cable.png", "technic_lv_cable.png"},
   groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2,mesecon=2},
@@ -874,7 +885,7 @@
   output = 'technic:frame_motor',
   recipe = {
      {'',               'technic:frame_111111',   ''},
      {'group:mesecons_conductor_craftable',   'technic:motor',   'group:mesecons_conductor_craftable'},
      {'group:mesecon_conductor_craftable',   'technic:motor',   'group:mesecon_conductor_craftable'},
      {'',               'technic:frame_111111',   ''},
   }
})
@@ -902,7 +913,7 @@
   output = 'technic:template_motor',
   recipe = {
      {'',               'technic:template',   ''},
      {'group:mesecons_conductor_craftable',   'technic:motor',   'group:mesecons_conductor_craftable'},
      {'group:mesecon_conductor_craftable',   'technic:motor',   'group:mesecon_conductor_craftable'},
      {'',               'technic:template',   ''},
   }
})