mirror of
				https://github.com/Uberi/Minetest-WorldEdit.git
				synced 2025-11-04 06:35:28 +01:00 
			
		
		
		
	Replace worldedit.spiral with worldedit.pyramid, as well as related chat commands.
This commit is contained in:
		
							
								
								
									
										16
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								README.md
									
									
									
									
									
								
							@@ -125,13 +125,13 @@ Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length <length>
 | 
			
		||||
    //cylinder z -12 3 mesecons:mesecon
 | 
			
		||||
    //cylinder ? 2 4 stone
 | 
			
		||||
    
 | 
			
		||||
### //spiral <size> <node>
 | 
			
		||||
### //pyramid <height> <node>
 | 
			
		||||
 | 
			
		||||
Add spiral at WorldEdit position 1 with size <size>, composed of <node>.
 | 
			
		||||
Add pyramid at WorldEdit position 1 with height <height>, composed of <node>.
 | 
			
		||||
 | 
			
		||||
    //spiral 8 dirt
 | 
			
		||||
    //spiral 5 default:glass
 | 
			
		||||
    //spiral 2 stone
 | 
			
		||||
    //pyramid 8 dirt
 | 
			
		||||
    //pyramid 5 default:glass
 | 
			
		||||
    //pyramid 2 stone
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### //copy x/y/z/? <amount>
 | 
			
		||||
