mirror of
https://github.com/Uberi/Minetest-WorldEdit.git
synced 2024-12-04 21:33:43 +01:00
Fix player axis detection, make spirals code a bit easier to read.
This commit is contained in:
parent
21192ceb57
commit
340416c789
@ -111,7 +111,7 @@ Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length <length>
|
||||
|
||||
### //spiral <size> <node>
|
||||
|
||||
Add Spiral at WorldEdit position 1 with size <size>, composed of <node>.
|
||||
Add spiral at WorldEdit position 1 with size <size>, composed of <node>.
|
||||
|
||||
//spiral 8 dirt
|
||||
//spiral 5 default:glass
|
||||
@ -227,7 +227,7 @@ Returns the number of nodes added.
|
||||
|
||||
### worldedit.spiral(pos, size, nodename)
|
||||
|
||||
Adds a Spiral at `pos` with size `size`.
|
||||
Adds a spiral at `pos` with size `size`.
|
||||
|
||||
Returns the number of nodes changed.
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
dofile(minetest.get_modpath("worldedit") .. "/spirals.lua")
|
||||
--modifies positions `pos1` and `pos2` so that each component of `pos1` is less than or equal to its corresponding conent of `pos2`, returning two new positions
|
||||
worldedit.sort_pos = function(pos1, pos2)
|
||||
pos1 = {x=pos1.x, y=pos1.y, z=pos1.z}
|
||||
@ -185,24 +184,77 @@ end
|
||||
|
||||
--adds a spiral at `pos` with size `size`, returning the number of nodes changed
|
||||
worldedit.spiral = function(pos, size, nodename)
|
||||
local shift_x,shift_y
|
||||
local shift_x, shift_y
|
||||
sa = spiralt(size)
|
||||
shift_y = #sa -- "Height" of the Array
|
||||
local fe = sa[1]
|
||||
shift_x = #fe -- "Width" of the Array
|
||||
fe = nil
|
||||
|
||||
local count = 0
|
||||
for x,v in ipairs(sa) do
|
||||
for y, z in ipairs(v) do
|
||||
minetest.env:add_node({x=pos.x-shift_x+x,y=pos.y-shift_y+y,z=pos.z+z}, {name=nodename})
|
||||
count = count + 1
|
||||
end
|
||||
end
|
||||
|
||||
shift_y = #sa -- "Height" of the Array
|
||||
local fe = sa[1]
|
||||
shift_x = #fe -- "Width" of the Array
|
||||
fe = nil
|
||||
|
||||
local count = 0
|
||||
local node = {name=nodename}
|
||||
for x, v in ipairs(sa) do
|
||||
for y, z in ipairs(v) do
|
||||
minetest.env:add_node({x=pos.x - shift_x + x,y=pos.y - shift_y + y,z=pos.z + z}, node)
|
||||
count = count + 1
|
||||
end
|
||||
end
|
||||
return count
|
||||
end
|
||||
|
||||
--wip:
|
||||
sign = function(s)
|
||||
if s > 0 then
|
||||
return 1
|
||||
end
|
||||
if s < 0 then
|
||||
return -1
|
||||
end
|
||||
return 0
|
||||
end
|
||||
|
||||
--wip: needs to be faster
|
||||
function spiral_index(y, x) -- returns the value at (x, y) in a spiral that starts at 1 and goes outwards
|
||||
if y == -x and y >= x then
|
||||
return (2 * y + 1) ^ 2
|
||||
end
|
||||
local l = math.max(math.abs(y), math.abs(x))
|
||||
local value
|
||||
if math.abs(y) == l then
|
||||
value = x
|
||||
if y < 0 then
|
||||
value = -value
|
||||
end
|
||||
else
|
||||
value = y
|
||||
if x < 0 then
|
||||
value = -value
|
||||
end
|
||||
end
|
||||
t1 = l * 2
|
||||
if x + y < 0 then
|
||||
t1 = -t1
|
||||
end
|
||||
t2 = y ^ 2 - x ^ 2
|
||||
if t2 < 0 then
|
||||
t2 = -t2
|
||||
end
|
||||
return ((2 * l - 1) ^ 2) + (l * 4) + t1 + (t2 * (l - value))
|
||||
end
|
||||
|
||||
--wip: needs to be faster
|
||||
function spiralt(side)
|
||||
local spiral = {}
|
||||
local start, stop = math.floor((-side+1)/2), math.floor((side-1)/2)
|
||||
for i = 1, side do
|
||||
spiral[i] = {}
|
||||
for j = 1, side do
|
||||
spiral[i][j] = side ^ 2 - spiral_index(stop - i + 1,start + j - 1) --moves the coordinates so (0,0) is at the center of the spiral
|
||||
end
|
||||
end
|
||||
return spiral
|
||||
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
|
||||
worldedit.copy = function(pos1, pos2, axis, amount)
|
||||
local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
||||
|
32
init.lua
32
init.lua
@ -16,16 +16,18 @@ worldedit.node_is_valid = function(temp_pos, nodename)
|
||||
or minetest.registered_nodes["default:" .. nodename] ~= nil
|
||||
end
|
||||
|
||||
--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)
|
||||
local dir = minetest.env:get_player_by_name(name):get_look_dir()
|
||||
if dir.x > dir.y then
|
||||
if dir.x > dir.z then
|
||||
return "x"
|
||||
local x, y, z = math.abs(dir.x), math.abs(dir.y), math.abs(dir.z)
|
||||
if x > y then
|
||||
if x > z then
|
||||
return "x", dir.x > 0 and 1 or -1
|
||||
end
|
||||
elseif dir.y > dir.z then
|
||||
return "y"
|
||||
elseif y > z then
|
||||
return "y", dir.y > 0 and 1 or -1
|
||||
end
|
||||
return "z"
|
||||
return "z", dir.z > 0 and 1 or -1
|
||||
end
|
||||
|
||||
minetest.register_chatcommand("/reset", {
|
||||
@ -204,7 +206,8 @@ minetest.register_chatcommand("/hollowcylinder", {
|
||||
return
|
||||
end
|
||||
if axis == "?" then
|
||||
axis = worldedit.player_axis(name)
|
||||
axis, sign = worldedit.player_axis(name)
|
||||
length = length * sign
|
||||
end
|
||||
if not worldedit.node_is_valid(pos, nodename) then
|
||||
minetest.chat_send_player(name, "Invalid node name: " .. param)
|
||||
@ -216,10 +219,9 @@ minetest.register_chatcommand("/hollowcylinder", {
|
||||
end,
|
||||
})
|
||||
|
||||
|
||||
minetest.register_chatcommand("/spiral", {
|
||||
params = "<size> <node>",
|
||||
description = "Add Spiral at WorldEdit position 1 with size <size>, composed of <node>",
|
||||
description = "Add spiral at WorldEdit position 1 with size <size>, composed of <node>",
|
||||
privs = {worldedit=true},
|
||||
func = function(name, param)
|
||||
local pos = worldedit.pos1[name]
|
||||
@ -260,7 +262,8 @@ minetest.register_chatcommand("/cylinder", {
|
||||
return
|
||||
end
|
||||
if axis == "?" then
|
||||
axis = worldedit.player_axis(name)
|
||||
axis, sign = worldedit.player_axis(name)
|
||||
length = length * sign
|
||||
end
|
||||
if not worldedit.node_is_valid(pos, nodename) then
|
||||
minetest.chat_send_player(name, "Invalid node name: " .. param)
|
||||
@ -289,7 +292,8 @@ minetest.register_chatcommand("/copy", {
|
||||
return
|
||||
end
|
||||
if axis == "?" then
|
||||
axis = worldedit.player_axis(name)
|
||||
axis, sign = worldedit.player_axis(name)
|
||||
amount = amount * sign
|
||||
end
|
||||
|
||||
local count = worldedit.copy(pos1, pos2, axis, tonumber(amount))
|
||||
@ -314,7 +318,8 @@ minetest.register_chatcommand("/move", {
|
||||
return
|
||||
end
|
||||
if axis == "?" then
|
||||
axis = worldedit.player_axis(name)
|
||||
axis, sign = worldedit.player_axis(name)
|
||||
amount = amount * sign
|
||||
end
|
||||
|
||||
local count = worldedit.move(pos1, pos2, axis, tonumber(amount))
|
||||
@ -339,7 +344,8 @@ minetest.register_chatcommand("/stack", {
|
||||
return
|
||||
end
|
||||
if axis == "?" then
|
||||
axis = worldedit.player_axis(name)
|
||||
axis, sign = worldedit.player_axis(name)
|
||||
count = count * sign
|
||||
end
|
||||
|
||||
local count = worldedit.stack(pos1, pos2, axis, tonumber(count))
|
||||
|
17
spirals.lua
17
spirals.lua
@ -1,17 +0,0 @@
|
||||
av, sn = math.abs, function(s) return s~=0 and s/av(s) or 0 end
|
||||
function sindex(y, x) -- returns the value at (x, y) in a spiral that starts at 1 and goes outwards
|
||||
if y == -x and y >= x then return (2*y+1)^2 end
|
||||
local l = math.max(av(y), av(x))
|
||||
return (2*l-1)^2+4*l+2*l*sn(x+y)+sn(y^2-x^2)*(l-(av(y)==l and sn(y)*x or sn(x)*y)) -- OH GOD WHAT
|
||||
end
|
||||
|
||||
function spiralt(side)
|
||||
local ret, start, stop = {}, math.floor((-side+1)/2), math.floor((side-1)/2)
|
||||
for i = 1, side do
|
||||
ret[i] = {}
|
||||
for j = 1, side do
|
||||
ret[i][j] = side^2 - sindex(stop - i + 1,start + j - 1) --moves the coordinates so (0,0) is at the center of the spiral
|
||||
end
|
||||
end
|
||||
return ret
|
||||
end
|
Loading…
Reference in New Issue
Block a user