capturetheflag/mods/other/sprint/init.lua
2021-06-06 06:28:03 -07:00

132 lines
3.9 KiB
Lua

-- Sprint mod by rubenwardy. License: MIT.
-- Heavily modified from a mod by GunshipPenguin
-- Config, see README.md
local MOD_WALK = tonumber(minetest.settings:get("sprint_speed") or 1.8)
local MOD_JUMP = tonumber(minetest.settings:get("sprint_jump") or 1.1)
local STAMINA_MAX = tonumber(minetest.settings:get("sprint_stamina") or 20)
local HEAL_RATE = tonumber(minetest.settings:get("sprint_heal_rate") or 0.5)
local MIN_SPRINT = tonumber(minetest.settings:get("sprint_min") or 0.5)
if minetest.get_modpath("hudbars") ~= nil then
hb.register_hudbar("sprint", 0xFFFFFF, "Stamina",
{ bar = "sprint_stamina_bar.png", icon = "sprint_stamina_icon.png" },
STAMINA_MAX, STAMINA_MAX,
false, "%s: %.1f/%.1f")
SPRINT_HUDBARS_USED = true
else
SPRINT_HUDBARS_USED = false
end
local players = {}
local function setSprinting(player, info, sprinting)
if info.sprinting ~= sprinting then
if sprinting then
physics.set(player:get_player_name(), "sprint:sprint", {
speed = MOD_WALK,
jump = MOD_JUMP
})
else
physics.remove(player:get_player_name(), "sprint:sprint")
end
info.sprinting = sprinting
end
end
ctf_match.register_on_new_match(function()
for pname in pairs(players) do
local player = minetest.get_player_by_name(pname)
players[player:get_player_name()].stamina = STAMINA_MAX
end
end)
minetest.register_globalstep(function(dtime)
for name, info in pairs(players) do
local player = minetest.get_player_by_name(name)
if not player then
players[name] = nil
else
-- ##?## You can enable recharging when the E key is pressed by
-- following these instructions.
--Check if the player should be sprinting
local controls = player:get_player_control()
local sprintRequested = controls.aux1 and controls.up
-- ##1## replace info.sprintRequested with info.sprinting
if sprintRequested ~= info.sprintRequested then
if sprintRequested and info.stamina > MIN_SPRINT
and not medkits.is_healing(player:get_player_name()) then
setSprinting(player, info, true)
elseif not sprintRequested then
setSprinting(player, info, false)
end
end
info.sprintRequested = sprintRequested
local staminaChanged = false
if info.sprinting then
info.stamina = info.stamina - dtime
staminaChanged = true
if info.stamina <= 0 then
info.stamina = 0
setSprinting(player, info, false)
end
-- ##2## remove `not info.sprintRequested and`
elseif not info.sprintRequested and info.stamina < STAMINA_MAX then
info.stamina = info.stamina + dtime * HEAL_RATE
staminaChanged = true
if info.stamina > STAMINA_MAX then
info.stamina = STAMINA_MAX
end
end
if staminaChanged then
if SPRINT_HUDBARS_USED then
hb.change_hudbar(player, "sprint", info.stamina)
else
local numBars = math.floor(20 * info.stamina / STAMINA_MAX)
if info.lastHudSendValue ~= numBars then
info.lastHudSendValue = numBars
player:hud_change(info.hud, "number", numBars)
end
end
end
end
end
end)
minetest.register_on_joinplayer(function(player)
local info = {
sprinting = false, -- Is the player actually sprinting?
stamina = STAMINA_MAX, -- integer, the stamina we have left
sprintRequested = false, -- is the sprint key down / etc?
}
if SPRINT_HUDBARS_USED then
hb.init_hudbar(player, "sprint")
else
info.hud = player:hud_add({
hud_elem_type = "statbar",
position = {x=0.5, y=1},
size = {x=24, y=24},
text = "sprint_stamina_icon.png",
number = 20,
alignment = {x=0, y=1},
offset = {x=-263, y=-110},
})
end
players[player:get_player_name()] = info
end)
minetest.register_on_respawnplayer(function(player)
players[player:get_player_name()].stamina = STAMINA_MAX
end)
minetest.register_on_leaveplayer(function(player)
players[player:get_player_name()] = nil
end)