Remplissage du dépôt.

This commit is contained in:
sys4-fr 2018-09-08 21:37:18 +02:00
parent 223292d0f9
commit b810c3ee58
8 changed files with 446 additions and 2 deletions

63
README.md Normal file → Executable file
View File

@ -1,3 +1,62 @@
# sprint
Sprint Mod For Minetest by GunshipPenguin
Dépôt du mod sprint. Extrait du dépôt MFF classic.
Allows the player to sprint by either double tapping w or pressing e.
By default, sprinting will make the player travel 80% faster and
allow him/her to jump 10% higher. Also adds a stamina bar that goes
down when the player sprints and goes up when he/she isn't
sprinting.
This mod is compatible with the HUD bars [hudbars] mod, but does
not depend on it. In this care, a green HUD bar will be displayed,
also showing a number.
If this mod is not present, a standard statbar with 0-20
“half-arrows” is shown, which is a bit more coarse than the HUD
bar version.
Licence: CC0 (see COPYING file)
---
This mod can be configured by changing the variables declared in
the start of init.lua. The following is a brief explanation of each
one.
SPRINT_METHOD (default 1)
What a player has to do to start sprinting. 0 = double tap w, 1 = press e.
Note that if you have the fast privlige, and have the fast
speed turned on, you will run very, very fast. You can toggle this
by pressing j.
SPRINT_SPEED (default 1.5)
How fast the player will move when sprinting as opposed to normal
movement speed. 1.0 represents normal speed so 1.5 would mean that a
sprinting player would travel 50% faster than a walking player and
2.4 would mean that a sprinting player would travel 140% faster than
a walking player.
SPRINT_JUMP (default 1.1)
How high the player will jump when sprinting as opposed to normal
jump height. Same as SPRINT_SPEED, just controls jump height while
sprinting rather than speed.
SPRINT_STAMINA (default 20)
How long the player can sprint for in seconds. Each player has a
stamina variable assigned to them, it is initially set to
SPRINT_STAMINA and can go no higher. When the player is sprinting,
this variable ticks down once each second, and when it reaches 0,
the player stops sprinting. It ticks back up when the player isn't
sprinting and stops at SPRINT_STAMINA. Set this to a huge value if
you want unlimited sprinting.
SPRINT_TIMEOUT (default 0.5)
Only used if SPRINT_METHOD = 0.
How much time the player has after releasing w, to press w again and
start sprinting. Setting this too high will result in unwanted
sprinting and setting it too low will result in it being
difficult/impossible to sprint.

2
depends.txt Executable file
View File

@ -0,0 +1,2 @@
hudbars?
player_physics

195
esprint.lua Executable file
View File

@ -0,0 +1,195 @@
--[[
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.
]]
sprint.players = {}
local staminaHud = {}
-- Lil' helping functions
sprint.set_maxstamina = function(pname, mstamina)
if sprint.players[pname] and mstamina > 0 then
sprint.players[pname].maxStamina = mstamina
if sprint.players[pname].stamina > sprint.players[pname].maxStamina then
sprint.players[pname].stamina = sprint.players[pname].maxStamina
end
hb.change_hudbar(minetest.get_player_by_name(pname), "sprint", sprint.players[pname].stamina, sprint.players[pname].maxStamina)
end
end
sprint.get_maxstamina = function(pname)
if sprint.players[pname] then
return sprint.players[pname].maxStamina
end
end
sprint.increase_maxstamina = function(pname, sincrease)
local stamina = sprint.get_maxstamina(pname)
if stamina then
sprint.set_maxstamina(pname, stamina + sincrease)
end
end
sprint.decrease_maxstamina = function(pname, sdicrease)
local stamina = sprint.get_maxstamina(pname)
if stamina then
sprint.set_maxstamina(pname, stamina - sdicrease)
end
end
-- When you write shit english, don't write shit code.
-- Writing it in your native language would be less of a pain.
-- - gravgun
sprint.dicrease_maxstamina = sprint.decrease_maxstamina
sprint.set_default_maxstamina = function(pname)
sprint.set_maxstamina(pname, SPRINT_STAMINA)
end
minetest.register_on_joinplayer(function(player)
local playerName = player:get_player_name()
sprint.players[playerName] = {
sprinting = false,
timeOut = 0,
stamina = SPRINT_STAMINA,
shouldSprint = false,
maxStamina = SPRINT_STAMINA
}
if SPRINT_HUDBARS_USED then
hb.init_hudbar(player, "sprint")
else
sprint.players[playerName].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
end)
minetest.register_on_leaveplayer(function(player)
local playerName = player:get_player_name()
sprint.players[playerName] = nil
end)
local gameTime = 0
minetest.register_globalstep(function(dtime)
--Get the gametime
gameTime = gameTime + dtime
--Loop through all connected sprint.players
for playerName,playerInfo in pairs(sprint.players) do
local player = minetest.get_player_by_name(playerName)
if player ~= nil then
--Check if the player should be sprinting
if player:get_player_control()["aux1"] and player:get_player_control()["up"] then
sprint.players[playerName]["shouldSprint"] = true
else
sprint.players[playerName]["shouldSprint"] = false
end
--Stop sprinting if the player is pressing the LMB or RMB
if player:get_player_control()["LMB"] or player:get_player_control()["RMB"] then
setSprinting(playerName, false)
playerInfo["timeOut"] = 3
end
if gameTime > 0.4 then
local pos = player:getpos()
-- From playerplus :
-- am I near a spiky cactus?
pos.y = pos.y + 0.1
if minetest.find_node_near(pos, 1, "default:cactus_spiky") and player:get_hp() > 0 then
player:set_hp(player:get_hp()-1)
end
--If the player is sprinting, create particles behind him/her
if playerInfo["sprinting"] == true 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},
velocity = {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 = "sprint_particle.png",
})
end
end
end
end
--Adjust player states
if sprint.players[playerName]["shouldSprint"] == true and playerInfo["timeOut"] == 0 then --Stopped
setSprinting(playerName, true)
elseif sprint.players[playerName]["shouldSprint"] == false then
setSprinting(playerName, false)
end
if playerInfo["timeOut"] > 0 then
playerInfo["timeOut"] = playerInfo["timeOut"] - dtime
if playerInfo["timeOut"] < 0 then
playerInfo["timeOut"] = 0
end
else
--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["sprinting"] == true then
playerInfo["stamina"] = playerInfo["stamina"] - dtime
if playerInfo["stamina"] <= 0 then
playerInfo["stamina"] = 0
setSprinting(playerName, false)
playerInfo["timeOut"] = 1
minetest.sound_play("default_breathless",{object=player})
end
end
end
--Increase player's stamina if he/she is not sprinting and his/her stamina is less than SPRINT_STAMINA
if playerInfo["sprinting"] == false and playerInfo["stamina"] < playerInfo["maxStamina"] then
playerInfo["stamina"] = playerInfo["stamina"] + dtime
end
-- Cap stamina at SPRINT_STAMINA
if playerInfo["stamina"] > playerInfo["maxStamina"] then
playerInfo["stamina"] = playerInfo["maxStamina"]
end
--Update the sprint.players's hud sprint stamina bar
if SPRINT_HUDBARS_USED then
hb.change_hudbar(player, "sprint", playerInfo["stamina"])
else
local numBars = (playerInfo["stamina"]/playerInfo["maxStamina"])*20
player:hud_change(playerInfo["hud"], "number", numBars)
end
end
end
if gameTime > 0.4 then
gameTime = 0
end
end)
function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting)
local player = minetest.get_player_by_name(playerName)
if sprint.players[playerName] then
sprint.players[playerName]["sprinting"] = sprinting
if sprinting == true then
player_physics.set_stats(player, "sprint", {speed=SPRINT_SPEED, jump=SPRINT_JUMP})
elseif sprinting == false then
player_physics.set_stats(player, "sprint", {speed=0, jump=0})
end
return true
end
return false
end

