1 local minetest,vector,math,table = minetest,vector,math,table
3 --this is where mob spawning is defined
5 --spawn mob in a square doughnut shaped radius
7 --the amount of mobs that the game will try to spawn per player
8 local spawn_goal_per_player = 5
9 --the amount of mobs that the spawner will cap out at
12 --the height in which the game will search the x and z chosen (NUMBER up, NUMBER down)
13 local find_node_height = 32
15 --for debug testing to isolate mobs
18 local spawn_table = {"pig","chicken","sheep"}
19 local snow_dark_spawn_table = {"snoider","sneeper",}
20 local snow_light_spawn_table = {"snowman"}
21 local dark_spawn_table = {"creeper","creeper","creeper","spider","spider","spider","big_slime","medium_slime","small_slime"}
22 local nether_spawn_table = {"nitro_creeper"}
23 local aether_spawn_table = {"phyg"}
27 --inner and outer part of square donut radius
31 local position_calculation = function(pos)
32 --this is used to determine the axis buffer from the player
33 axis = math.random(0,1)
35 --cast towards the direction
37 pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
38 pos.z = pos.z + math.random(-outer,outer)
40 pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
41 pos.x = pos.x + math.random(-outer,outer)
50 local get_mobs_in_radius = function(pos)
52 object_list = minetest.get_objects_inside_radius(pos, outer)
53 for _,object in ipairs(object_list) do
54 if not object:is_player() then
55 entity = object:get_luaentity()
72 local function spawn_mobs(player)
73 pos = player:get_pos()
75 mobs = get_mobs_in_radius(pos)
77 if mobs > spawn_goal_per_player then
81 pos = position_calculation(pos)
84 if pos.y >= 21000 then
85 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"})
86 elseif pos.y <= -10033 and pos.y >= -20112 then
87 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"})
89 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"})
92 --print(dump(spawner))
93 if table.getn(spawner) > 0 then
95 mob_pos.y = mob_pos.y + 1
97 if mob_pos.y >= 21000 then
98 mob_spawning = aether_spawn_table[math.random(1,table.getn(aether_spawn_table))]
99 --print("Aether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
100 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
101 elseif mob_pos.y <= -10033 and mob_pos.y >= -20112 then
102 mob_spawning = nether_spawn_table[math.random(1,table.getn(nether_spawn_table))]
103 --print("Nether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
104 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
106 light_level = minetest.get_node_light(spawner[1])
108 if weather_type == 1 then
109 if light_level < 7 then
110 mob_spawning = snow_dark_spawn_table[math.random(1,table.getn(snow_dark_spawn_table))]
111 --print("Snow Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
112 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
114 local mob_spawning = snow_light_spawn_table[math.random(1,table.getn(snow_light_spawn_table))]
115 --print("Snow Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
116 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
119 if light_level < 7 then
120 mob_spawning = dark_spawn_table[math.random(1,table.getn(dark_spawn_table))]
121 --print("Dark Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
122 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
124 mob_spawning = spawn_table[math.random(1,table.getn(spawn_table))]
125 --print("Light Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
126 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
133 local function per_player_handling()
134 if global_mob_amount < mob_limit then
135 --check through players
136 for _,player in ipairs(minetest.get_connected_players()) do
141 minetest.after(10, function()
142 per_player_handling()
147 minetest.register_on_mods_loaded(function()
148 minetest.after(0,function()
149 per_player_handling()