From 6f2aae82dfb321a834d9ecc23c77b85173f9e00a Mon Sep 17 00:00:00 2001 From: cora Date: Sun, 26 Sep 2021 03:06:14 +0200 Subject: [PATCH] add rain to new weather --- mods/ENVIRONMENT/mcl_weather/rain.lua | 286 ++++++++------------------ 1 file changed, 82 insertions(+), 204 deletions(-) diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index 0afbb553..95bafce6 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -1,200 +1,93 @@ -local PARTICLES_COUNT_RAIN = 30 -local PARTICLES_COUNT_THUNDER = 45 - mcl_weather.rain = { - -- max rain particles created at time - particles_count = PARTICLES_COUNT_RAIN, - -- flag to turn on/off extinguish fire for rain extinguish_fire = true, -- flag useful when mixing weathers - raining = false, - - -- keeping last timeofday value (rounded). - -- Defaulted to non-existing value for initial comparing. - sky_last_update = -1, - - init_done = false, + raining = false } - -mcl_weather.rain.sound_handler = function(player) - return minetest.sound_play("weather_rain", { - to_player = player:get_player_name(), - loop = true, - }) -end - --- set skybox based on time (uses skycolor api) -mcl_weather.rain.set_sky_box = function() - if mcl_weather.state == "rain" then - mcl_weather.skycolor.add_layer( - "weather-pack-rain-sky", - {{r=0, g=0, b=0}, +mcl_weather.raining = false +mcl_weather.register_weather("rain",{ + light_factor = 0.6, + cloudcolor= "#5D5D5FE8" , + sound = "weather_rain", + -- 10min - 20min + min_duration = 600, + max_duration = 1200, + transitions = { + [70] = "none", + [100] = "thunder", + }, + skylayer= {{r=0, g=0, b=0}, {r=85, g=86, b=98}, {r=135, g=135, b=151}, {r=85, g=86, b=98}, - {r=0, g=0, b=0}}) - mcl_weather.skycolor.active = true - for _, player in ipairs(minetest.get_connected_players()) do - player:set_clouds({color="#5D5D5FE8"}) - end - end -end - --- creating manually parctiles instead of particles spawner because of easier to control --- spawn position. -mcl_weather.rain.add_rain_particles = function(player) - - 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 -end - --- Simple random texture getter -mcl_weather.rain.get_texture = function() - local texture_name - local random_number = math.random() - if random_number > 0.33 then - texture_name = "weather_pack_rain_raindrop_1.png" - elseif random_number > 0.66 then - texture_name = "weather_pack_rain_raindrop_2.png" - else - texture_name = "weather_pack_rain_raindrop_3.png" - end - return texture_name; -end - --- register player for rain weather. --- basically needs for origin sky reference and rain sound controls. -mcl_weather.rain.add_player = function(player) - if mcl_weather.players[player:get_player_name()] == nil then - local player_meta = {} - player_meta.origin_sky = {player:get_sky()} - mcl_weather.players[player:get_player_name()] = player_meta - 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()] - if player_meta ~= nil and player_meta.origin_sky ~= nil then - player:set_clouds({color="#FFF0F0E5"}) - mcl_weather.players[player:get_player_name()] = nil - end -end - -mcl_worlds.register_on_dimension_change(function(player, dimension) - if dimension ~= "overworld" and dimension ~= "void" then - mcl_weather.rain.remove_sound(player) - mcl_weather.rain.remove_player(player) - elseif dimension == "overworld" then - mcl_weather.rain.update_sound(player) - if mcl_weather.rain.raining then - mcl_weather.rain.add_rain_particles(player) - mcl_weather.rain.add_player(player) - end - end -end) - --- adds and removes rain sound depending how much rain particles around player currently exist. --- have few seconds delay before each check to avoid on/off sound too often --- when player stay on 'edge' where sound should play and stop depending from random raindrop appearance. -mcl_weather.rain.update_sound = function(player) - local player_meta = mcl_weather.players[player:get_player_name()] - if player_meta ~= nil then - if player_meta.sound_updated ~= nil and player_meta.sound_updated + 5 > minetest.get_gametime() then - return false - end - - if player_meta.sound_handler ~= nil then - if mcl_weather.rain.last_rp_count == 0 then - minetest.sound_fade(player_meta.sound_handler, -0.5, 0.0) - player_meta.sound_handler = nil - end - elseif mcl_weather.rain.last_rp_count > 0 then - player_meta.sound_handler = mcl_weather.rain.sound_handler(player) - end - - player_meta.sound_updated = minetest.get_gametime() - end -end - --- rain sound removed from player. -mcl_weather.rain.remove_sound = function(player) - local player_meta = mcl_weather.players[player:get_player_name()] - if player_meta ~= nil and player_meta.sound_handler ~= nil then - minetest.sound_fade(player_meta.sound_handler, -0.5, 0.0) - player_meta.sound_handler = nil - player_meta.sound_updated = nil - end -end - --- callback function for removing rain -mcl_weather.rain.clear = function() - mcl_weather.rain.raining = false - mcl_weather.rain.sky_last_update = -1 - mcl_weather.rain.init_done = false - 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 - -minetest.register_globalstep(function(dtime) - if mcl_weather.state ~= "rain" then - return false - end - - mcl_weather.rain.make_weather() -end) - -mcl_weather.rain.make_weather = function() - if mcl_weather.rain.init_done == false then - 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.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 - --- Switch the number of raindrops: "thunder" for many raindrops, otherwise for normal raindrops -mcl_weather.rain.set_particles_mode = function(mode) - if mode == "thunder" then - mcl_weather.rain.particles_count = PARTICLES_COUNT_THUNDER - else - mcl_weather.rain.particles_count = PARTICLES_COUNT_RAIN - end -end + {r=0, g=0, b=0}}, + particlespawners = { + { + amount = 800, + time = 0, + minpos = vector.new(-5,5,-5), + maxpos =vector.new(5,10,5), + minvel = vector.new(0,-8,0), + maxvel = vector.new(0,-12,0), + minacc = vector.new(0,-20,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, + glow = 1, + texture="weather_pack_rain_raindrop_1.png" + }, + { + amount = 200, + time = 0, + minpos = vector.new(-15,5,-15), + maxpos =vector.new(15,15,15), + minvel = vector.new(0,-8,0), + maxvel = vector.new(0,-12,0), + minacc = vector.new(0,-20,0), + maxacc = vector.new(0,-40,0), + minexptime = 1, + maxexptime = 1, + minsize = 0.5, + maxsize = 3, + collisiondetection = true, + collision_removal = true, + object_collision = true, + vertical = true, + glow = 1, + texture="weather_pack_rain_raindrop_2.png" + }, + { + amount = 200, + time = 0, + minpos = vector.new(-5,0,-5), + maxpos = vector.new(5,0.8,5), + minvel = vector.new(-4, 5,-4), + maxvel = vector.new(4,10,4), + minacc = vector.new(0,10,0), + maxacc = vector.new(0,25,0), + minexptime = 0.01, + maxexptime = 0.04, + minsize = 0.5, + maxsize = 3, + collisiondetection = true, + collision_removal = true, + object_collision = true, + vertical = true, + texture = "weather_pack_rain_raindrop_2.png", + glow = 0 + } + }, + start = function() mcl_weather.rain.raining = true end, + start_player = function(name) end, + clear = function() mcl_weather.rain.raining = false end +}) if mcl_weather.allow_abm then -- ABM for extinguish fire @@ -263,19 +156,4 @@ if mcl_weather.allow_abm then end end }) -end - -if mcl_weather.reg_weathers.rain == nil then - mcl_weather.reg_weathers.rain = { - clear = mcl_weather.rain.clear, - light_factor = 0.6, - -- 10min - 20min - min_duration = 600, - max_duration = 1200, - transitions = { - [65] = "none", - [70] = "snow", - [100] = "thunder", - } - } -end +end \ No newline at end of file