2022-08-16 16:12:37 -04:00

161 lines
5.7 KiB
Lua

-- internationalization boilerplate
local S, NS = settlements.S, settlements.NS
-----------------------------------------------------------------------------
-- Admin tools
local half_map_chunk_size = settlements.half_map_chunk_size
-- manually place buildings, for debugging only
minetest.register_craftitem("settlements:settlement_tool", {
description = S("Settlements build tool"),
inventory_image = "settlements_settlement_marker.png",
stack_max = 1,
-- build settlement
on_use = function(itemstack, placer, pointed_thing)
local player_name = placer:get_player_name()
if not minetest.check_player_privs(placer, "server") then
minetest.chat_send_player(player_name, S("You need the server privilege to use this tool."))
return
end
local center_surface = pointed_thing.under
if center_surface then
local minp = vector.subtract(center_surface, half_map_chunk_size+16) -- add 16 node border to simulate extended mapgen border
local maxp = vector.add(center_surface, half_map_chunk_size+16)
if settlements.generate_settlement(minp, maxp) then
minetest.chat_send_player(player_name, S("Created new settlement at @1", minetest.pos_to_string(center_surface)))
else
minetest.chat_send_player(player_name, S("Unable to create new settlement at @1", minetest.pos_to_string(center_surface)))
end
end
end,
})
local c_dirt_with_grass = minetest.get_content_id("default:dirt_with_grass")
local all_schematics
local function get_all_schematics()
if not all_schematics then
all_schematics = {}
for _, settlement_def in pairs(settlements.registered_settlements) do
for _, building_info in ipairs(settlement_def.schematics) do
table.insert(all_schematics, building_info)
end
end
end
return all_schematics
end
minetest.register_craftitem("settlements:single_building_tool", {
description = S("Settlements tool for building: @1", S("Unset")),
inventory_image = "settlements_building_marker.png",
stack_max = 1,
on_place = function(itemstack, placer, pointed_thing)
local meta = itemstack:get_meta()
local index = meta:get_int("index")
local all_schematics = get_all_schematics()
index = index + 1
if index > #all_schematics then
index = 1
end
meta:set_int("index", index)
local desc_string = S("Settlements tool for building: @1", all_schematics[index].name)
meta:set_string("description", desc_string)
minetest.chat_send_player(placer:get_player_name(), desc_string)
return itemstack
end,
-- build single house
on_use = function(itemstack, placer, pointed_thing)
if not minetest.check_player_privs(placer, "server") then
minetest.chat_send_player(placer:get_player_name(), S("You need the server privilege to use this tool."))
return
end
local meta = itemstack:get_meta()
local index = meta:get_int("index")
local selected_building = get_all_schematics()[index]
if not selected_building then
return
end
local center_surface = pointed_thing.under
if center_surface then
local built_house = {}
built_house.schematic_info = selected_building
built_house.center_pos = center_surface -- we're not terraforming so this doesn't matter
built_house.build_pos_min = center_surface
built_house.rotation = "0"
built_house.surface_mat = c_dirt_with_grass
local vm = minetest.get_voxel_manip()
local maxp = vector.add(center_surface, selected_building.schematic.size)
local emin, emax = vm:read_from_map(center_surface, maxp)
settlements.place_building(vm, built_house, {def={}})
minetest.chat_send_player(placer:get_player_name(), S("Built @1", selected_building.name))
vm:write_to_map()
end
end,
})
minetest.register_craftitem("settlements:mark_location_tool", {
description = S("Settlements tool for marking: @1", S("Unset")),
inventory_image = "settlements_location_marker.png",
stack_max = 1,
on_place = function(itemstack, placer, pointed_thing)
local meta = itemstack:get_meta()
local settlement_type = meta:get_string("type")
if settlement_type == "" then
settlement_type = next(settlements.registered_settlements)
else
settlement_type = next(settlements.registered_settlements, settlement_type)
if not settlement_type then
settlement_type = next(settlements.registered_settlements)
end
end
meta:set_string("type", settlement_type)
local desc_string = S("Settlements tool for marking: @1", settlement_type)
meta:set_string("description", desc_string)
minetest.chat_send_player(placer:get_player_name(), desc_string)
return itemstack
end,
-- Mark a settlement here, regardless of environment
on_use = function(itemstack, placer, pointed_thing)
if not minetest.check_player_privs(placer, "server") then
minetest.chat_send_player(placer:get_player_name(), S("You need the server privilege to use this tool."))
return
end
local meta = itemstack:get_meta()
local settlement_type = meta:get_string("type")
local settlement_def = settlements.registered_settlements[settlement_type]
if not settlement_def then
return
end
local center_surface = pointed_thing.under
if center_surface then
center_surface = vector.add(center_surface, {x=0, y=2, z=0})
local existing_area = named_waypoints.get_waypoints_in_area("settlements", vector.subtract(center_surface, 5), vector.add(center_surface, 5))
if next(existing_area) then
minetest.chat_send_player(placer:get_player_name(), S("There's already a settlement at @1", minetest.pos_to_string(center_surface)))
return
end
local name = settlement_def.generate_name(center_surface)
minetest.chat_send_player(placer:get_player_name(), S("Marked settlement @1 at @2", name, minetest.pos_to_string(center_surface)))
-- add settlement to list
named_waypoints.add_waypoint("settlements", center_surface, {name=name, settlement_type = settlement_type})
end
end,
})