Add smooth FOV transition when sprinting

This commit is contained in:
Brandon 2020-06-23 18:17:30 -04:00
parent b75075a135
commit d632cf289c

View File

@ -2,9 +2,9 @@
Sprint mod for Minetest by GunshipPenguin Sprint mod for Minetest by GunshipPenguin
To the extent possible under law, the author(s) To the extent possible under law, the author(s)
have dedicated all copyright and related and neighboring rights have dedicated all copyright and related and neighboring rights
to this software to the public domain worldwide. This software is to this software to the public domain worldwide. This software is
distributed without any warranty. distributed without any warranty.
]] ]]
--Configuration variables, these are all explained in README.md --Configuration variables, these are all explained in README.md
@ -29,10 +29,11 @@ minetest.register_on_joinplayer(function(player)
players[playerName] = { players[playerName] = {
sprinting = false, sprinting = false,
timeOut = 0, timeOut = 0,
shouldSprint = false, shouldSprint = false,
lastPos = player:get_pos(), lastPos = player:get_pos(),
sprintDistance = 0, sprintDistance = 0,
fov = 1.0
} }
end) end)
minetest.register_on_leaveplayer(function(player) minetest.register_on_leaveplayer(function(player)
@ -43,10 +44,14 @@ end)
local function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting) local function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting)
local player = minetest.get_player_by_name(playerName) local player = minetest.get_player_by_name(playerName)
if players[playerName] then if players[playerName] then
players[playerName]["sprinting"] = sprinting players[playerName].sprinting = sprinting
if sprinting == true then if sprinting == true then
players[playerName].fov = math.min(players[playerName].fov + 0.02, 1.2)
player:set_fov(players[playerName].fov, true, 0.15)
playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED) playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED)
elseif sprinting == false then elseif sprinting == false then
players[playerName].fov = math.max(players[playerName].fov - 0.02, 1.0)
player:set_fov(players[playerName].fov, true, 0.15)
playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint") playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint")
end end
return true return true
@ -68,7 +73,7 @@ minetest.register_globalstep(function(dtime)
else else
players[playerName]["shouldSprint"] = false players[playerName]["shouldSprint"] = false
end end
local playerPos = player:get_pos() local playerPos = player:get_pos()
--If the player is sprinting, create particles behind and cause exhaustion --If the player is sprinting, create particles behind and cause exhaustion
if playerInfo["sprinting"] == true and gameTime % 0.1 == 0 then if playerInfo["sprinting"] == true and gameTime % 0.1 == 0 then
@ -117,7 +122,7 @@ minetest.register_globalstep(function(dtime)
elseif players[playerName]["shouldSprint"] == false then elseif players[playerName]["shouldSprint"] == false then
setSprinting(playerName, false) setSprinting(playerName, false)
end end
end end
end end
end) end)