More fixes, make shulkers spawn on the floor.

This commit is contained in:
kno10 2024-08-31 23:51:58 +02:00
parent 1b5598f527
commit 0c4a120191
4 changed files with 40 additions and 42 deletions

View File

@ -114,10 +114,9 @@ mcl_mobs.register_mob("mobs_mc:shulker", {
for n=1, math.min(64, #nodes) do for n=1, math.min(64, #nodes) do
local r = pr:next(1, #nodes) local r = pr:next(1, #nodes)
local nodepos = nodes[r] local nodepos = nodes[r]
local tg = vector.offset(nodepos,0,1,0) local tg = vector.offset(nodepos,0,0.5,0)
if check_spot(tg) then if check_spot(tg) then
telepos = tg telepos = tg
node_ok = true
end end
end end
if telepos then if telepos then

View File

@ -7,14 +7,14 @@ local function spawn_shulkers(pos,def,pr,p1,p2)
vl_structures.spawn_mobs("mobs_mc:shulker",spawnon,p1,p2,pr,1) vl_structures.spawn_mobs("mobs_mc:shulker",spawnon,p1,p2,pr,1)
local guard = minetest.find_nodes_in_area(p1,p2,{"mcl_itemframes:item_frame"}) local guard = minetest.find_nodes_in_area(p1,p2,{"mcl_itemframes:item_frame"})
if #guard > 0 then if #guard > 0 then
minetest.add_entity(vector.offset(guard[1],0,-0.5,0),"mobs_mc:shulker") -- fixme: MCLA uses -0.5? minetest.add_entity(vector.offset(guard[1],0,-1.5,0),"mobs_mc:shulker")
end end
end end
vl_structures.register_structure("end_shipwreck",{ vl_structures.register_structure("end_shipwreck",{
place_on = {"mcl_end:end_stone"}, place_on = {"mcl_end:end_stone"},
flags = "place_center_x, place_center_z, all_floors", flags = "place_center_x, place_center_z, all_floors",
y_offset = function(pr) return pr:next(20,50) end, y_offset = function(pr) return pr:next(15,40) end,
force_placement = false, force_placement = false,
prepare = { foundation = false, clear = false }, prepare = { foundation = false, clear = false },
chunk_probability = 25, chunk_probability = 25,
@ -83,7 +83,7 @@ vl_structures.register_structure("end_shipwreck",{
vl_structures.register_structure("end_boat",{ vl_structures.register_structure("end_boat",{
place_on = {"mcl_end:end_stone"}, place_on = {"mcl_end:end_stone"},
flags = "place_center_x, place_center_z, all_floors", flags = "place_center_x, place_center_z, all_floors",
y_offset = function(pr) return pr:next(15,30) end, y_offset = function(pr) return pr:next(10,20) end,
force_placement = false, force_placement = false,
prepare = { foundation = false, clear = false }, prepare = { foundation = false, clear = false },
chunk_probability = 10, chunk_probability = 10,
@ -143,7 +143,7 @@ vl_structures.register_structure("small_end_city",{
flags = "place_center_x, place_center_z, all_floors", flags = "place_center_x, place_center_z, all_floors",
y_offset = 0, y_offset = 0,
chunk_probability = 30, chunk_probability = 30,
prepare = { foundation = 2 }, prepare = { foundation = -1, tolerance = 15 },
biomes = { "End", "EndHighlands", "EndMidlands", "EndBarrens", "EndSmallIslands" }, biomes = { "End", "EndHighlands", "EndMidlands", "EndBarrens", "EndSmallIslands" },
sidelen = 20, sidelen = 20,
filenames = { filenames = {

View File

@ -1,6 +1,7 @@
-- todo: move this mostly to the mcl_mobs module? -- todo: move this mostly to the mcl_mobs module?
local mob_cap_player = tonumber(minetest.settings:get("mcl_mob_cap_player")) or 75 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 mob_cap_animal = tonumber(minetest.settings:get("mcl_mob_cap_animal")) or 10
local peaceful = minetest.settings:get_bool("only_peaceful_mobs", false)
local mg_name = minetest.get_mapgen_setting("mg_name") local mg_name = minetest.get_mapgen_setting("mg_name")
local vector_offset = vector.offset local vector_offset = vector.offset
@ -43,8 +44,41 @@ function vl_structures.register_structure_spawn(def)
end end
local mobdef = minetest.registered_entities[def.name] local mobdef = minetest.registered_entities[def.name]
if mobdef.can_spawn and not mobdef.can_spawn(p) then return end if mobdef.can_spawn and not mobdef.can_spawn(p) then return end
minetest.add_entity(p, def.name) minetest.add_entity(vector_offset(p, 0, -0.5, 0), def.name)
end, end,
}) })
end end
--- Spawn mobs for a structure
-- @param mob string: mob to spawn
-- @param spawnon string or table: nodes to spawn on
-- @param p1 vector: Lowest coordinates of range
-- @param p2 vector: Highest coordinates of range
-- @param pr PseudoRandom: random generator
-- @param n number: Number of mobs to spawn
-- @param water boolean: Spawn water mobs
function vl_structures.spawn_mobs(mob,spawnon,p1,p2,pr,n,water)
n = n or 1
local sp = {}
if water then
local nn = minetest.find_nodes_in_area(p1,p2,spawnon)
for k,v in pairs(nn) do
if minetest.get_item_group(minetest.get_node(vector_offset(v,0,1,0)).name,"water") > 0 then
table.insert(sp,v)
end
end
else
sp = minetest.find_nodes_in_area_under_air(p1,p2,spawnon)
end
table.shuffle(sp)
local count = 0
local mob_def = minetest.registered_entities[mob]
local enabled = (not peaceful) or (mob_def and mob_spawn_class ~= "hostile")
for _, node in pairs(sp) do
if enabled and count < n and minetest.add_entity(vector_offset(node, 0, 0.5, 0), mob) then
count = count + 1
end
minetest.get_meta(node):set_string("spawnblock", "yes") -- note: also in peaceful mode!
end
end

View File

@ -1,5 +1,3 @@
local peaceful = minetest.settings:get_bool("only_peaceful_mobs", false)
local floor = math.floor local floor = math.floor
local vector_offset = vector.offset local vector_offset = vector.offset
@ -97,36 +95,3 @@ function vl_structures.fill_chests(p1,p2,loot,pr)
end end
end end
--- Spawn mobs for a structure
-- @param mob string: mob to spawn
-- @param spawnon string or table: nodes to spawn on
-- @param p1 vector: Lowest coordinates of range
-- @param p2 vector: Highest coordinates of range
-- @param pr PseudoRandom: random generator
-- @param n number: Number of mobs to spawn
-- @param water boolean: Spawn water mobs
function vl_structures.spawn_mobs(mob,spawnon,p1,p2,pr,n,water)
n = n or 1
local sp = {}
if water then
local nn = minetest.find_nodes_in_area(p1,p2,spawnon)
for k,v in pairs(nn) do
if minetest.get_item_group(minetest.get_node(vector_offset(v,0,1,0)).name,"water") > 0 then
table.insert(sp,v)
end
end
else
sp = minetest.find_nodes_in_area_under_air(p1,p2,spawnon)
end
table.shuffle(sp)
local count = 0
local mob_def = minetest.registered_entities[mob]
local enabled = (not peaceful) or (mob_def and mob_spawn_class ~= "hostile")
for _, node in pairs(sp) do
if enabled and count < n and minetest.add_entity(vector_offset(node, 0, 1, 0), mob) then
count = count + 1
end
minetest.get_meta(node):set_string("spawnblock", "yes") -- note: also in peaceful mode!
end
end