Skip to content

Commit

Permalink
Split wires into their own mod, introduce autoconnect hooks
Browse files Browse the repository at this point in the history
The update_autoconnect function had to be abstracted away from the
default wires, any kind of wire can now register autoconnect hooks,
which should make having multiple different wire types much easier.

mesecons_mvps, mesecons_receiver and mesecons_random made use of
update_autoconnect, their code was also adapted. This also fixes a
receiver bug: If a receiver was placed with a onstate receptor next
to it (but not the wall lever / button that caused the receiver to
appear) the receiver didn't turn on in the past.

Also move documentation for mesecon wire into mesecons_wire.
  • Loading branch information
cheapie authored and Jeija committed Aug 23, 2016
1 parent 4816dee commit 912f17f
Show file tree
Hide file tree
Showing 13 changed files with 44 additions and 26 deletions.
2 changes: 1 addition & 1 deletion documentation.json
@@ -1,6 +1,6 @@
{
"Conductors" : {
"Mesecon" : "mesecons/doc/mesecon",
"Mesecon" : "mesecons_wires/doc/mesecon",
"Insulated Wire" : "mesecons_insulated/doc/insulated",
"T-Junction" : "mesecons_extrawires/doc/tjunction",
"Crossing" : "mesecons_extrawires/doc/crossing",
Expand Down
1 change: 0 additions & 1 deletion mesecons/doc/mesecon/description.html

This file was deleted.

3 changes: 0 additions & 3 deletions mesecons/init.lua
Expand Up @@ -132,8 +132,5 @@ print("[OK] Mesecons")
-- To be removed in future releases
dofile(minetest.get_modpath("mesecons").."/legacy.lua");

--The actual wires
dofile(minetest.get_modpath("mesecons").."/wires.lua");

--Services like turnoff receptor on dignode and so on
dofile(minetest.get_modpath("mesecons").."/services.lua");
11 changes: 5 additions & 6 deletions mesecons/services.lua
@@ -1,7 +1,7 @@
-- Dig and place services

mesecon.on_placenode = function (pos, node)
mesecon.update_autoconnect(pos, node)
mesecon.on_placenode = function(pos, node)
mesecon.execute_autoconnect_hooks_now(pos, node)

-- Receptors: Send on signal when active
if mesecon.is_receptor_on(node.name) then
Expand Down Expand Up @@ -52,16 +52,15 @@ mesecon.on_placenode = function (pos, node)
end
end

mesecon.on_dignode = function (pos, node)
mesecon.on_dignode = function(pos, node)
if mesecon.is_conductor_on(node) then
mesecon.receptor_off(pos, mesecon.conductor_get_rules(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)
mesecon.execute_autoconnect_hooks_queue(pos, node)
end

minetest.register_on_placenode(mesecon.on_placenode)
minetest.register_on_dignode(mesecon.on_dignode)
Expand Down
31 changes: 31 additions & 0 deletions mesecons/util.lua
Expand Up @@ -273,3 +273,34 @@ mesecon.forceloaded_blocks = mesecon.file2table("mesecon_forceloaded")
minetest.register_on_shutdown(function()
mesecon.table2file("mesecon_forceloaded", mesecon.forceloaded_blocks)
end)
-- Autoconnect Hooks
-- Nodes like conductors may change their appearance and their connection rules
-- right after being placed or after being dug, e.g. the default wires use this
-- to automatically connect to linking nodes after placement.
-- After placement, the update function will be executed immediately so that the
-- possibly changed rules can be taken into account when recalculating the circuit.
-- After digging, the update function will be queued and executed after
-- recalculating the circuit. The update function must take care of updating the
-- node at the given position itself, but also all of the other nodes the given
-- position may have (had) a linking connection to.
mesecon.autoconnect_hooks = {}
-- name: A unique name for the hook, e.g. "foowire". Used to name the actionqueue function.
-- fct: The update function with parameters function(pos, node)
function mesecon.register_autoconnect_hook(name, fct)
mesecon.autoconnect_hooks[name] = fct
mesecon.queue:add_function("autoconnect_hook_"..name, fct)
end
function mesecon.execute_autoconnect_hooks_now(pos, node)
for _, fct in pairs(mesecon.autoconnect_hooks) do
fct(pos, node)
end
end
function mesecon.execute_autoconnect_hooks_queue(pos, node)
for name in pairs(mesecon.autoconnect_hooks) do
mesecon.queue:add_action(pos, "autoconnect_hook_"..name, {node})
end
end
1 change: 0 additions & 1 deletion mesecons_mvps/init.lua
Expand Up @@ -200,7 +200,6 @@ end
mesecon.register_on_mvps_move(function(moved_nodes)
for _, n in ipairs(moved_nodes) do
mesecon.on_placenode(n.pos, n.node)
mesecon.update_autoconnect(n.pos)
end
end)

Expand Down
2 changes: 1 addition & 1 deletion mesecons_random/init.lua
Expand Up @@ -9,7 +9,7 @@ minetest.register_node("mesecons_random:removestone", {
mesecons = {effector = {
action_on = function (pos, node)
minetest.remove_node(pos)
mesecon.update_autoconnect(pos)
mesecon.on_dignode(pos, node)
end
}}
})
Expand Down
10 changes: 2 additions & 8 deletions mesecons_receiver/init.lua
Expand Up @@ -104,13 +104,8 @@ function mesecon.receiver_place(rcpt_pos)

if string.find(nn.name, "mesecons:wire_") ~= nil then
minetest.dig_node(pos)
if mesecon.is_power_on(rcpt_pos) then
minetest.set_node(pos, {name = "mesecons_receiver:receiver_on", param2 = node.param2})
mesecon.receptor_on(pos, receiver_get_rules(node))
else
minetest.set_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2})
end
mesecon.update_autoconnect(pos)
minetest.set_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2})
mesecon.on_placenode(pos, nn)
end
end

Expand All @@ -121,7 +116,6 @@ function mesecon.receiver_remove(rcpt_pos, dugnode)
minetest.dig_node(pos)
local node = {name = "mesecons:wire_00000000_off"}
minetest.set_node(pos, node)
mesecon.update_autoconnect(pos)
mesecon.on_placenode(pos, node)
end
end
Expand Down
1 change: 1 addition & 0 deletions mesecons_wires/depends.txt
@@ -0,0 +1 @@
mesecons
1 change: 1 addition & 0 deletions mesecons_wires/doc/mesecon/description.html
@@ -0,0 +1 @@
Mesecons are the wires, use them to connect effectors with receptors.
File renamed without changes
File renamed without changes
7 changes: 2 additions & 5 deletions mesecons/wires.lua → mesecons_wires/init.lua
Expand Up @@ -91,10 +91,7 @@ local update_on_place_dig = function (pos, node)
end
end

function mesecon.update_autoconnect(pos, node)
if (not node) then node = minetest.get_node(pos) end
update_on_place_dig(pos, node)
end
mesecon.register_autoconnect_hook("wire", update_on_place_dig)

-- ############################
-- ## Wire node registration ##
Expand Down Expand Up @@ -204,7 +201,7 @@ register_wires = function()
groups_off["not_in_creative_inventory"] = 1
end

mesecon.register_node("mesecons:wire_"..nodeid, {
mesecon.register_node(":mesecons:wire_"..nodeid, {
description = "Mesecon",
drawtype = "nodebox",
inventory_image = "mesecons_wire_inv.png",
Expand Down

1 comment on commit 912f17f

@mldulaney
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You know, having a way to migrate through this change would have been nice

Please sign in to comment.