[mapgen] Add `mcl_mapgen.priorities` table

This commit is contained in:
kay27 2021-05-08 02:51:17 +04:00
parent 3bd1a6f89e
commit 279b1b09cd
6 changed files with 68 additions and 41 deletions

View File

@ -1,54 +1,74 @@
# mcl_mapgen # mcl_mapgen
============ ============
This mod helps to avoid problems caused by Minetest's 'chunk-in-shell' feature of mapgen.cpp. Helps to avoid problems caused by 'chunk-in-shell' feature of mapgen.cpp.
It also queues your generators to run them in proper order. It also queues your generators to run them in proper order:
=========================================================================
## mcl_mapgen.register_chunk_generator(chunk_callback_function, priority) ## mcl_mapgen.register_chunk_generator(chunk_callback_function, priority)
========================================================================= =========================================================================
UNSAFE! See below. Registers callback function to be called when current chunk generation is finished. Registers callback function to be called when current chunk generation is finished.
`callback_function`: chunk callback function definition, see below; `callback_function`: chunk callback function definition:
`priority`: order number - the less, the earlier. `function(minp, maxp, seed)`:
### 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:
`minp` & `maxp`: minimum and maximum chunk position; `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) ## mcl_mapgen.register_block_generator(callback_function, priority)
=================================================================== ===================================================================
Registers callback function to be called when block (usually 16x16x16 nodes) generation is finished. Registers callback function to be called when block (usually 16x16x16 nodes) generation is finished.
`callback_function`: block callback function definition, see below; `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) ## mcl_mapgen.register_block_generator_lvm(callback_function, priority)
======================================================================= =======================================================================
Registers callback function to be called when block (usually 16x16x16 nodes) generation is finished. 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. `vm_context` passes into callback function and should be returned back.
`callback_function`: block callback LVM function definition, see below; `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) ## mcl_mapgen.get_far_node(pos)
=============================== ===============================
Returns node if it is generated. Otherwise returns `{name = "ignore"}`. Returns node if it is generated. Otherwise returns `{name = "ignore"}`.

View File

@ -1,7 +1,14 @@
mcl_mapgen = {} mcl_mapgen = {}
local priority = { local priorities = { -- mcl_mapgen.priorities...
OCEAN_MONUMENT = 1000000 DEFAULT = 5000,
CHORUS = 100000,
BUILDINGS = 200000,
VILLAGES = 900000,
DUNGEONS = 950000,
STRONGHOLDS = 999999,
OCEAN_MONUMENT = 1000000,
LARGE_BUILDINGS = 2000000,
} }
local math_floor = math.floor local math_floor = math.floor
@ -62,7 +69,7 @@ local CS_NODES = mcl_mapgen.CS_NODES -- 80
local CS_3D = CS * CS * CS local CS_3D = CS * CS * CS
local DEFAULT_PRIORITY = 5000 local DEFAULT_PRIORITY = priorities.DEFAULT
function mcl_mapgen.register_chunk_generator(callback_function, priority) function mcl_mapgen.register_chunk_generator(callback_function, priority)
nodes_chunk = nodes_chunk + 1 nodes_chunk = nodes_chunk + 1
@ -261,7 +268,7 @@ minetest.register_on_generated(function(minp, maxp, blockseed)
if vm_context.write_param2 then if vm_context.write_param2 then
vm:set_param2_data(data2) vm:set_param2_data(data2)
end 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:write_to_map()
vm:update_liquids() vm:update_liquids()
end end
@ -403,4 +410,4 @@ mcl_mapgen.overworld = overworld
mcl_mapgen.end_ = end_ mcl_mapgen.end_ = end_
mcl_mapgen.nether = nether mcl_mapgen.nether = nether
mcl_mapgen.priorities = priority mcl_mapgen.priorities = priorities

View File

@ -3979,7 +3979,7 @@ if not mcl_mapgen.singlenode then
minetest.after(1, mcl_end.grow_chorus_plant, realpos) minetest.after(1, mcl_end.grow_chorus_plant, realpos)
end end
return c return c
end) end, mcl_mapgen.priorities.CHORUS)
end end
end end

View File

@ -413,4 +413,4 @@ function mcl_dungeons.spawn_dungeon(p1, _, pr)
spawn_dungeon(p1, p2, dim, pr, true) spawn_dungeon(p1, p2, dim, pr, true)
end end
mcl_mapgen.register_chunk_generator(dungeons_nodes, 999999) mcl_mapgen.register_chunk_generator(dungeons_nodes, mcl_mapgen.priorities.DUNGEONS)

View File

@ -100,4 +100,4 @@ mcl_mapgen.register_chunk_generator(function(minp, maxp, blockseed)
end end
end end
end end
end, 999999) end, mcl_mapgen.priorities.STRONGHOLDS)

View File

@ -103,7 +103,7 @@ if mg_name ~= "singlenode" then
if height_difference > max_height_difference then return end if height_difference > max_height_difference then return end
build_a_settlement(minp, maxp, blockseed) build_a_settlement(minp, maxp, blockseed)
end) end, mcl_mapgen.priorities.VILLAGES)
end end
-- manually place villages -- manually place villages
if minetest.is_creative_enabled("") then if minetest.is_creative_enabled("") then