1
0
mirror of https://github.com/mt-mods/hangglider.git synced 2025-06-29 06:50:56 +02:00

Import noobdigital87's changes

Co-authored-by: noobdigital87 <noobdigital87@gmail.com>
This commit is contained in:
Niklp
2025-06-23 20:15:01 +02:00
parent f970874855
commit ba46073b63
2 changed files with 68 additions and 13 deletions

View File

@ -4,7 +4,7 @@ globals = {
} }
read_globals = { read_globals = {
"minetest", "core", "minetest",
"vector", "ItemStack", "vector", "ItemStack",
"player_monoids", "player_monoids",

View File

@ -18,8 +18,11 @@ 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,13 +45,20 @@ if enable_flak then
}) })
end end
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) 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] and show == true 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", type = "image",
text = "hangglider_overlay.png", text = "hangglider_overlay.png",
position = {x = 0, y = 0}, position = {x = 0, y = 0},
scale = {x = -100, y = -100}, scale = {x = -100, y = -100},
@ -63,29 +73,72 @@ local function set_hud_overlay(player, name, show)
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 elseif has_pova then
pova.add_override(player:get_player_name(), "hangglider:glider", pova.add_override(player_name, "hangglider:glider",
{jump = 0, speed = overrides.speed, gravity = overrides.gravity}) {jump = 0, speed = overrides.speed, gravity = overrides.gravity})
pova.do_override(player) pova.do_override(player)
else else
player:set_physics_override(overrides) local def = player:get_physics_override()
if not has_pova or not has_player_monoids then
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
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 elseif has_pova then
pova.del_override(player:get_player_name(), "hangglider:glider") pova.del_override(player_name, "hangglider:glider")
pova.do_override(player) pova.do_override(player)
else 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
end end
@ -241,13 +294,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,
}) })