Skip to content
Permalink
Browse files

Documentation for `//stack2`, code style fixes, add author section to…

… README.
  • Loading branch information...
Uberi committed Jul 6, 2014
1 parent b32aadd commit 175ac211ca06af7eec9dfbc62e11e1d6eb448c03
Showing with 165 additions and 146 deletions.
  1. +11 −4 Chat Commands.md
  2. +15 −0 README.md
  3. +121 −113 worldedit/manipulations.lua
  4. +18 −29 worldedit_commands/init.lua
@@ -98,13 +98,13 @@ Display the volume of the current WorldEdit region.

//volume

### `//set <node>`
### `//set <node1> ...`

Set the current WorldEdit region to `<node>`.
Set the current WorldEdit region to a random mix of `<node1>`, `...`.

//set air
//set cactus
//set Bronze Block
//set cactus stone glass
//set Bronze
//set mesecons:wire_00000000_off

### `//replace <search node> <replace node>`
@@ -219,6 +219,13 @@ Stack the current WorldEdit region along the x/y/z/? axis `<count>` times.
//stack z +5
//stack ? 12

### `//stack2 <count> <x> <y> <z>`

Stack the current WorldEdit region `<count>` times by offset `<x>`, `<y>`, `<z>`.

//stack2 5 3 8 2
//stack2 1 -1 -1 -1

### `//scale <factor>`

Scale the current WorldEdit positions and region by a factor of positive integer `<factor>` with position 1 as the origin.
@@ -130,6 +130,21 @@ The WorldEdit Schematic format is accessed via the WorldEdit API, or WorldEdit s

The second is the Minetest Schematic format (MTS). The details of this format may be found in the Minetest documentation and are out of the scope of this document. Access to this format is done via specialized MTS commands such as `//mtschemcreate` and `//mtschemplace`.

Authors
-------
WorldEdit would not be possible without the contributions of many developers and designers. Below, they are listed alphabetically:

cheapie
cornernote
cyisfor
electricface
kaeza
khonkhortisan
sfan5
ShadowNinja
spillz
Uberi/Temperest

License
-------
Copyright 2013 sfan5, Anthony Zhang (Uberi/Temperest), and Brett O'Donnell (cornernote).
@@ -48,8 +48,16 @@ worldedit.set = function(pos1, pos2, nodenames)
for i,v in ipairs(nodenames) do
node_ids[i] = minetest.get_content_id(nodenames[i])
end
for i in area:iterp(pos1, pos2) do
nodes[i] = node_ids[math.random(#node_ids)]
if #node_ids == 1 then --only one type of node
local id = node_ids[1]
for i in area:iterp(pos1, pos2) do
nodes[i] = node_ids[id]
end
else --fill randomly with all types of specified nodes
local id_count, rand = #node_ids, math.random
for i in area:iterp(pos1, pos2) do
nodes[i] = node_ids[rand(id_count)]
end
end

--update map nodes
@@ -173,126 +181,126 @@ worldedit.copy = function(pos1, pos2, axis, amount) --wip: replace the old versi
end

worldedit.copy2 = function(pos1, pos2, direction, volume)
-- the overlap shouldn't matter as long as we
-- 1) start at the furthest separated corner
-- 2) complete an edge before moving inward, either edge works
-- 3) complete a face before moving inward, similarly
--
-- to do this I
-- 1) find the furthest destination in the direction, of each axis
-- 2) call those the furthest separated corner
-- 3) make sure to iterate inward from there
-- 4) nested loop to make sure complete edge, complete face, then complete cube.
-- the overlap shouldn't matter as long as we
-- 1) start at the furthest separated corner
-- 2) complete an edge before moving inward, either edge works
-- 3) complete a face before moving inward, similarly
--
-- to do this I
-- 1) find the furthest destination in the direction, of each axis
-- 2) call those the furthest separated corner
-- 3) make sure to iterate inward from there
-- 4) nested loop to make sure complete edge, complete face, then complete cube.

local get_node, get_meta, add_node = minetest.get_node, minetest.get_meta, minetest.add_node
local somemeta = get_meta(pos1) -- hax lol
local to_table = somemeta.to_table
local from_table = somemeta.from_table
somemeta = nil
local somemeta = get_meta(pos1) -- hax lol
local to_table = somemeta.to_table
local from_table = somemeta.from_table
somemeta = nil

