Compare commits
1 Commits
feature/mo
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| d4feada06c |
95
mods/monster_spawner/init.lua
Normal file
95
mods/monster_spawner/init.lua
Normal file
@@ -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
|
||||
})
|
||||
Reference in New Issue
Block a user