diff options
| author | Carter Kolwey <cheapiephp@gmail.com> | 2016-12-25 23:50:09 -0600 | 
|---|---|---|
| committer | Jeija <norrepli@gmail.com> | 2017-01-02 14:51:28 +0100 | 
| commit | 1bd936ad8c9e326f9466af66d78c8bda75bfd1c6 (patch) | |
| tree | 09cd677fcc1e8e9486248d824b80ca2d34256728 /mesecons_receiver | |
| parent | 79edbed8d7dc3a0280b2f631b95e36a49d7c5916 (diff) | |
Properly handle rotation of buttons / levers
Buttons and levers can now also be pointed upwards / downwards which will make them connect to corresponding up / down receivers. You will need to use the screwdriver for this.
Receivers cannot be rotated using the screwdriver anymore.
Diffstat (limited to 'mesecons_receiver')
| -rw-r--r-- | mesecons_receiver/init.lua | 169 | 
1 files changed, 138 insertions, 31 deletions
| diff --git a/mesecons_receiver/init.lua b/mesecons_receiver/init.lua index 9284e57..a5cf7d5 100644 --- a/mesecons_receiver/init.lua +++ b/mesecons_receiver/init.lua @@ -1,10 +1,30 @@ -rcvboxes = { +local rcvboxes = {  	{ -3/16, -3/16, -8/16       , 3/16,  3/16  , -13/32       }, -- the smaller bump  	{ -1/32, -1/32, -3/2        , 1/32,  1/32  , -1/2         }, -- the wire through the block  	{ -2/32, -1/2 , -.5         , 2/32,  0     , -.5002+3/32  }, -- the vertical wire bit  	{ -2/32, -1/2 , -7/16+0.002 , 2/32,  -14/32,  16/32+0.001 }  -- the horizontal wire  } +local down_rcvboxes = { +	{-6/16, -8/16, -6/16, 6/16, -7/16, 6/16}, -- Top plate +	{-2/16, -6/16, -2/16, 2/16, -7/16, 2/16}, -- Bump +	{-1/16, -8/16, -1/16, 1/16, -24/16, 1/16}, -- Wire through the block +	{-1/16, -8/16, 6/16,  1/16, -7/16, 8/16}, -- Plate extension (North) +	{-1/16, -8/16, -6/16, 1/16, -7/16, -8/16}, -- Plate extension (South) +	{-8/16, -8/16, 1/16, -6/16, -7/16, -1/16}, -- Plate extension (West) +	{6/16,  -8/16, 1/16,  8/16, -7/16, -1/16}, -- Plate extension (East) +} + +local up_rcvboxes = { +	{-6/16, -8/16, -6/16, 6/16, -7/16, 6/16}, -- Top plate +	{-2/16, -6/16, -2/16, 2/16, -7/16, 2/16}, -- Bump +	{-1/16, -6/16, -1/16, 1/16, 24/16, 1/16}, -- Wire through the block +	{-1/16, -8/16, 6/16,  1/16, -7/16, 8/16}, -- Plate extension (North) +	{-1/16, -8/16, -6/16, 1/16, -7/16, -8/16}, -- Plate extension (South) +	{-8/16, -8/16, 1/16, -6/16, -7/16, -1/16}, -- Plate extension (West) +	{6/16,  -8/16, 1/16,  8/16, -7/16, -1/16}, -- Plate extension (East) +} +  local receiver_get_rules = function (node)  	local rules = {	{x =  1, y = 0, z = 0},  			{x = -2, y = 0, z = 0}} @@ -18,8 +38,38 @@ local receiver_get_rules = function (node)  	return rules  end -minetest.register_node("mesecons_receiver:receiver_on", { +mesecon.register_node("mesecons_receiver:receiver", {  	drawtype = "nodebox", +	paramtype = "light", +	paramtype2 = "facedir", +	sunlight_propagates = true, +	walkable = false, +	on_rotate = false, +	selection_box = { +             	type = "fixed", +		fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 } +	}, +	node_box = { +		type = "fixed", +		fixed = rcvboxes +	}, +	groups = {dig_immediate = 3, not_in_creative_inventory = 1}, +	drop = "mesecons:wire_00000000_off", +}, { +	tiles = { +		"receiver_top_off.png", +		"receiver_bottom_off.png", +		"receiver_lr_off.png", +		"receiver_lr_off.png", +		"receiver_fb_off.png", +		"receiver_fb_off.png", +	}, +	mesecons = {conductor = { +		state = mesecon.state.off, +		rules = receiver_get_rules, +		onstate = "mesecons_receiver:receiver_on" +	}} +}, {  	tiles = {  		"receiver_top_on.png",  		"receiver_bottom_on.png", @@ -28,83 +78,133 @@ minetest.register_node("mesecons_receiver:receiver_on", {  		"receiver_fb_on.png",  		"receiver_fb_on.png",  	}, +	mesecons = {conductor = { +		state = mesecon.state.on, +		rules = receiver_get_rules, +		offstate = "mesecons_receiver:receiver_off" +	}} +}) + +mesecon.register_node("mesecons_receiver:receiver_up", { +	drawtype = "nodebox",  	paramtype = "light",  	paramtype2 = "facedir",  	sunlight_propagates = true,  	walkable = false, +	on_rotate = false,  	selection_box = {               	type = "fixed", -		fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 } +		fixed = up_rcvboxes  	},  	node_box = {  		type = "fixed", -		fixed = rcvboxes +		fixed = up_rcvboxes  	},  	groups = {dig_immediate = 3, not_in_creative_inventory = 1},  	drop = "mesecons:wire_00000000_off", +}, { +	tiles = {"mesecons_wire_off.png"}, +	mesecons = {conductor = { +		state = mesecon.state.off, +		rules = {{x=1, y=0, z=0}, +			{x=-1, y=0, z=0}, +			{x=0,  y=0, z=1}, +			{x=0,  y=0, z=-1}, +			{x=0,  y=1, z=0}, +			{x=0,  y=2, z=0}}, +		onstate = "mesecons_receiver:receiver_up_on" +	}} +}, { +	tiles = {"mesecons_wire_on.png"},  	mesecons = {conductor = {  		state = mesecon.state.on, -		rules = receiver_get_rules, -		offstate = "mesecons_receiver:receiver_off" +		rules = {{x=1, y=0, z=0}, +			{x=-1, y=0, z=0}, +			{x=0,  y=0, z=1}, +			{x=0,  y=0, z=-1}, +			{x=0,  y=1, z=0}, +			{x=0,  y=2, z=0}}, +		offstate = "mesecons_receiver:receiver_up_off"  	}}  }) -minetest.register_node("mesecons_receiver:receiver_off", { +mesecon.register_node("mesecons_receiver:receiver_down", {  	drawtype = "nodebox", -	description = "You hacker you", -	tiles = { -		"receiver_top_off.png", -		"receiver_bottom_off.png", -		"receiver_lr_off.png", -		"receiver_lr_off.png", -		"receiver_fb_off.png", -		"receiver_fb_off.png", -	},  	paramtype = "light",  	paramtype2 = "facedir",  	sunlight_propagates = true,  	walkable = false, +	on_rotate = false,  	selection_box = {               	type = "fixed", -		fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 } +		fixed = down_rcvboxes  	},  	node_box = {  		type = "fixed", -		fixed = rcvboxes +		fixed = down_rcvboxes  	},  	groups = {dig_immediate = 3, not_in_creative_inventory = 1},  	drop = "mesecons:wire_00000000_off", +}, { +	tiles = {"mesecons_wire_off.png"},  	mesecons = {conductor = {  		state = mesecon.state.off, -		rules = receiver_get_rules, -		onstate = "mesecons_receiver:receiver_on" +		rules = {{x=1,y=0, z=0}, +			{x=-1,y=0, z=0}, +			{x=0, y=0, z=1}, +			{x=0, y=0, z=-1}, +			{x=0, y=-2,z=0}}, +		onstate = "mesecons_receiver:receiver_down_on" +	}} +}, { +	tiles = {"mesecons_wire_on.png"}, +	mesecons = {conductor = { +		state = mesecon.state.on, +		rules = {{x=1,y=0, z=0}, +			{x=-1,y=0, z=0}, +			{x=0, y=0, z=1}, +			{x=0, y=0, z=-1}, +			{x=0, y=-2,z=0}}, +		offstate = "mesecons_receiver:receiver_down_off"  	}}  })  function mesecon.receiver_get_pos_from_rcpt(pos, param2)  	local rules = {{x = 2,  y = 0, z = 0}}  	if param2 == nil then param2 = minetest.get_node(pos).param2 end -	if param2 == 2 then +	local rcvtype = "mesecons_receiver:receiver_off" +	local dir = minetest.facedir_to_dir(param2) + +	if dir.x == 1 then +		-- No action needed +	elseif dir.z == -1 then  		rules = mesecon.rotate_rules_left(rules) -	elseif param2 == 3 then +	elseif dir.x == -1 then  		rules = mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) -	elseif param2 == 0 then +	elseif dir.z == 1 then  		rules = mesecon.rotate_rules_right(rules) +	elseif dir.y == -1 then +		rules = mesecon.rotate_rules_up(rules) +		rcvtype = "mesecons_receiver:receiver_up_off" +	elseif dir.y == 1 then +		rules = mesecon.rotate_rules_down(rules) +		rcvtype = "mesecons_receiver:receiver_down_off"  	end  	local np = {	x = pos.x + rules[1].x,  			y = pos.y + rules[1].y,  			z = pos.z + rules[1].z} -	return np +	return np, rcvtype  end  function mesecon.receiver_place(rcpt_pos)  	local node = minetest.get_node(rcpt_pos) -	local pos = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, node.param2) +	local pos, rcvtype = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, node.param2)  	local nn = minetest.get_node(pos) +	local param2 = minetest.dir_to_facedir(minetest.facedir_to_dir(node.param2))  	if string.find(nn.name, "mesecons:wire_") ~= nil then  		minetest.dig_node(pos) -		minetest.set_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2}) +		minetest.set_node(pos, {name = rcvtype, param2 = param2})  		mesecon.on_placenode(pos, nn)  	end  end @@ -133,11 +233,13 @@ minetest.register_on_dignode(function(pos, node)  end)  minetest.register_on_placenode(function (pos, node) -	if string.find(node.name, "mesecons:wire_") ~=nil then -		local rules = {	{x = 2,  y = 0, z = 0}, -				{x =-2,  y = 0, z = 0}, -				{x = 0,  y = 0, z = 2}, -				{x = 0,  y = 0, z =-2}} +	if string.find(node.name, "mesecons:wire_") ~= nil then +		local rules = {	{x = 2,  y = 0,  z = 0}, +				{x =-2,  y = 0,  z = 0}, +				{x = 0,  y = 0,  z = 2}, +				{x = 0,  y = 0,  z =-2}, +				{x = 0,  y = 2,  z = 0}, +				{x = 0,  y = -2, z = 0}}  		local i = 1  		while rules[i] ~= nil do  			local np = {	x = pos.x + rules[i].x, @@ -150,3 +252,8 @@ minetest.register_on_placenode(function (pos, node)  		end  	end  end) + +function mesecon.buttonlike_onrotate(pos, node) +	minetest.after(0, mesecon.receiver_remove, pos, node) +	minetest.after(0, mesecon.receiver_place, pos) +end | 