local pos1, pos2 = worldedit.sort_pos(pos1, pos2)
local manip = minetest.get_voxel_manip()
manip:read_from_map(pos1, pos2)

local sx,sy,sz -- direction sign
local ix,iy,iz -- initial destination
local ex,ey,ez -- final destination
local originalx,originaly,originalz -- source
-- vim -> :'<,'>s/\<\([ioes]\?\)x\>/\1y/g
if direction.x > 0 then
originalx = pos2.x
ix = originalx + direction.x
ex = pos1.x + direction.x
sx = -1
elseif direction.x < 0 then
originalx = pos1.x
ix = originalx + direction.x
ex = pos2.x + direction.x
sx = 1
else
originalx = pos1.x
ix = originalx -- whatever
ex = pos2.x
sx = 1
end
local sx, sy, sz -- direction sign
local ix, iy, iz -- initial destination
local ex, ey, ez -- final destination
local originalx, originaly, originalz -- source
-- vim -> :'<,'>s/\<\([ioes]\?\)x\>/\1y/g
if direction.x > 0 then
originalx = pos2.x
ix = originalx + direction.x
ex = pos1.x + direction.x
sx = -1
elseif direction.x < 0 then
originalx = pos1.x
ix = originalx + direction.x
ex = pos2.x + direction.x
sx = 1
else
originalx = pos1.x
ix = originalx -- whatever
ex = pos2.x
sx = 1
end

if direction.y > 0 then
originaly = pos2.y
iy = originaly + direction.y
ey = pos1.y + direction.y
sy = -1
elseif direction.y < 0 then
originaly = pos1.y
iy = originaly + direction.y
ey = pos2.y + direction.y
sy = 1
else
originaly = pos1.y
iy = originaly -- whatever
ey = pos2.y
sy = 1
end
if direction.y > 0 then
originaly = pos2.y
iy = originaly + direction.y
ey = pos1.y + direction.y
sy = -1
elseif direction.y < 0 then
originaly = pos1.y
iy = originaly + direction.y
ey = pos2.y + direction.y
sy = 1
else
originaly = pos1.y
iy = originaly -- whatever
ey = pos2.y
sy = 1
end

if direction.z > 0 then
originalz = pos2.z
iz = originalz + direction.z
ez = pos1.z + direction.z
sz = -1
elseif direction.z < 0 then
originalz = pos1.z
iz = originalz + direction.z
ez = pos2.z + direction.z
sz = 1
else
originalz = pos1.z
iz = originalz -- whatever
ez = pos2.z
sz = 1
end
-- print('copy',originalx,ix,ex,sx,originaly,iy,ey,sy,originalz,iz,ez,sz)

local ox,oy,oz

ox = originalx
for x = ix,ex,sx do
oy = originaly
for y = iy,ey,sy do
oz = originalz
for z = iz,ez,sz do
-- reusing pos1/pos2 as source/dest here
pos1.x = ox; pos1.y = oy; pos1.z = oz
pos2.x = x; pos2.y = y; pos2.z = z
local node = get_node(pos1)
if direction.z > 0 then
originalz = pos2.z
iz = originalz + direction.z
ez = pos1.z + direction.z
sz = -1
elseif direction.z < 0 then
originalz = pos1.z
iz = originalz + direction.z
ez = pos2.z + direction.z
sz = 1
else
originalz = pos1.z
iz = originalz -- whatever
ez = pos2.z
sz = 1
end
-- print('copy',originalx,ix,ex,sx,originaly,iy,ey,sy,originalz,iz,ez,sz)

local ox,oy,oz

ox = originalx
for x = ix, ex, sx do
oy = originaly
for y = iy, ey, sy do
oz = originalz
for z = iz, ez, sz do
-- reusing pos1/pos2 as source/dest here
pos1.x, pos1.y, pos1.z = ox, oy, oz
pos2.x, pos2.y, pos2.z = x, y, z
local node = get_node(pos1)
local meta = to_table(get_meta(pos1)) --get meta of current node
add_node(pos2,node)
from_table(get_meta(pos2),meta)
oz = oz + sz
end
oy = oy + sy
end
ox = ox + sx
end
end

