Skip to content

Commit 37eb7f0

Browse files
DesournumberZero
authored andcommittedOct 7, 2017
Improve rules and rule handling (#370)
1 parent 905260c commit 37eb7f0

File tree

5 files changed

+145
-114
lines changed

5 files changed

+145
-114
lines changed
 

Diff for: ‎mesecons/internal.lua

-49
Original file line numberDiff line numberDiff line change
@@ -548,52 +548,3 @@ function mesecon.is_powered(pos, rule)
548548
if (#sourcepos == 0) then return false
549549
else return sourcepos end
550550
end
551-
552-
--Rules rotation Functions:
553-
function mesecon.rotate_rules_right(rules)
554-
local nr = {}
555-
for i, rule in ipairs(rules) do
556-
table.insert(nr, {
557-
x = -rule.z,
558-
y = rule.y,
559-
z = rule.x,
560-
name = rule.name})
561-
end
562-
return nr
563-
end
564-
565-
function mesecon.rotate_rules_left(rules)
566-
local nr = {}
567-
for i, rule in ipairs(rules) do
568-
table.insert(nr, {
569-
x = rule.z,
570-
y = rule.y,
571-
z = -rule.x,
572-
name = rule.name})
573-
end
574-
return nr
575-
end
576-
577-
function mesecon.rotate_rules_down(rules)
578-
local nr = {}
579-
for i, rule in ipairs(rules) do
580-
table.insert(nr, {
581-
x = -rule.y,
582-
y = rule.x,
583-
z = rule.z,
584-
name = rule.name})
585-
end
586-
return nr
587-
end
588-
589-
function mesecon.rotate_rules_up(rules)
590-
local nr = {}
591-
for i, rule in ipairs(rules) do
592-
table.insert(nr, {
593-
x = rule.y,
594-
y = -rule.x,
595-
z = rule.z,
596-
name = rule.name})
597-
end
598-
return nr
599-
end

Diff for: ‎mesecons/presets.lua

+76-52
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,85 @@
11
mesecon.rules = {}
22
mesecon.state = {}
33

4-
mesecon.rules.default =
5-
{{x=0, y=0, z=-1},
6-
{x=1, y=0, z=0},
7-
{x=-1, y=0, z=0},
8-
{x=0, y=0, z=1},
9-
{x=1, y=1, z=0},
10-
{x=1, y=-1, z=0},
11-
{x=-1, y=1, z=0},
12-
{x=-1, y=-1, z=0},
13-
{x=0, y=1, z=1},
14-
{x=0, y=-1, z=1},
15-
{x=0, y=1, z=-1},
16-
{x=0, y=-1, z=-1}}
17-
18-
mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.default, {{x=0, y=-2, z=0}})
19-
20-
mesecon.rules.buttonlike =
21-
{{x = 1, y = 0, z = 0},
22-
{x = 1, y = 1, z = 0},
23-
{x = 1, y =-1, z = 0},
24-
{x = 1, y =-1, z = 1},
25-
{x = 1, y =-1, z =-1},
26-
{x = 2, y = 0, z = 0}}
27-
28-
mesecon.rules.flat =
29-
{{x = 1, y = 0, z = 0},
30-
{x =-1, y = 0, z = 0},
31-
{x = 0, y = 0, z = 1},
32-
{x = 0, y = 0, z =-1}}
33-
34-
mesecon.rules.alldirs =
35-
{{x= 1, y= 0, z= 0},
36-
{x=-1, y= 0, z= 0},
37-
{x= 0, y= 1, z= 0},
38-
{x= 0, y=-1, z= 0},
39-
{x= 0, y= 0, z= 1},
40-
{x= 0, y= 0, z=-1}}
4+
mesecon.rules.default = {
5+
{x = 0, y = 0, z = -1},
6+
{x = 1, y = 0, z = 0},
7+
{x = -1, y = 0, z = 0},
8+
{x = 0, y = 0, z = 1},
9+
{x = 1, y = 1, z = 0},
10+
{x = 1, y = -1, z = 0},
11+
{x = -1, y = 1, z = 0},
12+
{x = -1, y = -1, z = 0},
13+
{x = 0, y = 1, z = 1},
14+
{x = 0, y = -1, z = 1},
15+
{x = 0, y = 1, z = -1},
16+
{x = 0, y = -1, z = -1},
17+
}
18+
19+
mesecon.rules.floor = mesecon.mergetable(mesecon.rules.default, {{x = 0, y = -1, z = 0}})
20+
21+
mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.floor, {{x = 0, y = -2, z = 0}})
22+
23+
mesecon.rules.buttonlike = {
24+
{x = 1, y = 0, z = 0},
25+
{x = 1, y = 1, z = 0},
26+
{x = 1, y = -1, z = 0},
27+
{x = 1, y = -1, z = 1},
28+
{x = 1, y = -1, z = -1},
29+
{x = 2, y = 0, z = 0},
30+
}
31+
32+
mesecon.rules.flat = {
33+
{x = 1, y = 0, z = 0},
34+
{x = -1, y = 0, z = 0},
35+
{x = 0, y = 0, z = 1},
36+
{x = 0, y = 0, z = -1},
37+
}
38+
39+
mesecon.rules.alldirs = {
40+
{x = 1, y = 0, z = 0},
41+
{x = -1, y = 0, z = 0},
42+
{x = 0, y = 1, z = 0},
43+
{x = 0, y = -1, z = 0},
44+
{x = 0, y = 0, z = 1},
45+
{x = 0, y = 0, z = -1},
46+
}
47+
48+
local rules_wallmounted = {
49+
xp = mesecon.rotate_rules_down(mesecon.rules.floor),
50+
xn = mesecon.rotate_rules_up(mesecon.rules.floor),
51+
yp = mesecon.rotate_rules_up(mesecon.rotate_rules_up(mesecon.rules.floor)),
52+
yn = mesecon.rules.floor,
53+
zp = mesecon.rotate_rules_left(mesecon.rotate_rules_up(mesecon.rules.floor)),
54+
zn = mesecon.rotate_rules_right(mesecon.rotate_rules_up(mesecon.rules.floor)),
55+
}
56+
57+
local rules_buttonlike = {
58+
xp = mesecon.rules.buttonlike,
59+
xn = mesecon.rotate_rules_right(mesecon.rotate_rules_right(mesecon.rules.buttonlike)),
60+
yp = mesecon.rotate_rules_down(mesecon.rules.buttonlike),
61+
yn = mesecon.rotate_rules_up(mesecon.rules.buttonlike),
62+
zp = mesecon.rotate_rules_right(mesecon.rules.buttonlike),
63+
zn = mesecon.rotate_rules_left(mesecon.rules.buttonlike),
64+
}
65+
66+
local function rules_from_dir(ruleset, dir)
67+
if dir.x == 1 then return ruleset.xp end
68+
if dir.y == 1 then return ruleset.yp end
69+
if dir.z == 1 then return ruleset.zp end
70+
if dir.x == -1 then return ruleset.xn end
71+
if dir.y == -1 then return ruleset.yn end
72+
if dir.Z == -1 then return ruleset.zn end
73+
end
74+
75+
mesecon.rules.wallmounted_get = function(node)
76+
local dir = minetest.wallmounted_to_dir(node.param2)
77+
return rules_from_dir(rules_wallmounted, dir)
78+
end
4179

