2022-06-06 03:34:31 +02:00
local registered_structures = { }
--[[] structure def:
{
2022-06-10 01:49:33 +02:00
fill_ratio = OR noise = { }
2022-06-06 03:34:31 +02:00
biomes =
y_min =
y_max =
place_on =
spawn_by =
num_spawn_by =
flags = ( default : " place_center_x, place_center_z, force_placement " )
( same as decoration def )
y_offset =
filenames = { } OR place_func = function ( pos , filename )
after_place = function ( pos )
}
] ] --
2022-06-10 01:06:24 +02:00
local function place_schem ( pos , def , pr )
if not def then return end
if type ( def.y_offset ) == " function " then
y_offset = def.y_offset ( pr )
elseif def.y_offset then
y_offset = def.y_offset
end
if def.filenames then
local file = def.filenames [ pr : next ( 1 , # def.filenames ) ]
local pp = vector.offset ( pos , 0 , y_offset , 0 )
mcl_structures.place_schematic ( pp , file , " random " , nil , true , " place_center_x,place_center_z " , def.after_place , pr , { pos , def } )
2022-06-10 01:49:33 +02:00
elseif def.place_func and def.place_func ( pos , def , pr ) then
def.after_place ( pos , def , pr )
2022-06-10 01:06:24 +02:00
end
end
2022-06-06 03:34:31 +02:00
function mcl_structures . register_structure ( name , def , nospawn ) --nospawn means it will be placed by another (non-nospawn) structure that contains it's structblock i.e. it will not be placed by mapgen directly
local structblock = " mcl_structures:structblock_ " .. name
local flags = " place_center_x, place_center_z, force_placement "
local y_offset = 0
2022-06-10 01:06:24 +02:00
local sbgroups = { structblock = 1 , not_in_creative_inventory = 1 }
2022-06-06 03:34:31 +02:00
if def.flags then flags = def.flags end
def.name = name
2022-06-10 01:06:24 +02:00
if nospawn then
sbgroups.structblock = nil
sbgroups.structblock_lbm = 1
else
2022-06-06 03:34:31 +02:00
def.deco = minetest.register_decoration ( {
2022-06-10 01:06:24 +02:00
name = " mcl_structures:deco_ " .. name ,
2022-06-06 03:34:31 +02:00
decoration = structblock ,
deco_type = " simple " ,
place_on = def.place_on ,
spawn_by = def.spawn_by ,
num_spawn_by = def.num_spawn_by ,
sidelen = 80 ,
fill_ratio = def.fill_ratio ,
noise = def.noise ,
flags = flags ,
biomes = def.biomes ,
y_max = def.y_max ,
y_min = def.y_min
} )
2022-06-10 01:06:24 +02:00
local deco_id = minetest.get_decoration_id ( " mcl_structures:deco_ " .. name )
minetest.set_gen_notify ( { decoration = true } , { deco_id } )
minetest.register_on_generated ( function ( minp , maxp , blockseed )
local gennotify = minetest.get_mapgen_object ( " gennotify " )
local pr = PseudoRandom ( blockseed + 42 )
for _ , pos in pairs ( gennotify [ " decoration# " .. deco_id ] or { } ) do
local realpos = vector.offset ( pos , 0 , - 1 , 0 )
minetest.remove_node ( realpos )
place_schem ( realpos , def , pr )
end
end )
2022-06-06 03:34:31 +02:00
end
2022-06-10 01:06:24 +02:00
minetest.register_node ( " : " .. structblock , { drawtype = " airlike " , walkable = false , pointable = false , groups = sbgroups } )
2022-06-06 03:34:31 +02:00
registered_structures [ name ] = def
end
2022-06-10 01:06:24 +02:00
--lbm for secondary structures (structblock included in base structure)
2022-06-06 03:34:31 +02:00
minetest.register_lbm ( {
name = " mcl_structures:struct_lbm " ,
run_at_every_load = true ,
2022-06-10 01:06:24 +02:00
nodenames = { " group:structblock_lbm " } ,
2022-06-06 03:34:31 +02:00
action = function ( pos , node )
local name = node.name : gsub ( " mcl_structures:structblock_ " , " " )
local def = registered_structures [ name ]
2022-06-10 01:06:24 +02:00
if not def then return end
minetest.remove_node ( pos )
place_schem ( pos )
2022-06-06 03:34:31 +02:00
end
} )