Massive code refactoring.

master
aa6 2017-01-13 23:39:28 +03:00
parent 083fceba18
commit 7bb254b961
3 changed files with 149 additions and 129 deletions

View File

@ -1 +1 @@
0.4.18 0.4.19

276
init.lua
View File

@ -12,6 +12,7 @@ minetest_wadsprint =
-- obj: <player object> -- obj: <player object>
-- name: <playername> -- name: <playername>
-- stamina: -- stamina:
-- is_walking:
-- is_sprinting: -- is_sprinting:
-- is_ready_to_sprint: -- is_ready_to_sprint:
-- is_sprinting_physics_on: -- is_sprinting_physics_on:
@ -33,10 +34,11 @@ dofile(minetest.get_modpath(minetest.get_current_modname()).."/init_hudbars.lua"
function minetest_wadsprint.api.stats(player_name) function minetest_wadsprint.api.stats(player_name)
local player = minetest_wadsprint.stats[player_name] local player = minetest_wadsprint.stats[player_name]
if player ~= nil then if player ~= nil then
return return -- Return copied values to be sure that they won't be changed directly by accident.
{ {
name = player_name, name = player_name,
stamina = player.stamina, stamina = player.stamina,
is_walking = player.is_walking,
is_sprinting = player.is_sprinting, is_sprinting = player.is_sprinting,
is_ready_to_sprint = player.is_ready_to_sprint, is_ready_to_sprint = player.is_ready_to_sprint,
is_sprinting_physics_on = player.is_sprinting_physics_on, is_sprinting_physics_on = player.is_sprinting_physics_on,
@ -79,80 +81,57 @@ function minetest_wadsprint.stamina_update_cycle(player)
end end
end end
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------- scan_player_controls() -- ----------------------------------------------------------------------------- switch_to_walking() --
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
function minetest_wadsprint.scan_player_controls(player) function minetest_wadsprint.switch_to_walking(player)
local control = player.obj:get_player_control() if player.is_walking == false then
if player.is_sprinting and not control["up"] then if player.is_sprinting_physics_on == true then
minetest_wadsprint.set_sprinting(player,false) minetest_wadsprint.set_sprinting_physics(player,false)
end
if control["left"] and control["right"] and not control["down"] then
if player.stamina > minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE then
minetest_wadsprint.set_ready_to_sprint(player,true)
if control["up"] then
minetest_wadsprint.set_sprinting(player,true)
end
end end
else player.is_walking = true
minetest_wadsprint.set_ready_to_sprint(player,false) player.is_sprinting = false
end player.is_ready_to_sprint = false
end
----------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------- set_sprinting() --
----------------------------------------------------------------------------------------------------
-- If player.is_sprinting that means he is actually moving forward. If player is not moving then he
-- isn't sprinting. `player.is_sprinting` could be nil if the value is not initialized. Nil is not
-- equal nor to true neither to false.
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
if not player.is_ready_to_sprint then
minetest_wadsprint.set_sprinting_physics(player,false)
end
end
end
player.is_sprinting = is_sprinting
minetest_wadsprint.hudbar_update_ready_to_sprint(player) minetest_wadsprint.hudbar_update_ready_to_sprint(player)
minetest_wadsprint.hudbar_update_stamina(player) minetest_wadsprint.hudbar_update_stamina(player)
end end
end end
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------- set_stamina() -- --------------------------------------------------------------------- switch_to_ready_to_sprint() --
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
function minetest_wadsprint.set_stamina(player,stamina_value) -- Main use of this function is to put player in a state when pressing "W" would trigger the
local old_stamina_value = player.stamina -- sprinting state thus you won't need to hold "A"+"D" to keep sprinting. Also it alters player
if stamina_value < 0 then -- physics to workaround lag between pressing "W" and actual sprinting. So if player is ready to
minetest_wadsprint.set_sprinting(player,false) -- sprint it is sure that his physics is already in sprinting state and he can not afraid to fall
minetest_wadsprint.set_ready_to_sprint(player,false) -- while jumping from a tree to tree just because the lag between pressing "W" and sprinting state
player.stamina = 0 -- would be too big. At the same time being only ready to sprint and not actually sprinting does
elseif stamina_value > minetest_wadsprint.STAMINA_MAX_VALUE then -- not decreases the stamina because decreasing stamina for not sprinting is unfair.
player.stamina = minetest_wadsprint.STAMINA_MAX_VALUE function minetest_wadsprint.switch_to_ready_to_sprint(player)
else if player.is_ready_to_sprint == false then
player.stamina = stamina_value if player.is_sprinting_physics_on == false then
minetest_wadsprint.set_sprinting_physics(player,true)
end
player.is_walking = false
player.is_sprinting = false
player.is_ready_to_sprint = true
minetest_wadsprint.hudbar_update_ready_to_sprint(player)
minetest_wadsprint.hudbar_update_stamina(player)
end end
if old_stamina_value >= minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE and player.stamina < minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE then end
minetest_wadsprint.api.events:emit( ----------------------------------------------------------------------------------------------------
"dyspnea", --------------------------------------------------------------------------- switch_to_sprinting() --
{ ----------------------------------------------------------------------------------------------------
name = "dyspnea", -- Sprinting means that player is moving forward. If player isn't moving then he isn't sprinting.
value = true, function minetest_wadsprint.switch_to_sprinting(player)
player = player, if player.is_sprinting == false then
} if player.is_sprinting_physics_on == false then
) minetest_wadsprint.set_sprinting_physics(player,true)
elseif old_stamina_value < minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE and player.stamina >= minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE then end
minetest_wadsprint.api.events:emit( player.is_walking = false
"dyspnea", player.is_sprinting = true
{ player.is_ready_to_sprint = false
name = "dyspnea", minetest_wadsprint.hudbar_update_ready_to_sprint(player)
value = false, minetest_wadsprint.hudbar_update_stamina(player)
player = player,
}
)
end end
minetest_wadsprint.hudbar_update_stamina(player)
end end
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
------------------------------------------------------------------------- set_sprinting_physics() -- ------------------------------------------------------------------------- set_sprinting_physics() --
@ -179,37 +158,106 @@ function minetest_wadsprint.set_sprinting_physics(player,is_on)
end end
end end
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------- set_ready_to_sprint() -- -------------------------------------------------------------------------- scan_player_controls() --
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
-- Main use of this function is to put player in a state when pressing "W" would trigger the function minetest_wadsprint.scan_player_controls(player)
-- set_sprinting function thus you won't need to hold "A"+"D" to keep sprinting. Also it alters local control = player.obj:get_player_control()
-- player physics to workaround lag between pressing "W" and actual set_sprinting call. So if player if not (player.is_sprinting and control["up"]) then
-- is ready to sprint it is sure that his physics is already in sprinting state and he can not if control["left"] and control["right"] and not control["down"] then
-- afraid to fall while jumping from a tree to tree just because the lag between pressing "W" and if player.stamina > minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE then
-- set_sprinting call would be too big. At the same time being only ready to sprint and not actually if control["up"] then
-- sprinting does not decreases the stamina because decreasing stamina for nothing is unfair. minetest_wadsprint.switch_to_sprinting(player)
function minetest_wadsprint.set_ready_to_sprint(player,is_ready_to_sprint) else
if player.is_ready_to_sprint ~= is_ready_to_sprint then minetest_wadsprint.switch_to_ready_to_sprint(player)
if is_ready_to_sprint then end
minetest_wadsprint.set_sprinting_physics(player,true)
else
if not player.is_sprinting then
minetest_wadsprint.set_sprinting_physics(player,false)
end end
else
minetest_wadsprint.switch_to_walking(player)
end end
player.is_ready_to_sprint = is_ready_to_sprint
minetest_wadsprint.hudbar_update_ready_to_sprint(player)
end end
end end
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------- reset_stamina() -- ----------------------------------------------------------------------------------- set_stamina() --
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
function minetest_wadsprint.reset_stamina(player,stamina_value) function minetest_wadsprint.set_stamina(player,stamina_value)
if stamina_value == nil then stamina_value = minetest_wadsprint.STAMINA_MAX_VALUE end local old_stamina_value = player.stamina
minetest_wadsprint.set_stamina(player,stamina_value) if stamina_value < 0 then
minetest_wadsprint.set_sprinting(player,false) minetest_wadsprint.switch_to_walking(player)
minetest_wadsprint.set_ready_to_sprint(player,false) player.stamina = 0
return player elseif stamina_value > minetest_wadsprint.STAMINA_MAX_VALUE then
player.stamina = minetest_wadsprint.STAMINA_MAX_VALUE
else
player.stamina = stamina_value
end
if old_stamina_value >= minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE
and player.stamina < minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE then
minetest_wadsprint.api.events:emit(
"dyspnea",
{
name = "dyspnea",
value = true,
player = player,
}
)
elseif old_stamina_value < minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE
and player.stamina >= minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE then
minetest_wadsprint.api.events:emit(
"dyspnea",
{
name = "dyspnea",
value = false,
player = player,
}
)
end
minetest_wadsprint.hudbar_update_stamina(player)
end
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------- initialize_player() --
----------------------------------------------------------------------------------------------------
function minetest_wadsprint.initialize_player(player_obj)
local player =
{
obj = player_obj,
name = player_obj:get_player_name(),
is_walking = true,
is_sprinting = false,
is_ready_to_sprint = false,
is_sprinting_physics_on = false,
}
if minetest_wadsprint.offline_stats[player.name] ~= nil then
player.stamina = minetest_wadsprint.offline_stats[player.name].stamina
else
player.stamina = minetest_wadsprint.STAMINA_MAX_VALUE
end
minetest_wadsprint.stats[player.name] = player
minetest_wadsprint.initialize_hudbar(player)
if player.stamina < minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE then
minetest_wadsprint.api.events:emit(
"dyspnea",
{
name = "dyspnea",
value = true,
player = player,
}
)
end
end
----------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------- reset_player() --
----------------------------------------------------------------------------------------------------
function minetest_wadsprint.reset_player(player_obj)
local player = minetest_wadsprint.stats[player_obj:get_player_name()]
minetest_wadsprint.set_stamina(player,minetest_wadsprint.STAMINA_MAX_VALUE)
minetest_wadsprint.switch_to_walking(player)
end
----------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------- deinitialize_player() --
----------------------------------------------------------------------------------------------------
function minetest_wadsprint.deinitialize_player(player_obj)
local player = minetest_wadsprint.stats[player_obj:get_player_name()]
minetest_wadsprint.offline_stats[player.name] = { stamina = player.stamina, was_online = true }
minetest_wadsprint.stats[player.name] = nil
end end
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------- save_players_stats() -- ---------------------------------------------------------------------------- save_players_stats() --
@ -222,12 +270,17 @@ function minetest_wadsprint.save_players_stats()
counter = counter + 1 counter = counter + 1
end end
for key,val in ipairs(minetest_wadsprint.offline_stats) do for key,val in ipairs(minetest_wadsprint.offline_stats) do
if minetest_wadsprint.stats[val.name] == nil then if counter == minetest_wadsprint.PLAYERS_STATS_FILE_LIMIT_RECORDS then break end
if minetest_wadsprint.stats[val.name] == nil and val.was_online ~= nil then
stats[counter] = { name = val.name, stamina = val.stamina } stats[counter] = { name = val.name, stamina = val.stamina }
counter = counter + 1 counter = counter + 1
end end
if counter == minetest_wadsprint.PLAYERS_STATS_FILE_LIMIT_RECORDS + 1 then end
break for key,val in ipairs(minetest_wadsprint.offline_stats) do
if counter == minetest_wadsprint.PLAYERS_STATS_FILE_LIMIT_RECORDS then break end
if minetest_wadsprint.stats[val.name] == nil and val.was_online == nil then
stats[counter] = { name = val.name, stamina = val.stamina }
counter = counter + 1
end end
end end
table.save(stats,minetest_wadsprint.savepath) table.save(stats,minetest_wadsprint.savepath)
@ -247,42 +300,9 @@ end
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------ Mod initialization -- ------------------------------------------------------------------------------ Mod initialization --
---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
minetest.register_on_joinplayer(function(player_obj) minetest.register_on_joinplayer(minetest_wadsprint.initialize_player)
local player = {} minetest.register_on_respawnplayer(minetest_wadsprint.reset_player)
local playername = player_obj:get_player_name() minetest.register_on_leaveplayer(minetest_wadsprint.deinitialize_player)
if minetest_wadsprint.offline_stats[playername] ~= nil then
player = minetest_wadsprint.offline_stats[playername]
else
player = { stamina = minetest_wadsprint.STAMINA_MAX_VALUE }
end
player.obj = player_obj
player.name = playername
minetest_wadsprint.stats[playername] = player
minetest_wadsprint.initialize_hudbar(player)
minetest_wadsprint.reset_stamina(player,player.stamina)
if player.stamina < minetest_wadsprint.DYSPNEA_THRESHOLD_VALUE then
minetest_wadsprint.api.events:emit(
"dyspnea",
{
name = "dyspnea",
value = true,
player = player,
}
)
end
end)
minetest.register_on_respawnplayer(function(player_obj)
minetest_wadsprint.reset_stamina(minetest_wadsprint.stats[player_obj:get_player_name()])
end)
minetest.register_on_leaveplayer(function(player_obj)
local playername = player_obj:get_player_name()
local player = minetest_wadsprint.stats[playername]
table.insert(minetest_wadsprint.offline_stats, 1, { name = playername, stamina = player.stamina})
minetest_wadsprint.offline_stats[playername] = { stamina = player.stamina }
minetest_wadsprint.stats[playername] = nil
end)
-- Register hudbar call for compatibility with some hudbar mods. -- Register hudbar call for compatibility with some hudbar mods.
if minetest_wadsprint.register_hudbar ~= nil then if minetest_wadsprint.register_hudbar ~= nil then

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB