2
2
3
3
mesecon .mvps_stoppers = {}
4
4
mesecon .mvps_unmov = {}
5
+ mesecon .on_mvps_move = {}
5
6
6
7
function mesecon :is_mvps_stopper (node , pushdir , stack , stackid )
7
8
local get_stopper = mesecon .mvps_stoppers [node .name ]
@@ -27,6 +28,17 @@ function mesecon:is_mvps_unmov(objectname)
27
28
return mesecon .mvps_unmov [objectname ]
28
29
end
29
30
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
+
30
42
function mesecon :mvps_process_stack (stack )
31
43
-- update mesecons for placed nodes ( has to be done after all nodes have been added )
32
44
for _ , n in ipairs (stack ) do
@@ -89,20 +101,30 @@ function mesecon:mvps_push(pos, dir, maximum) -- pos: pos of mvps; dir: directio
89
101
minetest .add_node (np , n .node )
90
102
minetest .get_meta (np ):from_table (n .meta )
91
103
end
92
-
104
+
105
+ local moved_nodes = {}
93
106
local oldstack = mesecon :tablecopy (nodes )
94
107
for i in ipairs (nodes ) do
108
+ moved_nodes [i ] = {}
109
+ moved_nodes [i ].oldpos = nodes [i ].pos
95
110
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
96
114
end
97
115
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 )
102
117
103
118
return true , nodes , oldstack
104
119
end
105
120
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
+
106
128
function mesecon :mvps_pull_single (pos , dir ) -- pos: pos of mvps; direction: direction of pull (matches push direction for sticky pistons)
107
129
np = mesecon :addPosRule (pos , dir )
108
130
nn = minetest .get_node (np )
@@ -119,8 +141,7 @@ function mesecon:mvps_pull_single(pos, dir) -- pos: pos of mvps; direction: dire
119
141
nodeupdate (pos )
120
142
mesecon .on_dignode (np , nn )
121
143
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 }})
124
145
end
125
146
return {{pos = np , node = {param2 = 0 , name = " air" }}, {pos = pos , node = nn }}
126
147
end
@@ -147,10 +168,14 @@ function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: d
147
168
return
148
169
end
149
170
171
+ local moved_nodes = {}
150
172
local oldpos = {x = lpos2 .x + direction .x , y = lpos2 .y + direction .y , z = lpos2 .z + direction .z }
151
173
repeat
152
174
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 }
154
179
nodeupdate (oldpos )
155
180
oldpos = {x = lpos2 .x , y = lpos2 .y , z = lpos2 .z }
156
181
lpos2 .x = lpos2 .x - direction .x
@@ -159,9 +184,12 @@ function mesecon:mvps_pull_all(pos, direction) -- pos: pos of mvps; direction: d
159
184
lnode = minetest .get_node (lpos2 )
160
185
until lnode .name == " air"
161
186
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" )
164
189
minetest .remove_node (oldpos )
190
+ mesecon .on_dignode (oldpos , lnode2 )
191
+ mesecon :update_autoconnect (oldpos )
192
+ on_mvps_move (moved_nodes )
165
193
end
166
194
167
195
function mesecon :mvps_move_objects (pos , dir , nodestack )
0 commit comments