2024-07-23 01:09:17 +02:00
|
|
|
-- check the minimum distance of two squares, on axes
|
2024-09-03 17:16:36 +02:00
|
|
|
-- TODO: make local in village planning code only?
|
2024-07-23 01:09:17 +02:00
|
|
|
function mcl_villages.check_distance(settlement, cpos, sizex, sizez, limit)
|
|
|
|
for i, building in ipairs(settlement) do
|
|
|
|
local opos, osizex, osizez = building.pos, building.size.x, building.size.z
|
|
|
|
local dx = math.abs(cpos.x - opos.x) - (sizex + osizex) * 0.5
|
|
|
|
local dz = math.abs(cpos.z - opos.z) - (sizez + osizez) * 0.5
|
|
|
|
if math.max(dx, dz) < limit then return false end
|
2021-01-29 19:49:33 +01:00
|
|
|
end
|
|
|
|
return true
|
2021-01-27 09:56:53 +01:00
|
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
-- fill chests
|
|
|
|
-------------------------------------------------------------------------------
|
2024-07-19 14:56:06 +02:00
|
|
|
function mcl_villages.fill_chest(pos, pr)
|
2021-01-29 19:49:33 +01:00
|
|
|
-- initialize chest (mts chests don't have meta)
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
if meta:get_string("infotext") ~= "Chest" then
|
|
|
|
-- For MineClone2 0.70 or before
|
2024-07-20 13:57:01 +02:00
|
|
|
minetest.registered_nodes["mcl_chests:chest"].on_construct(pos)
|
2021-01-29 19:49:33 +01:00
|
|
|
-- For MineClone2 after commit 09ab1482b5 (the new entity chests)
|
|
|
|
minetest.registered_nodes["mcl_chests:chest_small"].on_construct(pos)
|
|
|
|
end
|
|
|
|
-- fill chest
|
|
|
|
local inv = minetest.get_inventory( {type="node", pos=pos} )
|
2024-09-03 17:16:36 +02:00
|
|
|
local function get_treasures(pr)
|
2021-01-29 19:49:33 +01:00
|
|
|
local loottable = {{
|
2021-01-28 08:24:43 +01:00
|
|
|
stacks_min = 3,
|
|
|
|
stacks_max = 8,
|
|
|
|
items = {
|
|
|
|
{ itemstring = "mcl_core:diamond", weight = 3, amount_min = 1, amount_max = 3 },
|
|
|
|
{ itemstring = "mcl_core:iron_ingot", weight = 10, amount_min = 1, amount_max = 5 },
|
|
|
|
{ itemstring = "mcl_core:gold_ingot", weight = 5, amount_min = 1, amount_max = 3 },
|
|
|
|
{ itemstring = "mcl_farming:bread", weight = 15, amount_min = 1, amount_max = 3 },
|
|
|
|
{ itemstring = "mcl_core:apple", weight = 15, amount_min = 1, amount_max = 3 },
|
|
|
|
{ itemstring = "mcl_tools:pick_iron", weight = 5 },
|
|
|
|
{ itemstring = "mcl_tools:sword_iron", weight = 5 },
|
|
|
|
{ itemstring = "mcl_armor:chestplate_iron", weight = 5 },
|
|
|
|
{ itemstring = "mcl_armor:helmet_iron", weight = 5 },
|
|
|
|
{ itemstring = "mcl_armor:leggings_iron", weight = 5 },
|
|
|
|
{ itemstring = "mcl_armor:boots_iron", weight = 5 },
|
|
|
|
{ itemstring = "mcl_core:obsidian", weight = 5, amount_min = 3, amount_max = 7 },
|
|
|
|
{ itemstring = "mcl_core:sapling", weight = 5, amount_min = 3, amount_max = 7 },
|
|
|
|
{ itemstring = "mcl_mobitems:saddle", weight = 3 },
|
2022-05-25 23:25:15 +02:00
|
|
|
{ itemstring = "mcl_mobitems:iron_horse_armor", weight = 1 },
|
|
|
|
{ itemstring = "mcl_mobitems:gold_horse_armor", weight = 1 },
|
|
|
|
{ itemstring = "mcl_mobitems:diamond_horse_armor", weight = 1 },
|
2021-01-28 08:24:43 +01:00
|
|
|
}
|
2021-01-29 19:49:33 +01:00
|
|
|
}}
|
2024-09-03 17:16:36 +02:00
|
|
|
return mcl_loot.get_multi_loot(loottable, pr)
|
2021-01-28 08:24:43 +01:00
|
|
|
end
|
2024-09-03 17:16:36 +02:00
|
|
|
mcl_loot.fill_inventory(inv, "main", get_treasures(pr), pr)
|
2021-01-27 09:56:53 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
|
|
-- randomize table
|
|
|
|
-------------------------------------------------------------------------------
|
2024-07-19 14:56:06 +02:00
|
|
|
function mcl_villages.shuffle(tbl, pr)
|
|
|
|
local copy = {}
|
|
|
|
for key, value in ipairs(tbl) do
|
|
|
|
table.insert(copy, pr:next(1, #copy + 1), value)
|
2021-01-27 09:56:53 +01:00
|
|
|
end
|
2024-07-19 14:56:06 +02:00
|
|
|
return copy
|
2021-01-27 09:56:53 +01:00
|
|
|
end
|
2023-01-22 21:27:57 +01:00
|
|
|
|
2024-07-19 14:56:06 +02:00
|
|
|
-- Load a schema and replace nodes in it based on biome
|
|
|
|
function mcl_villages.substitute_materials(pos, schem_lua, pr)
|
2024-09-03 17:16:36 +02:00
|
|
|
local biome_name = minetest.get_biome_name(minetest.get_biome_data(pos).biome)
|
2024-07-19 14:56:06 +02:00
|
|
|
|
2024-07-20 02:10:25 +02:00
|
|
|
-- for now, map to MCLA, later back, so we can keep their rules unchanged
|
|
|
|
for _, sub in pairs(mcl_villages.vl_to_mcla) do
|
2024-09-03 17:16:36 +02:00
|
|
|
schem_lua = schem_lua:gsub(sub[1], sub[2])
|
2024-07-20 02:10:25 +02:00
|
|
|
end
|
|
|
|
|
2024-07-19 14:56:06 +02:00
|
|
|
if mcl_villages.biome_map[biome_name] and mcl_villages.material_substitions[mcl_villages.biome_map[biome_name]] then
|
|
|
|
for _, sub in pairs(mcl_villages.material_substitions[mcl_villages.biome_map[biome_name]]) do
|
2024-09-03 17:16:36 +02:00
|
|
|
schem_lua = schem_lua:gsub(sub[1], sub[2])
|
2024-07-19 14:56:06 +02:00
|
|
|
end
|
2023-02-03 23:03:49 +01:00
|
|
|
end
|
|
|
|
|
2024-07-20 02:10:25 +02:00
|
|
|
-- MCLA node names back to VL
|
|
|
|
for _, sub in pairs(mcl_villages.mcla_to_vl) do
|
2024-09-03 17:16:36 +02:00
|
|
|
schem_lua = schem_lua:gsub(sub[1], sub[2])
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Farming: place crops
|
|
|
|
if string.find(schem_lua, "mcl_villages:crop_") then
|
|
|
|
local map_name = mcl_villages.biome_map[biome_name] or "plains"
|
|
|
|
for _, crop in ipairs(mcl_villages.get_crop_types()) do
|
|
|
|
if string.find(schem_lua, "mcl_villages:crop_" .. crop) then
|
|
|
|
for count = 1, 8 do
|
|
|
|
local name = "mcl_villages:crop_" .. crop .. "_" .. count
|
|
|
|
local replacement = mcl_villages.get_weighted_crop(map_name, crop, pr)
|
|
|
|
schem_lua = schem_lua:gsub(name, replacement or mcl_villages.default_crop)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2024-07-20 02:10:25 +02:00
|
|
|
end
|
2024-09-03 17:16:36 +02:00
|
|
|
return schem_lua
|
2024-07-19 14:56:06 +02:00
|
|
|
end
|
2023-01-22 21:27:57 +01:00
|
|
|
|
2024-09-03 17:16:36 +02:00
|
|
|
-- Persistent registry for villages
|
2024-07-19 14:56:06 +02:00
|
|
|
local villages = {}
|
|
|
|
local mod_storage = minetest.get_mod_storage()
|
2023-02-03 23:03:49 +01:00
|
|
|
|
2024-07-19 14:56:06 +02:00
|
|
|
local function lazy_load_village(name)
|
|
|
|
if not villages[name] then
|
|
|
|
local data = mod_storage:get("mcl_villages." .. name)
|
|
|
|
if data then
|
|
|
|
villages[name] = minetest.deserialize(data)
|
2021-02-22 00:15:32 +01:00
|
|
|
end
|
|
|
|
end
|
2024-07-19 14:56:06 +02:00
|
|
|
end
|
2023-02-03 23:03:49 +01:00
|
|
|
|
2024-07-19 14:56:06 +02:00
|
|
|
function mcl_villages.get_village(name)
|
|
|
|
lazy_load_village(name)
|
|
|
|
if villages[name] then
|
|
|
|
return table.copy(villages[name])
|
2021-02-22 00:15:32 +01:00
|
|
|
end
|
2021-01-27 09:56:53 +01:00
|
|
|
end
|
2024-07-19 14:56:06 +02:00
|
|
|
|
|
|
|
function mcl_villages.village_exists(name)
|
|
|
|
lazy_load_village(name)
|
|
|
|
return villages[name] ~= nil
|
|
|
|
end
|
|
|
|
|
|
|
|
function mcl_villages.add_village(name, data)
|
|
|
|
lazy_load_village(name)
|
|
|
|
if villages[name] then
|
2024-09-03 17:16:36 +02:00
|
|
|
minetest.log("info", "Village already exists: " .. name )
|
2024-07-19 14:56:06 +02:00
|
|
|
return false
|
|
|
|
end
|
2024-09-03 17:16:36 +02:00
|
|
|
mod_storage:set_string("mcl_villages." .. name, minetest.serialize({ name = name, data = data }))
|
2024-07-19 14:56:06 +02:00
|
|
|
return true
|
2021-01-27 09:56:53 +01:00
|
|
|
end
|
2024-09-03 17:16:36 +02:00
|
|
|
|