diff --git a/mods/MAPGEN/mcl_nether_fortresses/init.lua b/mods/MAPGEN/mcl_nether_fortresses/init.lua index 4067398ad..6a2bd1e9d 100644 --- a/mods/MAPGEN/mcl_nether_fortresses/init.lua +++ b/mods/MAPGEN/mcl_nether_fortresses/init.lua @@ -51,6 +51,9 @@ mcl_structures.register_structure_spawn({ name = "mobs_mc:witherskeleton", y_min = mcl_vars.mg_lava_nether_max, y_max = mcl_vars.mg_lava_nether_max + 32, + chance = 15, + interval = 60, + limit = 4, spawnon = { "mcl_blackstone:blackstone_chiseled_polished" }, }) @@ -130,3 +133,23 @@ mcl_structures.register_structure("nether_bulwark",{ }} }, }) + +mcl_structures.register_structure_spawn({ + name = "mobs_mc:piglin", + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + chance = 10, + interval = 60, + limit = 9, + spawnon = {"mcl_blackstone:blackstone_brick_polished","mcl_stairs:slab_blackstone_polished"}, +}) + +mcl_structures.register_structure_spawn({ + name = "mobs_mc:piglin_brute", + y_min = mcl_vars.mg_nether_min, + y_max = mcl_vars.mg_nether_max, + chance = 20, + interval = 60, + limit = 4, + spawnon = {"mcl_blackstone:blackstone_brick_polished","mcl_stairs:slab_blackstone_polished"}, +}) diff --git a/mods/MAPGEN/mcl_structures/api.lua b/mods/MAPGEN/mcl_structures/api.lua index 7e5b6547f..9918031f8 100644 --- a/mods/MAPGEN/mcl_structures/api.lua +++ b/mods/MAPGEN/mcl_structures/api.lua @@ -7,6 +7,7 @@ else disabled_structures = {} end local peaceful = minetest.settings:get_bool("only_peaceful_mobs", false) local mob_cap_player = tonumber(minetest.settings:get("mcl_mob_cap_player")) or 75 +local mob_cap_animal = tonumber(minetest.settings:get("mcl_mob_cap_animal")) or 10 local logging = minetest.settings:get_bool("mcl_logging_structures",true) @@ -378,7 +379,7 @@ function mcl_structures.register_structure_spawn(def) chance = def.chance or 5, action = function(pos, node, active_object_count, active_object_count_wider) local limit = def.limit or 7 - if active_object_count > limit then return end + if active_object_count_wider > limit + mob_cap_animal then return end if active_object_count_wider > mob_cap_player then return end local p = vector.offset(pos,0,1,0) if minetest.get_node(p).name ~= "air" then return end diff --git a/mods/MAPGEN/mcl_structures/end_city.lua b/mods/MAPGEN/mcl_structures/end_city.lua index 942d81366..5f432a0eb 100644 --- a/mods/MAPGEN/mcl_structures/end_city.lua +++ b/mods/MAPGEN/mcl_structures/end_city.lua @@ -2,14 +2,13 @@ local modname = minetest.get_current_modname() local S = minetest.get_translator(modname) local modpath = minetest.get_modpath(modname) +local spawnon = {"mcl_end:purpur_block"} + local function spawn_shulkers(pos,def,pr) - local nn = minetest.find_nodes_in_area_under_air(vector.offset(pos,-def.sidelen/2,-1,-def.sidelen/2),vector.offset(pos,def.sidelen/2,def.sidelen,def.sidelen/2),{"mcl_end:purpur_block"}) - if nn and #nn > 0 then - table.shuffle(nn) - for i = 1,pr:next(1,math.min(6,#nn)) do - minetest.add_entity(vector.offset(nn[i],0,0.5,0),"mobs_mc:shulker") - end - end + local p1 = vector.offset(pos,-def.sidelen/2,-1,-def.sidelen/2) + local p2 = vector.offset(pos,def.sidelen/2,def.sidelen,def.sidelen/2) + mcl_structures.spawn_mobs("mobs_mc:shulker",spawnon,p1,p2,pr,1) + local guard = minetest.find_node_near(pos,def.sidelen,{"mcl_itemframes:item_frame"}) if guard then minetest.add_entity(vector.offset(guard,0,-1.5,0),"mobs_mc:shulker") @@ -133,3 +132,13 @@ mcl_structures.register_structure("end_boat",{ }} } }) + +mcl_structures.register_structure_spawn({ + name = "mobs_mc:shulker", + y_min = mcl_vars.mg_end_min, + y_max = mcl_vars.mg_end_max, + chance = 10, + interval = 60, + limit = 6, + spawnon = spawnon, +}) diff --git a/mods/MAPGEN/mcl_structures/igloo.lua b/mods/MAPGEN/mcl_structures/igloo.lua index 64b4206c0..0fd8c6217 100644 --- a/mods/MAPGEN/mcl_structures/igloo.lua +++ b/mods/MAPGEN/mcl_structures/igloo.lua @@ -14,6 +14,24 @@ function mcl_structures.generate_igloo_top(pos, pr) end), rotation end +local function spawn_mobs(p1,p2,vi,zv) + local mc = minetest.find_nodes_in_area_under_air(p1,p2,{"mcl_core:stonebrickmossy"}) + if #mc == 2 then + local vp = mc[1] + local zp = mc[2] + if not vi and zv and zv:get_pos() and vector.distance(mc[1],zv:get_pos()) < 2 then + vp = mc[2] + elseif not zv and vi and vi:get_pos() and vector.distance(mc[2],vi:get_pos()) < 2 then + zp = mc[1] + elseif zv and vi then + return + end + vi = minetest.add_entity(vector.offset(mc[1],0,1,0),"mobs_mc:villager") + zv = minetest.add_entity(vector.offset(mc[2],0,1,0),"mobs_mc:villager_zombie") + minetest.after(1,spawn_mobs,p1,p2,vi,zv) + end +end + function mcl_structures.generate_igloo_basement(pos, orientation, loot, pr) -- TODO: Add monster eggs local path = modpath.."/schematics/mcl_structures_igloo_basement.mts" @@ -22,12 +40,7 @@ function mcl_structures.generate_igloo_basement(pos, orientation, loot, pr) local p2 = vector.offset(pos,5,5,5) mcl_structures.fill_chests(p1,p2,loot,pr) mcl_structures.construct_nodes(p1,p2,{"mcl_brewing:stand_000","mcl_books:bookshelf"}) - local mc = minetest.find_nodes_in_area_under_air(p1,p2,{"mcl_core:stonebrickmossy"}) - if #mc == 2 then - table.shuffle(mc) - minetest.add_entity(vector.offset(mc[1],0,1,0),"mobs_mc:villager") - minetest.add_entity(vector.offset(mc[2],0,1,0),"mobs_mc:villager_zombie") - end + spawn_mobs(p1,p2) end, pr) end diff --git a/mods/MAPGEN/mcl_structures/pillager_outpost.lua b/mods/MAPGEN/mcl_structures/pillager_outpost.lua index 3b337886c..5f25a839d 100644 --- a/mods/MAPGEN/mcl_structures/pillager_outpost.lua +++ b/mods/MAPGEN/mcl_structures/pillager_outpost.lua @@ -3,6 +3,8 @@ local S = minetest.get_translator(modname) local modpath = minetest.get_modpath(modname) local peaceful = minetest.settings:get_bool("only_peaceful_mobs", false) +local spawnon = {"mcl_core:stripped_oak"} + mcl_structures.register_structure("pillager_outpost",{ place_on = {"group:grass_block","group:dirt","mcl_core:dirt_with_grass","group:sand"}, fill_ratio = 0.01, @@ -58,27 +60,27 @@ mcl_structures.register_structure("pillager_outpost",{ after_place = function(p,def,pr) local p1 = vector.offset(p,-7,0,-7) local p2 = vector.offset(p,7,14,7) - local spawnon = {"mcl_core:stripped_oak"} - local sp = minetest.find_nodes_in_area_under_air(p1,p2,spawnon) - for _,n in pairs(minetest.find_nodes_in_area(p1,p2,{"group:wall"})) do - local def = minetest.registered_nodes[minetest.get_node(n).name:gsub("_%d+$","")] - if def and def.on_construct then - def.on_construct(n) - end - end - if not peaceful then - if sp and #sp > 0 then - for i=1,5 do - local pos = vector.offset(sp[pr:next(1,#sp)],0,1,0) - if pos then - minetest.add_entity(pos,"mobs_mc:pillager") - end - end - local pos = vector.offset(sp[pr:next(1,#sp)],0,1,0) - if pos then - minetest.add_entity(pos,"mobs_mc:evoker") - end - end - end + mcl_structures.spawn_mobs("mobs_mc:pillager",spawnon,p1,p2,pr,5) + mcl_structures.spawn_mobs("mobs_mc:evoker",spawnon,p1,p2,pr,1) end }) + +mcl_structures.register_structure_spawn({ + name = "mobs_mc:pillager", + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + chance = 10, + interval = 60, + limit = 9, + spawnon = spawnon, +}) + +mcl_structures.register_structure_spawn({ + name = "mobs_mc:evoker", + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + chance = 100, + interval = 60, + limit = 4, + spawnon = spawnon, +}) diff --git a/mods/MAPGEN/mcl_structures/woodland_mansion.lua b/mods/MAPGEN/mcl_structures/woodland_mansion.lua index ca1464fef..c4d494871 100644 --- a/mods/MAPGEN/mcl_structures/woodland_mansion.lua +++ b/mods/MAPGEN/mcl_structures/woodland_mansion.lua @@ -3,6 +3,8 @@ local S = minetest.get_translator(modname) local modpath = minetest.get_modpath(modname) local peaceful = minetest.settings:get_bool("only_peaceful_mobs", false) +local spawnon = {"mcl_deepslate:deepslate","mcl_core:birchwood","mcl_wool:red_carpet","mcl_wool:brown_carpet"} + mcl_structures.register_structure("woodland_cabin",{ place_on = {"group:grass_block","group:dirt","mcl_core:dirt_with_grass"}, fill_ratio = 0.01, @@ -20,28 +22,11 @@ mcl_structures.register_structure("woodland_cabin",{ }, construct_nodes = {"mcl_barrels:barrel_closed"}, after_place = function(p,def,pr) - local spawnon = {"mcl_deepslate:deepslate","mcl_core:birchwood","mcl_wool:red_carpet","mcl_wool:brown_carpet"} local p1=vector.offset(p,-def.sidelen,-1,-def.sidelen) local p2=vector.offset(p,def.sidelen,def.sidelen,def.sidelen) - local sp = minetest.find_nodes_in_area_under_air(p1,p2,spawnon) - if not peaceful then - if sp and #sp > 0 then - for i=1,5 do - local pos = sp[pr:next(1,#sp)] - if pos then - minetest.add_entity(pos,"mobs_mc:vindicator") - end - end - local pos = sp[pr:next(1,#sp)] - if pos then - minetest.add_entity(pos,"mobs_mc:evoker") - end - end - end - local parrot = minetest.find_node_near(p,25,{"mcl_heads:wither_skeleton"}) - if parrot then - minetest.add_entity(parrot,"mobs_mc:parrot") - end + mcl_structures.spawn_mobs("mobs_mc:vindicator",spawnon,p1,p2,pr,5) + mcl_structures.spawn_mobs("mobs_mc:evoker",spawnon,p1,p2,pr,1) + mcl_structures.spawn_mobs("mobs_mc:parrot",{"mcl_heads:wither_skeleton"},p1,p2,pr,1) end, loot = { ["mcl_chests:chest_small" ] ={{ @@ -82,3 +67,23 @@ mcl_structures.register_structure("woodland_cabin",{ }} } }) + +mcl_structures.register_structure_spawn({ + name = "mobs_mc:vindicator", + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + chance = 10, + interval = 60, + limit = 6, + spawnon = spawnon, +}) + +mcl_structures.register_structure_spawn({ + name = "mobs_mc:evoker", + y_min = mcl_vars.mg_overworld_min, + y_max = mcl_vars.mg_overworld_max, + chance = 50, + interval = 60, + limit = 6, + spawnon = spawnon, +})