wsprint.lua 4.44 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
--[[
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. 
]]

local players = {}
local staminaHud = {}

minetest.register_on_joinplayer(function(player)
14
	local playerName = player:get_player_name()
15 16 17 18 19
	players[playerName] = {
		state = 0, 
		timeOut = 0, 
		stamina = SPRINT_STAMINA, 
		moving = false, 
20 21 22
	}

	if SPRINT_HUDBARS_USED then
Wuzzy's avatar
Wuzzy committed
23
		hb.init_hudbar(player, "sprint")
24 25
	else
		players[playerName].hud = player:hud_add({
26 27 28
			hud_elem_type = "statbar",
			position = {x=0.5,y=1},
			size = {x=24, y=24},
Wuzzy's avatar
Wuzzy committed
29
			text = "sprint_stamina_icon.png",
30 31
			number = 20,
			alignment = {x=0,y=1},
Milan's avatar
Milan committed
32 33
			offset = {x=14, y=-126},
        }
34 35
		)
	end
36 37
end)
minetest.register_on_leaveplayer(function(player)
38
	local playerName = player:get_player_name()
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
	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"]
			
			--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,
74
							texture = "sprint_particle.png",
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
						})
					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)
				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
Wuzzy's avatar
Wuzzy committed
103 104 105 106
			-- Cap stamina at SPRINT_STAMINA
			if playerInfo["stamina"] > SPRINT_STAMINA then
				playerInfo["stamina"] = SPRINT_STAMINA
			end
107 108
			
			--Update the players's hud sprint stamina bar
109 110

			if SPRINT_HUDBARS_USED then
Wuzzy's avatar
Wuzzy committed
111
				hb.change_hudbar(player, "sprint", playerInfo["stamina"])
112
			else
113
				local numBars = (playerInfo["stamina"]/SPRINT_STAMINA)*20
114 115
				player:hud_change(playerInfo["hud"], "number", numBars)
			end
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
		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