Preserve active timers at frame move

Previously timers were not copied over to the new nodes when frames
move.  This lead to blinky plants from mesecons to stop working after a
platform has moved, and buttons getting stuck in their pressed state.

Now the timers state for active timers are copied from the old node
positions to the new node positions.
This commit is contained in:
Elias Åström 2018-08-16 12:43:02 +02:00 committed by SmallJoker
parent 2e7859c35e
commit d74c250a40
1 changed files with 15 additions and 1 deletions

View File

@ -114,7 +114,17 @@ local function move_nodes_vect(poslist,vect,must_not_move,owner)
for _, pos in ipairs(poslist) do
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos):to_table()
nodelist[#(nodelist)+1] = {oldpos = pos, pos = vector.add(pos, vect), node = node, meta = meta}
local timer = minetest.get_node_timer(pos)
nodelist[#nodelist+1] = {
oldpos = pos,
pos = vector.add(pos, vect),
node = node,
meta = meta,
timer = {
timeout = timer:get_timeout(),
elapsed = timer:get_elapsed()
}
}
end
local objects = {}
for _, pos in ipairs(poslist) do
@ -133,6 +143,10 @@ local function move_nodes_vect(poslist,vect,must_not_move,owner)
minetest.set_node(npos, n.node)
local meta = minetest.get_meta(npos)
meta:from_table(n.meta)
local timer = minetest.get_node_timer(npos)
if n.timer.timeout ~= 0 or n.timer.elapsed ~= 0 then
timer:set(n.timer.timeout, n.timer.elapsed)
end
for __,pos in ipairs(poslist) do
if npos.x == pos.x and npos.y == pos.y and npos.z == pos.z then
table.remove(poslist, __)