2023-02-20 10:24:04 -06:00
--[[
Everness . Never ending discovery in Everness mapgen .
2024-01-03 13:50:17 -06:00
Copyright ( C ) 2024 SaKeL
2023-02-20 10:24:04 -06:00
This library is free software ; you can redistribute it and / or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation ; either
version 2.1 of the License , or ( at your option ) any later version .
This library is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
Lesser General Public License for more details .
--]]
2024-02-07 07:47:36 -06:00
-- Localize data buffer table outside the loop, to be re-used for all
-- mapchunks, therefore minimising memory use.
local data = { }
local p2data = { }
2023-02-20 10:24:04 -06:00
minetest.register_on_generated ( function ( minp , maxp , blockseed )
2024-02-07 23:18:29 -06:00
-- Start time of mapchunk generation.
-- local t0 = os.clock()
2023-02-20 10:24:04 -06:00
local rand = PcgRandom ( blockseed )
2024-02-07 22:54:52 -06:00
-- Array containing the biome IDs of nodes in the most recently generated chunk by the current mapgen
2024-01-28 10:22:28 -06:00
local biomemap = minetest.get_mapgen_object ( ' biomemap ' )
2024-02-07 22:54:52 -06:00
-- Table mapping requested generation notification types to arrays of positions at which the corresponding generated structures are located within the current chunk
2024-02-07 07:47:36 -06:00
local gennotify = minetest.get_mapgen_object ( ' gennotify ' )
2024-01-10 22:16:52 -06:00
-- Load the voxelmanip with the result of engine mapgen
2023-02-20 10:24:04 -06:00
local vm , emin , emax = minetest.get_mapgen_object ( ' voxelmanip ' )
2024-01-10 22:16:52 -06:00
-- 'area' is used later to get the voxelmanip indexes for positions
2023-02-20 10:24:04 -06:00
local area = VoxelArea : new ( { MinEdge = emin , MaxEdge = emax } )
-- Get the content ID data from the voxelmanip in the form of a flat array.
-- Set the buffer parameter to use and reuse 'data' for this.
vm : get_data ( data )
2024-02-07 22:54:52 -06:00
-- Raw `param2` data read into the `VoxelManip` object
2024-02-07 07:47:36 -06:00
vm : get_param2_data ( p2data )
2024-01-10 22:16:52 -06:00
-- Side length of mapchunk
2024-02-07 07:47:36 -06:00
local shared_args = { }
2024-02-07 22:54:52 -06:00
--
2024-02-07 07:47:36 -06:00
-- on_data
2024-02-07 22:54:52 -06:00
--
2024-02-07 07:47:36 -06:00
-- read/write to `data` what will be eventually saved (set_data)
-- used for voxelmanip `data` manipulation
for _ , def in ipairs ( Everness.on_generated_queue ) do
if def.can_run ( biomemap ) and def.on_data then
shared_args [ def.name ] = shared_args [ def.name ] or { }
def.on_data ( minp , maxp , area , data , p2data , gennotify , rand , shared_args [ def.name ] )
end
end
2024-02-07 22:54:52 -06:00
-- set data after they have been manipulated (from above)
2024-02-07 07:47:36 -06:00
vm : set_data ( data )
vm : set_param2_data ( p2data )
2024-02-07 22:54:52 -06:00
--
2024-02-07 07:47:36 -06:00
-- after_set_data
2024-02-07 22:54:52 -06:00
--
2024-02-10 15:22:40 -06:00
-- read-only (but cant and should not manipulate) voxelmanip `data`
2024-02-07 22:54:52 -06:00
-- used for `place_schematic_on_vmanip` which will invalidate `data`
-- therefore we are doing it after we set the data
2024-02-07 07:47:36 -06:00
for _ , def in ipairs ( Everness.on_generated_queue ) do
if def.can_run ( biomemap ) and def.after_set_data then
shared_args [ def.name ] = shared_args [ def.name ] or { }
def.after_set_data ( minp , maxp , vm , area , data , p2data , gennotify , rand , shared_args [ def.name ] )
end
end
2023-02-20 10:24:04 -06:00
2024-01-27 16:27:14 -06:00
-- Set the lighting within the `VoxelManip` to a uniform value
vm : set_lighting ( { day = 0 , night = 0 } , minp , maxp )
-- Calculate lighting for what has been created.
vm : calc_lighting ( )
-- Liquid nodes were placed so set them flowing.
vm : update_liquids ( )
-- Write what has been created to the world.
vm : write_to_map ( )
2024-02-07 07:47:36 -06:00
2024-02-07 22:54:52 -06:00
--
2024-02-07 07:47:36 -06:00
-- after_write_to_map
2024-02-07 22:54:52 -06:00
--
2024-02-07 07:47:36 -06:00
-- Cannot read/write voxelmanip or its data
2024-02-07 22:54:52 -06:00
-- Used for direct manipulation of the world chunk nodes where the
-- definitions of nodes are available and node callback can be executed
-- or e.g. for `minetest.fix_light`
2024-02-07 07:47:36 -06:00
for _ , def in ipairs ( Everness.on_generated_queue ) do
if def.can_run ( biomemap ) and def.after_write_to_map then
shared_args [ def.name ] = shared_args [ def.name ] or { }
2024-02-07 13:45:09 -06:00
def.after_write_to_map ( shared_args [ def.name ] , gennotify )
2024-02-07 07:47:36 -06:00
end
end
2024-01-27 16:27:14 -06:00
2024-02-07 23:18:29 -06:00
-- Print generation time of this mapchunk.
-- local chugent = math.ceil((os.clock() - t0) * 1000)
-- print('[Everness] Mapchunk generation time ' .. chugent .. ' ms')
2023-02-20 10:24:04 -06:00
end )