Fix problems with incorrectly destructed teleport tubes.

This commit is contained in:
Novatux 2014-06-29 12:36:22 +02:00
parent 5a5bb3bf12
commit d532e646f6

View File

@ -50,15 +50,25 @@ local function remove_tube_in_file(pos)
write_file(newtbl) write_file(newtbl)
end end
local function read_node_with_vm(pos)
local vm = VoxelManip()
local MinEdge, MaxEdge = vm:read_from_map(pos, pos)
local data = vm:get_data()
local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge})
return minetest.get_name_from_content_id(data[area:index(pos.x, pos.y, pos.z)])
end
local function get_tubes_in_file(pos,channel) local function get_tubes_in_file(pos,channel)
local tbl = read_file() local tbl = read_file()
local newtbl = {} local newtbl = {}
local changed = false local changed = false
for _, val in ipairs(tbl) do for _, val in ipairs(tbl) do
local node = minetest.get_node(val)
local meta = minetest.get_meta(val) local meta = minetest.get_meta(val)
-- That shouldn't be needed anymore since the mvps callback, but we leave it nevertheless local name = read_node_with_vm(val)
if node.name~="ignore" and (val.channel~=meta:get_string("channel") or val.cr~=meta:get_int("can_receive")) then local is_loaded = (minetest.get_node_or_nil(val) ~= nil)
local is_teleport_tube = minetest.registered_nodes[name] and minetest.registered_nodes[name].is_teleport_tube
if is_teleport_tube then
if is_loaded and (val.channel ~= meta:get_string("channel") or val.cr ~= meta:get_int("can_receive")) then
val.channel = meta:get_string("channel") val.channel = meta:get_string("channel")
val.cr = meta:get_int("can_receive") val.cr = meta:get_int("can_receive")
changed = true changed = true
@ -66,8 +76,20 @@ local function get_tubes_in_file(pos,channel)
if val.cr == 1 and val.channel == channel and (val.x ~= pos.x or val.y ~= pos.y or val.z ~= pos.z) then if val.cr == 1 and val.channel == channel and (val.x ~= pos.x or val.y ~= pos.y or val.z ~= pos.z) then
table.insert(newtbl, val) table.insert(newtbl, val)
end end
else
val.to_remove = true
changed = true
end
end
if changed then
local updated = {}
for _, val in ipairs(tbl) do
if not val.to_remove then
table.insert(updated, val)
end
end
write_file(updated)
end end
if changed then write_file(tbl) end
return newtbl return newtbl
end end
@ -82,6 +104,7 @@ local teleport_inv_texture="pipeworks_teleport_tube_inv.png"
pipeworks.register_tube("pipeworks:teleport_tube","Teleporter pneumatic tube segment",teleport_plain_textures, 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, { teleport_noctr_textures,teleport_end_textures,teleport_short_texture,teleport_inv_texture, {
is_teleport_tube = true,
tube = { tube = {
can_go = function(pos,node,velocity,stack) can_go = function(pos,node,velocity,stack)
velocity.x = 0 velocity.x = 0