mirror of
				https://github.com/Uberi/Minetest-WorldEdit.git
				synced 2025-10-31 04:45:33 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			258 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			258 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- Expands or contracts the cuboid in all axes by amount (positive or negative)
 | |
| worldedit.cuboid_volumetric_expand = function(name, amount)
 | |
| 	local pos1 = worldedit.pos1[name]
 | |
| 	local pos2 = worldedit.pos2[name]
 | |
| 	
 | |
| 	if pos1 == nil or pos2 == nil then
 | |
| 		return false, "Undefined cuboid"
 | |
| 	end
 | |
| 	
 | |
| 	local delta1 = vector.new()
 | |
| 	local delta2 = vector.new()
 | |
| 	local delta_dir1
 | |
| 	local delta_dir2
 | |
| 	
 | |
| 	delta1 = vector.add(delta1, amount)
 | |
| 	delta2 = vector.add(delta2, amount)
 | |
| 	delta_dir1, delta_dir2 = worldedit.get_expansion_directions(pos1, pos2)
 | |
| 	delta1 = vector.multiply(delta1, delta_dir1)
 | |
| 	delta2 = vector.multiply(delta2, delta_dir2)
 | |
| 	worldedit.pos1[name] = vector.add(pos1, delta1)
 | |
| 	worldedit.pos2[name] = vector.add(pos2, delta2)
 | |
| 	
 | |
| 	return true
 | |
| end
 | |
| 
 | |
| 
 | |
| -- Expands or contracts the cuboid in a single axis by amount (positive or negative)
 | |
| worldedit.cuboid_linear_expand = function(name, axis, direction, amount)
 | |
| 	local pos1 = worldedit.pos1[name]
 | |
| 	local pos2 = worldedit.pos2[name]
 | |
| 	
 | |
| 	if pos1 == nil or pos2 == nil then
 | |
| 		return false, "undefined cuboid"
 | |
| 	end
 | |
| 	
 | |
| 	if direction ~= 1 and direction ~= -1 then
 | |
| 		return false, "invalid marker"
 | |
| 	end
 | |
| 	
 | |
| 	local marker = worldedit.marker_get_closest_to_axis(name, axis, direction)
 | |
| 	local deltavect = vector.new()
 | |
| 	
 | |
| 	if axis == 'x' then
 | |
| 		deltavect.x = amount * direction
 | |
| 	elseif axis == 'y' then
 | |
| 		deltavect.y = amount * direction
 | |
| 	elseif axis == 'z' then
 | |
| 		deltavect.z = amount * direction
 | |
| 	else
 | |
| 		return false, "invalid axis"
 | |
| 	end
 | |
| 	
 | |
| 	worldedit.marker_move(name, marker, deltavect)
 | |
| 	return true
 | |
| end
 | |
| 
 | |
| 
 | |
| -- Shifts the cuboid by '+-amount' in axis 'axis'
 | |
| worldedit.cuboid_shift = function(name, axis, amount)
 | |
| 	local pos1 = worldedit.pos1[name]
 | |
| 	local pos2 = worldedit.pos2[name]
 | |
| 	
 | |
| 	if pos1 == nil or pos2 == nil then
 | |
| 		return false, "undefined cuboid"
 | |
| 	end
 | |
| 	
 | |
| 	if axis == 'x' then
 | |
| 		worldedit.pos1[name].x = pos1.x + amount
 | |
| 		worldedit.pos2[name].x = pos2.x + amount
 | |
| 	elseif axis == 'y' then
 | |
| 		worldedit.pos1[name].y = pos1.y + amount
 | |
| 		worldedit.pos2[name].y = pos2.y + amount
 | |
| 	elseif axis == 'z' then
 | |
| 		worldedit.pos1[name].z = pos1.z + amount
 | |
| 		worldedit.pos2[name].z = pos2.z + amount
 | |
| 	else
 | |
| 		return false, "invalid axis"
 | |
| 	end
 | |
| 	
 | |
| 	return true
 | |
| end
 | |
| 
 | |
| 
 | |
| -- Moves the location of a single marker by adding deltavector
 | |
| worldedit.marker_move = function(name, marker, deltavector)
 | |
| 	if marker ~= 1 and marker ~= 2 then
 | |
| 		return false
 | |
| 	end
 | |
| 	
 | |
| 	if marker == 1 then
 | |
| 		local pos = worldedit.pos1[name]
 | |
| 		worldedit.pos1[name] = vector.add(deltavector, pos)
 | |
| 	else
 | |
| 		local pos = worldedit.pos2[name]
 | |
| 		worldedit.pos2[name] = vector.add(deltavector, pos)
 | |
| 	end
 | |
| 	
 | |
| 	return true
 | |
| end
 | |
| 
 | |
| -- Updates the location ingame of the markers
 | |
| worldedit.marker_update = function(name, marker)
 | |
| 	if marker == nil then
 | |
| 		worldedit.mark_pos1(name)
 | |
| 		worldedit.mark_pos2(name)
 | |
| 	elseif marker == 1 then
 | |
| 		worldedit.mark_pos1(name)
 | |
| 	elseif marker == 2 then
 | |
| 		worldedit.mark_pos2(name)
 | |
| 	else
 | |
| 		minetest.debug(
 | |
| 			"worldedit: Invalid execution of function update_markers")
 | |
| 	end
 | |
| end
 | |
