diff --git a/README.md b/README.md index d109a22..134961b 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,17 @@ 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. 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, player) + -- `name` is the playername + -- `player` is the PlayerRef + -- Add your code here + -- Must return `true` (can fly) or `false` (can't fly) + return true +end) +``` diff --git a/init.lua b/init.lua index 25c8d8f..dc02def 100644 --- a/init.lua +++ b/init.lua @@ -1,3 +1,4 @@ +hangglider = {} hangglider = { translator = minetest.get_translator('hangglider'), @@ -80,20 +81,36 @@ local function remove_physics_overrides(player) end end -local function can_fly(pos, name) - if not enable_flak then - return true - end - local flak = false - local owners = {} - for _, area in pairs(areas:getAreasAtPos(pos)) do - if area.flak then - flak = true +local fly_checks = {} + +function hangglider.add_fly_check(func) + table.insert(fly_checks, func) +end + +local function can_fly_flak(name, pos) + -- Area flak check + 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 - owners[area.owner] = true end - if flak and not owners[name] then - return false +end + +local function can_fly_custom(name, player) + -- Custom checks set by other mods + for _, func in ipairs(fly_checks) do + local ret = func(name, player) + if ret == false then + return false + end end return true end @@ -149,7 +166,7 @@ local function hangglider_step(self, dtime) }) end end - if not can_fly(pos, name) then + if not can_fly_flak(name, pos) then if not self.flak_timer then self.flak_timer = 0 shoot_flak_sound(pos) @@ -164,6 +181,9 @@ local function hangglider_step(self, dtime) gliding = false end end + if not can_fly_custom(name, player) then + gliding = false + end if not gliding then remove_physics_overrides(player) hanggliding_players[name] = nil