mirror of
https://github.com/t-affeldt/climate_api.git
synced 2025-07-02 16:30:42 +02:00
Implement ABM wrapper, allow environment checks for general positions
This commit is contained in:
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
|
||||
|
||||
|
Reference in New Issue
Block a user