@@ 7,6 7,17 @@ minetest.register_privilege("extruder")
-- TODO look into integrating with stuff like worldedit undo
+local function meta_get_amount(meta)
+ return math.max(1, meta:get_int("amount"))
+end
+
+local function meta_set_amount(meta, amount)
+ if (not amount) or (amount < 1) then amount = 1 end
+ meta:set_int("amount", amount)
+ return amount
+end
+
+
local function visit_wrapped(visited, to_visit, direction, neighbors)
local pos = table.remove(to_visit)
while pos do
@@ 28,7 39,7 @@ local function visit_wrapped(visited, to_visit, direction, neighbors)
end
local function visit(pos, direction, meta)
- local diagonal = meta:get_int("diagonal") == 1
+ local diagonal = lib.meta_get_bool(meta, "diagonal")
local neighbors = lib.get_perpendiculars(direction)
if diagonal then
@@ 43,8 54,8 @@ local function visit(pos, direction, meta)
end
local function extrude(surface, direction, meta, remove)
- local amount = math.max(1, meta:get_int("amount"))
- local overwrite = meta:get_int("overwrite") == 1
+ local amount = meta_get_amount(meta)
+ local overwrite = lib.meta_get_bool(meta, "overwrite")
-- TODO use VoxelManip (and accumulate two of the bounding coordinates in visit()?)
-- or at least bulk_set_node
@@ 105,14 116,11 @@ minetest.register_tool(modname .. ":extruder", {
-- TODO add "only extrude/select nodes of the same type"
on_secondary_use = function(itemstack, placer, _)
local meta = itemstack:get_meta()
- local amount = math.max(1, meta:get_int("amount"))
- local overwrite = meta:get_int("overwrite") == 1
- local diagonal = meta:get_int("diagonal") == 1
minetest.show_formspec(placer:get_player_name(), modname .. ":settings",
string.format(settings_formspec,
- amount,
- overwrite and "true" or "false",
- diagonal and "true" or "false"
+ meta_get_amount(meta),
+ tostring(lib.meta_get_bool(meta, "overwrite")),
+ tostring(lib.meta_get_bool(meta, "diagonal"))
)
)
end,
@@ 132,26 140,27 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
local amount
if fields.amount then
amount = tonumber(fields.amount)
- if (not amount) or (amount < 1) then amount = 1 end
- meta:set_int("amount", amount)
+ -- We assign it back because meta_set_amount sanitizes the value too
+ amount = meta_set_amount(meta, amount)
else
- amount = math.max(1, meta:get_int("amount"))
+ amount = meta_get_amount(meta)
end
+ -- TODO do all the checkboxes in a loop
local overwrite
if fields.overwrite then
overwrite = fields.overwrite == "true"
- meta:set_int("overwrite", overwrite and 1 or 0)
+ lib.meta_set_bool(meta, "overwrite", overwrite)
else
- overwrite = meta:get_int("overwrite") == 1
+ overwrite = lib.meta_get_bool(meta, "overwrite")
end
local diagonal
if fields.diagonal then
diagonal = fields.diagonal == "true"
- meta:set_int("diagonal", diagonal and 1 or 0)
+ lib.meta_set_bool(meta, "diagonal", diagonal)
else
- diagonal = meta:get_int("diagonal") == 1
+ diagonal = lib.meta_get_bool(meta, "diagonal")
end
meta:set_string("count_meta", table.concat({
@@ 10,6 10,14 @@ function lib.check_privs_with_msg(player_or_name, privs)
return true
end
+-- https://github.com/minetest/minetest/pull/12894
+function lib.meta_get_bool(meta, name)
+ return minetest.is_yes(meta:get(name) or "true")
+end
+function lib.meta_set_bool(meta, name, value)
+ meta:set_string(name, value and "true" or "false")
+end
+
-- Get the four unit vectors parallel to axes
-- that are perpendicular to a given one (also parallel to an axis)
function lib.get_perpendiculars(vec)