Compare commits

..

No commits in common. "master" and "v0.1.0" have entirely different histories.

85 changed files with 351 additions and 968 deletions

1
.gitignore vendored
View file

@ -1 +0,0 @@
*.code-workspace

102
README.md
View file

@ -1,105 +1,31 @@
# Regional Weather # Regional Weather
A weather pack for [__Climate API__](https://github.com/t-affeldt/climate_api) by Till Affeldt (TestificateMods) A weather pack for __Climate API__ by Till Affeldt (TestificateMods)
![](https://raw.githubusercontent.com/t-affeldt/regional_weather/master/screenshot.webp)
Not every biome is the same and neither should their weather be. Not every biome is the same and neither should their weather be.
Regional Weather controls its effects with the local climate in mind. Regional Weather controls it's effects with the local climate in mind.
Experience the humid air of the rain forest and harsh desert sandstorms. Experience the humid air of the rain forest and harsh desert sandstorms.
## Troubleshooting ## Assets
Regional Weather depends on [Climate API](https://github.com/t-affeldt/climate_api) in order to function. Generally speaking, most mods should be compatible to it.
If you notice __odd movement speeds__ or jump heights of players, you should check for mods that also modify player physics. Use a compatibility mod like [player_monoids](https://github.com/minetest-mods/player_monoids) or [playerphysics](https://forum.minetest.net/viewtopic.php?t=22172) to get rid of this problem. This requires the conflicting mod to also support the chosen compatibility layer.
Mods that __modify the sky__ (including skybox, moon, sun, stars and clouds) are sadly not fully compatible because they conflict with Climate API's sky system. You should deactivate the sky features in either mod. You can do this in Climate API's settings using the ``Override the skybox`` option. If you're a mod maker then you can also optionally depend on climate_api and use ``climate_api.skybox.add_layer(playername, layer_name, options)`` to register your skybox change in a compatible way. Note that you need __at least Minetest v5.2.0__ for skybox changes to have any effect.
Conflicting skybox changes include the ``weather`` mod included in vanilla __Minetest Game__. You will want to disable that mod in order to use the more advanced cloud system introduced by Climate API. Head to ``Settings → All Settings → Games → Minetest Game`` and set ``Enable weather`` to ``Disabled``. This setting will only exist if you are using Minetest Game v5.2.0 or higher.
If you experience __performance issues__, the *Performance* section of Climate API's configuration section is a great place to start looking for a solution.
The following mods are recommended to be installed alongside Regional Weather:
- [Climate API](https://github.com/t-affeldt/climate_api) (required): The necessary weather engine that this mod is built upon
- [Moon Phases](https://github.com/t-affeldt/minetest_moon_phase): Complements weather effects with dynamic sky changes and a full moon cycle
- [Sailing Kit](https://github.com/t-affeldt/sailing_kit) (Fork): Uses Climate API's new wind system to sail across the sea.
- [Lightning](https://github.com/minetest-mods/lightning): Adds to heavy rain by enabling additional lightning effects
- [Farming](https://github.com/minetest/minetest_game/tree/master/mods/farming) (as part of MTG) or [Farming Redo](https://forum.minetest.net/viewtopic.php?t=9019): Add farmland and crops to grow food. Farmland wil turn wet during rain effects.
- [Fire](https://github.com/minetest/minetest_game/tree/master/mods/fire) (as part of MTG): Adds fires that can be caused by lightning strikes and other effects and will be extinguished during rain effects.
- [Pedology](https://forum.minetest.net/viewtopic.php?f=11&t=9429) Adds a lot of nodes with dynamic wetness and dryness states.
- [Ambience](https://notabug.org/TenPlus1/ambience): Plays some nice ambient sound effects based on where you are.
For easier installation, you can get a lot of these mods as part of my [Climate Modpack](https://github.com/t-affeldt/climate).
## Configuration Options
You can find all mod configuration options in your Minetest launcher.
Go to ``Settings → All Settings → Mods → regional_weather`` to change them.
Also check out the options inside the ``climate_api`` section for additional configuration options, including performance tweaks and feature switches.
### Features
- ``Place snow layers`` (default true):
If set to true, snow layers will stack up during snowy weather.
- ``Freeze river water`` (default true):
If set to true, river water sources will freeze at low temperatures and melt when it gets warmer again.
This process does not affect regular ice blocks because it adds its own temporary ones.
- ``Place rain puddles`` (default true):
If set to true, water puddles will form during rain or when snow layers have melted.
- ``Hydrate farmland`` (default true):
If set to true, rain will cause dry farmland to turn wet.
Requires *farming* or *farming_redo* mod.
- ``Extinguish fire`` (bool true):
If set to true, fires will be extinguished during rain showers.
Requires *fire* mod.
- ``Wetten pedology nodes`` (default true):
If set to true, rain will wetten or dry nodes from pedology mod.
Requires *pedology* mod.
### World Configuration
- ``Maximum height of weather effects`` (default 120):
No visual effects will be applied above this height.
This value defaults to normal cloud height (120 nodes above sea level).
- ``Minimum height of weather effects`` (default -50):
No visual effects will be applied below this height.
This will prevent unwanted visuals within large underground caves.
- ``Cloud height`` (default 120)
Average height of cloud bases
- ``Cloud height variation`` (default 40)
Maxmial variation of cloud height from base value
## License information
### Source Code
Unless otherwise stated, this source code is written entirely by myself.
You are free to use it under a GNU Lesser General Public License version 3.
You can find respective rights and conditions in the attached [LICENSE](https://github.com/t-affeldt/regional_weather/blob/master/LICENSE.md) file.
The entire source code is available on [Github](https://github.com/t-affeldt/regional_weather).
### Particles ### Particles
- Hail textures: *CC BY-SA (3.0)* made by me - Rain sounds: *CC0* by Q.K., taken from mymonths at https://github.com/minetest-mods/mymonths/tree/master/sounds
- 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 composite texture: *CC BY-SA (3.0)* by Cap, created from aforementioned snow flakes by paramat (please credit original artist as well) - Snow texture: *CC BY-SA (3.0)* composited from individual snow flakes by paramat.
- Rain textures: *CC BY-SA (3.0)* by Cap (an original design for this mod) - Rain texture: *CC BY-SA (3.0)* from TeddyDesTodes, taken from his weather branch at https://github.com/TeddyDesTodes/minetest/tree/weather
### Block Textures ### Block Textures
- Puddle textures: *CC BY-SA (3.0)* by Cap - Puddle texture: *DWYWPL* by Don, Nathan from mymonths at https://github.com/minetest-mods/mymonths/blob/master/textures/weather_puddle.png
- Snow layers and ice block using textures from *default* (not included) - Snow cover texture: *WTFPL*, taken from mymonths at https://github.com/minetest-mods/mymonths/blob/master/textures/weather_snow_cover.png
### Sounds ### Sounds
- Heavy Rain sounds: *CC0* by Q.K., taken from mymonths at https://github.com/minetest-mods/mymonths/tree/master/sounds
- Light Rain sounds: *CC BY 3.0* by Arctura from https://freesound.org/people/Arctura/sounds/34065/
- Wind sound: *CC BY (3.0)* by InspectorJ from https://freesound.org/people/InspectorJ/sounds/376415/ - Wind sound: *CC BY (3.0)* by InspectorJ from https://freesound.org/people/InspectorJ/sounds/376415/
- Hail sound: *CC0* by ikayuka from https://freesound.org/people/ikayuka/sounds/240742/ - Hail sound: *CC0* by ikayuka from https://freesound.org/people/ikayuka/sounds/240742/
### HUD Overlays ### HUD Overlays
- Frost HUD: *CC BY-SA (3.0)* by Cap - Original texture for frost hud: *CC0* by Simon Matzinger from https://freestocktextures.com/texture/winter-snow-frozen,995.html, edits by me under *CC0* as well
- Original texture for sand storm HUD: *CC0* from https://freestocktextures.com/texture/dirty-baking-paper,1202.html, edits by me under *CC0* as well - Original texture for sandstorm hud: *CC0* from https://freestocktextures.com/texture/dirty-baking-paper,1202.html, edits by me under *CC0* as well
### Assets in screenshots ### Assets in screenshots
- Screenshots and editing: *CC BY-SA (3.0)* by me - All screenshots and editing by me: *CC BY-SA (4.0)*
- Logos and artwork: *CC BY-SA (3.0)* by Cap
- Lato Font (for the Logo): *OFL* by Łukasz Dziedzic from http://www.latofonts.com/lato-free-fonts/ - Lato Font (for the Logo): *OFL* by Łukasz Dziedzic from http://www.latofonts.com/lato-free-fonts/
- Source Sans Pro (for the subtitles): *OFL*, see https://fonts.google.com/specimen/Source+Sans+Pro - Liberation Fonts (for the text): *OFL*, see https://github.com/liberationfonts/liberation-fonts
- Used texture pack: Polygonia (128px edition) *CC BY-SA (4.0)* by Lokrates. See https://forum.minetest.net/viewtopic.php?f=4&t=19043 - Used texture pack: Polygonia (128px edition) *CC BY-SA (4.0)* by Lokrates. See https://forum.minetest.net/viewtopic.php?f=4&t=19043
### Full License Conditions
- [GNU Lesser General Public License version 4](https://github.com/t-affeldt/regional_weather/blob/master/LICENSE.md)
- [Creative Commons Licenses](https://creativecommons.org/licenses/)
- [SIL Open Font License](https://opensource.org/licenses/OFL-1.1)

View file

@ -4,19 +4,15 @@ if not minetest.get_modpath("fire") then return end
climate_api.register_abm({ climate_api.register_abm({
label = "extinguish fire at high humidity", label = "extinguish fire at high humidity",
nodenames = { "fire:basic_flame" }, nodenames = { "fire:basic_flame" },
neighbors = { "air" },
interval = 10, interval = 10,
chance = 2, chance = 2,
catch_up = false,
conditions = { conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
min_humidity = 50, min_humidity = 55,
min_biome_humidity = 26,
max_heat = 85, max_heat = 85,
daylight = 15, min_light = 15
indoors = false
}, },
action = function (pos, node, env) action = function (pos, node, env)

View file

@ -1,73 +0,0 @@
if not regional_weather.settings.ice
or not minetest.get_modpath("default")
or default.node_sound_glass_defaults == nil
then return end
local BLOCK_NAME = "regional_weather:ice"
local S = regional_weather.i18n
minetest.register_node(BLOCK_NAME, {
description = S("Thin Ice"),
tiles = {"(default_ice.png^[colorize:#ffffff:50)^[opacity:200"},
paramtype = "light",
groups = {
cracky = 3,
cools_lava = 1,
slippery = 3,
dig_immediate = 2,
melts = 1
},
freezemelt = "default:river_water_source",
sounds = default.node_sound_glass_defaults(),
use_texture_alpha = "blend",
drop = "",
on_destruct = function(pos)
-- asynchronous to avoid destruction loop
minetest.after(0, function(pos)
if minetest.get_node(pos).name ~= "air" then return end
minetest.set_node(pos, { name = "default:river_water_source" })
end, pos)
end
})
climate_api.register_abm({
label = "freeze river water",
nodenames = { "default:river_water_source" },
neighbors = { "air" },
interval = 25,
chance = 3,
catch_up = false,
conditions = {
min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height,
max_heat = 35,
daylight = 15,
indoors = false
},
action = function (pos, node, env)
minetest.set_node(pos, { name = BLOCK_NAME })
end
})
climate_api.register_abm({
label = "unfreeze river water",
nodenames = { BLOCK_NAME },
interval = 25,
chance = 4,
catch_up = true,
conditions = {
min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height,
min_heat = 35,
daylight = 15,
indoors = false
},
action = function (pos, node, env)
minetest.set_node(pos, { name = "default:river_water_source" })
end
})

View file

@ -1,29 +0,0 @@
if not regional_weather.settings.pedology
or not minetest.get_modpath("pedology")
then return end
climate_api.register_abm({
label = "wetten or dry pedology nodes",
nodenames = { "group:sucky" },
neighbors = { "air" },
interval = 25,
chance = 30,
catch_up = false,
conditions = {
min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height,
min_heat = 25,
daylight = 15,
indoors = false,
},
action = function (pos, node, env)
local wetness = minetest.get_item_group(node.name, "wet") or 0
if wetness < 2 and env.humidity > 50 then
pedology.wetten(pos)
elseif wetness > 0 and wetness < 3 and env.humidity < 40 then
pedology.dry(pos)
end
end
})

View file

@ -1,130 +1,61 @@
local BLOCK_PREFIX = "regional_weather:puddle_" -- code of this file is partially taken from and otherwise inspired by
local VARIANT_COUNT = 39 -- mymonths on https://github.com/minetest-mods/mymonths (licensed under DWYWPL)
local CHECK_DISTANCE = 4 -- contributers available at https://github.com/minetest-mods/mymonths/graphs/contributors
local MAX_AMOUNT = 3 -- all changes of mine remain under LGPL v3
local GROUND_COVERS = { local BLOCK_NAME = "regional_weather:puddle"
"group:soil", local MIN_DISTANCE = 12
"group:stone",
"group:sand",
"group:wood",
"default:permafrost",
"default:permafrost_with_moss",
"default:permafrost_with_stones"
}
local S = regional_weather.i18n
-- clean up puddles if disabled
if not regional_weather.settings.puddles then if not regional_weather.settings.puddles then
-- set all puddle nodes to air minetest.register_alias(BLOCK_NAME, "air")
minetest.register_alias("regional_weather:puddle", "air")
for i = 1, VARIANT_COUNT do
for flip = 0, 1 do
local name = BLOCK_PREFIX .. i
if flip == 1 then
name = name .. "_flipped"
end
minetest.register_alias(name, "air")
end
end
-- return air instead of a puddle
function regional_weather.get_random_puddle()
return { name = "air" }
end
-- end puddle execution
return return
end end
--Puddle node
local node_box = { local node_box = {
type = "fixed", type = "fixed",
fixed = { -0.5, -0.5, -0.5, 0.5, -0.49, 0.5 } fixed = {
{-0.1875, -0.5, -0.375, 0.125, -0.4875, 0.3125},
{-0.25, -0.5, -0.3125, 0.3125, -0.4925, 0.25},
{-0.3125, -0.5, -0.1875, 0.375, -0.4975, 0.1875},
}
} }
local apply_water_group minetest.register_node(BLOCK_NAME, {
if regional_weather.settings.puddles_water then tiles = { "weather_puddle.png" },
apply_water_group = 1 drawtype = "nodebox",
end pointable = false,
buildable_to = true,
for i = 1, VARIANT_COUNT do floodable = true,
for flip = 0, 1 do walkable = false,
local name = BLOCK_PREFIX .. i sunlight_propagates = true,
local index = i paramtype = "light",
if i < 10 then index = "0" .. i end alpha = 50,
local texture = "weather_puddle_" .. index .. ".png^[opacity:24" node_box = node_box,
if flip == 1 then groups = {
name = name .. "_flipped" not_in_creative_inventory = 1,
texture = texture .. "^[transformFX" crumbly = 3,
end attached_node = 1,
minetest.register_node(name, { slippery = 1,
description = S("Puddle"), replaceable_by_snow = 1
tiles = { texture }, },
drawtype = "nodebox", drop = "",
pointable = false, })
buildable_to = true,
floodable = true,
walkable = false,
sunlight_propagates = true,
paramtype = "light",
paramtype2 = "facedir",
use_texture_alpha = "blend",
node_box = node_box,
groups = {
not_in_creative_inventory = 1,
crumbly = 3,
attached_node = 1,
slippery = 1,
flora = 1,
water = apply_water_group,
weather_puddle = 1
},
drop = ""
})
end
end
minetest.register_alias("regional_weather:puddle", BLOCK_PREFIX .. "14")
function regional_weather.get_random_puddle()
local index = math.random(1, VARIANT_COUNT)
local rotation = math.random(0, 3) * 90
local flip = math.random(0, 1)
local name = BLOCK_PREFIX .. index
if flip == 1 then
name = name .. "_flipped"
end
local param2 = minetest.dir_to_facedir(minetest.yaw_to_dir(rotation))
return { name = name, param2 = param2 }
end
-- Makes Puddles when raining -- Makes Puddles when raining
climate_api.register_abm({ climate_api.register_abm({
label = "create rain puddles", label = "create rain puddles",
nodenames = GROUND_COVERS, nodenames = { "group:soil", "group:stone" },
neighbors = { "air" }, neighbors = { "air" },
interval = 8, interval = 10,
chance = 150, chance = 50,
catch_up = false,
conditions = { conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
min_heat = 35, min_humidity = 55,
min_humidity = 50, min_heat = 30,
min_biome_humidity = 26, min_light = 15
daylight = 15,
indoors = false,
not_biome = {
"cold_desert",
"cold_desert_ocean",
"desert",
"desert_ocean",
"sandstone_desert",
"sandstone_desert_ocean",
"tundra"
}
}, },
pos_override = function(pos) pos_override = function(pos)
@ -132,28 +63,24 @@ climate_api.register_abm({
end, end,
action = function (pos, node, env) action = function (pos, node, env)
-- only override air nodes
if minetest.get_node(pos).name ~= "air" then return end if minetest.get_node(pos).name ~= "air" then return end
-- do not place puddle if area is not fully loaded if minetest.find_node_near(pos, MIN_DISTANCE, BLOCK_NAME) then return end
if minetest.find_node_near(pos, CHECK_DISTANCE, "ignore") then return end minetest.set_node(pos, {name = BLOCK_NAME})
-- do not place puddle if already enpugh puddles
local pos1 = vector.add(pos, { x = -CHECK_DISTANCE, y = -1, z = -CHECK_DISTANCE })
local pos2 = vector.add(pos, { x = CHECK_DISTANCE, y = 1, z = CHECK_DISTANCE })
local preplaced = minetest.find_nodes_in_area(pos1, pos2, "group:weather_puddle")
if preplaced ~= nil and #preplaced >= MAX_AMOUNT then return end
minetest.set_node(pos, regional_weather.get_random_puddle())
end end
}) })
-- Makes puddles dry up when not raining -- Makes puddles dry up when not raining
climate_api.register_abm({ climate_api.register_abm({
label = "remove rain puddles", label = "remove rain puddles",
nodenames = { "group:weather_puddle" }, nodenames = { BLOCK_NAME },
interval = 25, interval = 5,
chance = 30, chance = 5,
catch_up = true,
action = function (pos, node, env) action = function (pos, node, env)
minetest.remove_node(pos) if env.humidity < 55 then
minetest.remove_node(pos)
elseif env.heat < 30 and regional_weather.settings.snow_cover then
minetest.set_node(pos, {name = "regional_weather:snow_cover_1"})
end
end end
}) })

View file

@ -1,25 +1,17 @@
-- code of this file is partially taken from and otherwise inspired by
-- mymonths on https://github.com/minetest-mods/mymonths (licensed under DWYWPL)
-- contributers available at https://github.com/minetest-mods/mymonths/graphs/contributors
-- all changes of mine remain under LGPL v3
local BLOCK_PREFIX = "regional_weather:snow_cover_" local BLOCK_PREFIX = "regional_weather:snow_cover_"
local CHECK_DISTANCE = 5
local MAX_AMOUNT = 20
local S = regional_weather.i18n if not regional_weather.settings.puddles then
if not minetest.get_modpath("default")
or default.node_sound_snow_defaults == nil
or not regional_weather.settings.snow then
for i = 1,5 do for i = 1,5 do
minetest.register_alias(BLOCK_PREFIX .. i, "air") minetest.register_alias(BLOCK_PREFIX .. i, "air")
end end
return return
end end
local destruction_handler = function(pos)
pos.y = pos.y - 1
if minetest.get_node(pos).name == "default:dirt_with_snow" then
minetest.set_node(pos, {name = "default:dirt_with_grass"})
end
end
for i = 1,5 do for i = 1,5 do
local node_box = { local node_box = {
type = "fixed", type = "fixed",
@ -27,7 +19,6 @@ for i = 1,5 do
} }
minetest.register_node(BLOCK_PREFIX .. i, { minetest.register_node(BLOCK_PREFIX .. i, {
description = S("Snow Cover"),
tiles = { "default_snow.png" }, tiles = { "default_snow.png" },
drawtype = "nodebox", drawtype = "nodebox",
buildable_to = i < 3, buildable_to = i < 3,
@ -40,7 +31,7 @@ for i = 1,5 do
crumbly = 3, crumbly = 3,
falling_node = 1, falling_node = 1,
snowy = 1, snowy = 1,
weather_snow_cover = i regional_weather_snow_cover = i
}, },
sounds = default.node_sound_snow_defaults(), sounds = default.node_sound_snow_defaults(),
drop = "default:snow " .. math.ceil(i / 2), drop = "default:snow " .. math.ceil(i / 2),
@ -49,9 +40,7 @@ for i = 1,5 do
if minetest.get_node(pos).name == "default:dirt_with_grass" then if minetest.get_node(pos).name == "default:dirt_with_grass" then
minetest.set_node(pos, {name = "default:dirt_with_snow"}) minetest.set_node(pos, {name = "default:dirt_with_snow"})
end end
end, end
on_destruct = destruction_handler,
on_flood = destruction_handler
}) })
end end
@ -65,26 +54,15 @@ climate_api.register_abm({
"group:coverable_by_snow" "group:coverable_by_snow"
}, },
neighbors = { "air" }, neighbors = { "air" },
interval = 25, interval = 15,
chance = 80, chance = 20,
catch_up = false,
conditions = { conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
max_heat = 35, min_humidity = 55,
min_humidity = 50, max_heat = 30,
min_biome_humidity = 26, min_light = 15
not_biome = {
"cold_desert",
"cold_desert_ocean",
"desert",
"desert_ocean",
"sandstone_desert",
"sandstone_desert_ocean"
},
daylight = 15,
indoors = false
}, },
pos_override = function(pos) pos_override = function(pos)
@ -92,88 +70,66 @@ climate_api.register_abm({
end, end,
action = function (pos, node, env) action = function (pos, node, env)
-- only override air nodes if minetest.get_node(pos).name ~= "air" then return end
if node.name ~= "air" then return end local base = minetest.get_node(vector.add(pos, {x=0, y=-1, z=0})).name
-- do not place snow if area is not fully loaded local is_soil = minetest.get_item_group(base, "soil") or 0
if minetest.find_node_near(pos, CHECK_DISTANCE, "ignore") then return end local is_stone = minetest.get_item_group(base, "stone") or 0
-- do not place snow if already enpugh snow if not (is_soil == 0 and is_stone == 0) then
local pos1 = vector.add(pos, { x = -CHECK_DISTANCE, y = -1, z = -CHECK_DISTANCE }) minetest.set_node(pos, { name = BLOCK_PREFIX .. "1" })
local pos2 = vector.add(pos, { x = CHECK_DISTANCE, y = 1, z = CHECK_DISTANCE }) end
local preplaced = minetest.find_nodes_in_area(pos1, pos2, "group:weather_snow_cover")
if preplaced ~= nil and #preplaced >= MAX_AMOUNT then return end
minetest.set_node(pos, { name = BLOCK_PREFIX .. "1" })
end end
}) })
if regional_weather.settings.snow_griefing then climate_api.register_abm({
climate_api.register_abm({ label = "replace flora with snow covers and stack covers higher",
label = "replace flora with snow covers and stack covers higher", nodenames = {
nodenames = { "group:flora",
"group:flora", "group:grass",
"group:grass", "group:plant",
"group:plant", "group:replaceable_by_snow",
"group:weather_snow_cover" "group:regional_weather_snow_cover"
}, },
neighbors = { "air" }, interval = 15,
interval = 25, chance = 15,
chance = 160,
catch_up = false,
conditions = { conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
min_humidity = 55, min_humidity = 55,
max_heat = 30, max_heat = 30,
not_biome = { min_light = 15
"cold_desert", },
"cold_desert_ocean",
"desert",
"desert_ocean",
"sandstone_desert",
"sandstone_desert_ocean"
},
daylight = 15,
indoors = false
},
action = function (pos, node, env) action = function (pos, node, env)
local value = minetest.get_item_group(node.name, "weather_snow_cover") or 0 local node_name = minetest.get_node(pos).name
if value == 0 then local value = minetest.get_item_group(node_name, "regional_weather_snow_cover")
-- do not override plants unless marked as buildable_to if value == nil then value = 0 end
local def = minetest.registered_nodes[node.name] if value < 5 then
if def == nil or not def.buildable_to then return end minetest.set_node(pos, { name = BLOCK_PREFIX .. (value + 1) })
-- do not override plants of the frost_resistance group
local resistance = minetest.get_item_group(node.name, "frost_resistance") or 0
if resistance > 0 then return end
end
-- do not place snow if area is not fully loaded
if minetest.find_node_near(pos, CHECK_DISTANCE, "ignore") then return end
-- do not place snow if already enpugh snow
local pos1 = vector.add(pos, { x = -CHECK_DISTANCE, y = -1, z = -CHECK_DISTANCE })
local pos2 = vector.add(pos, { x = CHECK_DISTANCE, y = 1, z = CHECK_DISTANCE })
local preplaced = minetest.find_nodes_in_area(pos1, pos2, "group:weather_snow_cover")
if preplaced ~= nil and #preplaced >= MAX_AMOUNT then return end
if value < 5 then
minetest.set_node(pos, { name = BLOCK_PREFIX .. (value + 1) })
end
end end
}) end
end })
climate_api.register_abm({ climate_api.register_abm({
label = "melt snow covers", label = "melt snow covers",
nodenames = { "group:weather_snow_cover" }, nodenames = { "group:regional_weather_snow_cover" },
interval = 25, interval = 15,
chance = 85, chance = 10,
catch_up = true,
conditions = {
min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height,
min_heat = 30
},
action = function (pos, node, env) action = function (pos, node, env)
local value = minetest.get_item_group(node.name, "weather_snow_cover") local node_name = minetest.get_node(pos).name
local value = minetest.get_item_group(node_name, "regional_weather_snow_cover")
if value == nil then value = 0 end if value == nil then value = 0 end
if value > 1 then if value > 1 then
minetest.set_node(pos, { name = BLOCK_PREFIX .. (value - 1) }) minetest.set_node(pos, { name = BLOCK_PREFIX .. (value - 1) })
elseif regional_weather.settings.puddles then elseif regional_weather.settings.puddles then
minetest.set_node(pos, regional_weather.get_random_puddle()) minetest.set_node(pos, { name = "regional_weather:puddle" })
else else
minetest.set_node(pos, { name = "air" }) minetest.set_node(pos, { name = "air" })
end end

View file

@ -7,15 +7,13 @@ if farming ~= nil and farming.mod == "redo" then
nodenames = { "farming:soil" }, nodenames = { "farming:soil" },
interval = 8, interval = 8,
chance = 2, chance = 2,
catch_up = false,
conditions = { conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
min_humidity = 50, min_humidity = 55,
min_heat = 35, min_heat = 30,
daylight = 15, min_light = 15
indoors = false
}, },
action = function (pos, node, env) action = function (pos, node, env)
@ -29,15 +27,13 @@ else
nodenames = { "group:field" }, nodenames = { "group:field" },
interval = 8, interval = 8,
chance = 2, chance = 2,
catch_up = false,
conditions = { conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
min_humidity = 50, min_humidity = 55,
min_heat = 35, min_heat = 30,
daylight = 15, min_light = 15
indoors = false
}, },
action = function (pos, node, env) action = function (pos, node, env)

17
ca_effects/damage.lua Normal file
View file

@ -0,0 +1,17 @@
if not regional_weather.settings.damage then return end
local EFFECT_NAME = "regional_weather:damage"
local function handle_effect(player_data)
for playername, data in pairs(player_data) do
local player = minetest.get_player_by_name(playername)
local hp = player:get_hp()
for weather, value in pairs(data) do
hp = hp - value
end
player:set_hp(hp, "weather damage")
end
end
climate_api.register_effect(EFFECT_NAME, handle_effect, "tick")
climate_api.set_effect_cycle(EFFECT_NAME, climate_api.LONG_CYCLE)

View file

@ -1,15 +1,8 @@
--[[
# Lightning Effect
Use this effect to cause lightning strikes.
Requires lightning mod in order to function. Uses default lightning configuration.
Expects an integer indicating a chance (between 0 and 1) for lightning to strike (per cycle and player).
]]
if not minetest.get_modpath("lightning") then return end if not minetest.get_modpath("lightning") then return end
if regional_weather.settings.lightning == 0 then return end
local EFFECT_NAME = "regional_weather:lightning" local EFFECT_NAME = "regional_weather:lightning"
local LIGHTNING_CHANCE = 20
lightning.auto = false lightning.auto = false
local rng = PcgRandom(82492402425) local rng = PcgRandom(82492402425)
@ -39,15 +32,8 @@ end
local function handle_effect(player_data) local function handle_effect(player_data)
for playername, data in pairs(player_data) do for playername, data in pairs(player_data) do
local chance = 0 local random = rng:next(1, LIGHTNING_CHANCE)
for weather, value in pairs(data) do if random == 1 then
if type(value) ~= "number" then
value = 1/20
end
chance = chance + value - (chance * value)
end
local random = math.random()
if random <= chance * regional_weather.settings.lightning then
local player = minetest.get_player_by_name(playername) local player = minetest.get_player_by_name(playername)
local ppos = player:get_pos() local ppos = player:get_pos()
local position = choose_pos(ppos) local position = choose_pos(ppos)

View file

@ -1,28 +1,20 @@
--[[
# Player Speed Effect
Use this effect to modify a player's movement speed.
Expects a numeric value that will be multiplied with the current speed physics.
]]
if not regional_weather.settings.player_speed then return end
local EFFECT_NAME = "regional_weather:speed_buff" local EFFECT_NAME = "regional_weather:speed_buff"
local function handle_effect(player_data) local function handle_effect(player_data)
for playername, data in pairs(player_data) do for playername, data in ipairs(player_data) do
local player = minetest.get_player_by_name(playername) local player = minetest.get_player_by_name(playername)
local product = 1 local product = 1
for weather, value in pairs(data) do for weather, value in pairs(data) do
product = product * value product = product * value
end end
climate_api.player_physics.add(EFFECT_NAME, player, "speed", product) climate_api.utility.add_physics(EFFECT_NAME, player, "speed", product)
end end
end end
local function remove_effect(player_data) local function remove_effect(player_data)
for playername, data in ipairs(player_data) do for playername, data in ipairs(player_data) do
local player = minetest.get_player_by_name(playername) local player = minetest.get_player_by_name(playername)
climate_api.player_physics.remove(EFFECT_NAME, player, "speed") climate_api.utility.remove_physics(EFFECT_NAME, player, "speed")
end end
end end

View file

@ -1,94 +1,29 @@
local name = "regional_weather:ambient" local name = "regional_weather:ambient"
local conditions = {} local CLOUD_SPEED = 1.8
-- see https://en.wikipedia.org/wiki/Cloud_base local conditions = {
local function calc_cloud_height(heat, humidity, dewpoint) min_light = 15
local base = regional_weather.settings.cloud_height }
-- much lower scale like 20 instead of 1000 fitting for Minetest
local scale = regional_weather.settings.cloud_scale
local spread = heat - dewpoint
local variation = spread / 4.4 * scale * 0.3
return base + climate_api.utility.rangelim(variation, -scale, scale)
end
-- maps range of 0 to 1 to any other range
local function map_range(val, low, high)
return val * (high - low) + low
end
local function generate_effects(params) local function generate_effects(params)
local override = {} local override = {}
local cloud_density = climate_api.utility.rangelim(params.humidity / 100, 0.15, 0.65) --[[override["climate_api:clouds"] = {
local cloud_thickness = climate_api.utility.rangelim(params.biome_humidity * 0.2, 1, 18) size = climate_api.utility.rangelim(params.humidity / 100, 0.25, 0.98),
local cloud_height = calc_cloud_height(params.heat, params.humidity, params.dewpoint) speed = vector.multiply(params.wind, CLOUD_SPEED)
local wind = climate_api.environment.get_wind({ x = 0, y = cloud_height, z = 0 }) }]]
-- diffuse shadows when cloudy local movement = params.player:get_player_velocity()
-- cloud_shadows at zero at cloud density 0.65 and one at 0.15 local movement_direction
local cloud_shadows = 1 - ((cloud_density - 0.15) / (0.65 - 0.15)) if (vector.length(movement) < 0.1) then
movement_direction = vector.new(0, 0, 0)
-- diffuse shadows at dawn / dusk else
-- 15 hours between dawn and dusk accoring to https://wiki.minetest.net/Time_of_day movement_direction = vector.normalize(movement)
local daylight_duration = 15 / 24
local daytime = climate_api.utility.rangelim(minetest.get_timeofday(), 0.1875, 0.8125)
-- zero at dawn / dusk and one at midday
local daytime_shadows = 1 - (math.abs(0.5 - daytime) * 2 / daylight_duration)
local shadow_intensity = map_range((cloud_shadows + daytime_shadows) / 2, 0.5, 2)
local light_saturation = map_range((cloud_shadows + daytime_shadows) / 2, 0.75, 1.25)
local skybox = {priority = 10}
skybox.cloud_data = {
density = cloud_density,
speed = wind,
thickness = cloud_thickness,
height = cloud_height,
ambient = "#0f0f1050"
}
skybox.light_data = {
shadow_intensity = shadow_intensity,
saturation = light_saturation
}
if params.height > -100 and params.humidity > 40 then
skybox.cloud_data.color = "#b2a4a4b0"
end end
local vector_product = vector.dot(movement_direction, params.wind)
if params.height > -100 and params.humidity > 65 then local movement_penalty = climate_api.utility.sigmoid(vector_product, 1.6, 0.2, 0.8) + 0.2
skybox.sky_data = { override["regional_weather:speed_buff"] = movement_penalty
type = "regular",
clouds = true,
sky_color = {
day_sky = "#6a828e",
day_horizon = "#5c7a8a",
dawn_sky = "#b2b5d7",
dawn_horizon = "#b7bce1",
night_sky = "#2373e1",
night_horizon = "#315d9b"
}
}
skybox.cloud_data.color = "#828e97b5"
skybox.cloud_data.ambient = "#20212250"
end
override["climate_api:skybox"] = skybox
if params.height > - 50 and not params.indoors then
local movement = params.player:get_velocity()
local movement_direction
if (vector.length(movement) < 0.1) then
movement_direction = vector.new(0, 0, 0)
else
movement_direction = vector.normalize(movement)
end
local vector_product = vector.dot(movement_direction, wind)
local movement_penalty = climate_api.utility.sigmoid(vector_product, 1.5, 0.15, 0.9) + 0.2
override["regional_weather:speed_buff"] = movement_penalty
end
return override return override
end end

View file

@ -1,8 +1,8 @@
local name = "regional_weather:deep_cave" local name = "regional_weather:deep_cave"
local conditions = { local conditions = {
max_daylight = minetest.LIGHT_MAX, max_light = 14,
max_height = -100 max_height = -100
} }
local effects = {} local effects = {}
@ -12,17 +12,9 @@ effects["climate_api:skybox"] = {
base_color = { r = 0, g = 0, b = 0 }, base_color = { r = 0, g = 0, b = 0 },
clouds = false clouds = false
}, },
sun_data = { sun_data = { visible = false },
visible = false,
sunrise_visible = false
},
moon_data = { visible = false }, moon_data = { visible = false },
star_data = { visible = false }, stars_data = { visible = false }
light_data = {
shadow_intensity = 0,
saturation = 1
},
priority = 100
} }
climate_api.register_weather(name, conditions, effects) climate_api.register_weather(name, conditions, effects)

View file

@ -1,60 +0,0 @@
local name = "regional_weather:fog"
local conditions = {
min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height,
min_humidity = 25,
max_humidity = 50,
max_windspeed = 2,
max_heat = 50,
min_time = 4 / 24,
max_time = 8 / 24,
not_biome = {
"cold_desert",
"cold_desert_ocean",
"desert",
"desert_ocean",
"sandstone_desert",
"sandstone_desert_ocean",
"tundra"
}
}
local effects = {}
effects["climate_api:hud_overlay"] = {
file = "weather_hud_fog.png^[opacity:100",
z_index = -200,
color_correction = true
}
effects["climate_api:skybox"] = {
sky_data = {
type = "plain",
base_color = "#c0c0c08f",
clouds = true
},
cloud_data = {
density = 1,
color = "#ffffff80",
thickness = 40,
speed = {x=0,y=0,z=0}
},
light_data = {
shadow_intensity = 0.1,
saturation = 0.5
},
priority = 50
}
local function generate_effects(params)
local override = {}
override["climate_api:skybox"] = {
cloud_data = {
height = params.player:get_pos().y - 20
}
}
return climate_api.utility.merge_tables(effects, override)
end
climate_api.register_weather(name, conditions, generate_effects)

View file

@ -1,56 +1,35 @@
local name = "regional_weather:hail" local name = "regional_weather:hail"
local conditions = { local conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
min_heat = 30, max_heat = 45,
max_heat = 45, min_humidity = 65,
min_humidity = 65, min_windspeed = 2.5,
min_biome_humidity = 26, min_light = 15
min_windspeed = 2.5,
indoors = false,
not_biome = {
"cold_desert",
"cold_desert_ocean",
"desert",
"desert_ocean",
"sandstone_desert",
"sandstone_desert_ocean"
}
} }
local effects = {} local effects = {}
effects["climate_api:damage"] = { effects["regional_weather:damage"] = 1
rarity = 15,
value = 3,
check = {
type = "raycast",
height = 7,
velocity = 20
}
}
effects["climate_api:sound"] = { effects["climate_api:sound"] = {
name = "weather_hail", name = "weather_hail",
gain = 1 gain = 1
} }
effects["regional_weather:lightning"] = 1 / 30
local textures = {}
for i = 1,5 do
textures[i] = "weather_hail" .. i .. ".png"
end
effects["climate_api:particles"] = { effects["climate_api:particles"] = {
boxsize = { x = 18, y = 0, z = 18 }, min_pos = {x=-9, y=7, z=-9},
v_offset = 7, max_pos = {x= 9, y=7, z= 9},
velocity = 20, falling_speed=15,
amount = 6, amount=5,
expirationtime = 0.7, exptime=0.8,
texture = textures, size=1,
glow = 5 textures = {}
} }
for i = 1,5,1 do
effects["climate_api:particles"].textures[i] = "weather_hail" .. i .. ".png"
end
climate_api.register_weather(name, conditions, effects) climate_api.register_weather(name, conditions, effects)

View file

@ -7,42 +7,19 @@ local conditions = {
min_humidity = 30, min_humidity = 30,
max_humidity = 40, max_humidity = 40,
max_windspeed = 2, max_windspeed = 2,
indoors = false, min_light = 15
has_biome = {
"default",
"deciduous_forest",
"deciduous_forest_ocean",
"deciduous_forest_shore",
"grassland",
"grassland_dunes",
"grassland_ocean",
"snowy_grassland",
"snowy_grassland_ocean",
"grassy",
"grassy_ocean",
"grassytwo",
"grassytwo_ocean",
"mushroom",
"mushroom_ocean",
"plains",
"plains_ocean",
"sakura",
"sakura_ocean"
}
} }
local effects = {} local effects = {}
effects["climate_api:particles"] = { effects["climate_api:particles"] = {
boxsize = { x = 24, y = 0, z = 24 }, min_pos = {x=-12, y=-4, z=-12},
vbox = 5, max_pos = {x= 12, y= 1, z= 12},
v_offset = -1, falling_speed=-0.1,
velocity = -0.1, amount=1,
acceleration = -0.03, exptime=5,
expirationtime = 5, size=0.8,
size = 0.8, texture="weather_pollen.png"
texture = "weather_pollen.png",
glow = 2
} }
climate_api.register_weather(name, conditions, effects) climate_api.register_weather(name, conditions, effects)

View file

@ -1,41 +1,43 @@
local name = "regional_weather:rain" local name = "regional_weather:rain"
local conditions = { local conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
min_heat = 35, min_heat = 30,
min_humidity = 50, min_humidity = 50,
max_humidity = 65, max_humidity = 65,
min_biome_humidity = 26, min_light = 15
indoors = false,
not_biome = {
"cold_desert",
"cold_desert_ocean",
"desert",
"desert_ocean",
"sandstone_desert",
"sandstone_desert_ocean",
"tundra"
}
} }
local effects = {} local effects = {}
effects["climate_api:sound"] = { effects["climate_api:sound"] = {
name = "weather_rain", name = "weather_rain"
gain = 1.5
} }
effects["climate_api:particles"] = { effects["climate_api:particles"] = {
boxsize = { x = 18, y = 2, z = 18 }, min_pos = {x=-9, y=7, z=-9},
v_offset = 6, max_pos = {x= 9, y=7, z= 9},
expirationtime = 1.6, exptime=0.8,
size = 2, size=1,
amount = 15, texture = "weather_raindrop.png"
velocity = 6,
acceleration = 0.05,
texture = "weather_raindrop.png",
glow = 5
} }
climate_api.register_weather(name, conditions, effects) local function generate_effects(params)
local avg_humidity = 40
local intensity = params.humidity / avg_humidity
local override = {}
override["climate_api:sound"] = {
gain = math.min(intensity, 1.2)
}
override["climate_api:particles"] = {
amount = 20 * math.min(intensity, 1.5),
falling_speed = 10 / math.min(intensity, 1.3)
}
return climate_api.utility.merge_tables(effects, override)
end
climate_api.register_weather(name, conditions, generate_effects)

View file

@ -1,53 +1,28 @@
local name = "regional_weather:rain_heavy" local name = "regional_weather:rain_heavy"
local conditions = { local conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
min_heat = 40, min_heat = 40,
min_humidity = 65, min_humidity = 65,
min_biome_humidity = 26, min_light = 15
indoors = false,
not_biome = {
"cold_desert",
"cold_desert_ocean",
"desert",
"desert_ocean",
"sandstone_desert",
"sandstone_desert_ocean",
"tundra"
}
} }
local effects = {} local effects = {}
effects["climate_api:skybox"] = {
cloud_data = {
color = "#5e676eb5"
},
priority = 11
}
effects["climate_api:sound"] = { effects["climate_api:sound"] = {
name = "weather_rain_heavy", name = "weather_rain",
gain = 1 gain = 1
} }
effects["regional_weather:lightning"] = 1 / 20
effects["climate_api:particles"] = { effects["climate_api:particles"] = {
boxsize = { x = 18, y = 0, z = 18 }, min_pos = {x=-9, y=7, z=-9},
v_offset = 7, max_pos = {x= 9, y=7, z= 9},
velocity = 7, falling_speed=10,
amount = 17, amount=20,
expirationtime = 1.2, exptime=0.8,
minsize = 25, size=25,
maxsize = 35, texture="weather_rain.png"
texture = {
"weather_rain.png",
"weather_rain.png",
"weather_rain_medium.png"
},
glow = 5
} }
climate_api.register_weather(name, conditions, effects) climate_api.register_weather(name, conditions, effects)

View file

@ -3,80 +3,27 @@ local name = "regional_weather:sandstorm"
local conditions = { local conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
min_windspeed = 3, min_heat = 50,
has_biome = { max_humidity = 25,
"cold_desert", min_windspeed = 6,
"desert", min_light = 15
"sandstone_desert"
}
} }
local effects = {} local effects = {}
effects["climate_api:hud_overlay"] = { effects["climate_api:hud_overlay"] = {
file = "weather_hud_sand.png", file = "weather_hud_sand.png",
z_index = -100, z_index = -100
color_correction = true
}
effects["climate_api:damage"] = {
rarity = 3,
value = 1,
check = {
type = "raycast",
height = 0,
velocity = 0.3
}
} }
effects["climate_api:particles"] = { effects["climate_api:particles"] = {
boxsize = { x = 8, y = 4.5, z = 8 }, min_pos = {x=-9, y=-5, z=-9},
velocity = 0.6, max_pos = {x= 9, y= 5, z= 9},
acceleration = -0.2, falling_speed=1,
amount = 12, amount=40,
expirationtime = 0.7, exptime=0.8,
size = 25, size=15,
texture = { texture="weather_sand.png"
"weather_sandstorm.png",
"weather_sandstorm.png^[transformFY",
"weather_sandstorm.png^[transformR180",
"weather_sandstorm.png^[transformFYR180"
}
} }
effects["climate_api:skybox"] = { climate_api.register_weather(name, conditions, effects)
sky_data = {
type = "plain",
clouds = true,
},
cloud_data = {
density = 1,
color = "#f7e4bfc0",
thickness = 40,
speed = {x=0,y=0,z=0}
},
priority = 60
}
local function generate_effects(params)
local override = {}
local light = math.max(params.light / 15, 0.2)
local color = {r = 247 * light, g = 228 * light, b = 191 * light, a = 256}
override["climate_api:skybox"] = {
sky_data = {
base_color = color
},
cloud_data = {
height = params.player:get_pos().y - 20
}
}
override = climate_api.utility.merge_tables(effects, override)
if params.daylight < 15 then
local result = {}
result["climate_api:skybox"] = override["climate_api:skybox"]
return result
end
return override
end
climate_api.register_weather(name, conditions, generate_effects)

View file

@ -3,37 +3,37 @@ local name = "regional_weather:snow"
local conditions = { local conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
max_heat = 35, max_heat = 40,
min_humidity = 50, min_humidity = 50,
max_humidity = 65, max_humidity = 65,
min_biome_humidity = 26, min_light = 15
indoors = false,
not_biome = {
"cold_desert",
"cold_desert_ocean",
"desert",
"desert_ocean",
"sandstone_desert",
"sandstone_desert_ocean"
}
} }
local effects = {} local effects = {}
local textures = {}
for i = 1,12,1 do
textures[i] = "weather_snowflake" .. i .. ".png"
end
effects["climate_api:particles"] = { effects["climate_api:particles"] = {
boxsize = { x = 24, y = 6, z = 24 }, min_pos = {x=-20, y= 3, z=-20},
v_offset = 2, max_pos = {x= 20, y=12, z= 20},
amount = 4, exptime=8,
expirationtime = 7, size=1,
velocity = 0.85, textures = {}
acceleration = -0.06,
texture = textures,
glow = 6
} }
climate_api.register_weather(name, conditions, effects) for i = 1,12,1 do
effects["climate_api:particles"].textures[i] = "weather_snowflake" .. i .. ".png"
end
local function generate_effects(params)
local avg_humidity = 40
local intensity = params.humidity / avg_humidity
local override = {}
override["climate_api:particles"] = {
amount = 50 * math.min(intensity, 1.5),
falling_speed = 1 / math.min(intensity, 1.3)
}
return climate_api.utility.merge_tables(effects, override)
end
climate_api.register_weather(name, conditions, generate_effects)

View file

@ -3,44 +3,53 @@ local name = "regional_weather:snow_heavy"
local conditions = { local conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
max_heat = 30, max_heat = 30,
min_humidity = 65, min_humidity = 65,
min_biome_humidity = 26, min_light = 15
indoors = false,
not_biome = {
"cold_desert",
"cold_desert_ocean",
"desert",
"desert_ocean",
"sandstone_desert",
"sandstone_desert_ocean"
}
} }
local effects = {} local effects = {}
effects["climate_api:skybox"] = {
cloud_data = {
color = "#5e676eb5"
},
priority = 11
}
effects["climate_api:hud_overlay"] = { effects["climate_api:hud_overlay"] = {
file = "weather_hud_frost.png", file = "weather_hud_ice.png",
z_index = -100, z_index = -100
color_correction = true
} }
effects["climate_api:particles"] = { effects["climate_api:particles"] = {
boxsize = { x = 14, y = 3, z = 14 }, min_pos = {x=-8, y=3, z=-8},
v_offset = 3, max_pos = {x= 8, y=6, z= 8},
expirationtime = 7.5, exptime=6,
size = 15, size=12,
amount = 6, texture="weather_snow.png"
velocity = 0.75,
texture = "weather_snow.png",
glow = 6
} }
climate_api.register_weather(name, conditions, effects) effects["climate_api:skybox"] = {
sky_data = {
type = "plain",
base_color = {r=106, g=130, b=142},
clouds = true
},
cloud_data = {
size = 0.98,
speed = {x = 4, y = 0, z = -1.3}
}
}
local function generate_effects(params)
local avg_humidity = 55
local intensity = params.humidity / avg_humidity
local override = {}
override["climate_api:sound"] = {
gain = math.min(intensity, 1.2)
}
override["climate_api:particles"] = {
amount = 8 * math.min(intensity, 1.5),
falling_speed = 1 / math.min(intensity, 1.3)
}
return climate_api.utility.merge_tables(effects, override)
end
climate_api.register_weather(name, conditions, generate_effects)

View file

@ -4,7 +4,7 @@ local conditions = {
min_height = regional_weather.settings.min_height, min_height = regional_weather.settings.min_height,
max_height = regional_weather.settings.max_height, max_height = regional_weather.settings.max_height,
min_windspeed = 3, min_windspeed = 3,
indoors = false, min_light = 15
} }
local effects = {} local effects = {}
@ -19,7 +19,7 @@ local function generate_effects(params)
local override = {} local override = {}
override["climate_api:sound"] = { override["climate_api:sound"] = {
gain = math.min(intensity, 1) gain = math.min(intensity, 1.2)
} }
return climate_api.utility.merge_tables(effects, override) return climate_api.utility.merge_tables(effects, override)

View file

@ -1,46 +1,31 @@
local modname = minetest.get_current_modname() local modname = minetest.get_current_modname()
local modpath = minetest.get_modpath(modname) local modpath = minetest.get_modpath(modname)
local function get_setting_bool(name, default, is_global) local function get_setting_bool(name, default)
local prefix = "" local value = minetest.settings:get_bool("regional_weather_" .. name)
if not is_global then prefix = "regional_weather_" end
local value = minetest.settings:get_bool(prefix .. name)
if type(value) == "nil" then value = default end if type(value) == "nil" then value = default end
return minetest.is_yes(value) return minetest.is_yes(value)
end end
local function get_setting_number(name, default, is_global) local function get_setting_number(name, default)
local prefix = "" local value = minetest.settings:get("regional_weather_" .. name)
if not is_global then prefix = "regional_weather_" end
local value = minetest.settings:get(prefix .. name)
if type(value) == "nil" then value = default end if type(value) == "nil" then value = default end
return tonumber(value) return tonumber(value)
end end
regional_weather = {} regional_weather = {}
regional_weather.settings = {} regional_weather.settings = {}
regional_weather.settings.player_speed = get_setting_bool("player_speed", false) regional_weather.settings.damage = get_setting_bool("damage", true)
regional_weather.settings.snow = get_setting_bool("snow_layers", true) regional_weather.settings.snow = get_setting_bool("snow_layers", true)
regional_weather.settings.snow_griefing = get_setting_bool("snow_griefing", true) regional_weather.settings.puddles = get_setting_bool("puddles", true)
regional_weather.settings.puddles = get_setting_bool("puddles", true) regional_weather.settings.soil = get_setting_bool("soil", true)
regional_weather.settings.puddles_water = get_setting_bool("puddles_water", false) regional_weather.settings.fire = get_setting_bool("fire", true)
regional_weather.settings.soil = get_setting_bool("soil", true) regional_weather.settings.max_height = get_setting_number("max_height", 120)
regional_weather.settings.fire = get_setting_bool("fire", true) regional_weather.settings.min_height = get_setting_number("min_height", -50)
regional_weather.settings.ice = get_setting_bool("ice", true)
regional_weather.settings.pedology = get_setting_bool("pedology", true)
regional_weather.settings.lightning = get_setting_number("lightning", 1)
regional_weather.settings.max_height = get_setting_number("max_height", 120)
regional_weather.settings.min_height = get_setting_number("min_height", -50)
regional_weather.settings.cloud_height = get_setting_number("cloud_height", 120)
regional_weather.settings.cloud_scale = get_setting_number("cloud_scale", 40)
local S = minetest.get_translator("regional_weather")
regional_weather.i18n = S
-- import individual weather types -- import individual weather types
dofile(modpath.."/ca_weathers/ambient.lua") dofile(modpath.."/ca_weathers/ambient.lua")
dofile(modpath.."/ca_weathers/deep_cave.lua") dofile(modpath.."/ca_weathers/deep_cave.lua")
dofile(modpath.."/ca_weathers/fog.lua")
dofile(modpath.."/ca_weathers/hail.lua") dofile(modpath.."/ca_weathers/hail.lua")
dofile(modpath.."/ca_weathers/pollen.lua") dofile(modpath.."/ca_weathers/pollen.lua")
dofile(modpath.."/ca_weathers/rain.lua") dofile(modpath.."/ca_weathers/rain.lua")
@ -51,6 +36,7 @@ dofile(modpath.."/ca_weathers/snow_heavy.lua")
dofile(modpath.."/ca_weathers/storm.lua") dofile(modpath.."/ca_weathers/storm.lua")
-- register environment effects -- register environment effects
dofile(modpath.."/ca_effects/damage.lua")
dofile(modpath.."/ca_effects/lightning.lua") dofile(modpath.."/ca_effects/lightning.lua")
dofile(modpath.."/ca_effects/speed_buff.lua") dofile(modpath.."/ca_effects/speed_buff.lua")
@ -58,6 +44,4 @@ dofile(modpath.."/ca_effects/speed_buff.lua")
dofile(modpath .. "/abms/puddle.lua") dofile(modpath .. "/abms/puddle.lua")
dofile(modpath .. "/abms/snow_cover.lua") dofile(modpath .. "/abms/snow_cover.lua")
dofile(modpath .. "/abms/fire.lua") dofile(modpath .. "/abms/fire.lua")
dofile(modpath .. "/abms/ice.lua") dofile(modpath .. "/abms/soil.lua")
dofile(modpath .. "/abms/pedology.lua")
dofile(modpath .. "/abms/soil.lua")

View file

@ -1,4 +0,0 @@
# textdomain:regional_weather
Thin Ice=Dünnes Eis
Puddle=Pfütze
Snow Cover=Schnee

View file

@ -1,4 +0,0 @@
# textdomain:regional_weather
Thin Ice=
Puddle=
Snow Cover=

View file

@ -1,8 +1,9 @@
name = regional_weather name = regional_weather
title = Regional Weather title = Regional Weather
author = TestificateMods author = TestificateMods
depends = climate_api release = 1
optional_depends = default, lightning, farming, fire, pedology depends = default, climate_api
optional_depends = lightning, farming
description = """ description = """
Not every biome is the same and neither should their weather be. Not every biome is the same and neither should their weather be.
Regional Weather controls it's effects with the local climate in mind. Regional Weather controls it's effects with the local climate in mind.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 989 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 MiB

View file

@ -1,50 +1,7 @@
[Features] regional_weather_damage (Storms and hail cause damage to players) bool true
regional_weather_snow_layers (Place snow layers on ground) bool true
# If set to true, wind will boost or penalize player movements based on direction. regional_weather_puddles (Place rain puddles on ground) bool true
regional_weather_player_speed (Change movement speed based on wind) bool false regional_weather_soil (Turn farmland wet during rain) bool true
regional_weather_fire (Extinguish fire during rain) bool true
# If set to true, snow layers will stack up during snowy weather.
regional_weather_snow_layers (Place snow layers) bool true
# If set to true, snow layers will destroy crops
regional_weather_snow_griefing (Destructive snow layers) bool true
# If set to true, river water sources will freeze at low temperatures and melt when it gets warmer again.
# This process does not affect regular ice blocks because it adds its own temporary ones.
regional_weather_ice (Freeze river water) bool true
# If set to true, water puddles will form during rain or when snow layers have melted.
regional_weather_puddles (Place rain puddles) bool true
# If set to true, puddles will be marked as water and hydrate farmland.
# Not compatible with some ambient sound or mob mods
regional_weather_puddles_water (Hydrate farmland near puddles) bool false
# If set to true, rain will cause dry farmland to turn wet.
regional_weather_soil (Hydrate farmland during rain) bool true
# If set to true, fires will be extinguished during rain showers.
regional_weather_fire (Extinguish fire) bool true
# If set to true, rain will wetten or dry nodes from pedology mod.
regional_weather_pedology (Wetten pedology nodes) bool true
# Multiplier for lightning strike chances
# Requires lightning mod to be installed
regional_weather_lightning (Lightning chance modifier) float 1 0 20
[World Configuration]
# No visual effects will be applied below this height.
# This will prevent unwanted visuals within large underground caves.
regional_weather_min_height (Minimum height of weather effects) int -50
# No visual effects will be applied above this height.
# This value defaults to normal cloud height (120 nodes above sea level).
regional_weather_max_height (Maximum height of weather effects) int 120 regional_weather_max_height (Maximum height of weather effects) int 120
regional_weather_min_height (Minimum height of weather effects) int -50
# Average height of cloud bases
regional_weather_cloud_height (Cloud height) int 120
# Maxmial variation of cloud height from base value
regional_weather_cloud_scale (Cloud height variation) int 40

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 402 B

After

Width:  |  Height:  |  Size: 47 KiB

BIN
textures/weather_puddle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 B

After

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB