Support for the mesecons mvps callback
authorNovatux <nathanael.courant@laposte.net>
Fri, 3 Jan 2014 12:29:38 +0000 (13:29 +0100)
committerNovatux <nathanael.courant@laposte.net>
Fri, 3 Jan 2014 20:36:10 +0000 (21:36 +0100)
autoplace_tubes.lua
depends.txt
item_transport.lua
teleport_tube.lua

index 874b3e676944ff395fac82ddb0f9fbc39a794243..441e62a0d990d5b1b34db2e5c988f25c3ff39db9 100644 (file)
@@ -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
+
index 44e4b05de454d6173b7154edb2a57495b4d1a231..02a542cb6a127edda2e4629f428e738a19107c26 100644 (file)
@@ -1,3 +1,3 @@
 default
 mesecons?
-
+mesecons_mvps?
index a3774ae1fc4c690b6bf1ed1bcff31b30604e4ad6..af5a8176bcac6221cace3e5cce1d4f631aabd15a 100644 (file)
@@ -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
index 845c1d92b6123683696cf08d05563b995e22d2c7..f57f55a340ddd88cef102f2fdfc733cf790c4a8c 100644 (file)
@@ -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