[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
============
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:
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_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;
`seed`: seed of this mapchunk.
===================================================================
## 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"}`.

View File

@ -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

View File

@ -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

View File

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

View File

@ -100,4 +100,4 @@ mcl_mapgen.register_chunk_generator(function(minp, maxp, blockseed)
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
build_a_settlement(minp, maxp, blockseed)
end)
end, mcl_mapgen.priorities.VILLAGES)
end
-- manually place villages
if minetest.is_creative_enabled("") then