From a78fe52970c5a44d74ddbfae9a40748c39e81b0c Mon Sep 17 00:00:00 2001 From: cora Date: Thu, 23 Sep 2021 21:38:13 +0200 Subject: [PATCH] weather, rain: replace add_particle by spawner --- mods/ENVIRONMENT/mcl_weather/rain.lua | 70 ++++++++++++++++++++------- 1 file changed, 52 insertions(+), 18 deletions(-) diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index 0afbb553..d10baf59 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -42,29 +42,62 @@ mcl_weather.rain.set_sky_box = function() end end --- creating manually parctiles instead of particles spawner because of easier to control --- spawn position. -mcl_weather.rain.add_rain_particles = function(player) +-- ~~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 player = minetest.get_player_by_name(name) + if not player then return end + + if mcl_weather.rain.raining then + minetest.after(1,mcl_weather.rain.add_rain_particlespawner,name) + else + return + end + + local wind=vector.new(math.random(0,3),0,math.random(0,3)) + local falling_speed = math.random(10,15) + local amount = math.random(200,400) + local size = math.random(2,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 wind_pos = vector.multiply(wind, -1) + local minpos = {x = -15, y = 10, z = -15} + local maxpos = {x = 15, y = 10, z = 15} + 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 = - falling_speed, z = wind.z} + local acc = {x = 0, y = 0, 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) if mcl_weather.is_outdoor({x=random_pos_x, y=random_pos_y, z=random_pos_z}) then mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1 - minetest.add_particle({ - pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z}, - velocity = {x=0, y=-10, z=0}, - acceleration = {x=0, y=-30, z=0}, - expirationtime = 1.0, - size = math.random(0.5, 3), - collisiondetection = true, - collision_removal = true, - vertical = true, - texture = mcl_weather.rain.get_texture(), - playername = player:get_player_name() - }) end end + + minetest.add_particlespawner({ + amount = mcl_weather.rain.particles_count, + 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() + }) + mcl_weather.rain.init_done = true end -- Simple random texture getter @@ -88,6 +121,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()) end end @@ -173,16 +207,16 @@ mcl_weather.rain.make_weather = function() mcl_weather.rain.raining = true mcl_weather.rain.set_sky_box() mcl_weather.rain.set_particles_mode(mcl_weather.mode) - mcl_weather.rain.init_done = true end for _, player in ipairs(minetest.get_connected_players()) do + if mcl_weather.players[player:get_player_name()] == nil then + mcl_weather.rain.add_player(player) + end if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then mcl_weather.rain.remove_sound(player) return false end - mcl_weather.rain.add_player(player) - mcl_weather.rain.add_rain_particles(player) mcl_weather.rain.update_sound(player) end end