diff options
Diffstat (limited to 'mesecons_mvps')
| -rw-r--r-- | mesecons_mvps/init.lua | 86 | 
1 files changed, 20 insertions, 66 deletions
| diff --git a/mesecons_mvps/init.lua b/mesecons_mvps/init.lua index 5daa50c..8e6fd07 100644 --- a/mesecons_mvps/init.lua +++ b/mesecons_mvps/init.lua @@ -1,7 +1,6 @@  --register stoppers for movestones/pistons  mesecon.mvps_stoppers = {} -mesecon.mvps_unmov = {}  mesecon.on_mvps_move = {}  function mesecon.is_mvps_stopper(node, pushdir, stack, stackid) @@ -9,6 +8,7 @@ function mesecon.is_mvps_stopper(node, pushdir, stack, stackid)  	if type (get_stopper) == "function" then  		get_stopper = get_stopper(node, pushdir, stack, stackid)  	end +	if (get_stopper) then print(node.name) end  	return get_stopper  end @@ -19,15 +19,6 @@ function mesecon.register_mvps_stopper(nodename, get_stopper)  	mesecon.mvps_stoppers[nodename] = get_stopper  end --- Objects that cannot be moved (e.g. movestones) -function mesecon.register_mvps_unmov(objectname) -	mesecon.mvps_unmov[objectname] = true; -end - -function mesecon.is_mvps_unmov(objectname) -	return mesecon.mvps_unmov[objectname] -end -  -- Functions to be called on mvps movement  function mesecon.register_on_mvps_move(callback)  	mesecon.on_mvps_move[#mesecon.on_mvps_move+1] = callback @@ -70,13 +61,21 @@ function mesecon.mvps_get_stack(pos, dir, maximum)  	return nodes  end -function mesecon.mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: direction of push; maximum: maximum nodes to be pushed -	local nodes = mesecon.mvps_get_stack(pos, dir, maximum) +function mesecon.mvps_push(pos, dir, maximum) +	return mesecon.mvps_push_or_pull(pos, dir, dir, maximum) +end + +function mesecon.mvps_pull_all(pos, dir, maximum) +	return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum) +end + +function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum) -- pos: pos of mvps; stackdir: direction of building the stack; movedir: direction of actual movement; maximum: maximum nodes to be pushed +	local nodes = mesecon.mvps_get_stack(pos, stackdir, maximum)  	if not nodes then return end -	-- determine if one of the nodes blocks the push +	-- determine if one of the nodes blocks the push / pull  	for id, n in ipairs(nodes) do -		if mesecon.is_mvps_stopper(n.node, dir, nodes, id) then +		if mesecon.is_mvps_stopper(n.node, movedir, nodes, id) then  			return  		end  	end @@ -94,22 +93,23 @@ function mesecon.mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: directio  	-- add nodes  	for _, n in ipairs(nodes) do -		local np = mesecon.addPosRule(n.pos, dir) +		local np = mesecon.addPosRule(n.pos, movedir) +  		minetest.add_node(np, n.node)  		minetest.get_meta(np):from_table(n.meta)  	end -	 +  	local moved_nodes = {}  	local oldstack = mesecon.tablecopy(nodes)  	for i in ipairs(nodes) do  		moved_nodes[i] = {}  		moved_nodes[i].oldpos = nodes[i].pos -		nodes[i].pos = mesecon.addPosRule(nodes[i].pos, dir) +		nodes[i].pos = mesecon.addPosRule(nodes[i].pos, movedir)  		moved_nodes[i].pos = nodes[i].pos  		moved_nodes[i].node = nodes[i].node  		moved_nodes[i].meta = nodes[i].meta  	end -	 +  	on_mvps_move(moved_nodes)  	return true, nodes, oldstack @@ -128,7 +128,7 @@ function mesecon.mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: dire  	if ((not minetest.registered_nodes[nn.name]) --unregistered node  	or minetest.registered_nodes[nn.name].liquidtype == "none") --non-liquid node -	and not mesecon.is_mvps_stopper(nn, {x = -dir.x, y = -dir.y, z = -dir.z}, {{pos = np, node = nn}}, 1) then --non-stopper node +	and not mesecon.is_mvps_stopper(nn, dir, {{pos = np, node = nn}}, 1) then --non-stopper node  		local meta = minetest.get_meta(np):to_table()  		minetest.remove_node(np)  		minetest.add_node(pos, nn) @@ -143,52 +143,6 @@ function mesecon.mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: dire  	return {{pos = np, node = {param2 = 0, name = "air"}}, {pos = pos, node = nn}}  end -function mesecon.mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: direction of pull -	local lpos = {x=pos.x-direction.x, y=pos.y-direction.y, z=pos.z-direction.z} -- 1 away -	local lnode = minetest.get_node(lpos) -	local lpos2 = {x=pos.x-direction.x*2, y=pos.y-direction.y*2, z=pos.z-direction.z*2} -- 2 away -	local lnode2 = minetest.get_node(lpos2) - -	--avoid pulling solid nodes -	if lnode.name ~= "ignore" -	and lnode.name ~= "air" -	and ((not minetest.registered_nodes[lnode.name]) -	or minetest.registered_nodes[lnode.name].liquidtype == "none") then -		return -	end - -	--avoid pulling empty or liquid nodes -	if lnode2.name == "ignore" -	or lnode2.name == "air" -	or (minetest.registered_nodes[lnode2.name] -	and minetest.registered_nodes[lnode2.name].liquidtype ~= "none") then -		return -	end - -	local moved_nodes = {} -	local oldpos = {x=lpos2.x + direction.x, y=lpos2.y + direction.y, z=lpos2.z + direction.z} -	repeat -		lnode2 = minetest.get_node(lpos2) -		local meta = minetest.get_meta(lnode2):to_table() -		minetest.add_node(oldpos, lnode2) -		minetest.get_meta(oldpos):from_table(meta) -		moved_nodes[#moved_nodes+1] = {pos = oldpos, oldpos = lpos2, node = lnode2, meta = meta} -		nodeupdate(oldpos) -		oldpos = {x=lpos2.x, y=lpos2.y, z=lpos2.z} -		lpos2.x = lpos2.x-direction.x -		lpos2.y = lpos2.y-direction.y -		lpos2.z = lpos2.z-direction.z -		lnode = minetest.get_node(lpos2) -	until lnode.name == "air" -	or lnode.name == "ignore" -	or (minetest.registered_nodes[lnode.name] -	and minetest.registered_nodes[lnode.name].liquidtype ~= "none") -	minetest.remove_node(oldpos) -	mesecon.on_dignode(oldpos, lnode2) -	mesecon.update_autoconnect(oldpos) -	on_mvps_move(moved_nodes) -end -  function mesecon.mvps_move_objects(pos, dir, nodestack)  	local objects_to_move = {} @@ -218,7 +172,7 @@ function mesecon.mvps_move_objects(pos, dir, nodestack)  	for _, obj in ipairs(objects_to_move) do  		local entity = obj:get_luaentity() -		if not entity or not mesecon.is_mvps_unmov(entity.name) then +		if not entity then  			local np = mesecon.addPosRule(obj:getpos(), dir)  			--move only if destination is not solid | 
