123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- -- 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
- -- 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):get_pos()
- 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
|