132 lines
4.4 KiB
Lua
132 lines
4.4 KiB
Lua
local formname = "building_lib_autoplacer_configure"
|
|
|
|
local function get_autoplacer_list()
|
|
local autoplacer_list = {}
|
|
for name in pairs(building_lib.get_autoplacers()) do
|
|
table.insert(autoplacer_list, name)
|
|
end
|
|
table.sort(autoplacer_list, function(a,b) return a < b end)
|
|
return autoplacer_list
|
|
end
|
|
|
|
local function get_formspec(itemstack)
|
|
local meta = itemstack:get_meta()
|
|
local autoplacer_list = get_autoplacer_list()
|
|
|
|
local selected_autoplacer_name = meta:get_string("autoplacer_name")
|
|
if not selected_autoplacer_name or selected_autoplacer_name == "" then
|
|
selected_autoplacer_name = autoplacer_list[1]
|
|
end
|
|
|
|
local selected_autoplacer = 1
|
|
local textlist = ""
|
|
|
|
for i, autoplacer_name in ipairs(autoplacer_list) do
|
|
if selected_autoplacer_name == autoplacer_name then
|
|
selected_autoplacer = i
|
|
end
|
|
|
|
textlist = textlist .. autoplacer_name
|
|
if i < #autoplacer_list then
|
|
textlist = textlist .. ","
|
|
end
|
|
end
|
|
|
|
return "size[8,7;]" ..
|
|
"textlist[0,0.1;8,6;autoplacer_name;" .. textlist .. ";" .. selected_autoplacer .. "]" ..
|
|
"button_exit[0.1,6.5;8,1;back;Back]"
|
|
end
|
|
|
|
minetest.register_on_player_receive_fields(function(player, f, fields)
|
|
if not minetest.check_player_privs(player, { mapblock_lib = true }) then
|
|
return
|
|
end
|
|
if formname ~= f then
|
|
return
|
|
end
|
|
if fields.quit then
|
|
return
|
|
end
|
|
|
|
if fields.autoplacer_name then
|
|
local parts = fields.autoplacer_name:split(":")
|
|
if parts[1] == "CHG" then
|
|
local itemstack = player:get_wielded_item()
|
|
local meta = itemstack:get_meta()
|
|
|
|
local selected = tonumber(parts[2])
|
|
local autoplacer_list = get_autoplacer_list()
|
|
|
|
local autoplacer_name = autoplacer_list[selected]
|
|
if not autoplacer_name then
|
|
return
|
|
end
|
|
|
|
meta:set_string("autoplacer_name", autoplacer_name)
|
|
meta:set_string("description", "Selected autoplacer: '" .. autoplacer_name .. "'")
|
|
player:set_wielded_item(itemstack)
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.register_tool("building_lib:autoplace", {
|
|
description = "building_lib autoplacer",
|
|
inventory_image = "building_lib_autoplace.png^[colorize:#00ff00",
|
|
stack_max = 1,
|
|
range = 0,
|
|
on_secondary_use = function(itemstack, player)
|
|
minetest.show_formspec(player:get_player_name(), formname, get_formspec(itemstack))
|
|
end,
|
|
on_use = function(itemstack, player)
|
|
local meta = itemstack:get_meta()
|
|
local playername = player:get_player_name()
|
|
local autoplacer_name = meta:get_string("autoplacer_name")
|
|
local pointed_mapblock_pos = building_lib.get_pointed_mapblock(player)
|
|
local success, err = building_lib.autoplace(pointed_mapblock_pos, playername, autoplacer_name, true)
|
|
if not success then
|
|
minetest.chat_send_player(playername, err)
|
|
end
|
|
end,
|
|
on_step = function(itemstack, player)
|
|
local playername = player:get_player_name()
|
|
local mapblock_pos1 = building_lib.get_pointed_mapblock(player)
|
|
local meta = itemstack:get_meta()
|
|
local autoplacer_name = meta:get_string("autoplacer_name")
|
|
|
|
local success, building_name, rotation = building_lib.can_autoplace(mapblock_pos1, playername, autoplacer_name)
|
|
if not success then
|
|
building_lib.clear_preview(playername)
|
|
return
|
|
end
|
|
|
|
local building_def = building_lib.get_building(building_name)
|
|
if not building_def then
|
|
building_lib.clear_preview(playername)
|
|
return
|
|
end
|
|
|
|
local size = building_lib.get_building_size(building_def, rotation)
|
|
local mapblock_pos2 = vector.add(mapblock_pos1, vector.subtract(size, 1))
|
|
|
|
local color = "#00ff00"
|
|
local can_build = building_lib.can_build(mapblock_pos1, playername, building_def.name, rotation)
|
|
if not can_build then
|
|
color = "#ffff00"
|
|
end
|
|
|
|
building_lib.show_preview(
|
|
playername,
|
|
"building_lib_autoplace.png",
|
|
color,
|
|
building_def,
|
|
mapblock_pos1,
|
|
mapblock_pos2,
|
|
rotation
|
|
)
|
|
end,
|
|
on_blur = function(player)
|
|
local playername = player:get_player_name()
|
|
building_lib.clear_preview(playername)
|
|
end
|
|
})
|