]> git.lizzy.rs Git - Crafter.git/blob - mods/mob/spawning.lua
Overhaul mobs pathfinding even further
[Crafter.git] / mods / mob / spawning.lua
1 --this is where mob spawning is defined
2
3 --spawn mob in a square doughnut shaped radius
4 local timer = 6
5 --the amount of mobs that the game will try to spawn
6 local spawn_goal = 10
7 --the amount of mobs that the spawner will cap out at
8 local mob_limit = 100
9 --inner and outer part of square donut radius
10 local inner = 24
11 local outer = 80
12 --the height in which the game will search the x and z chosen (NUMBER up, NUMBER down)
13 local find_node_height = 32
14
15 --for debug testing to isolate mobs
16 local spawn = true
17
18 local spawn_table = {"pig","chicken","sheep"}
19 local snow_spawn_table = {"snowman","snoider","sneeper",}
20 local dark_spawn_table = {"creeper","creeper","creeper","spider","spider","spider","big_slime","medium_slime","small_slime"}
21 local nether_spawn_table = {"nitro_creeper"}
22 local aether_spawn_table = {"phyg"}
23
24 local function spawn_mobs()
25         --print("---------------------------------------------")
26         if spawn and global_mob_amount < mob_limit then
27                 --check through players
28                 for _,player in ipairs(minetest.get_connected_players()) do                     
29                         local int = {-1,1}
30                         local pos = vector.floor(vector.add(player:get_pos(),0.5))
31                         
32                         local x,z
33                         
34                         --this is used to determine the axis buffer from the player
35                         local axis = math.random(0,1)
36                         
37                         --cast towards the direction
38                         if axis == 0 then --x
39                                 x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
40                                 z = pos.z + math.random(-outer,outer)
41                         else --z
42                                 z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
43                                 x = pos.x + math.random(-outer,outer)
44                         end
45                         
46                         local spawner = {}
47                         if pos.y >= 21000 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), {"aether:grass"})
49                         elseif pos.y <= -10033 and pos.y >= -20112 then
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), {"nether:netherrack"})
51                         else
52                                 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                         end
54                         
55                         --print(dump(spawner))
56                         if table.getn(spawner) > 0 then
57                                 local mob_pos = spawner[1]
58                                 mob_pos.y = mob_pos.y + 1
59                                 --aether spawning
60                                 if mob_pos.y >= 21000 then
61                                         local mob_spawning = aether_spawn_table[math.random(1,table.getn(aether_spawn_table))]
62                                         --print("Aether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
63                                         minetest.add_entity(mob_pos,"mob:"..mob_spawning)
64                                 elseif mob_pos.y <= -10033 and mob_pos.y >= -20112 then
65                                         local mob_spawning = nether_spawn_table[math.random(1,table.getn(nether_spawn_table))]
66                                         --print("Nether Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
67                                         minetest.add_entity(mob_pos,"mob:"..mob_spawning)
68                                 else
69                                         local light_level = minetest.get_node_light(spawner[1])
70                                         if weather_type == 1 then
71                                                 local mob_spawning = snow_spawn_table[math.random(1,table.getn(snow_spawn_table))]
72                                                 --print("Snow Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
73                                                 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
74                                         elseif light_level < 10 then
75                                                 local mob_spawning = dark_spawn_table[math.random(1,table.getn(dark_spawn_table))]
76                                                 --print("Dark Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
77                                                 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
78                                         else
79                                                 local mob_spawning = spawn_table[math.random(1,table.getn(spawn_table))]
80                                                 --print("Light Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
81                                                 minetest.add_entity(mob_pos,"mob:"..mob_spawning)
82                                         end
83                                 end
84                         end
85                 end
86         end
87
88         --fine tune mobs
89         local after_timer = global_mob_amount/spawn_goal
90         if after_timer > timer then 
91                 after_timer = timer 
92         end
93
94         minetest.after(after_timer, function()
95                 spawn_mobs()
96         end)
97 end
98 if spawn then
99         minetest.register_on_mods_loaded(function()
100                 minetest.after(0,function()
101                         spawn_mobs()
102                 end)
103         end)
104 end