From 960b7c4915574ae151f5682d4c2e2957441485f2 Mon Sep 17 00:00:00 2001 From: Jude Melton-Houghton Date: Sat, 7 May 2022 16:24:58 -0400 Subject: [PATCH] Make some fixes to movement and rotation (#584) --- mesecons/services.lua | 15 +++++++++------ mesecons/util.lua | 18 ++++++++++++++++++ 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 | 9 ++++++++- mesecons_receiver/init.lua | 19 ++++++++++++++----- 11 files changed, 57 insertions(+), 30 deletions(-) diff --git a/mesecons/services.lua b/mesecons/services.lua index 58e57b5..f33aee4 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) -- Update the node in case it was just changed. -- Receptors: Send on signal when active if mesecon.is_receptor_on(node.name) then @@ -11,18 +12,20 @@ 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 + -- Turn the conductor off. + 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..b87dffd 100644 --- a/mesecons/util.lua +++ b/mesecons/util.lua @@ -6,6 +6,24 @@ function mesecon.move_node(pos, newpos) minetest.get_meta(pos):from_table(meta) end +-- An on_rotate callback for mesecons components. +function mesecon.on_rotate(pos, node, _, _, new_param2) + local new_node = {name = node.name, param1 = node.param1, param2 = new_param2} + minetest.swap_node(pos, new_node) + mesecon.on_dignode(pos, node) + mesecon.on_placenode(pos, new_node) + minetest.check_for_falling(pos) + return true +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") or mode ~= screwdriver.ROTATE_FACE then + return false + end + return mesecon.on_rotate(pos, node, user, mode, new_param2) +end + -- Rules rotation Functions: function mesecon.rotate_rules_right(rules) local nr = {} 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..c047ed9 100644 --- a/mesecons_mvps/init.lua +++ b/mesecons_mvps/init.lua @@ -220,6 +220,8 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti minetest.remove_node(n.pos) end + local oldstack = mesecon.tablecopy(nodes) + -- update mesecons for removed nodes ( has to be done after all nodes have been removed ) for _, n in ipairs(nodes) do mesecon.on_dignode(n.pos, n.node) @@ -229,6 +231,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 @@ -237,7 +245,6 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti end local moved_nodes = {} - local oldstack = mesecon.tablecopy(nodes) for i in ipairs(nodes) do moved_nodes[i] = {} moved_nodes[i].oldpos = nodes[i].pos diff --git a/mesecons_receiver/init.lua b/mesecons_receiver/init.lua index d95b333..301dbc4 100644 --- a/mesecons_receiver/init.lua +++ b/mesecons_receiver/init.lua @@ -209,8 +209,10 @@ 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) + local rcv_node = {name = rcvtype, param2 = param2} + minetest.set_node(pos, rcv_node) + mesecon.on_dignode(pos, nn) + mesecon.on_placenode(pos, rcv_node) end end @@ -220,6 +222,7 @@ function mesecon.receiver_remove(rcpt_pos, dugnode) if string.find(nn.name, "mesecons_receiver:receiver_") ~= nil then local node = {name = "mesecons:wire_00000000_off"} minetest.set_node(pos, node) + mesecon.on_dignode(pos, nn) mesecon.on_placenode(pos, node) end end @@ -257,7 +260,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, _, _, new_param2) + local new_node = {name = node.name, param1 = node.param1, param2 = new_param2} + minetest.swap_node(pos, new_node) + mesecon.receiver_remove(pos, node) + mesecon.on_dignode(pos, node) + mesecon.on_placenode(pos, new_node) + mesecon.receiver_place(pos) + minetest.check_for_falling(pos) + return true end