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