diff --git a/README.md b/README.md index 9db06cd..fc9ffc5 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,6 @@ - Thunder sound and puddle texture DWYWPL by Don, Nathan from mymonths at https://github.com/minetest-mods/mymonths - Snow cover texture WTFPL, taken from mymonths - Rain texture CC-BY-SA 3.0 from TeddyDesTodes, taken from his weather branch at https://github.com/TeddyDesTodes/minetest/tree/weather -- Snow flake textures CC BY-SA (3.0) by paramat, found in snowdrift mod at https://github.com/paramat/snowdrift +- Snow flake and rain drop textures CC BY-SA (3.0) by paramat, found in snowdrift mod at https://github.com/paramat/snowdrift - Snow texture composited from individual snow flakes by paramat. CC-BY-SA (3.0) - Wind sound CC-BY (3.0) by InspectorJ from https://freesound.org/people/InspectorJ/sounds/376415/ \ No newline at end of file diff --git a/init.lua b/init.lua index a671e46..b754e72 100644 --- a/init.lua +++ b/init.lua @@ -34,21 +34,23 @@ weather_mod.settings = { } weather_mod.state = { - current_weather = weather_mod.modname .. ":snowstorm", heat = 1, - humidity = 1 + humidity = 1, + wind = vector.new(0, 0, -0.25) } -- import core API dofile(weather_mod.modpath.."/lib/player.lua") dofile(weather_mod.modpath.."/lib/environment.lua") +dofile(weather_mod.modpath.."/lib/wind.lua") dofile(weather_mod.modpath.."/lib/lightning.lua") dofile(weather_mod.modpath.."/lib/main.lua") +dofile(weather_mod.modpath.."/lib/commands.lua") -- import individual weather types -dofile(weather_mod.modpath.."/weathers/clear.lua") dofile(weather_mod.modpath.."/weathers/rain.lua") -dofile(weather_mod.modpath.."/weathers/rainstorm.lua") +dofile(weather_mod.modpath.."/weathers/rain_heavy.lua") dofile(weather_mod.modpath.."/weathers/snow.lua") -dofile(weather_mod.modpath.."/weathers/snowstorm.lua") +dofile(weather_mod.modpath.."/weathers/snow_heavy.lua") +dofile(weather_mod.modpath.."/weathers/storm.lua") dofile(weather_mod.modpath.."/weathers/sandstorm.lua") diff --git a/lib/commands.lua b/lib/commands.lua new file mode 100644 index 0000000..0503559 --- /dev/null +++ b/lib/commands.lua @@ -0,0 +1,87 @@ +minetest.register_privilege("weather", { + description = "Change the weather", + give_to_singleplayer = false +}) + +-- Force a weather effect to override environment +minetest.register_chatcommand("set_weather", { + params = "", + description = "Set weather to a registered type of effect\ + show all types when no parameters are given", -- full description + privs = {weather = true}, + func = function(name, param) + if param == nil or param == "" or param == "?" then + local types="auto" + for i,_ in pairs(weather_mod.weathers) do + types=types..", "..i + end + minetest.chat_send_player(name, "avalible weather types: "..types) + else + if type(weather_mod.weathers[param]) == "nil" and param ~= "auto" then + minetest.chat_send_player(name, "This type of weather is not registered.\n".. + "To list all types of weather run the command without parameters.") + else + weather_mod.state.current_weather = param + end + end + end +}) + +-- Set wind speed and direction +minetest.register_chatcommand("set_wind", { + params = "", + description = "Set wind to the given x,z direction", -- full description + privs = {weather = true}, + func = function(name, param) + if param==nil or param=="" then + minetest.chat_send_player(name, "please provide two comma seperated numbers") + return + end + local x,z = string.match(param, "^([%d.-]+)[, ] *([%d.-]+)$") + x=tonumber(x) + z=tonumber(z) + if x and z then + weather_mod.state.wind = vector.new(x,0,z) + else + minetest.chat_send_player(name, param.." are not two comma seperated numbers") + end + end +}) + +-- Set base value of global heat level +minetest.register_chatcommand("set_heat", { + params = "", + description = "Set base value of global heat level", -- full description + privs = {weather = true}, + func = function(name, param) + if param==nil or param=="" then + minetest.chat_send_player(name, "please provide a heat value") + return + end + v = tonumber(param) + if v then + weather_mod.state.heat = v + else + minetest.chat_send_player(name, param.." is not a valid heat level") + end + end +}) + +-- Set base value of global humidity level +minetest.register_chatcommand("set_humidity", { + params = "", + description = "Set base value of global humidity level", -- full description + privs = {weather = true}, + func = function(name, param) + if param==nil or param=="" then + minetest.chat_send_player(name, "please provide a humidity value") + return + end + v = tonumber(param) + if v then + weather_mod.state.humidity = v + else + minetest.chat_send_player(name, param.." is not a valid humidity level") + end + end +}) \ No newline at end of file diff --git a/lib/environment.lua b/lib/environment.lua index ea162ee..cae21cd 100644 --- a/lib/environment.lua +++ b/lib/environment.lua @@ -13,50 +13,47 @@ function weather_mod.get_humidity(pos) return (base + biome) * random end +function weather_mod.get_climate(pos) + local climate = {pos = pos} + climate.heat = weather_mod.get_heat(pos) + climate.humidity = weather_mod.get_humidity(pos) + climate.windspeed = vector.length(weather_mod.state.wind) + return climate +end + local function is_acceptable_weather_param(value, attr, config) - local min = config.conditions["min_" .. attr] or -10000 + local min = config.conditions["min_" .. attr] or -math.huge local max = config.conditions["max_" .. attr] or math.huge - minetest.log(attr .. ": " .. value .. " <=> " .. min .. "," .. max) return value > min and value <= max end -function weather_mod.get_weather(pos, wind) +function weather_mod.get_effects(climate) + local forced_weather = weather_mod.state.current_weather + if type(forced_weather) ~= nil and forced_weather ~= "auto" then + return { forced_weather } + end local params = {} - params.heat = weather_mod.get_heat(pos) - params.humidity = weather_mod.get_humidity(pos) - params.windspeed = vector.length(wind) - minetest.log(params.heat .. ", " .. params.humidity .. ", " .. params.windspeed) + params.heat = climate.heat + params.humidity = climate.humidity + params.windspeed = vector.length(weather_mod.state.wind) + params.height = climate.pos.y - local weather - local priority = -1 - local attributes = { "heat", "humidity", "windspeed" } - for name, config in pairs(weather_mod.weathers) do - minetest.log(dump2(priority, "p")) - if type(priority) ~= "nil" and config.priority < priority then - minetest.log("skipped " .. name) + local effects = {} + local attributes = { "heat", "humidity", "windspeed", "height" } + for name, effect in pairs(weather_mod.weathers) do + if type(effect.config.conditions) == "nil" then + table.insert(effects, name) + goto continue + end - elseif type(config.conditions) == "nil" then - weather = name - priority = config.priority - minetest.log("selected (nil) " .. name) - - else - local check = true - for _, attr in ipairs(attributes) do - if not is_acceptable_weather_param(params[attr], attr, config) then - check = false - end - end - if check then - weather = name - priority = config.priority - minetest.log("selected " .. name) + for _, attr in ipairs(attributes) do + if not is_acceptable_weather_param(params[attr], attr, effect.config) then + goto continue end end + table.insert(effects, name) + ::continue:: end - if type(weather) == "nil" then - minetest.log("error", "[Believable Weather] No default weather registered") - end - minetest.log(weather) - return weather + minetest.log(dump2(effects, "effects")) + return effects end \ No newline at end of file diff --git a/lib/main.lua b/lib/main.lua index d4a35a1..a14f56d 100644 --- a/lib/main.lua +++ b/lib/main.lua @@ -1,28 +1,33 @@ -local GSCYCLE = 0 -local temperature = 10 -local humidity = 100 -local wind = vector.new(10, 0, -0.25) +local GSCYCLE = 0.05 +local RECALCCYCLE = 1 weather_mod.weathers = {} -function weather_mod.register_weather(name, weather) +function weather_mod.register_effect(name, config, override) -- TODO: check and sanitize - weather_mod.weathers[name] = weather + weather_mod.weathers[name] = { + config = config, + override = override, + sound_handles = {}, + sound_volumes = {} + } end -function weather_mod.set_weather(name) - if type(weather_mod.weathers[name]) == nil then - minetest.log("warning", "[Believable Weather] Weather does not exist") - return +-- from https://stackoverflow.com/a/29133654 +local function merge(a, b) + if type(a) == 'table' and type(b) == 'table' then + for k,v in pairs(b) do if type(v)=='table' and type(a[k] or false)=='table' then merge(a[k],v) else a[k]=v end end end - weather_mod.state.current_weather = name + return a end -local function is_outside(player, wind) - local ppos = player:getpos() - local wind_pos = vector.multiply(wind,-1) - local skylight_pos = vector.add(ppos, vector.new(0, 40, 0)) - local downfall_origin = vector.add(skylight_pos,wind_pos) - return weather_mod.is_outdoors(player, downfall_origin) +local function build_effect_config(weather, climate) + local config = weather.config + local override = weather.override + if type(override) == "nil" then + return config + end + local dynamic_config = override(climate) + return merge(config, dynamic_config) end local function get_texture(particles) @@ -34,19 +39,23 @@ end local function spawn_particles(player, particles, wind) local ppos = player:getpos() - local wind_pos = vector.multiply(wind,-1) - local wind_speed = vector.length(wind) + local wind_pos = vector.multiply(weather_mod.state.wind,-1) + local wind_speed = vector.length(weather_mod.state.wind) local texture = get_texture(particles) local minp = vector.add(vector.add(ppos, particles.min_pos),wind_pos) local maxp = vector.add(vector.add(ppos, particles.max_pos),wind_pos) - local vel = {x=wind.x,y=-particles.falling_speed,z=wind.z} - local acc = {x=0, y=0, z=0} + local vel = vector.new({ + x=weather_mod.state.wind.x, + y=-particles.falling_speed, + z=weather_mod.state.wind.z + }) + local acc = vector.new({x=0, y=0, z=0}) local exp = particles.exptime - local vertical = wind_speed < 3 + local vertical = math.abs(vector.normalize(vel).y) >= 0.6 minetest.add_particlespawner({ amount=particles.amount, @@ -69,62 +78,36 @@ local function spawn_particles(player, particles, wind) }) end -local sound_handles = {} -local function play_sound(player, sound) - local playername = player:get_player_name() - if not sound_handles[playername] then - local handle = minetest.sound_play(sound, { - to_player = playername, - loop = true - }) - if handle then - sound_handles[playername] = handle - end - end -end - -local function stop_sound(player) - local playername = player:get_player_name() - if sound_handles[playername] then - minetest.sound_stop(sound_handles[playername]) - sound_handles[playername] = nil - end -end - -local function handle_weather() - for _, player in ipairs(minetest.get_connected_players()) do - local ppos = player:getpos() - weather_mod.set_weather(weather_mod.get_weather(ppos, wind)) - - if ppos.y < weather_mod.settings.min_height or ppos.y > weather_mod.settings.max_height then - return - end - - local weather = weather_mod.weathers[weather_mod.state.current_weather] - local clouds = weather.clouds - clouds.speed = vector.multiply(wind, 2) - player:set_clouds(clouds) - - weather_mod.set_headwind(player, wind) - --player:set_clouds({ density = 0.6, color = "#a4a0b6e5", speed = wind }) - - local outdoors = is_outside(player, wind) - if type(weather.particles) ~= "nil" and outdoors then - spawn_particles(player, weather.particles, wind) - end - - if type(weather.sound) ~= "nil" and outdoors then - play_sound(player, weather.sound) - else - stop_sound(player) +local function handle_weather_effects(player) + local ppos = player:getpos() + local climate = weather_mod.get_climate(ppos) + local active_effects = weather_mod.get_effects(climate) + local sounds = {} + + for _, effect in ipairs(active_effects) do + local weather = weather_mod.weathers[effect] + local config = build_effect_config(weather, climate) + + local outdoors = weather_mod.is_outdoors(player) + if type(config.particles) ~= "nil" and outdoors then + spawn_particles(player, config.particles, wind) + end + if type(config.sound) ~= nil and outdoors then + sounds[effect] = config.sound end end + weather_mod.handle_sounds(player, sounds) end local timer = 0 minetest.register_globalstep(function(dtime) timer = timer + dtime if timer < GSCYCLE then return end + for _, player in ipairs(minetest.get_connected_players()) do + handle_weather_effects(player) + if timer >= RECALCCYCLE then + weather_mod.set_clouds(player) + end + end timer = 0 - handle_weather() end) \ No newline at end of file diff --git a/lib/player.lua b/lib/player.lua index 63038b2..757e748 100644 --- a/lib/player.lua +++ b/lib/player.lua @@ -27,46 +27,58 @@ function weather_mod.remove_physics(player, effect) end end --- function taken from weather mod --- see https://github.com/theFox6/minetest_mod_weather/blob/master/weather/api.lua#L110 -local function raycast(player, origin) - local hitpos = vector.add(player:get_pos(),vector.new(0,1,0)) - local ray = minetest.raycast(origin,hitpos) - local o = ray:next() - if not o then return false end - if o.type~="object" then return false end -- hit node or something - if not o.ref:is_player() then return false end -- hit different object - if o.ref:get_player_name() ~= player:get_player_name() then - return false --hit other player - end - o = ray:next() - if o then - minetest.log("warning","[Believable Weather] raycast hit more after hitting the player\n".. - dump2(o,"o")) - end - return true -end - -local function check_light(player) +function weather_mod.is_outdoors(player) return minetest.get_node_light(player:getpos(), 0.5) == 15 end -function weather_mod.is_outdoors(player, origin) - if weather_mod.settings.raycasting then - return raycast(player, origin) - else - return check_light(player) +function weather_mod.set_clouds(player) + if not weather_mod.settings.skybox then + return + end + local ppos = player:get_pos() + local humidity = weather_mod.get_humidity(ppos) / 200 + local clouds = {} + clouds.speed = vector.multiply(weather_mod.state.wind, 2) + clouds.color = "#fff0f0c5" + clouds.density = math.max(math.min(humidity, 0.1), 0.9) + player:set_clouds(clouds) +end + +function weather_mod.play_sound(player, effect) + local playername = player:get_player_name() + if not effect.sound_handles[playername] then + local handle = minetest.sound_play(effect.config.sound, { + to_player = playername, + loop = true + }) + if handle then + effect.sound_handles[playername] = handle + effect.sound_volumes[playername] = effect.config.sound.gain or 1 + end end end -function weather_mod.set_headwind(player, wind) - local movement = vector.normalize(player:get_player_velocity()) - local product = vector.dot(movement, wind) - -- logistic function, scales between 0 and 2 - -- see https://en.wikipedia.org/wiki/Logistic_function - local L = 2 -- maximum value - local k = 0.1 -- growth rate - local z = 1 -- midpoint - local factor = L / (1 + math.exp(-k * (product - z))) - weather_mod.add_physics(player, "speed", factor) +function weather_mod.stop_sound(player, effect) + local playername = player:get_player_name() + if effect.sound_handles[playername] then + minetest.sound_stop(effect.sound_handles[playername]) + effect.sound_handles[playername] = nil + effect.sound_volumes[playername] = nil + end +end + +function weather_mod.handle_sounds(player, sounds) + local playername = player:get_player_name() + for name, effect in pairs(weather_mod.weathers) do + if type(effect.sound_handles[playername]) == "nil" and type(sounds[name]) ~= "nil" then + weather_mod.play_sound(player, effect) + elseif type(effect.sound_handles[playername]) ~= "nil" and type(sounds[name]) == "nil" then + weather_mod.stop_sound(player, effect) + elseif type(effect.sound_handles[playername]) ~= "nil" and type(sounds[name]) ~= "nil" then + local volume = sounds[name].gain or 1 + if effect.sound_volumes[playername] ~= volume then + minetest.sound_fade(effect.sound_handles[playername], 1, volume) + end + end + end end \ No newline at end of file diff --git a/lib/wind.lua b/lib/wind.lua new file mode 100644 index 0000000..14d6bf0 --- /dev/null +++ b/lib/wind.lua @@ -0,0 +1,8 @@ +function weather_mod.set_headwind(player, wind) + local movement = vector.normalize(player:get_player_velocity()) + local product = vector.dot(movement, wind) + -- logistic function, scales between 0.5 and 1.5 + -- see https://en.wikipedia.org/wiki/Logistic_function + local factor = 1 / (1 + math.exp(-0.1 * (product - 0.5))) + 0.5 + weather_mod.add_physics(player, "speed", factor) +end \ No newline at end of file diff --git a/sounds/weather_rain1.ogg b/sounds/weather_rain.0.ogg similarity index 100% rename from sounds/weather_rain1.ogg rename to sounds/weather_rain.0.ogg diff --git a/sounds/weather_rain2.ogg b/sounds/weather_rain.ogg similarity index 100% rename from sounds/weather_rain2.ogg rename to sounds/weather_rain.ogg diff --git a/sounds/weather_thunder.ogg b/sounds/weather_thunder.ogg deleted file mode 100644 index d7f5326..0000000 Binary files a/sounds/weather_thunder.ogg and /dev/null differ diff --git a/textures/weather_raindrop.png b/textures/weather_raindrop.png new file mode 100644 index 0000000..1e4d3ac Binary files /dev/null and b/textures/weather_raindrop.png differ diff --git a/weathers/clear.lua b/weathers/clear.lua deleted file mode 100644 index 3766597..0000000 --- a/weathers/clear.lua +++ /dev/null @@ -1,12 +0,0 @@ -local name = weather_mod.modname .. ":clear" - -local weather = { - priority = 0 -} - -weather.clouds = { - density = 0.3, - color = "#fff0f0c5" -} - -weather_mod.register_weather(name, weather) diff --git a/weathers/rain.lua b/weathers/rain.lua index 9341197..0686c34 100644 --- a/weathers/rain.lua +++ b/weathers/rain.lua @@ -1,30 +1,48 @@ local name = weather_mod.modname .. ":rain" -local weather = { - priority = 10, +local config = {} + +config.environment = { spawn_puddles = true, - wetten_farmland = true, - sound = "weather_rain1" + wetten_farmland = true } -weather.particles = { +config.sound = { + name = "weather_rain", + gain = 1 +} + +config.particles = { min_pos = {x=-9, y=7, z=-9}, max_pos = {x= 9, y=7, z= 9}, falling_speed=10, - amount=20, + amount=40, exptime=0.8, - size=25, - texture="weather_rain.png" + size=1, + texture = "weather_raindrop.png" } -weather.clouds = { - density = 0.5, - color = "#a4a0b6e5" -} - -weather.conditions = { +config.conditions = { + min_height = weather_mod.settings.min_height, + max_height = weather_mod.settings.max_height, min_heat = 30, - min_humidity = 40 + min_humidity = 40, + max_humidity = 60 } -weather_mod.register_weather(name, weather) +local function override(params) + local avg_humidity = 40 + local intensity = params.humidity / avg_humidity + local dynamic_config = { + sound = { + gain = math.min(intensity, 1.2) + }, + particles = { + amount = 20 * math.min(intensity, 1.5), + falling_speed = 10 / math.min(intensity, 1.3) + } + } + return dynamic_config +end + +weather_mod.register_effect(name, config, override) diff --git a/weathers/rain_heavy.lua b/weathers/rain_heavy.lua new file mode 100644 index 0000000..018851b --- /dev/null +++ b/weathers/rain_heavy.lua @@ -0,0 +1,33 @@ +local name = weather_mod.modname .. ":rain_heavy" + +local config = {} + +config.environment = { + spawn_puddles = true, + wetten_farmland = true, + lightning = true +} + +config.sound = { + name = "weather_rain", + gain = 1 +} + +config.particles = { + min_pos = {x=-9, y=7, z=-9}, + max_pos = {x= 9, y=7, z= 9}, + falling_speed=10, + amount=20, + exptime=0.8, + size=25, + texture="weather_rain.png" +} + +config.conditions = { + min_height = weather_mod.settings.min_height, + max_height = weather_mod.settings.max_height, + min_heat = 30, + min_humidity = 60 +} + +weather_mod.register_effect(name, config) diff --git a/weathers/rainstorm.lua b/weathers/rainstorm.lua deleted file mode 100644 index 207de3e..0000000 --- a/weathers/rainstorm.lua +++ /dev/null @@ -1,33 +0,0 @@ -local name = weather_mod.modname .. ":rainstorm" - -local weather = { - priority = 30, - damage = true, - spawn_puddles = true, - wetten_farmland = true, - lightning = true, - sound = "weather_rain2" -} - -weather.particles = { - min_pos = {x=-9, y=7, z=-9}, - max_pos = {x= 9, y=7, z= 9}, - falling_speed=10, - amount=25, - exptime=0.8, - size=25, - texture="weather_rain.png" -} - -weather.clouds = { - density = 0.7, - color = "#a4a0b6f5" -} - -weather.conditions = { - min_heat = 30, - min_humidity = 60, - min_windspeed = 5 -} - -weather_mod.register_weather(name, weather) diff --git a/weathers/sandstorm.lua b/weathers/sandstorm.lua index 6d55153..e5cb989 100644 --- a/weathers/sandstorm.lua +++ b/weathers/sandstorm.lua @@ -1,12 +1,12 @@ local name = weather_mod.modname .. ":sandstorm" -local weather = { - priority = 50, - damage = true, - sound = "weather_wind" +local config = {} + +config.environment = { + damage = true } -weather.particles = { +config.particles = { min_pos = {x=-9, y=-5, z=-9}, max_pos = {x= 9, y= 5, z= 9}, falling_speed=1, @@ -16,15 +16,12 @@ weather.particles = { texture="weather_sand.png" } -weather.clouds = { - density = 0.3, - color = "#a4a0b685" -} - -weather.conditions = { +config.conditions = { + min_height = weather_mod.settings.min_height, + max_height = weather_mod.settings.max_height, min_heat = 50, max_humidity = 25, min_windspeed = 6 } -weather_mod.register_weather(name, weather) +weather_mod.register_effect(name, config) diff --git a/weathers/snow.lua b/weathers/snow.lua index ab7a1a8..80b7ed6 100644 --- a/weathers/snow.lua +++ b/weathers/snow.lua @@ -1,32 +1,46 @@ local name = weather_mod.modname .. ":snow" -local weather = { - priority = 20, +local config = {} + +config.environment = { spawn_snow = true } -weather.particles = { +config.particles = { min_pos = {x=-20, y= 3, z=-20}, max_pos = {x= 20, y=12, z= 20}, falling_speed=1, - amount=50, - exptime=15, + amount=40, + exptime=8, size=1, textures = {} } for i = 1,12,1 do - weather.particles.textures[i] = "weather_snowflake" .. i .. ".png" + config.particles.textures[i] = "weather_snowflake" .. i .. ".png" end -weather.clouds = { - density = 0.5, - color = "#a4a0b6e5" +config.conditions = { + min_height = weather_mod.settings.min_height, + max_height = weather_mod.settings.max_height, + max_heat = 40, + min_humidity = 40, + max_humidity = 55 } -weather.conditions = { - max_heat = 30, - min_humidity = 40 -} +local function override(params) + local avg_humidity = 40 + local intensity = params.humidity / avg_humidity + local dynamic_config = { + sound = { + gain = math.min(intensity, 1.2) + }, + particles = { + amount = 50 * math.min(intensity, 1.5), + falling_speed = 1 / math.min(intensity, 1.3) + } + } + return dynamic_config +end -weather_mod.register_weather(name, weather) +weather_mod.register_effect(name, config, override) diff --git a/weathers/snow_heavy.lua b/weathers/snow_heavy.lua new file mode 100644 index 0000000..63948c2 --- /dev/null +++ b/weathers/snow_heavy.lua @@ -0,0 +1,41 @@ +local name = weather_mod.modname .. ":snow_heavy" + +local config = {} + +config.environment = { + spawn_snow = true +} + +config.particles = { + min_pos = {x=-12, y= 5, z=-12}, + max_pos = {x= 12, y=9, z= 12}, + falling_speed=1, + amount=1, + exptime=8, + size=12, + texture="weather_snow.png" +} + +config.conditions = { + min_height = weather_mod.settings.min_height, + max_height = weather_mod.settings.max_height, + max_heat = 40, + min_humidity = 55 +} + +local function override(params) + local avg_humidity = 55 + local intensity = params.humidity / avg_humidity + local dynamic_config = { + sound = { + gain = math.min(intensity, 1.2) + }, + particles = { + amount = 50 * math.min(intensity, 1.5), + falling_speed = 1 / math.min(intensity, 1.3) + } + } + return dynamic_config +end + +weather_mod.register_effect(name, config, override) diff --git a/weathers/snowstorm.lua b/weathers/snowstorm.lua deleted file mode 100644 index 4357ef7..0000000 --- a/weathers/snowstorm.lua +++ /dev/null @@ -1,36 +0,0 @@ -local name = weather_mod.modname .. ":snowstorm" - -local weather = { - priority = 40, - damage = true, - lightning = true, - spawn_snow = true, - sound = "weather_wind" -} - -weather.particles = { - min_pos = {x=-9, y=-5, z=-9}, - max_pos = {x= 9, y= 5, z= 9}, - falling_speed=1.5, - amount=70, - exptime=6, - size=1, - textures = {} -} - -for i = 1,12,1 do - weather.particles.textures[i] = "weather_snowflake" .. i .. ".png" -end - -weather.clouds = { - density = 0.7, - color = "#a4a0b6f5" -} - -weather.conditions = { - max_heat = 30, - min_humidity = 60, - min_windspeed = 5 -} - -weather_mod.register_weather(name, weather) diff --git a/weathers/storm.lua b/weathers/storm.lua new file mode 100644 index 0000000..7ac5caa --- /dev/null +++ b/weathers/storm.lua @@ -0,0 +1,27 @@ +local name = weather_mod.modname .. ":storm" + +local config = {} + +config.sound = { + name = "weather_wind", + gain = 1 +} + +config.conditions = { + min_height = weather_mod.settings.min_height, + max_height = weather_mod.settings.max_height, + min_windspeed = 5 +} + +local function override(params) + local avg_windspeed = 6 + local intensity = params.windspeed / avg_windspeed + local dynamic_config = { + sound = { + gain = math.min(intensity, 1.2) + } + } + return dynamic_config +end + +weather_mod.register_effect(name, config, override)