From 1d0687556a52891aeadc0e8d9a58e44c53cb826b Mon Sep 17 00:00:00 2001
From: Zefram <zefram@fysh.org>
Date: Fri, 15 Aug 2014 13:25:46 +0200
Subject: [PATCH] Fix music player's sound management

---
 technic/machines/other/frames.lua |   93 ++++++++++++++++++++++++++--------------------
 1 files changed, 52 insertions(+), 41 deletions(-)

diff --git a/technic/machines/other/frames.lua b/technic/machines/other/frames.lua
index 7b7059e..427e60b 100644
--- a/technic/machines/other/frames.lua
+++ b/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',	''},
 	}
 })

--
Gitblit v1.8.0