diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index 5330df1b..21a86848 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -21,6 +21,8 @@ mcl_weather.rain = { sky_last_update = -1, init_done = false, + + ps = {} } mcl_weather.rain.sound_handler = function(player) @@ -50,35 +52,37 @@ end -- ~~creating manually parctiles instead of particles spawner because of easier to control spawn position~~. -- why, mcl2, WHY??? -- use particle spawner to not send .. you know hundreds of packets per second for each f*ing rain particle -mcl_weather.rain.add_rain_particlespawner = function(name) - +local function get_spawnerdef(dtype) + local textures = {"weather_pack_rain_raindrop_1.png", "weather_pack_rain_raindrop_2.png", "weather_pack_rain_raindrop_1.png"} + local rt = { + amount = 800, + time = 0, + minpos = vector.new(-15,5,-15), + maxpos = vector.new(15,10,15), + minvel = vector.new(0, 5,0), + maxvel = vector.new(0,-15,0), + minacc = vector.new(0,-10,0), + maxacc = vector.new(0,-30,0), + minexptime = 1, + maxexptime = 1, + minsize = 0.5, + maxsize = 5, + collisiondetection = true, + collision_removal = true, + object_collision = true, + vertical = true, + texture = mcl_weather.rain.get_texture(), + -- animation = {Tile Animation definition}, + glow = 0 + -- node = {name = "ignore", param2 = 0}, + --node_tile = 0, + } + return rt +end +mcl_weather.rain.add_rain_particlespawner = function(name,def) local player = minetest.get_player_by_name(name) if not player then return end - if mcl_weather.rain.raining then - minetest.after(0.8,mcl_weather.rain.add_rain_particlespawner,name) - else - return - end - - local wind=vector.new(0,0,0) - local size = math.random(0.5, 5) - local texture = {"weather_pack_rain_raindrop_1.png", "weather_pack_rain_raindrop_2.png", "weather_pack_rain_raindrop_1.png"} - - local player_pos = player:get_pos() - local minpos = {x = -25, y = 5, z = -25} - local maxpos = {x = 25, y = 15, z = 25} - local wind_pos=vector.new(0,0,0) - local minp = vector.add(vector.add(player_pos, minpos), wind_pos) - local maxp = vector.add(vector.add(player_pos, maxpos), wind_pos) - local vel = {x = wind.x, y = - mcl_weather.rain.falling_speed, z = wind.z} - local acc = {x = 0, y = -30, z = 0} - local exp = 1 - - if type(texture) == "table" then - texture=texture[math.random(1,#texture)] - end - mcl_weather.rain.last_rp_count = 0 for i=mcl_weather.rain.particles_count, 1,-1 do local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) @@ -86,21 +90,11 @@ mcl_weather.rain.add_rain_particlespawner = function(name) mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1 end end - + local name=player:get_player_name() if mcl_weather.is_outdoor(player:get_pos()) then - minetest.add_particlespawner({ - amount = math.random(mcl_weather.rain.particles_count-100,mcl_weather.rain.particles_count+100), - time=1, - minpos = minp, maxpos = maxp, - minvel = vel, maxvel = vel, - minacc = acc, maxacc = acc, - minexptime = exp, maxexptime = exp, - minsize = size, maxsize= size, - collisiondetection = true, collision_removal = true, - vertical = true, - texture = texture, - playername = player:get_player_name() - }) + def.player = name + def.attached = player + mcl_weather.rain.ps[name] = minetest.add_particlespawner(def) end mcl_weather.rain.init_done = true end @@ -126,7 +120,7 @@ mcl_weather.rain.add_player = function(player) local player_meta = {} player_meta.origin_sky = {player:get_sky()} mcl_weather.players[player:get_player_name()] = player_meta - mcl_weather.rain.add_rain_particlespawner(player:get_player_name()) + mcl_weather.rain.add_rain_particlespawner(player:get_player_name(),get_spawnerdef("rain")) end end @@ -135,13 +129,24 @@ minetest.register_on_joinplayer(function(player) mcl_weather.rain.add_player(player) end end) - +minetest.register_on_leaveplayer(function(player) + if mcl_weather.rain.raining then + mcl_weather.rain.remove_player(player) + end +end) -- remove player from player list effected by rain. -- be sure to remove sound before removing player otherwise soundhandler reference will be lost. mcl_weather.rain.remove_player = function(player) - local player_meta = mcl_weather.players[player:get_player_name()] + local name = player:get_player_name() + local player_meta = mcl_weather.players[name] + local ps = mcl_weather.rain.ps[name] + if ps then + minetest.delete_particlespawner(ps,name) + end + mcl_weather.rain.ps[name]=nil if player_meta ~= nil and player_meta.origin_sky ~= nil then player:set_clouds({color="#FFF0F0E5"}) + mcl_weather.rain.remove_sound(player) mcl_weather.players[player:get_player_name()] = nil end end @@ -200,7 +205,6 @@ mcl_weather.rain.clear = function() mcl_weather.rain.set_particles_mode("rain") mcl_weather.skycolor.remove_layer("weather-pack-rain-sky") for _, player in ipairs(minetest.get_connected_players()) do - mcl_weather.rain.remove_sound(player) mcl_weather.rain.remove_player(player) end end