Add the ? axis, which represents the axis the player is facing.

This commit is contained in:
Anthony Zhang 2012-08-18 14:43:12 -04:00
parent 66c7f1fb96
commit 5b66b5ec25
2 changed files with 85 additions and 34 deletions

View File

@ -12,6 +12,14 @@ WorldEdit has a huge potential for abuse by untrusted players. Therefore, users
For in-game information about these commands, type `/help <command name>` in the chat. For example, to learn more about the `//copy` command, simply type `/help /copy` to display information relevant to copying a region. For in-game information about these commands, type `/help <command name>` in the chat. For example, to learn more about the `//copy` command, simply type `/help /copy` to display information relevant to copying a region.
Axes
----
The coordinate system is the same as that used by MineTest; Y is upwards, X is perpendicular, and Z is parallel.
When an axis is specified in a WorldEdit command, it is specified as one of the following values: x, y, z, or ?.
The value ? represents the axis the player is currently facing. If the player is facing more than one axis, the axis the player face direction is closest to will be used.
Regions Regions
------- -------
Most WorldEdit commands operate on regions. Regions are a set of two positions that define a 3D cube. They are local to each player and chat commands affect only the region for the player giving the commands. Most WorldEdit commands operate on regions. Regions are a set of two positions that define a 3D cube. They are local to each player and chat commands affect only the region for the player giving the commands.
@ -83,61 +91,68 @@ Replace all instances of <search node> with <place node> in the current WorldEdi
//replace dirt flowers:flower_waterlily //replace dirt flowers:flower_waterlily
//replace flowers:flower_rose flowers:flower_tulip //replace flowers:flower_rose flowers:flower_tulip
### //hollowcylinder x/y/z <length> <radius> <node> ### //hollowcylinder x/y/z/? <length> <radius> <node>
Add hollow cylinder at WorldEdit position 1 along the x/y/z axis with length <length> and radius <radius>, composed of <node>. Add hollow cylinder at WorldEdit position 1 along the x/y/z/? axis with length <length> and radius <radius>, composed of <node>.
//hollowcylinder x +5 8 dirt //hollowcylinder x +5 8 dirt
//hollowcylinder y 28 10 default:glass //hollowcylinder y 28 10 default:glass
//hollowcylinder z -12 3 mesecons:mesecon //hollowcylinder z -12 3 mesecons:mesecon
//hollowcylinder ? 2 4 stone
### //cylinder x/y/z <length> <radius> <node> ### //cylinder x/y/z/? <length> <radius> <node>
Add cylinder at WorldEdit position 1 along the x/y/z axis with length <length> and radius <radius>, composed of <node>. Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length <length> and radius <radius>, composed of <node>.
//cylinder x +5 8 dirt //cylinder x +5 8 dirt
//cylinder y 28 10 default:glass //cylinder y 28 10 default:glass
//cylinder z -12 3 mesecons:mesecon //cylinder z -12 3 mesecons:mesecon
//cylinder ? 2 4 stone
### //copy x/y/z <amount> ### //copy x/y/z/? <amount>
Copy the current WorldEdit region along the x/y/z axis by <amount> nodes. Copy the current WorldEdit region along the x/y/z/? axis by <amount> nodes.
//copy x 15 //copy x 15
//copy y -7 //copy y -7
//copy z +4 //copy z +4
//copy ? 8
### //move x/y/z <amount> ### //move x/y/z/? <amount>
Move the current WorldEdit region along the x/y/z axis by <amount> nodes. Move the current WorldEdit region along the x/y/z/? axis by <amount> nodes.
//move x 15 //move x 15
//move y -7 //move y -7
//move z +4 //move z +4
//move ? -1
### //stack x/y/z <count> ### //stack x/y/z/? <count>
Stack the current WorldEdit region along the x/y/z axis <count> times. Stack the current WorldEdit region along the x/y/z/? axis <count> times.
//stack x 3 //stack x 3
//stack y -1 //stack y -1
//stack z +5 //stack z +5
//stack ? 12
### //transpose x/y/z x/y/z ### //transpose x/y/z/? x/y/z/?
Transpose the current WorldEdit region along the x/y/z and x/y/z axes. Transpose the current WorldEdit region along the x/y/z/? and x/y/z/? axes.
//transpose x y //transpose x y
//transpose x z //transpose x z
//transpose y z //transpose y z
//transpose ? y
### //flip x/y/z ### //flip x/y/z/?
Flip the current WorldEdit region along the x/y/z axis. Flip the current WorldEdit region along the x/y/z/? axis.
//flip x //flip x
//flip y //flip y
//flip z //flip z
//flip ?
### //rotate ### //rotate

View File

