2 local do_effects = false
5 local weather_update_timer = 0
8 local spawn_snow = function(player)
9 local pos = player:get_pos()
11 local particle_table = {}
13 local area = vector.new(10,10,10)
15 local min = vector.subtract(pos, area)
16 local max = vector.add(pos, area)
19 local area_index = minetest.find_nodes_in_area_under_air(min, max, all_nodes)
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
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 --print("got to this spointa")
36 local pos = vector.new(x,y+1,z)
38 --local lightlevel = minetest.get_node_light(pos, 0.5)
39 --print("but not here")
40 if lightlevel >= 14 then
41 minetest.add_particlespawner({
44 minpos = vector.new(x-0.5,y,z-0.5),
45 maxpos = vector.new(x+0.5,y+20,z+0.5),
46 minvel = {x=-0.2, y=-0.2, z=-0.2},
47 maxvel = {x=0.2, y=-0.5, z=0.2},
48 minacc = {x=0, y=0, z=0},
49 maxacc = {x=0, y=0, z=0},
54 collisiondetection = true,
55 collision_removal = true,
56 object_collision = false,
57 texture = "snowflake_"..math.random(1,2)..".png",
58 playername = player:get_name(),
66 local spawn_rain = function(player)
67 local pos = player:get_pos()
69 local particle_table = {}
71 local area = vector.new(10,10,10)
73 local min = vector.subtract(pos, area)
74 local max = vector.add(pos, area)
77 local area_index = minetest.find_nodes_in_area_under_air(min, max, all_nodes)
79 local spawn_table = {}
80 --find the highest y value
81 for _,index in pairs(area_index) do
82 if not spawn_table[index.x] then spawn_table[index.x] = {} end
83 if not spawn_table[index.x][index.z] then
84 spawn_table[index.x][index.z] = index.y
85 elseif spawn_table[index.x][index.z] < index.y then
86 spawn_table[index.x][index.z] = index.y
90 for x,x_index in pairs(spawn_table) do
91 for z,y in pairs(x_index) do
92 if minetest.get_node_or_nil(vector.new(x,y+1,z)) ~= nil then
93 --print("got to this spointa")
94 local pos = vector.new(x,y+1,z)
96 --local lightlevel = minetest.get_node_light(pos, 0.5)
97 --print("but not here")
98 if lightlevel >= 14 then
99 minetest.add_particlespawner({
102 minpos = vector.new(x-0.5,y,z-0.5),
103 maxpos = vector.new(x+0.5,y+20,z+0.5),
104 minvel = {x=0, y=-9.81, z=0},
105 maxvel = {x=0, y=-9.81, z=0},
106 minacc = {x=0, y=0, z=0},
107 maxacc = {x=0, y=0, z=0},
112 collisiondetection = true,
113 collision_removal = true,
114 object_collision = false,
116 texture = "raindrop.png",
117 playername = player:get_name(),
125 minetest.register_globalstep(function(dtime)
128 weather_update_timer = weather_update_timer + dtime
129 if weather_update_timer >= 0.5 then
130 weather_update_timer = 0
131 local player = minetest.localplayer
133 spawn_snow(minetest.localplayer)
134 elseif rain == true then
135 spawn_rain(minetest.localplayer)
144 minetest.register_on_modchannel_message(function(channel_name, sender, message)
145 if channel_name == "weather_nodes" then
146 all_nodes = minetest.deserialize(message)
149 if channel_name == "weather_type" then
150 if message == "1" then
153 elseif message == "2" then