]> git.lizzy.rs Git - Crafter.git/blob - mods/mob/spawning.lua
00397527cbc662495e65fd851d293825877ab814
[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 chance = 2
5 local tick = 0.2
6 local timer = 0
7 --inner and outer part of square donut radius
8 local inner = 24
9 local outer = 128
10
11 --for debug testing to isolate mobs
12 local spawn = true
13
14 local spawn_table = {"pig"}
15 local dark_spawn_table = {"slime","creepig"}
16 local aether_spawn_table = {"flying_pig"}
17
18 minetest.register_globalstep(function(dtime)
19         if spawn then
20         timer = timer + dtime
21         if timer >= tick and math.random(1,chance) == chance then
22                 --print("ticking")
23                 timer = 0
24                 --check through players
25                 for _,player in ipairs(minetest.get_connected_players()) do
26                         --don't spawn near dead players
27                         if player:get_hp() > 0 then
28                         
29                                 --local mob_number = math.random(0,2)
30                                 
31                                 local int = {-1,1}
32                                 local pos = vector.floor(vector.add(player:getpos(),0.5))
33                                 
34                                 local x,z
35                                 
36                                 --this is used to determine the axis buffer from the player
37                                 local axis = math.random(0,1)
38                                 
39                                 --cast towards the direction
40                                 if axis == 0 then --x
41                                         x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
42                                         z = pos.z + math.random(-outer,outer)
43                                 else --z
44                                         z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
45                                         x = pos.x + math.random(-outer,outer)
46                                 end
47                                 
48                                 local spawner
49                                 if pos.y >= 21000 then
50                                         spawner = minetest.find_nodes_in_area_under_air(vector.new(x,pos.y-32,z), vector.new(x,pos.y+32,z), {"aether:grass"})
51                                 else
52                                         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"})
53                                 end
54                                 
55                                 --print(dump(spawner))
56                                 if table.getn(spawner) > 0 then
57                                         local mob_pos = spawner[1]
58                                         --aether spawning
59                                         if mob_pos.y >= 21000 then
60                                                 mob_pos.y = mob_pos.y + 1
61                                                 local mob_spawning = aether_spawn_table[math.random(1,table.getn(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
65                                         else
66                         local light_level = minetest.get_node_light(spawner[1])
67                         if light_level < 10 then
68                             mob_pos.y = mob_pos.y + 1
69                             local mob_spawning = dark_spawn_table[math.random(1,table.getn(dark_spawn_table))]
70                             print("Dark Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
71                             minetest.add_entity(mob_pos,"mob:"..mob_spawning)
72                         else
73                             mob_pos.y = mob_pos.y + 1
74                             local mob_spawning = spawn_table[math.random(1,table.getn(spawn_table))]
75                             print("Light Spawning "..mob_spawning.." at: "..minetest.pos_to_string(mob_pos))
76                             minetest.add_entity(mob_pos,"mob:"..mob_spawning)
77                         end
78                                         end
79                                 end
80                         end
81                 end
82         elseif timer > tick then
83                 timer = 0
84         end
85         end
86 end)