-- 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")