Compare commits

..

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

13 changed files with 69 additions and 140 deletions

1
.gitignore vendored
View File

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

View File

@ -41,25 +41,11 @@ climate_mod.settings = {
particle_count = get_setting_number("particle_count", 1),
tick_speed = get_setting_number("tick_speed", 1),
volume = get_setting_number("volume", 1),
ceiling_checks = get_setting_number("ceiling_checks", 10)
ceiling_checks = get_setting_number("ceiling_checks", 10),
}
climate_mod.i18n = minetest.get_translator("climate_api")
-- attempt to disable MTG weather mod
if climate_mod.settings.skybox and minetest.get_modpath("weather") then
if weather ~= nil and weather.get ~= nil then
weather.get = function(player)
return {}
end
elseif minetest.settings:get_bool("enable_weather") then
-- old version with no API support
-- warn about clouds being overriden by MTG weather
minetest.log("warning", "[Regional Weather] " ..
climate_mod.i18n("Disable MTG weather for the best experience. Check the forum for more information."))
end
end
-- initialize empty registers
climate_mod.weathers = {}
climate_mod.effects = {}

View File

@ -57,7 +57,7 @@ minetest.register_chatcommand("weather", {
-- set base heat to increase or decrease global climate temperatures
minetest.register_chatcommand("set_base_heat", {
params = S("<heat>"),
params = "<heat>",
description = S("Override the weather algorithm's base heat"),
privs = { weather = true },
func = function(playername, param)
@ -73,7 +73,7 @@ minetest.register_chatcommand("set_base_heat", {
-- override global heat levels with given value
minetest.register_chatcommand("set_heat", {
params = S("<heat>"),
params = "<heat>",
description = S("Override the weather algorithm's heat"),
privs = { weather = true },
func = function(playername, param)
@ -93,7 +93,7 @@ minetest.register_chatcommand("set_heat", {
-- set base heat to increase or decrease global climate humidity
minetest.register_chatcommand("set_base_humidity", {
params = S("<humidity>"),
params = "<humidity>",
description = S("Override the weather algorithm's base humidity"),
privs = { weather = true },
func = function(playername, param)
@ -109,7 +109,7 @@ minetest.register_chatcommand("set_base_humidity", {
-- override global humidity with given value
minetest.register_chatcommand("set_humidity", {
params = S("<humidity>"),
params = "<humidity>",
description = S("Override the weather algorithm's humidity"),
privs = { weather = true },
func = function(playername, param)
@ -129,7 +129,7 @@ minetest.register_chatcommand("set_humidity", {
-- override wind direction and speed with given values
minetest.register_chatcommand("set_wind", {
params = S("<wind>"),
params = "<wind>",
description = S("Override the weather algorithm's windspeed"),
privs = { weather = true },
func = function(playername, param)
@ -171,7 +171,7 @@ minetest.register_chatcommand("weather_settings", {
-- force a weather preset or disable it
minetest.register_chatcommand("set_weather", {
params = S("<weather> <status>"),
params ="<weather> <status>",
description = S("Turn the specified weather preset on or off for all players or reset it to automatic"),
privs = { weather = true },
func = function(playername, param)
@ -230,17 +230,3 @@ minetest.register_chatcommand("weather_influences", {
end
end
})
-- used to debug downfall
minetest.register_chatcommand("explain_humidity", {
description = S("Explains how the humidity value got calculated"),
func = function(playername)
local base = climate_mod.settings.humidity
local biome = minetest.get_humidity((minetest.get_player_by_name(playername)):get_pos())
local random = climate_mod.state:get_float("humidity_random");
local random_base = climate_mod.state:get_float("humidity_base");
minetest.chat_send_player(playername, dump2(base, "base"))
minetest.chat_send_player(playername, dump2(biome, "biome"))
minetest.chat_send_player(playername, dump2(random, "random"))
end
})

View File

@ -9,7 +9,7 @@ function environment.get_heat(pos)
local height = climate_api.utility.rangelim((-pos.y + 10) / 15, -10, 10)
local time = climate_api.utility.normalized_cycle(minetest.get_timeofday()) * 0.6 + 0.7
local random = climate_mod.state:get_float("heat_random");
return base + ((biome + height) * time * random)
return (base + biome + height) * time * random
end
function environment.get_humidity(pos)
@ -19,7 +19,8 @@ function environment.get_humidity(pos)
local base = climate_mod.settings.humidity
local biome = minetest.get_humidity(pos)
local random = climate_mod.state:get_float("humidity_random");
return base + ((biome * 0.7 + 40 * 0.3) * random)
local random_base = climate_mod.state:get_float("humidity_base");
return (base + biome * 0.7 + random_base * 0.3) * random
end
function environment.get_wind(pos)

View File

@ -10,7 +10,7 @@ climate_api.register_influence("humidity",
climate_api.environment.get_humidity
)
climate_api.register_influence("biome_humidity",
climate_api.register_influence("base_humidity",
minetest.get_humidity
)

View File

@ -1,12 +1,9 @@
local GSCYCLE = 0.06 * climate_mod.settings.tick_speed -- only process event loop after this amount of time
local GSCYCLE = 0.03 * climate_mod.settings.tick_speed -- only process event loop after this amount of time
local WORLD_CYCLE = 30.00 * climate_mod.settings.tick_speed -- only update global environment influences after this amount of time
local gs_timer = 0
local world_timer = 0
minetest.register_globalstep(function(dtime)
local player_list = minetest.get_connected_players()
if #player_list == 0 then return end
gs_timer = gs_timer + dtime
world_timer = world_timer + dtime
@ -29,7 +26,7 @@ minetest.register_globalstep(function(dtime)
end
end
local current_effects = climate_mod.trigger.get_active_effects(player_list)
local current_effects = climate_mod.trigger.get_active_effects()
for name, effect in pairs(climate_mod.effects) do
local cycle = climate_mod.cycles[name].timespan * climate_mod.settings.tick_speed

View File

@ -1,5 +1,3 @@
local mod_lighting_monoid = minetest.get_modpath("lighting_monoid") ~= nil
local default_sky = {
sky_data = {
base_color = nil,
@ -76,11 +74,12 @@ local function set_skybox(playername, sky)
player:set_moon(sky.moon_data)
player:set_sun(sky.sun_data)
player:set_stars(sky.star_data)
local lighting = {
if player.set_lighting then
player:set_lighting({
shadows = { intensity = sky.light_data.shadow_intensity },
saturation = sky.light_data.saturation
}
lighting_monoid:add_change(player, lighting, "climate_api:merged_lighting")
})
end
end
function skybox.update(playername)

View File

@ -9,7 +9,7 @@ function trigger.get_global_environment()
end
function trigger.get_position_environment(pos)
local env = trigger.get_global_environment()
local env = table.copy(climate_mod.global_environment)
for influence, func in pairs(climate_mod.influences) do
env[influence] = func(pos)
end
@ -83,18 +83,20 @@ local function get_weather_effects(player, weather_config, env)
return effects
end
function trigger.get_active_effects(players)
function trigger.get_active_effects()
local environments = {}
local effects = {}
climate_mod.current_weather = {}
for _, player in ipairs(players) do
for _, player in ipairs(minetest.get_connected_players()) do
local pname = player:get_player_name()
local hp = player:get_hp()
-- skip weather presets for dead players
if hp ~= nil and hp > 0 then
local env = trigger.get_player_environment(player)
environments[pname] = env
environments[pname] = trigger.get_player_environment(player)
end
local env = environments[pname]
if env ~= nil then
for wname, wconfig in pairs(climate_mod.weathers) do
if is_weather_active(player, wname, env) then
if climate_mod.current_weather[pname] == nil then

View File

@ -6,8 +6,9 @@ local WIND_SCALE = 2
local HEAT_SPREAD = 400
local HEAT_SCALE = 0.3
local HUMIDITY_SPREAD = 150
local HUMIDITY_SCALE = 1
local HUMIDITY_TIMESCALE = 1
local HUMIDITY_SCALE = 0.5
local HUMIDITY_BASE_SPREAD = 800
local HUMIDITY_BASE_SCALE = 40
local nobj_wind_x
local nobj_wind_z
@ -46,14 +47,23 @@ local pn_heat = {
}
local pn_humidity = {
offset = 1,
offset = 0,
scale = HUMIDITY_SCALE,
spread = {x = HUMIDITY_SPREAD, y = HUMIDITY_SPREAD, z = HUMIDITY_SPREAD},
seed = 8374061,
octaves = 2,
persist = 0.5,
lacunarity = 2,
flags = "noeased"
lacunarity = 2
}
local pn_humidity_base = {
offset = 50,
scale = HUMIDITY_BASE_SCALE,
spread = {x = HUMIDITY_BASE_SPREAD, y = HUMIDITY_BASE_SPREAD, z = HUMIDITY_BASE_SPREAD},
seed = 3803465,
octaves = 2,
persist = 0.5,
lacunarity = 2
}
local function update_wind(timer)
@ -73,8 +83,11 @@ end
local function update_humidity(timer)
nobj_humidity = nobj_humidity or minetest.get_perlin(pn_humidity)
local n_humidity = nobj_humidity:get_2d({x = timer * HUMIDITY_TIMESCALE, y = 0})
local n_humidity = nobj_humidity:get_2d({x = timer, y = 0})
climate_mod.state:set_float("humidity_random", n_humidity)
nobj_humidity_base = nobj_humidity_base or minetest.get_perlin(pn_humidity_base)
local n_humidity_base = nobj_humidity_base:get_2d({x = timer, y = 0})
climate_mod.state:set_float("humidity_base", n_humidity_base)
end
function world.update_status(timer)

View File

@ -8,7 +8,6 @@ scorching=stechend heiße
pleasant=angenehme
chilly=kühle
It is a @1 @2 right now and humidity is at @3%.=Es sind gerade @1 @2 und die Luftfeuchtigkeit liegt bei @3%.
<heat>=
Override the weather algorithm's base heat=Überschreibe die Standard-Temperatur
Provide a number to modify the base heat=Gebe eine Zahl an, um die Standard-Temperatur anzupassen
Base heat changed=Die Standard-Temperatur wurde geändert
@ -16,7 +15,6 @@ Override the weather algorithm's heat=Überschreibe die tatsächliche Temperatur
Provide a number to modify the heat=Gebe eine Zahl an, um die Temperatur anzupassen
Heat value reset=Die Temperatur wurde zurückgesetzt
Heat value changed=Die Temperatur wurde geändert
<humidity>=
Override the weather algorithm's base humidity=Überschreibe die Standard-Luftfeuchtigkeit
Provide a number to modify the base humidity=Gebe eine Zahl an, um die Standard-Temperatur anzupassen
Base humidity changed=Die Standard-Luftfeuchtigkeit wurde geändert
@ -24,7 +22,6 @@ Override the weather algorithm's humidity=Überschreibe die tatsächliche Luftfe
Provide a number to modify the humidity=Gebe eine Zahl an, um die Luftfeuchtigkeit anzupassen
Humidity value reset=Die Luftfeuchtigkeit wurde zurückgesetzt
Humidity value changed=Die Luftfeuchtigkeit wurde geändert
<wind>=
Override the weather algorithm's windspeed=Überschreibe die Windgeschwindigkeit
Provide a vector of two numbers to modify the wind=Gebe einen Vektor aus zwei Zahlen an, um die Windgeschwindigkeit anzupassen
Wind reset=Der Wind wurde zurückgesetzt
@ -32,7 +29,6 @@ Invalid wind configuration=Fehlerhafte Windkonfiguration
Wind changed=Der Wind wurde geändert
Print the active Climate API configuration=Betrachte die Einstellungen für Climate API
Current Settings=Aktuelle Einstellungen
<weather> <status>=
Turn the specified weather preset on or off for all players or reset it to automatic=Schalte für alle Spieler die angegebene Wetterklasse an, aus oder schalte sie auf automatisch
Unknown weather preset=Unbekannte Wetterklasse
Invalid weather status. Set the preset to either on, off or auto.=Unbekannter Status. Setze die Wetterklasse entweder auf on, off oder auto
@ -41,4 +37,3 @@ Prints which weather presets are enforced or disabled=Betrachte, welche Wetterkl
Current activation rules:=Aktuelle Aktivierungsregeln
Prints which weather influences cause your current weather=Betrachte, welche Umwelteinflüsse das aktuelle Wetter hervorrufen
Current influences rules:=Aktuelle Einflussfaktoren
Explains how the humidity value got calculated=

View File

@ -1,44 +0,0 @@
# textdomain: climate_api
Make changes to the current weather=Ŝanĝi la nunan veteron
Display weather information=Montri veterajn informojn
The following weather presets are active for you:=La jenaj veteragordoj estas ŝaltitaj por vi:
Your sky is clear. No weather presets are currently active.=La suno brilas. Neniu veteragordo estas ŝaltita.
As a result, the following environment effects are applied:=Pro tio, la jenaj efikoj estas aktivaj:
scorching=Varmas
pleasant=Komfortas
chilly=Malvarmas
It is a @1 @2 right now and humidity is at @3%.=@1 je @2 ĝuste nun, kun aermalsekeco je @3 gradoj.
<heat>=<varm>
Override the weather algorithm's base heat=Anstataŭigi la bazan varmecon de la vetera algoritmo
Provide a number to modify the base heat=Doni nombron anstataŭiguntan la bazan varmecon
Base heat changed=Baza varmeco ŝanĝita
Override the weather algorithm's heat=Anstataŭigi la varmecon de la vetera algoritmo
Provide a number to modify the heat=Doni nombron anstataŭiguntan la varmecon
Heat value reset=Varmeco malagordita
Heat value changed=Varmeco ŝanĝita
<humidity>=<aermalsek>
Override the weather algorithm's base humidity=Anstataŭigi la bazan aermalsekecon de la vetera algoritmo
Provide a number to modify the base humidity=Doni nombron anstataŭiguntan la bazan aermalsekecon
Base humidity changed=Baza aermalsekeco ŝanĝita
Override the weather algorithm's humidity=Anstataŭigi la aermalsekecon de la vetera algoritmo
Provide a number to modify the humidity=Doni nombron anstataŭiguntan la aermalsekecon
Humidity value reset=Aermalsekeco malagordita
Humidity value changed=Aermalsekeca ŝanĝita
<wind>=<vent>
Override the weather algorithm's windspeed=Anstataŭigi la ventforton de la vetera algoritmo
Provide a vector of two numbers to modify the wind=Doni nombroparon anstataŭiguntan la ventoforton
Wind reset=Ventoforto malagordita
Invalid wind configuration=Nevalida ventagordo
Wind changed=Vento ŝanĝita
Print the active Climate API configuration=Presi la nunan agordon por Climate API
Current Settings=Nunaj Agordoj
<weather> <status>=<veter> <ŝaltec>
Turn the specified weather preset on or off for all players or reset it to automatic=Agordi veteragordon por ĉiuj ludantoj: «on» (ŝalti), «off» (malŝalti), «reset» (malfari)
Unknown weather preset=Nekonata veteragordo
Invalid weather status. Set the preset to either on, off or auto.=Nevalida veterostato. Agordu la veteragordon al «on» (ŝalti), «off» (malŝalti), aŭ «auto» (memagi).
Weather @1 successfully set to @2=Vetero @1 sukcese agordita al @2
Prints which weather presets are enforced or disabled=Listigas veterstatojn laŭ ŝaltiteco
Current activation rules:=Nunaj aktivigaj reguloj:
Prints which weather influences cause your current weather=Presas la influojn kiuj venigis la nunan veteron
Current influences rules:=Nunaj influaj reguloj:
Explains how the humidity value got calculated=Klarigas kiel la aermalseka valoro kalkuliĝis

View File

@ -8,7 +8,6 @@ scorching=
pleasant=
chilly=
It is a @1 @2 right now and humidity is at @3%.=
<heat>=
Override the weather algorithm's base heat=
Provide a number to modify the base heat=
Base heat changed=
@ -16,7 +15,6 @@ Override the weather algorithm's heat=
Provide a number to modify the heat=
Heat value reset=
Heat value changed=
<humidity>=
Override the weather algorithm's base humidity=
Provide a number to modify the base humidity=
Base humidity changed=
@ -24,7 +22,6 @@ Override the weather algorithm's humidity=
Provide a number to modify the humidity=
Humidity value reset=
Humidity value changed=
<wind>=
Override the weather algorithm's windspeed=
Provide a vector of two numbers to modify the wind=
Wind reset=
@ -32,7 +29,6 @@ Invalid wind configuration=
Wind changed=
Print the active Climate API configuration=
Current Settings=
<weather> <status>=
Turn the specified weather preset on or off for all players or reset it to automatic=
Unknown weather preset=
Invalid weather status. Set the preset to either on, off or auto.=
@ -41,4 +37,3 @@ Prints which weather presets are enforced or disabled=
Current activation rules:=
Prints which weather influences cause your current weather=
Current influences rules:=
Explains how the humidity value got calculated=

View File

@ -1,8 +1,8 @@
name = climate_api
title = Climate API
author = TestificateMods
depends = lighting_monoid
optional_depends = player_monoids, playerphysics, pova, weather
release = 10001
optional_depends = player_monoids, playerphysics, pova
description = """
A powerful engine for weather presets and visual effects.
Use the regional climate to set up different effects for different regions.