From cd9c30d3623370593674333b720e7a5e19bdf078 Mon Sep 17 00:00:00 2001 From: rubenwardy Date: Tue, 2 Jan 2018 19:59:10 +0000 Subject: [PATCH] Add sprinting --- mods/sprint/COPYING | 121 +++++++++++++++++ mods/sprint/README.md | 62 +++++++++ mods/sprint/depends.txt | 1 + mods/sprint/esprint.lua | 125 +++++++++++++++++ mods/sprint/init.lua | 34 +++++ mods/sprint/textures/sprint_particle.png | Bin 0 -> 791 bytes mods/sprint/textures/sprint_stamina_bar.png | Bin 0 -> 80 bytes mods/sprint/textures/sprint_stamina_icon.png | Bin 0 -> 148 bytes mods/sprint/wsprint.lua | 135 +++++++++++++++++++ 9 files changed, 478 insertions(+) create mode 100644 mods/sprint/COPYING create mode 100644 mods/sprint/README.md create mode 100644 mods/sprint/depends.txt create mode 100644 mods/sprint/esprint.lua create mode 100644 mods/sprint/init.lua create mode 100644 mods/sprint/textures/sprint_particle.png create mode 100644 mods/sprint/textures/sprint_stamina_bar.png create mode 100644 mods/sprint/textures/sprint_stamina_icon.png create mode 100644 mods/sprint/wsprint.lua diff --git a/mods/sprint/COPYING b/mods/sprint/COPYING new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/mods/sprint/COPYING @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/mods/sprint/README.md b/mods/sprint/README.md new file mode 100644 index 0000000..71e7d44 --- /dev/null +++ b/mods/sprint/README.md @@ -0,0 +1,62 @@ +Sprint Mod For Minetest by GunshipPenguin + +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/mods/sprint/depends.txt b/mods/sprint/depends.txt new file mode 100644 index 0000000..3e1d5c2 --- /dev/null +++ b/mods/sprint/depends.txt @@ -0,0 +1 @@ +hudbars? diff --git a/mods/sprint/esprint.lua b/mods/sprint/esprint.lua new file mode 100644 index 0000000..c448b90 --- /dev/null +++ b/mods/sprint/esprint.lua @@ -0,0 +1,125 @@ +--[[ +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] = { + sprinting = false, + timeOut = 0, + stamina = SPRINT_STAMINA, + shouldSprint = 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 = "sprint_stamina_icon.png", + number = 20, + alignment = {x=0,y=1}, + offset = {x=-263, y=-110}, + } + ) + 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) + if player ~= nil then + --Check if the player should be sprinting + if player:get_player_control()["aux1"] and player:get_player_control()["up"] then + players[playerName]["shouldSprint"] = true + else + players[playerName]["shouldSprint"] = false + end + + --If the player is sprinting, create particles behind him/her + if playerInfo["sprinting"] == true 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]["shouldSprint"] == true then --Stopped + setSprinting(playerName, true) + elseif players[playerName]["shouldSprint"] == false then + setSprinting(playerName, false) + 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["sprinting"] == true then + playerInfo["stamina"] = playerInfo["stamina"] - dtime + if playerInfo["stamina"] <= 0 then + playerInfo["stamina"] = 0 + setSprinting(playerName, false) + end + + --Increase player's stamina if he/she is not sprinting and his/her stamina is less than SPRINT_STAMINA + elseif playerInfo["sprinting"] == false and playerInfo["stamina"] < SPRINT_STAMINA then + playerInfo["stamina"] = playerInfo["stamina"] + dtime / 2 + 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 setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting) + local player = minetest.get_player_by_name(playerName) + if players[playerName] then + players[playerName]["sprinting"] = sprinting + if sprinting == true then + player:set_physics_override({speed=SPRINT_SPEED,jump=SPRINT_JUMP}) + elseif sprinting == false then + player:set_physics_override({speed=1.0,jump=1.0}) + end + return true + end + return false +end diff --git a/mods/sprint/init.lua b/mods/sprint/init.lua new file mode 100644 index 0000000..b5f3bb1 --- /dev/null +++ b/mods/sprint/init.lua @@ -0,0 +1,34 @@ +--[[ +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 = 1.8 +SPRINT_JUMP = 1.1 +SPRINT_STAMINA = 5 +SPRINT_TIMEOUT = 0.5 --Only used if SPRINT_METHOD = 0 + +if minetest.get_modpath("hudbars") ~= nil then + hb.register_hudbar("sprint", 0xFFFFFF, "Stamina", + { bar = "sprint_stamina_bar.png", icon = "sprint_stamina_icon.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/mods/sprint/textures/sprint_particle.png b/mods/sprint/textures/sprint_particle.png new file mode 100644 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@L#FW%0JMg|)78&qol`;+08gMY*#H0l literal 0 HcmV?d00001 diff --git a/mods/sprint/wsprint.lua b/mods/sprint/wsprint.lua new file mode 100644 index 0000000..3a832e2 --- /dev/null +++ b/mods/sprint/wsprint.lua @@ -0,0 +1,135 @@ +--[[ +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 = "sprint_stamina_icon.png", + number = 20, + alignment = {x=0,y=1}, + offset = {x=-263, y=-110}, + } + ) + 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) + 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, + 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) + 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: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