mirror of
https://github.com/t-affeldt/climate_api.git
synced 2024-12-22 17:00:36 +01:00
Add skybox merging utility, remove date bases heat, tweak noise settings
This commit is contained in:
parent
c9d0cfca21
commit
e24b0340e5
@ -2,13 +2,10 @@
|
|||||||
|
|
||||||
## Required for Beta
|
## Required for Beta
|
||||||
- Write helpful README
|
- Write helpful README
|
||||||
- Refactor skybox effect and implement ranking system
|
|
||||||
- Rework Moon Phases mod to be compatible and to include varying sky brightness
|
- Rework Moon Phases mod to be compatible and to include varying sky brightness
|
||||||
|
|
||||||
## Planned for first release
|
## Planned for first release
|
||||||
- Set effects on player join
|
|
||||||
- Improve value structures of particle effects
|
- Improve value structures of particle effects
|
||||||
- Make sounds adjust to changes by weather presets
|
|
||||||
- Find good values for weather conditions
|
- Find good values for weather conditions
|
||||||
- Write documentation on how to add weathers and effects
|
- Write documentation on how to add weathers and effects
|
||||||
- Ability to register global influences that are the same for any position
|
- Ability to register global influences that are the same for any position
|
||||||
@ -16,10 +13,8 @@
|
|||||||
## Nice to have
|
## Nice to have
|
||||||
- Assign meta data (like "downfall", "wind", etc.) to weather presets
|
- Assign meta data (like "downfall", "wind", etc.) to weather presets
|
||||||
- Optimize performance by replacing some particles with animated texture planes
|
- Optimize performance by replacing some particles with animated texture planes
|
||||||
- Make switches between effects more smooth
|
|
||||||
- Adjust size of particle boxes based on player speed
|
- Adjust size of particle boxes based on player speed
|
||||||
- Generate wind based on speed and yaw instead of x and z values
|
- Generate wind based on speed and yaw instead of x and z values
|
||||||
- A flag indicating wind direction
|
|
||||||
|
|
||||||
## Future Plans & Ideas
|
## Future Plans & Ideas
|
||||||
- Complete season system
|
- Complete season system
|
||||||
@ -47,3 +42,4 @@
|
|||||||
- standing near fire will warm up
|
- standing near fire will warm up
|
||||||
- craftable warm clothes
|
- craftable warm clothes
|
||||||
- metal armor will worsen heat issues
|
- metal armor will worsen heat issues
|
||||||
|
- A flag indicating wind direction
|
@ -1,45 +1,31 @@
|
|||||||
if not climate_mod.settings.skybox then return end
|
if not climate_mod.settings.skybox then return end
|
||||||
|
|
||||||
local EFFECT_NAME = "climate_api:skybox"
|
local EFFECT_NAME = "climate_api:skybox"
|
||||||
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
|
||||||
local sky_defaults = dofile(modpath .. "/lib/sky_defaults.lua")
|
|
||||||
|
|
||||||
local function set_skybox(player, sky)
|
local function handle_effect(player_data, prev_data)
|
||||||
if not player.get_stars then return end
|
for playername, data in pairs(prev_data) do
|
||||||
player:set_sky(sky.sky_data)
|
for weather, _ in pairs(data) do
|
||||||
player:set_clouds(sky.cloud_data)
|
if player_data[playername] == nil or player_data[playername][weather] == nil then
|
||||||
player:set_moon(sky.moon_data)
|
climate_api.skybox.remove_layer(playername, weather)
|
||||||
player:set_sun(sky.sun_data)
|
end
|
||||||
player:set_stars(sky.star_data)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function remove_skybox(player)
|
|
||||||
if not player.get_stars then return end
|
|
||||||
player:set_sky(sky_defaults.sky_data)
|
|
||||||
player:set_clouds(sky_defaults.cloud_data)
|
|
||||||
player:set_moon(sky_defaults.moon_data)
|
|
||||||
player:set_sun(sky_defaults.sun_data)
|
|
||||||
player:set_stars(sky_defaults.star_data)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function handle_effect(player_data)
|
|
||||||
for playername, data in pairs(player_data) do
|
|
||||||
local player = minetest.get_player_by_name(playername)
|
|
||||||
local sky = table.copy(sky_defaults)
|
|
||||||
for weather, value in pairs(data) do
|
|
||||||
sky = climate_api.utility.merge_tables(sky, value)
|
|
||||||
end
|
end
|
||||||
set_skybox(player, sky)
|
end
|
||||||
|
for playername, data in pairs(player_data) do
|
||||||
|
for weather, value in pairs(data) do
|
||||||
|
climate_api.skybox.add_layer(playername, weather, value)
|
||||||
|
end
|
||||||
|
climate_api.skybox.update_skybox(playername)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function remove_effect(player_data)
|
local function remove_effect(player_data)
|
||||||
for playername, data in pairs(player_data) do
|
for playername, data in pairs(player_data) do
|
||||||
local player = minetest.get_player_by_name(playername)
|
for weather, _ in pairs(data) do
|
||||||
remove_skybox(player)
|
climate_api.skybox.remove_layer(playername, weather)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
climate_api.register_effect(EFFECT_NAME, handle_effect, "tick")
|
climate_api.register_effect(EFFECT_NAME, handle_effect, "tick")
|
||||||
climate_api.register_effect(EFFECT_NAME, remove_effect, "stop")
|
climate_api.register_effect(EFFECT_NAME, remove_effect, "stop")
|
||||||
--climate_api.set_effect_cycle("climate_api:skybox", climate_api.LONG_CYCLE)
|
climate_api.set_effect_cycle("climate_api:skybox", climate_api.MEDIUM_CYCLE)
|
2
init.lua
2
init.lua
@ -27,6 +27,7 @@ climate_mod.settings = {
|
|||||||
wind = get_setting_bool("wind", true),
|
wind = get_setting_bool("wind", true),
|
||||||
seasons = get_setting_bool("seasons", true),
|
seasons = get_setting_bool("seasons", true),
|
||||||
fahrenheit = get_setting_bool("fahrenheit", false),
|
fahrenheit = get_setting_bool("fahrenheit", false),
|
||||||
|
block_updates = get_setting_bool("block_updates", true),
|
||||||
heat = get_setting_number("heat_base", 0),
|
heat = get_setting_number("heat_base", 0),
|
||||||
humidity = get_setting_number("humidity_base", 0),
|
humidity = get_setting_number("humidity_base", 0),
|
||||||
time_spread = get_setting_number("time_spread", 1),
|
time_spread = get_setting_number("time_spread", 1),
|
||||||
@ -49,6 +50,7 @@ climate_mod.forced_wind = nil
|
|||||||
climate_mod.state = dofile(modpath .. "/lib/datastorage.lua")
|
climate_mod.state = dofile(modpath .. "/lib/datastorage.lua")
|
||||||
climate_api = dofile(modpath .. "/lib/api.lua")
|
climate_api = dofile(modpath .. "/lib/api.lua")
|
||||||
climate_api.utility = dofile(modpath .. "/lib/api_utility.lua")
|
climate_api.utility = dofile(modpath .. "/lib/api_utility.lua")
|
||||||
|
climate_api.skybox = dofile(modpath .. "/lib/skybox_merger.lua")
|
||||||
dofile(modpath .. "/lib/influences.lua")
|
dofile(modpath .. "/lib/influences.lua")
|
||||||
climate_api.environment = dofile(modpath .. "/lib/environment.lua")
|
climate_api.environment = dofile(modpath .. "/lib/environment.lua")
|
||||||
--climate_api = dofile(modpath .. "/lib/influences.lua")
|
--climate_api = dofile(modpath .. "/lib/influences.lua")
|
||||||
|
@ -38,6 +38,8 @@ function api.register_influence(name, func)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function api.register_abm(config)
|
function api.register_abm(config)
|
||||||
|
if not climate_mod.settings.block_updates then return end
|
||||||
|
|
||||||
local conditions = config.conditions
|
local conditions = config.conditions
|
||||||
local action = config.action
|
local action = config.action
|
||||||
local pos_override = config.pos_override
|
local pos_override = config.pos_override
|
||||||
|
@ -5,13 +5,6 @@ local function get_heat_time()
|
|||||||
return climate_api.utility.normalized_cycle(time) * 0.6 + 0.7
|
return climate_api.utility.normalized_cycle(time) * 0.6 + 0.7
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_heat_calendar()
|
|
||||||
-- heat center in August instead of June
|
|
||||||
local day = minetest.get_day_count()
|
|
||||||
local progression = ((day + 61) % 365) / 365
|
|
||||||
return climate_api.utility.normalized_cycle(progression) * 0.6 + 0.7
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_heat_height(y)
|
local function get_heat_height(y)
|
||||||
return climate_api.utility.rangelim((-y + 10) / 15, -10, 10)
|
return climate_api.utility.rangelim((-y + 10) / 15, -10, 10)
|
||||||
end
|
end
|
||||||
@ -21,9 +14,8 @@ function environment.get_heat(pos)
|
|||||||
local biome = minetest.get_heat(pos)
|
local biome = minetest.get_heat(pos)
|
||||||
local height = get_heat_height(pos.y)
|
local height = get_heat_height(pos.y)
|
||||||
local time = get_heat_time()
|
local time = get_heat_time()
|
||||||
local date = get_heat_calendar()
|
|
||||||
local random = climate_mod.state:get_float("heat_random");
|
local random = climate_mod.state:get_float("heat_random");
|
||||||
return (base + biome + height) * time * date * random
|
return (base + biome + height) * time * random
|
||||||
end
|
end
|
||||||
|
|
||||||
function environment.get_humidity(pos)
|
function environment.get_humidity(pos)
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
return {
|
|
||||||
sky_data = {
|
|
||||||
base_color = nil,
|
|
||||||
type = "regular",
|
|
||||||
textures = nil,
|
|
||||||
clouds = true,
|
|
||||||
sky_color = {
|
|
||||||
day_sky = "#8cbafa",
|
|
||||||
day_horizon = "#9bc1f0",
|
|
||||||
dawn_sky = "#b4bafa",
|
|
||||||
dawn_horizon = "#bac1f0",
|
|
||||||
night_sky = "#006aff",
|
|
||||||
night_horizon = "#4090ff",
|
|
||||||
indoors = "#646464",
|
|
||||||
fog_tint_type = "default"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
cloud_data = {
|
|
||||||
density = 0.4,
|
|
||||||
color = "#fff0f0e5",
|
|
||||||
ambient = "#000000",
|
|
||||||
height = 120,
|
|
||||||
thickness = 16,
|
|
||||||
speed = {x=0, z=-2}
|
|
||||||
},
|
|
||||||
sun_data = {
|
|
||||||
visible = true,
|
|
||||||
texture = "sun.png",
|
|
||||||
tonemap = "sun_tonemap.png",
|
|
||||||
sunrise = "sunrisebg.png",
|
|
||||||
sunrise_visible = true,
|
|
||||||
scale = 1
|
|
||||||
},
|
|
||||||
moon_data = {
|
|
||||||
visible = true,
|
|
||||||
texture = "moon.png",
|
|
||||||
tonemap = "moon_tonemap.png",
|
|
||||||
scale = 1
|
|
||||||
},
|
|
||||||
star_data = {
|
|
||||||
visible = true,
|
|
||||||
count = 1000,
|
|
||||||
star_color = "#ebebff69",
|
|
||||||
scale = 1
|
|
||||||
}
|
|
||||||
}
|
|
109
lib/skybox_merger.lua
Normal file
109
lib/skybox_merger.lua
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
local default_sky = {
|
||||||
|
sky_data = {
|
||||||
|
base_color = nil,
|
||||||
|
type = "regular",
|
||||||
|
textures = nil,
|
||||||
|
clouds = true,
|
||||||
|
sky_color = {
|
||||||
|
day_sky = "#8cbafa",
|
||||||
|
day_horizon = "#9bc1f0",
|
||||||
|
dawn_sky = "#b4bafa",
|
||||||
|
dawn_horizon = "#bac1f0",
|
||||||
|
night_sky = "#006aff",
|
||||||
|
night_horizon = "#4090ff",
|
||||||
|
indoors = "#646464",
|
||||||
|
fog_tint_type = "default"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
cloud_data = {
|
||||||
|
density = 0.4,
|
||||||
|
color = "#fff0f0e5",
|
||||||
|
ambient = "#000000",
|
||||||
|
height = 120,
|
||||||
|
thickness = 16,
|
||||||
|
speed = {x=0, z=-2}
|
||||||
|
},
|
||||||
|
sun_data = {
|
||||||
|
visible = true,
|
||||||
|
texture = "",
|
||||||
|
tonemap = "sun_tonemap.png",
|
||||||
|
sunrise = "sunrisebg.png",
|
||||||
|
sunrise_visible = true,
|
||||||
|
scale = 1
|
||||||
|
},
|
||||||
|
moon_data = {
|
||||||
|
visible = true,
|
||||||
|
texture = "",
|
||||||
|
tonemap = "moon_tonemap.png",
|
||||||
|
scale = 1
|
||||||
|
},
|
||||||
|
star_data = {
|
||||||
|
visible = true,
|
||||||
|
count = 1000,
|
||||||
|
star_color = "#ebebff69",
|
||||||
|
scale = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
local skybox = {}
|
||||||
|
local layers = {}
|
||||||
|
|
||||||
|
-- from https://stackoverflow.com/a/29133654
|
||||||
|
-- merges two tables together
|
||||||
|
-- if in conflict, b will override values of a
|
||||||
|
local function merge_tables(a, b)
|
||||||
|
if type(a) == "table" and type(b) == "table" then
|
||||||
|
for k,v in pairs(b) do
|
||||||
|
if type(v)=="table" and type(a[k] or false)=="table" then
|
||||||
|
merge_tables(a[k],v)
|
||||||
|
else a[k]=v end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return a
|
||||||
|
end
|
||||||
|
|
||||||
|
local function set_skybox(playername, sky)
|
||||||
|
local player = minetest.get_player_by_name(playername)
|
||||||
|
if not player.get_stars then return end
|
||||||
|
player:set_sky(sky.sky_data)
|
||||||
|
player:set_clouds(sky.cloud_data)
|
||||||
|
player:set_moon(sky.moon_data)
|
||||||
|
player:set_sun(sky.sun_data)
|
||||||
|
player:set_stars(sky.star_data)
|
||||||
|
end
|
||||||
|
|
||||||
|
function skybox.update_skybox(playername)
|
||||||
|
local p_layers = layers[playername]
|
||||||
|
local sky = table.copy(default_sky)
|
||||||
|
if p_layers == nil then p_layers = {} end
|
||||||
|
local numbered_layers = {}
|
||||||
|
for layer, values in pairs(p_layers) do
|
||||||
|
table.insert(numbered_layers, values)
|
||||||
|
end
|
||||||
|
table.sort(numbered_layers, function(left, right)
|
||||||
|
if left.priority == nil then left.priority = 1 end
|
||||||
|
if right.priority == nil then right.priority = 1 end
|
||||||
|
return left.priority < right.priority
|
||||||
|
end)
|
||||||
|
for i=1,#numbered_layers do
|
||||||
|
sky = merge_tables(sky, numbered_layers[i])
|
||||||
|
end
|
||||||
|
set_skybox(playername, sky)
|
||||||
|
end
|
||||||
|
|
||||||
|
function skybox.add_layer(playername, name, sky)
|
||||||
|
if layers[playername] == nil then layers[playername] = {} end
|
||||||
|
layers[playername][name] = sky
|
||||||
|
end
|
||||||
|
|
||||||
|
function skybox.remove_layer(playername, name)
|
||||||
|
if layers[playername] == nil or layers[playername][name] == nil then return end
|
||||||
|
layers[playername][name] = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.register_on_leaveplayer(function(player)
|
||||||
|
local playername = player:get_player_name()
|
||||||
|
layers[playername] = nil
|
||||||
|
end)
|
||||||
|
|
||||||
|
return skybox
|
@ -2,11 +2,11 @@ local world = {}
|
|||||||
|
|
||||||
local WIND_SPREAD = 600
|
local WIND_SPREAD = 600
|
||||||
local WIND_SCALE = 2
|
local WIND_SCALE = 2
|
||||||
local HEAT_SPREAD = 200
|
local HEAT_SPREAD = 400
|
||||||
local HEAT_SCALE = 0.3
|
local HEAT_SCALE = 0.3
|
||||||
local HUMIDITY_SPREAD = 60
|
local HUMIDITY_SPREAD = 150
|
||||||
local HUMIDITY_SCALE = 0.5
|
local HUMIDITY_SCALE = 0.5
|
||||||
local HUMIDITY_BASE_SPREAD = 600
|
local HUMIDITY_BASE_SPREAD = 800
|
||||||
local HUMIDITY_BASE_SCALE = 40
|
local HUMIDITY_BASE_SCALE = 40
|
||||||
|
|
||||||
local nobj_wind_x
|
local nobj_wind_x
|
||||||
|
BIN
screenshot.2.png
BIN
screenshot.2.png
Binary file not shown.
Before Width: | Height: | Size: 2.0 MiB |
BIN
screenshot.3.png
BIN
screenshot.3.png
Binary file not shown.
Before Width: | Height: | Size: 2.0 MiB |
@ -1,13 +1,62 @@
|
|||||||
|
[Features]
|
||||||
|
|
||||||
|
# If set to true, weather effects (like rain) are allowed to render particles.
|
||||||
|
# Deactivating this feature will prevent some presets from being visible.
|
||||||
|
# For performance considerations it is recommended to decrease the amount of particles instead.
|
||||||
climate_api_particles (Show particle effects) bool true
|
climate_api_particles (Show particle effects) bool true
|
||||||
climate_api_skybox (Allow weather effects to modify the skybox) bool true
|
|
||||||
climate_api_sound (Allow weather presets to play ambient sounds) bool true
|
# If set to true, weather effects are allowed to modify a player's sky.
|
||||||
climate_api_hud_overlay (Allow weather presets to display a HUD overlay) bool true
|
# This includes skybox, sun, moon, and clouds (also used for fog effects).
|
||||||
climate_api_wind (Allow wind to angle rainfall) bool true
|
# Running this mod on Minetest 5.1.2 or earlier versions will automatically disable this feature.
|
||||||
climate_api_seasons (Change global temperature based on an annual cycle) bool true
|
climate_api_skybox (Override the skybox) bool true
|
||||||
|
|
||||||
|
# If set to true, weather effects are allowed to play sound loops.
|
||||||
|
# You can also adjust sound levels instead of deactivating this feature completely.
|
||||||
|
# Setting this value to false will be slightly more performant than setting the volume to zero.
|
||||||
|
climate_api_sound (Play ambient sound loops) bool true
|
||||||
|
|
||||||
|
# If set to true, weather effects are allowed to render an image on top of the gameplay.
|
||||||
|
# This is usually an optional effect used to increase immersion (like a frozen-over camera in a snow storm).
|
||||||
|
climate_api_hud_overlay (Display HUD overlays) bool true
|
||||||
|
|
||||||
|
# If set to true, weather packs are allowed to register node update handlers.
|
||||||
|
# These can be used to dynamically place snow layers, melt ice, or hydrate soil.
|
||||||
|
climate_api_block_updates (Dynamically modify nodes) bool true
|
||||||
|
|
||||||
|
|
||||||
|
[Environment]
|
||||||
|
|
||||||
|
# This value will be added to all biome's base temperatures before applying random modifiers.
|
||||||
|
# Every unit here will increase the global base heat by one degree Fahrenheit.
|
||||||
|
# Negative values will cool down global base heat respectively.
|
||||||
climate_api_heat_base (Global base temperature) float 0
|
climate_api_heat_base (Global base temperature) float 0
|
||||||
|
|
||||||
|
# This value will be added to all biome's base humidity before applying random modifiers.
|
||||||
|
# Every unit here will increase the global base humidity by one percent.
|
||||||
|
# Negative values will dry up global base humidity respectively.
|
||||||
climate_api_humidity_base (Global base humidity) float 0
|
climate_api_humidity_base (Global base humidity) float 0
|
||||||
climate_api_time_spread (Regulates how quickly the weather changes) float 1 0.1 10
|
|
||||||
climate_api_particle_count (Multiplicator for used particles) float 1 0.1 2
|
# This value regulates how quickly environment factors like heat, humidity and wind are changing.
|
||||||
climate_api_fahrenheit (Show degrees in Fahrenheit instead of Celsius) bool false
|
# A value of 2 will double the speed at which weather presets change.
|
||||||
|
# A value of 0.5 will half the speed respectively.
|
||||||
|
climate_api_time_spread (Time rate of weather changes) float 1 0.1 10
|
||||||
|
|
||||||
|
# This value regulates how often weather presets are recalculated.
|
||||||
|
# Higher values will result in smoother transitions between effects as well as faster response times to traveling players.
|
||||||
|
# Lower values will significantly increase overall performance at the cost of rougher looking effects.
|
||||||
climate_api_tick_speed (Update speed of weather effects) float 1 0.1 10
|
climate_api_tick_speed (Update speed of weather effects) float 1 0.1 10
|
||||||
|
|
||||||
|
|
||||||
|
[Preferences]
|
||||||
|
|
||||||
|
# This value regulated how many particles will be spawned.
|
||||||
|
# A value of 1 will use the recommended amount of particles.
|
||||||
|
# Lower values can possible increase performance.
|
||||||
|
climate_api_particle_count (Multiplicator for used particles) float 1 0.1 2
|
||||||
|
|
||||||
|
# If set to true, temperature information in /weather command will be displayed in Fahrenheit.
|
||||||
|
climate_api_fahrenheit (Show degrees in Fahrenheit instead of Celsius) bool false
|
||||||
|
|
||||||
|
# This value regulates overall sound volume.
|
||||||
|
# A value of 2 will double the volume whereas a value of 0.5 will reduce the volume by half.
|
||||||
climate_api_volume (Volume of sound effects) float 1 0 10
|
climate_api_volume (Volume of sound effects) float 1 0 10
|
Loading…
Reference in New Issue
Block a user