36
init.lua Executable file
View File

@ -0,0 +1,36 @@
--[[
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
SPRINT_METHOD = 1
SPRINT_SPEED = 0.35
SPRINT_JUMP = 0.1
SPRINT_STAMINA = 10
SPRINT_TIMEOUT = 0.5 --Only used if SPRINT_METHOD = 0
sprint = {}
if minetest.get_modpath("hudbars") ~= nil then
hb.register_hudbar("sprint", 0xFFFFFF, "Stamina",
{ bar = "sprint_stamina_bar.png", icon = "stamina.png" },
SPRINT_STAMINA, SPRINT_STAMINA,
false, "%s: %.1f/%.1f")
SPRINT_HUDBARS_USED = true
else
SPRINT_HUDBARS_USED = false
end
if SPRINT_METHOD == 0 then
dofile(minetest.get_modpath("sprint") .. "/wsprint.lua")
elseif SPRINT_METHOD == 1 then
dofile(minetest.get_modpath("sprint") .. "/esprint.lua")
else
minetest.log("error", "Sprint Mod - SPRINT_METHOD is not set properly, using e to sprint")
dofile(minetest.get_modpath("sprint") .. "/esprint.lua")
end

BIN
textures/sprint_particle.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

BIN
textures/sprint_stamina_bar.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 B

BIN
textures/stamina.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 514 B

152
wsprint.lua Executable file
View File

@ -0,0 +1,152 @@
--[[
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)
local playerName = player:get_player_name()
players[playerName] = {
state = 0,
timeOut = 0,
stamina = SPRINT_STAMINA,
moving = false,
}
if SPRINT_HUDBARS_USED then
hb.init_hudbar(player, "sprint")
else
players[playerName].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
end)
minetest.register_on_leaveplayer(function(player)
local 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)
local pos = player:getpos()
if player ~= nil then
-- From playerplus :
-- am I near a cactus?
pos.y = pos.y + 0.1
local near = minetest.find_node_near(pos, 1, "default:cactus")
if near then
pos = near
-- am I touching the cactus? if so it hurts
for _,player in ipairs(minetest.get_objects_inside_radius(pos, 1.0)) do
if player:get_hp() > 0 then
player:set_hp(player:get_hp()-1)
end
end
end
--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,
texture = "sprint_particle.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)
minetest.sound_play("default_breathless",{object=player})
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
-- Cap stamina at SPRINT_STAMINA
if playerInfo["stamina"] > SPRINT_STAMINA then
playerInfo["stamina"] = SPRINT_STAMINA
end
--Update the players's hud sprint stamina bar
if SPRINT_HUDBARS_USED then
hb.change_hudbar(player, "sprint", playerInfo["stamina"])
else
local numBars = (playerInfo["stamina"]/SPRINT_STAMINA)*20
player:hud_change(playerInfo["hud"], "number", numBars)
end
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_physics.set_stats(player, "sprint", {speed=0, jump=0})
elseif state == 2 then --Primed
players[playerName]["timeOut"] = gameTime
elseif state == 3 then --Sprinting
player_physics.set_stats(player, "sprint", {speed=SPRINT_SPEED, jump=SPRINT_JUMP})
end
return true
end
return false
end