From f20f9f9a88d48af6b9466d1692d5c872df84d651 Mon Sep 17 00:00:00 2001 From: kay27 Date: Thu, 28 Jan 2021 11:47:51 +0400 Subject: [PATCH] Log weather changes according to https://git.minetest.land/Wuzzy/MineClone2/issues/897 --- mods/ENVIRONMENT/mcl_weather/init.lua | 6 +- mods/ENVIRONMENT/mcl_weather/nether_dust.lua | 7 +- mods/ENVIRONMENT/mcl_weather/rain.lua | 284 +++++++++--------- mods/ENVIRONMENT/mcl_weather/weather_core.lua | 14 +- 4 files changed, 156 insertions(+), 155 deletions(-) diff --git a/mods/ENVIRONMENT/mcl_weather/init.lua b/mods/ENVIRONMENT/mcl_weather/init.lua index c7b8fb6de..e4ebfb2dc 100644 --- a/mods/ENVIRONMENT/mcl_weather/init.lua +++ b/mods/ENVIRONMENT/mcl_weather/init.lua @@ -1,10 +1,10 @@ -local modpath = minetest.get_modpath("mcl_weather"); +local modpath = minetest.get_modpath("mcl_weather") mcl_weather = {} -- If not located then embeded skycolor mod version will be loaded. if minetest.get_modpath("skycolor") == nil then - dofile(modpath.."/skycolor.lua") + dofile(modpath.."/skycolor.lua") end dofile(modpath.."/weather_core.lua") @@ -13,5 +13,5 @@ dofile(modpath.."/rain.lua") dofile(modpath.."/nether_dust.lua") if minetest.get_modpath("lightning") ~= nil then - dofile(modpath.."/thunder.lua") + dofile(modpath.."/thunder.lua") end diff --git a/mods/ENVIRONMENT/mcl_weather/nether_dust.lua b/mods/ENVIRONMENT/mcl_weather/nether_dust.lua index e41746a71..735676454 100644 --- a/mods/ENVIRONMENT/mcl_weather/nether_dust.lua +++ b/mods/ENVIRONMENT/mcl_weather/nether_dust.lua @@ -24,11 +24,8 @@ end local timer = 0 minetest.register_globalstep(function(dtime) timer = timer + dtime - if timer >= 0.7 then - timer = 0 - else - return - end + if timer < 0.7 then return end + timer = 0 for _, player in ipairs(minetest.get_connected_players()) do if not mcl_worlds.has_dust(player:get_pos()) then diff --git a/mods/ENVIRONMENT/mcl_weather/rain.lua b/mods/ENVIRONMENT/mcl_weather/rain.lua index 0dde0d2d8..9b4210060 100644 --- a/mods/ENVIRONMENT/mcl_weather/rain.lua +++ b/mods/ENVIRONMENT/mcl_weather/rain.lua @@ -2,198 +2,198 @@ local PARTICLES_COUNT_RAIN = 30 local PARTICLES_COUNT_THUNDER = 45 mcl_weather.rain = { - -- max rain particles created at time - particles_count = PARTICLES_COUNT_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 to turn on/off extinguish fire for rain + extinguish_fire = true, - -- flag useful when mixing weathers - raining = false, + -- flag useful when mixing weathers + raining = false, - -- keeping last timeofday value (rounded). - -- Defaulted to non-existing value for initial comparing. - sky_last_update = -1, + -- keeping last timeofday value (rounded). + -- Defaulted to non-existing value for initial comparing. + sky_last_update = -1, - init_done = false, + init_done = false, } mcl_weather.rain.sound_handler = function(player) - return minetest.sound_play("weather_rain", { - to_player = player:get_player_name(), - loop = true, - }) + 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}, - {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 pairs(minetest.get_connected_players()) do - player:set_clouds({color="#5D5D5FE8"}) - end - end + if mcl_weather.state == "rain" then + mcl_weather.skycolor.add_layer( + "weather-pack-rain-sky", + {{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 pairs(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 + 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; + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + if mcl_weather.state ~= "rain" then + return false + end - mcl_weather.rain.make_weather() + 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 + 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 + 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 + 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 @@ -266,16 +266,16 @@ if mcl_weather.allow_abm then 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", - } - } + 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 diff --git a/mods/ENVIRONMENT/mcl_weather/weather_core.lua b/mods/ENVIRONMENT/mcl_weather/weather_core.lua index 0381bf1fc..a1920308f 100644 --- a/mods/ENVIRONMENT/mcl_weather/weather_core.lua +++ b/mods/ENVIRONMENT/mcl_weather/weather_core.lua @@ -40,7 +40,7 @@ local storage = minetest.get_mod_storage() local save_weather = function() storage:set_string("mcl_weather_state", mcl_weather.state) storage:set_int("mcl_weather_end_time", mcl_weather.end_time) - minetest.log("action", "[mcl_weather] Weather data saved: state="..mcl_weather.state.." end_time="..mcl_weather.end_time) + minetest.log("verbose", "[mcl_weather] Weather data saved: state="..mcl_weather.state.." end_time="..mcl_weather.end_time) end minetest.register_on_shutdown(save_weather) @@ -164,11 +164,15 @@ end -- Change weather to new_weather. -- * explicit_end_time is OPTIONAL. If specified, explicitly set the -- gametime (minetest.get_gametime) in which the weather ends. -mcl_weather.change_weather = function(new_weather, explicit_end_time) +-- * changer is OPTIONAL, for logging purposes. +mcl_weather.change_weather = function(new_weather, explicit_end_time, changer_name) + local changer_name = changer_name or debug.getinfo(2).name + if (mcl_weather.reg_weathers ~= nil and mcl_weather.reg_weathers[new_weather] ~= nil) then if (mcl_weather.state ~= nil and mcl_weather.reg_weathers[mcl_weather.state] ~= nil) then mcl_weather.reg_weathers[mcl_weather.state].clear() end + minetest.log("action", "[mcl_weather] " .. changer_name .. " changed the weather from " .. mcl_weather.state .. " to " .. new_weather) mcl_weather.state = new_weather local weather_meta = mcl_weather.reg_weathers[mcl_weather.state] if explicit_end_time then @@ -222,7 +226,7 @@ minetest.register_chatcommand("weather", { end end - local success = mcl_weather.change_weather(new_weather, end_time) + local success = mcl_weather.change_weather(new_weather, end_time, name) if success then return true else @@ -238,13 +242,13 @@ minetest.register_chatcommand("toggledownfall", { func = function(name, param) -- Currently rain/thunder/snow: Set weather to clear if mcl_weather.state ~= "none" then - return mcl_weather.change_weather("none") + return mcl_weather.change_weather("none", nil, name) -- Currently clear: Set weather randomly to rain/thunder/snow else local new = { "rain", "thunder", "snow" } local r = math.random(1, #new) - return mcl_weather.change_weather(new[r]) + return mcl_weather.change_weather(new[r], nil, name) end end })