diff options
Diffstat (limited to 'mesecons_movestones')
| -rw-r--r-- | mesecons_movestones/init.lua | 244 | 
1 files changed, 149 insertions, 95 deletions
| diff --git a/mesecons_movestones/init.lua b/mesecons_movestones/init.lua index 2bba38d..48481ea 100644 --- a/mesecons_movestones/init.lua +++ b/mesecons_movestones/init.lua @@ -8,126 +8,151 @@  -- Pushes all block in front of it  -- Pull all blocks in its back -function mesecon.get_movestone_direction(pos) -	local lpos -	local rules = { -		{x=0,  y=1,  z=-1}, -		{x=0,  y=0,  z=-1}, -		{x=0,  y=-1, z=-1}, -		{x=0,  y=1,  z=1}, -		{x=0,  y=-1, z=1}, -		{x=0,  y=0,  z=1}, -		{x=1,  y=0,  z=0}, -		{x=1,  y=1,  z=0}, -		{x=1,  y=-1, z=0}, -		{x=-1, y=1,  z=0}, -		{x=-1, y=-1, z=0}, -		{x=-1, y=0,  z=0}} - -	lpos = {x=pos.x+1, y=pos.y, z=pos.z} -	for n = 1, 3 do -		if mesecon.is_power_on(lpos, rules[n]) then -			return {x=0, y=0, z=-1} +-- settings: +local timer_interval = 1 / mesecon.setting("movestone_speed", 3) +local max_push = mesecon.setting("movestone_max_push", 50) +local max_pull = mesecon.setting("movestone_max_pull", 50) + +-- helper functions: +local function get_movestone_direction(rulename, is_vertical) +	if is_vertical then +		if rulename.z > 0 then +			return {x = 0, y = -1, z = 0} +		elseif rulename.z < 0 then +			return {x = 0, y = 1, z = 0} +		elseif rulename.x > 0 then +			return {x = 0, y = -1, z = 0} +		elseif rulename.x < 0 then +			return {x = 0, y = 1, z = 0}  		end -	end - -	lpos = {x = pos.x-1, y = pos.y, z = pos.z} -	for n=4, 6 do -		if mesecon.is_power_on(lpos, rules[n]) then -			return {x=0, y=0, z=1} -		end -	end - -	lpos = {x = pos.x, y = pos.y, z = pos.z+1} -	for n=7, 9 do -		if mesecon.is_power_on(lpos, rules[n]) then -			return {x=-1, y=0, z=0} -		end -	end - -	lpos = {x = pos.x, y = pos.y, z = pos.z-1} -	for n=10, 12 do -		if mesecon.is_power_on(lpos, rules[n]) then -			return {x=1, y=0, z=0} +	else +		if rulename.z > 0 then +			return {x = -1, y = 0, z = 0} +		elseif rulename.z < 0 then +			return {x = 1, y = 0, z = 0} +		elseif rulename.x > 0 then +			return {x = 0, y = 0, z = -1} +		elseif rulename.x < 0 then +			return {x = 0, y = 0, z = 1}  		end  	end  end -function mesecon.register_movestone(name, def, is_sticky) -	local timer_interval = 1 / mesecon.setting("movestone_speed", 3) -	local name_active = name.."_active" - -	local function movestone_move (pos) -		if minetest.get_node(pos).name ~= name_active then -			return -		end - -		local direction = mesecon.get_movestone_direction(pos) -		if not direction then -			minetest.set_node(pos, {name = name}) -			return -		end +-- registration functions: +function mesecon.register_movestone(name, def, is_sticky, is_vertical) +	local function movestone_move(pos, node, rulename) +		local direction = get_movestone_direction(rulename, is_vertical)  		local frontpos = vector.add(pos, direction) -		local backpos = vector.subtract(pos, direction)  		-- ### Step 1: Push nodes in front ### -		local maxpush = mesecon.setting("movestone_max_push", 50) -		local maxpull = mesecon.setting("movestone_max_pull", 50) -		local success, stack, oldstack = mesecon.mvps_push(frontpos, direction, maxpush) -		if success then -			mesecon.mvps_process_stack(stack) -			mesecon.mvps_move_objects(frontpos, direction, oldstack) -		-- Too large stack/stopper in the way: try again very soon -		else -			minetest.after(0.05, movestone_move, pos) +		local success, stack, oldstack = mesecon.mvps_push(frontpos, direction, max_push) +		if not success then +			minetest.get_node_timer(pos):start(timer_interval)  			return  		end +		mesecon.mvps_process_stack(stack) +		mesecon.mvps_move_objects(frontpos, direction, oldstack)  		-- ### Step 2: Move the movestone ### -		local node = minetest.get_node(pos)  		minetest.set_node(frontpos, node)  		minetest.remove_node(pos)  		mesecon.on_dignode(pos, node)  		mesecon.on_placenode(frontpos, node) -		minetest.after(timer_interval, movestone_move, frontpos) +		minetest.get_node_timer(frontpos):start(timer_interval)  		-- ### Step 3: If sticky, pull stack behind ###  		if is_sticky then -			mesecon.mvps_pull_all(backpos, direction, maxpull) +			local backpos = vector.subtract(pos, direction) +			mesecon.mvps_pull_all(backpos, direction, max_pull)  		end  	end  	def.mesecons = {effector = { -		action_on = function (pos) -			if minetest.get_node(pos).name ~= name_active then -				minetest.set_node(pos, {name = name_active}) -				movestone_move(pos) +		action_on = function(pos, node, rulename) +			if rulename and not minetest.get_node_timer(pos):is_started() then +				movestone_move(pos, node, rulename)  			end  		end, -		action_off = function (pos) -			minetest.set_node(pos, {name = name}) -		end +		rules = mesecon.rules.default,  	}} -	def.drop = name +	def.on_timer = function(pos, elapsed) +		local sourcepos = mesecon.is_powered(pos) +		if not sourcepos then +			return +		end +		local rulename = vector.subtract(sourcepos[1], pos) +		mesecon.activate(pos, minetest.get_node(pos), rulename, 0) +	end + +	def.on_blast = mesecon.on_blastnode  	def.on_blast = mesecon.on_blastnode  	minetest.register_node(name, def) - -	-- active node only -	local def_active = table.copy(def) -	def_active.groups.not_in_creative_inventory = 1 -	minetest.register_node(name_active, def_active)  end + +-- registration:  mesecon.register_movestone("mesecons_movestones:movestone", { -	tiles = {"jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_arrows.png", "jeija_movestone_arrows.png"}, -	groups = {cracky=3}, -    	description="Movestone", +	tiles = { +		"jeija_movestone_side.png", +		"jeija_movestone_side.png", +		"jeija_movestone_arrows.png^[transformFX", +		"jeija_movestone_arrows.png^[transformFX", +		"jeija_movestone_arrows.png", +		"jeija_movestone_arrows.png", +	}, +	groups = {cracky = 3}, +    description = "Movestone", +	sounds = default.node_sound_stone_defaults() +}, false, false) + +mesecon.register_movestone("mesecons_movestones:sticky_movestone", { +	tiles = { +		"jeija_movestone_side.png", +		"jeija_movestone_side.png", +		"jeija_sticky_movestone.png^[transformFX", +		"jeija_sticky_movestone.png^[transformFX", +		"jeija_sticky_movestone.png", +		"jeija_sticky_movestone.png", +	}, +	groups = {cracky = 3}, +    description = "Sticky Movestone", +	sounds = default.node_sound_stone_defaults(), +}, true, false) + +mesecon.register_movestone("mesecons_movestones:movestone_vertical", { +	tiles = { +		"jeija_movestone_side.png", +		"jeija_movestone_side.png", +		"jeija_movestone_arrows.png^[transformFXR90", +		"jeija_movestone_arrows.png^[transformR90", +		"jeija_movestone_arrows.png^[transformFXR90", +		"jeija_movestone_arrows.png^[transformR90", +	}, +	groups = {cracky = 3}, +    description = "Vertical Movestone",  	sounds = default.node_sound_stone_defaults() -}, false) +}, false, true) + +mesecon.register_movestone("mesecons_movestones:sticky_movestone_vertical", { +	tiles = { +		"jeija_movestone_side.png", +		"jeija_movestone_side.png", +		"jeija_sticky_movestone.png^[transformFXR90", +		"jeija_sticky_movestone.png^[transformR90", +		"jeija_sticky_movestone.png^[transformFXR90", +		"jeija_sticky_movestone.png^[transformR90", +	}, +	groups = {cracky = 3}, +    description = "Vertical Sticky Movestone", +	sounds = default.node_sound_stone_defaults(), +}, true, true) + +-- crafting: +-- base recipe:  minetest.register_craft({  	output = "mesecons_movestones:movestone 2",  	recipe = { @@ -137,15 +162,32 @@ minetest.register_craft({  	}  }) --- STICKY_MOVESTONE -mesecon.register_movestone("mesecons_movestones:sticky_movestone", { -	tiles = {"jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_sticky_movestone.png", "jeija_sticky_movestone.png"}, -	inventory_image = minetest.inventorycube("jeija_sticky_movestone.png", "jeija_movestone_side.png", "jeija_movestone_side.png"), -	groups = {cracky=3}, -    	description="Sticky Movestone", -	sounds = default.node_sound_stone_defaults(), -}, true) +-- conversation: +minetest.register_craft({ +	type = "shapeless", +	output = "mesecons_movestones:movestone", +	recipe = {"mesecons_movestones:movestone_vertical"}, +}) + +minetest.register_craft({ +	type = "shapeless", +	output = "mesecons_movestones:movestone_vertical", +	recipe = {"mesecons_movestones:movestone"}, +}) + +minetest.register_craft({ +	type = "shapeless", +	output = "mesecons_movestones:sticky_movestone", +	recipe = {"mesecons_movestones:sticky_movestone_vertical"}, +}) + +minetest.register_craft({ +	type = "shapeless", +	output = "mesecons_movestones:sticky_movestone_vertical", +	recipe = {"mesecons_movestones:sticky_movestone"}, +}) +-- make sticky:  minetest.register_craft({  	output = "mesecons_movestones:sticky_movestone",  	recipe = { @@ -153,6 +195,18 @@ minetest.register_craft({  	}  }) --- Don't allow pushing movestones while they're active -mesecon.register_mvps_stopper("mesecons_movestones:movestone_active") -mesecon.register_mvps_stopper("mesecons_movestones:sticky_movestone_active") +minetest.register_craft({ +	output = "mesecons_movestones:sticky_movestone_vertical", +	recipe = { +		{"mesecons_materials:glue"}, +		{"mesecons_movestones:movestone_vertical"}, +		{"mesecons_materials:glue"}, +	} +}) + + +-- legacy code: +minetest.register_alias("mesecons_movestones:movestone_active", +		"mesecons_movestones:movestone") +minetest.register_alias("mesecons_movestones:sticky_movestone_active", +		"mesecons_movestones:sticky_movestone") | 
