1 --this is where mob spawning is defined
3 --spawn mob in a square doughnut shaped radius
5 --the amount of mobs that the game will try to spawn
7 --inner and outer part of square donut radius
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_spawn_table = {"snowman","snoider","sneeper",}
18 local dark_spawn_table = {"creeper","creeper","creeper","spider","spider","spider","big_slime","medium_slime","small_slime"}
19 local nether_spawn_table = {"nitro_creeper"}
20 local aether_spawn_table = {"phyg"}
22 local function spawn_mobs()
23 --print("---------------------------------------------")
24 if spawn and global_mob_amount < mob_limit then
25 --check through players
26 for _,player in ipairs(minetest.get_connected_players()) do
28 local pos = vector.floor(vector.add(player:get_pos(),0.5))
32 --this is used to determine the axis buffer from the player
33 local axis = math.random(0,1)
35 --cast towards the direction
37 x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
38 z = pos.z + math.random(-outer,outer)
40 z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
41 x = pos.x + math.random(-outer,outer)
45 if pos.y >= 21000 then
46 spawner = minetest.find_nodes_in_area_under_air(vector.new(x,pos.y-find_node_height,z), vector.new(x,pos.y+find_node_height,z), {"aether:grass"})
47 elseif pos.y <= -10033 and pos.y >= -20112 then
48 spawner = minetest.find_nodes_in_area_under_air(vector.new(x,pos.y-find_node_height,z), vector.new(x,pos.y+find_node_height,z), {"nether:netherrack"})
50 spawner = minetest.find_nodes_in_area_under_air(vector.new(x,pos.y-find_node_height,z), vector.new(x,pos.y+find_node_height,z), {"main:grass","main:sand","main:water"})
53 --print(dump(spawner))
54 if table.getn(spawner) > 0 then
55 local mob_pos = spawner[1]
56 mob_pos.y = mob_pos.y + 1
58 if mob_pos.y >= 21000 then
59 local mob_spawning = aether_spawn_table[math.random(1,table.getn(aether_spawn_table))]
60 --print("Aether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
61 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
62 elseif mob_pos.y <= -10033 and mob_pos.y >= -20112 then
63 local mob_spawning = nether_spawn_table[math.random(1,table.getn(nether_spawn_table))]
64 --print("Nether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
65 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
67 local light_level = minetest.get_node_light(spawner[1])
68 if weather_type == 1 then
69 local mob_spawning = snow_spawn_table[math.random(1,table.getn(snow_spawn_table))]
70 --print("Snow Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
71 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
72 elseif light_level < 10 then
73 local mob_spawning = dark_spawn_table[math.random(1,table.getn(dark_spawn_table))]
74 --print("Dark Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
75 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
77 local mob_spawning = spawn_table[math.random(1,table.getn(spawn_table))]
78 --print("Light Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
79 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
85 minetest.after(global_mob_amount/spawn_goal, function()
89 minetest.register_on_mods_loaded(function()
90 minetest.after(0,function()