Files
Mob-Raids/mods/monster_spawner/init.lua

96 lines
3.0 KiB
Lua

-- Monster Spawner Mod for Minetest/Luanti
-- Namespace
local modname = "monster_spawner"
local modpath = minetest.get_modpath(modname)
-- Config
local config = {
spawn_radius = 20,
spawn_interval = 10,
max_monsters = 10,
monster_types = {
"mobs_monster:spider",
"mobs_monster:oerkki",
"mobs_monster:dungeon_master"
}
}
-- Global table to track spawned monsters
local spawned_monsters = {}
-- Function to spawn monsters around a player
local function spawn_monsters_around_player(player)
local player_pos = player:get_pos()
local player_name = player:get_player_name()
-- Count existing monsters spawned by this mod
local monster_count = 0
for _, monster in ipairs(spawned_monsters) do
if monster.player == player_name then
monster_count = monster_count + 1
end
end
-- Spawn new monsters if below max
if monster_count < config.max_monsters then
for i = 1, config.max_monsters - monster_count do
local pos = {
x = player_pos.x + math.random(-config.spawn_radius, config.spawn_radius),
y = player_pos.y,
z = player_pos.z + math.random(-config.spawn_radius, config.spawn_radius)
}
local monster_type = config.monster_types[math.random(#config.monster_types)]
local monster = minetest.add_entity(pos, monster_type)
if monster then
table.insert(spawned_monsters, {
entity = monster,
player = player_name,
time = minetest.get_gametime()
})
end
end
end
end
-- Global step function to check players and spawn monsters
minetest.register_globalstep(function(dtime)
for _, player in ipairs(minetest.get_connected_players()) do
local player_name = player:get_player_name()
local last_spawn_time = 0
-- Find last spawn time for this player
for _, monster in ipairs(spawned_monsters) do
if monster.player == player_name then
last_spawn_time = math.max(last_spawn_time, monster.time)
end
end
-- Spawn monsters if enough time has passed
if minetest.get_gametime() - last_spawn_time > config.spawn_interval then
spawn_monsters_around_player(player)
end
end
-- Clean up dead monsters
for i = #spawned_monsters, 1, -1 do
if spawned_monsters[i].entity:get_luaentity() == nil then
table.remove(spawned_monsters, i)
end
end
end)
-- Chat command to manually trigger monster spawn
minetest.register_chatcommand("spawn_monsters", {
description = "Spawn monsters around you",
func = function(name)
local player = minetest.get_player_by_name(name)
if player then
spawn_monsters_around_player(player)
minetest.chat_send_player(name, "Monsters spawned around you!")
end
end
})