mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-22 10:31:06 +01:00
Generate monster spawners in dungeons (kinda...)
This commit is contained in:
parent
62e3967082
commit
d1ea880be6
3 changed files with 47 additions and 12 deletions
|
@ -299,17 +299,24 @@ minetest.register_abm({
|
|||
{x = pos.x + 4, y = pos.y + 1 + yof, z = pos.z + 4},
|
||||
{"air"})
|
||||
|
||||
-- spawn in random air block
|
||||
if air and #air > 0 then
|
||||
-- spawn up to 4 mobs in random air blocks
|
||||
if air then
|
||||
for a=1, 4 do
|
||||
if #air <= 0 then
|
||||
-- We're out of space! Stop spawning
|
||||
break
|
||||
end
|
||||
local air_index = math.random(#air)
|
||||
local pos2 = air[air_index]
|
||||
local lig = minetest.get_node_light(pos2) or 0
|
||||
|
||||
local pos2 = air[math.random(#air)]
|
||||
local lig = minetest.get_node_light(pos2) or 0
|
||||
pos2.y = pos2.y + 0.5
|
||||
|
||||
pos2.y = pos2.y + 0.5
|
||||
|
||||
-- only if light levels are within range
|
||||
if lig >= mlig and lig <= xlig then
|
||||
minetest.add_entity(pos2, mob)
|
||||
-- only if light levels are within range
|
||||
if lig >= mlig and lig <= xlig then
|
||||
minetest.add_entity(pos2, mob)
|
||||
end
|
||||
table.remove(air, air_index)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
mcl_init
|
||||
mcl_core
|
||||
mcl_chests
|
||||
mcl_monster_spawner
|
||||
|
|
|
@ -79,8 +79,9 @@ minetest.register_on_generated(function(minp, maxp)
|
|||
local c_mossycobble = minetest.get_content_id("mcl_core:mossycobble")
|
||||
local c_chest = minetest.get_content_id("mcl_chests:chest")
|
||||
|
||||
-- Remember chest positions to set metadata later
|
||||
-- Remember spawner chest positions to set metadata later
|
||||
local chest_posses = {}
|
||||
local spawner_posses = {}
|
||||
|
||||
-- Calculate the number of dungeon spawn attempts
|
||||
local sizevector = vector.subtract(maxp, minp)
|
||||
|
@ -190,7 +191,11 @@ minetest.register_on_generated(function(minp, maxp)
|
|||
table.sort(chestSlots)
|
||||
local currentChest = 1
|
||||
|
||||
-- Wall and floor
|
||||
-- Calculate the monster spawner position, to be re-used for later
|
||||
local spawner_pos = {x = x + math.ceil(dim.x/2), y = y+1, z = z + math.ceil(dim.z/2)}
|
||||
table.insert(spawner_posses, spawner_pos)
|
||||
|
||||
-- Generate walls and floor
|
||||
local maxx, maxy, maxz = x+dim.x+1, y+dim.y, z+dim.z+1
|
||||
local chestSlotCounter = 1
|
||||
for tx = x, maxx do
|
||||
|
@ -298,7 +303,7 @@ minetest.register_on_generated(function(minp, maxp)
|
|||
chest_param2[c] = facedir
|
||||
end
|
||||
|
||||
-- Actually generate the dungeon all at once (except the chests and the spawner)
|
||||
-- Finally generate the dungeons all at once (except the chests and the spawners)
|
||||
vm:set_data(data)
|
||||
vm:calc_lighting()
|
||||
vm:update_liquids()
|
||||
|
@ -315,6 +320,28 @@ minetest.register_on_generated(function(minp, maxp)
|
|||
inv:set_stack("main", i, ItemStack(items[i]))
|
||||
end
|
||||
end
|
||||
|
||||
-- Monster spawners are placed seperately, too
|
||||
-- We don't want to destroy non-ground nodes
|
||||
for s=1, #spawner_posses do
|
||||
local sp = spawner_posses[s]
|
||||
local n = minetest.get_name_from_content_id(data[area:index(sp.x,sp.y,sp.z)])
|
||||
if minetest.registered_nodes[n].is_ground_content then
|
||||
|
||||
-- ... and place it and select a random mob
|
||||
minetest.set_node(sp, {name = "mcl_monster_spawner:spawner"})
|
||||
local mobs = {
|
||||
"mobs_mc:zombie",
|
||||
"mobs_mc:zombie",
|
||||
"mobs_mc:spider",
|
||||
"mobs_mc:skeleton",
|
||||
}
|
||||
local spawner_mob = mobs[math.random(1, #mobs)]
|
||||
|
||||
mcl_monster_spawner.setup_spawner(sp, spawner_mob)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end)
|
||||
|
|
Loading…
Reference in a new issue