+++ /dev/null
-worldedit = rawget(_G, "worldedit") or {}\r
-local minetest = minetest --local copy of global\r
-\r
-local get_pointed = function(pos, nearest, distance)\r
- if distance > 100 then\r
- return false\r
- end\r
-\r
- --check for collision with node\r
- local nodename = minetest.get_node(pos).name\r
- if nodename ~= "air"\r
- and nodename ~= "default:water_source"\r
- and nodename ~= "default:water_flowing" then\r
- if nodename ~= "ignore" then\r
- return nearest\r
- end\r
- return false\r
- end\r
-end\r
-\r
-local use = function(itemstack, user, pointed_thing)\r
- if pointed_thing.type == "nothing" then --pointing at nothing\r
- local placepos = worldedit.raytrace(user:getpos(), user:get_look_dir(), get_pointed)\r
- if placepos then --extended reach\r
- pointed_thing.type = "node"\r
- pointed_thing.under = nil --wip\r
- pointed_thing.above = nil --wip\r
- end\r
- end\r
- return minetest.item_place_node(itemstack, user, pointed_thing)\r
-end\r
---\r
-\r
-worldedit.raytrace = function(pos, dir, callback)\r
- local base = {x=math.floor(pos.x), y=math.floor(pos.y), z=math.floor(pos.z)}\r
- local stepx, stepy, stepz = 0, 0, 0\r
- local componentx, componenty, componentz = 0, 0, 0\r
- local intersectx, intersecty, intersectz = 0, 0, 0\r
-\r
- if dir.x == 0 then\r
- intersectx = math.huge\r
- elseif dir.x > 0 then\r
- stepx = 1\r
- componentx = 1 / dir.x\r
- intersectx = ((base.x - pos.x) + 1) * componentx\r
- else\r
- stepx = -1\r
- componentx = 1 / -dir.x\r
- intersectx = (pos.x - base.x) * componentx\r
- end\r
- if dir.y == 0 then\r
- intersecty = math.huge\r
- elseif dir.y > 0 then\r
- stepy = 1\r
- componenty = 1 / dir.y\r
- intersecty = ((base.y - pos.y) + 1) * componenty\r
- else\r
- stepy = -1\r
- componenty = 1 / -dir.y\r
- intersecty = (pos.y - base.y) * componenty\r
- end\r
- if dir.z == 0 then\r
- intersectz = math.huge\r
- elseif dir.z > 0 then\r
- stepz = 1\r
- componentz = 1 / dir.z\r
- intersectz = ((base.z - pos.z) + 1) * componentz\r
- else\r
- stepz = -1\r
- componentz = 1 / -dir.z\r
- intersectz = (pos.z - base.z) * componentz\r
- end\r
-\r
- local distance = 0\r
- local nearest = {x=base.x, y=base.y, z=base.z}\r
- while true do\r
- local values = {callback(base, nearest, distance)}\r
- if #values > 0 then\r
- return unpack(values)\r
- end\r
-\r
- nearest.x, nearest.y, nearest.z = base.x, base.y, base.z\r
- if intersectx < intersecty then\r
- if intersectx < intersectz then\r
- base.x = base.x + stepx\r
- distance = intersectx\r
- intersectx = intersectx + componentx\r
- else\r
- base.z = base.z + stepz\r
- distance = intersectz\r
- intersectz = intersectz + componentz\r
- end\r
- elseif intersecty < intersectz then\r
- base.y = base.y + stepy\r
- distance = intersecty\r
- intersecty = intersecty + componenty\r
- else\r
- base.z = base.z + stepz\r
- distance = intersectz\r
- intersectz = intersectz + componentz\r
- end\r
- end\r
-end\r
+++ /dev/null
-do return end
-do
- local MAX_VOLUME = 30 * 30 * 30
-
- local we = worldedit
- local volume = we.volume
- local safewrap = function(func)
- return function(pos1, pos2, ...)
- if validbox(pos1, pos2) then
- return func(pos1, pos2, ...)
- end
- return 0, pos1, pos2
- end
- end
-
- local validbox = function(pos1, pos2)
- tpos1, tpos2 = we.sort_pos(pos1, pos2)
-
- if volume(tpos1, tpos2) > MAX_VOLUME then
- return false
- end
-
- --check for ownership of area if ownership mod is installed
- if owner_defs then
- local inside = false
- for _, def in pairs(owner_defs) do
- --sort positions
- local tdef = {x1=def.x1, x2 = def.x2, y1=def.y1, y2=def.y2, z1=def.z1, z2=def.z2}
- if tdef.x1 > tdef.x2 then
- tdef.x1, tdef.x2 = tdef.x2, tdef.x1
- end
- if tdef.y1 > tdef.y2 then
- tdef.y1, tdef.y2 = tdef.y2, tdef.y1
- end
- if tdef.z1 > tdef.z2 then
- tdef.z1, tdef.z2 = tdef.z2, tdef.z1
- end
-
- --check ownership
- if tpos1.x >= tdef.x1 and tpos1.x <= tdef.x2
- and tpos2.x >= tdef.x1 and tpos2.x <= tdef.x2
- and tpos1.y >= tdef.y1 and tpos1.y <= tdef.y2
- and tpos2.y >= tdef.y1 and tpos2.y <= tdef.y2
- and tpos1.z >= tdef.z1 and tpos1.z <= tdef.z2
- and tpos2.z >= tdef.z1 and tpos2.z <= tdef.z2
- and name == def.owner then --wip: name isn't available here
- inside = true
- break
- end
- end
- if not inside then
- return false
- end
- end
-
- return true
- end
-
- worldedit = {
- sort_pos = we.sort_pos,
-
- set = safewrap(we.set),
- replace = safewrap(we.replace),
- replaceinverse = safewrap(we.replaceinverse),
- copy = function(pos1, pos2, axis, amount)
- tpos1, tpos2 = we.sort_pos(pos1, pos2)
- tpos1[axis] = tpos1[axis] + amount
- tpos2[axis] = tpos2[axis] + amount
- if validbox(pos1, pos2) and validbox(tpos1, tpos2) then
- we.copy(pos1, pos2, axis, amount)
- else
- return 0
- end
- end,
- move = function(pos1, pos2, axis, amount)
- tpos1, tpos2 = we.sort_pos(pos1, pos2)
- tpos1[axis] = tpos1[axis] + amount
- tpos2[axis] = tpos2[axis] + amount
- if validbox(pos1, pos2) and validbox(tpos1, tpos2) then
- we.move(pos1, pos2, axis, amount)
- else
- return 0
- end
- end,
- stack = function(pos1, pos2, axis, count)
- tpos1, tpos2 = we.sort_pos(pos1, pos2)
- local length = (tpos2[axis] - tpos1[axis] + 1) * count
- if count < 0 then
- tpos1[axis] = tpos1[axis] + length
- else
- tpos2[axis] = tpos2[axis] + length
- end
- if validbox(tpos1, tpos2) then
- we.stack(pos1, pos2, axis, amount)
- else
- return 0
- end
- end,
- --wip: add transpose, rotate safely
- flip = safewrap(we.flip),
- orient = safewrap(we.orient),
- fixlight = safewrap(we.fixlight),
- --wip: add primitives here
- volume = we.volume,
- hide = safewrap(we.hide),
- suppress = safewrap(we.suppress),
- highlight = safewrap(we.highlight),
- restore = safewrap(we.restore),
- serialize = safewrap(we.serialize),
- allocate = we.allocate,
- deserialize = function(originpos, value)
- local tpos1, tpos2 = we.allocate(originpos, value)
- if validbox(tpos1, tpos2) then
- we.deserialize(originpos, value)
- else
- return 0
- end
- end,
- }
-end
\ No newline at end of file