diff --git a/mods/MAPGEN/mcl_geodes/init.lua b/mods/MAPGEN/mcl_geodes/init.lua index d2debf7cd..db79d2e5e 100644 --- a/mods/MAPGEN/mcl_geodes/init.lua +++ b/mods/MAPGEN/mcl_geodes/init.lua @@ -8,7 +8,7 @@ local adjacents = { } local function makegeode(pos,pr) - local size = pr:next(2,8) + local size = pr:next(4,7) local p1 = vector.offset(pos,-size,-size,-size) local p2 = vector.offset(pos,size,size,size) local nn = minetest.find_nodes_in_area(p1,p2,{"group:material_stone"}) @@ -47,21 +47,20 @@ local function makegeode(pos,pr) minetest.set_node(vector.offset(v,0,1,0),{name="mcl_amethyst:amethyst_cluster",param2=1}) end end + return true end mcl_structures.register_structure("geode",{ place_on = {"mcl_core:stone"}, - spawn_by = {"air"}, - num_spawn_by = 2, - fill_ratio = 0.002, + fill_ratio = 0.0001, flags = "place_center_x, place_center_z, force_placement", biomes = ocean_biomes, - y_max = mcl_vars.mg_overworld_max, + y_max = -24, y_min = mcl_vars.mg_overworld_min, filenames = schems, y_offset = function(pr) return pr:next(-4,-2) end, place_func = function(pos,def,pr) local p = vector.new(pos.x + pr:next(-30,30),pos.y,pos.z + pr:next(-30,30)) - makegeode(pos,pr) - end, + return makegeode(pos,pr) + end }) diff --git a/mods/MAPGEN/mcl_structures/API.md b/mods/MAPGEN/mcl_structures/API.md index 52d40b642..23d93c712 100644 --- a/mods/MAPGEN/mcl_structures/API.md +++ b/mods/MAPGEN/mcl_structures/API.md @@ -1,7 +1,9 @@ # mcl_structures Structure placement API for MCL2. -## mcl_structures.register_structure(name,structure definition) +## mcl_structures.register_structure(name,structure definition,nospawn) +If nospawn is truthy the structure will not be placed by mapgen and the decoration parameters can be omitted. This is intended for secondary structures the placement of which gets triggered by the placement of other structures. It can also be used to register testing structures so they can be used with /spawnstruct. + ### structure definition { fill_ratio = OR noise = {}, @@ -14,9 +16,9 @@ Structure placement API for MCL2. flags = (default: "place_center_x, place_center_z, force_placement") (same as decoration def) y_offset =, --can be a number or a function returning a number - filenames = {} OR place_func = function(pos,filename) - -- filenames can be a list of any schematics accepted by mcl_structures.place_schematic - after_place = function(pos) + filenames = {} OR place_func = function(pos,def,pr) + -- filenames can be a list of any schematics accepted by mcl_structures.place_schematic / minetest.place_schematic + after_place = function(pos,def,pr) } ## mcl_structures.registered_structures Table of the registered structure defintions indexed by name. diff --git a/mods/MAPGEN/mcl_structures/api.lua b/mods/MAPGEN/mcl_structures/api.lua index be86df530..2235d4405 100644 --- a/mods/MAPGEN/mcl_structures/api.lua +++ b/mods/MAPGEN/mcl_structures/api.lua @@ -1,24 +1,8 @@ mcl_structures.registered_structures = {} ---[[] structure def: -{ - fill_ratio = OR noise = {} - 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) -} -]]-- - function mcl_structures.place_structure(pos, def, pr) - if not def then return end + if not def then return end + local y_offset = 0 if type(def.y_offset) == "function" then y_offset = def.y_offset(pr) elseif def.y_offset then @@ -28,9 +12,15 @@ function mcl_structures.place_structure(pos, def, pr) 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}) + minetest.log("action","[mcl_structures] "..def.name.." placed at "..minetest.pos_to_string(pos)) + return true elseif def.place_func and def.place_func(pos,def,pr) then - def.after_place(pos,def,pr) + if not def.after_place or ( def.after_place and def.after_place(pos,def,pr) ) then + minetest.log("action","[mcl_structures] "..def.name.." placed at "..minetest.pos_to_string(pos)) + return true + end end + minetest.log("warning","[mcl_structures] placing "..def.name.." failed at "..minetest.pos_to_string(pos)) end 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