diff options
Diffstat (limited to 'worldedit')
| -rw-r--r-- | worldedit/cuboid.lua | 258 | ||||
| -rw-r--r-- | worldedit/init.lua | 1 | 
2 files changed, 259 insertions, 0 deletions
| diff --git a/worldedit/cuboid.lua b/worldedit/cuboid.lua new file mode 100644 index 0000000..ce20761 --- /dev/null +++ b/worldedit/cuboid.lua @@ -0,0 +1,258 @@ +-- 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
\ No newline at end of file diff --git a/worldedit/init.lua b/worldedit/init.lua index ec6e99d..343a1e4 100644 --- a/worldedit/init.lua +++ b/worldedit/init.lua @@ -37,6 +37,7 @@ load_module(path .. "/serialization.lua")  load_module(path .. "/code.lua")
  load_module(path .. "/compatibility.lua")
  load_module(path .. "/wand.lua")
 +load_module(path .. "/cuboid.lua")
  if minetest.setting_getbool("log_mods") then
 | 
