]> git.lizzy.rs Git - crafter_client.git/blob - weather_handling.lua
Adjust update of stream sound timer
[crafter_client.git] / weather_handling.lua
1 local all_nodes = {}
2 local do_effects = false
3 local snow = false
4 local rain = false
5 local weather_update_timer = 0
6 local id_table = {}
7
8 local spawn_snow = function(player)
9         local pos = player:get_pos()
10         local radius = 10
11         local particle_table = {}
12         
13         local area = vector.new(10,10,10)
14         
15         local min = vector.subtract(pos, area)
16         local max = vector.add(pos, area)
17         
18         
19         local area_index = minetest.find_nodes_in_area_under_air(min, max, all_nodes)
20         
21         local spawn_table = {}
22         --find the highest y value
23         for _,index in pairs(area_index) do
24                 if not spawn_table[index.x] then spawn_table[index.x] = {} end
25                 if not spawn_table[index.x][index.z] then
26                         spawn_table[index.x][index.z] = index.y
27                 elseif spawn_table[index.x][index.z] < index.y then
28                         spawn_table[index.x][index.z] = index.y
29                 end
30         end
31         
32         for x,x_index in pairs(spawn_table) do
33                 for z,y in pairs(x_index) do
34                         if minetest.get_node_or_nil(vector.new(x,y+1,z)) ~= nil then
35                                 local pos = vector.new(x,y+1,z)
36                                 local lightlevel = minetest.get_node_light(pos, 0.5)
37                                 if lightlevel >= 14 then
38                                         minetest.add_particlespawner({
39                                                 amount = 1,
40                                                 time = 0.5,
41                                                 minpos = vector.new(x-0.5,y,z-0.5),
42                                                 maxpos = vector.new(x+0.5,y+20,z+0.5),
43                                                 minvel = {x=-0.2, y=-0.2, z=-0.2},
44                                                 maxvel = {x=0.2, y=-0.5, z=0.2},
45                                                 minacc = {x=0, y=0, z=0},
46                                                 maxacc = {x=0, y=0, z=0},
47                                                 minexptime = 1,
48                                                 maxexptime = 1,
49                                                 minsize = 1,
50                                                 maxsize = 1,
51                                                 collisiondetection = true,
52                                                 collision_removal = true,
53                                                 object_collision = false,
54                                                 texture = "snowflake_"..math.random(1,2)..".png",
55                                                 playername = player:get_name(),
56                                         })
57                                 end
58                         end
59                 end
60         end
61 end
62
63 local spawn_rain = function(player)
64         local pos = player:get_pos()
65         local radius = 10
66         local particle_table = {}
67         
68         local area = vector.new(10,10,10)
69         
70         local min = vector.subtract(pos, area)
71         local max = vector.add(pos, area)
72         
73         
74         local area_index = minetest.find_nodes_in_area_under_air(min, max, all_nodes)
75         
76         local spawn_table = {}
77         --find the highest y value
78         for _,index in pairs(area_index) do
79                 if not spawn_table[index.x] then spawn_table[index.x] = {} end
80                 if not spawn_table[index.x][index.z] then
81                         spawn_table[index.x][index.z] = index.y
82                 elseif spawn_table[index.x][index.z] < index.y then
83                         spawn_table[index.x][index.z] = index.y
84                 end
85         end
86         
87         for x,x_index in pairs(spawn_table) do
88                 for z,y in pairs(x_index) do
89                         if minetest.get_node_or_nil(vector.new(x,y+1,z)) ~= nil then
90                                 local pos = vector.new(x,y+1,z)
91                                 local lightlevel = minetest.get_node_light(pos, 0.5)
92                                 if lightlevel >= 14 then
93                                         minetest.add_particlespawner({
94                                                 amount = 1,
95                                                 time = 0.5,
96                                                 minpos = vector.new(x-0.5,y,z-0.5),
97                                                 maxpos = vector.new(x+0.5,y+20,z+0.5),
98                                                 minvel = {x=0, y=-9.81, z=0},
99                                                 maxvel = {x=0, y=-9.81, z=0},
100                                                 minacc = {x=0, y=0, z=0},
101                                                 maxacc = {x=0, y=0, z=0},
102                                                 minexptime = 1,
103                                                 maxexptime = 2,
104                                                 minsize = 1,
105                                                 maxsize = 1,
106                                                 collisiondetection = true,
107                                                 collision_removal = true,
108                                                 object_collision = false,
109                                                 vertical = true,
110                                                 texture = "raindrop.png",
111                                                 playername = player:get_name(),
112                                         })
113                                 end
114                         end
115                 end
116         end
117 end
118
119 minetest.register_globalstep(function(dtime)
120         if do_effects then
121                 if snow or rain then
122                         weather_update_timer = weather_update_timer + dtime
123                         if weather_update_timer >= 0.5 then
124                                 weather_update_timer = 0
125                                 local player = minetest.localplayer
126                                 if snow == true then
127                                         spawn_snow(minetest.localplayer)
128                                 elseif rain == true then
129                                         spawn_rain(minetest.localplayer)
130                                 end
131                         end
132                 end
133         end
134 end)
135
136
137
138 minetest.register_on_modchannel_message(function(channel_name, sender, message)
139         if channel_name == "weather_nodes" then
140                 all_nodes = minetest.deserialize(message)
141                 do_effects = true
142         end
143         if channel_name == "weather_type" then
144                 if message == "1" then
145                         rain = false
146                         snow = true
147                 elseif message == "2" then
148                         rain = true
149                         snow = false
150                 else
151                         rain = false
152                         snow = false
153                 end
154         end
155 end)