diff --git a/autofill.lua b/autofill.lua index c2bd8ea..c5bdd0e 100644 --- a/autofill.lua +++ b/autofill.lua @@ -2,40 +2,41 @@ -- chunk: The chunk coordinate conversion API -- scanner: The map scanning API -- maps: The map API -local chunk, scanner, maps = ...; +-- settings: The mod settings +local chunk, scanner, maps, settings = ...; --- Periodically-called function to fill in maps and queue chunks for manual --- scanning -local function fill_loop() - -- Fill in all player-held maps - for _,p in ipairs(minetest.get_connected_players()) do - local inventory = p:get_inventory(); - local pos = p:get_pos(); - if pos.y > -10 then - for i = 1,inventory:get_size("main") do - local stack = inventory:get_stack("main", i); - local map = maps.get(stack:get_meta():get_int("cartographer:map_id")); +-- Periodically-called function to fill in maps and queue chunks for backup +-- scans +if settings.autofill_freq ~= 0 then + -- scanning + local function fill_loop() + -- Fill in all player-held maps + for _,p in ipairs(minetest.get_connected_players()) do + local inventory = p:get_inventory(); + local pos = p:get_pos(); + if pos.y > -10 then + for i = 1,inventory:get_size("main") do + local stack = inventory:get_stack("main", i); + local map = maps.get(stack:get_meta():get_int("cartographer:map_id")); - if map then - map:fill_local(pos.x, pos.z); + if map then + map:fill_local(pos.x, pos.z); + end end - end - for i = -2,2 do - for j = -2,2 do - local adjusted_pos = { - x = pos.x + chunk.from(i), - y = pos.y, - z = pos.z + chunk.from(j), - } - scanner.queue_region(adjusted_pos); + for i = -2,2 do + for j = -2,2 do + local adjusted_pos = { + x = pos.x + chunk.from(i), + y = pos.y, + z = pos.z + chunk.from(j), + } + scanner.queue_region(adjusted_pos); + end end end end + minetest.after(settings.autofill_freq, fill_loop); end - for _ = 1,10 do - scanner.scan_regions(); - end - minetest.after(5, fill_loop); + minetest.after(settings.autofill_freq, fill_loop); end -minetest.after(5, fill_loop); diff --git a/commands.lua b/commands.lua index 90bac33..ac093da 100644 --- a/commands.lua +++ b/commands.lua @@ -2,8 +2,8 @@ -- chunk: The chunk coordinate conversion API -- audio: The audio playback API -- map_formspec: The map display API -local chunk, audio, map_formspec = ...; - +-- settings: The mod settings +local chunk, audio, map_formspec, settings = ...; local MAXINT = 2147483647; minetest.register_privilege("cartographer", { @@ -41,7 +41,13 @@ minetest.register_chatcommand("map", { local player_z = math.floor((chunk.to(pos.z) / scale) + 0.5); audio.play_feedback("cartographer_open_map", player); - minetest.show_formspec(name, "map", map_formspec.from_coords(player_x, player_z, 40, 40, detail, scale, true)); + minetest.show_formspec(name, "map", map_formspec.from_coords(player_x, + player_z, + settings.default_size, + settings.default_size, + detail, + scale, + true)); end, }) diff --git a/init.lua b/init.lua index c65b68c..4e73e58 100644 --- a/init.lua +++ b/init.lua @@ -1,8 +1,16 @@ -- The path to this mod, for including files local modpath = minetest.get_modpath("cartographer"); +local settings = { + default_size = tonumber(minetest.settings:get("default_size")) or 40, + autofill_freq = tonumber(minetest.settings:get("autofill_freq")) or 5, + autosave_freq = tonumber(minetest.settings:get("autosave_freq")) or 60, + backup_scan_freq = tonumber(minetest.settings:get("backup_scan_freq")) or 5, + backup_scan_count = tonumber(minetest.settings:get("backup_scan_count")) or 10, +}; + -- Includes -local map_data = loadfile(modpath .. "/storage.lua") (); +local map_data = loadfile(modpath .. "/storage.lua") (settings); local chunk = loadfile(modpath .. "/chunk_api.lua") (); local gui = loadfile(modpath .. "/formspec.lua") (); local skin = loadfile(modpath .. "/skin_api.lua") (); @@ -10,27 +18,29 @@ local util = loadfile(modpath .. "/util.lua") (); local audio = loadfile(modpath .. "/audio.lua") (); local biomes = loadfile(modpath .. "/biome_api.lua") (util); local markers = loadfile(modpath .. "/marker_api.lua") (); -local scanner = loadfile(modpath .. "/scanner.lua") (map_data, chunk); +local scanner = loadfile(modpath .. "/scanner.lua") (map_data, chunk, settings); local maps = loadfile(modpath .. "/map_api.lua") (map_data, chunk); local materials = loadfile(modpath .. "/material_api.lua") (); local map_formspec = loadfile(modpath .. "/map_formspec.lua") (map_data, gui, skin, util, biomes, markers); -local map_item = loadfile(modpath .. "/items.lua") (chunk, gui, skin, audio, maps, markers, map_formspec); -loadfile(modpath .. "/commands.lua") (chunk, audio, map_formspec); -loadfile(modpath .. "/table.lua") (gui, skin, audio, maps, materials, map_item); -loadfile(modpath .. "/autofill.lua") (chunk, scanner, maps); +local map_item = loadfile(modpath .. "/items.lua") (chunk, gui, skin, audio, maps, markers, map_formspec, settings); +loadfile(modpath .. "/commands.lua") (chunk, audio, map_formspec, settings); +loadfile(modpath .. "/table.lua") (gui, skin, audio, maps, materials, map_item, settings); +loadfile(modpath .. "/autofill.lua") (chunk, scanner, maps, settings); -- The API object cartographer = { -- skin_api.lua: Allows the visual customization of formspecs - skin = skin; + skin = skin, -- biome_api.lua: Allows biome data to be registered for display in maps - biomes = biomes; + biomes = biomes, -- marker_api.lua: Allows markers to be registered for placement on maps - markers = markers; + markers = markers, -- map_api.lua: Allows the creation, lookup, and management of map objects - maps = maps; + maps = maps, -- items.lua: Allows the creation of map items with proper metadata - map_item = map_item; + map_item = map_item, -- materials.lua: Allows items to be registered as mapmaking materials - materials = materials; + materials = materials, + -- scanner.lua: Exposes functions for queuing and performing terrain scans + scanner = scanner, }; diff --git a/items.lua b/items.lua index e59796c..eb0a768 100644 --- a/items.lua +++ b/items.lua @@ -6,7 +6,8 @@ -- maps: The map API -- markers: The marker API -- map_formspec: The map display API -local chunk, gui, skin, audio, maps, markers, map_formspec = ...; +-- settings: The mod settings +local chunk, gui, skin, audio, maps, markers, map_formspec, settings = ...; -- The list of players looking at maps, and the map IDs that they're looking at local player_maps = {}; @@ -204,7 +205,7 @@ end local function map_from_meta(meta, player_x, player_z) local size = meta:get_int("cartographer:size"); if size == 0 then - size = 40; + size = settings.default_size; end local detail = meta:get_int("cartographer:detail"); diff --git a/map_api.lua b/map_api.lua index 5dc2ccc..f58399c 100644 --- a/map_api.lua +++ b/map_api.lua @@ -145,7 +145,7 @@ local maps = { setmetatable(map, Map); map_data.maps[id] = map; - if filled or true then + if filled then map:fill_area(0, 0, w, h); end diff --git a/scanner.lua b/scanner.lua index 58b3fff..f1524ce 100644 --- a/scanner.lua +++ b/scanner.lua @@ -1,7 +1,8 @@ -- Arguments -- map_data: The cartographer map data table -- chunk: The chunk coordinate conversion API -local map_data, chunk = ...; +-- settings: The mod settings +local map_data, chunk, settings = ...; local scan_queue = {}; @@ -207,14 +208,7 @@ function scanner.queue_region(pos) scan_queue[#scan_queue + 1] = converted; end --- Scan the next tile on the queue, and remove it -function scanner.scan_regions() - local len = #scan_queue; - - if len == 0 then - return; - end - +local function scan_internal() local startpos = scan_queue[1]; local chunk_x = chunk.to(startpos.x); local chunk_y = chunk.to(startpos.y); @@ -239,4 +233,34 @@ function scanner.scan_regions() table.remove(scan_queue, 1); end +-- Scan the next N tiles on the queue, and remove them +-- N is determined by backup_scan_count +-- +-- flush: Flush the entire scan queue, scanning all queued regions +function scanner.scan_regions(flush) + local len = #scan_queue; + + if len == 0 then + return; + end + + if settings.backup_scan_count == 0 or flush then + while #scan_queue > 0 do + scan_internal(); + end + else + for _=1,settings.backup_scan_count do + scan_internal(); + end + end +end + +if settings.backup_scan_freq ~= 0 then + local function periodic_scan() + scanner.scan_regions(); + minetest.after(settings.backup_scan_freq, periodic_scan); + end + minetest.after(settings.backup_scan_freq, periodic_scan); +end + return scanner; diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 0000000..099554a --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1,14 @@ +# The default size of new maps, in tiles +default_size (Default Map Size) int 40 5 80 + +# The frequency that maps are filled in as players explore, in seconds. Set to 0 to disable. +autofill_freq (Map Auto-Fill Frequency) int 5 0 60 + +# The frequency that this mod saves its data to mod storage, in seconds. Set to 0 to disable. +autosave_freq (Data Auto-Save Frequency) int 60 0 3600 + +# The frequency that this mod scans already-generated map data to fill in existing terrain, in seconds. Set to 0 to disable. +backup_scan_freq (Map Scan Frequency) int 5 0 3600 + +# The number of map sections that this mod scans at a time. Set to 0 to scan all relevant areas +backup_scan_count (Map Scan Rate) int 10 0 100 diff --git a/storage.lua b/storage.lua index c764f89..f280741 100644 --- a/storage.lua +++ b/storage.lua @@ -1,3 +1,7 @@ +-- Arguments +-- settings: The mod settings +local settings = ...; + -- Storage and saving local mod_storage = minetest.get_mod_storage(); local map_data = { @@ -31,10 +35,12 @@ end minetest.register_on_shutdown(save); minetest.register_on_leaveplayer(save); -local function periodic_save() - save(); - minetest.after(60, periodic_save); +if settings.autosave_freq ~= 0 then + local function periodic_save() + save(); + minetest.after(settings.autosave_freq, periodic_save); + end + minetest.after(settings.autosave_freq, periodic_save); end -minetest.after(60, periodic_save); return map_data; diff --git a/table.lua b/table.lua index fdabdff..709f675 100644 --- a/table.lua +++ b/table.lua @@ -5,9 +5,9 @@ -- maps: The map API -- materials: The material API -- map_item: The map item API -local gui, gui_skin, audio, maps, materials, map_item = ...; +-- settings: The mod settings +local gui, gui_skin, audio, maps, materials, map_item, settings = ...; -local MAP_SIZE = 40; local SCALE_SMALL = 1; local SCALE_MEDIUM = 2; local SCALE_LARGE = 4; @@ -780,7 +780,7 @@ local function setup_table_node(pos) meta:get_inventory():set_size("copy_input", 1); meta:get_inventory():set_size("copy_output", 1); - meta:set_int("size", MAP_SIZE); + meta:set_int("size", settings.default_size); meta:set_int("scale", SCALE_SMALL); meta:set_int("detail", 0); end