mirror of
https://github.com/t-affeldt/climate_api.git
synced 2025-06-30 15:30:43 +02:00
Various adjustments and fixes
This commit is contained in:
@ -3,9 +3,8 @@ local api = {}
|
||||
|
||||
-- define various standard effect cycle lengths
|
||||
api.SHORT_CYCLE = 0 -- for particles and fast animations (use GSCYCLE)
|
||||
api.DEFAULT_CYCLE = 0.1 -- for most effect types
|
||||
api.MEDIUM_CYCLE = 2.0 -- for ressource intensive tasks
|
||||
api.LONG_CYCLE = 5.0 -- for write operations and skybox changes
|
||||
api.DEFAULT_CYCLE = 2.0 -- for most effect types
|
||||
api.LONG_CYCLE = 5.0 -- for ressource intensive tasks or timed effects
|
||||
|
||||
-- register new weather presets (like rain)
|
||||
-- @param name <string> Unique preset name, ideally prefixed
|
||||
|
@ -1,5 +1,6 @@
|
||||
local mod_player_monoids = minetest.get_modpath("player_monoids") ~= nil
|
||||
local mod_playerphysics = minetest.get_modpath("playerphysics") ~= nil
|
||||
local mod_pova = minetest.get_modpath("pova") ~= nil
|
||||
|
||||
local utility = {}
|
||||
|
||||
@ -33,31 +34,5 @@ function utility.normalized_cycle(value)
|
||||
return math.cos((2 * value + 1) * math.pi) / 2 + 0.5
|
||||
end
|
||||
|
||||
-- override player physics
|
||||
-- use utility mod if possible to avoid conflict
|
||||
function utility.add_physics(id, player, effect, value)
|
||||
if mod_player_monoids then
|
||||
player_monoids[effect]:add_change(player, value, id)
|
||||
elseif mod_playerphysics then
|
||||
playerphysics.add_physics_factor(player, effect, id, value)
|
||||
else
|
||||
local override = {}
|
||||
override[effect] = value
|
||||
player:set_physics_override(override)
|
||||
end
|
||||
end
|
||||
|
||||
-- reset player phsysics to normal
|
||||
function utility.remove_physics(id, player, effect)
|
||||
if mod_player_monoids then
|
||||
player_monoids[effect]:del_change(player, id)
|
||||
elseif mod_playerphysics then
|
||||
playerphysics.remove_physics_factor(player, effect, id)
|
||||
else
|
||||
local override = {}
|
||||
override[effect] = 1
|
||||
player:set_physics_override(override)
|
||||
end
|
||||
end
|
||||
|
||||
return utility
|
||||
|
@ -1,13 +1,12 @@
|
||||
local state = minetest.get_mod_storage()
|
||||
|
||||
if not state:contains("noise_timer") then
|
||||
if not state:contains("heat_random") then
|
||||
state:from_table({
|
||||
heat_random = 1,
|
||||
humidity_random = 1,
|
||||
humidity_base = 50,
|
||||
wind_x = 0.5,
|
||||
wind_z = 0.5,
|
||||
noise_timer = 0
|
||||
wind_z = 0.5
|
||||
})
|
||||
end
|
||||
|
||||
|
@ -1,18 +1,18 @@
|
||||
climate_api.register_influence("heat", function(pos)
|
||||
return climate_api.environment.get_heat(pos)
|
||||
end)
|
||||
climate_api.register_influence("heat",
|
||||
climate_api.environment.get_heat
|
||||
)
|
||||
|
||||
climate_api.register_influence("base_heat", function(pos)
|
||||
return minetest.get_heat(pos)
|
||||
end)
|
||||
climate_api.register_influence("base_heat",
|
||||
minetest.get_heat
|
||||
)
|
||||
|
||||
climate_api.register_influence("humidity", function(pos)
|
||||
return climate_api.environment.get_humidity(pos)
|
||||
end)
|
||||
climate_api.register_influence("humidity",
|
||||
climate_api.environment.get_humidity
|
||||
)
|
||||
|
||||
climate_api.register_influence("base_humidity", function(pos)
|
||||
return minetest.get_humidity(pos)
|
||||
end)
|
||||
climate_api.register_influence("base_humidity",
|
||||
minetest.get_humidity
|
||||
)
|
||||
|
||||
-- see https://en.wikipedia.org/wiki/Dew_point#Simple_approximation
|
||||
climate_api.register_influence("dewpoint", function(pos)
|
||||
@ -58,6 +58,6 @@ climate_api.register_influence("daylight", function(pos)
|
||||
return minetest.env:get_node_light(pos, 0.5)
|
||||
end)
|
||||
|
||||
climate_api.register_global_influence("time", function()
|
||||
return minetest.get_timeofday()
|
||||
end)
|
||||
climate_api.register_global_influence("time",
|
||||
minetest.get_timeofday()
|
||||
)
|
@ -1,5 +1,5 @@
|
||||
local GSCYCLE = 0.03 * climate_mod.settings.tick_speed -- only process event loop after this time amount
|
||||
local WORLD_CYCLE = 15.00 * climate_mod.settings.tick_speed -- only update global environment influences after this time amount
|
||||
local GSCYCLE = 0.03 * climate_mod.settings.tick_speed -- only process event loop after this amount of time
|
||||
local WORLD_CYCLE = 15.00 * climate_mod.settings.tick_speed -- only update global environment influences after this amount of time
|
||||
|
||||
local gs_timer = 0
|
||||
local world_timer = 0
|
||||
@ -10,10 +10,8 @@ minetest.register_globalstep(function(dtime)
|
||||
if gs_timer + dtime < GSCYCLE then return else gs_timer = 0 end
|
||||
|
||||
if world_timer >= WORLD_CYCLE then
|
||||
local noise_timer = climate_mod.state:get_float("noise_timer") + world_timer
|
||||
world_timer = 0
|
||||
climate_mod.state:set_float("noise_timer", noise_timer)
|
||||
climate_mod.world.update_status(noise_timer)
|
||||
climate_mod.world.update_status(minetest.get_gametime())
|
||||
climate_mod.global_environment = climate_mod.trigger.get_global_environment()
|
||||
end
|
||||
|
||||
|
88
lib/player_physics.lua
Normal file
88
lib/player_physics.lua
Normal file
@ -0,0 +1,88 @@
|
||||
local mod_player_monoids = minetest.get_modpath("player_monoids") ~= nil
|
||||
local mod_playerphysics = minetest.get_modpath("playerphysics") ~= nil
|
||||
local mod_pova = minetest.get_modpath("pova") ~= nil
|
||||
|
||||
local physics = {}
|
||||
|
||||
-- use player monoids if available
|
||||
if mod_player_monoids then
|
||||
function physics.add(id, player, effect, value)
|
||||
player_monoids[effect]:add_change(player, value, id)
|
||||
end
|
||||
|
||||
function physics.remove(id, player, effect)
|
||||
player_monoids[effect]:del_change(player, id)
|
||||
end
|
||||
|
||||
-- fallback to playerphysics if available
|
||||
elseif mod_playerphysics then
|
||||
function physics.add(id, player, effect, value)
|
||||
playerphysics.add_physics_factor(player, effect, id, value)
|
||||
end
|
||||
|
||||
function physics.remove(id, player, effect)
|
||||
playerphysics.remove_physics_factor(player, effect, id)
|
||||
end
|
||||
|
||||
-- fallback to pova if available
|
||||
-- pova uses additive effect modifiers
|
||||
-- this tries to simulate multiplication
|
||||
-- by including the default value in modifier calculation
|
||||
elseif mod_pova then
|
||||
function physics.add(id, player, effect, value)
|
||||
local playername = player:get_player_name()
|
||||
local defaults = pova.get_override(playername, "default")
|
||||
local default
|
||||
if defaults == nil or defaults[effect] == nil then default = 1
|
||||
else default = defaults[effect] end
|
||||
local override = {}
|
||||
override[effect] = (value * default) - default
|
||||
pova.add_override(playername, id, override)
|
||||
pova.do_override(playername)
|
||||
end
|
||||
|
||||
function physics.remove(id, player, effect)
|
||||
local playername = player:get_player_name()
|
||||
pova.del_override(playername, id)
|
||||
pova.do_override(playername)
|
||||
end
|
||||
|
||||
-- fallback to vanilla override as last resort
|
||||
else
|
||||
local physics = {}
|
||||
local function apply_physics(player)
|
||||
local playername = player:get_player_name()
|
||||
local override = { speed = 1, jump = 1, gravity = 1 }
|
||||
for effect, modifiers in pairs(physics[playername]) do
|
||||
override[effect] = 1
|
||||
for _, modifier in pairs(modifiers) do
|
||||
override[effect] = override[effect] * modifier
|
||||
end
|
||||
end
|
||||
player:set_physics_override(override)
|
||||
end
|
||||
|
||||
function physics.add(id, player, effect, value)
|
||||
local playername = player:get_player_name()
|
||||
if physics[playername] == nil then physics[playername] = {} end
|
||||
if physics[playername][effect] == nil then physics[playername][effect] = {} end
|
||||
physics[playername][effect][id] = value
|
||||
apply_physics(player)
|
||||
end
|
||||
|
||||
function physics.remove(id, player, effect)
|
||||
local playername = player:get_player_name()
|
||||
if physics[playername] == nil then return end
|
||||
if physics[playername][effect] == nil then return end
|
||||
if physics[playername][effect][id] == nil then return end
|
||||
physics[playername][effect][id] = nil
|
||||
apply_physics(player)
|
||||
end
|
||||
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
local playername = player:get_player_name()
|
||||
physics[playername] = nil
|
||||
end)
|
||||
end
|
||||
|
||||
return physics
|
@ -72,7 +72,7 @@ local function set_skybox(playername, sky)
|
||||
player:set_stars(sky.star_data)
|
||||
end
|
||||
|
||||
function skybox.update_skybox(playername)
|
||||
function skybox.update(playername)
|
||||
local p_layers = layers[playername]
|
||||
local sky = table.copy(default_sky)
|
||||
if p_layers == nil then p_layers = {} end
|
||||
@ -91,12 +91,12 @@ function skybox.update_skybox(playername)
|
||||
set_skybox(playername, sky)
|
||||
end
|
||||
|
||||
function skybox.add_layer(playername, name, sky)
|
||||
function skybox.add(playername, name, sky)
|
||||
if layers[playername] == nil then layers[playername] = {} end
|
||||
layers[playername][name] = sky
|
||||
end
|
||||
|
||||
function skybox.remove_layer(playername, name)
|
||||
function skybox.remove(playername, name)
|
||||
if layers[playername] == nil or layers[playername][name] == nil then return end
|
||||
layers[playername][name] = nil
|
||||
end
|
||||
|
Reference in New Issue
Block a user