| 
 | |
| 
 | |
| -- Returns two vectors with the directions for volumetric expansion
 | |
| worldedit.get_expansion_directions = function(mark1, mark2)
 | |
| 	if mark1 == nil or mark2 == nil then
 | |
| 		return
 | |
| 	end
 | |
| 	local dir1 = vector.new()
 | |
| 	local dir2 = vector.new()
 | |
| 
 | |
| 	if mark1.x < mark2.x then
 | |
| 		dir1.x = -1
 | |
| 		dir2.x = 1
 | |
| 	else
 | |
| 		dir1.x = 1
 | |
| 		dir2.x = -1
 | |
| 	end
 | |
| 	if mark1.y < mark2.y then
 | |
| 		dir1.y = -1
 | |
| 		dir2.y = 1
 | |
| 	else
 | |
| 		dir1.y = 1
 | |
| 		dir2.y = -1
 | |
| 	end
 | |
| 	if mark1.z < mark2.z then
 | |
| 		dir1.z = -1
 | |
| 		dir2.z = 1
 | |
| 	else
 | |
| 		dir1.z = 1
 | |
| 		dir2.z = -1
 | |
| 	end
 | |
| 	return dir1, dir2
 | |
| end
 | |
| 
 | |
| 
 | |
| -- Return the marker that is closest to the player
 | |
| worldedit.marker_get_closest_to_player = function(name)
 | |
| 	local playerpos = minetest.get_player_by_name(name):getpos()
 | |
| 	local dist1 = vector.distance(playerpos, worldedit.pos1[name])
 | |
| 	local dist2 = vector.distance(playerpos, worldedit.pos2[name])
 | |
| 	
 | |
| 	if dist1 < dist2 then
 | |
| 		return 1
 | |
| 	else
 | |
| 		return 2
 | |
| 	end
 | |
| end
 | |
| 
 | |
| 
 | |
| -- Returns the closest marker to the specified axis and direction
 | |
| worldedit.marker_get_closest_to_axis = function(name, axis, direction)
 | |
| 	local pos1 = vector.new()
 | |
| 	local pos2 = vector.new()
 | |
| 	
 | |
| 	if direction ~= 1 and direction ~= -1 then
 | |
| 		return nil
 | |
| 	end
 | |
| 
 | |
| 	if axis == 'x' then
 | |
| 		pos1.x = worldedit.pos1[name].x * direction
 | |
| 		pos2.x = worldedit.pos2[name].x * direction
 | |
| 		if pos1.x > pos2.x then
 | |
| 			return 1
 | |
| 		else
 | |
| 			return 2
 | |
| 		end
 | |
| 	elseif axis == 'y' then
 | |
| 		pos1.y = worldedit.pos1[name].y * direction
 | |
| 		pos2.y = worldedit.pos2[name].y * direction
 | |
| 		if pos1.y > pos2.y then
 | |
| 			return 1
 | |
| 		else
 | |
| 			return 2
 | |
| 		end
 | |
| 	elseif axis == 'z' then
 | |
| 		pos1.z = worldedit.pos1[name].z * direction
 | |
| 		pos2.z = worldedit.pos2[name].z * direction
 | |
| 		if pos1.z > pos2.z then
 | |
| 			return 1
 | |
| 		else
 | |
| 			return 2
 | |
| 		end
 | |
| 	else
 | |
| 		return nil
 | |
| 	end
 | |
| end
 | |
| 
 | |
| 
 | |
| -- Translates up, down, left, right, front, back to their corresponding axes and 
 | |
| -- directions according to faced direction
 | |
| worldedit.translate_direction = function(name, direction)
 | |
| 	local axis, dir = worldedit.player_axis(name)
 | |
| 	local resaxis, resdir
 | |
| 	
 | |
| 	if direction == "up" then
 | |
| 		return 'y', 1
 | |
| 	end
 | |
| 	
 | |
| 	if direction == "down" then
 | |
| 		return 'y', -1
 | |
| 	end
 | |
| 	
 | |
| 	if direction == "front" then
 | |
| 		if axis == "y" then
 | |
| 			resaxis = nil
 | |
| 			resdir = nil
 | |
| 		else
 | |
| 			resaxis = axis
 | |
| 			resdir = dir
 | |
| 		end
 | |
| 	end
 | |
| 	
 | |
| 	if direction == "back" then
 | |
| 		if axis == "y" then
 | |
| 			resaxis = nil
 | |
| 			resdir = nil
 | |
| 		else
 | |
| 			resaxis = axis
 | |
| 			resdir = -dir
 | |
| 		end
 | |
| 	end
 | |
| 	
 | |
| 	if direction == "left" then
 | |
| 		if axis == 'x' then
 | |
| 			resaxis = 'z'
 | |
| 			resdir = dir
 | |
| 		elseif axis == 'z' then
 | |
| 			resaxis = 'x'
 | |
| 			resdir = -dir
 | |
| 		end
 | |
| 	end
 | |
| 	
 | |
| 	if direction == "right" then
 | |
| 		if axis == 'x' then
 | |
| 			resaxis = 'z'
 | |
| 			resdir = -dir
 | |
| 		elseif axis == 'z' then
 | |
| 			resaxis = 'x'
 | |
| 			resdir = dir
 | |
| 		end
 | |
| 	end
 | |
| 	
 | |
| 	return resaxis, resdir
 | |
| end |