+local minetest,vector,math,table = minetest,vector,math,table
+
--this is where mob spawning is defined
--spawn mob in a square doughnut shaped radius
-local chance = 20
-local tick = 0.2
-local timer = 0
---inner and outer part of square donut radius
-local inner = 24
-local outer = 128
+--the amount of mobs that the game will try to spawn per player
+local spawn_goal_per_player = 10
+--the amount of mobs that the spawner will cap out at
+
+--the height in which the game will search the x and z chosen (NUMBER up, NUMBER down)
+local find_node_height = 32
--for debug testing to isolate mobs
local spawn = true
-minetest.register_globalstep(function(dtime)
- if spawn then
- timer = timer + dtime
- if timer >= tick and math.random(1,chance) == chance then
- --print("ticking")
- timer = 0
- --check through players
- for _,player in ipairs(minetest.get_connected_players()) do
- --don't spawn near dead players
- if player:get_hp() > 0 then
-
- --local mob_number = math.random(0,2)
-
- local int = {-1,1}
- local pos = vector.floor(vector.add(player:getpos(),0.5))
-
- local x,z
-
- --this is used to determine the axis buffer from the player
- local axis = math.random(0,1)
-
- --cast towards the direction
- if axis == 0 then --x
- x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
- z = pos.z + math.random(-outer,outer)
- else --z
- z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
- x = pos.x + math.random(-outer,outer)
+local spawn_table = {"pig","chicken","sheep"}
+local snow_dark_spawn_table = {"snoider","sneeper",}
+local snow_light_spawn_table = {"snowman"}
+local dark_spawn_table = {"creeper","creeper","creeper","spider","spider","spider","big_slime","medium_slime","small_slime"}
+local nether_spawn_table = {"nitro_creeper"}
+local aether_spawn_table = {"phyg"}
+
+
+local axis
+--inner and outer part of square donut radius
+local inner = 18
+local outer = 50
+local int = {-1,1}
+local position_calculation = function(pos)
+ --this is used to determine the axis buffer from the player
+ axis = math.random(0,1)
+
+ --cast towards the direction
+ if axis == 0 then --x
+ pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
+ pos.z = pos.z + math.random(-outer,outer)
+ else --z
+ pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
+ pos.x = pos.x + math.random(-outer,outer)
+ end
+ return(pos)
+end
+
+
+local object_list
+local entity
+local counter
+local get_mobs_in_radius = function(pos)
+ counter = 0
+ object_list = minetest.get_objects_inside_radius(pos, outer)
+ for _,object in ipairs(object_list) do
+ if not object:is_player() then
+ entity = object:get_luaentity()
+
+ if entity.is_mob then
+ counter = counter + 1
+ end
+ end
+ end
+ return(counter)
+end
+
+
+local pos
+local mobs
+local spawner
+local mob_spawning
+local light_level
+local mob_pos
+local function spawn_mobs(player)
+ pos = player:get_pos()
+
+ mobs = get_mobs_in_radius(pos)
+
+ if mobs > spawn_goal_per_player then
+ return
+ end
+
+ pos = position_calculation(pos)
+
+ spawner = {}
+ if pos.y >= 21000 then
+ spawner = minetest.find_nodes_in_area_under_air(vector.new(pos.x,pos.y-find_node_height,pos.z), vector.new(pos.x,pos.y+find_node_height,pos.z), {"aether:grass"})
+ elseif pos.y <= -10033 and pos.y >= -20112 then
+ spawner = minetest.find_nodes_in_area_under_air(vector.new(pos.x,pos.y-find_node_height,pos.z), vector.new(pos.x,pos.y+find_node_height,pos.z), {"nether:netherrack"})
+ else
+ spawner = minetest.find_nodes_in_area_under_air(vector.new(pos.x,pos.y-find_node_height,pos.z), vector.new(pos.x,pos.y+find_node_height,pos.z), {"main:grass","main:sand","main:water"})
+ end
+
+ --print(dump(spawner))
+ if table.getn(spawner) > 0 then
+ mob_pos = spawner[1]
+ mob_pos.y = mob_pos.y + 1
+ --aether spawning
+ if mob_pos.y >= 21000 then
+ mob_spawning = aether_spawn_table[math.random(1,table.getn(aether_spawn_table))]
+ --print("Aether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
+ minetest.add_entity(mob_pos,"mob:"..mob_spawning)
+ elseif mob_pos.y <= -10033 and mob_pos.y >= -20112 then
+ mob_spawning = nether_spawn_table[math.random(1,table.getn(nether_spawn_table))]
+ --print("Nether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
+ minetest.add_entity(mob_pos,"mob:"..mob_spawning)
+ else
+ light_level = minetest.get_node_light(spawner[1])
+
+ if weather_type == 1 then
+ if light_level < 7 then
+ mob_spawning = snow_dark_spawn_table[math.random(1,table.getn(snow_dark_spawn_table))]
+ --print("Snow Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
+ minetest.add_entity(mob_pos,"mob:"..mob_spawning)
+ else
+ local mob_spawning = snow_light_spawn_table[math.random(1,table.getn(snow_light_spawn_table))]
+ --print("Snow Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
+ minetest.add_entity(mob_pos,"mob:"..mob_spawning)
end
-
-
- local spawner = minetest.find_nodes_in_area_under_air(vector.new(x,pos.y-32,z), vector.new(x,pos.y+32,z), {"main:grass","main:sand","main:water"})
-
- --print(dump(spawner))
- if table.getn(spawner) > 0 then
- local mob_pos = spawner[1]
- mob_pos.y = mob_pos.y + 1
- print("Spawning at: "..minetest.pos_to_string(mob_pos))
- minetest.add_entity(mob_pos,"mob:pig")
+ else
+ if light_level < 7 then
+ mob_spawning = dark_spawn_table[math.random(1,table.getn(dark_spawn_table))]
+ --print("Dark Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
+ minetest.add_entity(mob_pos,"mob:"..mob_spawning)
+ else
+ mob_spawning = spawn_table[math.random(1,table.getn(spawn_table))]
+ --print("Light Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
+ minetest.add_entity(mob_pos,"mob:"..mob_spawning)
end
end
end
- elseif timer > tick then
- timer = 0
end
+end
+
+local function per_player_handling()
+ --check through players
+ for _,player in ipairs(minetest.get_connected_players()) do
+ spawn_mobs(player)
end
-end)
+
+ minetest.after(10, function()
+ per_player_handling()
+ end)
+end
+
+if spawn then
+ minetest.register_on_mods_loaded(function()
+ minetest.after(0,function()
+ per_player_handling()
+ end)
+ end)
+end
+
+