diff --git a/description.txt b/description.txt new file mode 100644 index 0000000..6efa41e --- /dev/null +++ b/description.txt @@ -0,0 +1 @@ +Set of weathers for minetest. \ No newline at end of file diff --git a/rain/init.lua b/rain/init.lua index 94bf2a0..f435a53 100644 --- a/rain/init.lua +++ b/rain/init.lua @@ -1,6 +1,6 @@ rain = {} -rain.particles_count = 50 +rain.particles_count = 35 rain.sound_handler = function(player) return minetest.sound_play("weather_rain", { @@ -136,8 +136,8 @@ rain.make_weather = function() end end -if weather.known_weathers.rain == nil then - weather.known_weathers.rain = { +if weather.reg_weathers.rain == nil then + weather.reg_weathers.rain = { chance = 15, clear = rain.clear } diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..1ee3ea0 Binary files /dev/null and b/screenshot.png differ diff --git a/snow/init.lua b/snow/init.lua index d97e1a8..f980a3f 100644 --- a/snow/init.lua +++ b/snow/init.lua @@ -51,8 +51,8 @@ minetest.register_globalstep(function(dtime) end) -- register snow weather -if weather.known_weathers.snow == nil then - weather.known_weathers.snow = { +if weather.reg_weathers.snow == nil then + weather.reg_weathers.snow = { chance = 10, clear = function() end } diff --git a/thunder/init.lua b/thunder/init.lua index 8907f31..3ff6453 100644 --- a/thunder/init.lua +++ b/thunder/init.lua @@ -27,9 +27,11 @@ thunder.clear = function() end -- register thunderstorm weather -if weather.known_weathers.thunder == nil then - weather.known_weathers.thunder = { +if weather.reg_weathers.thunder == nil then + weather.reg_weathers.thunder = { chance = 5, - clear = thunder.clear + clear = thunder.clear, + min_duration = 120, + max_duration = 600, } end \ No newline at end of file diff --git a/weather_core/init.lua b/weather_core/init.lua index 1c60821..05ec088 100644 --- a/weather_core/init.lua +++ b/weather_core/init.lua @@ -21,11 +21,18 @@ weather = { end_time = nil, -- registered weathers - known_weathers = {} + reg_weathers = {}, + + -- automaticly calculates intervals and swap weathers + auto_mode = true } -weather.get_rand_end_time = function() - return os.time() + math.random(weather.min_duration, weather.max_duration); +weather.get_rand_end_time = function(min_duration, max_duration) + if min_duration ~= nil and max_duration ~= nil then + return os.time() + math.random(min_duration, max_duration); + else + return os.time() + math.random(weather.min_duration, weather.max_duration); + end end -- checks if player is undewater. This is needed in order to @@ -84,28 +91,39 @@ function get_random_pos_by_player_look_dir(player) end minetest.register_globalstep(function(dtime) + if weather.auto_mode == false then + return 0 + end + -- recalculate weather only when there aren't currently any if (weather.state ~= "none") then if (weather.end_time ~= nil and weather.end_time <= os.time()) then - weather.known_weathers[weather.state].clear() + weather.reg_weathers[weather.state].clear() weather.state = "none" end - end - - if (weather.next_check <= os.time()) then - for reg_weather_name, reg_weather_obj in pairs(weather.known_weathers) do - if (reg_weather_obj ~= nil and reg_weather_obj.chance ~= nil) then - local random_roll = math.random(0,100) - if (random_roll <= reg_weather_obj.chance) then - weather.state = reg_weather_name - weather.end_time = weather.get_rand_end_time() - end - end + elseif (weather.next_check <= os.time()) then + for weather_name, weather_meta in pairs(weather.reg_weathers) do + weather.set_random_weather(weather_name, weather_meta) end + -- fallback next_check set, weather 'none' will be. weather.next_check = os.time() + weather.check_interval end end) +-- sets random weather (which could be 'regular' (no weather)). +weather.set_random_weather = function(weather_name, weather_meta) + if weather.next_check > os.time() then return 0 end + + if (weather_meta ~= nil and weather_meta.chance ~= nil) then + local random_roll = math.random(0,100) + if (random_roll <= weather_meta.chance) then + weather.state = weather_name + weather.end_time = weather.get_rand_end_time(weather_meta.min_duration, weather_meta.max_duration) + weather.next_check = os.time() + weather.check_interval + end + end +end + minetest.register_privilege("weather_manager", { description = "Gives ability to control weather", give_to_singleplayer = false @@ -118,16 +136,16 @@ minetest.register_chatcommand("set_weather", { privs = {weather_manager = true}, func = function(name, param) if (param == "none") then - if (weather.state ~= nil and weather.known_weathers[weather.state] ~= nil) then - weather.known_weathers[weather.state].clear() + if (weather.state ~= nil and weather.reg_weathers[weather.state] ~= nil) then + weather.reg_weathers[weather.state].clear() weather.state = param end weather.state = "none" end - if (weather.known_weathers ~= nil and weather.known_weathers[param] ~= nil) then - if (weather.state ~= nil and weather.state ~= "none" and weather.known_weathers[weather.state] ~= nil) then - weather.known_weathers[weather.state].clear() + if (weather.reg_weathers ~= nil and weather.reg_weathers[param] ~= nil) then + if (weather.state ~= nil and weather.state ~= "none" and weather.reg_weathers[weather.state] ~= nil) then + weather.reg_weathers[weather.state].clear() end weather.state = param end