add rain to new weather

This commit is contained in:
cora 2021-09-26 03:06:14 +02:00
parent d59a0101f4
commit 6f2aae82df
1 changed files with 82 additions and 204 deletions

View File

@ -1,200 +1,93 @@
local PARTICLES_COUNT_RAIN = 30
local PARTICLES_COUNT_THUNDER = 45
mcl_weather.rain = { mcl_weather.rain = {
-- max rain particles created at time
particles_count = PARTICLES_COUNT_RAIN,
-- flag to turn on/off extinguish fire for rain -- flag to turn on/off extinguish fire for rain
extinguish_fire = true, extinguish_fire = true,
-- flag useful when mixing weathers -- flag useful when mixing weathers
raining = false, raining = false
-- keeping last timeofday value (rounded).
-- Defaulted to non-existing value for initial comparing.
sky_last_update = -1,
init_done = false,
} }
mcl_weather.raining = false
mcl_weather.rain.sound_handler = function(player) mcl_weather.register_weather("rain",{
return minetest.sound_play("weather_rain", { light_factor = 0.6,
to_player = player:get_player_name(), cloudcolor= "#5D5D5FE8" ,
loop = true, sound = "weather_rain",
}) -- 10min - 20min
end min_duration = 600,
max_duration = 1200,
-- set skybox based on time (uses skycolor api) transitions = {
mcl_weather.rain.set_sky_box = function() [70] = "none",
if mcl_weather.state == "rain" then [100] = "thunder",
mcl_weather.skycolor.add_layer( },
"weather-pack-rain-sky", skylayer= {{r=0, g=0, b=0},
{{r=0, g=0, b=0},
{r=85, g=86, b=98}, {r=85, g=86, b=98},
{r=135, g=135, b=151}, {r=135, g=135, b=151},
{r=85, g=86, b=98}, {r=85, g=86, b=98},
{r=0, g=0, b=0}}) {r=0, g=0, b=0}},
mcl_weather.skycolor.active = true particlespawners = {
for _, player in ipairs(minetest.get_connected_players()) do {
player:set_clouds({color="#5D5D5FE8"}) amount = 800,
end time = 0,
end minpos = vector.new(-5,5,-5),
end maxpos =vector.new(5,10,5),
minvel = vector.new(0,-8,0),
-- creating manually parctiles instead of particles spawner because of easier to control maxvel = vector.new(0,-12,0),
-- spawn position. minacc = vector.new(0,-20,0),
mcl_weather.rain.add_rain_particles = function(player) maxacc = vector.new(0,-30,0),
minexptime = 1,
mcl_weather.rain.last_rp_count = 0 maxexptime = 1,
for i=mcl_weather.rain.particles_count, 1,-1 do minsize = 0.5,
local random_pos_x, random_pos_y, random_pos_z = mcl_weather.get_random_pos_by_player_look_dir(player) maxsize = 5,
if mcl_weather.is_outdoor({x=random_pos_x, y=random_pos_y, z=random_pos_z}) then collisiondetection = true,
mcl_weather.rain.last_rp_count = mcl_weather.rain.last_rp_count + 1 collision_removal = true,
minetest.add_particle({ object_collision = true,
pos = {x=random_pos_x, y=random_pos_y, z=random_pos_z}, vertical = true,
velocity = {x=0, y=-10, z=0}, glow = 1,
acceleration = {x=0, y=-30, z=0}, texture="weather_pack_rain_raindrop_1.png"
expirationtime = 1.0, },
size = math.random(0.5, 3), {
collisiondetection = true, amount = 200,
collision_removal = true, time = 0,
vertical = true, minpos = vector.new(-15,5,-15),
texture = mcl_weather.rain.get_texture(), maxpos =vector.new(15,15,15),
playername = player:get_player_name() minvel = vector.new(0,-8,0),
}) maxvel = vector.new(0,-12,0),
end minacc = vector.new(0,-20,0),
end maxacc = vector.new(0,-40,0),
end minexptime = 1,
maxexptime = 1,
-- Simple random texture getter minsize = 0.5,
mcl_weather.rain.get_texture = function() maxsize = 3,
local texture_name collisiondetection = true,
local random_number = math.random() collision_removal = true,
if random_number > 0.33 then object_collision = true,
texture_name = "weather_pack_rain_raindrop_1.png" vertical = true,
elseif random_number > 0.66 then glow = 1,
texture_name = "weather_pack_rain_raindrop_2.png" texture="weather_pack_rain_raindrop_2.png"
else },
texture_name = "weather_pack_rain_raindrop_3.png" {
end amount = 200,
return texture_name; time = 0,
end minpos = vector.new(-5,0,-5),
maxpos = vector.new(5,0.8,5),
-- register player for rain weather. minvel = vector.new(-4, 5,-4),
-- basically needs for origin sky reference and rain sound controls. maxvel = vector.new(4,10,4),
mcl_weather.rain.add_player = function(player) minacc = vector.new(0,10,0),
if mcl_weather.players[player:get_player_name()] == nil then maxacc = vector.new(0,25,0),
local player_meta = {} minexptime = 0.01,
player_meta.origin_sky = {player:get_sky()} maxexptime = 0.04,
mcl_weather.players[player:get_player_name()] = player_meta minsize = 0.5,
end maxsize = 3,
end collisiondetection = true,
collision_removal = true,
-- remove player from player list effected by rain. object_collision = true,
-- be sure to remove sound before removing player otherwise soundhandler reference will be lost. vertical = true,
mcl_weather.rain.remove_player = function(player) texture = "weather_pack_rain_raindrop_2.png",
local player_meta = mcl_weather.players[player:get_player_name()] glow = 0
if player_meta ~= nil and player_meta.origin_sky ~= nil then }
player:set_clouds({color="#FFF0F0E5"}) },
mcl_weather.players[player:get_player_name()] = nil start = function() mcl_weather.rain.raining = true end,
end start_player = function(name) end,
end clear = function() mcl_weather.rain.raining = false 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
if mcl_weather.allow_abm then if mcl_weather.allow_abm then
-- ABM for extinguish fire -- ABM for extinguish fire
@ -263,19 +156,4 @@ if mcl_weather.allow_abm then
end end
end 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