From 6fc8c6a2c086c66333574ea18ad562699dd92075 Mon Sep 17 00:00:00 2001 From: Jude Melton-Houghton Date: Sat, 19 Feb 2022 11:26:43 -0500 Subject: [PATCH] Fix issues with node movement and rotation --- mesecons/services.lua | 14 ++++++++------ mesecons/util.lua | 16 ++++++++++++++++ mesecons_extrawires/corner.lua | 6 ++---- mesecons_extrawires/doublecorner.lua | 5 +---- mesecons_extrawires/mod.conf | 1 - mesecons_extrawires/tjunction.lua | 6 ++---- mesecons_gates/init.lua | 1 + mesecons_insulated/init.lua | 6 ++---- mesecons_insulated/mod.conf | 1 - mesecons_mvps/init.lua | 6 ++++++ mesecons_receiver/init.lua | 21 ++++++++++++++++----- 11 files changed, 54 insertions(+), 29 deletions(-) diff --git a/mesecons/services.lua b/mesecons/services.lua index 58e57b5..c14c72f 100644 --- a/mesecons/services.lua +++ b/mesecons/services.lua @@ -2,6 +2,7 @@ mesecon.on_placenode = function(pos, node) mesecon.execute_autoconnect_hooks_now(pos, node) + node = minetest.get_node(pos) -- Receptors: Send on signal when active if mesecon.is_receptor_on(node.name) then @@ -11,18 +12,19 @@ mesecon.on_placenode = function(pos, node) -- Conductors: Send turnon signal when powered or replace by respective offstate conductor -- if placed conductor is an onstate one if mesecon.is_conductor(node.name) then + local conductor = mesecon.get_conductor(node.name) + if conductor.state ~= mesecon.state.off then + node.name = conductor.offstate or conductor.states[1] + minetest.swap_node(pos, node) + end local sources = mesecon.is_powered(pos) if sources then - -- also call receptor_on if itself is powered already, so that neighboring - -- conductors will be activated (when pushing an on-conductor with a piston) + mesecon.vm_begin() for _, s in ipairs(sources) do local rule = vector.subtract(s, pos) mesecon.turnon(pos, rule) end - --mesecon.receptor_on (pos, mesecon.conductor_get_rules(node)) - elseif mesecon.is_conductor_on(node) then - node.name = mesecon.get_conductor_off(node) - minetest.swap_node(pos, node) + mesecon.vm_commit() end end diff --git a/mesecons/util.lua b/mesecons/util.lua index f4137e5..6a20205 100644 --- a/mesecons/util.lua +++ b/mesecons/util.lua @@ -452,6 +452,22 @@ function mesecon.swap_node_force(pos, name, update_light) end end +-- An on_rotate callback for components which stay horizontal. +function mesecon.on_rotate_horiz(pos, node, user, mode, new_param2) + if not minetest.global_exists("screwdriver") then + return false + end + if mode ~= screwdriver.ROTATE_FACE then + return false + end + minetest.swap_node(pos, {name = "air"}) + mesecon.on_dignode(pos, node) + node.param2 = new_param2 + minetest.swap_node(pos, node) + mesecon.on_placenode(pos, node) + return true +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 diff --git a/mesecons_extrawires/corner.lua b/mesecons_extrawires/corner.lua index 1651b46..3aca209 100644 --- a/mesecons_extrawires/corner.lua +++ b/mesecons_extrawires/corner.lua @@ -1,5 +1,3 @@ -local screwdriver_exists = minetest.global_exists("screwdriver") - local corner_selectionbox = { type = "fixed", fixed = { -16/32, -16/32, -16/32, 5/32, -12/32, 5/32 }, @@ -40,7 +38,7 @@ minetest.register_node("mesecons_extrawires:corner_on", { offstate = "mesecons_extrawires:corner_off" }}, on_blast = mesecon.on_blastnode, - on_rotate = screwdriver_exists and screwdriver.rotate_simple, + on_rotate = mesecon.on_rotate_horiz, }) minetest.register_node("mesecons_extrawires:corner_off", { @@ -66,7 +64,7 @@ minetest.register_node("mesecons_extrawires:corner_off", { onstate = "mesecons_extrawires:corner_on" }}, on_blast = mesecon.on_blastnode, - on_rotate = screwdriver_exists and screwdriver.rotate_simple, + on_rotate = mesecon.on_rotate_horiz, }) minetest.register_craft({ diff --git a/mesecons_extrawires/doublecorner.lua b/mesecons_extrawires/doublecorner.lua index fbb39c0..de6051f 100644 --- a/mesecons_extrawires/doublecorner.lua +++ b/mesecons_extrawires/doublecorner.lua @@ -1,6 +1,3 @@ -local rotate -if minetest.global_exists("screwdriver") then rotate = screwdriver.rotate_simple end - local doublecorner_selectionbox = { type = "fixed", fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, @@ -69,7 +66,7 @@ for k, state in ipairs(doublecorner_states) do }, }, on_blast = mesecon.on_blastnode, - on_rotate = rotate, + on_rotate = mesecon.on_rotate_horiz, }) end diff --git a/mesecons_extrawires/mod.conf b/mesecons_extrawires/mod.conf index b4b88c2..cd9e2d3 100644 --- a/mesecons_extrawires/mod.conf +++ b/mesecons_extrawires/mod.conf @@ -1,3 +1,2 @@ name = mesecons_extrawires depends = mesecons, mesecons_gamecompat -optional_depends = screwdriver diff --git a/mesecons_extrawires/tjunction.lua b/mesecons_extrawires/tjunction.lua index 3829edb..ba68f75 100644 --- a/mesecons_extrawires/tjunction.lua +++ b/mesecons_extrawires/tjunction.lua @@ -1,5 +1,3 @@ -local screwdriver_exists = minetest.global_exists("screwdriver") - local tjunction_nodebox = { type = "fixed", -- ±0.001 is to prevent z-fighting @@ -52,7 +50,7 @@ minetest.register_node("mesecons_extrawires:tjunction_on", { offstate = "mesecons_extrawires:tjunction_off" }}, on_blast = mesecon.on_blastnode, - on_rotate = screwdriver_exists and screwdriver.rotate_simple, + on_rotate = mesecon.on_rotate_horiz, }) minetest.register_node("mesecons_extrawires:tjunction_off", { @@ -82,7 +80,7 @@ minetest.register_node("mesecons_extrawires:tjunction_off", { onstate = "mesecons_extrawires:tjunction_on" }}, on_blast = mesecon.on_blastnode, - on_rotate = screwdriver_exists and screwdriver.rotate_simple, + on_rotate = mesecon.on_rotate_horiz, }) minetest.register_craft({ diff --git a/mesecons_gates/init.lua b/mesecons_gates/init.lua index e42f548..51c29b3 100644 --- a/mesecons_gates/init.lua +++ b/mesecons_gates/init.lua @@ -84,6 +84,7 @@ local function register_gate(name, inputnumber, assess, recipe, description) offstate = basename.."_off", inputnumber = inputnumber, after_dig_node = mesecon.do_cooldown, + on_rotate = mesecon.on_rotate_horiz, },{ tiles = { "jeija_microcontroller_bottom.png^".."jeija_gate_off.png^".. diff --git a/mesecons_insulated/init.lua b/mesecons_insulated/init.lua index ceb7302..c641e94 100644 --- a/mesecons_insulated/init.lua +++ b/mesecons_insulated/init.lua @@ -1,5 +1,3 @@ -local screwdriver_exists = minetest.global_exists("screwdriver") - local function insulated_wire_get_rules(node) local rules = {{x = 1, y = 0, z = 0}, {x =-1, y = 0, z = 0}} @@ -43,7 +41,7 @@ minetest.register_node("mesecons_insulated:insulated_on", { rules = insulated_wire_get_rules }}, on_blast = mesecon.on_blastnode, - on_rotate = screwdriver_exists and screwdriver.rotate_simple, + on_rotate = mesecon.on_rotate_horiz, }) minetest.register_node("mesecons_insulated:insulated_off", { @@ -79,7 +77,7 @@ minetest.register_node("mesecons_insulated:insulated_off", { rules = insulated_wire_get_rules }}, on_blast = mesecon.on_blastnode, - on_rotate = screwdriver_exists and screwdriver.rotate_simple, + on_rotate = mesecon.on_rotate_horiz, }) minetest.register_craft({ diff --git a/mesecons_insulated/mod.conf b/mesecons_insulated/mod.conf index 1ff02e0..2f7f5b6 100644 --- a/mesecons_insulated/mod.conf +++ b/mesecons_insulated/mod.conf @@ -1,3 +1,2 @@ name = mesecons_insulated depends = mesecons, mesecons_gamecompat -optional_depends = screwdriver diff --git a/mesecons_mvps/init.lua b/mesecons_mvps/init.lua index f0ae522..426a39b 100644 --- a/mesecons_mvps/init.lua +++ b/mesecons_mvps/init.lua @@ -229,6 +229,12 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti for _, n in ipairs(nodes) do local np = vector.add(n.pos, movedir) + -- Turn off conductors in transit + local conductor = mesecon.get_conductor(n.node.name) + if conductor and conductor.state ~= mesecon.state.off then + n.node.name = conductor.offstate or conductor.states[1] + end + minetest.set_node(np, n.node) minetest.get_meta(np):from_table(n.meta) if n.node_timer then diff --git a/mesecons_receiver/init.lua b/mesecons_receiver/init.lua index d95b333..9a9eb21 100644 --- a/mesecons_receiver/init.lua +++ b/mesecons_receiver/init.lua @@ -209,8 +209,11 @@ function mesecon.receiver_place(rcpt_pos) local param2 = minetest.dir_to_facedir(minetest.facedir_to_dir(node.param2)) if string.find(nn.name, "mesecons:wire_") ~= nil then - minetest.set_node(pos, {name = rcvtype, param2 = param2}) - mesecon.on_placenode(pos, nn) + minetest.remove_node(pos) + mesecon.on_dignode(pos, nn) + local rcv_node = {name = rcvtype, param2 = param2} + minetest.set_node(pos, rcv_node) + mesecon.on_placenode(pos, rcv_node) end end @@ -218,6 +221,8 @@ function mesecon.receiver_remove(rcpt_pos, dugnode) local pos = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, dugnode.param2) local nn = minetest.get_node(pos) if string.find(nn.name, "mesecons_receiver:receiver_") ~= nil then + minetest.remove_node(pos) + mesecon.on_dignode(pos, nn) local node = {name = "mesecons:wire_00000000_off"} minetest.set_node(pos, node) mesecon.on_placenode(pos, node) @@ -257,7 +262,13 @@ minetest.register_on_placenode(function (pos, node) end end) -function mesecon.buttonlike_onrotate(pos, node) - minetest.after(0, mesecon.receiver_remove, pos, node) - minetest.after(0, mesecon.receiver_place, pos) +function mesecon.buttonlike_onrotate(pos, node, user, mode, new_param2) + minetest.swap_node(pos, {name = "air"}) + mesecon.receiver_remove(pos, node) + mesecon.on_dignode(pos, node) + node.param2 = new_param2 + minetest.swap_node(pos, node) + mesecon.on_placenode(pos, node) + mesecon.receiver_place(pos) + return true end