mirror of
https://github.com/t-affeldt/climate_api.git
synced 2024-12-22 08:50:37 +01:00
Implement ABM wrapper, allow environment checks for general positions
This commit is contained in:
parent
7f8f1a77f2
commit
f41d5f259c
@ -5,10 +5,7 @@
|
||||
- Make sure all weather presets are working
|
||||
|
||||
## Required for Beta
|
||||
- Implement fallback for sky changes without skylayer
|
||||
- Ability to register environment conditions dynamically (like the heat)
|
||||
- Implement ABM system for additional effects
|
||||
- Implement snow layers, puddles, soil hydration, fire extinguishing
|
||||
|
||||
## Planned for first release
|
||||
- Improve test_condition function
|
||||
@ -20,7 +17,6 @@
|
||||
|
||||
## Nice to have
|
||||
- Write documentation on how to add weathers and effects
|
||||
- Register *Moon Phases* as a weather preset using the *skybox* effect
|
||||
- Assign meta data (like "downfall", "wind", etc.) to weather presets
|
||||
- Fog effects
|
||||
- Optimize performance by replacing some particles with animated texture planes
|
@ -1,4 +1,4 @@
|
||||
if not climate_mod.settings.sound then return end
|
||||
if not climate_mod.settings.hud_overlay then return end
|
||||
|
||||
local EFFECT_NAME = "climate_api:hud_overlay"
|
||||
|
||||
|
25
init.lua
25
init.lua
@ -6,13 +6,13 @@ climate_mod = {}
|
||||
local modname = minetest.get_current_modname()
|
||||
local modpath = minetest.get_modpath(modname)
|
||||
|
||||
local function getBoolSetting(name, default)
|
||||
local function get_setting_bool(name, default)
|
||||
local value = minetest.settings:get_bool("climate_api_" .. name)
|
||||
if type(value) == "nil" then value = default end
|
||||
return minetest.is_yes(value)
|
||||
end
|
||||
|
||||
local function getNumericSetting(name, default)
|
||||
local function get_setting_number(name, default)
|
||||
local value = minetest.settings:get("climate_api_" .. name)
|
||||
if type(value) == "nil" then value = default end
|
||||
return tonumber(value)
|
||||
@ -20,16 +20,17 @@ end
|
||||
|
||||
-- load settings from config file
|
||||
climate_mod.settings = {
|
||||
particles = getBoolSetting("particles", true),
|
||||
skybox = getBoolSetting("skybox", true),
|
||||
sound = getBoolSetting("sound", true),
|
||||
wind = getBoolSetting("wind", true),
|
||||
seasons = getBoolSetting("seasons", true),
|
||||
fahrenheit = getBoolSetting("fahrenheit", false),
|
||||
heat = getNumericSetting("heat_base", 0),
|
||||
humidity = getNumericSetting("humidity_base", 0),
|
||||
time_spread = getNumericSetting("time_spread", 1),
|
||||
particle_count = getNumericSetting("particle_count", 1)
|
||||
particles = get_setting_bool("particles", true),
|
||||
skybox = get_setting_bool("skybox", true),
|
||||
sound = get_setting_bool("sound", true),
|
||||
hud_overlay = get_setting_bool("hud_overlay", true),
|
||||
wind = get_setting_bool("wind", true),
|
||||
seasons = get_setting_bool("seasons", true),
|
||||
fahrenheit = get_setting_bool("fahrenheit", false),
|
||||
heat = get_setting_number("heat_base", 0),
|
||||
humidity = get_setting_number("humidity_base", 0),
|
||||
time_spread = get_setting_number("time_spread", 1),
|
||||
particle_count = get_setting_number("particle_count", 1)
|
||||
}
|
||||
|
||||
-- initiate empty registers
|
||||
|
37
lib/api.lua
37
lib/api.lua
@ -37,4 +37,41 @@ end
|
||||
climate_mod.influences[name] = func
|
||||
end]]
|
||||
|
||||
function api.register_abm(config)
|
||||
local conditions = config.conditions
|
||||
local action = config.action
|
||||
local pos_override = config.pos_override
|
||||
|
||||
local override = function(pos, node)
|
||||
local env = climate_mod.trigger.get_position_environment(pos)
|
||||
if type(pos_override) == "function" then
|
||||
pos = pos_override(pos)
|
||||
end
|
||||
|
||||
if conditions == nil then
|
||||
return action(pos, node, env)
|
||||
end
|
||||
|
||||
minetest.log(dump2(env, "env"))
|
||||
minetest.log(dump2(conditions, "conditions"))
|
||||
|
||||
for condition, goal in pairs(conditions) do
|
||||
local value = env[condition:sub(5)]
|
||||
if condition:sub(1, 4) == "min_" then
|
||||
if type(value) == "nil" or goal > value then return end
|
||||
elseif condition:sub(1, 4) == "max_" then
|
||||
if type(value) == "nil" or goal <= value then return end
|
||||
else
|
||||
value = env[condition]
|
||||
if type(value) == "nil" or goal ~= value then return end
|
||||
end
|
||||
end
|
||||
return action(pos, node, env)
|
||||
end
|
||||
|
||||
config.conditions = nil
|
||||
config.action = override
|
||||
minetest.register_abm(config)
|
||||
end
|
||||
|
||||
return api
|
||||
|
@ -1,21 +1,26 @@
|
||||
local trigger = {}
|
||||
|
||||
function trigger.get_player_environment(player)
|
||||
local ppos = player:get_pos()
|
||||
function trigger.get_position_environment(pos)
|
||||
local wind_x = climate_mod.state:get_float("wind_x")
|
||||
local wind_z = climate_mod.state:get_float("wind_z")
|
||||
|
||||
local env = {}
|
||||
env.player = player
|
||||
env.pos = ppos
|
||||
env.height = ppos.y
|
||||
env.pos = pos
|
||||
env.height = pos.y
|
||||
env.wind = vector.new(wind_x, 0, wind_z)
|
||||
env.windspeed = vector.length(env.wind)
|
||||
env.heat = climate_api.environment.get_heat(ppos)
|
||||
env.humidity = climate_api.environment.get_humidity(ppos)
|
||||
env.heat = climate_api.environment.get_heat(pos)
|
||||
env.humidity = climate_api.environment.get_humidity(pos)
|
||||
env.time = minetest.get_timeofday()
|
||||
env.date = minetest.get_day_count()
|
||||
env.light = minetest.get_node_light(vector.add(ppos, vector.new({x=0,y=1.5,z=0})), 0.5)
|
||||
env.light = minetest.get_node_light(vector.add(pos, vector.new({x=0,y=1,z=0})), 0.5)
|
||||
return env
|
||||
end
|
||||
|
||||
function trigger.get_player_environment(player)
|
||||
local ppos = player:get_pos()
|
||||
local env = trigger.get_position_environment(ppos)
|
||||
env.player = player
|
||||
return env
|
||||
end
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
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
|
||||
climate_api_clouds (Override clouds to represent current humidity) bool true
|
||||
climate_api_hud_overlay (Allow weather presets to display a HUD overlay) bool true
|
||||
climate_api_wind (Allow wind to angle rainfall) bool true
|
||||
climate_api_seasons (Change global temperature based on an annual cycle) bool true
|
||||
climate_api_heat_base (Global base temperature) float 0
|
||||
|
Loading…
Reference in New Issue
Block a user