worldedit.stack2 = function(pos1, pos2, direction, amount, finished)
local i = 0
local translated = {x=0,y=0,z=0}
local function nextone()
if i <= amount then
i = i + 1
translated.x = translated.x + direction.x
translated.y = translated.y + direction.y
translated.z = translated.z + direction.z
worldedit.copy2(pos1,pos2,translated,volume)
minetest.after(0,nextone)
else
if finished then
finished()
end
end
end
nextone()
return nil
add_node(pos2,node)
from_table(get_meta(pos2),meta)
oz = oz + sz
end
oy = oy + sy
end
ox = ox + sx
end
end

worldedit.stack2 = function(pos1, pos2, direction, amount, finished)
local i = 0
local translated = {x=0,y=0,z=0}
local function nextone()
if i <= amount then
i = i + 1
translated.x = translated.x + direction.x
translated.y = translated.y + direction.y
translated.z = translated.z + direction.z
worldedit.copy2(pos1, pos2, translated, volume)
minetest.after(0, nextone)
else
if finished then
finished()
end
end
end
nextone()
return nil
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
@@ -279,19 +279,18 @@ minetest.register_chatcommand("/volume", {
})

minetest.register_chatcommand("/set", {
params = "<node>",
description = "Set the current WorldEdit region to <node>",
params = "<node1> ...",
description = "Set the current WorldEdit region to a random mix of <node1>, ...",
privs = {worldedit=true},
func = safe_region(function(name, param)
local nodes = {}

for nodename in param:gmatch("[^%s]+") do
local node = get_node(name, nodename)
if not node then
worldedit.player_notify(name, 'Could not identify node "'..name..'"')
worldedit.player_notify(name, "Could not identify node \"" .. name .. "\"")
return
end
nodes[#nodes+1] = node
nodes[#nodes + 1] = node
end

local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
@@ -620,47 +619,37 @@ minetest.register_chatcommand("/stack", {
})

minetest.register_chatcommand("/stack2", {
params = "<count> <x>/<y>/<z>",
description = "Stack the current WorldEdit region <count> times translating each time by x, y and z in the respective directions.",
params = "<count> <x> <y> <z>",
description = "Stack the current WorldEdit region <count> times by offset <x>, <y>, <z>",
privs = {worldedit=true},
func = function(name, param)
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
if pos1 == nil or pos2 == nil then
worldedit.player_notify(name, "Select a position first!")
worldedit.player_notify(name, "Select a position first!")
return
end
local repetitions, incs = param:match("([0-9]+)%s*(.+)")
repetitions = repetitions and tonumber(repetitions)
local repetitions, incs = param:match("(%d+)%s*(.+)")
if repetitions == nil then
worldedit.player_notify(name, "invalid count: " .. param)
return
return
end
repetitions = tonumber(repetitions)

local x,y,z = incs:match("(.+)/(.+)/(.+)")
local x, y, z = incs:match("([+-]?%d+) ([+-]%d+) ([+-]%d+)")
if x == nil then
worldedit.player_notify(name, "invalid increments: " .. param)
return
end
x = tonumber(x)
y = tonumber(y)
z = tonumber(z)
if x == nil or y == nil or z == nil then
worldedit.player_notify(name, "increments must be numbers: " .. param)
return
end
x, y, z = tonumber(x), tonumber(y), tonumber(z)

local count = worldedit.volume(pos1,pos2) * repetitions
local count = worldedit.volume(pos1, pos2) * repetitions

return safe_region(function()
worldedit.stack2(pos1, pos2, {x=x,y=y,z=z}, repetitions,
function()
worldedit.player_notify(name, count .. " nodes stacked")
end)

end,
function()
return count
end)(name,param) -- more hax
worldedit.stack2(pos1, pos2, {x=x, y=y, z=z}, repetitions,
function() worldedit.player_notify(name, count .. " nodes stacked") end)
end, function()
return count
end)(name,param) -- more hax
end
})

0 comments on commit 175ac21

Please sign in to comment.
You can’t perform that action at this time.