From f41d5f259c2391583f788003d8cf4c37116ee213 Mon Sep 17 00:00:00 2001 From: Till Affeldt Date: Thu, 16 Apr 2020 19:12:20 +0200 Subject: [PATCH] Implement ABM wrapper, allow environment checks for general positions --- TODO.md => ROADMAP.md | 4 ---- ca_effects/hud_overlay.lua | 2 +- init.lua | 25 +++++++++++++------------ lib/api.lua | 37 +++++++++++++++++++++++++++++++++++++ lib/trigger.lua | 21 +++++++++++++-------- settingtypes.txt | 2 +- 6 files changed, 65 insertions(+), 26 deletions(-) rename TODO.md => ROADMAP.md (87%) diff --git a/TODO.md b/ROADMAP.md similarity index 87% rename from TODO.md rename to ROADMAP.md index 78fa573..d43a9e0 100644 --- a/TODO.md +++ b/ROADMAP.md @@ -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 diff --git a/ca_effects/hud_overlay.lua b/ca_effects/hud_overlay.lua index 3da924d..c9a2292 100644 --- a/ca_effects/hud_overlay.lua +++ b/ca_effects/hud_overlay.lua @@ -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" diff --git a/init.lua b/init.lua index 8806d8f..adbce1c 100644 --- a/init.lua +++ b/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 diff --git a/lib/api.lua b/lib/api.lua index c40bba3..639835e 100644 --- a/lib/api.lua +++ b/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 diff --git a/lib/trigger.lua b/lib/trigger.lua index e7ae72a..aa86934 100644 --- a/lib/trigger.lua +++ b/lib/trigger.lua @@ -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 diff --git a/settingtypes.txt b/settingtypes.txt index 7806ff6..7bbee51 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -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