mirror of
https://github.com/mt-mods/hangglider.git
synced 2025-07-14 06:20:30 +02:00
Compare commits
3 Commits
fly_checks
...
master
Author | SHA1 | Date | |
---|---|---|---|
6c23c135dc | |||
f970874855 | |||
071fe93cf5 |
@ -8,5 +8,6 @@ read_globals = {
|
||||
"vector", "ItemStack",
|
||||
|
||||
"player_monoids",
|
||||
"pova",
|
||||
"unifieddyes",
|
||||
}
|
||||
|
14
README.md
14
README.md
@ -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.
|
||||
|
||||
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)
|
||||
```
|
||||
|
116
init.lua
116
init.lua
@ -1,4 +1,3 @@
|
||||
hangglider = {}
|
||||
|
||||
hangglider = {
|
||||
translator = minetest.get_translator('hangglider'),
|
||||
@ -6,6 +5,7 @@ hangglider = {
|
||||
local S = hangglider.translator
|
||||
|
||||
local has_player_monoids = minetest.get_modpath("player_monoids")
|
||||
local has_pova = minetest.get_modpath("pova")
|
||||
local has_areas = minetest.get_modpath("areas")
|
||||
|
||||
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)
|
||||
|
||||
local hanggliding_players = {}
|
||||
local physics_overrides = {}
|
||||
local hud_overlay_ids = {}
|
||||
|
||||
|
||||
if enable_flak then
|
||||
minetest.register_chatcommand("area_flak", {
|
||||
params = S("<ID>"),
|
||||
@ -42,54 +44,106 @@ if enable_flak then
|
||||
})
|
||||
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
|
||||
return
|
||||
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_elem_type = "image",
|
||||
text = image,
|
||||
[minetest.features.hud_def_type_field and "type" or "hud_elem_type"] = "image",
|
||||
text = "hangglider_overlay.png",
|
||||
position = {x = 0, y = 0},
|
||||
scale = {x = -100, y = -100},
|
||||
alignment = {x = 1, y = 1},
|
||||
offset = {x = 0, y = 0},
|
||||
z_index = -150
|
||||
})
|
||||
else
|
||||
player:hud_change(hud_overlay_ids[name], "text", image)
|
||||
elseif hud_overlay_ids[name] and show == false then
|
||||
player:hud_remove(hud_overlay_ids[name])
|
||||
hud_overlay_ids[name] = nil
|
||||
end
|
||||
end
|
||||
|
||||
local function set_physics_overrides(player, overrides)
|
||||
local player_name = player:get_player_name()
|
||||
if has_player_monoids then
|
||||
for name, value in pairs(overrides) do
|
||||
player_monoids[name]:add_change(player, value, "hangglider:glider")
|
||||
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
|
||||
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
|
||||
|
||||
local function remove_physics_overrides(player)
|
||||
local player_name = player:get_player_name()
|
||||
if has_player_monoids then
|
||||
for _, name in pairs({"jump", "speed", "gravity"}) do
|
||||
player_monoids[name]:del_change(player, "hangglider:glider")
|
||||
end
|
||||
elseif has_pova then
|
||||
pova.del_override(player_name, "hangglider:glider")
|
||||
pova.do_override(player)
|
||||
else
|
||||
player:set_physics_override({jump = 1, speed = 1, gravity = 1})
|
||||
local def = player:get_physics_override()
|
||||
if physics_overrides[player_name]
|
||||
and physics_overrides[player_name].physics
|
||||
and physics_overrides[player_name].deltas then
|
||||
|
||||
-- Subtract total delta from current values
|
||||
player:set_physics_override({
|
||||
speed = def.speed - physics_overrides[player_name].deltas.speed,
|
||||
jump = def.jump - physics_overrides[player_name].deltas.jump,
|
||||
gravity = def.gravity - physics_overrides[player_name].deltas.gravity,
|
||||
})
|
||||
physics_overrides[player_name] = nil
|
||||
else
|
||||
player:set_physics_override({speed = 1, jump = 1, gravity = 1})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
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 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
|
||||
@ -101,17 +155,6 @@ local function can_fly_flak(name, pos)
|
||||
if flak and not owners[name] then
|
||||
return false
|
||||
end
|
||||
end
|
||||
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
|
||||
|
||||
@ -166,7 +209,7 @@ local function hangglider_step(self, dtime)
|
||||
})
|
||||
end
|
||||
end
|
||||
if not can_fly_flak(name, pos) then
|
||||
if not can_fly(pos, name) then
|
||||
if not self.flak_timer then
|
||||
self.flak_timer = 0
|
||||
shoot_flak_sound(pos)
|
||||
@ -181,13 +224,10 @@ 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
|
||||
set_hud_overlay(player, name, "blank.png")
|
||||
set_hud_overlay(player, name, false)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -214,7 +254,7 @@ local function hangglider_use(stack, player)
|
||||
textures = {"wool_white.png^[multiply:#"..color, "default_wood.png"}
|
||||
})
|
||||
end
|
||||
set_hud_overlay(player, name, "hangglider_overlay.png")
|
||||
set_hud_overlay(player, name, true)
|
||||
set_physics_overrides(player, {jump = 0, gravity = 0.25})
|
||||
hanggliding_players[name] = true
|
||||
if hangglider_uses > 0 then
|
||||
@ -223,7 +263,7 @@ local function hangglider_use(stack, player)
|
||||
return stack
|
||||
end
|
||||
else
|
||||
set_hud_overlay(player, name, "blank.png")
|
||||
set_hud_overlay(player, name, false)
|
||||
remove_physics_overrides(player)
|
||||
hanggliding_players[name] = nil
|
||||
end
|
||||
@ -252,13 +292,15 @@ minetest.register_on_player_hpchange(function(player, hp_change, reason)
|
||||
end, true)
|
||||
|
||||
minetest.register_entity("hangglider:glider", {
|
||||
initial_properties = {
|
||||
visual = "mesh",
|
||||
visual_size = {x = 12, y = 12},
|
||||
collisionbox = {0,0,0,0,0,0},
|
||||
mesh = "hangglider.obj",
|
||||
textures = {"wool_white.png", "default_wood.png"},
|
||||
immortal = true,
|
||||
static_save = false,
|
||||
textures = {"wool_white.png", "default_wood.png"},
|
||||
},
|
||||
on_step = hangglider_step,
|
||||
})
|
||||
|
||||
|
Reference in New Issue
Block a user