@@ -268,11 +268,11 @@ Adds a cylinder at `pos` along the `axis` axis ("x" or "y" or "z") with length `
 | 
			
		||||
 | 
			
		||||
Returns the number of nodes added.
 | 
			
		||||
 | 
			
		||||
### worldedit.spiral(pos, size, nodename)
 | 
			
		||||
### worldedit.pyramid(pos, height, nodename)
 | 
			
		||||
 | 
			
		||||
Adds a spiral at `pos` with size `size`.
 | 
			
		||||
Adds a pyramid at `pos` with height `height`.
 | 
			
		||||
 | 
			
		||||
Returns the number of nodes changed.
 | 
			
		||||
Returns the number of nodes added.
 | 
			
		||||
 | 
			
		||||
### worldedit.copy(pos1, pos2, axis, amount)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -76,7 +76,7 @@ worldedit.replace = function(pos1, pos2, searchnode, replacenode)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--adds a hollow sphere at `pos` with radius `radius`, composed of `nodename`, returning the number of nodes added
 | 
			
		||||
worldedit.hollow_sphere = function(pos, radius, nodename)
 | 
			
		||||
worldedit.hollow_sphere = function(pos, radius, nodename) --wip: use bresenham sphere for maximum speed
 | 
			
		||||
	local node = {name=nodename}
 | 
			
		||||
	local pos1 = {x=0, y=0, z=0}
 | 
			
		||||
	local full_radius = radius * radius + radius
 | 
			
		||||
@@ -96,7 +96,7 @@ worldedit.hollow_sphere = function(pos, radius, nodename)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--adds a sphere at `pos` with radius `radius`, composed of `nodename`, returning the number of nodes added
 | 
			
		||||
worldedit.sphere = function(pos, radius, nodename)
 | 
			
		||||
worldedit.sphere = function(pos, radius, nodename) --wip: use bresenham sphere for maximum speed
 | 
			
		||||
	local node = {name=nodename}
 | 
			
		||||
	local pos1 = {x=0, y=0, z=0}
 | 
			
		||||
	local full_radius = radius * radius + radius
 | 
			
		||||
@@ -134,7 +134,7 @@ worldedit.hollow_cylinder = function(pos, axis, length, radius, nodename)
 | 
			
		||||
	local node = {name=nodename}
 | 
			
		||||
	local count = 0
 | 
			
		||||
	local step = 1
 | 
			
		||||
	if length < 0
 | 
			
		||||
	if length < 0 then
 | 
			
		||||
		length = -length
 | 
			
		||||
		step = -1
 | 
			
		||||
	end
 | 
			
		||||
@@ -195,7 +195,7 @@ worldedit.cylinder = function(pos, axis, length, radius, nodename)
 | 
			
		||||
	local node = {name=nodename}
 | 
			
		||||
	local count = 0
 | 
			
		||||
	local step = 1
 | 
			
		||||
	if length < 0
 | 
			
		||||
	if length < 0 then
 | 
			
		||||
		length = -length
 | 
			
		||||
		step = -1
 | 
			
		||||
	end
 | 
			
		||||
@@ -238,79 +238,35 @@ worldedit.cylinder = function(pos, axis, length, radius, nodename)
 | 
			
		||||
	return count
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--adds a spiral at `pos` with size `size`, composed of `nodename`, returning the number of nodes changed
 | 
			
		||||
worldedit.spiral = function(pos, size, nodename)
 | 
			
		||||
	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
 | 
			
		||||
--adds a pyramid at `pos` with height `height`, composed of `nodename`, returning the number of nodes added
 | 
			
		||||
worldedit.pyramid = function(pos, height, nodename)
 | 
			
		||||
	local pos1x, pos1y, pos1z = pos.x - height, pos.y, pos.z - height
 | 
			
		||||
	local pos2x, pos2y, pos2z = pos.x + height, pos.y + height, pos.z + height
 | 
			
		||||
	local pos = {x=0, y=pos1y, z=0}
 | 
			
		||||
 | 
			
		||||
	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
 | 
			
		||||
	local env = minetest.env
 | 
			
		||||
	while pos.y <= pos2y do --each vertical level of the pyramid
 | 
			
		||||
		pos.x = pos1x
 | 
			
		||||
		while pos.x <= pos2x do
 | 
			
		||||
			pos.z = pos1z
 | 
			
		||||
			while pos.z <= pos2z do
 | 
			
		||||
				env:add_node(pos, node)
 | 
			
		||||
				pos.z = pos.z + 1
 | 
			
		||||
			end
 | 
			
		||||
			pos.x = pos.x + 1
 | 
			
		||||
		end
 | 
			
		||||
		count = count + ((pos2y - pos.y) * 2 + 1) ^ 2
 | 
			
		||||
		pos.y = pos.y + 1
 | 
			
		||||
 | 
			
		||||
		pos1x, pos2x = pos1x + 1, pos2x - 1
 | 
			
		||||
		pos1z, pos2z = pos1z + 1, pos2z - 1
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
@@ -621,7 +577,7 @@ worldedit.deserialize_old = function(originpos, value)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--saves the nodes and meta defined by positions `pos1` and `pos2` into a file, returning the number of nodes saved
 | 
			
		||||
worldedit.metasave = function(pos1, pos2, file)
 | 
			
		||||
worldedit.metasave = function(pos1, pos2, file) --wip: simply work with strings instead of doing IO
 | 
			
		||||
	local path = minetest.get_worldpath() .. "/schems"
 | 
			
		||||
	local filename = path .. "/" .. file .. ".wem"
 | 
			
		||||
	os.execute("mkdir \"" .. path .. "\"") --create directory if it does not already exist
 | 
			
		||||
@@ -662,7 +618,7 @@ worldedit.metasave = function(pos1, pos2, file)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
--loads the nodes and meta from `file` to position `pos1`, returning the number of nodes loaded
 | 
			
		||||
worldedit.metaload = function(pos1, file)
 | 
			
		||||
worldedit.metaload = function(pos1, file) --wip: simply work with strings instead of doing IO
 | 
			
		||||
	local filename = minetest.get_worldpath() .. "/schems/" .. file .. ".wem"
 | 
			
		||||
	local rows, err = table.load(filename)
 | 
			
		||||
	if err then return _,err end
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								init.lua
									
									
									
									
									
								
							@@ -271,9 +271,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>",
 | 
			
		||||
minetest.register_chatcommand("/pyramid", {
 | 
			
		||||
	params = "<height> <node>",
 | 
			
		||||
	description = "Add pyramid at WorldEdit position 1 with height <height>, composed of <node>",
 | 
			
		||||
	privs = {worldedit=true},
 | 
			
		||||
	func = function(name, param)
 | 
			
		||||
		local pos = worldedit.pos1[name]
 | 
			
		||||
@@ -292,8 +292,8 @@ minetest.register_chatcommand("/spiral", {
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		local count = worldedit.spiral(pos, tonumber(size), nodename)
 | 
			
		||||
		minetest.chat_send_player(name, count .. " nodes changed")
 | 
			
		||||
		local count = worldedit.pyramid(pos, tonumber(size), nodename)
 | 
			
		||||
		minetest.chat_send_player(name, count .. " nodes added")
 | 
			
		||||
	end,
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user