mirror of
https://github.com/sbrl/Minetest-WorldEditAdditions.git
synced 2024-11-22 07:23:00 +00:00
//walls: add optional thickness argument
This commit is contained in:
parent
c2702a8fde
commit
f30ddbae3b
4 changed files with 42 additions and 14 deletions
|
@ -10,7 +10,8 @@ Note to self: See the bottom of this file for the release template text.
|
||||||
- Use [luacheck](https://github.com/mpeterv/luacheck) to find and fix a large number of bugs and other issues
|
- Use [luacheck](https://github.com/mpeterv/luacheck) to find and fix a large number of bugs and other issues
|
||||||
- Multiple commands: Allow using quotes (`"thing"`, `'thing'`) to quote values when splitting
|
- Multiple commands: Allow using quotes (`"thing"`, `'thing'`) to quote values when splitting
|
||||||
- `//layers`: Add optional slope constraint (inspired by [WorldPainter](https://worldpainter.net/))
|
- `//layers`: Add optional slope constraint (inspired by [WorldPainter](https://worldpainter.net/))
|
||||||
- `//bonemeal`: Add optional node list contraint
|
- `//bonemeal`: Add optional node list constraint
|
||||||
|
- `//walls`: Add optional thickness argument
|
||||||
|
|
||||||
|
|
||||||
## v1.12: The selection tools update (26th June 2021)
|
## v1.12: The selection tools update (26th June 2021)
|
||||||
|
|
|
@ -254,13 +254,15 @@ Since WorldEditAdditions v1.13, a list of node names is also optionally supporte
|
||||||
//bonemeal 4 50 ethereal:grove_dirt
|
//bonemeal 4 50 ethereal:grove_dirt
|
||||||
```
|
```
|
||||||
|
|
||||||
## `//walls <replace_node>`
|
## `//walls <replace_node> [<thickness=1>]`
|
||||||
Creates vertical walls of `<replace_node>` around the inside edges of the defined region.
|
Creates vertical walls of `<replace_node>` around the inside edges of the defined region, optionally specifying the thickness thereof.
|
||||||
|
|
||||||
```weacmd
|
```weacmd
|
||||||
//walls dirt
|
//walls dirt
|
||||||
//walls stone
|
//walls stone
|
||||||
//walls goldblock
|
//walls goldblock
|
||||||
|
//walls sandstone 2
|
||||||
|
//walls glass 4
|
||||||
```
|
```
|
||||||
|
|
||||||
## `//scale <axis> <scale_factor> | <factor_x> [<factor_y> <factor_z> [<anchor_x> <anchor_y> <anchor_z>`
|
## `//scale <axis> <scale_factor> | <factor_x> [<factor_y> <factor_z> [<anchor_x> <anchor_y> <anchor_z>`
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
--- Creates vertical walls on the inside of the defined region.
|
|
||||||
-- @module worldeditadditions.walls
|
|
||||||
|
|
||||||
-- ██ ██ █████ ██ ██ ███████
|
-- ██ ██ █████ ██ ██ ███████
|
||||||
-- ██ ██ ██ ██ ██ ██ ██
|
-- ██ ██ ██ ██ ██ ██ ██
|
||||||
|
@ -7,8 +5,15 @@
|
||||||
-- ██ ███ ██ ██ ██ ██ ██ ██
|
-- ██ ███ ██ ██ ██ ██ ██ ██
|
||||||
-- ███ ███ ██ ██ ███████ ███████ ███████
|
-- ███ ███ ██ ██ ███████ ███████ ███████
|
||||||
|
|
||||||
function worldeditadditions.walls(pos1, pos2, node_name)
|
--- Creates vertical walls on the inside of the defined region.
|
||||||
|
-- @apipath worldeditadditions.walls
|
||||||
|
-- @param pos1 Vector Position 1 of the defined region,
|
||||||
|
-- @param pos2 Vector Position 2 of the defined region.
|
||||||
|
-- @param node_name string The name of the node to use to create the walls with.
|
||||||
|
-- @param thickness number? The thickness of the walls to create. Default: 1
|
||||||
|
function worldeditadditions.walls(pos1, pos2, node_name, thickness)
|
||||||
pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
pos1, pos2 = worldedit.sort_pos(pos1, pos2)
|
||||||
|
if not thickness then thickness = 1 end
|
||||||
-- pos2 will always have the highest co-ordinates now
|
-- pos2 will always have the highest co-ordinates now
|
||||||
|
|
||||||
-- Fetch the nodes in the specified area
|
-- Fetch the nodes in the specified area
|
||||||
|
@ -22,7 +27,10 @@ function worldeditadditions.walls(pos1, pos2, node_name)
|
||||||
for z = pos2.z, pos1.z, -1 do
|
for z = pos2.z, pos1.z, -1 do
|
||||||
for y = pos2.y, pos1.y, -1 do
|
for y = pos2.y, pos1.y, -1 do
|
||||||
for x = pos2.x, pos1.x, -1 do
|
for x = pos2.x, pos1.x, -1 do
|
||||||
if x == pos1.x or x == pos2.x or z == pos1.z or z == pos2.z then
|
if math.abs(x - pos1.x) < thickness
|
||||||
|
or math.abs(x - pos2.x) < thickness
|
||||||
|
or math.abs(z - pos1.z) < thickness
|
||||||
|
or math.abs(z - pos2.z) < thickness then
|
||||||
data[area:index(x, y, z)] = node_id
|
data[area:index(x, y, z)] = node_id
|
||||||
count_replaced = count_replaced + 1
|
count_replaced = count_replaced + 1
|
||||||
end
|
end
|
||||||
|
|
|
@ -4,16 +4,30 @@
|
||||||
-- ██ ███ ██ ██ ██ ██ ██ ██
|
-- ██ ███ ██ ██ ██ ██ ██ ██
|
||||||
-- ███ ███ ██ ██ ███████ ███████ ███████
|
-- ███ ███ ██ ██ ███████ ███████ ███████
|
||||||
worldedit.register_command("walls", {
|
worldedit.register_command("walls", {
|
||||||
params = "<replace_node>",
|
params = "<replace_node> [<thickness=1>]",
|
||||||
description = "Creates vertical walls of <replace_node> around the inside edges of the defined region.",
|
description = "Creates vertical walls of <replace_node> around the inside edges of the defined region. Optionally specifies a thickness for the walls to be created (defaults to 1)",
|
||||||
privs = { worldedit = true },
|
privs = { worldedit = true },
|
||||||
require_pos = 2,
|
require_pos = 2,
|
||||||
parse = function(params_text)
|
parse = function(params_text)
|
||||||
local target_node = worldedit.normalize_nodename(params_text)
|
local parts = worldeditadditions.split_shell(params_text)
|
||||||
|
|
||||||
|
local target_node
|
||||||
|
local thickness = 1
|
||||||
|
|
||||||
|
local target_node_raw = table.remove(parts, 1)
|
||||||
|
target_node = worldedit.normalize_nodename(target_node_raw)
|
||||||
if not target_node then
|
if not target_node then
|
||||||
return false, "Error: Invalid node name"
|
return false, "Error: Invalid node name '"..target_node_raw.."'."
|
||||||
end
|
end
|
||||||
return true, target_node
|
|
||||||
|
if #parts > 0 then
|
||||||
|
local thickness_raw = table.remove(parts, 1)
|
||||||
|
thickness = tonumber(thickness_raw)
|
||||||
|
if not thickness then return false, "Error: Invalid thickness value '"..thickness_raw.."'. The thickness value must be a positive integer greater than or equal to 0." end
|
||||||
|
if thickness < 1 then return false, "Error: That thickness value '"..thickness_raw.."' is out of range. The thickness value must be a positive integer greater than or equal to 0." end
|
||||||
|
end
|
||||||
|
|
||||||
|
return true, target_node, math.floor(thickness)
|
||||||
end,
|
end,
|
||||||
nodes_needed = function(name)
|
nodes_needed = function(name)
|
||||||
-- //overlay only modifies up to 1 node per column in the selected region
|
-- //overlay only modifies up to 1 node per column in the selected region
|
||||||
|
@ -23,9 +37,12 @@ worldedit.register_command("walls", {
|
||||||
|
|
||||||
return worldedit.volume(pos1, pos2) - worldedit.volume(pos1, pos3)
|
return worldedit.volume(pos1, pos2) - worldedit.volume(pos1, pos3)
|
||||||
end,
|
end,
|
||||||
func = function(name, target_node)
|
func = function(name, target_node, thickness)
|
||||||
local start_time = worldeditadditions.get_ms_time()
|
local start_time = worldeditadditions.get_ms_time()
|
||||||
local success, replaced = worldeditadditions.walls(worldedit.pos1[name], worldedit.pos2[name], target_node)
|
local success, replaced = worldeditadditions.walls(
|
||||||
|
worldedit.pos1[name], worldedit.pos2[name],
|
||||||
|
target_node, thickness
|
||||||
|
)
|
||||||
local time_taken = worldeditadditions.get_ms_time() - start_time
|
local time_taken = worldeditadditions.get_ms_time() - start_time
|
||||||
|
|
||||||
minetest.log("action", name .. " used //walls from "..worldeditadditions.vector.tostring(worldedit.pos1[name]).." to "..worldeditadditions.vector.tostring(worldedit.pos1[name])..", replacing " .. replaced .. " nodes in " .. time_taken .. "s")
|
minetest.log("action", name .. " used //walls from "..worldeditadditions.vector.tostring(worldedit.pos1[name]).." to "..worldeditadditions.vector.tostring(worldedit.pos1[name])..", replacing " .. replaced .. " nodes in " .. time_taken .. "s")
|
||||||
|
|
Loading…
Reference in a new issue