]> git.lizzy.rs Git - Crafter.git/blob - mods/mob/spawning.lua
Reformat lua locals in mob datahandling
[Crafter.git] / mods / mob / spawning.lua
1 local minetest,vector,math,table = minetest,vector,math,table
2
3 --this is where mob spawning is defined
4
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
9
10 --the height in which the game will search the x and z chosen (NUMBER up, NUMBER down)
11 local find_node_height = 32
12
13 --for debug testing to isolate mobs
14 local spawn = true
15
16 local spawn_table = {"pig","chicken","sheep"}
17 local snow_dark_spawn_table = {"snoider","sneeper",}
18 local snow_light_spawn_table = {"snowman"}
19 local dark_spawn_table = {"creeper","creeper","creeper","spider","spider","spider","big_slime","medium_slime","small_slime"}
20 local nether_spawn_table = {"nitro_creeper"}
21 local aether_spawn_table = {"phyg"}
22
23
24 local axis
25 --inner and outer part of square donut radius
26 local inner = 18
27 local outer = 50
28 local int = {-1,1}
29 local position_calculation = function(pos)                              
30         --this is used to determine the axis buffer from the player
31         axis = math.random(0,1)
32
33         --cast towards the direction
34         if axis == 0 then --x
35                 pos.x = pos.x + math.random(inner,outer)*int[math.random(1,2)]
36                 pos.z = pos.z + math.random(-outer,outer)
37         else --z
38                 pos.z = pos.z + math.random(inner,outer)*int[math.random(1,2)]
39                 pos.x = pos.x + math.random(-outer,outer)
40         end
41         return(pos)
42 end
43
44
45 local object_list
46 local entity
47 local counter
48 local get_mobs_in_radius = function(pos)
49         counter = 0
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                         entity = object:get_luaentity()
54
55                         if entity.is_mob then
56                                 counter = counter + 1
57                         end
58                 end
59         end
60         return(counter)
61 end
62
63
64 local pos
65 local mobs
66 local spawner
67 local mob_spawning
68 local light_level
69 local mob_pos
70 local function spawn_mobs(player)
71         pos = player:get_pos()
72
73         mobs = get_mobs_in_radius(pos)
74
75         if mobs > spawn_goal_per_player then
76                 return
77         end
78
79         pos = position_calculation(pos)
80
81         spawner = {}
82         if pos.y >= 21000 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), {"aether:grass"})
84         elseif pos.y <= -10033 and pos.y >= -20112 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), {"nether:netherrack"})
86         else
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), {"main:grass","main:sand","main:water"})
88         end
89         
90         --print(dump(spawner))
91         if table.getn(spawner) > 0 then
92                 mob_pos = spawner[1]
93                 mob_pos.y = mob_pos.y + 1
94                 --aether spawning
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)
103                 else
104                         light_level = minetest.get_node_light(spawner[1])
105
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)
111                                 else
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)
115                                 end
116                         else
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)
121                                 else
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)
125                                 end
126                         end
127                 end
128         end
129 end
130
131 local function per_player_handling()
132         --check through players
133         for _,player in ipairs(minetest.get_connected_players()) do
134                 spawn_mobs(player)
135         end
136
137         minetest.after(10, function()
138                 per_player_handling()
139         end)
140 end
141
142 if spawn then
143         minetest.register_on_mods_loaded(function()
144                 minetest.after(0,function()
145                         per_player_handling()
146                 end)
147         end)
148 end
149
150