Various adjustments and fixes

This commit is contained in:
Till Affeldt
2020-05-12 16:00:24 +02:00
parent 4df9a61374
commit f42b4183e5
15 changed files with 298 additions and 76 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()
)

View File

@ -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
View 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

View File

@ -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