minetest_wadsprint/init.lua

215 lines
8.7 KiB
Lua
Raw Normal View History

2016-03-26 11:41:29 -07:00
-- WAD SPRINTING minetest (https://minetest.net) mod (https://dev.minetest.net/Intro)
2016-03-26 12:04:32 -07:00
-- @link https://github.com/aa6/minetest_wadsprint
2016-03-26 11:41:29 -07:00
minetest_wadsprint =
{
api = {},
2016-03-26 11:41:29 -07:00
players = {},
2016-04-30 00:10:04 -07:00
version = io.open(minetest.get_modpath(minetest.get_current_modname()).."/VERSION","r"):read("*all"),
savedstats = { index = {} },
savetablepath = minetest.get_modpath(minetest.get_current_modname()).."/saved_players_stats.dat",
2016-03-26 11:41:29 -07:00
}
dofile(minetest.get_modpath(minetest.get_current_modname()).."/config.lua")
dofile(minetest.get_modpath(minetest.get_current_modname()).."/init_hudbars.lua")
dofile(minetest.get_modpath(minetest.get_current_modname()).."/lib_savetable.lua")
dofile(minetest.get_modpath(minetest.get_current_modname()).."/lib_file_exists.lua")
-- API function to safely get player's stamina value.
function minetest_wadsprint.api.get_stamina_rate(player_name)
if minetest_wadsprint.players[player_name] ~= nil then
return minetest_wadsprint.players[player_name].stamina / minetest_wadsprint.STAMINA_MAX_VALUE
end
end
-- API function to safely change player's stamina.
function minetest_wadsprint.api.change_stamina_by_coefficient(player_name,stamina_change_coefficient)
if minetest_wadsprint.players[player_name] ~= nil then
local player = minetest_wadsprint.players[player_name]
player.stamina = player.stamina + (stamina_change_coefficient * minetest_wadsprint.STAMINA_MAX_VALUE)
if player.stamina < 0 then
player.stamina = 0
elseif player.stamina > minetest_wadsprint.STAMINA_MAX_VALUE then
player.stamina = minetest_wadsprint.STAMINA_MAX_VALUE
end
minetest_wadsprint.hudbar_update_stamina(player)
end
return minetest_wadsprint.api
end
2016-03-26 11:41:29 -07:00
2016-04-24 11:01:21 -07:00
function minetest_wadsprint.stamina_update_cycle(player)
2016-03-26 11:41:29 -07:00
if player.is_sprinting then
2016-03-26 12:57:03 -07:00
player.stamina = player.stamina - (minetest_wadsprint.STAMINA_MAX_VALUE * minetest_wadsprint.SPRINT_STAMINA_DECREASE_PER_UPDATE_PERIOD_COEFFICIENT)
2016-03-26 11:41:29 -07:00
if player.stamina < 0 then
player.stamina = 0
2016-04-24 11:01:21 -07:00
minetest_wadsprint.set_sprinting(player,false)
2016-03-26 11:41:29 -07:00
end
elseif player.stamina < minetest_wadsprint.STAMINA_MAX_VALUE then
2016-03-26 12:57:03 -07:00
player.stamina = player.stamina + (minetest_wadsprint.STAMINA_MAX_VALUE * minetest_wadsprint.SPRINT_STAMINA_INCREASE_PER_UPDATE_PERIOD_COEFFICIENT)
if player.stamina > minetest_wadsprint.STAMINA_MAX_VALUE then
player.stamina = minetest_wadsprint.STAMINA_MAX_VALUE
end
2016-03-26 11:41:29 -07:00
end
minetest_wadsprint.hudbar_update_stamina(player)
end
function minetest_wadsprint.set_sprinting_physics(player,is_on)
if player.is_sprinting_physics_on ~= is_on then
local physics = player.obj:get_physics_override()
if is_on then
player.obj:set_physics_override(
{
jump = physics.jump - 1 + minetest_wadsprint.SPRINT_JUMP_HEIGHT_MODIFIER_COEFFICIENT,
speed = physics.speed - 1 + minetest_wadsprint.SPRINT_SPEED_MODIFIER_COEFFICIENT,
})
else
if player.is_sprinting_physics_on ~= nil then
2016-04-29 23:00:54 -07:00
player.obj:set_physics_override(
{
jump = physics.jump + 1 - minetest_wadsprint.SPRINT_JUMP_HEIGHT_MODIFIER_COEFFICIENT,
speed = physics.speed + 1 - minetest_wadsprint.SPRINT_SPEED_MODIFIER_COEFFICIENT,
})
end
2016-04-24 11:01:21 -07:00
end
player.is_sprinting_physics_on = is_on
end
end
function minetest_wadsprint.set_sprinting(player,is_sprinting)
if player.is_sprinting ~= is_sprinting then
if player.is_sprinting ~= nil then
if is_sprinting then
minetest_wadsprint.set_sprinting_physics(player,true)
else
2016-05-04 08:33:01 -07:00
if not player.is_ready_to_sprint then
minetest_wadsprint.set_sprinting_physics(player,false)
end
end
end
2016-04-29 23:00:54 -07:00
player.is_sprinting = is_sprinting
2016-03-26 11:41:29 -07:00
minetest_wadsprint.hudbar_update_ready_to_sprint(player)
minetest_wadsprint.hudbar_update_stamina(player)
end
end
function minetest_wadsprint.set_ready_to_sprint(player,is_ready_to_sprint)
if player.is_ready_to_sprint ~= is_ready_to_sprint then
if is_ready_to_sprint then
minetest_wadsprint.set_sprinting_physics(player,true)
else
2016-05-04 08:33:01 -07:00
if not player.is_sprinting then
minetest_wadsprint.set_sprinting_physics(player,false)
end
end
2016-03-26 11:41:29 -07:00
player.is_ready_to_sprint = is_ready_to_sprint
minetest_wadsprint.hudbar_update_ready_to_sprint(player)
end
end
function minetest_wadsprint.scan_player_controls(player)
local control = player.obj:get_player_control()
if not control["up"] then
2016-04-24 11:01:21 -07:00
minetest_wadsprint.set_sprinting(player,false)
2016-03-26 11:41:29 -07:00
end
if control["left"] and control["right"] and not control["down"] then
2016-03-26 11:41:29 -07:00
minetest_wadsprint.set_ready_to_sprint(player,true)
if control["up"] and player.stamina > minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE then
2016-04-24 11:01:21 -07:00
minetest_wadsprint.set_sprinting(player,true)
2016-03-26 11:41:29 -07:00
end
else
minetest_wadsprint.set_ready_to_sprint(player,false)
end
end
function minetest_wadsprint.reset_stamina(player,stamina_value)
if stamina_value == nil then stamina_value = minetest_wadsprint.STAMINA_MAX_VALUE end
player.stamina = stamina_value
2016-04-24 11:01:21 -07:00
minetest_wadsprint.set_sprinting(player,false)
minetest_wadsprint.set_ready_to_sprint(player,false)
return player
end
function minetest_wadsprint.save_players_stats()
local stats = {}
local counter = 1
for key,val in pairs(minetest_wadsprint.players) do
stats[counter] = { name = key, stamina = val.stamina }
counter = counter + 1
end
for key,val in ipairs(minetest_wadsprint.savedstats) do
if minetest_wadsprint.players[val.name] == nil then
stats[counter] = { name = val.name, stamina = val.stamina }
counter = counter + 1
end
if counter == minetest_wadsprint.PLAYERS_STATS_FILE_LIMIT_RECORDS + 1 then
break
end
end
table.save(stats,minetest_wadsprint.savetablepath)
end
function minetest_wadsprint.load_players_stats()
if file_exists(minetest_wadsprint.savetablepath) then
minetest_wadsprint.savedstats = table.load(minetest_wadsprint.savetablepath)
minetest_wadsprint.savedstats.index = {}
for key,val in ipairs(minetest_wadsprint.savedstats) do
minetest_wadsprint.savedstats.index[val.name] = { stamina = val.stamina }
end
end
end
2016-03-26 11:41:29 -07:00
minetest.register_on_joinplayer(function(player_obj)
local player = {}
local playername = player_obj:get_player_name()
if minetest_wadsprint.savedstats.index[playername] ~= nil then
player = minetest_wadsprint.savedstats.index[playername]
else
player = { stamina = minetest_wadsprint.STAMINA_MAX_VALUE }
end
player.obj = player_obj
minetest_wadsprint.players[playername] = player
2016-04-24 11:01:21 -07:00
minetest_wadsprint.initialize_hudbar(player)
minetest_wadsprint.reset_stamina(player,player.stamina)
2016-04-24 11:01:21 -07:00
end)
minetest.register_on_respawnplayer(function(player_obj)
minetest_wadsprint.reset_stamina(minetest_wadsprint.players[player_obj:get_player_name()])
2016-03-26 11:41:29 -07:00
end)
minetest.register_on_leaveplayer(function(player_obj)
local playername = player_obj:get_player_name()
local player = minetest_wadsprint.players[playername]
table.insert(minetest_wadsprint.savedstats, 1, { name = playername, stamina = player.stamina})
minetest_wadsprint.savedstats.index[playername] = { stamina = player.stamina }
minetest_wadsprint.players[playername] = nil
2016-03-26 11:41:29 -07:00
end)
-- Register hudbar call for compatibility with some hudbar mods.
if minetest_wadsprint.register_hudbar ~= nil then
minetest_wadsprint.register_hudbar()
end
-- Save player stats to file on server shutdown.
if minetest_wadsprint.SAVE_PLAYERS_STATS_TO_FILE then
minetest_wadsprint.load_players_stats()
minetest.register_on_shutdown(minetest_wadsprint.save_players_stats)
end
2016-03-26 11:41:29 -07:00
-- Main cycle.
local timer_stats_update = 0
2016-03-26 11:41:29 -07:00
local timer_controls_check = 0
minetest.register_globalstep(function(dtime)
timer_stats_update = timer_stats_update + dtime
2016-03-26 11:41:29 -07:00
timer_controls_check = timer_controls_check + dtime
if timer_stats_update > minetest_wadsprint.PLAYER_STATS_UPDATE_PERIOD_SECONDS then
timer_stats_update = 0
2016-03-26 11:41:29 -07:00
for player_name,player in pairs(minetest_wadsprint.players) do
minetest_wadsprint.stamina_update_cycle(player)
2016-03-26 11:41:29 -07:00
end
end
if timer_controls_check > minetest_wadsprint.PLAYER_CONTROLS_CHECK_PERIOD_SECONDS then
timer_controls_check = 0
2016-03-26 11:41:29 -07:00
for player_name,player in pairs(minetest_wadsprint.players) do
minetest_wadsprint.scan_player_controls(player)
2016-03-26 11:41:29 -07:00
end
end
2016-03-26 12:04:32 -07:00
end)