Simplify deleteblocks chat command argument parsing
authorkwolekr <kwolekr@minetest.net>
Thu, 15 Jan 2015 23:03:43 +0000 (18:03 -0500)
committerkwolekr <kwolekr@minetest.net>
Thu, 15 Jan 2015 23:05:13 +0000 (18:05 -0500)
Add optional core.pos_to_string decimal place rounding
Move core.string_to_pos to builtin/common/misc_helpers.lua for consistency

builtin/common/misc_helpers.lua
builtin/game/chatcommands.lua
builtin/game/misc.lua

index a86631e1dc9b52c104d65881e5578def6ef14ab1..deeba788ea49ae551e62c6b7f550b0556f1479c7 100644 (file)
@@ -498,10 +498,47 @@ function core.explode_scrollbar_event(evt)
 end
 
 --------------------------------------------------------------------------------
-function core.pos_to_string(pos)
-       return "(" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ")"
+function core.pos_to_string(pos, decimal_places)
+       local x = pos.x
+       local y = pos.y
+       local z = pos.z
+       if decimal_places ~= nil then
+               x = string.format("%." .. decimal_places .. "f", x)
+               y = string.format("%." .. decimal_places .. "f", y)
+               z = string.format("%." .. decimal_places .. "f", z)
+       end
+       return "(" .. x .. "," .. y .. "," .. z .. ")"
+end
+
+--------------------------------------------------------------------------------
+function core.string_to_pos(value)
+       if value == nil then
+               return nil
+       end
+
+       local p = {}
+       p.x, p.y, p.z = string.match(value, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
+       if p.x and p.y and p.z then
+               p.x = tonumber(p.x)
+               p.y = tonumber(p.y)
+               p.z = tonumber(p.z)
+               return p
+       end
+       local p = {}
+       p.x, p.y, p.z = string.match(value, "^%( *([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+) *%)$")
+       if p.x and p.y and p.z then
+               p.x = tonumber(p.x)
+               p.y = tonumber(p.y)
+               p.z = tonumber(p.z)
+               return p
+       end
+       return nil
 end
 
+assert(core.string_to_pos("10.0, 5, -2").x == 10)
+assert(core.string_to_pos("( 10.0, 5, -2)").z == -2)
+assert(core.string_to_pos("asd, 5, -2)") == nil)
+
 --------------------------------------------------------------------------------
 function table.copy(t, seen)
        local n = {}
index 18b5dbe7264b5b97129724a1c47012dcc4f8eca9..8ce1cfef58b135c8da74eb089c3bda1ec887e16c 100644 (file)
@@ -419,24 +419,18 @@ core.register_chatcommand("deleteblocks", {
                        p1 = player:getpos()
                        p2 = p1
                else
-                       p1.x, p1.y, p1.z, p2.x, p2.y, p2.z = string.match(param,
-                               "^%(([%d.-]+), *([%d.-]+), *([%d.-]+)%) *%(([%d.-]+), *([%d.-]+), *([%d.-]+)%)$")
-                       p1.x = tonumber(p1.x)
-                       p1.y = tonumber(p1.y)
-                       p1.z = tonumber(p1.z)
-                       p2.x = tonumber(p2.x)
-                       p2.y = tonumber(p2.y)
-                       p2.z = tonumber(p2.z)
-
-                       if p1.x == nil or p1.y == nil or p1.z == nil or
-                               p2.x == nil or p2.y == nil or p2.z == nil then
+                       local pos1, pos2 = unpack(param:split(") ("))
+                       p1 = core.string_to_pos(pos1 .. ")")
+                       p2 = core.string_to_pos("(" .. pos2)
+
+                       if p1 == nil or p2 == nil then
                                return false, "Incorrect area format. Expected: (x1,y1,z1) (x2,y2,z2)"
                        end
                end
 
                if core.delete_area(p1, p2) then
                        return true, "Successfully cleared area ranging from " ..
-                               core.pos_to_string(p1) .. " to " .. core.pos_to_string(p2)
+                               core.pos_to_string(p1, 1) .. " to " .. core.pos_to_string(p2, 1)
                else
                        return false, "Failed to clear one or more blocks in area"
                end
index a392386f13cd53fba257b47f63d264b411174db1..c31df541d026977bff31ce3fee636ee3385ef4ba 100644 (file)
@@ -93,30 +93,6 @@ function core.get_node_group(name, group)
        return core.get_item_group(name, group)
 end
 
-function core.string_to_pos(value)
-       local p = {}
-       p.x, p.y, p.z = string.match(value, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$")
-       if p.x and p.y and p.z then
-               p.x = tonumber(p.x)
-               p.y = tonumber(p.y)
-               p.z = tonumber(p.z)
-               return p
-       end
-       local p = {}
-       p.x, p.y, p.z = string.match(value, "^%( *([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+) *%)$")
-       if p.x and p.y and p.z then
-               p.x = tonumber(p.x)
-               p.y = tonumber(p.y)
-               p.z = tonumber(p.z)
-               return p
-       end
-       return nil
-end
-
-assert(core.string_to_pos("10.0, 5, -2").x == 10)
-assert(core.string_to_pos("( 10.0, 5, -2)").z == -2)
-assert(core.string_to_pos("asd, 5, -2)") == nil)
-
 function core.setting_get_pos(name)
        local value = core.setting_get(name)
        if not value then