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
6 --the amount of mobs that the game will try to spawn per player
7 local spawn_goal_per_player = 10
8 --the amount of mobs that the spawner will cap out at
10 --the height in which the game will search the x and z chosen (NUMBER up, NUMBER down)
11 local find_node_height = 32
13 --for debug testing to isolate mobs
16 local spawn_table = {"pig","chicken","sheep"}
17 local snow_dark_spawn_table = {"snoider","sneeper","zombie","zombie"}
18 local snow_light_spawn_table = {"snowman"}
19 local dark_spawn_table = {"creeper","creeper","creeper","spider","spider","spider","small_slime","small_slime","zombie","zombie","zombie"}
20 local nether_spawn_table = {"nitro_creeper"}
21 local aether_spawn_table = {"phyg"}
25 --inner and outer part of square donut radius
29 local position_calculation = function(pos)
30 --this is used to determine the axis buffer from the player
31 axis = math.random(0,1)
33 --cast towards the direction
35 pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
36 pos.z = pos.z + math.random(-outer,outer)
38 pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
39 pos.x = pos.x + math.random(-outer,outer)
48 local get_mobs_in_radius = function(pos)
50 object_list = minetest.get_objects_inside_radius(pos, outer)
51 for _,object in ipairs(object_list) do
52 if not object:is_player() then
53 if object:get_luaentity().mobname then
68 local function spawn_mobs(player)
69 pos = player:get_pos()
70 mobs = get_mobs_in_radius(pos)
71 if mobs > spawn_goal_per_player then
75 for i = 1,math.random(2,5) do
77 pos = position_calculation(pos)
80 if pos.y >= 21000 then
81 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"})
82 elseif pos.y <= -10033 and pos.y >= -20112 then
83 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"})
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), {"main:grass","main:sand","main:water"})
88 --print(dump(spawner))
89 if table.getn(spawner) > 0 then
90 mob_pos = spawner[math.random(1,table.getn(spawner))]
91 mob_pos.y = mob_pos.y + 1
92 --print("spawning", dump(mob_pos))
95 if mob_pos.y >= 21000 then
96 mob_spawning = aether_spawn_table[math.random(1,table.getn(aether_spawn_table))]
97 --print("Aether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
98 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
99 elseif mob_pos.y <= -10033 and mob_pos.y >= -20112 then
100 mob_spawning = nether_spawn_table[math.random(1,table.getn(nether_spawn_table))]
101 --print("Nether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
102 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
104 light_level = minetest.get_node_light(mob_pos)
106 if weather_type == 1 then
107 if light_level < 7 then
108 mob_spawning = snow_dark_spawn_table[math.random(1,table.getn(snow_dark_spawn_table))]
109 --print("Snow Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
110 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
112 local mob_spawning = snow_light_spawn_table[math.random(1,table.getn(snow_light_spawn_table))]
113 --print("Snow Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
114 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
117 if light_level < 7 then
118 mob_spawning = dark_spawn_table[math.random(1,table.getn(dark_spawn_table))]
119 --print("Dark Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
120 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
122 mob_spawning = spawn_table[math.random(1,table.getn(spawn_table))]
123 --print("Light Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
124 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
132 local function per_player_handling()
133 --check through players
134 for _,player in ipairs(minetest.get_connected_players()) do
138 minetest.after(10, function()
139 per_player_handling()
144 minetest.register_on_mods_loaded(function()
145 minetest.after(0,function()
146 per_player_handling()