Skip to content

Commit b0f81a8

Browse files
committedJan 3, 2014
Add mesecon:register_on_mvps_move, fix mesecon:mvps_pull_all
1 parent d9cc1d5 commit b0f81a8

File tree

1 file changed

+38
-10
lines changed

1 file changed

+38
-10
lines changed
 

‎mesecons_mvps/init.lua

+38-10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
mesecon.mvps_stoppers = {}
44
mesecon.mvps_unmov = {}
5+
mesecon.on_mvps_move = {}
56

67
function mesecon:is_mvps_stopper(node, pushdir, stack, stackid)
78
local get_stopper = mesecon.mvps_stoppers[node.name]
@@ -27,6 +28,17 @@ function mesecon:is_mvps_unmov(objectname)
2728
return mesecon.mvps_unmov[objectname]
2829
end
2930

31+
-- Functions to be called on mvps movement
32+
function mesecon:register_on_mvps_move(callback)
33+
mesecon.on_mvps_move[#mesecon.on_mvps_move+1] = callback
34+
end
35+
36+
local function on_mvps_move(moved_nodes)
37+
for _, callback in ipairs(mesecon.on_mvps_move) do
38+
callback(moved_nodes)
39+
end
40+
end
41+
3042
function mesecon:mvps_process_stack(stack)
3143
-- update mesecons for placed nodes ( has to be done after all nodes have been added )
3244
for _, n in ipairs(stack) do
@@ -89,20 +101,30 @@ function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: directio
89101
minetest.add_node(np, n.node)
90102
minetest.get_meta(np):from_table(n.meta)
91103
end
92-
104+
105+
local moved_nodes = {}
93106
local oldstack = mesecon:tablecopy(nodes)
94107
for i in ipairs(nodes) do
108+
moved_nodes[i] = {}
109+
moved_nodes[i].oldpos = nodes[i].pos
95110
nodes[i].pos = mesecon:addPosRule(nodes[i].pos, dir)
111+
moved_nodes[i].pos = nodes[i].pos
112+
moved_nodes[i].node = nodes[i].node
113+
moved_nodes[i].meta = nodes[i].meta
96114
end
97115

98-
for _, n in ipairs(nodes) do
99-
mesecon.on_placenode(n.pos, n.node)
100-
mesecon:update_autoconnect(n.pos)
101-
end
116+
on_mvps_move(moved_nodes)
102117

103118
return true, nodes, oldstack
104119
end
105120

121+
mesecon:register_on_mvps_move(function(moved_nodes)
122+
for _, n in ipairs(moved_nodes) do
123+
mesecon.on_placenode(n.pos, n.node)
124+
mesecon:update_autoconnect(n.pos)
125+
end
126+
end)
127+
106128
function mesecon:mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: direction of pull (matches push direction for sticky pistons)
107129
np = mesecon:addPosRule(pos, dir)
108130
nn = minetest.get_node(np)
@@ -119,8 +141,7 @@ function mesecon:mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: dire
119141
nodeupdate(pos)
120142
mesecon.on_dignode(np, nn)
121143
mesecon:update_autoconnect(np)
122-
mesecon:update_autoconnect(pos)
123-
mesecon.on_placenode(pos, nn)
144+
on_mvps_move({{pos = pos, oldpos = np, node = nn, meta = meta}})
124145
end
125146
return {{pos = np, node = {param2 = 0, name = "air"}}, {pos = pos, node = nn}}
126147
end
@@ -147,10 +168,14 @@ function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: d
147168
return
148169
end
149170

171+
local moved_nodes = {}
150172
local oldpos = {x=lpos2.x + direction.x, y=lpos2.y + direction.y, z=lpos2.z + direction.z}
151173
repeat
152174
lnode2 = minetest.get_node(lpos2)
153-
minetest.add_node(oldpos, {name=lnode2.name})
175+
local meta = minetest.get_meta(lnode2):to_table()
176+
minetest.add_node(oldpos, lnode2)
177+
minetest.get_meta(oldpos):from_table(meta)
178+
moved_nodes[#moved_nodes+1] = {pos = oldpos, oldpos = lnode2, node = lnode2, meta = meta}
154179
nodeupdate(oldpos)
155180
oldpos = {x=lpos2.x, y=lpos2.y, z=lpos2.z}
156181
lpos2.x = lpos2.x-direction.x
@@ -159,9 +184,12 @@ function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: d
159184
lnode = minetest.get_node(lpos2)
160185
until lnode.name == "air"
161186
or lnode.name == "ignore"
162-
or (minetest.registered_nodes[lnode2.name]
163-
and minetest.registered_nodes[lnode2.name].liquidtype ~= "none")
187+
or (minetest.registered_nodes[lnode.name]
188+
and minetest.registered_nodes[lnode.name].liquidtype ~= "none")
164189
minetest.remove_node(oldpos)
190+
mesecon.on_dignode(oldpos, lnode2)
191+
mesecon:update_autoconnect(oldpos)
192+
on_mvps_move(moved_nodes)
165193
end
166194

167195
function mesecon:mvps_move_objects(pos, dir, nodestack)

0 commit comments

Comments
 (0)
Please sign in to comment.