mirror of
https://github.com/t-affeldt/regional_weather.git
synced 2025-06-28 14:46:00 +02:00
Compare commits
8 Commits
Author | SHA1 | Date | |
---|---|---|---|
da4062206d | |||
ffdbdf792e | |||
e6f0067f3b | |||
a0c56052dd | |||
2d289abbd1 | |||
e874daa894 | |||
231642af2f | |||
72716122d7 |
10
README.md
10
README.md
@ -25,6 +25,7 @@ The following mods are recommended to be installed alongside Regional Weather:
|
|||||||
- [Lightning](https://github.com/minetest-mods/lightning): Adds to heavy rain by enabling additional lightning effects
|
- [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.
|
- [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.
|
- [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.
|
- [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).
|
For easier installation, you can get a lot of these mods as part of my [Climate Modpack](https://github.com/t-affeldt/climate).
|
||||||
@ -35,8 +36,6 @@ 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.
|
Also check out the options inside the ``climate_api`` section for additional configuration options, including performance tweaks and feature switches.
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
- ``Cause player damage`` (default true):
|
|
||||||
If set to true, sand storms and hail will damage affected players over time.
|
|
||||||
- ``Place snow layers`` (default true):
|
- ``Place snow layers`` (default true):
|
||||||
If set to true, snow layers will stack up during snowy weather.
|
If set to true, snow layers will stack up during snowy weather.
|
||||||
- ``Freeze river water`` (default true):
|
- ``Freeze river water`` (default true):
|
||||||
@ -50,6 +49,9 @@ Also check out the options inside the ``climate_api`` section for additional con
|
|||||||
- ``Extinguish fire`` (bool true):
|
- ``Extinguish fire`` (bool true):
|
||||||
If set to true, fires will be extinguished during rain showers.
|
If set to true, fires will be extinguished during rain showers.
|
||||||
Requires *fire* mod.
|
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
|
### World Configuration
|
||||||
- ``Maximum height of weather effects`` (default 120):
|
- ``Maximum height of weather effects`` (default 120):
|
||||||
@ -58,6 +60,10 @@ Also check out the options inside the ``climate_api`` section for additional con
|
|||||||
- ``Minimum height of weather effects`` (default -50):
|
- ``Minimum height of weather effects`` (default -50):
|
||||||
No visual effects will be applied below this height.
|
No visual effects will be applied below this height.
|
||||||
This will prevent unwanted visuals within large underground caves.
|
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
|
## License information
|
||||||
### Source Code
|
### Source Code
|
||||||
|
@ -8,7 +8,14 @@ local BLOCK_NAME = "regional_weather:ice"
|
|||||||
minetest.register_node(BLOCK_NAME, {
|
minetest.register_node(BLOCK_NAME, {
|
||||||
tiles = {"(default_ice.png^[colorize:#ffffff:50)^[opacity:200"},
|
tiles = {"(default_ice.png^[colorize:#ffffff:50)^[opacity:200"},
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
groups = {cracky = 3, cools_lava = 1, slippery = 3, dig_immediate = 2},
|
groups = {
|
||||||
|
cracky = 3,
|
||||||
|
cools_lava = 1,
|
||||||
|
slippery = 3,
|
||||||
|
dig_immediate = 2,
|
||||||
|
melts = 1
|
||||||
|
},
|
||||||
|
freezemelt = "default:river_water_source",
|
||||||
sounds = default.node_sound_glass_defaults(),
|
sounds = default.node_sound_glass_defaults(),
|
||||||
use_texture_alpha = true,
|
use_texture_alpha = true,
|
||||||
drop = "",
|
drop = "",
|
||||||
|
28
abms/pedology.lua
Normal file
28
abms/pedology.lua
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
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,
|
||||||
|
min_light = 15
|
||||||
|
},
|
||||||
|
|
||||||
|
action = function (pos, node, env)
|
||||||
|
local wetness = minetest.get_item_group(node.name, "wet") or 0
|
||||||
|
if wetness < 2 and env.humidity > 55 then
|
||||||
|
pedology.wetten(pos)
|
||||||
|
elseif wetness > 0 and wetness < 3 and env.humidity < 40 then
|
||||||
|
pedology.dry(pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
})
|
114
abms/puddle.lua
114
abms/puddle.lua
@ -2,6 +2,16 @@ local BLOCK_PREFIX = "regional_weather:puddle_"
|
|||||||
local VARIANT_COUNT = 39
|
local VARIANT_COUNT = 39
|
||||||
local MIN_DISTANCE = 4
|
local MIN_DISTANCE = 4
|
||||||
|
|
||||||
|
local GROUND_COVERS = {
|
||||||
|
"group:soil",
|
||||||
|
"group:stone",
|
||||||
|
"group:sand",
|
||||||
|
"group:wood",
|
||||||
|
"default:permafrost",
|
||||||
|
"default:permafrost_with_moss",
|
||||||
|
"default:permafrost_with_stones"
|
||||||
|
}
|
||||||
|
|
||||||
if not regional_weather.settings.puddles then
|
if not regional_weather.settings.puddles then
|
||||||
for i=1,VARIANT_COUNT do
|
for i=1,VARIANT_COUNT do
|
||||||
for r=0,270,90 do
|
for r=0,270,90 do
|
||||||
@ -16,75 +26,74 @@ local node_box = {
|
|||||||
fixed = {-0.5, -0.5, -0.5, 0.5, -0.49, 0.5}
|
fixed = {-0.5, -0.5, -0.5, 0.5, -0.49, 0.5}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local apply_water_group
|
||||||
|
if regional_weather.settings.puddles_water then
|
||||||
|
apply_water_group = 1
|
||||||
|
end
|
||||||
|
|
||||||
for i = 1,VARIANT_COUNT do
|
for i = 1,VARIANT_COUNT do
|
||||||
for rotation = 0,270,90 do
|
for flip = 0,1 do
|
||||||
for flip = 0,1 do
|
local name = BLOCK_PREFIX .. i
|
||||||
local name = BLOCK_PREFIX .. i .. "_" .. rotation
|
local index = i
|
||||||
local index = i
|
if i < 10 then index = "0" .. i end
|
||||||
if i < 10 then index = "0" .. i end
|
local texture = "weather_puddle_" .. index .. ".png^[opacity:128"
|
||||||
local texture = "weather_puddle_" .. index .. ".png^[opacity:128"
|
if flip == 1 then
|
||||||
if flip == 1 or rotation > 0 then
|
name = name .. "_flipped"
|
||||||
texture = texture .. "^[transform"
|
texture = texture .. "^[transformFX"
|
||||||
end
|
|
||||||
if flip == 1 then
|
|
||||||
name = name .. "_flipped"
|
|
||||||
texture = texture .. "FX"
|
|
||||||
end
|
|
||||||
if rotation > 0 then
|
|
||||||
texture = texture .. "R" .. rotation
|
|
||||||
end
|
|
||||||
minetest.register_node(name, {
|
|
||||||
tiles = { texture },
|
|
||||||
drawtype = "nodebox",
|
|
||||||
pointable = false,
|
|
||||||
buildable_to = true,
|
|
||||||
floodable = true,
|
|
||||||
walkable = false,
|
|
||||||
sunlight_propagates = true,
|
|
||||||
paramtype = "light",
|
|
||||||
use_texture_alpha = true,
|
|
||||||
node_box = node_box,
|
|
||||||
groups = {
|
|
||||||
not_in_creative_inventory = 1,
|
|
||||||
crumbly = 3,
|
|
||||||
attached_node = 1,
|
|
||||||
slippery = 1,
|
|
||||||
flora = 1,
|
|
||||||
water = 1,
|
|
||||||
regional_weather_puddle = 1
|
|
||||||
},
|
|
||||||
drop = "",
|
|
||||||
sounds = {
|
|
||||||
footstep = {
|
|
||||||
name = "weather_puddle",
|
|
||||||
gain = 0.8
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
end
|
end
|
||||||
|
minetest.register_node(name, {
|
||||||
|
tiles = { texture },
|
||||||
|
drawtype = "nodebox",
|
||||||
|
pointable = false,
|
||||||
|
buildable_to = true,
|
||||||
|
floodable = true,
|
||||||
|
walkable = false,
|
||||||
|
sunlight_propagates = true,
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
use_texture_alpha = true,
|
||||||
|
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 = "",
|
||||||
|
sounds = {
|
||||||
|
footstep = {
|
||||||
|
name = "weather_puddle",
|
||||||
|
gain = 0.8
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_alias("regional_weather:puddle", BLOCK_PREFIX .. "14_0")
|
minetest.register_alias("regional_weather:puddle", BLOCK_PREFIX .. "14")
|
||||||
|
|
||||||
local function get_random_puddle()
|
local function get_random_puddle()
|
||||||
local index = math.random(1, VARIANT_COUNT)
|
local index = math.random(1, VARIANT_COUNT)
|
||||||
local rotation = math.random(0, 3) * 90
|
local rotation = math.random(0, 3) * 90
|
||||||
local flip = math.random(0, 1)
|
local flip = math.random(0, 1)
|
||||||
local name = BLOCK_PREFIX .. index .. "_" .. rotation
|
local name = BLOCK_PREFIX .. index
|
||||||
if flip == 1 then
|
if flip == 1 then
|
||||||
name = name .. "_flipped"
|
name = name .. "_flipped"
|
||||||
end
|
end
|
||||||
return name
|
local param2 = minetest.dir_to_facedir(minetest.yaw_to_dir(rotation))
|
||||||
|
return { name = name, param2 = param2 }
|
||||||
end
|
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 = { "group:soil", "group:stone" },
|
nodenames = GROUND_COVERS,
|
||||||
neighbors = { "air" },
|
neighbors = { "air" },
|
||||||
interval = 15,
|
interval = 8,
|
||||||
chance = 50,
|
chance = 150,
|
||||||
catch_up = false,
|
catch_up = false,
|
||||||
|
|
||||||
conditions = {
|
conditions = {
|
||||||
@ -101,9 +110,8 @@ climate_api.register_abm({
|
|||||||
|
|
||||||
action = function (pos, node, env)
|
action = function (pos, node, env)
|
||||||
if minetest.get_node(pos).name ~= "air" then return end
|
if minetest.get_node(pos).name ~= "air" then return end
|
||||||
if minetest.find_node_near(pos, MIN_DISTANCE, "group:regional_weather_puddle") then return end
|
if minetest.find_node_near(pos, MIN_DISTANCE, "group:weather_puddle") then return end
|
||||||
local puddle_name = get_random_puddle()
|
minetest.set_node(pos, get_random_puddle())
|
||||||
minetest.set_node(pos, {name = puddle_name})
|
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ climate_api.register_abm({
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
action = function (pos, node, env)
|
action = function (pos, node, env)
|
||||||
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
|
local base = minetest.get_node(vector.add(pos, {x=0, y=-1, z=0})).name
|
||||||
local is_soil = minetest.get_item_group(base, "soil") or 0
|
local is_soil = minetest.get_item_group(base, "soil") or 0
|
||||||
local is_stone = minetest.get_item_group(base, "stone") or 0
|
local is_stone = minetest.get_item_group(base, "stone") or 0
|
||||||
@ -109,8 +109,7 @@ climate_api.register_abm({
|
|||||||
},
|
},
|
||||||
|
|
||||||
action = function (pos, node, env)
|
action = function (pos, node, env)
|
||||||
local node_name = minetest.get_node(pos).name
|
local value = minetest.get_item_group(node.name, "regional_weather_snow_cover")
|
||||||
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 < 5 then
|
if value < 5 then
|
||||||
minetest.set_node(pos, { name = BLOCK_PREFIX .. (value + 1) })
|
minetest.set_node(pos, { name = BLOCK_PREFIX .. (value + 1) })
|
||||||
@ -130,8 +129,7 @@ climate_api.register_abm({
|
|||||||
},
|
},
|
||||||
|
|
||||||
action = function (pos, node, env)
|
action = function (pos, node, env)
|
||||||
local node_name = minetest.get_node(pos).name
|
local value = minetest.get_item_group(node.name, "regional_weather_snow_cover")
|
||||||
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) })
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
if not minetest.is_yes(minetest.settings:get_bool("enable_damage"))
|
|
||||||
or not regional_weather.settings.damage then return end
|
|
||||||
|
|
||||||
local EFFECT_NAME = "regional_weather:damage"
|
|
||||||
|
|
||||||
local rng = PcgRandom(7819792)
|
|
||||||
|
|
||||||
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, dmg in pairs(data) do
|
|
||||||
if rng:next(1, dmg.chance) == 1 then
|
|
||||||
hp = hp - dmg.value
|
|
||||||
end
|
|
||||||
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.MEDIUM_CYCLE)
|
|
@ -1,8 +1,15 @@
|
|||||||
|
--[[
|
||||||
|
# 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)
|
||||||
@ -32,8 +39,15 @@ 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 random = rng:next(1, LIGHTNING_CHANCE)
|
local chance = 0
|
||||||
if random == 1 then
|
for weather, value in pairs(data) do
|
||||||
|
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)
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
|
--[[
|
||||||
|
# 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)
|
||||||
@ -7,14 +15,14 @@ local function handle_effect(player_data)
|
|||||||
for weather, value in pairs(data) do
|
for weather, value in pairs(data) do
|
||||||
product = product * value
|
product = product * value
|
||||||
end
|
end
|
||||||
climate_api.utility.add_physics(EFFECT_NAME, player, "speed", product)
|
climate_api.player_physics.add(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.utility.remove_physics(EFFECT_NAME, player, "speed")
|
climate_api.player_physics.remove(EFFECT_NAME, player, "speed")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1,19 +1,36 @@
|
|||||||
local name = "regional_weather:ambient"
|
local name = "regional_weather:ambient"
|
||||||
local CLOUD_SPEED = 1.8
|
|
||||||
|
|
||||||
local conditions = {}
|
local conditions = {}
|
||||||
|
|
||||||
|
-- see https://en.wikipedia.org/wiki/Cloud_base
|
||||||
|
local function calc_cloud_height(heat, humidity, dewpoint)
|
||||||
|
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
|
||||||
|
|
||||||
local function generate_effects(params)
|
local function generate_effects(params)
|
||||||
local override = {}
|
local override = {}
|
||||||
local wind = climate_api.environment.get_wind()
|
|
||||||
|
local cloud_height = calc_cloud_height(params.heat, params.humidity, params.dewpoint)
|
||||||
|
local wind = climate_api.environment.get_wind({ x = 0, y = cloud_height, z = 0 })
|
||||||
|
|
||||||
local skybox = {priority = 10}
|
local skybox = {priority = 10}
|
||||||
skybox.cloud_data = {
|
skybox.cloud_data = {
|
||||||
density = climate_api.utility.rangelim(params.humidity / 100, 0.25, 0.75),
|
density = climate_api.utility.rangelim(params.humidity / 100, 0.15, 0.65),
|
||||||
speed = vector.multiply(wind, CLOUD_SPEED),
|
speed = wind,
|
||||||
thickness = climate_api.utility.rangelim(params.base_humidity * 0.2, 1, 18)
|
thickness = climate_api.utility.rangelim(params.base_humidity * 0.2, 1, 18),
|
||||||
|
height = cloud_height,
|
||||||
|
ambient = "#0f0f1050"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if params.height > -100 and params.humidity > 40 then
|
||||||
|
skybox.cloud_data.color = "#b2a4a4b0"
|
||||||
|
end
|
||||||
|
|
||||||
if params.height > -100 and params.humidity > 65 then
|
if params.height > -100 and params.humidity > 65 then
|
||||||
skybox.sky_data = {
|
skybox.sky_data = {
|
||||||
type = "regular",
|
type = "regular",
|
||||||
@ -27,6 +44,8 @@ local function generate_effects(params)
|
|||||||
night_horizon = "#315d9b"
|
night_horizon = "#315d9b"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
skybox.cloud_data.color = "#828e97b5"
|
||||||
|
skybox.cloud_data.ambient = "#20212250"
|
||||||
end
|
end
|
||||||
|
|
||||||
override["climate_api:skybox"] = skybox
|
override["climate_api:skybox"] = skybox
|
||||||
@ -39,7 +58,7 @@ local function generate_effects(params)
|
|||||||
movement_direction = vector.normalize(movement)
|
movement_direction = vector.normalize(movement)
|
||||||
end
|
end
|
||||||
local vector_product = vector.dot(movement_direction, wind)
|
local vector_product = vector.dot(movement_direction, wind)
|
||||||
local movement_penalty = climate_api.utility.sigmoid(vector_product, 1.6, 0.2, 0.8) + 0.2
|
local movement_penalty = climate_api.utility.sigmoid(vector_product, 1.5, 0.15, 0.9) + 0.2
|
||||||
override["regional_weather:speed_buff"] = movement_penalty
|
override["regional_weather:speed_buff"] = movement_penalty
|
||||||
return override
|
return override
|
||||||
end
|
end
|
||||||
|
@ -3,6 +3,7 @@ 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_windspeed = 2.5,
|
||||||
@ -11,9 +12,14 @@ local conditions = {
|
|||||||
|
|
||||||
local effects = {}
|
local effects = {}
|
||||||
|
|
||||||
effects["regional_weather:damage"] = {
|
effects["climate_api:damage"] = {
|
||||||
chance = 15,
|
rarity = 15,
|
||||||
value = 3
|
value = 3,
|
||||||
|
check = {
|
||||||
|
type = "raycast",
|
||||||
|
height = 7,
|
||||||
|
velocity = 20
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
effects["climate_api:sound"] = {
|
effects["climate_api:sound"] = {
|
||||||
@ -21,18 +27,21 @@ effects["climate_api:sound"] = {
|
|||||||
gain = 1
|
gain = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
effects["climate_api:particles"] = {
|
effects["regional_weather:lightning"] = 1 / 30
|
||||||
min_pos = {x=-9, y=7, z=-9},
|
|
||||||
max_pos = {x= 9, y=7, z= 9},
|
|
||||||
falling_speed=20,
|
|
||||||
amount=6,
|
|
||||||
exptime=0.7,
|
|
||||||
size=1,
|
|
||||||
textures = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
for i = 1,5,1 do
|
local textures = {}
|
||||||
effects["climate_api:particles"].textures[i] = "weather_hail" .. i .. ".png"
|
for i = 1,5 do
|
||||||
|
textures[i] = "weather_hail" .. i .. ".png"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
effects["climate_api:particles"] = {
|
||||||
|
boxsize = { x = 18, y = 0, z = 18 },
|
||||||
|
v_offset = 7,
|
||||||
|
velocity = 20,
|
||||||
|
amount = 6,
|
||||||
|
expirationtime = 0.7,
|
||||||
|
texture = textures,
|
||||||
|
glow = 5
|
||||||
|
}
|
||||||
|
|
||||||
climate_api.register_weather(name, conditions, effects)
|
climate_api.register_weather(name, conditions, effects)
|
||||||
|
@ -34,14 +34,15 @@ local conditions = {
|
|||||||
local effects = {}
|
local effects = {}
|
||||||
|
|
||||||
effects["climate_api:particles"] = {
|
effects["climate_api:particles"] = {
|
||||||
min_pos = {x=-12, y=-4, z=-12},
|
boxsize = { x = 24, y = 0, z = 24 },
|
||||||
max_pos = {x= 12, y= 1, z= 12},
|
vbox = 5,
|
||||||
falling_speed = -0.1,
|
v_offset = -1,
|
||||||
acceleration = {x=0,y=-0.03,z=0},
|
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)
|
||||||
|
@ -17,14 +17,15 @@ effects["climate_api:sound"] = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
effects["climate_api:particles"] = {
|
effects["climate_api:particles"] = {
|
||||||
min_pos = {x=-9, y=8, z=-9},
|
boxsize = { x = 18, y = 2, z = 18 },
|
||||||
max_pos = {x= 9, y=6, z= 9},
|
v_offset = 6,
|
||||||
exptime = 1.1,
|
expirationtime = 1.6,
|
||||||
size = 2,
|
size = 2,
|
||||||
amount = 15,
|
amount = 15,
|
||||||
falling_speed = 6,
|
velocity = 6,
|
||||||
acceleration={x=0, y=-0.05, z=0},
|
acceleration = 0.05,
|
||||||
texture = "weather_raindrop.png"
|
texture = "weather_raindrop.png",
|
||||||
|
glow = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
climate_api.register_weather(name, conditions, effects)
|
climate_api.register_weather(name, conditions, effects)
|
||||||
|
@ -10,24 +10,34 @@ local conditions = {
|
|||||||
|
|
||||||
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_heavy",
|
||||||
gain = 1
|
gain = 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
effects["regional_weather:lightning"] = 1 / 20
|
||||||
|
|
||||||
effects["climate_api:particles"] = {
|
effects["climate_api:particles"] = {
|
||||||
min_pos = {x=-9, y=7, z=-9},
|
boxsize = { x = 18, y = 0, z = 18 },
|
||||||
max_pos = {x= 9, y=7, z= 9},
|
v_offset = 7,
|
||||||
falling_speed=7,
|
velocity = 7,
|
||||||
amount=17,
|
amount = 17,
|
||||||
exptime=0.8,
|
expirationtime = 1.2,
|
||||||
min_size=25,
|
minsize = 25,
|
||||||
max_size=35,
|
maxsize = 35,
|
||||||
textures={
|
texture = {
|
||||||
"weather_rain.png",
|
"weather_rain.png",
|
||||||
"weather_rain.png",
|
"weather_rain.png",
|
||||||
"weather_rain_medium.png"
|
"weather_rain_medium.png"
|
||||||
}
|
},
|
||||||
|
glow = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
climate_api.register_weather(name, conditions, effects)
|
climate_api.register_weather(name, conditions, effects)
|
||||||
|
@ -24,22 +24,28 @@ effects["climate_api:hud_overlay"] = {
|
|||||||
color_correction = true
|
color_correction = true
|
||||||
}
|
}
|
||||||
|
|
||||||
effects["regional_weather:damage"] = {
|
effects["climate_api:damage"] = {
|
||||||
chance = 3,
|
rarity = 3,
|
||||||
value = 1
|
value = 1,
|
||||||
|
check = {
|
||||||
|
type = "raycast",
|
||||||
|
height = 0,
|
||||||
|
velocity = 0.3
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
effects["climate_api:particles"] = {
|
effects["climate_api:particles"] = {
|
||||||
min_pos = {x=-5, y=-4, z=-5},
|
boxsize = { x = 8, y = 4.5, z = 8 },
|
||||||
max_pos = {x= 5, y= 4.5, z= 5},
|
velocity = 0.6,
|
||||||
falling_speed=1.2,
|
acceleration = -0.2,
|
||||||
acceleration={x=0,y=0.8,z=0},
|
amount = 12,
|
||||||
amount=40,
|
expirationtime = 0.7,
|
||||||
exptime=1.8,
|
size = 25,
|
||||||
size=20,
|
texture = {
|
||||||
textures={
|
|
||||||
"weather_sandstorm.png",
|
"weather_sandstorm.png",
|
||||||
"weather_sandstorm.png^[transformR180"
|
"weather_sandstorm.png^[transformFY",
|
||||||
|
"weather_sandstorm.png^[transformR180",
|
||||||
|
"weather_sandstorm.png^[transformFYR180"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,19 +11,20 @@ local conditions = {
|
|||||||
|
|
||||||
local effects = {}
|
local effects = {}
|
||||||
|
|
||||||
effects["climate_api:particles"] = {
|
local textures = {}
|
||||||
min_pos = {x=-12, y=2, z=-12},
|
|
||||||
max_pos = {x= 12, y=8, z= 12},
|
|
||||||
amount = 4,
|
|
||||||
exptime = 7,
|
|
||||||
size = 1,
|
|
||||||
falling_speed = 0.85,
|
|
||||||
acceleration = {x=0, y=0.06, z=0},
|
|
||||||
textures = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
for i = 1,12,1 do
|
for i = 1,12,1 do
|
||||||
effects["climate_api:particles"].textures[i] = "weather_snowflake" .. i .. ".png"
|
textures[i] = "weather_snowflake" .. i .. ".png"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
effects["climate_api:particles"] = {
|
||||||
|
boxsize = { x = 24, y = 6, z = 24 },
|
||||||
|
v_offset = 2,
|
||||||
|
amount = 4,
|
||||||
|
expirationtime = 7,
|
||||||
|
velocity = 0.85,
|
||||||
|
acceleration = -0.06,
|
||||||
|
texture = textures,
|
||||||
|
glow = 6
|
||||||
|
}
|
||||||
|
|
||||||
climate_api.register_weather(name, conditions, effects)
|
climate_api.register_weather(name, conditions, effects)
|
||||||
|
@ -10,6 +10,13 @@ local conditions = {
|
|||||||
|
|
||||||
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_frost.png",
|
||||||
z_index = -100,
|
z_index = -100,
|
||||||
@ -17,24 +24,14 @@ effects["climate_api:hud_overlay"] = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
effects["climate_api:particles"] = {
|
effects["climate_api:particles"] = {
|
||||||
min_pos = {x=-8, y=3, z=-8},
|
boxsize = { x = 14, y = 3, z = 14 },
|
||||||
max_pos = {x= 8, y=6, z= 8},
|
v_offset = 3,
|
||||||
exptime=6,
|
expirationtime = 7.5,
|
||||||
size=10,
|
size = 15,
|
||||||
texture="weather_snow.png"
|
amount = 6,
|
||||||
|
velocity = 0.75,
|
||||||
|
texture = "weather_snow.png",
|
||||||
|
glow = 6
|
||||||
}
|
}
|
||||||
|
|
||||||
local function generate_effects(params)
|
climate_api.register_weather(name, conditions, effects)
|
||||||
local avg_humidity = 55
|
|
||||||
local intensity = params.humidity / avg_humidity
|
|
||||||
local override = {}
|
|
||||||
|
|
||||||
override["climate_api:particles"] = {
|
|
||||||
amount = 16 * 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)
|
|
||||||
|
37
init.lua
37
init.lua
@ -1,33 +1,42 @@
|
|||||||
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)
|
local function get_setting_bool(name, default, is_global)
|
||||||
local value = minetest.settings:get_bool("regional_weather_" .. name)
|
local prefix = ""
|
||||||
|
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)
|
local function get_setting_number(name, default, is_global)
|
||||||
local value = minetest.settings:get("regional_weather_" .. name)
|
local prefix = ""
|
||||||
|
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.damage = get_setting_bool("damage", true)
|
regional_weather.settings.player_speed = get_setting_bool("player_speed", true)
|
||||||
regional_weather.settings.snow = get_setting_bool("snow_layers", true)
|
regional_weather.settings.snow = get_setting_bool("snow_layers", 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", true)
|
||||||
regional_weather.settings.fire = get_setting_bool("fire", true)
|
regional_weather.settings.soil = get_setting_bool("soil", true)
|
||||||
regional_weather.settings.ice = get_setting_bool("ice", true)
|
regional_weather.settings.fire = get_setting_bool("fire", true)
|
||||||
regional_weather.settings.max_height = get_setting_number("max_height", 120)
|
regional_weather.settings.ice = get_setting_bool("ice", true)
|
||||||
regional_weather.settings.min_height = get_setting_number("min_height", -50)
|
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)
|
||||||
|
|
||||||
-- warn about clouds being overriden by MTG weather
|
-- warn about clouds being overriden by MTG weather
|
||||||
if climate_mod.settings.skybox
|
if climate_mod.settings.skybox
|
||||||
and minetest.get_modpath("weather")
|
and minetest.get_modpath("weather")
|
||||||
and get_setting_bool("enable_weather", true) then
|
and get_setting_bool("enable_weather", true, true) then
|
||||||
minetest.log("warning", "[Regional Weather] Disable MTG weather for the best experience")
|
minetest.log("warning", "[Regional Weather] Disable MTG weather for the best experience")
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -46,7 +55,6 @@ 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")
|
||||||
|
|
||||||
@ -55,4 +63,5 @@ 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/ice.lua")
|
||||||
|
dofile(modpath .. "/abms/pedology.lua")
|
||||||
dofile(modpath .. "/abms/soil.lua")
|
dofile(modpath .. "/abms/soil.lua")
|
||||||
|
4
mod.conf
4
mod.conf
@ -1,9 +1,9 @@
|
|||||||
name = regional_weather
|
name = regional_weather
|
||||||
title = Regional Weather
|
title = Regional Weather
|
||||||
author = TestificateMods
|
author = TestificateMods
|
||||||
release = 1
|
release = 100000
|
||||||
depends = climate_api
|
depends = climate_api
|
||||||
optional_depends = default, lightning, farming, fire
|
optional_depends = default, lightning, farming, fire, pedology
|
||||||
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.
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
[Features]
|
[Features]
|
||||||
|
|
||||||
# If set to true, sand storms and hail will damage affected players over time.
|
# If set to true, wind will boost or penalize player movements based on direction.
|
||||||
regional_weather_damage (Cause player damage) bool true
|
regional_weather_player_speed (Change movement speed based on wind) bool true
|
||||||
|
|
||||||
# If set to true, snow layers will stack up during snowy weather.
|
# If set to true, snow layers will stack up during snowy weather.
|
||||||
regional_weather_snow_layers (Place snow layers) bool true
|
regional_weather_snow_layers (Place snow layers) bool true
|
||||||
@ -13,19 +13,34 @@ regional_weather_ice (Freeze river water) bool true
|
|||||||
# If set to true, water puddles will form during rain or when snow layers have melted.
|
# If set to true, water puddles will form during rain or when snow layers have melted.
|
||||||
regional_weather_puddles (Place rain puddles) bool true
|
regional_weather_puddles (Place rain puddles) bool true
|
||||||
|
|
||||||
|
# If set to true, puddles will be marked as water and hydrate farmland.
|
||||||
|
regional_weather_puddles_water (Hydrate farmland near puddles) bool true
|
||||||
|
|
||||||
# If set to true, rain will cause dry farmland to turn wet.
|
# If set to true, rain will cause dry farmland to turn wet.
|
||||||
regional_weather_soil (Hydrate farmland) bool true
|
regional_weather_soil (Hydrate farmland during rain) bool true
|
||||||
|
|
||||||
# If set to true, fires will be extinguished during rain showers.
|
# If set to true, fires will be extinguished during rain showers.
|
||||||
regional_weather_fire (Extinguish fire) bool true
|
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]
|
[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.
|
# No visual effects will be applied above this height.
|
||||||
# This value defaults to normal cloud height (120 nodes above sea level).
|
# 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
|
||||||
|
|
||||||
# No visual effects will be applied below this height.
|
# Average height of cloud bases
|
||||||
# This will prevent unwanted visuals within large underground caves.
|
regional_weather_cloud_height (Cloud height) int 120
|
||||||
regional_weather_min_height (Minimum height of weather effects) int -50
|
|
||||||
|
# Maxmial variation of cloud height from base value
|
||||||
|
regional_weather_cloud_scale (Cloud height variation) int 40
|
Reference in New Issue
Block a user