mirror of
				https://github.com/minetest-mods/mesecons.git
				synced 2025-11-04 04:55:26 +01:00 
			
		
		
		
	Improve rules and rule handling (#370)
This commit is contained in:
		@@ -548,52 +548,3 @@ function mesecon.is_powered(pos, rule)
 | 
			
		||||
	if (#sourcepos == 0) then return false
 | 
			
		||||
	else return sourcepos end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--Rules rotation Functions:
 | 
			
		||||
function mesecon.rotate_rules_right(rules)
 | 
			
		||||
	local nr = {}
 | 
			
		||||
	for i, rule in ipairs(rules) do
 | 
			
		||||
		table.insert(nr, {
 | 
			
		||||
			x = -rule.z,
 | 
			
		||||
			y =  rule.y,
 | 
			
		||||
			z =  rule.x,
 | 
			
		||||
			name = rule.name})
 | 
			
		||||
	end
 | 
			
		||||
	return nr
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function mesecon.rotate_rules_left(rules)
 | 
			
		||||
	local nr = {}
 | 
			
		||||
	for i, rule in ipairs(rules) do
 | 
			
		||||
		table.insert(nr, {
 | 
			
		||||
			x =  rule.z,
 | 
			
		||||
			y =  rule.y,
 | 
			
		||||
			z = -rule.x,
 | 
			
		||||
			name = rule.name})
 | 
			
		||||
	end
 | 
			
		||||
	return nr
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function mesecon.rotate_rules_down(rules)
 | 
			
		||||
	local nr = {}
 | 
			
		||||
	for i, rule in ipairs(rules) do
 | 
			
		||||
		table.insert(nr, {
 | 
			
		||||
			x = -rule.y,
 | 
			
		||||
			y =  rule.x,
 | 
			
		||||
			z =  rule.z,
 | 
			
		||||
			name = rule.name})
 | 
			
		||||
	end
 | 
			
		||||
	return nr
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function mesecon.rotate_rules_up(rules)
 | 
			
		||||
	local nr = {}
 | 
			
		||||
	for i, rule in ipairs(rules) do
 | 
			
		||||
		table.insert(nr, {
 | 
			
		||||
			x =  rule.y,
 | 
			
		||||
			y = -rule.x,
 | 
			
		||||
			z =  rule.z,
 | 
			
		||||
			name = rule.name})
 | 
			
		||||
	end
 | 
			
		||||
	return nr
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -1,61 +1,85 @@
 | 
			
		||||
mesecon.rules = {}
 | 
			
		||||
mesecon.state = {}
 | 
			
		||||
 | 
			
		||||
mesecon.rules.default =
 | 
			
		||||
{{x=0,  y=0,  z=-1},
 | 
			
		||||
 {x=1,  y=0,  z=0},
 | 
			
		||||
 {x=-1, y=0,  z=0},
 | 
			
		||||
 {x=0,  y=0,  z=1},
 | 
			
		||||
 {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=0,  y=1,  z=1},
 | 
			
		||||
 {x=0,  y=-1, z=1},
 | 
			
		||||
 {x=0,  y=1,  z=-1},
 | 
			
		||||
 {x=0,  y=-1, z=-1}}
 | 
			
		||||
mesecon.rules.default = {
 | 
			
		||||
	{x =  0, y =  0, z = -1},
 | 
			
		||||
	{x =  1, y =  0, z =  0},
 | 
			
		||||
	{x = -1, y =  0, z =  0},
 | 
			
		||||
	{x =  0, y =  0, z =  1},
 | 
			
		||||
	{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 =  0, y =  1, z =  1},
 | 
			
		||||
	{x =  0, y = -1, z =  1},
 | 
			
		||||
	{x =  0, y =  1, z = -1},
 | 
			
		||||
	{x =  0, y = -1, z = -1},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.default, {{x=0, y=-2, z=0}})
 | 
			
		||||
mesecon.rules.floor = mesecon.mergetable(mesecon.rules.default, {{x = 0, y = -1, z = 0}})
 | 
			
		||||
 | 
			
		||||
mesecon.rules.buttonlike =
 | 
			
		||||
{{x = 1,  y = 0, z = 0},
 | 
			
		||||
 {x = 1,  y = 1, z = 0},
 | 
			
		||||
 {x = 1,  y =-1, z = 0},
 | 
			
		||||
 {x = 1,  y =-1, z = 1},
 | 
			
		||||
 {x = 1,  y =-1, z =-1},
 | 
			
		||||
 {x = 2,  y = 0, z = 0}}
 | 
			
		||||
mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.floor, {{x = 0, y = -2, z = 0}})
 | 
			
		||||
 | 
			
		||||
mesecon.rules.flat =
 | 
			
		||||
{{x = 1, y = 0, z = 0},
 | 
			
		||||
 {x =-1, y = 0, z = 0},
 | 
			
		||||
 {x = 0, y = 0, z = 1},
 | 
			
		||||
 {x = 0, y = 0, z =-1}}
 | 
			
		||||
mesecon.rules.buttonlike = {
 | 
			
		||||
	{x = 1,  y =  0, z =  0},
 | 
			
		||||
	{x = 1,  y =  1, z =  0},
 | 
			
		||||
	{x = 1,  y = -1, z =  0},
 | 
			
		||||
	{x = 1,  y = -1, z =  1},
 | 
			
		||||
	{x = 1,  y = -1, z = -1},
 | 
			
		||||
	{x = 2,  y =  0, z =  0},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mesecon.rules.alldirs =
 | 
			
		||||
{{x= 1, y= 0,  z= 0},
 | 
			
		||||
 {x=-1, y= 0,  z= 0},
 | 
			
		||||
 {x= 0, y= 1,  z= 0},
 | 
			
		||||
 {x= 0, y=-1,  z= 0},
 | 
			
		||||
 {x= 0, y= 0,  z= 1},
 | 
			
		||||
 {x= 0, y= 0,  z=-1}}
 | 
			
		||||
mesecon.rules.flat = {
 | 
			
		||||
	{x =  1, y = 0, z =  0},
 | 
			
		||||
	{x = -1, y = 0, z =  0},
 | 
			
		||||
	{x =  0, y = 0, z =  1},
 | 
			
		||||
	{x =  0, y = 0, z = -1},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mesecon.rules.alldirs = {
 | 
			
		||||
	{x =  1, y =  0,  z =  0},
 | 
			
		||||
	{x = -1, y =  0,  z =  0},
 | 
			
		||||
	{x =  0, y =  1,  z =  0},
 | 
			
		||||
	{x =  0, y = -1,  z =  0},
 | 
			
		||||
	{x =  0, y =  0,  z =  1},
 | 
			
		||||
	{x =  0, y =  0,  z = -1},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local rules_wallmounted = {
 | 
			
		||||
	xp = mesecon.rotate_rules_down(mesecon.rules.floor),
 | 
			
		||||
	xn = mesecon.rotate_rules_up(mesecon.rules.floor),
 | 
			
		||||
	yp = mesecon.rotate_rules_up(mesecon.rotate_rules_up(mesecon.rules.floor)),
 | 
			
		||||
	yn = mesecon.rules.floor,
 | 
			
		||||
	zp = mesecon.rotate_rules_left(mesecon.rotate_rules_up(mesecon.rules.floor)),
 | 
			
		||||
	zn = mesecon.rotate_rules_right(mesecon.rotate_rules_up(mesecon.rules.floor)),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local rules_buttonlike = {
 | 
			
		||||
	xp = mesecon.rules.buttonlike,
 | 
			
		||||
	xn = mesecon.rotate_rules_right(mesecon.rotate_rules_right(mesecon.rules.buttonlike)),
 | 
			
		||||
	yp = mesecon.rotate_rules_down(mesecon.rules.buttonlike),
 | 
			
		||||
	yn = mesecon.rotate_rules_up(mesecon.rules.buttonlike),
 | 
			
		||||
	zp = mesecon.rotate_rules_right(mesecon.rules.buttonlike),
 | 
			
		||||
	zn = mesecon.rotate_rules_left(mesecon.rules.buttonlike),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
local function rules_from_dir(ruleset, dir)
 | 
			
		||||
	if dir.x ==  1 then return ruleset.xp end
 | 
			
		||||
	if dir.y ==  1 then return ruleset.yp end
 | 
			
		||||
	if dir.z ==  1 then return ruleset.zp end
 | 
			
		||||
	if dir.x == -1 then return ruleset.xn end
 | 
			
		||||
	if dir.y == -1 then return ruleset.yn end
 | 
			
		||||
	if dir.Z == -1 then return ruleset.zn end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
mesecon.rules.wallmounted_get = function(node)
 | 
			
		||||
	local dir = minetest.wallmounted_to_dir(node.param2)
 | 
			
		||||
	return rules_from_dir(rules_wallmounted, dir)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
mesecon.rules.buttonlike_get = function(node)
 | 
			
		||||
	local rules = mesecon.rules.buttonlike
 | 
			
		||||
	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 dir.x == -1 then
 | 
			
		||||
		rules=mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules))
 | 
			
		||||
	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
 | 
			
		||||
	return rules_from_dir(rules_buttonlike, dir)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
mesecon.state.on = "on"
 | 
			
		||||
 
 | 
			
		||||
@@ -6,6 +6,56 @@ function mesecon.move_node(pos, newpos)
 | 
			
		||||
	minetest.get_meta(pos):from_table(meta)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Rules rotation Functions:
 | 
			
		||||
function mesecon.rotate_rules_right(rules)
 | 
			
		||||
	local nr = {}
 | 
			
		||||
	for i, rule in ipairs(rules) do
 | 
			
		||||
		table.insert(nr, {
 | 
			
		||||
			x = -rule.z,
 | 
			
		||||
			y =  rule.y,
 | 
			
		||||
			z =  rule.x,
 | 
			
		||||
			name = rule.name})
 | 
			
		||||
	end
 | 
			
		||||
	return nr
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function mesecon.rotate_rules_left(rules)
 | 
			
		||||
	local nr = {}
 | 
			
		||||
	for i, rule in ipairs(rules) do
 | 
			
		||||
		table.insert(nr, {
 | 
			
		||||
			x =  rule.z,
 | 
			
		||||
			y =  rule.y,
 | 
			
		||||
			z = -rule.x,
 | 
			
		||||
			name = rule.name})
 | 
			
		||||
	end
 | 
			
		||||
	return nr
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function mesecon.rotate_rules_down(rules)
 | 
			
		||||
	local nr = {}
 | 
			
		||||
	for i, rule in ipairs(rules) do
 | 
			
		||||
		table.insert(nr, {
 | 
			
		||||
			x = -rule.y,
 | 
			
		||||
			y =  rule.x,
 | 
			
		||||
			z =  rule.z,
 | 
			
		||||
			name = rule.name})
 | 
			
		||||
	end
 | 
			
		||||
	return nr
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function mesecon.rotate_rules_up(rules)
 | 
			
		||||
	local nr = {}
 | 
			
		||||
	for i, rule in ipairs(rules) do
 | 
			
		||||
		table.insert(nr, {
 | 
			
		||||
			x =  rule.y,
 | 
			
		||||
			y = -rule.x,
 | 
			
		||||
			z =  rule.z,
 | 
			
		||||
			name = rule.name})
 | 
			
		||||
	end
 | 
			
		||||
	return nr
 | 
			
		||||
end
 | 
			
		||||
--
 | 
			
		||||
 | 
			
		||||
function mesecon.flattenrules(allrules)
 | 
			
		||||
--[[
 | 
			
		||||
	{
 | 
			
		||||
 
 | 
			
		||||
@@ -17,16 +17,17 @@ minetest.register_node("mesecons_lamp:lamp_on", {
 | 
			
		||||
	legacy_wallmounted = true,
 | 
			
		||||
	sunlight_propagates = true,
 | 
			
		||||
	walkable = true,
 | 
			
		||||
	light_source = default.LIGHT_MAX,
 | 
			
		||||
	light_source = minetest.LIGHT_MAX,
 | 
			
		||||
	node_box = mesecon_lamp_box,
 | 
			
		||||
	selection_box = mesecon_lamp_box,
 | 
			
		||||
	groups = {dig_immediate=3,not_in_creative_inventory=1, mesecon_effector_on = 1},
 | 
			
		||||
	drop="mesecons_lamp:lamp_off 1",
 | 
			
		||||
	groups = {dig_immediate = 3,not_in_creative_inventory = 1, mesecon_effector_on = 1},
 | 
			
		||||
	drop = "mesecons_lamp:lamp_off 1",
 | 
			
		||||
	sounds = default.node_sound_glass_defaults(),
 | 
			
		||||
	mesecons = {effector = {
 | 
			
		||||
		action_off = function (pos, node)
 | 
			
		||||
			minetest.swap_node(pos, {name = "mesecons_lamp:lamp_off", param2 = node.param2})
 | 
			
		||||
		end
 | 
			
		||||
		end,
 | 
			
		||||
		rules = mesecon.rules.wallmounted_get,
 | 
			
		||||
	}},
 | 
			
		||||
	on_blast = mesecon.on_blastnode,
 | 
			
		||||
})
 | 
			
		||||
@@ -43,12 +44,13 @@ minetest.register_node("mesecons_lamp:lamp_off", {
 | 
			
		||||
	node_box = mesecon_lamp_box,
 | 
			
		||||
	selection_box = mesecon_lamp_box,
 | 
			
		||||
	groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1},
 | 
			
		||||
	description="Mesecon Lamp",
 | 
			
		||||
	description = "Mesecon Lamp",
 | 
			
		||||
	sounds = default.node_sound_glass_defaults(),
 | 
			
		||||
	mesecons = {effector = {
 | 
			
		||||
		action_on = function (pos, node)
 | 
			
		||||
			minetest.swap_node(pos, {name = "mesecons_lamp:lamp_on", param2 = node.param2})
 | 
			
		||||
		end
 | 
			
		||||
		end,
 | 
			
		||||
		rules = mesecon.rules.wallmounted_get,
 | 
			
		||||
	}},
 | 
			
		||||
	on_blast = mesecon.on_blastnode,
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
@@ -24,7 +24,8 @@ minetest.register_node("mesecons_solarpanel:solar_panel_on", {
 | 
			
		||||
	groups = {dig_immediate=3, not_in_creative_inventory = 1},
 | 
			
		||||
	sounds = default.node_sound_glass_defaults(),
 | 
			
		||||
	mesecons = {receptor = {
 | 
			
		||||
		state = mesecon.state.on
 | 
			
		||||
		state = mesecon.state.on,
 | 
			
		||||
		rules = mesecon.rules.wallmounted_get,
 | 
			
		||||
	}},
 | 
			
		||||
	on_blast = mesecon.on_blastnode,
 | 
			
		||||
})
 | 
			
		||||
@@ -52,10 +53,11 @@ minetest.register_node("mesecons_solarpanel:solar_panel_off", {
 | 
			
		||||
		wall_side   = { -8/16, -7/16, -7/16, -7/16,  7/16, 7/16 },
 | 
			
		||||
	},
 | 
			
		||||
	groups = {dig_immediate=3},
 | 
			
		||||
    	description="Solar Panel",
 | 
			
		||||
	description = "Solar Panel",
 | 
			
		||||
	sounds = default.node_sound_glass_defaults(),
 | 
			
		||||
	mesecons = {receptor = {
 | 
			
		||||
		state = mesecon.state.off
 | 
			
		||||
		state = mesecon.state.off,
 | 
			
		||||
		rules = mesecon.rules.wallmounted_get,
 | 
			
		||||
	}},
 | 
			
		||||
	on_blast = mesecon.on_blastnode,
 | 
			
		||||
})
 | 
			
		||||
@@ -76,8 +78,9 @@ minetest.register_abm(
 | 
			
		||||
		local light = minetest.get_node_light(pos, nil)
 | 
			
		||||
 | 
			
		||||
		if light >= 12 then
 | 
			
		||||
			minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_on", param2=node.param2})
 | 
			
		||||
			mesecon.receptor_on(pos)
 | 
			
		||||
			node.name = "mesecons_solarpanel:solar_panel_on"
 | 
			
		||||
			minetest.swap_node(pos, node)
 | 
			
		||||
			mesecon.receptor_on(pos, mesecon.rules.wallmounted_get(node))
 | 
			
		||||
		end
 | 
			
		||||
	end,
 | 
			
		||||
})
 | 
			
		||||
@@ -90,8 +93,9 @@ minetest.register_abm(
 | 
			
		||||
		local light = minetest.get_node_light(pos, nil)
 | 
			
		||||
 | 
			
		||||
		if light < 12 then
 | 
			
		||||
			minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_off", param2=node.param2})
 | 
			
		||||
			mesecon.receptor_off(pos)
 | 
			
		||||
			node.name = "mesecons_solarpanel:solar_panel_off"
 | 
			
		||||
			minetest.swap_node(pos, node)
 | 
			
		||||
			mesecon.receptor_off(pos, mesecon.rules.wallmounted_get(node))
 | 
			
		||||
		end
 | 
			
		||||
	end,
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user