Add API to register custom "can fly checks"

This commit is contained in:
Niklp 2024-02-21 14:22:04 +01:00
parent 2c708abd88
commit 7e8832f523
No known key found for this signature in database
GPG Key ID: 05D6F5035E66267A
3 changed files with 41 additions and 13 deletions

View File

@ -1,5 +1,6 @@
globals = { globals = {
"areas", "areas",
"hangglider",
} }
read_globals = { read_globals = {

View File

@ -31,3 +31,15 @@ The hang glider will wear out every time you use it. The hang glider can be repa
If the `areas` mod is installed, airspace restrictions can be added to areas using the `/area_flak` command. If the `areas` mod is installed, airspace restrictions can be added to areas using the `/area_flak` command.
When using a hang glider in an area with flak enabled, you will get shot down a few seconds after entering the area, this reduces your HP to 1 and destroys your hang glider. When using a hang glider in an area with flak enabled, you will get shot down a few seconds after entering the area, this reduces your HP to 1 and destroys your hang glider.
## API
#### Custom "can fly" checks
```lua
hangglider.add_fly_check(function(name, pos)
-- Add your code here
-- Must return `true` (can fly) or `false` (can't fly)
return true
end)
```

View File

@ -1,3 +1,4 @@
hangglider = {}
local has_player_monoids = minetest.get_modpath("player_monoids") local has_player_monoids = minetest.get_modpath("player_monoids")
local has_areas = minetest.get_modpath("areas") local has_areas = minetest.get_modpath("areas")
@ -73,20 +74,34 @@ local function remove_physics_overrides(player)
end end
end end
local function can_fly(pos, name) local fly_checks = {}
if not enable_flak then
return true function hangglider.add_fly_check(func)
end table.insert(fly_checks, func)
local flak = false end
local owners = {}
for _, area in pairs(areas:getAreasAtPos(pos)) do local function can_fly(name, pos)
if area.flak then -- Area flak check
flak = true if enable_flak then
local flak = false
local owners = {}
for _, area in pairs(areas:getAreasAtPos(pos)) do
if area.flak then
flak = true
end
owners[area.owner] = true
end
if flak and not owners[name] then
return false
end end
owners[area.owner] = true
end end
if flak and not owners[name] then
return false -- Custom checks set by other mods
for _, func in ipairs(fly_checks) do
local ret = func(name, pos)
if ret == false then
return false
end
end end
return true return true
end end
@ -142,7 +157,7 @@ local function hangglider_step(self, dtime)
}) })
end end
end end
if not can_fly(pos, name) then if not can_fly(name, pos) then
if not self.flak_timer then if not self.flak_timer then
self.flak_timer = 0 self.flak_timer = 0
shoot_flak_sound(pos) shoot_flak_sound(pos)