diff --git a/mods/monster_spawner/init.lua b/mods/monster_spawner/init.lua new file mode 100644 index 0000000..06f1aca --- /dev/null +++ b/mods/monster_spawner/init.lua @@ -0,0 +1,95 @@ +-- 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 +})