@@ -90,7 +90,7 @@ function worldedit.stack2(pos1, pos2, direction, amount, finished)
90
90
translated .x = translated .x + direction .x
91
91
translated .y = translated .y + direction .y
92
92
translated .z = translated .z + direction .z
93
- worldedit .copy2 (pos1 , pos2 , translated , volume )
93
+ worldedit .copy2 (pos1 , pos2 , translated )
94
94
minetest .after (0 , next_one )
95
95
else
96
96
if finished then
@@ -164,6 +164,38 @@ function worldedit.copy(pos1, pos2, axis, amount)
164
164
return worldedit .volume (pos1 , pos2 )
165
165
end
166
166
167
+ --- Copies a region by offset vector `off`.
168
+ -- @param pos1
169
+ -- @param pos2
170
+ -- @param off
171
+ -- @return The number of nodes copied.
172
+ function worldedit .copy2 (pos1 , pos2 , off )
173
+ local pos1 , pos2 = worldedit .sort_pos (pos1 , pos2 )
174
+
175
+ worldedit .keep_loaded (pos1 , pos2 )
176
+
177
+ local get_node , get_meta , set_node = minetest .get_node ,
178
+ minetest .get_meta , minetest .set_node
179
+ local pos = {}
180
+ pos .x = pos2 .x
181
+ while pos .x >= pos1 .x do
182
+ pos .y = pos2 .y
183
+ while pos .y >= pos1 .y do
184
+ pos .z = pos2 .z
185
+ while pos .z >= pos1 .z do
186
+ local node = get_node (pos ) -- Obtain current node
187
+ local meta = get_meta (pos ):to_table () -- Get meta of current node
188
+ local newpos = vector .add (pos , off ) -- Calculate new position
189
+ set_node (newpos , node ) -- Copy node to new position
190
+ get_meta (newpos ):from_table (meta ) -- Set metadata of new node
191
+ pos .z = pos .z - 1
192
+ end
193
+ pos .y = pos .y - 1
194
+ end
195
+ pos .x = pos .x - 1
196
+ end
197
+ return worldedit .volume (pos1 , pos2 )
198
+ end
167
199
168
200
--- Moves a region along `axis` by `amount` nodes.
169
201
-- @return The number of nodes moved.
0 commit comments