mirror of
				https://github.com/minetest-mods/mesecons.git
				synced 2025-11-04 04:55:26 +01:00 
			
		
		
		
	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.
This commit is contained in:
		@@ -41,12 +41,19 @@ mesecon.rules.alldirs =
 | 
			
		||||
 | 
			
		||||
mesecon.rules.buttonlike_get = function(node)
 | 
			
		||||
	local rules = mesecon.rules.buttonlike
 | 
			
		||||
	if node.param2 == 2 then
 | 
			
		||||
	local dir = minetest.facedir_to_dir(node.param2)
 | 
			
		||||
	if dir.x == 1 then
 | 
			
		||||
		-- No action needed
 | 
			
		||||
	elseif dir.z == -1 then
 | 
			
		||||
		rules=mesecon.rotate_rules_left(rules)
 | 
			
		||||
	elseif node.param2 == 3 then
 | 
			
		||||
	elseif dir.x == -1 then
 | 
			
		||||
		rules=mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules))
 | 
			
		||||
	elseif node.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)
 | 
			
		||||
	elseif dir.y == 1 then
 | 
			
		||||
		rules=mesecon.rotate_rules_down(rules)
 | 
			
		||||
	end
 | 
			
		||||
	return rules
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,7 @@ minetest.register_node("mesecons_button:button_off", {
 | 
			
		||||
	paramtype2 = "facedir",
 | 
			
		||||
	legacy_wallmounted = true,
 | 
			
		||||
	walkable = false,
 | 
			
		||||
	on_rotate = mesecon.buttonlike_onrotate,
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	selection_box = {
 | 
			
		||||
	type = "fixed",
 | 
			
		||||
@@ -67,6 +68,7 @@ minetest.register_node("mesecons_button:button_on", {
 | 
			
		||||
	paramtype2 = "facedir",
 | 
			
		||||
	legacy_wallmounted = true,
 | 
			
		||||
	walkable = false,
 | 
			
		||||
	on_rotate = false,
 | 
			
		||||
	light_source = default.LIGHT_MAX-7,
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	selection_box = {
 | 
			
		||||
 
 | 
			
		||||
@@ -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,20 +38,13 @@ local receiver_get_rules = function (node)
 | 
			
		||||
	return rules
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
minetest.register_node("mesecons_receiver:receiver_on", {
 | 
			
		||||
mesecon.register_node("mesecons_receiver:receiver", {
 | 
			
		||||
	drawtype = "nodebox",
 | 
			
		||||
	tiles = {
 | 
			
		||||
		"receiver_top_on.png",
 | 
			
		||||
		"receiver_bottom_on.png",
 | 
			
		||||
		"receiver_lr_on.png",
 | 
			
		||||
		"receiver_lr_on.png",
 | 
			
		||||
		"receiver_fb_on.png",
 | 
			
		||||
		"receiver_fb_on.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 }
 | 
			
		||||
@@ -42,16 +55,7 @@ minetest.register_node("mesecons_receiver:receiver_on", {
 | 
			
		||||
	},
 | 
			
		||||
	groups = {dig_immediate = 3, not_in_creative_inventory = 1},
 | 
			
		||||
	drop = "mesecons:wire_00000000_off",
 | 
			
		||||
	mesecons = {conductor = {
 | 
			
		||||
		state = mesecon.state.on,
 | 
			
		||||
		rules = receiver_get_rules,
 | 
			
		||||
		offstate = "mesecons_receiver:receiver_off"
 | 
			
		||||
	}}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_node("mesecons_receiver:receiver_off", {
 | 
			
		||||
	drawtype = "nodebox",
 | 
			
		||||
	description = "You hacker you",
 | 
			
		||||
}, {
 | 
			
		||||
	tiles = {
 | 
			
		||||
		"receiver_top_off.png",
 | 
			
		||||
		"receiver_bottom_off.png",
 | 
			
		||||
@@ -60,51 +64,147 @@ minetest.register_node("mesecons_receiver:receiver_off", {
 | 
			
		||||
		"receiver_fb_off.png",
 | 
			
		||||
		"receiver_fb_off.png",
 | 
			
		||||
	},
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	paramtype2 = "facedir",
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	walkable = 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",
 | 
			
		||||
	mesecons = {conductor = {
 | 
			
		||||
		state = mesecon.state.off,
 | 
			
		||||
		rules = receiver_get_rules,
 | 
			
		||||
		onstate = "mesecons_receiver:receiver_on"
 | 
			
		||||
	}}
 | 
			
		||||
}, {
 | 
			
		||||
	tiles = {
 | 
			
		||||
		"receiver_top_on.png",
 | 
			
		||||
		"receiver_bottom_on.png",
 | 
			
		||||
		"receiver_lr_on.png",
 | 
			
		||||
		"receiver_lr_on.png",
 | 
			
		||||
		"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 = up_rcvboxes
 | 
			
		||||
	},
 | 
			
		||||
	node_box = {
 | 
			
		||||
		type = "fixed",
 | 
			
		||||
		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 = {{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"
 | 
			
		||||
	}}
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
mesecon.register_node("mesecons_receiver:receiver_down", {
 | 
			
		||||
	drawtype = "nodebox",
 | 
			
		||||
	paramtype = "light",
 | 
			
		||||
	paramtype2 = "facedir",
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	walkable = false,
 | 
			
		||||
	on_rotate = false,
 | 
			
		||||
	selection_box = {
 | 
			
		||||
             	type = "fixed",
 | 
			
		||||
		fixed = down_rcvboxes
 | 
			
		||||
	},
 | 
			
		||||
	node_box = {
 | 
			
		||||
		type = "fixed",
 | 
			
		||||
		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 = {{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
 | 
			
		||||
 
 | 
			
		||||
@@ -31,6 +31,7 @@ mesecon.register_node("mesecons_walllever:wall_lever", {
 | 
			
		||||
		"jeija_wall_lever_back_edges.png"
 | 
			
		||||
	},
 | 
			
		||||
	mesh="jeija_wall_lever_off.obj",
 | 
			
		||||
	on_rotate = mesecon.buttonlike_onrotate,
 | 
			
		||||
	mesecons = {receptor = {
 | 
			
		||||
		rules = mesecon.rules.buttonlike_get,
 | 
			
		||||
		state = mesecon.state.off
 | 
			
		||||
@@ -44,6 +45,7 @@ mesecon.register_node("mesecons_walllever:wall_lever", {
 | 
			
		||||
		"jeija_wall_lever_back_edges.png"
 | 
			
		||||
	},
 | 
			
		||||
	mesh="jeija_wall_lever_on.obj",
 | 
			
		||||
	on_rotate = false,
 | 
			
		||||
	mesecons = {receptor = {
 | 
			
		||||
		rules = mesecon.rules.buttonlike_get,
 | 
			
		||||
		state = mesecon.state.on
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user