From d0794930564f4166b862ded1540b6ed093ed82be Mon Sep 17 00:00:00 2001 From: cora Date: Sat, 25 Sep 2021 03:05:18 +0200 Subject: [PATCH] replace snow particles with particlespawner --- mods/ENVIRONMENT/mcl_weather/snow.lua | 156 +++++++++++++++++--------- 1 file changed, 103 insertions(+), 53 deletions(-) diff --git a/mods/ENVIRONMENT/mcl_weather/snow.lua b/mods/ENVIRONMENT/mcl_weather/snow.lua index afe23c15..e1f61fcb 100644 --- a/mods/ENVIRONMENT/mcl_weather/snow.lua +++ b/mods/ENVIRONMENT/mcl_weather/snow.lua @@ -1,31 +1,58 @@ mcl_weather.snow = {} +mcl_weather.snow.particlespawners = {} -mcl_weather.snow.particles_count = 15 -mcl_weather.snow.init_done = false +local psdef= { + amount = 30, + time = 0, + minpos = vector.new(-15,5,-15), + maxpos =vector.new(15,10,15), + minvel = vector.new(0,-1,0), + maxvel = vector.new(0,-4,0), + minacc = vector.new(0,-1,0), + maxacc = vector.new(0,-4,0), + minexptime = 1, + maxexptime = 1, + minsize = 0.5, + maxsize = 5, + collisiondetection = true, + collision_removal = true, + object_collision = true, + vertical = true, + glow = 1 +} --- calculates coordinates and draw particles for snow weather -mcl_weather.snow.add_snow_particles = function(player) - mcl_weather.rain.last_rp_count = 0 - for i=mcl_weather.snow.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) - random_pos_y = math.random() + math.random(player:get_pos().y - 1, player:get_pos().y + 7) - if minetest.get_node_light({x=random_pos_x, y=random_pos_y, z=random_pos_z}, 0.5) == 15 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 = math.random(-100,100)*0.001, y = math.random(-300,-100)*0.004, z = math.random(-100,100)*0.001}, - acceleration = {x = 0, y=0, z = 0}, - expirationtime = 8.0, - size = 1, - collisiondetection = true, - collision_removal = true, - object_collision = false, - vertical = false, - texture = mcl_weather.snow.get_texture(), - playername = player:get_player_name() - }) - end +local function check_player(player) + if mcl_weather.state ~= "snow" then return false end + local name=player:get_player_name(name) + if mcl_worlds.has_weather(player:get_pos()) and not mcl_weather.snow.particlespawners[name] then + return true + end + return false +end + +mcl_weather.snow.add_particlespawners = function(player) + if not check_player(player) then + mcl_weather.snow.delete_particlespawners(player) + return end + local name=player:get_player_name(name) + mcl_weather.snow.particlespawners[name]={} + psdef.playername = name + psdef.attached = player + for i=1,2 do + psdef.texture="weather_pack_snow_snowflake"..i..".png" + mcl_weather.snow.particlespawners[name][i]=minetest.add_particlespawner(psdef) + end +end + +mcl_weather.snow.delete_particlespawners = function(player) + local name=player:get_player_name(name) + if mcl_weather.snow.particlespawners[name] then + for i=1,2 do + minetest.delete_particlespawner(mcl_weather.snow.particlespawners[name][i]) + end + mcl_weather.snow.particlespawners[name]=nil + end end mcl_weather.snow.set_sky_box = function() @@ -38,47 +65,70 @@ mcl_weather.snow.set_sky_box = function() {r=0, g=0, b=0}}) mcl_weather.skycolor.active = true for _, player in ipairs(minetest.get_connected_players()) do - player:set_clouds({color="#ADADADE8"}) + end mcl_weather.skycolor.active = true end -mcl_weather.snow.clear = function() + +mcl_weather.snow.start_player = function(player) + if check_player(player) then + mcl_weather.snow.add_particlespawners(player) + player:set_clouds({color="#ADADADE8"}) + end +end + +mcl_weather.snow.clear_player = function(player) + mcl_weather.snow.delete_particlespawners(player) +end + +mcl_weather.snow.start = function() + for _, player in ipairs(minetest.get_connected_players()) do + mcl_weather.snow.start_player(player) + end + mcl_weather.snow.set_sky_box() + mcl_weather.snow.init_done = true +end + +mcl_weather.snow.clear = function() + for _, player in ipairs(minetest.get_connected_players()) do + mcl_weather.snow.clear_player(player) + end mcl_weather.skycolor.remove_layer("weather-pack-snow-sky") mcl_weather.snow.init_done = false end --- Simple random texture getter -mcl_weather.snow.get_texture = function() - return "weather_pack_snow_snowflake"..math.random(1,2)..".png" -end - -local timer = 0 minetest.register_globalstep(function(dtime) - if mcl_weather.state ~= "snow" then - return false - end - - timer = timer + dtime; - if timer >= 0.5 then - timer = 0 - else - return - end + if mcl_weather.state ~= "snow" then + return false + end - if mcl_weather.snow.init_done == false then - mcl_weather.snow.set_sky_box() - mcl_weather.snow.init_done = true - end - - for _, player in ipairs(minetest.get_connected_players()) do - if (mcl_weather.is_underwater(player) or not mcl_worlds.has_weather(player:get_pos())) then - return false - end - mcl_weather.snow.add_snow_particles(player) - end + if mcl_weather.rain.init_done == false then + mcl_weather.snow.start() + mcl_weather.rain.set_sky_box() + mcl_weather.rain.set_particles_mode(mcl_weather.mode) + elseif mcl_weather.state ~= "snow" then + mcl_weather.snow.clear() + end end) +minetest.register_on_joinplayer(function(player) + mcl_weather.snow.start_player(player) +end) +minetest.register_on_leaveplayer(function(player) + mcl_weather.snow.clear_player(player) +end) + +mcl_worlds.register_on_dimension_change(function(player, dimension) + if dimension == "overworld" then + mcl_weather.snow.add_particlespawners(player) + else + mcl_weather.snow.delete_particlespawners(player) + end +end) + + + -- register snow weather if mcl_weather.reg_weathers.snow == nil then mcl_weather.reg_weathers.snow = {