4280
mesecon.rules.buttonlike_get = function(node)
43-
local rules = mesecon.rules.buttonlike
4481
local dir = minetest.facedir_to_dir(node.param2)
45-
if dir.x == 1 then
46-
-- No action needed
47-
elseif dir.z == -1 then
48-
rules=mesecon.rotate_rules_left(rules)
49-
elseif dir.x == -1 then
50-
rules=mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules))
51-
elseif dir.z == 1 then
52-
rules=mesecon.rotate_rules_right(rules)
53-
elseif dir.y == -1 then
54-
rules=mesecon.rotate_rules_up(rules)
55-
elseif dir.y == 1 then
56-
rules=mesecon.rotate_rules_down(rules)
57-
end
58-
return rules
82+
return rules_from_dir(rules_buttonlike, dir)
5983
end
6084

6185
mesecon.state.on = "on"

Diff for: ‎mesecons/util.lua

+50
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,56 @@ function mesecon.move_node(pos, newpos)
66
minetest.get_meta(pos):from_table(meta)
77
end
88

9+
-- Rules rotation Functions:
10+
function mesecon.rotate_rules_right(rules)
11+
local nr = {}
12+
for i, rule in ipairs(rules) do
13+
table.insert(nr, {
14+
x = -rule.z,
15+
y = rule.y,
16+
z = rule.x,
17+
name = rule.name})
18+
end
19+
return nr
20+
end
21+
22+
function mesecon.rotate_rules_left(rules)
23+
local nr = {}
24+
for i, rule in ipairs(rules) do
25+
table.insert(nr, {
26+
x = rule.z,
27+
y = rule.y,
28+
z = -rule.x,
29+
name = rule.name})
30+
end
31+
return nr
32+
end
33+
34+
function mesecon.rotate_rules_down(rules)
35+
local nr = {}
36+
for i, rule in ipairs(rules) do
37+
table.insert(nr, {
38+
x = -rule.y,
39+
y = rule.x,
40+
z = rule.z,
41+
name = rule.name})
42+
end
43+
return nr
44+
end
45+
46+
function mesecon.rotate_rules_up(rules)
47+
local nr = {}
48+
for i, rule in ipairs(rules) do
49+
table.insert(nr, {
50+
x = rule.y,
51+
y = -rule.x,
52+
z = rule.z,
53+
name = rule.name})
54+
end
55+
return nr
56+
end
57+
--
58+
959
function mesecon.flattenrules(allrules)
1060
--[[
1161
{

Diff for: ‎mesecons_lamp/init.lua

+8-6
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,17 @@ minetest.register_node("mesecons_lamp:lamp_on", {
1717
legacy_wallmounted = true,
1818
sunlight_propagates = true,
1919
walkable = true,
20-
light_source = default.LIGHT_MAX,
20+
light_source = minetest.LIGHT_MAX,
2121
node_box = mesecon_lamp_box,
2222
selection_box = mesecon_lamp_box,
23-
groups = {dig_immediate=3,not_in_creative_inventory=1, mesecon_effector_on = 1},
24-
drop="mesecons_lamp:lamp_off 1",
23+
groups = {dig_immediate = 3,not_in_creative_inventory = 1, mesecon_effector_on = 1},
24+
drop = "mesecons_lamp:lamp_off 1",
2525
sounds = default.node_sound_glass_defaults(),
2626
mesecons = {effector = {
2727
action_off = function (pos, node)
2828
minetest.swap_node(pos, {name = "mesecons_lamp:lamp_off", param2 = node.param2})
29-
end
29+
end,
30+
rules = mesecon.rules.wallmounted_get,
3031
}},
3132
on_blast = mesecon.on_blastnode,
3233
})
@@ -43,12 +44,13 @@ minetest.register_node("mesecons_lamp:lamp_off", {
4344
node_box = mesecon_lamp_box,
4445
selection_box = mesecon_lamp_box,
4546
groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1},
46-
description="Mesecon Lamp",
47+
description = "Mesecon Lamp",
4748
sounds = default.node_sound_glass_defaults(),
4849
mesecons = {effector = {
4950
action_on = function (pos, node)
5051
minetest.swap_node(pos, {name = "mesecons_lamp:lamp_on", param2 = node.param2})
51-
end
52+
end,
53+
rules = mesecon.rules.wallmounted_get,
5254
}},
5355
on_blast = mesecon.on_blastnode,
5456
})

Diff for: ‎mesecons_solarpanel/init.lua

+11-7
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ minetest.register_node("mesecons_solarpanel:solar_panel_on", {
2424
groups = {dig_immediate=3, not_in_creative_inventory = 1},
2525
sounds = default.node_sound_glass_defaults(),
2626
mesecons = {receptor = {
27-
state = mesecon.state.on
27+
state = mesecon.state.on,
28+
rules = mesecon.rules.wallmounted_get,
2829
}},
2930
on_blast = mesecon.on_blastnode,
3031
})
@@ -52,10 +53,11 @@ minetest.register_node("mesecons_solarpanel:solar_panel_off", {
5253
wall_side = { -8/16, -7/16, -7/16, -7/16, 7/16, 7/16 },
5354
},
5455
groups = {dig_immediate=3},
55-
description="Solar Panel",
56+
description = "Solar Panel",
5657
sounds = default.node_sound_glass_defaults(),
5758
mesecons = {receptor = {
58-
state = mesecon.state.off
59+
state = mesecon.state.off,
60+
rules = mesecon.rules.wallmounted_get,
5961
}},
6062
on_blast = mesecon.on_blastnode,
6163
})
@@ -76,8 +78,9 @@ minetest.register_abm(
7678
local light = minetest.get_node_light(pos, nil)
7779

7880
if light >= 12 then
79-
minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_on", param2=node.param2})
80-
mesecon.receptor_on(pos)
81+
node.name = "mesecons_solarpanel:solar_panel_on"
82+
minetest.swap_node(pos, node)
83+
mesecon.receptor_on(pos, mesecon.rules.wallmounted_get(node))
8184
end
8285
end,
8386
})
@@ -90,8 +93,9 @@ minetest.register_abm(
9093
local light = minetest.get_node_light(pos, nil)
9194

9295
if light < 12 then
93-
minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_off", param2=node.param2})
94-
mesecon.receptor_off(pos)
96+
node.name = "mesecons_solarpanel:solar_panel_off"
97+
minetest.swap_node(pos, node)
98+
mesecon.receptor_off(pos, mesecon.rules.wallmounted_get(node))
9599
end
96100
end,
97101
})

0 commit comments

Comments
 (0)
Please sign in to comment.