mirror of
https://github.com/Uberi/Minetest-WorldEdit.git
synced 2025-01-12 19:10:29 +01:00
//pyramid works along any axis and backwards. Working //clearobjects and //cylinder command, begin implementing super marker. Remove EnvRef usages and the block queue (the block queue does not work with VoxelManips). More block emergers.
This commit is contained in:
parent
49b683f27f
commit
3c51ec8c4a
@ -301,7 +301,7 @@ Executes <code> as a Lua chunk in the global namespace.
|
|||||||
Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region.
|
Executes <code> as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region.
|
||||||
|
|
||||||
//luatransform minetest.add_node(pos, {name="default:stone"})
|
//luatransform minetest.add_node(pos, {name="default:stone"})
|
||||||
//luatransform if minetest.get_node(pos).name == "air" then minetest.env:add_node(pos, {name="default:water_source"})
|
//luatransform if minetest.get_node(pos).name == "air" then minetest.add_node(pos, {name="default:water_source"})
|
||||||
|
|
||||||
### //mtschemcreate <file>
|
### //mtschemcreate <file>
|
||||||
|
|
||||||
|
@ -18,4 +18,3 @@ loadmodule(path .. "/visualization.lua")
|
|||||||
loadmodule(path .. "/serialization.lua")
|
loadmodule(path .. "/serialization.lua")
|
||||||
loadmodule(path .. "/code.lua")
|
loadmodule(path .. "/code.lua")
|
||||||
loadmodule(path .. "/compatibility.lua")
|
loadmodule(path .. "/compatibility.lua")
|
||||||
loadmodule(path .. "/queue.lua")
|
|
||||||
|
@ -113,11 +113,11 @@ worldedit.replaceinverse = function(pos1, pos2, searchnode, replacenode)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--copies the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") by `amount` nodes, returning the number of nodes copied
|
--copies the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") by `amount` nodes, returning the number of nodes copied
|
||||||
worldedit.copy = function(pos1, pos2, axis, amount, env)
|
worldedit.copy = function(pos1, pos2, axis, amount)
|
||||||
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
||||||
if env == nil then env = minetest.env end
|
|
||||||
|
|
||||||
--wip: copy slice by slice using schematic method in the copy axis and transfer metadata in separate loop (and if the amount is greater than the length in the axis, copy whole thing at a time), use voxelmanip to keep area loaded
|
--wip: copy slice by slice using schematic method in the copy axis and transfer metadata in separate loop (and if the amount is greater than the length in the axis, copy whole thing at a time), use voxelmanip to keep area loaded
|
||||||
|
local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node
|
||||||
if amount < 0 then
|
if amount < 0 then
|
||||||
local pos = {x=pos1.x, y=0, z=0}
|
local pos = {x=pos1.x, y=0, z=0}
|
||||||
while pos.x <= pos2.x do
|
while pos.x <= pos2.x do
|
||||||
@ -125,12 +125,12 @@ worldedit.copy = function(pos1, pos2, axis, amount, env)
|
|||||||
while pos.y <= pos2.y do
|
while pos.y <= pos2.y do
|
||||||
pos.z = pos1.z
|
pos.z = pos1.z
|
||||||
while pos.z <= pos2.z do
|
while pos.z <= pos2.z do
|
||||||
local node = env:get_node(pos) --obtain current node
|
local node = get_node(pos) --obtain current node
|
||||||
local meta = env:get_meta(pos):to_table() --get meta of current node
|
local meta = get_meta(pos):to_table() --get meta of current node
|
||||||
local value = pos[axis] --store current position
|
local value = pos[axis] --store current position
|
||||||
pos[axis] = value + amount --move along axis
|
pos[axis] = value + amount --move along axis
|
||||||
env:add_node(pos, node) --copy node to new position
|
add_node(pos, node) --copy node to new position
|
||||||
env:get_meta(pos):from_table(meta) --set metadata of new node
|
get_meta(pos):from_table(meta) --set metadata of new node
|
||||||
pos[axis] = value --restore old position
|
pos[axis] = value --restore old position
|
||||||
pos.z = pos.z + 1
|
pos.z = pos.z + 1
|
||||||
end
|
end
|
||||||
@ -145,12 +145,12 @@ worldedit.copy = function(pos1, pos2, axis, amount, env)
|
|||||||
while pos.y >= pos1.y do
|
while pos.y >= pos1.y do
|
||||||
pos.z = pos2.z
|
pos.z = pos2.z
|
||||||
while pos.z >= pos1.z do
|
while pos.z >= pos1.z do
|
||||||
local node = minetest.env:get_node(pos) --obtain current node
|
local node = get_node(pos) --obtain current node
|
||||||
local meta = env:get_meta(pos):to_table() --get meta of current node
|
local meta = get_meta(pos):to_table() --get meta of current node
|
||||||
local value = pos[axis] --store current position
|
local value = pos[axis] --store current position
|
||||||
pos[axis] = value + amount --move along axis
|
pos[axis] = value + amount --move along axis
|
||||||
minetest.env:add_node(pos, node) --copy node to new position
|
add_node(pos, node) --copy node to new position
|
||||||
env:get_meta(pos):from_table(meta) --set metadata of new node
|
get_meta(pos):from_table(meta) --set metadata of new node
|
||||||
pos[axis] = value --restore old position
|
pos[axis] = value --restore old position
|
||||||
pos.z = pos.z - 1
|
pos.z = pos.z - 1
|
||||||
end
|
end
|
||||||
@ -163,11 +163,11 @@ worldedit.copy = function(pos1, pos2, axis, amount, env)
|
|||||||
end
|
end
|
||||||
|
|
||||||
--moves the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") by `amount` nodes, returning the number of nodes moved
|
--moves the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") by `amount` nodes, returning the number of nodes moved
|
||||||
worldedit.move = function(pos1, pos2, axis, amount, env)
|
worldedit.move = function(pos1, pos2, axis, amount)
|
||||||
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
||||||
if env == nil then env = minetest.env end
|
|
||||||
|
|
||||||
--wip: move slice by slice using schematic method in the move axis and transfer metadata in separate loop (and if the amount is greater than the length in the axis, copy whole thing at a time and erase original after, using schematic method), use voxelmanip to keep area loaded
|
--wip: move slice by slice using schematic method in the move axis and transfer metadata in separate loop (and if the amount is greater than the length in the axis, copy whole thing at a time and erase original after, using schematic method), use voxelmanip to keep area loaded
|
||||||
|
local get_node, get_meta, add_node, remove_node = minetest.get_node, minetest.get_meta, minetest.add_node, minetest.remove_node
|
||||||
if amount < 0 then
|
if amount < 0 then
|
||||||
local pos = {x=pos1.x, y=0, z=0}
|
local pos = {x=pos1.x, y=0, z=0}
|
||||||
while pos.x <= pos2.x do
|
while pos.x <= pos2.x do
|
||||||
@ -175,13 +175,13 @@ worldedit.move = function(pos1, pos2, axis, amount, env)
|
|||||||
while pos.y <= pos2.y do
|
while pos.y <= pos2.y do
|
||||||
pos.z = pos1.z
|
pos.z = pos1.z
|
||||||
while pos.z <= pos2.z do
|
while pos.z <= pos2.z do
|
||||||
local node = env:get_node(pos) --obtain current node
|
local node = get_node(pos) --obtain current node
|
||||||
local meta = env:get_meta(pos):to_table() --get metadata of current node
|
local meta = get_meta(pos):to_table() --get metadata of current node
|
||||||
env:remove_node(pos)
|
remove_node(pos)
|
||||||
local value = pos[axis] --store current position
|
local value = pos[axis] --store current position
|
||||||
pos[axis] = value + amount --move along axis
|
pos[axis] = value + amount --move along axis
|
||||||
env:add_node(pos, node) --move node to new position
|
add_node(pos, node) --move node to new position
|
||||||
env:get_meta(pos):from_table(meta) --set metadata of new node
|
get_meta(pos):from_table(meta) --set metadata of new node
|
||||||
pos[axis] = value --restore old position
|
pos[axis] = value --restore old position
|
||||||
pos.z = pos.z + 1
|
pos.z = pos.z + 1
|
||||||
end
|
end
|
||||||
@ -196,13 +196,13 @@ worldedit.move = function(pos1, pos2, axis, amount, env)
|
|||||||
while pos.y >= pos1.y do
|
while pos.y >= pos1.y do
|
||||||
pos.z = pos2.z
|
pos.z = pos2.z
|
||||||
while pos.z >= pos1.z do
|
while pos.z >= pos1.z do
|
||||||
local node = env:get_node(pos) --obtain current node
|
local node = get_node(pos) --obtain current node
|
||||||
local meta = env:get_meta(pos):to_table() --get metadata of current node
|
local meta = get_meta(pos):to_table() --get metadata of current node
|
||||||
env:remove_node(pos)
|
remove_node(pos)
|
||||||
local value = pos[axis] --store current position
|
local value = pos[axis] --store current position
|
||||||
pos[axis] = value + amount --move along axis
|
pos[axis] = value + amount --move along axis
|
||||||
env:add_node(pos, node) --move node to new position
|
add_node(pos, node) --move node to new position
|
||||||
env:get_meta(pos):from_table(meta) --set metadata of new node
|
get_meta(pos):from_table(meta) --set metadata of new node
|
||||||
pos[axis] = value --restore old position
|
pos[axis] = value --restore old position
|
||||||
pos.z = pos.z - 1
|
pos.z = pos.z - 1
|
||||||
end
|
end
|
||||||
@ -249,7 +249,7 @@ worldedit.scale = function(pos1, pos2, factor)
|
|||||||
--make area stay loaded
|
--make area stay loaded
|
||||||
local manip = minetest.get_voxel_manip()
|
local manip = minetest.get_voxel_manip()
|
||||||
local new_pos2 = {x=pos1.x + (pos2.x - pos1.x) * factor + size, y=pos1.y + (pos2.y - pos1.y) * factor + size, z=pos1.z + (pos2.z - pos1.z) * factor + size}
|
local new_pos2 = {x=pos1.x + (pos2.x - pos1.x) * factor + size, y=pos1.y + (pos2.y - pos1.y) * factor + size, z=pos1.z + (pos2.z - pos1.z) * factor + size}
|
||||||
local emerged_pos1, emerged_pos2 = manip:read_from_map(pos1, new_pos2)
|
manip:read_from_map(pos1, new_pos2)
|
||||||
|
|
||||||
local pos = {x=pos2.x, y=0, z=0}
|
local pos = {x=pos2.x, y=0, z=0}
|
||||||
local bigpos = {x=0, y=0, z=0}
|
local bigpos = {x=0, y=0, z=0}
|
||||||
@ -496,22 +496,25 @@ end
|
|||||||
worldedit.clearobjects = function(pos1, pos2)
|
worldedit.clearobjects = function(pos1, pos2)
|
||||||
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
||||||
|
|
||||||
--set up voxel manipulator
|
--make area stay loaded
|
||||||
local manip = minetest.get_voxel_manip()
|
local manip = minetest.get_voxel_manip()
|
||||||
manip:read_from_map(pos1, pos2)
|
manip:read_from_map(pos1, pos2)
|
||||||
|
|
||||||
local pos1x, pos1y, pos1z = pos1.x, pos1.y, pos1.z
|
local pos1x, pos1y, pos1z = pos1.x, pos1.y, pos1.z
|
||||||
local pos2x, pos2y, pos2z = pos2.x, pos2.y, pos2.z
|
local pos2x, pos2y, pos2z = pos2.x + 1, pos2.y + 1, pos2.z + 1
|
||||||
local center = {x=(pos1x + pos2x + 1) / 2, y=(pos1y + pos2y + 1) / 2, z=(pos1z + pos2z + 1) / 2}
|
local center = {x=(pos1x + pos2x) / 2, y=(pos1y + pos2y) / 2, z=(pos1z + pos2z) / 2} --center of region
|
||||||
local radius = ((center.x - pos1x + 0.5) + (center.y - pos1y + 0.5) + (center.z - pos1z + 0.5)) ^ 0.5
|
local radius = ((center.x - pos1x + 0.5) + (center.y - pos1y + 0.5) + (center.z - pos1z + 0.5)) ^ 0.5 --bounding sphere radius
|
||||||
local count = 0
|
local count = 0
|
||||||
for _, obj in pairs(minetest.get_objects_inside_radius(center, radius)) do
|
for _, obj in pairs(minetest.get_objects_inside_radius(center, radius)) do --all objects in bounding sphere
|
||||||
local pos = obj:getpos()
|
local entity = obj:get_luaentity()
|
||||||
if pos.x >= pos1x and pos.x <= pos2x
|
if not (entity and entity.name:find("^worldedit:")) then --avoid WorldEdit entities
|
||||||
and pos.y >= pos1y and pos.y <= pos2y
|
local pos = obj:getpos()
|
||||||
and pos.z >= pos1z and pos.z <= pos2z then
|
if pos.x >= pos1x and pos.x <= pos2x
|
||||||
obj:remove()
|
and pos.y >= pos1y and pos.y <= pos2y
|
||||||
count = count + 1
|
and pos.z >= pos1z and pos.z <= pos2z then --inside region
|
||||||
|
obj:remove()
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return count
|
return count
|
||||||
|
@ -209,6 +209,20 @@ worldedit.hollow_cylinder = function(pos, axis, length, radius, nodename) --wip:
|
|||||||
currentpos[axis] = currentpos[axis] - length
|
currentpos[axis] = currentpos[axis] - length
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--make area stay loaded
|
||||||
|
local manip = minetest.get_voxel_manip()
|
||||||
|
local pos1 = {
|
||||||
|
[axis]=currentpos[axis],
|
||||||
|
[other1]=currentpos[other1] - radius,
|
||||||
|
[other2]=currentpos[other2] - radius
|
||||||
|
}
|
||||||
|
local pos2 = {
|
||||||
|
[axis]=currentpos[axis] + length - 1,
|
||||||
|
[other1]=currentpos[other1] + radius,
|
||||||
|
[other2]=currentpos[other2] + radius
|
||||||
|
}
|
||||||
|
manip:read_from_map(pos1, pos2)
|
||||||
|
|
||||||
--create schematic for single node column along the axis
|
--create schematic for single node column along the axis
|
||||||
local node = {name=nodename, param1=0, param2=0}
|
local node = {name=nodename, param1=0, param2=0}
|
||||||
local nodes = {}
|
local nodes = {}
|
||||||
@ -306,13 +320,13 @@ worldedit.cylinder = function(pos, axis, length, radius, nodename)
|
|||||||
local offset = {x=currentpos.x - emerged_pos1.x, y=currentpos.y - emerged_pos1.y, z=currentpos.z - emerged_pos1.z}
|
local offset = {x=currentpos.x - emerged_pos1.x, y=currentpos.y - emerged_pos1.y, z=currentpos.z - emerged_pos1.z}
|
||||||
local min_slice, max_slice = offset[axis], offset[axis] + length - 1
|
local min_slice, max_slice = offset[axis], offset[axis] + length - 1
|
||||||
local count = 0
|
local count = 0
|
||||||
for axis1 = -radius, radius do
|
for index2 = -radius, radius do
|
||||||
local newaxis1 = (axis1 + offset[other1]) * stride[other1] + 1 --offset contributed by other axis 1 plus 1 to make it 1-indexed
|
local newindex2 = (index2 + offset[other1]) * stride[other1] + 1 --offset contributed by other axis 1 plus 1 to make it 1-indexed
|
||||||
for axis2 = -radius, radius do
|
for index3 = -radius, radius do
|
||||||
local newaxis2 = newaxis1 + (axis2 + offset[other2]) * stride[other2]
|
local newindex3 = newindex2 + (index3 + offset[other2]) * stride[other2]
|
||||||
if axis1 * axis1 + axis2 * axis2 <= max_radius then
|
if index2 * index2 + index3 * index3 <= max_radius then
|
||||||
for slice = min_slice, max_slice do
|
for index1 = min_slice, max_slice do --add column along axis
|
||||||
local i = newaxis2 + slice * stride[axis] + 1
|
local i = newindex3 + index1 * stride[axis] + 1
|
||||||
nodes[i] = node_id
|
nodes[i] = node_id
|
||||||
end
|
end
|
||||||
count = count + length
|
count = count + length
|
||||||
@ -330,9 +344,34 @@ end
|
|||||||
|
|
||||||
--adds a pyramid centered at `pos` with height `height`, composed of `nodename`, returning the number of nodes added
|
--adds a pyramid centered at `pos` with height `height`, composed of `nodename`, returning the number of nodes added
|
||||||
worldedit.pyramid = function(pos, axis, height, nodename)
|
worldedit.pyramid = function(pos, axis, height, nodename)
|
||||||
local pos1 = {x=pos.x - height, y=pos.y, z=pos.z - height}
|
local other1, other2
|
||||||
|
if axis == "x" then
|
||||||
|
other1, other2 = "y", "z"
|
||||||
|
elseif axis == "y" then
|
||||||
|
other1, other2 = "x", "z"
|
||||||
|
else --axis == "z"
|
||||||
|
other1, other2 = "x", "y"
|
||||||
|
end
|
||||||
|
|
||||||
|
local pos1 = {x=pos.x - height, y=pos.y - height, z=pos.z - height}
|
||||||
local pos2 = {x=pos.x + height, y=pos.y + height, z=pos.z + height}
|
local pos2 = {x=pos.x + height, y=pos.y + height, z=pos.z + height}
|
||||||
|
|
||||||
|
--handle inverted pyramids
|
||||||
|
local startaxis, endaxis, step
|
||||||
|
local currentpos = {x=pos.x, y=pos.y, z=pos.z}
|
||||||
|
if height > 0 then
|
||||||
|
height = height - 1
|
||||||
|
startaxis, endaxis = 0, height
|
||||||
|
step = 1
|
||||||
|
pos1[axis] = pos[axis] --upper half of box
|
||||||
|
else
|
||||||
|
height = -height - 1
|
||||||
|
startaxis, endaxis = height, 0
|
||||||
|
step = -1
|
||||||
|
pos2[axis] = pos[axis] + 1 --lower half of box
|
||||||
|
currentpos[axis] = pos[axis] - height --bottom of box
|
||||||
|
end
|
||||||
|
|
||||||
--set up voxel manipulator
|
--set up voxel manipulator
|
||||||
local manip = minetest.get_voxel_manip()
|
local manip = minetest.get_voxel_manip()
|
||||||
local emerged_pos1, emerged_pos2 = manip:read_from_map(pos1, pos2)
|
local emerged_pos1, emerged_pos2 = manip:read_from_map(pos1, pos2)
|
||||||
@ -345,31 +384,22 @@ worldedit.pyramid = function(pos, axis, height, nodename)
|
|||||||
nodes[i] = ignore
|
nodes[i] = ignore
|
||||||
end
|
end
|
||||||
|
|
||||||
--handle inverted pyramids
|
|
||||||
height = height - 1
|
|
||||||
local size = height
|
|
||||||
local step = -1
|
|
||||||
if height < 0 then
|
|
||||||
size = 0
|
|
||||||
step = 1
|
|
||||||
end
|
|
||||||
--wip: support arbitrary axes
|
|
||||||
--fill selected area with node
|
--fill selected area with node
|
||||||
local node_id = minetest.get_content_id(nodename)
|
local node_id = minetest.get_content_id(nodename)
|
||||||
local offsetx, offsety, offsetz = pos.x - emerged_pos1.x, pos.y - emerged_pos1.y, pos.z - emerged_pos1.z
|
local stride = {x=1, y=area.ystride, z=area.zstride}
|
||||||
local zstride, ystride = area.zstride, area.ystride
|
local offset = {x=currentpos.x - emerged_pos1.x, y=currentpos.y - emerged_pos1.y, z=currentpos.z - emerged_pos1.z}
|
||||||
local count = 0
|
local count = 0
|
||||||
for y = 0, height do --go through each level of the pyramid
|
for index1 = startaxis, endaxis, step do --go through each level of the pyramid
|
||||||
local newy = (y + offsety) * ystride + 1 --offset contributed by y plus 1 to make it 1-indexed
|
local newindex1 = (index1 + offset[axis]) * stride[axis] + 1 --offset contributed by axis plus 1 to make it 1-indexed
|
||||||
for z = -size, size do
|
for index2 = -height, height do
|
||||||
local newz = newy + (z + offsetz) * zstride
|
local newindex2 = newindex1 + (index2 + offset[other1]) * stride[other1]
|
||||||
for x = -size, size do
|
for index3 = -height, height do
|
||||||
local i = newz + (x + offsetx)
|
local i = newindex2 + (index3 + offset[other2]) * stride[other2]
|
||||||
nodes[i] = node_id
|
nodes[i] = node_id
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
size = size + step
|
count = count + (height * 2 + 1) ^ 2
|
||||||
count = count + ((height - y) * 2 + 1) ^ 2
|
height = height - 1
|
||||||
end
|
end
|
||||||
|
|
||||||
--update map nodes
|
--update map nodes
|
||||||
@ -383,11 +413,12 @@ end
|
|||||||
--adds a spiral centered at `pos` with width `width`, height `height`, space between walls `spacer`, composed of `nodename`, returning the number of nodes added
|
--adds a spiral centered at `pos` with width `width`, height `height`, space between walls `spacer`, composed of `nodename`, returning the number of nodes added
|
||||||
worldedit.spiral = function(pos, width, height, spacer, nodename, env) --wip: rewrite this whole thing, nobody can understand it anyways
|
worldedit.spiral = function(pos, width, height, spacer, nodename, env) --wip: rewrite this whole thing, nobody can understand it anyways
|
||||||
-- spiral matrix - http://rosettacode.org/wiki/Spiral_matrix#Lua
|
-- spiral matrix - http://rosettacode.org/wiki/Spiral_matrix#Lua
|
||||||
av, sn = math.abs, function(s) return s~=0 and s/av(s) or 0 end
|
local abs = math.abs
|
||||||
|
local sign = function(s) return s ~= 0 and s / av(s) or 0 end
|
||||||
local function sindex(z, x) -- returns the value at (x, z) in a spiral that starts at 1 and goes outwards
|
local function sindex(z, x) -- returns the value at (x, z) in a spiral that starts at 1 and goes outwards
|
||||||
if z == -x and z >= x then return (2*z+1)^2 end
|
if z == -x and z >= x then return (2*z+1)^2 end
|
||||||
local l = math.max(av(z), av(x))
|
local longest = math.max(abs(z), abs(x))
|
||||||
return (2*l-1)^2+4*l+2*l*sn(x+z)+sn(z^2-x^2)*(l-(av(z)==l and sn(z)*x or sn(x)*z)) -- OH GOD WHAT
|
return (2*longest-1)^2 + 4*longest + 2*longest*sign(x+z) + sign(z^2-x^2)*(longest-(abs(z)==longest and sign(z)*x or sign(x)*z)) -- OH GOD WHAT
|
||||||
end
|
end
|
||||||
local function spiralt(side)
|
local function spiralt(side)
|
||||||
local ret, id, start, stop = {}, 0, math.floor((-side+1)/2), math.floor((side-1)/2)
|
local ret, id, start, stop = {}, 0, math.floor((-side+1)/2), math.floor((side-1)/2)
|
||||||
|
@ -1,123 +0,0 @@
|
|||||||
worldedit = worldedit or {}
|
|
||||||
local minetest = minetest --local copy of global
|
|
||||||
|
|
||||||
worldedit.queue = {}
|
|
||||||
worldedit.lower = 1
|
|
||||||
worldedit.higher = 0
|
|
||||||
|
|
||||||
worldedit.ENABLE_QUEUE = true --enable the WorldEdit block queue
|
|
||||||
worldedit.MAXIMUM_TIME = 0.08 --maximum time each step alloted for WorldEdit operations
|
|
||||||
|
|
||||||
minetest.register_globalstep(function(dtime)
|
|
||||||
local elapsed = 0
|
|
||||||
local env = minetest.env
|
|
||||||
while worldedit.lower <= worldedit.higher and elapsed <= worldedit.MAXIMUM_TIME do
|
|
||||||
local entry = worldedit.queue[worldedit.lower]
|
|
||||||
if entry.t == "set_node" then
|
|
||||||
env:set_node(entry.pos, entry.node)
|
|
||||||
elapsed = elapsed + 0.0002
|
|
||||||
elseif entry.t == "remove_node" then
|
|
||||||
env:remove_node(entry.pos)
|
|
||||||
elapsed = elapsed + 0.0002
|
|
||||||
elseif entry.t == "place_node" then
|
|
||||||
env:place_node(entry.pos, entry.node)
|
|
||||||
elapsed = elapsed + 0.001
|
|
||||||
elseif entry.t == "dig_node" then
|
|
||||||
env:dig_node(entry.pos)
|
|
||||||
elapsed = elapsed + 0.001
|
|
||||||
elseif entry.t == "add_entity" then
|
|
||||||
env:add_entity(entry.pos, entry.name)
|
|
||||||
elapsed = elapsed + 0.005
|
|
||||||
elseif entry.t == "add_item" then
|
|
||||||
env:add_item(entry.pos, entry.item)
|
|
||||||
elapsed = elapsed + 0.005
|
|
||||||
elseif entry.t == "meta_from_table" then
|
|
||||||
env:get_meta(entry.pos):from_table(entry.table)
|
|
||||||
elapsed = elapsed + 0.0002
|
|
||||||
else
|
|
||||||
print("Unknown queue event type: " .. entry.t)
|
|
||||||
end
|
|
||||||
worldedit.queue[worldedit.lower] = nil
|
|
||||||
worldedit.lower = worldedit.lower + 1
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
||||||
worldedit.enqueue = function(value)
|
|
||||||
worldedit.higher = worldedit.higher + 1
|
|
||||||
worldedit.queue[worldedit.higher] = value
|
|
||||||
end
|
|
||||||
|
|
||||||
function table.copy(t, seen)
|
|
||||||
seen = seen or {}
|
|
||||||
if t == nil then return nil end
|
|
||||||
if seen[t] then return seen[t] end
|
|
||||||
|
|
||||||
local nt = {}
|
|
||||||
for k, v in pairs(t) do
|
|
||||||
if type(v) == 'table' then
|
|
||||||
nt[k] = table.copy(v, seen)
|
|
||||||
else
|
|
||||||
nt[k] = v
|
|
||||||
end
|
|
||||||
end
|
|
||||||
seen[t] = nt
|
|
||||||
return nt
|
|
||||||
end
|
|
||||||
|
|
||||||
local queue_setnode = function(self, pos_, node_)
|
|
||||||
worldedit.enqueue({pos=table.copy(pos_), node=table.copy(node_), t="set_node"})
|
|
||||||
end
|
|
||||||
|
|
||||||
local queue_removenode = function(self, pos_)
|
|
||||||
worldedit.enqueue({pos=table.copy(pos_), t="remove_node"})
|
|
||||||
end
|
|
||||||
|
|
||||||
local queue_placenode = function(self, pos_, node_)
|
|
||||||
worldedit.enqueue({pos=table.copy(pos_), node=table.copy(node_), t="place_node"})
|
|
||||||
end
|
|
||||||
|
|
||||||
local queue_dignode = function(self, pos_)
|
|
||||||
worldedit.enqueue({pos=table.copy(pos_), t="dig_node"})
|
|
||||||
end
|
|
||||||
|
|
||||||
local queue_addentity = function(self, pos_, name_)
|
|
||||||
worldedit.enqueue({pos=table.copy(pos_), name=name_.."", t="add_entity"})
|
|
||||||
end
|
|
||||||
|
|
||||||
local queue_additem = function(self, pos_, item_)
|
|
||||||
worldedit.enqueue({pos=table.copy(pos_), item=item_.."", t="add_item"})
|
|
||||||
end
|
|
||||||
|
|
||||||
local queue_setmeta = function(self, pos_, table_)
|
|
||||||
worldedit.enqueue({pos=table.copy(pos_), table=table.copy(table_), t="meta_from_table"})
|
|
||||||
end
|
|
||||||
|
|
||||||
local aliasmeta = {
|
|
||||||
-- the other functions are left out because they are not used in worldedit
|
|
||||||
to_table = function(self) return minetest.env:get_meta(self._pos):to_table() end,
|
|
||||||
set_string = function(self, name_, value_) minetest.env:get_meta(self._pos):set_string(name_, value_) end,
|
|
||||||
from_table = function(self, tbl) queue_setmeta(nil, self._pos, tbl) end,
|
|
||||||
}
|
|
||||||
|
|
||||||
local get_meta_alias = function(self, pos)
|
|
||||||
local am = table.copy(aliasmeta)
|
|
||||||
am._pos = pos
|
|
||||||
return am
|
|
||||||
end
|
|
||||||
|
|
||||||
worldedit.queue_aliasenv = {
|
|
||||||
-- ALL functions that are not just piped to the real minetest.env function must copy the arguments, not just reference them
|
|
||||||
set_node = queue_setnode,
|
|
||||||
add_node = queue_setnode,
|
|
||||||
remove_node = queue_removenode,
|
|
||||||
get_node = function(self, pos) return minetest.env:get_node(pos) end,
|
|
||||||
get_node_or_nil = function(self, pos) return minetest.env:get_node_or_nil(pos) end,
|
|
||||||
get_node_light = function(self, pos, timeofday) return minetest.env:get_node_light(pos, timeofday) end,
|
|
||||||
place_node = queue_placenode,
|
|
||||||
dig_node = queue_dignode,
|
|
||||||
punch_node = function(self, pos) return minetest.env:punch_node(pos) end,
|
|
||||||
get_meta = get_meta_alias,
|
|
||||||
get_node_timer = function(self, pos) return minetest.env:get_node_timer(pos) end,
|
|
||||||
add_entity = queue_addentity,
|
|
||||||
add_item = queue_additem,
|
|
||||||
}
|
|
@ -182,7 +182,12 @@ end
|
|||||||
|
|
||||||
--loads the nodes represented by string `value` at position `originpos`, returning the number of nodes deserialized
|
--loads the nodes represented by string `value` at position `originpos`, returning the number of nodes deserialized
|
||||||
--contains code based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile) by ChillCode, available under the MIT license (GPL compatible)
|
--contains code based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile) by ChillCode, available under the MIT license (GPL compatible)
|
||||||
worldedit.deserialize = function(originpos, value) --wip: use voxelmanip to make sure the blocks are loaded
|
worldedit.deserialize = function(originpos, value)
|
||||||
|
--make sure the area stays loaded --wip: not very performant
|
||||||
|
local pos1, pos2 = worldedit.allocate(originpos, value)
|
||||||
|
local manip = minetest.get_voxel_manip()
|
||||||
|
manip:read_from_map(pos1, pos2)
|
||||||
|
|
||||||
local originx, originy, originz = originpos.x, originpos.y, originpos.z
|
local originx, originy, originz = originpos.x, originpos.y, originpos.z
|
||||||
local count = 0
|
local count = 0
|
||||||
local add_node, get_meta = minetest.add_node, minetest.get_meta
|
local add_node, get_meta = minetest.add_node, minetest.get_meta
|
||||||
|
@ -38,7 +38,7 @@ end
|
|||||||
|
|
||||||
--determines the axis in which a player is facing, returning an axis ("x", "y", or "z") and the sign (1 or -1)
|
--determines the axis in which a player is facing, returning an axis ("x", "y", or "z") and the sign (1 or -1)
|
||||||
worldedit.player_axis = function(name)
|
worldedit.player_axis = function(name)
|
||||||
local dir = minetest.env:get_player_by_name(name):get_look_dir()
|
local dir = minetest.get_player_by_name(name):get_look_dir()
|
||||||
local x, y, z = math.abs(dir.x), math.abs(dir.y), math.abs(dir.z)
|
local x, y, z = math.abs(dir.x), math.abs(dir.y), math.abs(dir.z)
|
||||||
if x > y then
|
if x > y then
|
||||||
if x > z then
|
if x > z then
|
||||||
@ -125,7 +125,7 @@ minetest.register_chatcommand("/pos1", {
|
|||||||
description = "Set WorldEdit region position 1 to the player's location",
|
description = "Set WorldEdit region position 1 to the player's location",
|
||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local pos = minetest.env:get_player_by_name(name):getpos()
|
local pos = minetest.get_player_by_name(name):getpos()
|
||||||
pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5)
|
pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5)
|
||||||
worldedit.pos1[name] = pos
|
worldedit.pos1[name] = pos
|
||||||
worldedit.mark_pos1(name)
|
worldedit.mark_pos1(name)
|
||||||
@ -138,7 +138,7 @@ minetest.register_chatcommand("/pos2", {
|
|||||||
description = "Set WorldEdit region position 2 to the player's location",
|
description = "Set WorldEdit region position 2 to the player's location",
|
||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local pos = minetest.env:get_player_by_name(name):getpos()
|
local pos = minetest.get_player_by_name(name):getpos()
|
||||||
pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5)
|
pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5)
|
||||||
worldedit.pos2[name] = pos
|
worldedit.pos2[name] = pos
|
||||||
worldedit.mark_pos2(name)
|
worldedit.mark_pos2(name)
|
||||||
@ -294,11 +294,7 @@ minetest.register_chatcommand("/replace", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.replace(pos1, pos2, newsearchnode, newreplacenode)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.replace(pos1, pos2, newsearchnode, newreplacenode, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes replaced")
|
worldedit.player_notify(name, count .. " nodes replaced")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -330,11 +326,7 @@ minetest.register_chatcommand("/replaceinverse", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.replaceinverse(pos1, pos2, searchnode, replacenode)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.replaceinverse(pos1, pos2, searchnode, replacenode, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes replaced")
|
worldedit.player_notify(name, count .. " nodes replaced")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -361,11 +353,7 @@ minetest.register_chatcommand("/hollowsphere", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.hollow_sphere(pos, tonumber(radius), node)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.hollow_sphere(pos, tonumber(radius), node, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes added")
|
worldedit.player_notify(name, count .. " nodes added")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -392,11 +380,7 @@ minetest.register_chatcommand("/sphere", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.sphere(pos, tonumber(radius), node)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.sphere(pos, tonumber(radius), node, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes added")
|
worldedit.player_notify(name, count .. " nodes added")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -423,11 +407,7 @@ minetest.register_chatcommand("/hollowdome", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.hollow_dome(pos, tonumber(radius), node)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.hollow_dome(pos, tonumber(radius), node, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes added")
|
worldedit.player_notify(name, count .. " nodes added")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -454,11 +434,7 @@ minetest.register_chatcommand("/dome", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.dome(pos, tonumber(radius), node)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.dome(pos, tonumber(radius), node, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes added")
|
worldedit.player_notify(name, count .. " nodes added")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -490,11 +466,7 @@ minetest.register_chatcommand("/hollowcylinder", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.hollow_cylinder(pos, axis, length, radius, node)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.hollow_cylinder(pos, axis, length, radius, node, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes added")
|
worldedit.player_notify(name, count .. " nodes added")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -526,11 +498,7 @@ minetest.register_chatcommand("/cylinder", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.cylinder(pos, axis, length, radius, node)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.cylinder(pos, axis, length, radius, node, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes added")
|
worldedit.player_notify(name, count .. " nodes added")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -589,11 +557,7 @@ minetest.register_chatcommand("/spiral", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.spiral(pos, tonumber(width), tonumber(height), tonumber(space), node)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.spiral(pos, tonumber(width), tonumber(height), tonumber(space), node, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes added")
|
worldedit.player_notify(name, count .. " nodes added")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -620,11 +584,7 @@ minetest.register_chatcommand("/copy", {
|
|||||||
amount = amount * sign
|
amount = amount * sign
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.copy(pos1, pos2, axis, amount)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.copy(pos1, pos2, axis, amount, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes copied")
|
worldedit.player_notify(name, count .. " nodes copied")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -651,11 +611,7 @@ minetest.register_chatcommand("/move", {
|
|||||||
amount = amount * sign
|
amount = amount * sign
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.move(pos1, pos2, axis, amount)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.move(pos1, pos2, axis, amount, tenv)
|
|
||||||
|
|
||||||
pos1[axis] = pos1[axis] + amount
|
pos1[axis] = pos1[axis] + amount
|
||||||
pos2[axis] = pos2[axis] + amount
|
pos2[axis] = pos2[axis] + amount
|
||||||
@ -687,11 +643,7 @@ minetest.register_chatcommand("/stack", {
|
|||||||
count = count * sign
|
count = count * sign
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.stack(pos1, pos2, axis, count)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.stack(pos1, pos2, axis, count, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes stacked")
|
worldedit.player_notify(name, count .. " nodes stacked")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -712,11 +664,7 @@ minetest.register_chatcommand("/scale", {
|
|||||||
worldedit.player_notify(name, "invalid scaling factor: " .. param)
|
worldedit.player_notify(name, "invalid scaling factor: " .. param)
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count, pos1, pos2 = worldedit.scale(pos1, pos2, factor)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count, pos1, pos2 = worldedit.scale(pos1, pos2, factor, tenv)
|
|
||||||
|
|
||||||
--reset markers to scaled positions
|
--reset markers to scaled positions
|
||||||
worldedit.pos1[name] = pos1
|
worldedit.pos1[name] = pos1
|
||||||
@ -755,11 +703,7 @@ minetest.register_chatcommand("/transpose", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2, tenv)
|
|
||||||
|
|
||||||
--reset markers to transposed positions
|
--reset markers to transposed positions
|
||||||
worldedit.pos1[name] = pos1
|
worldedit.pos1[name] = pos1
|
||||||
@ -790,11 +734,7 @@ minetest.register_chatcommand("/flip", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.flip(pos1, pos2, param)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.flip(pos1, pos2, param, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes flipped")
|
worldedit.player_notify(name, count .. " nodes flipped")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -856,11 +796,7 @@ minetest.register_chatcommand("/orient", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.orient(pos1, pos2, angle)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.orient(pos1, pos2, angle, tenv)
|
|
||||||
|
|
||||||
worldedit.player_notify(name, count .. " nodes oriented")
|
worldedit.player_notify(name, count .. " nodes oriented")
|
||||||
end,
|
end,
|
||||||
@ -877,11 +813,7 @@ minetest.register_chatcommand("/fixlight", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.fixlight(pos1, pos2)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.fixlight(pos1, pos2, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes updated")
|
worldedit.player_notify(name, count .. " nodes updated")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -919,11 +851,7 @@ minetest.register_chatcommand("/suppress", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.suppress(pos1, pos2, node)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.suppress(pos1, pos2, node, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes suppressed")
|
worldedit.player_notify(name, count .. " nodes suppressed")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -945,11 +873,7 @@ minetest.register_chatcommand("/highlight", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.highlight(pos1, pos2, node)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.highlight(pos1, pos2, node, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes highlighted")
|
worldedit.player_notify(name, count .. " nodes highlighted")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -965,11 +889,7 @@ minetest.register_chatcommand("/restore", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.restore(pos1, pos2)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.restore(pos1, pos2, tenv)
|
|
||||||
worldedit.player_notify(name, count .. " nodes restored")
|
worldedit.player_notify(name, count .. " nodes restored")
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@ -1089,11 +1009,7 @@ minetest.register_chatcommand("/load", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local tenv = minetest.env
|
local count = worldedit.deserialize(pos1, value)
|
||||||
if worldedit.ENABLE_QUEUE then
|
|
||||||
tenv = worldedit.queue_aliasenv
|
|
||||||
end
|
|
||||||
local count = worldedit.deserialize(pos1, value, tenv)
|
|
||||||
|
|
||||||
worldedit.player_notify(name, count .. " nodes loaded")
|
worldedit.player_notify(name, count .. " nodes loaded")
|
||||||
end,
|
end,
|
||||||
|
@ -1,32 +1,67 @@
|
|||||||
worldedit.marker1 = {}
|
worldedit.marker1 = {}
|
||||||
worldedit.marker2 = {}
|
worldedit.marker2 = {}
|
||||||
|
worldedit.marker = {}
|
||||||
|
|
||||||
|
--wip: use this as a huge entity to make a full worldedit region box
|
||||||
|
minetest.register_entity(":worldedit:region_cube", {
|
||||||
|
initial_properties = {
|
||||||
|
visual = "upright_sprite",
|
||||||
|
visual_size = {x=1.1, y=1.1},
|
||||||
|
textures = {"worldedit_pos1.png"},
|
||||||
|
visual_size = {x=10, y=10},
|
||||||
|
physical = false,
|
||||||
|
},
|
||||||
|
on_step = function(self, dtime)
|
||||||
|
if self.active == nil then
|
||||||
|
self.object:remove()
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
on_punch = function(self, hitter)
|
||||||
|
--wip: remove the entire region marker
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
--wip: use voxelmanip to put the entity in the correct spot
|
||||||
|
|
||||||
--marks worldedit region position 1
|
--marks worldedit region position 1
|
||||||
worldedit.mark_pos1 = function(name)
|
worldedit.mark_pos1 = function(name)
|
||||||
local pos = worldedit.pos1[name]
|
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
|
||||||
if worldedit.marker1[name] ~= nil then --marker already exists
|
if worldedit.marker1[name] ~= nil then --marker already exists
|
||||||
worldedit.marker1[name]:remove() --remove marker
|
worldedit.marker1[name]:remove() --remove marker
|
||||||
worldedit.marker1[name] = nil
|
worldedit.marker1[name] = nil
|
||||||
end
|
end
|
||||||
if pos ~= nil then --add marker
|
if pos1 ~= nil then --add marker
|
||||||
worldedit.marker1[name] = minetest.env:add_entity(pos, "worldedit:pos1")
|
worldedit.marker1[name] = minetest.add_entity(pos1, "worldedit:pos1")
|
||||||
worldedit.marker1[name]:get_luaentity().active = true
|
worldedit.marker1[name]:get_luaentity().active = true
|
||||||
|
if pos2 ~= nil then --region defined
|
||||||
|
worldedit.mark_region(pos1, pos2)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--marks worldedit region position 2
|
--marks worldedit region position 2
|
||||||
worldedit.mark_pos2 = function(name)
|
worldedit.mark_pos2 = function(name)
|
||||||
local pos = worldedit.pos2[name]
|
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
|
||||||
if worldedit.marker2[name] ~= nil then --marker already exists
|
if worldedit.marker2[name] ~= nil then --marker already exists
|
||||||
worldedit.marker2[name]:remove() --remove marker
|
worldedit.marker2[name]:remove() --remove marker
|
||||||
worldedit.marker2[name] = nil
|
worldedit.marker2[name] = nil
|
||||||
end
|
end
|
||||||
if pos ~= nil then --add marker
|
if pos2 ~= nil then --add marker
|
||||||
worldedit.marker2[name] = minetest.env:add_entity(pos, "worldedit:pos2")
|
worldedit.marker2[name] = minetest.add_entity(pos2, "worldedit:pos2")
|
||||||
worldedit.marker2[name]:get_luaentity().active = true
|
worldedit.marker2[name]:get_luaentity().active = true
|
||||||
|
if pos1 ~= nil then --region defined
|
||||||
|
worldedit.mark_region(pos1, pos2)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
worldedit.mark_region = function(pos1, pos2)
|
||||||
|
if worldedit.marker[name] ~= nil then --marker already exists
|
||||||
|
--wip: remove markers
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
minetest.register_entity(":worldedit:pos1", {
|
minetest.register_entity(":worldedit:pos1", {
|
||||||
initial_properties = {
|
initial_properties = {
|
||||||
visual = "cube",
|
visual = "cube",
|
||||||
@ -35,6 +70,7 @@ minetest.register_entity(":worldedit:pos1", {
|
|||||||
"worldedit_pos1.png", "worldedit_pos1.png",
|
"worldedit_pos1.png", "worldedit_pos1.png",
|
||||||
"worldedit_pos1.png", "worldedit_pos1.png"},
|
"worldedit_pos1.png", "worldedit_pos1.png"},
|
||||||
collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55},
|
collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55},
|
||||||
|
physical = false,
|
||||||
},
|
},
|
||||||
on_step = function(self, dtime)
|
on_step = function(self, dtime)
|
||||||
if self.active == nil then
|
if self.active == nil then
|
||||||
@ -56,6 +92,7 @@ minetest.register_entity(":worldedit:pos2", {
|
|||||||
"worldedit_pos2.png", "worldedit_pos2.png",
|
"worldedit_pos2.png", "worldedit_pos2.png",
|
||||||
"worldedit_pos2.png", "worldedit_pos2.png"},
|
"worldedit_pos2.png", "worldedit_pos2.png"},
|
||||||
collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55},
|
collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55},
|
||||||
|
physical = false,
|
||||||
},
|
},
|
||||||
on_step = function(self, dtime)
|
on_step = function(self, dtime)
|
||||||
if self.active == nil then
|
if self.active == nil then
|
||||||
|
Loading…
Reference in New Issue
Block a user