From ce1505d008b273eeff4241453eee114f40ceb6cd Mon Sep 17 00:00:00 2001 From: Zefram Date: Mon, 14 Jul 2014 19:34:15 +0100 Subject: Fix detector tube item counting A detector tube would sometimes miss a decrement, due to the pos structure passed to can_go being modified by the tubed-item entity while it's also sitting in the timer queue as an argument to item_exit. As the can_go API actually depends on being able to mutate the pos structure (see the teleporter tube), we can't just start passing in a never-mutated copy of pos. So for now just fix in the detector tube's can_go, by copying the structure there. Incidentally, make the decrement mechanism consistent between the two forms of increment. --- tubes.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'tubes.lua') diff --git a/tubes.lua b/tubes.lua index f8b3c5f..5e8a009 100644 --- a/tubes.lua +++ b/tubes.lua @@ -357,7 +357,6 @@ if pipeworks.enable_detector_tube then local detector_plain_textures = {"pipeworks_detector_tube_plain.png", "pipeworks_detector_tube_plain.png", "pipeworks_detector_tube_plain.png", "pipeworks_detector_tube_plain.png", "pipeworks_detector_tube_plain.png", "pipeworks_detector_tube_plain.png"} local detector_inv_texture = "pipeworks_detector_tube_inv.png" - local detector_tube_step = 2 * tonumber(minetest.setting_get("dedicated_server_step")) pipeworks.register_tube("pipeworks:detector_tube_on", "Detecting Pneumatic Tube Segment on (you hacker you)", detector_plain_textures, noctr_textures, end_textures, short_texture, detector_inv_texture, {tube = {can_go = function(pos, node, velocity, stack) @@ -365,7 +364,12 @@ if pipeworks.enable_detector_tube then local name = minetest.get_node(pos).name local nitems = meta:get_int("nitems")+1 meta:set_int("nitems", nitems) - minetest.after(detector_tube_step, minetest.registered_nodes[name].item_exit, pos) + local saved_pos = { x = pos.x, y = pos.y, z = pos.z } + minetest.after(0, function () + minetest.after(0, function () + minetest.after(0, minetest.registered_nodes[name].item_exit, saved_pos) + end) + end) return pipeworks.notvel(pipeworks.meseadjlist,velocity) end}, groups = {mesecon = 2, not_in_creative_inventory = 1}, @@ -389,9 +393,10 @@ if pipeworks.enable_detector_tube then local meta = minetest.get_meta(pos) meta:set_int("nitems", 1) local name = minetest.get_node(pos).name + local saved_pos = { x = pos.x, y = pos.y, z = pos.z } minetest.after(0, function () minetest.after(0, function () - minetest.after(0, minetest.registered_nodes[name].item_exit, pos) + minetest.after(0, minetest.registered_nodes[name].item_exit, saved_pos) end) end) end}) -- cgit v1.2.3