2 Sprint mod for Minetest by GunshipPenguin
4 To the extent possible under law, the author(s)
5 have dedicated all copyright and related and neighboring rights
6 to this software to the public domain worldwide. This software is
7 distributed without any warranty.
10 --Configuration variables, these are all explained in README.md
13 mcl_sprint
.SPEED
= 1.3
17 -- Returns true if the player with the given name is sprinting, false if not.
18 -- Returns nil if player does not exist.
19 mcl_sprint
.is_sprinting
= function(playername
)
20 if players
[playername
] then
21 return players
[playername
].sprinting
27 minetest
.register_on_joinplayer(function(player
)
28 local playerName
= player
:get_player_name()
30 players
[playerName
] = {
34 lastPos
= player
:get_pos(),
38 minetest
.register_on_leaveplayer(function(player
)
39 local playerName
= player
:get_player_name()
40 players
[playerName
] = nil
43 local function setSprinting(playerName
, sprinting
) --Sets the state of a player (0=stopped/moving, 1=sprinting)
44 local player
= minetest
.get_player_by_name(playerName
)
45 if players
[playerName
] then
46 players
[playerName
]["sprinting"] = sprinting
47 if sprinting
== true then
48 playerphysics
.add_physics_factor(player
, "speed", "mcl_sprint:sprint", mcl_sprint
.SPEED
)
49 elseif sprinting
== false then
50 playerphysics
.remove_physics_factor(player
, "speed", "mcl_sprint:sprint")
56 minetest
.register_globalstep(function(dtime
)
58 local gameTime
= minetest
.get_gametime()
60 --Loop through all connected players
61 for playerName
,playerInfo
in pairs(players
) do
62 local player
= minetest
.get_player_by_name(playerName
)
64 local ctrl
= player
:get_player_control()
65 --Check if the player should be sprinting
66 if ctrl
.aux1
and ctrl
.up
and not ctrl
.sneak
then
67 players
[playerName
]["shouldSprint"] = true
69 players
[playerName
]["shouldSprint"] = false
72 local playerPos
= player
:get_pos()
73 --If the player is sprinting, create particles behind and cause exhaustion
74 if playerInfo
["sprinting"] == true and gameTime
% 0.1 == 0 then
76 -- Exhaust player for sprinting
77 local lastPos
= players
[playerName
].lastPos
78 local dist
= vector
.distance({x
=lastPos
.x
, y
=0, z
=lastPos
.z
}, {x
=playerPos
.x
, y
=0, z
=playerPos
.z
})
79 players
[playerName
].sprintDistance
= players
[playerName
].sprintDistance
+ dist
80 if players
[playerName
].sprintDistance
>= 1 then
81 local superficial
= math
.floor(players
[playerName
].sprintDistance
)
82 mcl_hunger
.exhaust(playerName
, mcl_hunger
.EXHAUST_SPRINT
* superficial
)
83 players
[playerName
].sprintDistance
= players
[playerName
].sprintDistance
- superficial
86 -- Sprint dirt particles
87 local numParticles
= math
.random(1, 2)
88 local playerNode
= minetest
.get_node({x
=playerPos
["x"], y
=playerPos
["y"]-1, z
=playerPos
["z"]})
89 if playerNode
["name"] ~= "air" then
90 for i
=1, numParticles
, 1 do
91 minetest
.add_particle({
92 pos
= {x
=playerPos
["x"]+math
.random(-1,1)*math
.random()/2,y
=playerPos
["y"]+0.1,z
=playerPos
["z"]+math
.random(-1,1)*math
.random()/2},
93 velocity
= {x
=0, y
=5, z
=0},
94 acceleration
= {x
=0, y
=-13, z
=0},
95 expirationtime
= math
.random(),
96 size
= math
.random()+0.5,
97 collisiondetection
= true,
99 texture
= "default_dirt.png",
105 --Adjust player states
106 players
[playerName
].lastPos
= playerPos
107 if players
[playerName
]["shouldSprint"] == true then --Stopped
109 -- Prevent sprinting if hungry or sleeping
110 if (mcl_hunger
.active
and mcl_hunger
.get_hunger(player
) <= 6) or (player
:get_attribute("mcl_beds:sleeping") == "true")then
115 setSprinting(playerName
, sprinting
)
116 elseif players
[playerName
]["shouldSprint"] == false then
117 setSprinting(playerName
, false)