diff --git a/README.md b/README.md index cc40630..a52d96a 100644 --- a/README.md +++ b/README.md @@ -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 ` 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 ------- 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 with in the current WorldEdi //replace dirt flowers:flower_waterlily //replace flowers:flower_rose flowers:flower_tulip -### //hollowcylinder x/y/z +### //hollowcylinder x/y/z/? -Add hollow cylinder at WorldEdit position 1 along the x/y/z axis with length and radius , composed of . +Add hollow cylinder at WorldEdit position 1 along the x/y/z/? axis with length and radius , composed of . //hollowcylinder x +5 8 dirt //hollowcylinder y 28 10 default:glass //hollowcylinder z -12 3 mesecons:mesecon + //hollowcylinder ? 2 4 stone -### //cylinder x/y/z +### //cylinder x/y/z/? -Add cylinder at WorldEdit position 1 along the x/y/z axis with length and radius , composed of . +Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length and radius , composed of . //cylinder x +5 8 dirt //cylinder y 28 10 default:glass //cylinder z -12 3 mesecons:mesecon + //cylinder ? 2 4 stone -### //copy x/y/z +### //copy x/y/z/? -Copy the current WorldEdit region along the x/y/z axis by nodes. +Copy the current WorldEdit region along the x/y/z/? axis by nodes. //copy x 15 //copy y -7 //copy z +4 + //copy ? 8 -### //move x/y/z +### //move x/y/z/? -Move the current WorldEdit region along the x/y/z axis by nodes. +Move the current WorldEdit region along the x/y/z/? axis by nodes. //move x 15 //move y -7 //move z +4 + //move ? -1 -### //stack x/y/z +### //stack x/y/z/? -Stack the current WorldEdit region along the x/y/z axis times. +Stack the current WorldEdit region along the x/y/z/? axis times. //stack x 3 //stack y -1 //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 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 y //flip z + //flip ? ### //rotate diff --git a/init.lua b/init.lua index eae615b..10d03b8 100644 --- a/init.lua +++ b/init.lua @@ -16,6 +16,18 @@ worldedit.node_is_valid = function(temp_pos, nodename) or minetest.registered_nodes["default:" .. nodename] ~= nil 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", { params = "", description = "Reset the region so that it is empty", @@ -176,8 +188,8 @@ minetest.register_chatcommand("/replace", { }) minetest.register_chatcommand("/hollowcylinder", { - params = "x/y/z ", - description = "Add hollow cylinder at WorldEdit position 1 along the x/y/z axis with length and radius , composed of ", + params = "x/y/z/? ", + description = "Add hollow cylinder at WorldEdit position 1 along the x/y/z/? axis with length and radius , composed of ", privs = {worldedit=true}, func = function(name, param) local pos = worldedit.pos1[name] @@ -186,11 +198,14 @@ minetest.register_chatcommand("/hollowcylinder", { return 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 minetest.chat_send_player(name, "Invalid usage: " .. param) return end + if axis == "?" then + axis = worldedit.player_axis(name) + end if not worldedit.node_is_valid(pos, nodename) then minetest.chat_send_player(name, "Invalid node name: " .. param) return @@ -202,8 +217,8 @@ minetest.register_chatcommand("/hollowcylinder", { }) minetest.register_chatcommand("/cylinder", { - params = "x/y/z ", - description = "Add cylinder at WorldEdit position 1 along the x/y/z axis with length and radius , composed of ", + params = "x/y/z/? ", + description = "Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length and radius , composed of ", privs = {worldedit=true}, func = function(name, param) local pos = worldedit.pos1[name] @@ -212,11 +227,14 @@ minetest.register_chatcommand("/cylinder", { return 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 minetest.chat_send_player(name, "Invalid usage: " .. param) return end + if axis == "?" then + axis = worldedit.player_axis(name) + end if not worldedit.node_is_valid(pos, nodename) then minetest.chat_send_player(name, "Invalid node name: " .. param) return @@ -228,8 +246,8 @@ minetest.register_chatcommand("/cylinder", { }) minetest.register_chatcommand("/copy", { - params = "x/y/z ", - description = "Copy the current WorldEdit region along the x/y/z axis by nodes", + params = "x/y/z/? ", + description = "Copy the current WorldEdit region along the x/y/z/? axis by nodes", privs = {worldedit=true}, func = function(name, param) local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] @@ -238,11 +256,14 @@ minetest.register_chatcommand("/copy", { return end - local found, _, axis, amount = param:find("^([xyz])%s+([+-]?%d+)$") + local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") if found == nil then minetest.chat_send_player(name, "Invalid usage: " .. param) return end + if axis == "?" then + axis = worldedit.player_axis(name) + end local count = worldedit.copy(pos1, pos2, axis, tonumber(amount)) minetest.chat_send_player(name, count .. " nodes copied") @@ -250,8 +271,8 @@ minetest.register_chatcommand("/copy", { }) minetest.register_chatcommand("/move", { - params = "x/y/z ", - description = "Move the current WorldEdit region along the x/y/z axis by nodes", + params = "x/y/z/? ", + description = "Move the current WorldEdit region along the x/y/z/? axis by nodes", privs = {worldedit=true}, func = function(name, param) local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] @@ -260,11 +281,14 @@ minetest.register_chatcommand("/move", { return end - local found, _, axis, amount = param:find("^([xyz])%s+([+-]?%d+)$") + local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") if found == nil then minetest.chat_send_player(name, "Invalid usage: " .. param) return end + if axis == "?" then + axis = worldedit.player_axis(name) + end local count = worldedit.move(pos1, pos2, axis, tonumber(amount)) minetest.chat_send_player(name, count .. " nodes moved") @@ -272,8 +296,8 @@ minetest.register_chatcommand("/move", { }) minetest.register_chatcommand("/stack", { - params = "x/y/z ", - description = "Stack the current WorldEdit region along the x/y/z axis times", + params = "x/y/z/? ", + description = "Stack the current WorldEdit region along the x/y/z/? axis times", privs = {worldedit=true}, func = function(name, param) local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] @@ -282,11 +306,14 @@ minetest.register_chatcommand("/stack", { return end - local found, _, axis, count = param:find("^([xyz])%s+([+-]?%d+)$") + local found, _, axis, count = param:find("^([xyz%?])%s+([+-]?%d+)$") if found == nil then minetest.chat_send_player(name, "Invalid usage: " .. param) return end + if axis == "?" then + axis = worldedit.player_axis(name) + end local count = worldedit.stack(pos1, pos2, axis, tonumber(count)) minetest.chat_send_player(name, count .. " nodes stacked") @@ -294,8 +321,8 @@ minetest.register_chatcommand("/stack", { }) minetest.register_chatcommand("/transpose", { - params = "x/y/z x/y/z", - description = "Transpose the current WorldEdit region along the x/y/z and x/y/z axes", + params = "x/y/z/? x/y/z/?", + description = "Transpose the current WorldEdit region along the x/y/z/? and x/y/z/? axes", privs = {worldedit=true}, func = function(name, param) local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] @@ -304,11 +331,17 @@ minetest.register_chatcommand("/transpose", { return end - local found, _, axis1, axis2 = param:find("^([xyz])%s+([xyz])$") + local found, _, axis1, axis2 = param:find("^([xyz%?])%s+([xyz%?])$") if found == nil then minetest.chat_send_player(name, "Invalid usage: " .. param) return end + if axis1 == "?" then + axis1 = worldedit.player_axis(name) + end + if axis2 == "?" then + axis2 = worldedit.player_axis(name) + end if axis1 == axis2 then minetest.chat_send_player(name, "Invalid usage: axes are the same") return @@ -320,8 +353,8 @@ minetest.register_chatcommand("/transpose", { }) minetest.register_chatcommand("/flip", { - params = "x/y/z", - description = "Flip the current WorldEdit region along the x/y/z axis", + params = "x/y/z/?", + description = "Flip the current WorldEdit region along the x/y/z/? axis", privs = {worldedit=true}, func = function(name, param) local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] @@ -330,6 +363,9 @@ minetest.register_chatcommand("/flip", { return end + if param == "?" then + param = worldedit.player_axis(name) + end if param ~= "x" and param ~= "y" and param ~= "z" then minetest.chat_send_player(name, "Invalid usage: " .. param) return