summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDS <vorunbekannt75@web.de>2017-10-08 01:39:02 +0200
committerVitaliy <silverunicorn2011@yandex.ru>2017-10-08 02:39:02 +0300
commit37eb7f00e855ed56a2fe512abc5d4e62119d3dc6 (patch)
tree0611e285eebbfd96e71d54a6db1406b80b6db8fc
parent905260c8db2d7d4844e3955fa38a79da233b3ab7 (diff)
downloadmesecons-37eb7f00e855ed56a2fe512abc5d4e62119d3dc6.tar
mesecons-37eb7f00e855ed56a2fe512abc5d4e62119d3dc6.tar.gz
mesecons-37eb7f00e855ed56a2fe512abc5d4e62119d3dc6.tar.bz2
mesecons-37eb7f00e855ed56a2fe512abc5d4e62119d3dc6.tar.xz
mesecons-37eb7f00e855ed56a2fe512abc5d4e62119d3dc6.zip
Improve rules and rule handling (#370)
-rw-r--r--mesecons/internal.lua49
-rw-r--r--mesecons/presets.lua128
-rw-r--r--mesecons/util.lua50
-rw-r--r--mesecons_lamp/init.lua14
-rw-r--r--mesecons_solarpanel/init.lua18
5 files changed, 145 insertions, 114 deletions
diff --git a/mesecons/internal.lua b/mesecons/internal.lua
index e5ba91e..6fdc3f9 100644
--- a/mesecons/internal.lua
+++ b/mesecons/internal.lua
@@ -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
diff --git a/mesecons/presets.lua b/mesecons/presets.lua
index 8c3ed67..490dbbf 100644
--- a/mesecons/presets.lua
+++ b/mesecons/presets.lua
@@ -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.pplate = mesecon.mergetable(mesecon.rules.default, {{x=0, y=-2, 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.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}}
+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.floor = mesecon.mergetable(mesecon.rules.default, {{x = 0, y = -1, z = 0}})
+
+mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.floor, {{x = 0, y = -2, 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.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"
diff --git a/mesecons/util.lua b/mesecons/util.lua
index a22d664..b15858d 100644
--- a/mesecons/util.lua
+++ b/mesecons/util.lua
@@ -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)
--[[
{
diff --git a/mesecons_lamp/init.lua b/mesecons_lamp/init.lua
index 15c89ff..a5459c3 100644
--- a/mesecons_lamp/init.lua
+++ b/mesecons_lamp/init.lua
@@ -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,
})
diff --git a/mesecons_solarpanel/init.lua b/mesecons_solarpanel/init.lua
index cbf8878..9981d95 100644
--- a/mesecons_solarpanel/init.lua
+++ b/mesecons_solarpanel/init.lua
@@ -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,
})