From 279b1b09cdbbb2f51147ed1d10f862ca0c090dfd Mon Sep 17 00:00:00 2001 From: kay27 Date: Sat, 8 May 2021 02:51:17 +0400 Subject: [PATCH] [mapgen] Add `mcl_mapgen.priorities` table --- mods/CORE/mcl_mapgen/API.md | 84 +++++++++++++++++----------- mods/CORE/mcl_mapgen/init.lua | 17 ++++-- mods/MAPGEN/mcl_biomes/init.lua | 2 +- mods/MAPGEN/mcl_dungeons/init.lua | 2 +- mods/MAPGEN/mcl_strongholds/init.lua | 2 +- mods/MAPGEN/mcl_villages/init.lua | 2 +- 6 files changed, 68 insertions(+), 41 deletions(-) diff --git a/mods/CORE/mcl_mapgen/API.md b/mods/CORE/mcl_mapgen/API.md index 364bc3205..b5afbeb4d 100644 --- a/mods/CORE/mcl_mapgen/API.md +++ b/mods/CORE/mcl_mapgen/API.md @@ -1,54 +1,74 @@ # mcl_mapgen ============ -This mod helps to avoid problems caused by Minetest's 'chunk-in-shell' feature of mapgen.cpp. -It also queues your generators to run them in proper order. +Helps to avoid problems caused by 'chunk-in-shell' feature of mapgen.cpp. +It also queues your generators to run them in proper order: - -========================================================================= ## mcl_mapgen.register_chunk_generator(chunk_callback_function, priority) ========================================================================= -UNSAFE! See below. Registers callback function to be called when current chunk generation is finished. - `callback_function`: chunk callback function definition, see below; - `priority`: order number - the less, the earlier. -### Chunk callback function definition: - `function(minp, maxp, seed)`: - `minp` & `maxp`: minimum and maximum chunk position; - `seed`: seed of this mapchunk. - - -======================================================================= -## mcl_mapgen.register_chunk_generator_lvm(callback_function, priority) -======================================================================= -UNSAFE! See below. Registers callback function to be called when current chunk generation is finished. -`vm_context` passes into callback function and should be returned back. - `callback_function`: chunk callback LVM function definition, see below; - `priority`: order number - the less, the earlier. -### Chunk callback LVM function definition: - Function MUST RETURN `vm_context`. It passes into next callback function from the queue. - `function(vm_context)`: - `vm_context` is a table which already contains some LVM data and some of them can be added in callback function: +Registers callback function to be called when current chunk generation is finished. + `callback_function`: chunk callback function definition: + `function(minp, maxp, seed)`: `minp` & `maxp`: minimum and maximum chunk position; - `seed`: seed of this mapchunk. + `seed`: seed of this mapchunk; + `priority` (optional): order number - the less, the earlier, + e.g. `mcl_mapgen.priorities.BUILDINGS` or `mcl_mapgen.priorities.LARGE_BUILDINGS` - -=================================================================== ## mcl_mapgen.register_block_generator(callback_function, priority) =================================================================== Registers callback function to be called when block (usually 16x16x16 nodes) generation is finished. `callback_function`: block callback function definition, see below; - `priority`: order number - the less, the earlier. + `priority` (optional): order number - the less, the earlier, + e.g. `mcl_mapgen.priorities.BUILDINGS` or `mcl_mapgen.priorities.LARGE_BUILDINGS` - -======================================================================= ## mcl_mapgen.register_block_generator_lvm(callback_function, priority) ======================================================================= Registers callback function to be called when block (usually 16x16x16 nodes) generation is finished. `vm_context` passes into callback function and should be returned back. `callback_function`: block callback LVM function definition, see below; - `priority`: order number - the less, the earlier. + `priority` (optional): order number - the less, the earlier, + e.g. `mcl_mapgen.priorities.BUILDINGS` or `mcl_mapgen.priorities.LARGE_BUILDINGS` +## mcl_mapgen.register_chunk_generator_lvm(callback_function, priority) +======================================================================= +UNSAFE! See https://git.minetest.land/MineClone2/MineClone2/issues/1395 +Registers callback function to be called when current chunk generation is finished. +IT IS UNSAFE! GROUND CONTENT YOU PLACE (INCLUDING WATER AND AIR) CAN BE OVERWRITTEN BY cavegen. +ALL OTHER API FUNCTIONS ARE SAFE! USE THEM PLEASE! BUT WE NEED THIS FUNCTION STILL SOMETIMES, +WHEN WE NEED TO ACCESS MAPGEN OBJECTS like `heightmap`, `biomemap`, ETC. + `callback_function`: chunk callback LVM function definition, see below; + `function(vm_context)`: + Function MUST RETURN `vm_context` back anyway! It will passed into next callback function from the queue. + `vm_context`: a table which already contains some LVM data if the fields, and some of them can be added right in callback function: + `vm`: curent voxel manipulator object itself; + `blockseed`: seed of this mapchunk; + `minp` & `maxp`: minimum and maximum chunk position; + `emin` & `emax`: minimum and maximum chunk position WITH SHELL AROUND IT; + `area`: voxel area, can be helpful to access data; + `data`: LVM buffer data array, data loads into it before the callbacks; + `write`: set it to true in yout callback functionm, if you changed `data` and want to write it; + `data2`: LVM buffer data array of `param2`, !NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS! - you load it yourfels: + `vm_context.data2 = vm_context.data2 or vm_context.vm.get_param2_data(vm_context.lvm_param2_buffer)` + `write_param2`: set it to true in yout callback functionm, if you used `data2` and want to write it; + `lvm_param2_buffer`: static `param2` buffer pointer, used to load `data2` array; + `shadow`: set it to false to disable shadow propagation; + `heightmap`: mapgen object contanting y coordinates of ground level, + !NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS! - you load it yourfels: + `vm_context.heightmap = vm_context.heightmap or minetest.get_mapgen_object('heightmap')` + `biomemap`: mapgen object contanting biome IDs of nodes, + !NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS! - you load it yourfels: + `vm_context.biomemap = vm_context.biomemap or minetest.get_mapgen_object('biomemap')` + `heatmap`: mapgen object contanting temperature values of nodes, + !NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS! - you load it yourfels: + `vm_context.heatmap = vm_context.heatmap or minetest.get_mapgen_object('heatmap')` + `humiditymap`: mapgen object contanting humidity values of nodes, + !NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS! - you load it yourfels: + `vm_context.humiditymap = vm_context.humiditymap or minetest.get_mapgen_object('humiditymap')` + `gennotify`: mapgen object contanting mapping table of structures, see Minetest Lua API for explanation, + !NO ANY DATA LOADS INTO IT BEFORE THE CALLBACKS! - you load it yourfels: + `vm_context.gennotify = vm_context.gennotify or minetest.get_mapgen_object('gennotify')` + `priority` (optional): order number - the less, the earlier, + e.g. `mcl_mapgen.priorities.BUILDINGS` or `mcl_mapgen.priorities.LARGE_BUILDINGS` -=============================== ## mcl_mapgen.get_far_node(pos) =============================== Returns node if it is generated. Otherwise returns `{name = "ignore"}`. diff --git a/mods/CORE/mcl_mapgen/init.lua b/mods/CORE/mcl_mapgen/init.lua index a5982ae4e..992c93b0d 100644 --- a/mods/CORE/mcl_mapgen/init.lua +++ b/mods/CORE/mcl_mapgen/init.lua @@ -1,7 +1,14 @@ mcl_mapgen = {} -local priority = { - OCEAN_MONUMENT = 1000000 +local priorities = { -- mcl_mapgen.priorities... + DEFAULT = 5000, + CHORUS = 100000, + BUILDINGS = 200000, + VILLAGES = 900000, + DUNGEONS = 950000, + STRONGHOLDS = 999999, + OCEAN_MONUMENT = 1000000, + LARGE_BUILDINGS = 2000000, } local math_floor = math.floor @@ -62,7 +69,7 @@ local CS_NODES = mcl_mapgen.CS_NODES -- 80 local CS_3D = CS * CS * CS -local DEFAULT_PRIORITY = 5000 +local DEFAULT_PRIORITY = priorities.DEFAULT function mcl_mapgen.register_chunk_generator(callback_function, priority) nodes_chunk = nodes_chunk + 1 @@ -261,7 +268,7 @@ minetest.register_on_generated(function(minp, maxp, blockseed) if vm_context.write_param2 then vm:set_param2_data(data2) end - vm:calc_lighting(minp, maxp, vm_context.shadow) -- TODO: check boundaries + vm:calc_lighting(minp, maxp, vm_context.shadow or true) -- TODO: check boundaries vm:write_to_map() vm:update_liquids() end @@ -403,4 +410,4 @@ mcl_mapgen.overworld = overworld mcl_mapgen.end_ = end_ mcl_mapgen.nether = nether -mcl_mapgen.priorities = priority +mcl_mapgen.priorities = priorities diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index a35183c15..80975d6e4 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -3979,7 +3979,7 @@ if not mcl_mapgen.singlenode then minetest.after(1, mcl_end.grow_chorus_plant, realpos) end return c - end) + end, mcl_mapgen.priorities.CHORUS) end end diff --git a/mods/MAPGEN/mcl_dungeons/init.lua b/mods/MAPGEN/mcl_dungeons/init.lua index 03a5c4e07..b333f4d8a 100644 --- a/mods/MAPGEN/mcl_dungeons/init.lua +++ b/mods/MAPGEN/mcl_dungeons/init.lua @@ -413,4 +413,4 @@ function mcl_dungeons.spawn_dungeon(p1, _, pr) spawn_dungeon(p1, p2, dim, pr, true) end -mcl_mapgen.register_chunk_generator(dungeons_nodes, 999999) +mcl_mapgen.register_chunk_generator(dungeons_nodes, mcl_mapgen.priorities.DUNGEONS) diff --git a/mods/MAPGEN/mcl_strongholds/init.lua b/mods/MAPGEN/mcl_strongholds/init.lua index e4bbdb974..d4dd8a99c 100644 --- a/mods/MAPGEN/mcl_strongholds/init.lua +++ b/mods/MAPGEN/mcl_strongholds/init.lua @@ -100,4 +100,4 @@ mcl_mapgen.register_chunk_generator(function(minp, maxp, blockseed) end end end -end, 999999) +end, mcl_mapgen.priorities.STRONGHOLDS) diff --git a/mods/MAPGEN/mcl_villages/init.lua b/mods/MAPGEN/mcl_villages/init.lua index 6e30f7b1c..3c3cf3291 100644 --- a/mods/MAPGEN/mcl_villages/init.lua +++ b/mods/MAPGEN/mcl_villages/init.lua @@ -103,7 +103,7 @@ if mg_name ~= "singlenode" then if height_difference > max_height_difference then return end build_a_settlement(minp, maxp, blockseed) - end) + end, mcl_mapgen.priorities.VILLAGES) end -- manually place villages if minetest.is_creative_enabled("") then