175 lines
5.2 KiB
Lua
175 lines
5.2 KiB
Lua
-- Much of the code here (recognizable as being the best-written) was
|
|
-- initially written by Rubenwardy for the CaptureTheFlag subgame.
|
|
|
|
-- assert(minetest.get_mapgen_setting("mg_name") == "singlenode", "singlenode mapgen is required.")
|
|
minetest.register_on_mapgen_init(function(mgparams)
|
|
minetest.set_mapgen_params({mgname="singlenode"})
|
|
end)
|
|
|
|
minetest.register_alias("mapgen_singlenode", "hg_map:ignore")
|
|
|
|
math.randomseed(os.time())
|
|
|
|
hg_map.chests_stuff = {
|
|
["default:apple"] = 200,
|
|
["default:torch"] = 200,
|
|
["default:cobble"] = 300,
|
|
["default:wood"] = 300,
|
|
["3d_armor:helmet_wood"] = 70,
|
|
["3d_armor:chestplate_wood"] = 70,
|
|
["3d_armor:leggings_wood"] = 70,
|
|
["3d_armor:boots_wood"] = 70,
|
|
["shields:shield_wood"] = 70,
|
|
["3d_armor:helmet_steel"] = 30,
|
|
["3d_armor:chestplate_steel"] = 30,
|
|
["3d_armor:leggings_steel"] = 30,
|
|
["3d_armor:boots_steel"] = 30,
|
|
["shields:shield_steel"] = 30,
|
|
["3d_armor:helmet_bronze"] = 20,
|
|
["3d_armor:chestplate_bronze"] = 20,
|
|
["3d_armor:leggings_bronze"] = 20,
|
|
["3d_armor:boots_bronze"] = 20,
|
|
["shields:shield_bronze"] = 20,
|
|
["3d_armor:helmet_gold"] = 13,
|
|
["3d_armor:chestplate_gold"] = 13,
|
|
["3d_armor:leggings_gold"] = 13,
|
|
["3d_armor:boots_gold"] = 13,
|
|
["shields:shield_gold"] = 13,
|
|
["3d_armor:helmet_diamond"] = 5,
|
|
["3d_armor:chestplate_diamond"] = 5,
|
|
["3d_armor:leggings_diamond"] = 5,
|
|
["3d_armor:boots_diamond"] = 5,
|
|
["shields:shield_diamond"] = 5,
|
|
["default:sword_wood"] = 100,
|
|
["default:sword_steel"] = 50,
|
|
["default:sword_bronze"] = 37,
|
|
["default:sword_diamond"] = 15,
|
|
["default:sword_mese"] = 10,
|
|
["throwing:arrow"] = 200,
|
|
["throwing:arrow_gold"] = 100,
|
|
["throwing:bow_wood"] = 50,
|
|
["throwing:bow_steel"] = 20,
|
|
["farming:cotton"] = 70,
|
|
["default:steel_ingot"] = 100,
|
|
["default:bronze_ingot"] = 50,
|
|
["default:gold_ingot"] = 40,
|
|
["default:diamond"] = 20,
|
|
["default:mese_crystal"] = 15,
|
|
["default:coal_lump"] = 80,
|
|
["tnt:tnt"] = 10,
|
|
["tnt:gunpowder"] = 50,
|
|
["bucket:bucket_empty"] = 20,
|
|
["hg_hunger:water_glass"] = 70,
|
|
}
|
|
|
|
hg_map.mapdir = minetest.get_worldpath() .. "/hg_maps/"
|
|
|
|
hg_map.maps = {}
|
|
|
|
function hg_map.load_map_meta(idx, name)
|
|
local meta = Settings(hg_map.mapdir .. name .. ".conf")
|
|
|
|
local hg_nodes = minetest.deserialize(meta:get("hg_nodes"))
|
|
|
|
local map = {
|
|
idx = idx,
|
|
name = name:split("/")[2],
|
|
path = hg_map.mapdir .. name,
|
|
hg_nodes = hg_nodes,
|
|
width = tonumber(meta:get("width")),
|
|
length = tonumber(meta:get("length")),
|
|
height = tonumber(meta:get("height")),
|
|
margin = tonumber(meta:get("margin")),
|
|
blocksize = tonumber(meta:get("blocksize")),
|
|
author = meta:get("author"),
|
|
max_players = #hg_nodes.spawnpoint,
|
|
}
|
|
|
|
assert(map.width <= 549 and map.height <= 549 and map.length <= 549)
|
|
assert(#hg_nodes.spawnpoint >= 1, "No spawnpoint on map " .. map.name)
|
|
|
|
return map
|
|
end
|
|
|
|
do
|
|
local files_hash = {}
|
|
|
|
local dirs = minetest.get_dir_list(hg_map.mapdir, true)
|
|
table.insert(dirs, ".")
|
|
for _, dir in pairs(dirs) do
|
|
local files = minetest.get_dir_list(hg_map.mapdir .. dir, false)
|
|
for i=1, #files do
|
|
local name = string.match(files[i], "(.*)%.conf")
|
|
if name then
|
|
files_hash[dir .. "/" .. name] = true
|
|
end
|
|
end
|
|
end
|
|
|
|
hg_map.available_maps = {}
|
|
for key, _ in pairs(files_hash) do
|
|
table.insert(hg_map.available_maps, hg_map.load_map_meta(#hg_map.available_maps + 1, key))
|
|
if hg_map.available_maps[#hg_map.available_maps].name == "spawn" then
|
|
hg_map.spawn = hg_map.available_maps[#hg_map.available_maps]
|
|
table.remove(hg_map.available_maps)
|
|
end
|
|
end
|
|
print(dump(hg_map.available_maps))
|
|
end
|
|
|
|
function hg_map.find_player_map(name)
|
|
for _, map in ipairs(hg_map.maps) do
|
|
for i, p_name in ipairs(map.players) do
|
|
if p_name == name then
|
|
return map, i
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
function hg_map.get_map(spawnpoints_min)
|
|
local selectable_maps = {}
|
|
for _, map in ipairs(hg_map.maps) do
|
|
if map.ready and map.max_players >= spawnpoints_min then
|
|
table.insert(selectable_maps, map)
|
|
end
|
|
end
|
|
|
|
if #selectable_maps == 0 then
|
|
return nil
|
|
end
|
|
|
|
return selectable_maps[math.random(#selectable_maps)]
|
|
end
|
|
|
|
function hg_map.update_map_offset(map)
|
|
map.minp = map.offset
|
|
map.maxp = vector.add(map.offset, { x = map.width + 2*map.margin, y = map.height, z = map.length + 2*map.margin })
|
|
for k, positions in pairs(map.hg_nodes) do
|
|
for i, pos in ipairs(positions) do
|
|
map.hg_nodes[k][i] = vector.add(map.hg_nodes[k][i], vector.add(map.offset, {x = map.margin, y = 0, z = map.margin}))
|
|
end
|
|
end
|
|
end
|
|
|
|
function hg_map.place_spawn()
|
|
assert(hg_map.spawn, "Please add a spawn map.")
|
|
|
|
hg_map.spawn.offset = vector.new(-hg_map.spawn.width/2, 24000, -hg_map.spawn.length/2)
|
|
hg_map.update_map_offset(hg_map.spawn)
|
|
|
|
hg_map.emerge_with_callbacks(nil, hg_map.spawn.minp, hg_map.spawn.maxp, function()
|
|
local res = minetest.place_schematic(hg_map.spawn.minp, hg_map.spawn.path .. ".mts", "0")
|
|
end, nil)
|
|
end
|
|
|
|
minetest.after(0, hg_map.place_spawn)
|
|
|
|
function hg_map.chat_send_map(map, message)
|
|
for _, name in ipairs(map.players) do
|
|
minetest.chat_send_player(name, message)
|
|
end
|
|
end
|
|
|
|
dofile(minetest.get_modpath("hg_map") .. "/map_placer.lua")
|