* persist template metadata * composition tool * composition utils * wip * wip * use swap_node for handles * formspec * wip * set composition origin to first min-pos * composition duplication and we area * wallmounted replacement --------- Co-authored-by: BuckarooBanzay <BuckarooBanzay@users.noreply.github.com>
93 lines
2.8 KiB
Lua
93 lines
2.8 KiB
Lua
|
|
--- sorts the position by ascending order
|
|
-- @param pos1 @{node_pos} the first position
|
|
-- @param pos2 @{node_pos} the second position
|
|
-- @return @{node_pos} the lower position
|
|
-- @return @{node_pos} the upper position
|
|
function pick_and_place.sort_pos(pos1, pos2)
|
|
pos1 = {x=pos1.x, y=pos1.y, z=pos1.z}
|
|
pos2 = {x=pos2.x, y=pos2.y, z=pos2.z}
|
|
if pos1.x > pos2.x then
|
|
pos2.x, pos1.x = pos1.x, pos2.x
|
|
end
|
|
if pos1.y > pos2.y then
|
|
pos2.y, pos1.y = pos1.y, pos2.y
|
|
end
|
|
if pos1.z > pos2.z then
|
|
pos2.z, pos1.z = pos1.z, pos2.z
|
|
end
|
|
return pos1, pos2
|
|
end
|
|
|
|
function pick_and_place.get_formatted_size(pos1, pos2)
|
|
pos2 = pos2 or pos1
|
|
pos1, pos2 = pick_and_place.sort_pos(pos1, pos2)
|
|
return minetest.pos_to_string(vector.add(vector.subtract(pos2, pos1), 1))
|
|
end
|
|
|
|
function pick_and_place.create_id()
|
|
local template = "xxxxxx"
|
|
return string.gsub(template, '[x]', function ()
|
|
return string.format('%x', math.random(0, 0xf))
|
|
end)
|
|
end
|
|
|
|
-- returns the outer corners for the handle nodes
|
|
function pick_and_place.get_outer_corners(pos1, pos2)
|
|
pos1, pos2 = pick_and_place.sort_pos(pos1, pos2)
|
|
pos1 = vector.subtract(pos1, 1)
|
|
pos2 = vector.add(pos2, 1)
|
|
|
|
return {
|
|
{ x=pos1.x, y=pos1.y, z=pos1.z },
|
|
{ x=pos1.x, y=pos1.y, z=pos2.z },
|
|
{ x=pos1.x, y=pos2.y, z=pos1.z },
|
|
{ x=pos1.x, y=pos2.y, z=pos2.z },
|
|
{ x=pos2.x, y=pos1.y, z=pos1.z },
|
|
{ x=pos2.x, y=pos1.y, z=pos2.z },
|
|
{ x=pos2.x, y=pos2.y, z=pos1.z },
|
|
{ x=pos2.x, y=pos2.y, z=pos2.z }
|
|
}
|
|
end
|
|
|
|
|
|
function pick_and_place.get_replacement_nodeid(ctx, metadata)
|
|
local group = metadata.fields.group
|
|
local selected_name
|
|
if group and group ~= "" and ctx[group] then
|
|
-- group placement
|
|
selected_name = metadata.inventory.main[ctx[group]]
|
|
else
|
|
-- random placement
|
|
local replacement_names = {}
|
|
for _, name in ipairs(metadata.inventory.main) do
|
|
if name ~= "" then
|
|
table.insert(replacement_names, name)
|
|
end
|
|
end
|
|
|
|
if #replacement_names == 0 then
|
|
-- no replacement
|
|
return
|
|
end
|
|
|
|
local i = math.random(#replacement_names)
|
|
selected_name = replacement_names[i]
|
|
|
|
-- set group context
|
|
if group and group ~= "" then
|
|
ctx[group] = i
|
|
end
|
|
end
|
|
|
|
local stack = ItemStack(selected_name)
|
|
local nodename = stack:get_name()
|
|
|
|
if not minetest.registered_nodes[nodename] then
|
|
-- node not found
|
|
return
|
|
end
|
|
|
|
local nodeid = minetest.get_content_id(nodename)
|
|
return nodeid
|
|
end |