From b810c3ee58f3b5e236bae9c5fd25773a5b815119 Mon Sep 17 00:00:00 2001 From: sys4-fr Date: Sat, 8 Sep 2018 21:37:18 +0200 Subject: [PATCH] =?UTF-8?q?Remplissage=20du=20d=C3=A9p=C3=B4t.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 63 ++++++++++- depends.txt | 2 + esprint.lua | 195 ++++++++++++++++++++++++++++++++ init.lua | 36 ++++++ textures/sprint_particle.png | Bin 0 -> 791 bytes textures/sprint_stamina_bar.png | Bin 0 -> 80 bytes textures/stamina.png | Bin 0 -> 514 bytes wsprint.lua | 152 +++++++++++++++++++++++++ 8 files changed, 446 insertions(+), 2 deletions(-) mode change 100644 => 100755 README.md create mode 100755 depends.txt create mode 100755 esprint.lua create mode 100755 init.lua create mode 100755 textures/sprint_particle.png create mode 100755 textures/sprint_stamina_bar.png create mode 100755 textures/stamina.png create mode 100755 wsprint.lua diff --git a/README.md b/README.md old mode 100644 new mode 100755 index b2ecea7..71e7d44 --- a/README.md +++ b/README.md @@ -1,3 +1,62 @@ -# sprint +Sprint Mod For Minetest by GunshipPenguin -Dépôt du mod sprint. Extrait du dépôt MFF classic. \ No newline at end of file +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. diff --git a/depends.txt b/depends.txt new file mode 100755 index 0000000..0388f66 --- /dev/null +++ b/depends.txt @@ -0,0 +1,2 @@ +hudbars? +player_physics diff --git a/esprint.lua b/esprint.lua new file mode 100755 index 0000000..2c0b280 --- /dev/null +++ b/esprint.lua @@ -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 diff --git a/init.lua b/init.lua new file mode 100755 index 0000000..0bf1034 --- /dev/null +++ b/init.lua @@ -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 diff --git a/textures/sprint_particle.png b/textures/sprint_particle.png new file mode 100755 index 0000000000000000000000000000000000000000..451fbba42e715504db85b330c88192d7518bc412 GIT binary patch literal 791 zcmV+y1L*vTP)#5o9oea44^j5QS zzrVS=BS`-HxZ$)%!NRf}^54UYoYC!RBxdc~kM&btDk0F!A=bOLE)Vs$?@#9!=Re=w zps!y(zdk*ranub%)%KJ!1i{&ne-`@~fw$eEsyoNFe!D*TvCfNKjshDZ!+6Q|2m+6o zmT5L!KWmVV>0%}Kb7QG{CtCU8|!^&C;>WZCQ^K7iuPkzHeyNkHg3hO_!B5WNbaUo68|Mb01hw-|!6qu?>GlE5W4F?7^Z<`N5Co+eG(wj)PaS4zF?>+kCwv=^H! zQ^=fz^j(Jwkp{%I&DF6Fv!Z$4cO%yT(nkRx#H-7*hxINzN`N-gNoY#4Nmx2cLpSyu zwDepqW!v_Kj<#i!6=fQSLJBTs4M0=JX%yr|#l-wpH2b>8#4`F}L>TB8wPJ8>yC0}y znTMvY+nx)tE30~7u4PyzPC^eOFfWKnOx+{a!ZIl1Rns}d%68SrCj@|LV2qGq;OEUD zatwTN9EVE>0EiJBMrIm11fZkrH1_hc#t5GuN0Sgu)0n!h%`?_C`S`jOYQ8#2`hgBy z>9edFnna#s8X825v2mJ~j!pUO`Y}9;!Z270IWxhlj=tta82DVO>(%8?x0m-H-W7Fw zoJ3@?cy}KE^YDxzL`qB$Xq-za)u&&tU0eVC{l(PoO@LPY|q0gp*U zK~y-)jnhwvPf-*H@X!7ArosH=&xWa)m6Sgv-olEF$WpSl8Y!u_Q7B8L8IpRXq%0IE z3t5ts#hBPUnFUQ)OjD9j!eZ*jvv7XX^ZJdPy4};g_j}Iyp8Gw?e_CDUr*Hw!aWoax zJfr~+rJ`z|jo>y8#nE2OqMQ8-T$lMc#<3o6@BpvEpTyRz4X(?42>WmxV;IE-%;PaG z;V@3%MmB)%7_MU_=Ar`F9P0o!;w{d1TG?0O7}nw{g!71gh14~DTH?{F6r7>?^1JZmKTzEpX$iCBki!TU}l`#0RjO-!ev zTI|zK?eDA0d=!tc9Sit@EfMHz(7Kn3st14dpf2+aCjPr=q$V{<#Q#I@G&FJqv9Q;U{|d7<@0c=q(1O(-cjHGa;TCJWWOQVHs)n zV($j-Pk>ZZSC$*7)=>2ZRnQqUy6tHUo5Op&j-LU)0fN?pI)t<8 literal 0 HcmV?d00001 diff --git a/wsprint.lua b/wsprint.lua new file mode 100755 index 0000000..3abda45 --- /dev/null +++ b/wsprint.lua @@ -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