1
0
mirror of https://github.com/mt-mods/hangglider.git synced 2025-07-14 14:30:29 +02:00

3 Commits

Author SHA1 Message Date
6c23c135dc Improve interoperability without player_monoids and pova (#24)
* Import noobdigital87's changes

Co-authored-by: noobdigital87 <noobdigital87@gmail.com>

* Fix hud type; remove useless code; style

---------

Co-authored-by: noobdigital87 <noobdigital87@gmail.com>
2025-07-11 08:53:07 +02:00
f970874855 Cleanup HUD code (#21) 2025-05-24 17:49:24 -04:00
071fe93cf5 add pova support (#20)
* Update mod.conf

add pova optional dependency

* Update init.lua

add support for pova

* Update .luacheckrc

---------

Co-authored-by: Luke aka SwissalpS <161979+SwissalpS@users.noreply.github.com>
2025-01-18 17:42:39 +01:00
4 changed files with 94 additions and 65 deletions

View File

@ -8,5 +8,6 @@ read_globals = {
"vector", "ItemStack", "vector", "ItemStack",
"player_monoids", "player_monoids",
"pova",
"unifieddyes", "unifieddyes",
} }

View File

@ -31,17 +31,3 @@ 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, 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)
```

142
init.lua
View File

@ -1,4 +1,3 @@
hangglider = {}
hangglider = { hangglider = {
translator = minetest.get_translator('hangglider'), translator = minetest.get_translator('hangglider'),
@ -6,6 +5,7 @@ hangglider = {
local S = hangglider.translator local S = hangglider.translator
local has_player_monoids = minetest.get_modpath("player_monoids") local has_player_monoids = minetest.get_modpath("player_monoids")
local has_pova = minetest.get_modpath("pova")
local has_areas = minetest.get_modpath("areas") local has_areas = minetest.get_modpath("areas")
local enable_hud_overlay = minetest.settings:get_bool("hangglider.enable_hud_overlay", true) local enable_hud_overlay = minetest.settings:get_bool("hangglider.enable_hud_overlay", true)
@ -18,8 +18,10 @@ local flak_warning = S("You have entered restricted airspace!@n"
flak_warning_time) flak_warning_time)
local hanggliding_players = {} local hanggliding_players = {}
local physics_overrides = {}
local hud_overlay_ids = {} local hud_overlay_ids = {}
if enable_flak then if enable_flak then
minetest.register_chatcommand("area_flak", { minetest.register_chatcommand("area_flak", {
params = S("<ID>"), params = S("<ID>"),
@ -42,75 +44,116 @@ if enable_flak then
}) })
end end
local function set_hud_overlay(player, name, image) function hangglider.is_gliding(player)
if not player then
return false
end
return hanggliding_players[player:get_player_name()]
end
local function set_hud_overlay(player, name, show)
if not enable_hud_overlay then if not enable_hud_overlay then
return return
end end
if not hud_overlay_ids[name] then if not hud_overlay_ids[name] and show == true then
hud_overlay_ids[name] = player:hud_add({ hud_overlay_ids[name] = player:hud_add({
hud_elem_type = "image", [minetest.features.hud_def_type_field and "type" or "hud_elem_type"] = "image",
text = image, text = "hangglider_overlay.png",
position = {x = 0, y = 0}, position = {x = 0, y = 0},
scale = {x = -100, y = -100}, scale = {x = -100, y = -100},
alignment = {x = 1, y = 1}, alignment = {x = 1, y = 1},
offset = {x = 0, y = 0}, offset = {x = 0, y = 0},
z_index = -150 z_index = -150
}) })
else elseif hud_overlay_ids[name] and show == false then
player:hud_change(hud_overlay_ids[name], "text", image) player:hud_remove(hud_overlay_ids[name])
hud_overlay_ids[name] = nil
end end
end end
local function set_physics_overrides(player, overrides) local function set_physics_overrides(player, overrides)
local player_name = player:get_player_name()
if has_player_monoids then if has_player_monoids then
for name, value in pairs(overrides) do for name, value in pairs(overrides) do
player_monoids[name]:add_change(player, value, "hangglider:glider") player_monoids[name]:add_change(player, value, "hangglider:glider")
end end
elseif has_pova then
pova.add_override(player_name, "hangglider:glider",
{jump = 0, speed = overrides.speed, gravity = overrides.gravity})
pova.do_override(player)
else else
player:set_physics_override(overrides) local def = player:get_physics_override()
if not physics_overrides[player_name] then
physics_overrides[player_name] = {
physics = {
speed = def.speed,
jump = def.jump,
gravity = def.gravity,
},
deltas = {speed = 0, jump = 0, gravity = 0},
}
end
-- Compute the new delta to apply (relative to current physics)
local delta = {
speed = (overrides.speed or def.speed) - def.speed,
jump = (overrides.jump or def.jump) - def.jump,
gravity = (overrides.gravity or def.gravity) - def.gravity,
}
-- Track the sum of all deltas for this session.
physics_overrides[player_name].deltas.speed = physics_overrides[player_name].deltas.speed + delta.speed
physics_overrides[player_name].deltas.jump = physics_overrides[player_name].deltas.jump + delta.jump
physics_overrides[player_name].deltas.gravity = physics_overrides[player_name].deltas.gravity + delta.gravity
-- Apply new delta on top of current physics
player:set_physics_override({
speed = def.speed + delta.speed,
jump = def.jump + delta.jump,
gravity = def.gravity + delta.gravity,
})
end end
end end
local function remove_physics_overrides(player) local function remove_physics_overrides(player)
local player_name = player:get_player_name()
if has_player_monoids then if has_player_monoids then
for _, name in pairs({"jump", "speed", "gravity"}) do for _, name in pairs({"jump", "speed", "gravity"}) do
player_monoids[name]:del_change(player, "hangglider:glider") player_monoids[name]:del_change(player, "hangglider:glider")
end end
elseif has_pova then
pova.del_override(player_name, "hangglider:glider")
pova.do_override(player)
else else
player:set_physics_override({jump = 1, speed = 1, gravity = 1}) local def = player:get_physics_override()
end if physics_overrides[player_name]
end and physics_overrides[player_name].physics
and physics_overrides[player_name].deltas then
local fly_checks = {} -- Subtract total delta from current values
player:set_physics_override({
function hangglider.add_fly_check(func) speed = def.speed - physics_overrides[player_name].deltas.speed,
table.insert(fly_checks, func) jump = def.jump - physics_overrides[player_name].deltas.jump,
end gravity = def.gravity - physics_overrides[player_name].deltas.gravity,
})
local function can_fly_flak(name, pos) physics_overrides[player_name] = nil
-- Area flak check else
if enable_flak then player:set_physics_override({speed = 1, jump = 1, gravity = 1})
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
end end
end end
local function can_fly_custom(name, player) local function can_fly(pos, name)
-- Custom checks set by other mods if not enable_flak then
for _, func in ipairs(fly_checks) do return true
local ret = func(name, player) end
if ret == false then local flak = false
return false local owners = {}
for _, area in pairs(areas:getAreasAtPos(pos)) do
if area.flak then
flak = true
end end
owners[area.owner] = true
end
if flak and not owners[name] then
return false
end end
return true return true
end end
@ -166,7 +209,7 @@ local function hangglider_step(self, dtime)
}) })
end end
end end
if not can_fly_flak(name, pos) then if not can_fly(pos, name) 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)
@ -181,13 +224,10 @@ local function hangglider_step(self, dtime)
gliding = false gliding = false
end end
end end
if not can_fly_custom(name, player) then
gliding = false
end
if not gliding then if not gliding then
remove_physics_overrides(player) remove_physics_overrides(player)
hanggliding_players[name] = nil hanggliding_players[name] = nil
set_hud_overlay(player, name, "blank.png") set_hud_overlay(player, name, false)
end end
end end
end end
@ -214,7 +254,7 @@ local function hangglider_use(stack, player)
textures = {"wool_white.png^[multiply:#"..color, "default_wood.png"} textures = {"wool_white.png^[multiply:#"..color, "default_wood.png"}
}) })
end end
set_hud_overlay(player, name, "hangglider_overlay.png") set_hud_overlay(player, name, true)
set_physics_overrides(player, {jump = 0, gravity = 0.25}) set_physics_overrides(player, {jump = 0, gravity = 0.25})
hanggliding_players[name] = true hanggliding_players[name] = true
if hangglider_uses > 0 then if hangglider_uses > 0 then
@ -223,7 +263,7 @@ local function hangglider_use(stack, player)
return stack return stack
end end
else else
set_hud_overlay(player, name, "blank.png") set_hud_overlay(player, name, false)
remove_physics_overrides(player) remove_physics_overrides(player)
hanggliding_players[name] = nil hanggliding_players[name] = nil
end end
@ -252,13 +292,15 @@ minetest.register_on_player_hpchange(function(player, hp_change, reason)
end, true) end, true)
minetest.register_entity("hangglider:glider", { minetest.register_entity("hangglider:glider", {
visual = "mesh", initial_properties = {
visual_size = {x = 12, y = 12}, visual = "mesh",
collisionbox = {0,0,0,0,0,0}, visual_size = {x = 12, y = 12},
mesh = "hangglider.obj", collisionbox = {0,0,0,0,0,0},
immortal = true, mesh = "hangglider.obj",
static_save = false, textures = {"wool_white.png", "default_wood.png"},
textures = {"wool_white.png", "default_wood.png"}, immortal = true,
static_save = false,
},
on_step = hangglider_step, on_step = hangglider_step,
}) })

View File

@ -1,5 +1,5 @@
name = hangglider name = hangglider
description = Adds a functional hang glider for exploring description = Adds a functional hang glider for exploring
depends = default, wool, dye depends = default, wool, dye
optional_depends = areas, player_monoids, unifieddyes optional_depends = areas, player_monoids, pova, unifieddyes
min_minetest_version = 5.0 min_minetest_version = 5.0