@ -16,6 +16,18 @@ worldedit.node_is_valid = function(temp_pos, nodename)
or minetest.registered_nodes["default:" .. nodename] ~= nil or minetest.registered_nodes["default:" .. nodename] ~= nil
end end
worldedit.player_axis = function(name)
local dir = minetest.env:get_player_by_name(name):get_look_dir()
if dir.x > dir.y then
if dir.x > dir.z then
return "x"
end
elseif dir.y > dir.z then
return "y"
end
return "z"
end
minetest.register_chatcommand("/reset", { minetest.register_chatcommand("/reset", {
params = "", params = "",
description = "Reset the region so that it is empty", description = "Reset the region so that it is empty",
@ -176,8 +188,8 @@ minetest.register_chatcommand("/replace", {
}) })
minetest.register_chatcommand("/hollowcylinder", { minetest.register_chatcommand("/hollowcylinder", {
params = "x/y/z <length> <radius> <node>", params = "x/y/z/? <length> <radius> <node>",
description = "Add hollow cylinder at WorldEdit position 1 along the x/y/z axis with length <length> and radius <radius>, composed of <node>", description = "Add hollow cylinder at WorldEdit position 1 along the x/y/z/? axis with length <length> and radius <radius>, composed of <node>",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) func = function(name, param)
local pos = worldedit.pos1[name] local pos = worldedit.pos1[name]
@ -186,11 +198,14 @@ minetest.register_chatcommand("/hollowcylinder", {
return return
end end
local found, _, axis, length, radius, nodename = param:find("^([xyz])%s+([+-]?%d+)%s+(%d+)%s+([^%s]+)$") local found, _, axis, length, radius, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+([^%s]+)$")
if found == nil then if found == nil then
minetest.chat_send_player(name, "Invalid usage: " .. param) minetest.chat_send_player(name, "Invalid usage: " .. param)
return return
end end
if axis == "?" then
axis = worldedit.player_axis(name)
end
if not worldedit.node_is_valid(pos, nodename) then if not worldedit.node_is_valid(pos, nodename) then
minetest.chat_send_player(name, "Invalid node name: " .. param) minetest.chat_send_player(name, "Invalid node name: " .. param)
return return
@ -202,8 +217,8 @@ minetest.register_chatcommand("/hollowcylinder", {
}) })
minetest.register_chatcommand("/cylinder", { minetest.register_chatcommand("/cylinder", {
params = "x/y/z <length> <radius> <node>", params = "x/y/z/? <length> <radius> <node>",
description = "Add cylinder at WorldEdit position 1 along the x/y/z axis with length <length> and radius <radius>, composed of <node>", description = "Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length <length> and radius <radius>, composed of <node>",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) func = function(name, param)
local pos = worldedit.pos1[name] local pos = worldedit.pos1[name]
@ -212,11 +227,14 @@ minetest.register_chatcommand("/cylinder", {
return return
end end
local found, _, axis, length, radius, nodename = param:find("^([xyz])%s+([+-]?%d+)%s+(%d+)%s+([^%s]+)$") local found, _, axis, length, radius, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+([^%s]+)$")
if found == nil then if found == nil then
minetest.chat_send_player(name, "Invalid usage: " .. param) minetest.chat_send_player(name, "Invalid usage: " .. param)
return return
end end
if axis == "?" then
axis = worldedit.player_axis(name)
end
if not worldedit.node_is_valid(pos, nodename) then if not worldedit.node_is_valid(pos, nodename) then
minetest.chat_send_player(name, "Invalid node name: " .. param) minetest.chat_send_player(name, "Invalid node name: " .. param)
return return
@ -228,8 +246,8 @@ minetest.register_chatcommand("/cylinder", {
}) })
minetest.register_chatcommand("/copy", { minetest.register_chatcommand("/copy", {
params = "x/y/z <amount>", params = "x/y/z/? <amount>",
description = "Copy the current WorldEdit region along the x/y/z axis by <amount> nodes", description = "Copy the current WorldEdit region along the x/y/z/? axis by <amount> nodes",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) func = function(name, param)
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
@ -238,11 +256,14 @@ minetest.register_chatcommand("/copy", {
return return
end end
local found, _, axis, amount = param:find("^([xyz])%s+([+-]?%d+)$") local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$")
if found == nil then if found == nil then
minetest.chat_send_player(name, "Invalid usage: " .. param) minetest.chat_send_player(name, "Invalid usage: " .. param)
return return
end end
if axis == "?" then
axis = worldedit.player_axis(name)
end
local count = worldedit.copy(pos1, pos2, axis, tonumber(amount)) local count = worldedit.copy(pos1, pos2, axis, tonumber(amount))
minetest.chat_send_player(name, count .. " nodes copied") minetest.chat_send_player(name, count .. " nodes copied")
@ -250,8 +271,8 @@ minetest.register_chatcommand("/copy", {
}) })
minetest.register_chatcommand("/move", { minetest.register_chatcommand("/move", {
params = "x/y/z <amount>", params = "x/y/z/? <amount>",
description = "Move the current WorldEdit region along the x/y/z axis by <amount> nodes", description = "Move the current WorldEdit region along the x/y/z/? axis by <amount> nodes",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) func = function(name, param)
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
@ -260,11 +281,14 @@ minetest.register_chatcommand("/move", {
return return
end end
local found, _, axis, amount = param:find("^([xyz])%s+([+-]?%d+)$") local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$")
if found == nil then if found == nil then
minetest.chat_send_player(name, "Invalid usage: " .. param) minetest.chat_send_player(name, "Invalid usage: " .. param)
return return
end end
if axis == "?" then
axis = worldedit.player_axis(name)
end
local count = worldedit.move(pos1, pos2, axis, tonumber(amount)) local count = worldedit.move(pos1, pos2, axis, tonumber(amount))
minetest.chat_send_player(name, count .. " nodes moved") minetest.chat_send_player(name, count .. " nodes moved")
@ -272,8 +296,8 @@ minetest.register_chatcommand("/move", {
}) })
minetest.register_chatcommand("/stack", { minetest.register_chatcommand("/stack", {
params = "x/y/z <count>", params = "x/y/z/? <count>",
description = "Stack the current WorldEdit region along the x/y/z axis <count> times", description = "Stack the current WorldEdit region along the x/y/z/? axis <count> times",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) func = function(name, param)
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
@ -282,11 +306,14 @@ minetest.register_chatcommand("/stack", {
return return
end end
local found, _, axis, count = param:find("^([xyz])%s+([+-]?%d+)$") local found, _, axis, count = param:find("^([xyz%?])%s+([+-]?%d+)$")
if found == nil then if found == nil then
minetest.chat_send_player(name, "Invalid usage: " .. param) minetest.chat_send_player(name, "Invalid usage: " .. param)
return return
end end
if axis == "?" then
axis = worldedit.player_axis(name)
end
local count = worldedit.stack(pos1, pos2, axis, tonumber(count)) local count = worldedit.stack(pos1, pos2, axis, tonumber(count))
minetest.chat_send_player(name, count .. " nodes stacked") minetest.chat_send_player(name, count .. " nodes stacked")
@ -294,8 +321,8 @@ minetest.register_chatcommand("/stack", {
}) })
minetest.register_chatcommand("/transpose", { minetest.register_chatcommand("/transpose", {
params = "x/y/z x/y/z", params = "x/y/z/? x/y/z/?",
description = "Transpose the current WorldEdit region along the x/y/z and x/y/z axes", description = "Transpose the current WorldEdit region along the x/y/z/? and x/y/z/? axes",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) func = function(name, param)
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
@ -304,11 +331,17 @@ minetest.register_chatcommand("/transpose", {
return return
end end
local found, _, axis1, axis2 = param:find("^([xyz])%s+([xyz])$") local found, _, axis1, axis2 = param:find("^([xyz%?])%s+([xyz%?])$")
if found == nil then if found == nil then
minetest.chat_send_player(name, "Invalid usage: " .. param) minetest.chat_send_player(name, "Invalid usage: " .. param)
return return
end end
if axis1 == "?" then
axis1 = worldedit.player_axis(name)
end
if axis2 == "?" then
axis2 = worldedit.player_axis(name)
end
if axis1 == axis2 then if axis1 == axis2 then
minetest.chat_send_player(name, "Invalid usage: axes are the same") minetest.chat_send_player(name, "Invalid usage: axes are the same")
return return
@ -320,8 +353,8 @@ minetest.register_chatcommand("/transpose", {
}) })
minetest.register_chatcommand("/flip", { minetest.register_chatcommand("/flip", {
params = "x/y/z", params = "x/y/z/?",
description = "Flip the current WorldEdit region along the x/y/z axis", description = "Flip the current WorldEdit region along the x/y/z/? axis",
privs = {worldedit=true}, privs = {worldedit=true},
func = function(name, param) func = function(name, param)
local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name]
@ -330,6 +363,9 @@ minetest.register_chatcommand("/flip", {
return return
end end
if param == "?" then
param = worldedit.player_axis(name)
end
if param ~= "x" and param ~= "y" and param ~= "z" then if param ~= "x" and param ~= "y" and param ~= "z" then
minetest.chat_send_player(name, "Invalid usage: " .. param) minetest.chat_send_player(name, "Invalid usage: " .. param)
return return