-- 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 })