-- Manages grid loading, writing and generation local world_data = mapgen_rivers.world_data_path local registered_on_grid_loaded = {} function mapgen_rivers.register_on_grid_loaded(func) if type(func) == "function" then registered_on_grid_loaded[#registered_on_grid_loaded+1] = func else minetest.log("error", "[mapgen_rivers] register_on_grid_loaded can only register functions!") end end local function on_grid_loaded_callback(grid) for _, func in ipairs(registered_on_grid_loaded) do func(grid) end end local function offset_conv(o) return (o + 0.5) * (1/256) end local grid_maps_list = { dem = {bytes=2, signed=true}, lakes = {bytes=2, signed=true}, dirs = {bytes=1, signed=false}, rivers = {bytes=4, signed=false}, offset_x = {bytes=1, signed=true, conv=offset_conv}, offset_y = {bytes=1, signed=true, conv=offset_conv}, } function mapgen_rivers.try_load_grid(grid) -- First, check whether a grid is already loaded if mapgen_rivers.grid then return true -- Then, check the provided argument is a valid grid elseif grid then mapgen_rivers.grid = grid on_grid_loaded_callback(grid) return true end -- Fall back to loading the grid from the files local sfile = io.open(world_data .. 'size', 'r') if not sfile then return false end local x, z = sfile:read('*n'), sfile:read('*n') if not x or not z then return false end minetest.log("action", '[mapgen_rivers] Loading grid') grid = { size = {x=x, y=z}, } for map, params in pairs(grid_maps_list) do grid[map] = mapgen_rivers.load_file(map, params.bytes, params.signed, x*z, params.conv) end mapgen_rivers.grid = grid on_grid_loaded_callback(grid) return true end function mapgen_rivers.generate_grid() minetest.log("action", '[mapgen_rivers] Generating grid, this may take a while...') local grid = {} local blocksize = mapgen_rivers.settings.blocksize local xsize = math.floor(mapgen_rivers.settings.map_x_size / blocksize) local zsize = math.floor(mapgen_rivers.settings.map_z_size / blocksize) grid.size = {x=xsize, y=zsize} if not mapgen_rivers.pregenerate then minetest.log("error", "[mapgen_rivers] Pre-generation function is not available.") return false end mapgen_rivers.pregenerate(grid) return grid end function mapgen_rivers.write_grid(grid) minetest.mkdir(world_data) for map, params in pairs(grid_maps_list) do mapgen_rivers.write_file(map, grid[map], params.bytes) end local sfile = io.open(world_data .. 'size', "w") sfile:write(grid.size.x..'\n'..grid.size.y) sfile:close() return true end