diff options
| -rw-r--r-- | mesecons_pistons/init.lua | 3 | ||||
| -rw-r--r-- | mesecons_pistons/pistons_down.lua | 222 | ||||
| -rw-r--r-- | mesecons_pistons/pistons_up.lua | 210 | 
3 files changed, 435 insertions, 0 deletions
| diff --git a/mesecons_pistons/init.lua b/mesecons_pistons/init.lua index 742395a..f4d3985 100644 --- a/mesecons_pistons/init.lua +++ b/mesecons_pistons/init.lua @@ -228,3 +228,6 @@ function mesecon:piston_get_direction(node)  		return {x=0, y=0, z=-1}  	end  end + +dofile(minetest.get_modpath("mesecons_pistons").."/pistons_down.lua") +dofile(minetest.get_modpath("mesecons_pistons").."/pistons_up.lua")
\ No newline at end of file diff --git a/mesecons_pistons/pistons_down.lua b/mesecons_pistons/pistons_down.lua new file mode 100644 index 0000000..62ef986 --- /dev/null +++ b/mesecons_pistons/pistons_down.lua @@ -0,0 +1,222 @@ +--PISTONS +--registration normal one: +minetest.register_node("mesecons_pistons:piston_down_normal", { +	description = "Piston DOWN", +	tiles = {"jeija_piston_tb.png", "jeija_piston_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"}, +	groups = {cracky=3}, +	after_dig_node = function(pos, oldnode) +		local dir = {x=0, y=-1, z=0} +		pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check + +		--ensure piston is extended +		local checknode = minetest.env:get_node(pos) +		if checknode.name == "mesecons_pistons:piston_down_pusher_normal" then +			if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston +				minetest.env:remove_node(pos) --remove the pusher +			end +		end +	end, +}) + +--registration sticky one: +minetest.register_node("mesecons_pistons:piston_down_sticky", { +	description = "Sticky Piston DOWN", +	tiles = {"jeija_piston_tb.png", "jeija_piston_sticky_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"}, +	groups = {cracky=3}, +	after_dig_node = function(pos, oldnode) +		local dir = {x=0, y=-1, z=0} +		pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check + +		--ensure piston is extended +		local checknode = minetest.env:get_node(pos) +		if checknode.name == "mesecons_pistons:piston_down_pusher_sticky" then +			if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston +				minetest.env:remove_node(pos) --remove the pusher +			end +		end +	end, +}) + +minetest.register_craft({ +	output = "mesecons_pistons:piston_down_normal", +	recipe = { +		{"mesecons_pistons:piston_up_normal"}, +	} +}) +minetest.register_craft({ +	output = "mesecons_pistons:piston_normal", +	recipe = { +		{"mesecons_pistons:piston_down_normal"}, +	} +}) +minetest.register_craft({ +	output = "mesecons_pistons:piston_down_sticky", +	recipe = { +		{"mesecons_pistons:piston_up_sticky"}, +	} +}) +minetest.register_craft({ +	output = "mesecons_pistons:piston_sticky", +	recipe = { +		{"mesecons_pistons:piston_down_sticky"}, +	} +}) + +minetest.register_node("mesecons_pistons:piston_down_pusher_normal", { +	drawtype = "nodebox", +	tiles = {"jeija_piston_pusher_normal.png"}, +	paramtype = "light", +	diggable = false, +	selection_box = { +		type = "fixed", +		fixed = { +			{-0.2, -0.3, -0.2, 0.2, 0.5, 0.2}, +			{-0.5, -0.5, -0.5, 0.5, -0.3, 0.5}, +		}, +	}, +	node_box = { +		type = "fixed", +		fixed = { +			{-0.2, -0.3, -0.2, 0.2, 0.5, 0.2}, +			{-0.5, -0.5, -0.5, 0.5, -0.3, 0.5}, +		}, +	}, +}) + +mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_normal") +mesecon:register_mvps_stopper("mesecons_pistons:piston_down_pusher_sticky") + +minetest.register_node("mesecons_pistons:piston_down_pusher_sticky", { +	drawtype = "nodebox", +	tiles = { +		"jeija_piston_pusher_sticky.png", +		"jeija_piston_pusher_normal.png", +		"jeija_piston_pusher_normal.png", +		"jeija_piston_pusher_normal.png", +		"jeija_piston_pusher_normal.png", +		"jeija_piston_pusher_normal.png" +		}, +	paramtype = "light", +	diggable = false, +	selection_box = { +		type = "fixed", +		fixed = { +			{-0.2, -0.3, -0.2, 0.2, 0.5, 0.2}, +			{-0.5, -0.5, -0.5, 0.5, -0.3, 0.5}, +		}, +	}, +	node_box = { +		type = "fixed", +		fixed = { +			{-0.2, -0.3, -0.2, 0.2, 0.5, 0.2}, +			{-0.5, -0.5, -0.5, 0.5, -0.3, 0.5}, +		}, +	}, +}) + +-- Push action +mesecon:register_on_signal_on(function(pos, node) +	if node.name ~= "mesecons_pistons:piston_down_normal" and node.name ~= "mesecons_pistons:piston_down_sticky" then +		return +	end + +	local dir = {x=0, y=-1, z=0} +	pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node being pushed + +	--determine the number of nodes that need to be pushed +	local count = 0 +	local checkpos = {x=pos.x, y=pos.y, z=pos.z} --first node being pushed +	while true do +		local checknode = minetest.env:get_node(checkpos) + +		--check for collision with stopper +		if mesecon:is_mvps_stopper(checknode.name) then  +			return +		end + +		--check for column end +		if checknode.name == "air" +		or checknode.name == "ignore" +		or checknode.name == "default:water_source" +		or checknode.name == "default:water_flowing" +		or checknode.name == "default:lava_source" +		or checknode.name == "default:lava_flowing" then +			break +		end + +		--limit piston pushing capacity +		count = count + 1 +		if count > 15 then +			return +		end + +		checkpos.x, checkpos.y, checkpos.z = checkpos.x + dir.x, checkpos.y + dir.y, checkpos.z + dir.z +	end + +	local checknode = minetest.env:get_node(pos) +	minetest.env:remove_node(pos) --remove the first node +	mesecon:updatenode(pos) + +	--add pusher +	if node.name == "mesecons_pistons:piston_down_normal" then +		minetest.env:add_node(pos, {name="mesecons_pistons:piston_down_pusher_normal", param2=node.param2}) +	else +		minetest.env:add_node(pos, {name="mesecons_pistons:piston_down_pusher_sticky", param2=node.param2}) +	end + +	--move nodes forward +	for i = 1, count do +		pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to the next node + +		--move the node forward +		local nextnode = minetest.env:get_node(pos) +		--minetest.env:dig_node(pos) +		minetest.env:set_node(pos, checknode) +		mesecon:updatenode(pos) +		checknode = nextnode +	end +end) + +--Pull action +mesecon:register_on_signal_off(function(pos, node) +	if node.name ~= "mesecons_pistons:piston_down_normal" and node.name ~= "mesecons_pistons:piston_down_sticky" then +		return +	end + +	local dir = {x=0, y=-1, z=0} +	pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to the node to be replaced + +	--ensure piston is extended +	local checknode = minetest.env:get_node(pos) +	if checknode.name ~= "mesecons_pistons:piston_down_pusher_normal" and checknode.name ~= "mesecons_pistons:piston_down_pusher_sticky" then +		return +	end +	if checknode.param2 ~= node.param2 then --pusher is not facing the same direction as the piston +		return --piston is not extended +	end + +	--retract piston +	minetest.env:remove_node(pos) --remove pusher +	if node.name ~= "mesecons_pistons:piston_down_sticky" then +	    nodeupdate(pos) +	end +	if node.name == "mesecons_pistons:piston_down_sticky" then --retract block +		local checkpos = {x=pos.x + dir.x, y=pos.y + dir.y, z=pos.z + dir.z} --move to the node to be retracted +		checknode = minetest.env:get_node(checkpos) +		if checknode.name ~= "air" +		and checknode.name ~= "ignore" +		and checknode.name ~= "default:water_source" +		and checknode.name ~= "default:water_flowing" +		and checknode.name ~= "default:lava_source" +		and checknode.name ~= "default:lava_flowing" +		and not mesecon:is_mvps_stopper(checknode.name) then +			minetest.env:remove_node(checkpos) +		    mesecon:updatenode(checkpos) +		    minetest.env:set_node(pos, checknode) +		    mesecon:updatenode(pos) +		end +	end +	if node.name == "mesecons_pistons:piston_down_sticky" then +	    nodeupdate(pos) +	end +end) diff --git a/mesecons_pistons/pistons_up.lua b/mesecons_pistons/pistons_up.lua new file mode 100644 index 0000000..cccfeb9 --- /dev/null +++ b/mesecons_pistons/pistons_up.lua @@ -0,0 +1,210 @@ +--PISTONS +--registration normal one: +minetest.register_node("mesecons_pistons:piston_up_normal", { +	description = "Piston UP", +	tiles = {"jeija_piston_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"}, +	groups = {cracky=3}, +	after_dig_node = function(pos, oldnode) +		local dir = {x=0, y=1, z=0} +		pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check + +		--ensure piston is extended +		local checknode = minetest.env:get_node(pos) +		if checknode.name == "mesecons_pistons:piston_up_pusher_normal" then +			if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston +				minetest.env:remove_node(pos) --remove the pusher +			end +		end +	end, +}) + +--registration sticky one: +minetest.register_node("mesecons_pistons:piston_up_sticky", { +	description = "Sticky Piston UP", +	tiles = {"jeija_piston_sticky_side.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png", "jeija_piston_tb.png"}, +	groups = {cracky=3}, +	after_dig_node = function(pos, oldnode) +		local dir = {x=0, y=1, z=0} +		pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node to check + +		--ensure piston is extended +		local checknode = minetest.env:get_node(pos) +		if checknode.name == "mesecons_pistons:piston_up_pusher_sticky" then +			if checknode.param2 == oldnode.param2 then --pusher is facing the same direction as the piston +				minetest.env:remove_node(pos) --remove the pusher +			end +		end +	end, +}) + +minetest.register_craft({ +	output = "mesecons_pistons:piston_up_normal", +	recipe = { +		{"mesecons_pistons:piston_normal"}, +	} +}) +minetest.register_craft({ +	output = "mesecons_pistons:piston_up_sticky", +	recipe = { +		{"mesecons_pistons:piston_sticky"}, +	} +}) + +minetest.register_node("mesecons_pistons:piston_up_pusher_normal", { +	drawtype = "nodebox", +	tiles = {"jeija_piston_pusher_normal.png"}, +	paramtype = "light", +	diggable = false, +	selection_box = { +		type = "fixed", +		fixed = { +			{-0.2, -0.5, -0.2, 0.2, 0.3, 0.2}, +			{-0.5, 0.3, -0.5, 0.5, 0.5, 0.5}, +		}, +	}, +	node_box = { +		type = "fixed", +		fixed = { +			{-0.2, -0.5, -0.2, 0.2, 0.3, 0.2}, +			{-0.5, 0.3, -0.5, 0.5, 0.5, 0.5}, +		}, +	}, +}) + +mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_normal") +mesecon:register_mvps_stopper("mesecons_pistons:piston_up_pusher_sticky") + +minetest.register_node("mesecons_pistons:piston_up_pusher_sticky", { +	drawtype = "nodebox", +	tiles = { +		"jeija_piston_pusher_normal.png", +		"jeija_piston_pusher_sticky.png", +		"jeija_piston_pusher_normal.png", +		"jeija_piston_pusher_normal.png", +		"jeija_piston_pusher_normal.png", +		"jeija_piston_pusher_normal.png" +		}, +	paramtype = "light", +	diggable = false, +	selection_box = { +		type = "fixed", +		fixed = { +			{-0.2, -0.5, -0.2, 0.2, 0.3, 0.2}, +			{-0.5, 0.3, -0.5, 0.5, 0.5, 0.5}, +		}, +	}, +	node_box = { +		type = "fixed", +		fixed = { +			{-0.2, -0.5, -0.2, 0.2, 0.3, 0.2}, +			{-0.5, 0.3, -0.5, 0.5, 0.5, 0.5}, +		}, +	}, +}) + +-- Push action +mesecon:register_on_signal_on(function(pos, node) +	if node.name ~= "mesecons_pistons:piston_up_normal" and node.name ~= "mesecons_pistons:piston_up_sticky" then +		return +	end + +	local dir = {x=0, y=1, z=0} +	pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to first node being pushed + +	--determine the number of nodes that need to be pushed +	local count = 0 +	local checkpos = {x=pos.x, y=pos.y, z=pos.z} --first node being pushed +	while true do +		local checknode = minetest.env:get_node(checkpos) + +		--check for collision with stopper +		if mesecon:is_mvps_stopper(checknode.name) then  +			return +		end + +		--check for column end +		if checknode.name == "air" +		or checknode.name == "ignore" +		or checknode.name == "default:water_source" +		or checknode.name == "default:water_flowing" +		or checknode.name == "default:lava_source" +		or checknode.name == "default:lava_flowing" then +			break +		end + +		--limit piston pushing capacity +		count = count + 1 +		if count > 15 then +			return +		end + +		checkpos.x, checkpos.y, checkpos.z = checkpos.x + dir.x, checkpos.y + dir.y, checkpos.z + dir.z +	end + +	local checknode = minetest.env:get_node(pos) +	minetest.env:remove_node(pos) --remove the first node +	mesecon:updatenode(pos) + +	--add pusher +	if node.name == "mesecons_pistons:piston_up_normal" then +		minetest.env:add_node(pos, {name="mesecons_pistons:piston_up_pusher_normal", param2=node.param2}) +	else +		minetest.env:add_node(pos, {name="mesecons_pistons:piston_up_pusher_sticky", param2=node.param2}) +	end + +	--move nodes forward +	for i = 1, count do +		pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to the next node + +		--move the node forward +		local nextnode = minetest.env:get_node(pos) +		--minetest.env:dig_node(pos) +		minetest.env:set_node(pos, checknode) +		mesecon:updatenode(pos) +		checknode = nextnode +	end +end) + +--Pull action +mesecon:register_on_signal_off(function(pos, node) +	if node.name ~= "mesecons_pistons:piston_up_normal" and node.name ~= "mesecons_pistons:piston_up_sticky" then +		return +	end + +	local dir = {x=0, y=1, z=0} +	pos.x, pos.y, pos.z = pos.x + dir.x, pos.y + dir.y, pos.z + dir.z --move to the node to be replaced + +	--ensure piston is extended +	local checknode = minetest.env:get_node(pos) +	if checknode.name ~= "mesecons_pistons:piston_up_pusher_normal" and checknode.name ~= "mesecons_pistons:piston_up_pusher_sticky" then +		return +	end +	if checknode.param2 ~= node.param2 then --pusher is not facing the same direction as the piston +		return --piston is not extended +	end + +	--retract piston +	minetest.env:remove_node(pos) --remove pusher +	if node.name ~= "mesecons_pistons:piston_up_sticky" then +	    nodeupdate(pos) +	end +	if node.name == "mesecons_pistons:piston_up_sticky" then --retract block +		local checkpos = {x=pos.x + dir.x, y=pos.y + dir.y, z=pos.z + dir.z} --move to the node to be retracted +		checknode = minetest.env:get_node(checkpos) +		if checknode.name ~= "air" +		and checknode.name ~= "ignore" +		and checknode.name ~= "default:water_source" +		and checknode.name ~= "default:water_flowing" +		and checknode.name ~= "default:lava_source" +		and checknode.name ~= "default:lava_flowing" +		and not mesecon:is_mvps_stopper(checknode.name) then +			minetest.env:remove_node(checkpos) +		    mesecon:updatenode(checkpos) +		    minetest.env:set_node(pos, checknode) +		    mesecon:updatenode(pos) +		end +	end +	if node.name == "mesecons_pistons:piston_up_sticky" then +	    nodeupdate(pos) +	end +end) | 
