136 lines
5.1 KiB
Lua
136 lines
5.1 KiB
Lua
local S = settlements.S
|
|
|
|
local visual_range = tonumber(minetest.settings:get("settlements_visibility_range")) or 600
|
|
|
|
local function get_nearest_settlement_within_range(pos, range, name)
|
|
local min_edge = vector.subtract(pos, range)
|
|
local max_edge = vector.add(pos, range)
|
|
local settlement_list = named_waypoints.get_waypoints_in_area("settlements", min_edge, max_edge)
|
|
|
|
local min_dist = range + 1 -- start with number beyond range
|
|
local min_settlement = nil
|
|
for id, settlement in pairs(settlement_list) do
|
|
local distance = vector.distance(pos, settlement.pos)
|
|
if distance < min_dist and settlement.data.discovered_by[name] then
|
|
min_dist = distance
|
|
min_settlement = settlement
|
|
end
|
|
end
|
|
|
|
return min_settlement
|
|
end
|
|
|
|
minetest.register_chatcommand("settlements_rename_nearest", {
|
|
description = S("Change the name of the nearest settlement you can see"),
|
|
params = S("The new name for this settlement, or nothing to generate a new random name"),
|
|
privs = {["server"]=true},
|
|
func = function(name, param)
|
|
local player = minetest.get_player_by_name(name)
|
|
local player_pos = player:get_pos()
|
|
|
|
local settlement = get_nearest_settlement_within_range(player_pos, visual_range, name)
|
|
|
|
if settlement ~= nil then
|
|
local data = settlement.data
|
|
if param == "" then
|
|
local def
|
|
if data.settlement_type then
|
|
def = settlements.registered_settlements[data.settlement_type]
|
|
end
|
|
if not def then
|
|
minetest.chat_send_player(name, S("Missing settlement definition for @1", data.settlement_type))
|
|
return
|
|
end
|
|
param = def.generate_name(min_pos)
|
|
end
|
|
local oldname = data.name
|
|
data.name = param
|
|
named_waypoints.update_waypoint("settlements", settlement.pos, data)
|
|
minetest.chat_send_player(name, S("Renamed @1 to @2.", oldname, param))
|
|
return
|
|
end
|
|
|
|
minetest.chat_send_player(name, S("No known settlements within @1m found.", visual_range))
|
|
end,
|
|
})
|
|
|
|
minetest.register_chatcommand("settlements_regenerate_names", {
|
|
description = S("Regenerate the names for all settments of a particular type"),
|
|
params = S("The settlement type"),
|
|
privs = {["server"]=true},
|
|
func = function(name, param)
|
|
if param == "" then
|
|
minetest.chat_send_player(name, S("A non-empty settlement type parameter is required"))
|
|
return
|
|
end
|
|
local settlement_def = settlements.registered_settlements[param]
|
|
if not settlement_def then
|
|
minetest.chat_send_player(name, S("Unrecognized settlement type"))
|
|
return
|
|
end
|
|
|
|
local settlement_list = named_waypoints.get_waypoints_in_area("settlements",
|
|
{x=-32000, y=-32000, z=-32000}, {x=32000, y=32000, z=32000})
|
|
for id, settlement in pairs(settlement_list) do
|
|
local data = settlement.data
|
|
if data.settlement_type == param then
|
|
local pos = settlement.pos
|
|
local oldname = data.name
|
|
data.name = settlement_def.generate_name(pos)
|
|
named_waypoints.update_waypoint("settlements", pos, data)
|
|
minetest.chat_send_player(name, S("Renamed @1 to @2", oldname, data.name))
|
|
minetest.log("action", "[settlements] Renamed " .. oldname .. " to " .. data.name)
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
|
|
minetest.register_chatcommand("settlements_remove_nearest", {
|
|
description = S("Remove the nearest settlement within a certain range (default 40)"),
|
|
params = S("range"),
|
|
privs = {["server"] = true},
|
|
func = function(name, param)
|
|
local range = tonumber(param) or 40
|
|
local player = minetest.get_player_by_name(name)
|
|
local player_pos = player:get_pos()
|
|
local settlement = get_nearest_settlement_within_range(player_pos, range, name)
|
|
|
|
if settlement ~= nil then
|
|
named_waypoints.remove_waypoint("settlements", settlement.pos)
|
|
minetest.log("action", "[settlements] Removed " .. settlement.data.name)
|
|
minetest.chat_send_player(name, S("Settlement @1 successfully removed.", settlement.data.name))
|
|
else
|
|
minetest.chat_send_player(name, S("No known settlements within @1m found.", range))
|
|
end
|
|
end,
|
|
})
|
|
|
|
local half_map_chunk_size = settlements.half_map_chunk_size
|
|
local map_chunk_size = half_map_chunk_size * 2
|
|
|
|
minetest.register_chatcommand("settlements_create_in_mapchunk", {
|
|
description = S("Create a new settlement centered in your current mapchunk"),
|
|
privs = {["server"] = true},
|
|
func = function(name, param)
|
|
local player = minetest.get_player_by_name(name)
|
|
local player_pos = player:get_pos()
|
|
local minp = {}
|
|
-- Map chunk origin is at {x=-32,y=-32,z=-32}
|
|
local minp = vector.subtract(vector.multiply(vector.floor(vector.divide(vector.add(player_pos, 32), map_chunk_size)), map_chunk_size), 32)
|
|
|
|
local maxp = vector.add(minp, map_chunk_size-1)
|
|
local centerp = vector.add(minp, half_map_chunk_size)
|
|
|
|
local settlement_list = settlements.settlements_in_world:get_areas_in_area(minp, maxp, true)
|
|
if next(settlement_list) then
|
|
minetest.chat_send_player(name, S("Settlement already exists in this mapchunk"))
|
|
return
|
|
end
|
|
if settlements.generate_settlement(vector.subtract(minp,16), vector.add(maxp,16)) then -- add borders to simulate mapgen borders
|
|
minetest.chat_send_player(name, S("Created new settlement at @1", minetest.pos_to_string(centerp)))
|
|
else
|
|
minetest.chat_send_player(name, S("Unable to create new settlement at @1", minetest.pos_to_string(centerp)))
|
|
end
|
|
end,
|
|
})
|