minetest_mod_weather/weather/api.lua

112 lines
3.1 KiB
Lua

weather_mod.registered_downfalls = {}
weather_mod.registered_downfall_count = 0
weather_mod.registered_weather_change_callbacks = {}
local function check_modname_prefix(name)
if name:sub(1,1) == ":" then
-- If the name starts with a colon, we can skip the modname prefix
-- mechanism.
return name:sub(2)
else
-- Enforce that the name starts with the correct mod name.
local modname = minetest.get_current_modname()
if modname == nil then
modname=name:split(":")[1]
end
local expected_prefix = modname .. ":"
if name:sub(1, #expected_prefix) ~= expected_prefix then
error("Name " .. name .. " does not follow naming conventions: " ..
"\"" .. expected_prefix .. "\" or \":\" prefix required")
end
-- Enforce that the name only contains letters, numbers and underscores.
local subname = name:sub(#expected_prefix+1)
if subname:find("[^%w_]") then
error("Name " .. name .. " does not follow naming conventions: " ..
"contains unallowed characters")
end
return name
end
end
local function set_defaults(vt,rt)
for i,v in pairs(rt) do
if not vt[i] then
vt[i] = v
end
end
end
local default_downfall = {
--minimum starting position
min_pos = {x=-15, y=15, z=-15},
--maximum starting position
max_pos = {x=15, y=15, z=15},
--y falling speed
falling_speed = 10,
--number of textures spawned
amount = 15,
--the texture size
size = 25,
--whether lightning should be enabled
enable_lightning=false,
--whether to damage the player
damage_player=false,
--how much wind is needed to trigger the weather
min_wind = 0,
--stops weather
disabled = false,
}
local default_damage = {
--how many half hearts
amount = 1,
--chance to damage: .5 is 50%
chance = 1,
--after how many steps to damage
time = 100
}
function weather_mod.register_downfall(id,def)
local name = check_modname_prefix(id)
if name == "none" then error("\"none\" means none, thanks") end
assert(not weather_mod.registered_downfalls[name], name.." is already registered")
local ndef = table.copy(def)
--what the downfall looks like
assert(ndef.texture,"no texture given")
set_defaults(ndef,default_downfall)
--when to delete the particles
if not ndef.exptime then
ndef.exptime = ndef.max_pos.y / (math.sqrt(ndef.falling_acceleration) + ndef.falling_speed)
end
if ndef.damage_player then
set_defaults(ndef.damage_player,default_damage)
end
--actually register the downfall
weather_mod.registered_downfalls[name]=ndef
weather_mod.registered_downfall_count = weather_mod.registered_downfall_count + 1
end
function weather_mod.register_on_weather_change(callback)
local ct = type(callback)
assert(ct == "function", "on_weather_change callback must be a function, got a " + ct)
table.insert(weather_mod.registered_weather_change_callbacks,callback)
end
function weather_mod.handle_weather_change(changes)
for _,c in pairs(weather_mod.registered_weather_change_callbacks) do
c(changes)
end
end
function weather_mod.disable_downfall(id,disable)
local state = disable
if disable == nil then
state = true
end
weather_mod.registered_downfalls[id].disabled = state
end
return weather_mod