summaryrefslogtreecommitdiff
path: root/mesecons
diff options
context:
space:
mode:
authorJeija <jeija@mesecons.net>2014-11-22 11:37:47 +0100
committerJeija <jeija@mesecons.net>2014-11-22 11:40:58 +0100
commit194155fff8e848750dc716fd920045b3c340310d (patch)
tree5717748611bf2483e68a1eba908381fb7b064f19 /mesecons
parent87bfbb4de9b447eb3f69decc68a7695c070c99af (diff)
downloadmesecons-194155fff8e848750dc716fd920045b3c340310d.tar
mesecons-194155fff8e848750dc716fd920045b3c340310d.tar.gz
mesecons-194155fff8e848750dc716fd920045b3c340310d.tar.bz2
mesecons-194155fff8e848750dc716fd920045b3c340310d.tar.xz
mesecons-194155fff8e848750dc716fd920045b3c340310d.zip
Rewrite mesecon wires. This should increase the efficiency and speed of
large machines. It also makes the wires.lua code easier to understand and more maintainable. In case any other mod depends on mesecon:update_autoconnect, please update it to use mesecon.update_autoconnect. This should also fix some other minor bugs. Please report bugs if this commit creates new ones. This commit changes wire looks and removes some unneccesary textures.
Diffstat (limited to 'mesecons')
-rw-r--r--mesecons/actionqueue.lua2
-rw-r--r--mesecons/internal.lua18
-rw-r--r--mesecons/services.lua7
-rw-r--r--mesecons/textures/jeija_mesecon_crossing_off.pngbin341 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_crossing_on.pngbin340 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_curved_off.pngbin307 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_curved_on.pngbin307 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_inverter_off.pngbin743 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_inverter_on.pngbin725 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_on.pngbin196 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_plug.pngbin713 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_socket_off.pngbin751 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_socket_on.pngbin737 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_t_junction_off.pngbin330 -> 0 bytes
-rw-r--r--mesecons/textures/jeija_mesecon_t_junction_on.pngbin319 -> 0 bytes
-rw-r--r--mesecons/textures/mesecons_wire_inv.png (renamed from mesecons/textures/jeija_mesecon_off.png)bin204 -> 204 bytes
-rw-r--r--mesecons/textures/mesecons_wire_off.png (renamed from mesecons/textures/wires_full_off.png)bin465 -> 465 bytes
-rw-r--r--mesecons/textures/mesecons_wire_on.png (renamed from mesecons/textures/wires_full_on.png)bin464 -> 464 bytes
-rw-r--r--mesecons/textures/wires_bump_off.pngbin347 -> 0 bytes
-rw-r--r--mesecons/textures/wires_bump_on.pngbin386 -> 0 bytes
-rw-r--r--mesecons/textures/wires_inv.pngbin167 -> 0 bytes
-rw-r--r--mesecons/textures/wires_off.pngbin454 -> 0 bytes
-rw-r--r--mesecons/textures/wires_on.pngbin492 -> 0 bytes
-rw-r--r--mesecons/textures/wires_vertical_off.pngbin373 -> 0 bytes
-rw-r--r--mesecons/textures/wires_vertical_on.pngbin396 -> 0 bytes
-rw-r--r--mesecons/util.lua17
-rw-r--r--mesecons/wires.lua477
27 files changed, 249 insertions, 272 deletions
diff --git a/mesecons/actionqueue.lua b/mesecons/actionqueue.lua
index e0b8c65..e7cbc55 100644
--- a/mesecons/actionqueue.lua
+++ b/mesecons/actionqueue.lua
@@ -14,7 +14,7 @@ function mesecon.queue:add_action(pos, func, params, time, overwritecheck, prior
priority = priority or 1
local action = { pos=mesecon:tablecopy(pos),
func=func,
- params=mesecon:tablecopy(params),
+ params=mesecon:tablecopy(params or {}),
time=time,
owcheck=(overwritecheck and mesecon:tablecopy(overwritecheck)) or nil,
priority=priority}
diff --git a/mesecons/internal.lua b/mesecons/internal.lua
index d45b0bf..edf361f 100644
--- a/mesecons/internal.lua
+++ b/mesecons/internal.lua
@@ -26,10 +26,6 @@
-- mesecon:deactivate(pos, node, recdepth) --> Deactivates the effector node at the specific pos (calls nodedef.mesecons.effector.action_off), "
-- mesecon:changesignal(pos, node, rulename, newstate) --> Changes the effector node at the specific pos (calls nodedef.mesecons.effector.action_change), "
--- RULES
--- mesecon:add_rules(name, rules) | deprecated? --> Saves rules table by name
--- mesecon:get_rules(name, rules) | deprecated? --> Loads rules table with name
-
-- CONDUCTORS
-- mesecon:is_conductor(nodename) --> Returns true if nodename is a conductor
-- mesecon:is_conductor_on(node) --> Returns true if node is a conductor with state = mesecon.state.on
@@ -244,18 +240,6 @@ function mesecon:changesignal(pos, node, rulename, newstate, recdepth)
mesecon.queue:add_action(pos, "change", {rulename, newstate}, nil, rulename, 1 / recdepth)
end
--- #########
--- # Rules # "Database" for rulenames
--- #########
-
-function mesecon:add_rules(name, rules)
- mesecon.rules[name] = rules
-end
-
-function mesecon:get_rules(name)
- return mesecon.rules[name]
-end
-
-- Conductors
function mesecon:is_conductor_on(node, rulename)
@@ -548,7 +532,7 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p
return false
end
-function mesecon:rules_link_rule_all(output, rule) --output/input are positions (outputrules optional, used if node has been dug), second return value: affected input rules
+function mesecon:rules_link_rule_all(output, rule)
local input = mesecon:addPosRule(output, rule)
local inputnode = minetest.get_node(input)
local inputrules = mesecon:get_any_inputrules (inputnode)
diff --git a/mesecons/services.lua b/mesecons/services.lua
index d549cb0..0cf94d2 100644
--- a/mesecons/services.lua
+++ b/mesecons/services.lua
@@ -1,6 +1,8 @@
-- Dig and place services
mesecon.on_placenode = function (pos, node)
+ mesecon.update_autoconnect(pos, node)
+
-- Receptors: Send on signal when active
if mesecon:is_receptor_on(node.name) then
mesecon:receptor_on(pos, mesecon:receptor_get_rules(node))
@@ -18,7 +20,7 @@ mesecon.on_placenode = function (pos, node)
mesecon:turnon(pos, rule)
end
--mesecon:receptor_on (pos, mesecon:conductor_get_rules(node))
- elseif mesecon:is_conductor_off(node.name) then
+ elseif mesecon:is_conductor_on(node) then
minetest.swap_node(pos, {name = mesecon:get_conductor_off(node)})
end
end
@@ -41,8 +43,11 @@ mesecon.on_dignode = function (pos, node)
elseif mesecon:is_receptor_on(node.name) then
mesecon:receptor_off(pos, mesecon:receptor_get_rules(node))
end
+ mesecon.queue:add_action(pos, "update_autoconnect", {node})
end
+mesecon.queue:add_function("update_autoconnect", mesecon.update_autoconnect)
+
minetest.register_on_placenode(mesecon.on_placenode)
minetest.register_on_dignode(mesecon.on_dignode)
diff --git a/mesecons/textures/jeija_mesecon_crossing_off.png b/mesecons/textures/jeija_mesecon_crossing_off.png
deleted file mode 100644
index 4e3ca03..0000000
--- a/mesecons/textures/jeija_mesecon_crossing_off.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_crossing_on.png b/mesecons/textures/jeija_mesecon_crossing_on.png
deleted file mode 100644
index 4518fa7..0000000
--- a/mesecons/textures/jeija_mesecon_crossing_on.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_curved_off.png b/mesecons/textures/jeija_mesecon_curved_off.png
deleted file mode 100644
index b34335f..0000000
--- a/mesecons/textures/jeija_mesecon_curved_off.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_curved_on.png b/mesecons/textures/jeija_mesecon_curved_on.png
deleted file mode 100644
index fa882e4..0000000
--- a/mesecons/textures/jeija_mesecon_curved_on.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_inverter_off.png b/mesecons/textures/jeija_mesecon_inverter_off.png
deleted file mode 100644
index bd4de1b..0000000
--- a/mesecons/textures/jeija_mesecon_inverter_off.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_inverter_on.png b/mesecons/textures/jeija_mesecon_inverter_on.png
deleted file mode 100644
index be41599..0000000
--- a/mesecons/textures/jeija_mesecon_inverter_on.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_on.png b/mesecons/textures/jeija_mesecon_on.png
deleted file mode 100644
index d7ebeec..0000000
--- a/mesecons/textures/jeija_mesecon_on.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_plug.png b/mesecons/textures/jeija_mesecon_plug.png
deleted file mode 100644
index 8a4d281..0000000
--- a/mesecons/textures/jeija_mesecon_plug.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_socket_off.png b/mesecons/textures/jeija_mesecon_socket_off.png
deleted file mode 100644
index ad3f601..0000000
--- a/mesecons/textures/jeija_mesecon_socket_off.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_socket_on.png b/mesecons/textures/jeija_mesecon_socket_on.png
deleted file mode 100644
index 6a9c480..0000000
--- a/mesecons/textures/jeija_mesecon_socket_on.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_t_junction_off.png b/mesecons/textures/jeija_mesecon_t_junction_off.png
deleted file mode 100644
index 7131846..0000000
--- a/mesecons/textures/jeija_mesecon_t_junction_off.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_t_junction_on.png b/mesecons/textures/jeija_mesecon_t_junction_on.png
deleted file mode 100644
index a6609ee..0000000
--- a/mesecons/textures/jeija_mesecon_t_junction_on.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/jeija_mesecon_off.png b/mesecons/textures/mesecons_wire_inv.png
index a3930cb..a3930cb 100644
--- a/mesecons/textures/jeija_mesecon_off.png
+++ b/mesecons/textures/mesecons_wire_inv.png
Binary files differ
diff --git a/mesecons/textures/wires_full_off.png b/mesecons/textures/mesecons_wire_off.png
index 58164fa..58164fa 100644
--- a/mesecons/textures/wires_full_off.png
+++ b/mesecons/textures/mesecons_wire_off.png
Binary files differ
diff --git a/mesecons/textures/wires_full_on.png b/mesecons/textures/mesecons_wire_on.png
index 98a86c8..98a86c8 100644
--- a/mesecons/textures/wires_full_on.png
+++ b/mesecons/textures/mesecons_wire_on.png
Binary files differ
diff --git a/mesecons/textures/wires_bump_off.png b/mesecons/textures/wires_bump_off.png
deleted file mode 100644
index 1e0bd74..0000000
--- a/mesecons/textures/wires_bump_off.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/wires_bump_on.png b/mesecons/textures/wires_bump_on.png
deleted file mode 100644
index da9a661..0000000
--- a/mesecons/textures/wires_bump_on.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/wires_inv.png b/mesecons/textures/wires_inv.png
deleted file mode 100644
index 626f8d4..0000000
--- a/mesecons/textures/wires_inv.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/wires_off.png b/mesecons/textures/wires_off.png
deleted file mode 100644
index 757d339..0000000
--- a/mesecons/textures/wires_off.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/wires_on.png b/mesecons/textures/wires_on.png
deleted file mode 100644
index 57bb82d..0000000
--- a/mesecons/textures/wires_on.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/wires_vertical_off.png b/mesecons/textures/wires_vertical_off.png
deleted file mode 100644
index ba8d472..0000000
--- a/mesecons/textures/wires_vertical_off.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/textures/wires_vertical_on.png b/mesecons/textures/wires_vertical_on.png
deleted file mode 100644
index 172fa65..0000000
--- a/mesecons/textures/wires_vertical_on.png
+++ /dev/null
Binary files differ
diff --git a/mesecons/util.lua b/mesecons/util.lua
index 91d435a..e49e82c 100644
--- a/mesecons/util.lua
+++ b/mesecons/util.lua
@@ -193,3 +193,20 @@ function mesecon:cmpAny(t1, t2)
return true
end
+
+-- does not overwrite values
+mesecon.mergetable = function(source, dest)
+ for k, v in pairs(source) do
+ dest[k] = dest[k] or v
+ end
+end
+
+mesecon.register_node = function(name, spec_common, spec_off, spec_on)
+ spec_common.drop = spec_common.drop or name .. "_off"
+
+ mesecon.mergetable(spec_common, spec_on);
+ mesecon.mergetable(spec_common, spec_off);
+
+ minetest.register_node(name .. "_on", spec_on)
+ minetest.register_node(name .. "_off", spec_off)
+end
diff --git a/mesecons/wires.lua b/mesecons/wires.lua
index 499c781..158d436 100644
--- a/mesecons/wires.lua
+++ b/mesecons/wires.lua
@@ -1,280 +1,251 @@
--- naming scheme: wire:(xp)(zp)(xm)(zm)_on/off
--- The conditions in brackets define whether there is a mesecon at that place or not
--- 1 = there is one; 0 = there is none
--- y always means y+
-
-box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/16, 1/16}
-box_bump1 = { -2/16, -8/16, -2/16, 2/16, -13/32, 2/16 }
-
-box_xp = {1/16, -.5, -1/16, 8/16, -.5+1/16, 1/16}
-box_zp = {-1/16, -.5, 1/16, 1/16, -.5+1/16, 8/16}
-box_xm = {-8/16, -.5, -1/16, -1/16, -.5+1/16, 1/16}
-box_zm = {-1/16, -.5, -8/16, 1/16, -.5+1/16, -1/16}
-
-box_xpy = {.5-1/16, -.5+1/16, -1/16, .5, .4999+1/16, 1/16}
-box_zpy = {-1/16, -.5+1/16, .5-1/16, 1/16, .4999+1/16, .5}
-box_xmy = {-.5, -.5+1/16, -1/16, -.5+1/16, .4999+1/16, 1/16}
-box_zmy = {-1/16, -.5+1/16, -.5, 1/16, .4999+1/16, -.5+1/16}
-
--- Registering the wires
-
-for xp=0, 1 do
-for zp=0, 1 do
-for xm=0, 1 do
-for zm=0, 1 do
-for xpy=0, 1 do
-for zpy=0, 1 do
-for xmy=0, 1 do
-for zmy=0, 1 do
- if (xpy == 1 and xp == 0) or (zpy == 1 and zp == 0)
- or (xmy == 1 and xm == 0) or (zmy == 1 and zm == 0) then break end
-
- local groups
- local nodeid = tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm )..
- tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy)
-
- if nodeid == "00000000" then
- groups = {dig_immediate = 3, mesecon_conductor_craftable=1}
- wiredesc = "Mesecon"
- else
- groups = {dig_immediate = 3, not_in_creative_inventory = 1}
- wiredesc = "Mesecons Wire (ID: "..nodeid..")"
+-- naming scheme: wire:(xp)(zp)(xm)(zm)(xpyp)(zpyp)(xmyp)(zmyp)_on/off
+-- where x= x direction, z= z direction, y= y direction, p = +1, m = -1, e.g. xpym = {x=1, y=-1, z=0}
+-- The (xp)/(zpyp)/.. statements shall be replaced by either 0 or 1
+-- Where 0 means the wire has no visual connection to that direction and
+-- 1 means that the wire visually connects to that other node.
+
+-- #######################
+-- ## Update wire looks ##
+-- #######################
+
+-- self_pos = pos of any mesecon node, from_pos = pos of conductor to getconnect for
+local wire_getconnect = function (from_pos, self_pos)
+ local node = minetest.get_node(self_pos)
+ if minetest.registered_nodes[node.name]
+ and minetest.registered_nodes[node.name].mesecons then
+ -- rules of node to possibly connect to
+ local rules = {}
+ if (minetest.registered_nodes[node.name].mesecon_wire) then
+ rules = mesecon.rules.default
+ else
+ rules = mesecon:get_any_inputrules(node) or {}
+ mesecon.mergetable(mesecon:get_any_outputrules(node) or {}, rules)
+ end
+
+ for _, r in ipairs(mesecon:flattenrules(rules)) do
+ if (mesecon:cmpPos(mesecon:addPosRule(self_pos, r), from_pos)) then
+ return true
+ end
+ end
end
+ return false
+end
- local nodebox = {}
- local adjx = false
- local adjz = false
- if xp == 1 then table.insert(nodebox, box_xp) adjx = true end
- if zp == 1 then table.insert(nodebox, box_zp) adjz = true end
- if xm == 1 then table.insert(nodebox, box_xm) adjx = true end
- if zm == 1 then table.insert(nodebox, box_zm) adjz = true end
- if xpy == 1 then table.insert(nodebox, box_xpy) end
- if zpy == 1 then table.insert(nodebox, box_zpy) end
- if xmy == 1 then table.insert(nodebox, box_xmy) end
- if zmy == 1 then table.insert(nodebox, box_zmy) end
-
- if adjx and adjz and (xp + zp + xm + zm > 2) then
- table.insert(nodebox, box_bump1)
- tiles_off = {
- "wires_bump_off.png",
- "wires_bump_off.png",
- "wires_vertical_off.png",
- "wires_vertical_off.png",
- "wires_vertical_off.png",
- "wires_vertical_off.png"
- }
- tiles_on = {
- "wires_bump_on.png",
- "wires_bump_on.png",
- "wires_vertical_on.png",
- "wires_vertical_on.png",
- "wires_vertical_on.png",
- "wires_vertical_on.png"
- }
- else
- table.insert(nodebox, box_center)
- tiles_off = {
- "wires_off.png",
- "wires_off.png",
- "wires_vertical_off.png",
- "wires_vertical_off.png",
- "wires_vertical_off.png",
- "wires_vertical_off.png"
- }
- tiles_on = {
- "wires_on.png",
- "wires_on.png",
- "wires_vertical_on.png",
- "wires_vertical_on.png",
- "wires_vertical_on.png",
- "wires_vertical_on.png"
- }
+-- Update this node
+local wire_updateconnect = function (pos)
+ local connections = {}
+
+ for _, r in ipairs(mesecon.rules.default) do
+ if wire_getconnect(pos, mesecon:addPosRule(pos, r)) then
+ table.insert(connections, r)
+ end
end
- if nodeid == "00000000" then
- nodebox = {-8/16, -.5, -1/16, 8/16, -.5+1/16, 1/16}
+ local nid = {}
+ for _, vec in ipairs(connections) do
+ -- flat component
+ if vec.x == 1 then nid[0] = "1" end
+ if vec.z == 1 then nid[1] = "1" end
+ if vec.x == -1 then nid[2] = "1" end
+ if vec.z == -1 then nid[3] = "1" end
+
+ -- slopy component
+ if vec.y == 1 then
+ if vec.x == 1 then nid[4] = "1" end
+ if vec.z == 1 then nid[5] = "1" end
+ if vec.x == -1 then nid[6] = "1" end
+ if vec.z == -1 then nid[7] = "1" end
+ end
end
- minetest.register_node("mesecons:wire_"..nodeid.."_off", {
- description = wiredesc,
- drawtype = "nodebox",
- tiles = tiles_off,
--- inventory_image = "wires_inv.png",
--- wield_image = "wires_inv.png",
- inventory_image = "jeija_mesecon_off.png",
- wield_image = "jeija_mesecon_off.png",
- paramtype = "light",
- paramtype2 = "facedir",
- sunlight_propagates = true,
- selection_box = {
- type = "fixed",
- fixed = {-.5, -.5, -.5, .5, -.5+4/16, .5}
- },
- node_box = {
- type = "fixed",
- fixed = nodebox
- },
- groups = groups,
- walkable = false,
- stack_max = 99,
- drop = "mesecons:wire_00000000_off",
- mesecons = {conductor={
- state = mesecon.state.off,
- onstate = "mesecons:wire_"..nodeid.."_on"
- }}
- })
-
- minetest.register_node("mesecons:wire_"..nodeid.."_on", {
- description = "Wire ID:"..nodeid,
- drawtype = "nodebox",
- tiles = tiles_on,
--- inventory_image = "wires_inv.png",
--- wield_image = "wires_inv.png",
- inventory_image = "jeija_mesecon_off.png",
- wield_image = "jeija_mesecon_off.png",
- paramtype = "light",
- paramtype2 = "facedir",
- sunlight_propagates = true,
- selection_box = {
- type = "fixed",
- fixed = {-.5, -.5, -.5, .5, -.5+4/16, .5}
- },
- node_box = {
- type = "fixed",
- fixed = nodebox
- },
- groups = {dig_immediate = 3, mesecon = 2, not_in_creative_inventory = 1},
- walkable = false,
- stack_max = 99,
- drop = "mesecons:wire_00000000_off",
- mesecons = {conductor={
- state = mesecon.state.on,
- offstate = "mesecons:wire_"..nodeid.."_off"
- }}
- })
-end
-end
-end
-end
-end
-end
-end
-end
+ local nodeid = (nid[0] or "0")..(nid[1] or "0")..(nid[2] or "0")..(nid[3] or "0")
+ ..(nid[4] or "0")..(nid[5] or "0")..(nid[6] or "0")..(nid[7] or "0")
--- Updating the wires:
--- Place the right connection wire
+ local state_suffix = string.find(minetest.get_node(pos).name, "_off") and "_off" or "_on"
+ minetest.set_node(pos, {name = "mesecons:wire_"..nodeid..state_suffix})
+end
local update_on_place_dig = function (pos, node)
- if minetest.registered_nodes[node.name]
- and minetest.registered_nodes[node.name].mesecons then
- mesecon:update_autoconnect(pos)
+ -- Update placed node (get_node again as it may have been dug)
+ local nn = minetest.get_node(pos)
+ if (minetest.registered_nodes[nn.name])
+ and (minetest.registered_nodes[nn.name].mesecon_wire) then
+ wire_updateconnect(pos)
end
-end
-minetest.register_on_placenode(update_on_place_dig)
-minetest.register_on_dignode(update_on_place_dig)
-
-function mesecon:update_autoconnect(pos, secondcall, replace_old)
- local xppos = {x=pos.x+1, y=pos.y, z=pos.z}
- local zppos = {x=pos.x, y=pos.y, z=pos.z+1}
- local xmpos = {x=pos.x-1, y=pos.y, z=pos.z}
- local zmpos = {x=pos.x, y=pos.y, z=pos.z-1}
-
- local xpympos = {x=pos.x+1, y=pos.y-1, z=pos.z}
- local zpympos = {x=pos.x, y=pos.y-1, z=pos.z+1}
- local xmympos = {x=pos.x-1, y=pos.y-1, z=pos.z}
- local zmympos = {x=pos.x, y=pos.y-1, z=pos.z-1}
-
- local xpypos = {x=pos.x+1, y=pos.y+1, z=pos.z}
- local zpypos = {x=pos.x, y=pos.y+1, z=pos.z+1}
- local xmypos = {x=pos.x-1, y=pos.y+1, z=pos.z}
- local zmypos = {x=pos.x, y=pos.y+1, z=pos.z-1}
-
- if secondcall == nil then
- mesecon:update_autoconnect(xppos, true)
- mesecon:update_autoconnect(zppos, true)
- mesecon:update_autoconnect(xmpos, true)
- mesecon:update_autoconnect(zmpos, true)
-
- mesecon:update_autoconnect(xpypos, true)
- mesecon:update_autoconnect(zpypos, true)
- mesecon:update_autoconnect(xmypos, true)
- mesecon:update_autoconnect(zmypos, true)
-
- mesecon:update_autoconnect(xpympos, true)
- mesecon:update_autoconnect(zpympos, true)
- mesecon:update_autoconnect(xmympos, true)
- mesecon:update_autoconnect(zmympos, true)
+ -- Update nodes around it
+ local rules = {}
+ if minetest.registered_nodes[node.name]
+ and minetest.registered_nodes[node.name].mesecon_wire then
+ rules = mesecon.rules.default
+ else
+ rules = mesecon:get_any_inputrules(node) or {}
+ mesecon.mergetable(mesecon:get_any_outputrules(node) or {}, rules)
+ end
+ if (not rules) then return end
+
+ for _, r in ipairs(mesecon:flattenrules(rules)) do
+ local np = mesecon:addPosRule(pos, r)
+ if minetest.registered_nodes[minetest.get_node(np).name]
+ and minetest.registered_nodes[minetest.get_node(np).name].mesecon_wire then
+ wire_updateconnect(np)
+ end
end
+end
- nodename = minetest.get_node(pos).name
- if string.find(nodename, "mesecons:wire_") == nil and not replace_old then return nil end
+function mesecon.update_autoconnect(pos, node)
+ if (not node) then node = minetest.get_node(pos) end
+ update_on_place_dig(pos, node)
+end
- if mesecon:rules_link_anydir(pos, xppos) then xp = 1 else xp = 0 end
- if mesecon:rules_link_anydir(pos, xmpos) then xm = 1 else xm = 0 end
- if mesecon:rules_link_anydir(pos, zppos) then zp = 1 else zp = 0 end
- if mesecon:rules_link_anydir(pos, zmpos) then zm = 1 else zm = 0 end
+-- ############################
+-- ## Wire node registration ##
+-- ############################
+-- Nodeboxes:
+local box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/16, 1/16}
+local box_bump1 = { -2/16, -8/16, -2/16, 2/16, -13/32, 2/16 }
+
+local nbox_nid =
+{
+ [0] = {1/16, -.5, -1/16, 8/16, -.5+1/16, 1/16}, -- x positive
+ [1] = {-1/16, -.5, 1/16, 1/16, -.5+1/16, 8/16}, -- z positive
+ [2] = {-8/16, -.5, -1/16, -1/16, -.5+1/16, 1/16}, -- x negative
+ [3] = {-1/16, -.5, -8/16, 1/16, -.5+1/16, -1/16}, -- z negative
+
+ [4] = {.5-1/16, -.5+1/16, -1/16, .5, .4999+1/16, 1/16}, -- x positive up
+ [5] = {-1/16, -.5+1/16, .5-1/16, 1/16, .4999+1/16, .5}, -- z positive up
+ [6] = {-.5, -.5+1/16, -1/16, -.5+1/16, .4999+1/16, 1/16}, -- x negative up
+ [7] = {-1/16, -.5+1/16, -.5, 1/16, .4999+1/16, -.5+1/16} -- z negative up
+}
+
+local tiles_off = { "mesecons_wire_off.png" }
+local tiles_on = { "mesecons_wire_on.png" }
+
+local selectionbox =
+{
+ type = "fixed",
+ fixed = {-.5, -.5, -.5, .5, -.5+4/16, .5}
+}
+
+-- go to the next nodeid (ex.: 01000011 --> 01000100)
+local nid_inc = function() end
+nid_inc = function (nid)
+ local i = 0
+ while nid[i-1] ~= 1 do
+ nid[i] = (nid[i] ~= 1) and 1 or 0
+ i = i + 1
+ end
- if mesecon:rules_link_anydir(pos, xpympos) then xp = 1 end
- if mesecon:rules_link_anydir(pos, xmympos) then xm = 1 end
- if mesecon:rules_link_anydir(pos, zpympos) then zp = 1 end
- if mesecon:rules_link_anydir(pos, zmympos) then zm = 1 end
+ -- BUT: Skip impossible nodeids:
+ if ((nid[0] == 0 and nid[4] == 1) or (nid[1] == 0 and nid[5] == 1)
+ or (nid[2] == 0 and nid[6] == 1) or (nid[3] == 0 and nid[7] == 1)) then
+ return nid_inc(nid)
+ end
- if mesecon:rules_link_anydir(pos, xpypos) then xpy = 1 else xpy = 0 end
- if mesecon:rules_link_anydir(pos, zpypos) then zpy = 1 else zpy = 0 end
- if mesecon:rules_link_anydir(pos, xmypos) then xmy = 1 else xmy = 0 end
- if mesecon:rules_link_anydir(pos, zmypos) then zmy = 1 else zmy = 0 end
+ return i <= 8
+end
- if xpy == 1 then xp = 1 end
- if zpy == 1 then zp = 1 end
- if xmy == 1 then xm = 1 end
- if zmy == 1 then zm = 1 end
+register_wires = function()
+ local nid = {}
+ while true do
+ -- Create group specifiction and nodeid string (see note above for details)
+ local nodeid = (nid[0] or "0")..(nid[1] or "0")..(nid[2] or "0")..(nid[3] or "0")
+ ..(nid[4] or "0")..(nid[5] or "0")..(nid[6] or "0")..(nid[7] or "0")
+
+ -- Calculate nodebox
+ local nodebox = {type = "fixed", fixed={box_center}}
+ for i=0,7 do
+ if nid[i] == 1 then
+ table.insert(nodebox.fixed, nbox_nid[i])
+ end
+ end
+
+ -- Add bump to nodebox if curved
+ if (nid[0] == 1 and nid[1] == 1) or (nid[1] == 1 and nid[2] == 1)
+ or (nid[2] == 1 and nid[3] == 1) or (nid[3] == 1 and nid[0] == 1) then
+ table.insert(nodebox.fixed, box_bump1)
+ end
+
+ -- If nothing to connect to, still make a nodebox of a straight wire
+ if nodeid == "00000000" then
+ nodebox.fixed = {-8/16, -.5, -1/16, 8/16, -.5+1/16, 1/16}
+ end
+
+ local rules = {}
+ if (nid[0] == 1) then table.insert(rules, vector.new( 1, 0, 0)) end
+ if (nid[1] == 1) then table.insert(rules, vector.new( 0, 0, 1)) end
+ if (nid[2] == 1) then table.insert(rules, vector.new(-1, 0, 0)) end
+ if (nid[3] == 1) then table.insert(rules, vector.new( 0, 0, -1)) end
+
+ if (nid[0] == 1) then table.insert(rules, vector.new( 1, -1, 0)) end
+ if (nid[1] == 1) then table.insert(rules, vector.new( 0, -1, 1)) end
+ if (nid[2] == 1) then table.insert(rules, vector.new(-1, -1, 0)) end
+ if (nid[3] == 1) then table.insert(rules, vector.new( 0, -1, -1)) end
+
+ if (nid[4] == 1) then table.insert(rules, vector.new( 1, 1, 0)) end
+ if (nid[5] == 1) then table.insert(rules, vector.new( 0, 1, 1)) end
+ if (nid[6] == 1) then table.insert(rules, vector.new(-1, 1, 0)) end
+ if (nid[7] == 1) then table.insert(rules, vector.new( 0, 1, -1)) end
+
+ local meseconspec_off = { conductor = {
+ rules = rules,
+ state = mesecon.state.off,
+ onstate = "mesecons:wire_"..nodeid.."_on"
+ }}
- local nodeid = tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm )..
- tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy)
+ local meseconspec_on = { conductor = {
+ rules = rules,
+ state = mesecon.state.on,
+ offstate = "mesecons:wire_"..nodeid.."_off"
+ }}
-
- if string.find(nodename, "_off") ~= nil then
- minetest.set_node(pos, {name = "mesecons:wire_"..nodeid.."_off"})
- else
- minetest.set_node(pos, {name = "mesecons:wire_"..nodeid.."_on" })
+ local groups_on = {dig_immediate = 3, not_in_creative_inventory = 1}
+ local groups_off = {dig_immediate = 3}
+ if nodeid ~= "00000000" then
+ groups_off["not_in_creative_inventory"] = 1
+ end
+
+ mesecon.register_node("mesecons:wire_"..nodeid, {
+ description = "Mesecon",
+ drawtype = "nodebox",
+ inventory_image = "mesecons_wire_inv.png",
+ wield_image = "mesecons_wire_inv.png",
+ paramtype = "light",
+ paramtype2 = "facedir",
+ sunlight_propagates = true,
+ selection_box = selectionbox,
+ node_box = nodebox,
+ walkable = false,
+ drop = "mesecons:wire_00000000_off",
+ mesecon_wire = true
+ }, {tiles = tiles_off, mesecons = meseconspec_off, groups = groups_off},
+ {tiles = tiles_on, mesecons = meseconspec_on, groups = groups_on})
+
+ if (nid_inc(nid) == false) then return end
end
end
+register_wires()
-if not minetest.registered_nodes["default:stone_with_mese"] then --before MESE update, use old recipes
- minetest.register_craft({
- output = "mesecons:wire_00000000_off 18",
- recipe = {
- {"default:mese"},
- }
- })
-else
-
- minetest.register_craft({
- type = "cooking",
- output = "mesecons:wire_00000000_off 2",
- recipe = "default:mese_crystal_fragment",
- cooktime = 3,
- })
-
- minetest.register_craft({
- type = "cooking",
- output = "mesecons:wire_00000000_off 18",
- recipe = "default:mese_crystal",
- cooktime = 15,
- })
-
- minetest.register_craft({
- type = "cooking",
- output = "mesecons:wire_00000000_off 162",
- recipe = "default:mese",
- cooktime = 30,
- })
-
-end
+-- ##############
+-- ## Crafting ##
+-- ##############
+minetest.register_craft({
+ type = "cooking",
+ output = "mesecons:wire_00000000_off 2",
+ recipe = "default:mese_crystal_fragment",
+ cooktime = 3,
+})
minetest.register_craft({
type = "cooking",
- output = "mesecons:wire_00000000_off 16",
+ output = "mesecons:wire_00000000_off 18",
recipe = "default:mese_crystal",
+ cooktime = 15,
+})
+
+minetest.register_craft({
+ type = "cooking",
+ output = "mesecons:wire_00000000_off 162",
+ recipe = "default:mese",
+ cooktime = 30,
})