From d33eb89dcb1888ee1c194161e5526db5399e1e53 Mon Sep 17 00:00:00 2001 From: Novatux Date: Fri, 3 Jan 2014 13:29:38 +0100 Subject: [PATCH] Support for the mesecons mvps callback --- autoplace_tubes.lua | 9 +++ depends.txt | 2 +- item_transport.lua | 23 +++++++ teleport_tube.lua | 151 +++++++++++++++++++++++++------------------- 4 files changed, 120 insertions(+), 65 deletions(-) diff --git a/autoplace_tubes.lua b/autoplace_tubes.lua index 874b3e6..441e62a 100644 --- a/autoplace_tubes.lua +++ b/autoplace_tubes.lua @@ -157,3 +157,12 @@ minetest.register_on_dignode(function(pos, oldnode, digger) end end) +if minetest.get_modpath("mesecons_mvps") ~= nil then + mesecon:register_on_mvps_move(function(moved_nodes) + for _, n in ipairs(moved_nodes) do + pipeworks.scan_for_tube_objects(n.pos) + pipeworks.scan_for_tube_objects(n.oldpos) + end + end) +end + diff --git a/depends.txt b/depends.txt index 44e4b05..02a542c 100644 --- a/depends.txt +++ b/depends.txt @@ -1,3 +1,3 @@ default mesecons? - +mesecons_mvps? diff --git a/item_transport.lua b/item_transport.lua index a3774ae..af5a817 100644 --- a/item_transport.lua +++ b/item_transport.lua @@ -467,3 +467,26 @@ minetest.register_entity("pipeworks:tubed_item", { end }) +if minetest.get_modpath("mesecons_mvps") ~= nil then + mesecon:register_mvps_unmov("pipeworks:tubed_item") + mesecon:register_on_mvps_move(function(moved_nodes) + local objects_to_move = {} + for _, n in ipairs(moved_nodes) do + local objects = minetest.get_objects_inside_radius(n.oldpos, 1) + for _, obj in ipairs(objects) do + local entity = obj:get_luaentity() + if entity and entity.name == "pipeworks:tubed_item" then + objects_to_move[#objects_to_move+1] = obj + end + end + end + if #objects_to_move > 0 then + local dir = vector.subtract(moved_nodes[1].pos, moved_nodes[1].oldpos) + for _, obj in ipairs(objects_to_move) do + local entity = obj:get_luaentity() + obj:setpos(vector.add(obj:getpos(), dir)) + entity.start_pos = vector.add(entity.start_pos, dir) + end + end + end) +end diff --git a/teleport_tube.lua b/teleport_tube.lua index 845c1d9..f57f55a 100644 --- a/teleport_tube.lua +++ b/teleport_tube.lua @@ -16,6 +16,18 @@ local function write_file(tbl) f:close() end +local function update_pos_in_file(pos) + local tbl=read_file() + for _,val in ipairs(tbl) do + if val.x==pos.x and val.y==pos.y and val.z==pos.z then + local meta = minetest.get_meta(val) + val.channel = meta:get_string("channel") + val.cr = meta:get_int("can_receive") + end + end + write_file(tbl) +end + local function add_tube_in_file(pos,channel, cr) local tbl=read_file() for _,val in ipairs(tbl) do @@ -45,6 +57,7 @@ local function get_tubes_in_file(pos,channel) for _,val in ipairs(tbl) do local node = minetest.get_node(val) local meta = minetest.get_meta(val) + -- That shouldn't be needed anymore since the mvps callback, but we leave it nevertheless if node.name~="ignore" and (val.channel~=meta:get_string("channel") or val.cr~=meta:get_int("can_receive")) then val.channel=meta:get_string("channel") val.cr=meta:get_int("can_receive") @@ -68,72 +81,82 @@ local teleport_short_texture="pipeworks_teleport_tube_short.png" local teleport_inv_texture="pipeworks_teleport_tube_inv.png" pipeworks.register_tube("pipeworks:teleport_tube","Teleporter pneumatic tube segment",teleport_plain_textures, - teleport_noctr_textures,teleport_end_textures,teleport_short_texture,teleport_inv_texture, { - tube = { - can_go = function(pos,node,velocity,stack) - velocity.x = 0 - velocity.y = 0 - velocity.z = 0 - local meta = minetest.get_meta(pos) - local channel = meta:get_string("channel") - local target = get_tubes_in_file(pos,channel) - if target[1] == nil then return {} end - local d = math.random(1,#target) - pos.x = target[d].x - pos.y = target[d].y - pos.z = target[d].z - return pipeworks.meseadjlist - end - }, - on_construct = function(pos) + teleport_noctr_textures,teleport_end_textures,teleport_short_texture,teleport_inv_texture, { + tube = { + can_go = function(pos,node,velocity,stack) + velocity.x = 0 + velocity.y = 0 + velocity.z = 0 local meta = minetest.get_meta(pos) - meta:set_string("channel","") - meta:set_int("can_receive",1) - meta:set_string("formspec","size[9,1;]".. + local channel = meta:get_string("channel") + local target = get_tubes_in_file(pos,channel) + if target[1] == nil then return {} end + local d = math.random(1,#target) + pos.x = target[d].x + pos.y = target[d].y + pos.z = target[d].z + return pipeworks.meseadjlist + end + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("channel","") + meta:set_int("can_receive",1) + meta:set_string("formspec","size[9,1;]".. + "field[0,0.5;7,1;channel;Channel:;${channel}]".. + "button[8,0;1,1;bt;On]") + add_tube_in_file(pos,"") + end, + on_receive_fields = function(pos,formname,fields,sender) + local meta = minetest.get_meta(pos) + + --check for private channels + if fields.channel ~= nil then + local name, mode = fields.channel:match("^([^:;]+)([:;])") + if name and mode and name ~= sender:get_player_name() then + + --channels starting with '[name]:' can only be used by the named player + if mode == ":" then + minetest.chat_send_player(sender:get_player_name(), "Sorry, channel '"..fields.channel.."' is reserved for exclusive use by "..name) + return + + --channels starting with '[name];' can be used by other players, but cannot be received from + elseif mode == ";" and (meta:get_int("can_receive") ~= 0) == (fields["bt"] == nil) then + minetest.chat_send_player(sender:get_player_name(), "Sorry, receiving from channel '"..fields.channel.."' is reserved for "..name) + return + end + end + end + + if fields.channel==nil then fields.channel=meta:get_string("channel") end + meta:set_string("channel",fields.channel) + remove_tube_in_file(pos) + local cr = meta:get_int("can_receive") + if fields["bt"] then + cr=1-cr + meta:set_int("can_receive",cr) + if cr==1 then + meta:set_string("formspec","size[9,1;]".. "field[0,0.5;7,1;channel;Channel:;${channel}]".. "button[8,0;1,1;bt;On]") - add_tube_in_file(pos,"") - end, - on_receive_fields = function(pos,formname,fields,sender) - local meta = minetest.get_meta(pos) - - --check for private channels - if fields.channel ~= nil then - local name, mode = fields.channel:match("^([^:;]+)([:;])") - if name and mode and name ~= sender:get_player_name() then - - --channels starting with '[name]:' can only be used by the named player - if mode == ":" then - minetest.chat_send_player(sender:get_player_name(), "Sorry, channel '"..fields.channel.."' is reserved for exclusive use by "..name) - return - - --channels starting with '[name];' can be used by other players, but cannot be received from - elseif mode == ";" and (meta:get_int("can_receive") ~= 0) == (fields["bt"] == nil) then - minetest.chat_send_player(sender:get_player_name(), "Sorry, receiving from channel '"..fields.channel.."' is reserved for "..name) - return - end - end + else + meta:set_string("formspec","size[9,1;]".. + "field[0,0.5;7,1;channel;Channel:;${channel}]".. + "button[8,0;1,1;bt;Off]") end - - if fields.channel==nil then fields.channel=meta:get_string("channel") end - meta:set_string("channel",fields.channel) - remove_tube_in_file(pos) - local cr = meta:get_int("can_receive") - if fields["bt"] then - cr=1-cr - meta:set_int("can_receive",cr) - if cr==1 then - meta:set_string("formspec","size[9,1;]".. - "field[0,0.5;7,1;channel;Channel:;${channel}]".. - "button[8,0;1,1;bt;On]") - else - meta:set_string("formspec","size[9,1;]".. - "field[0,0.5;7,1;channel;Channel:;${channel}]".. - "button[8,0;1,1;bt;Off]") - end + end + add_tube_in_file(pos,fields.channel, cr) + end, + on_destruct = function(pos) + remove_tube_in_file(pos) + end}) + +if minetest.get_modpath("mesecons_mvps") ~= nil then + mesecon:register_on_mvps_move(function(moved_nodes) + for _, n in ipairs(moved_nodes) do + if string.find(n.node.name, "pipeworks:teleport_tube") ~= nil then + update_pos_in_file(n.pos) end - add_tube_in_file(pos,fields.channel, cr) - end, - on_destruct = function(pos) - remove_tube_in_file(pos) - end}) + end + end) +end