--[[ Sprint mod for Minetest by GunshipPenguin To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain worldwide. This software is distributed without any warranty. ]] --Configuration variables, these are all explained in README.md local SPRINT_SPEED = 1.35 local SPRINT_JUMP = 1.1 local SPRINT_STAMINA = 10 local SPRINT_TIMEOUT = 0.5 local SPRINT_WARN = true STOP_ON_CLICK = true --If true, sprinting will stop when either the left mouse button or the right mouse button is pressed local players = {} local staminaHud = {} minetest.register_on_joinplayer(function(player) playerName = player:get_player_name() players[playerName] = { state = 0, timeOut = 0, stamina = SPRINT_STAMINA, moving = false, hud = player:hud_add({ hud_elem_type = "statbar", position = {x=0.5,y=1}, size = {x=24, y=24}, text = "stamina.png", number = 20, alignment = {x=0,y=1}, offset = {x=-320, y=-186}, } ), } end) minetest.register_on_leaveplayer(function(player) playerName = player:get_player_name() players[playerName] = nil end) minetest.register_globalstep(function(dtime) --Get the gametime local gameTime = minetest.get_gametime() --Loop through all connected players for playerName,playerInfo in pairs(players) do local player = minetest.get_player_by_name(playerName) if player ~= nil then --Check if they are moving or not players[playerName]["moving"] = player:get_player_control()["up"] -- s'arrete si le joueur fait un clique gauche ou droit if player:get_player_control()["RMB"] or player:get_player_control()["LMB"] and STOP_ON_CLICK == true then players[playerName]["state"] = 0 player:set_physics_override({speed=1.0, jump=1.0}) end --If the player has tapped w longer than SPRINT_TIMEOUT ago, set his/her state to 0 if playerInfo["state"] == 2 then if playerInfo["timeOut"] + SPRINT_TIMEOUT < gameTime then players[playerName]["timeOut"] = nil setState(playerName, 0) end --If the player is sprinting, create particles behind him/her elseif playerInfo["state"] == 3 and gameTime % 0.1 == 0 then local numParticles = math.random(1, 2) local playerPos = player:getpos() local playerNode = minetest.get_node({x=playerPos["x"], y=playerPos["y"]-1, z=playerPos["z"]}) if playerNode["name"] ~= "air" then for i=1, numParticles, 1 do minetest.add_particle({ 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}, vel = {x=0, y=5, z=0}, acc = {x=0, y=-13, z=0}, expirationtime = math.random(), size = math.random()+0.5, collisiondetection = true, vertical = false, texture = "default_dirt.png", }) end end end --Adjust player states if players[playerName]["moving"] == false and playerInfo["state"] == 3 then --Stopped setState(playerName, 0) elseif players[playerName]["moving"] == true and playerInfo["state"] == 0 then --Moving setState(playerName, 1) elseif players[playerName]["moving"] == false and playerInfo["state"] == 1 then --Primed setState(playerName, 2) elseif players[playerName]["moving"] == true and playerInfo["state"] == 2 then --Sprinting setState(playerName, 3) end --Lower the player's stamina by dtime if he/she is sprinting and set his/her state to 0 if stamina is zero if playerInfo["state"] == 3 then playerInfo["stamina"] = playerInfo["stamina"] - dtime if playerInfo["stamina"] <= 0 then playerInfo["stamina"] = 0 setState(playerName, 0) if SPRINT_WARN then minetest.chat_send_player(playerName, "Votre sprint s'arrete, plus d'endurance ! Your sprint stamina has run out !") end end --Increase player's stamina if he/she is not sprinting and his/her stamina is less than SPRINT_STAMINA elseif playerInfo["state"] ~= 3 and playerInfo["stamina"] < SPRINT_STAMINA then playerInfo["stamina"] = playerInfo["stamina"] + dtime end --Update the players's hud sprint stamina bar local numBars = (playerInfo["stamina"]/SPRINT_STAMINA)*20 player:hud_change(playerInfo["hud"], "number", numBars) end end end) function setState(playerName, state) --Sets the state of a player (0=stopped, 1=moving, 2=primed, 3=sprinting) local player = minetest.get_player_by_name(playerName) local gameTime = minetest.get_gametime() if players[playerName] then players[playerName]["state"] = state if state == 0 then--Stopped player:set_physics_override({speed=1.0,jump=1.0}) elseif state == 2 then --Primed players[playerName]["timeOut"] = gameTime elseif state == 3 then --Sprinting player:set_physics_override({speed=SPRINT_SPEED,jump=SPRINT_JUMP}) end return true end return false end