commit 34aac5df49f149f43129f0c4b81bb248e092a082 Author: Jonny_Bro (Nikita) Date: Sat May 20 12:08:00 2023 +0500 first commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..fdddb29 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/README.md b/README.md new file mode 100644 index 0000000..dfb8020 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# beatrun +Official source code release of beatrun made by datae. + +https://send.ephemeral.land/download/3585ba725ca36278/#NG_JZtPyTdlF_JXRUko5Ow \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/beatrun.txt b/beatrun/gamemodes/beatrun/beatrun.txt new file mode 100644 index 0000000..8b92be1 --- /dev/null +++ b/beatrun/gamemodes/beatrun/beatrun.txt @@ -0,0 +1,8 @@ +"beatrun" +{ + "base" "base" + "title" "Beatrun" + "maps" "^br_" + "menusystem" "1" + +} \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/content/materials/circle.png b/beatrun/gamemodes/beatrun/content/materials/circle.png new file mode 100644 index 0000000..f332c4e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/circle.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/circlehollow.png b/beatrun/gamemodes/beatrun/content/materials/circlehollow.png new file mode 100644 index 0000000..ace77e9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/circlehollow.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/circlesmooth.png b/beatrun/gamemodes/beatrun/content/materials/circlesmooth.png new file mode 100644 index 0000000..f332c4e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/circlesmooth.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/circlesprite.vmt b/beatrun/gamemodes/beatrun/content/materials/circlesprite.vmt new file mode 100644 index 0000000..c4f066b --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/circlesprite.vmt @@ -0,0 +1,8 @@ +"Sprite" +{ + "$spriteorientation" "vp_parallel" + "$spriteorigin" "[ 0.50 0.50 ]" + "$basetexture" "circlesprite" + "$translucent" "1" + "$nocull" "1" +} \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/content/materials/circlesprite.vtf b/beatrun/gamemodes/beatrun/content/materials/circlesprite.vtf new file mode 100644 index 0000000..f26ecf0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/circlesprite.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/effects/fall_normal.vtf b/beatrun/gamemodes/beatrun/content/materials/effects/fall_normal.vtf new file mode 100644 index 0000000..719ec68 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/effects/fall_normal.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/effects/fall_warp.vmt b/beatrun/gamemodes/beatrun/content/materials/effects/fall_warp.vmt new file mode 100644 index 0000000..3fd606c --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/effects/fall_warp.vmt @@ -0,0 +1,30 @@ +"Refract" +{ + "$refractamount" ".05" + "$refracttint" "{255 255 255}" + "$refractblur" "1" + + + "$scale" "[1 1]" + + "$bumpmap" "dev/water_dudv" + "$normalmap" "effects/fall_normal" + "$bumpframe" "0" + + + "Proxies" + { + "AnimatedTexture" + { + "animatedtexturevar" "$normalmap" + "animatedtextureframenumvar" "$bumpframe" + "animatedtextureframerate" 60.00 + } + "TextureScroll" + { + "texturescrollvar" "$bumptransform" + "texturescrollrate" 5 + "texturescrollangle" 45.00 + } + } +} diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01_ivy.vmt b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01_ivy.vmt new file mode 100644 index 0000000..f1b4719 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01_ivy.vmt @@ -0,0 +1,20 @@ +"LightmappedGeneric" +{ + "$basetexture" "Glass/blackglass01_ivy" + "$envmap" "env_cubemap" + "$surfaceprop" "glass" + "%keywords" "c17industrial" + "$envmapmask" "glass/blackglass01_mask_ivy" + "$translucent" 1 + "$multipass" 1 + "$nocull" 1 + "$crackmaterial" "glass/blackglass02_ivy" + + "LightmappedGeneric_dx6" + { + // This takes into account the alpha channel of the basetexture + // which we can't modulate against under dx7 since envmap + // happens in a separate pass + "$envmaptint" "[0.5 0.5 0.5]" + } +} diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01_ivy.vtf b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01_ivy.vtf new file mode 100644 index 0000000..422318f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01_ivy.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01_mask_ivy.vtf b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01_mask_ivy.vtf new file mode 100644 index 0000000..fca0163 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01_mask_ivy.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01b_ivy.vmt b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01b_ivy.vmt new file mode 100644 index 0000000..2c591f0 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01b_ivy.vmt @@ -0,0 +1,40 @@ +"ShatteredGlass" +{ + "$basetexture" "Glass/blackglass01b_ivy" + "$detail" "Glass/blackglass01b_ivy" + "$envmap" "env_cubemap" + "$surfaceprop" "glass" + "%keywords" "c17industrial" + "$envmapmask" "glass/blackglass01b_mask_ivy" + "$translucent" 1 + "$basetexturetransform" "scale .7 .7" + "$detailscale" 0.7 + "$unlitfactor" 0.0 + + "ShatteredGlass_DX8" + { + "$unlitfactor" 0.3 + + // This is roughly equal to the average value of envmapmask of the unbroken texture + "$envmaptint" "{50 50 50}" + } + + // On the low end, envmaptint + lightmap tint both use the average alpha value + "ShatteredGlass_DX7" + { + // This is roughly equal to the average value of alpha channel of the unbroken basetexture + "$lightmaptint" "{40 40 40}" + + // This is roughly equal to the average value of envmapmask of the unbroken texture + // times the average value of the alpha value of the unbroken base texture + "$envmaptint" "{80 80 80}" + } + + "$nocull" 1 + "Proxies" + { + "BreakableSurface" + { + } + } +} diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01b_ivy.vtf b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01b_ivy.vtf new file mode 100644 index 0000000..c612094 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01b_ivy.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01b_mask_ivy.vtf b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01b_mask_ivy.vtf new file mode 100644 index 0000000..511a086 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/glass/blackglass01b_mask_ivy.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blueglass01_ivy.vmt b/beatrun/gamemodes/beatrun/content/materials/glass/blueglass01_ivy.vmt new file mode 100644 index 0000000..53eb0e7 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/glass/blueglass01_ivy.vmt @@ -0,0 +1,12 @@ +"LightmappedGeneric" +{ + "$basetexture" "glass/blueglass01_ivy" + "$envmap" "env_cubemap" + "$surfaceprop" "glass" + "%keywords" "neotokyo" + "$envmapmask" "glass/blueglassmask_ivy" + "$translucent" 1 + "$envmapcontrast" 1 + "$envmapsaturation" 1 + "$envmaptint" "[ .5 .5 .80]" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blueglass01_ivy.vtf b/beatrun/gamemodes/beatrun/content/materials/glass/blueglass01_ivy.vtf new file mode 100644 index 0000000..6933a7f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/glass/blueglass01_ivy.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blueglass02_ivy.vmt b/beatrun/gamemodes/beatrun/content/materials/glass/blueglass02_ivy.vmt new file mode 100644 index 0000000..b5f2e16 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/glass/blueglass02_ivy.vmt @@ -0,0 +1,12 @@ +"LightmappedGeneric" +{ + "$basetexture" "glass/blueglass02_ivy" + "$envmap" "env_cubemap" + "$surfaceprop" "glass" + "%keywords" "neotokyo" + "$envmapmask" "glass/blueglassmask_ivy" + "$translucent" 1 + "$envmapcontrast" 1 + "$envmapsaturation" 1 + "$envmaptint" "[ .5 .5 .80]" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blueglass02_ivy.vtf b/beatrun/gamemodes/beatrun/content/materials/glass/blueglass02_ivy.vtf new file mode 100644 index 0000000..e4baa6f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/glass/blueglass02_ivy.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/blueglassmask_ivy.vtf b/beatrun/gamemodes/beatrun/content/materials/glass/blueglassmask_ivy.vtf new file mode 100644 index 0000000..15668c6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/glass/blueglassmask_ivy.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/unbreakable.vmt b/beatrun/gamemodes/beatrun/content/materials/glass/unbreakable.vmt new file mode 100644 index 0000000..9d9040e --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/glass/unbreakable.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "glass\unbreakable" + "$translucent" "1" + "$envmap" "env_cubemap" + "$envmapmask" "glass\unbreakable_ref" + "$surfaceprop" "glass" + +} diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/unbreakable.vtf b/beatrun/gamemodes/beatrun/content/materials/glass/unbreakable.vtf new file mode 100644 index 0000000..96444cd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/glass/unbreakable.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/glass/unbreakable_ref.vtf b/beatrun/gamemodes/beatrun/content/materials/glass/unbreakable_ref.vtf new file mode 100644 index 0000000..251d51a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/glass/unbreakable_ref.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/BLACK.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/BLACK.vtf new file mode 100644 index 0000000..286d9c3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/BLACK.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/BLUE.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/BLUE.vtf new file mode 100644 index 0000000..396734d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/BLUE.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/DARKBLUE.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/DARKBLUE.vtf new file mode 100644 index 0000000..a20b8a9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/DARKBLUE.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/GRAY.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/GRAY.vtf new file mode 100644 index 0000000..3db2526 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/GRAY.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/GREEN.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/GREEN.vtf new file mode 100644 index 0000000..8c3532b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/GREEN.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/LIGHTGREEN.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/LIGHTGREEN.vtf new file mode 100644 index 0000000..83c4a04 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/LIGHTGREEN.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/ORANGE.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/ORANGE.vtf new file mode 100644 index 0000000..cfcfe25 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/ORANGE.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/PINK.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/PINK.vtf new file mode 100644 index 0000000..6b45c8f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/PINK.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/PLAINPLASTER.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/PLAINPLASTER.vtf new file mode 100644 index 0000000..bee051e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/PLAINPLASTER.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/RED.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/RED.vtf new file mode 100644 index 0000000..d00af0b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/RED.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/VIOLET.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/VIOLET.vtf new file mode 100644 index 0000000..929949a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/VIOLET.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/WHITE.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/WHITE.vtf new file mode 100644 index 0000000..77df78b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/WHITE.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/YELLOW.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/YELLOW.vtf new file mode 100644 index 0000000..3d309af Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/YELLOW.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/black_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/black_brick.vmt new file mode 100644 index 0000000..bc588c6 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/black_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/BLACK" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/black_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/black_tile.vmt new file mode 100644 index 0000000..0b77e92 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/black_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/BLACK" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/blue_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/blue_brick.vmt new file mode 100644 index 0000000..b10949d --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/blue_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/BLUE" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/blue_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/blue_tile.vmt new file mode 100644 index 0000000..ac6ae50 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/blue_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/BLUE" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/brick_normal.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/brick_normal.vtf new file mode 100644 index 0000000..dcef50d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/brick_normal.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/darkblue_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/darkblue_brick.vmt new file mode 100644 index 0000000..539f4df --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/darkblue_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/DARKBLUE" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/darkblue_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/darkblue_tile.vmt new file mode 100644 index 0000000..6aa1e90 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/darkblue_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/DARKBLUE" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/gray_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/gray_brick.vmt new file mode 100644 index 0000000..42e2e4a --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/gray_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/GRAY" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/gray_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/gray_tile.vmt new file mode 100644 index 0000000..98c4629 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/gray_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/GRAY" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/green_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/green_brick.vmt new file mode 100644 index 0000000..f681da7 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/green_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/GREEN" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/green_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/green_tile.vmt new file mode 100644 index 0000000..e3c13a1 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/green_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/GREEN" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/lightgreen_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/lightgreen_brick.vmt new file mode 100644 index 0000000..ff38318 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/lightgreen_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/LIGHTGREEN" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/lightgreen_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/lightgreen_tile.vmt new file mode 100644 index 0000000..ec76dee --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/lightgreen_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/LIGHTGREEN" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/orange_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/orange_brick.vmt new file mode 100644 index 0000000..31071de --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/orange_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/ORANGE" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/orange_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/orange_tile.vmt new file mode 100644 index 0000000..57744e6 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/orange_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/ORANGE" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/pink_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/pink_brick.vmt new file mode 100644 index 0000000..beb5ab1 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/pink_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/PINK" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/pink_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/pink_tile.vmt new file mode 100644 index 0000000..8df113b --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/pink_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/PINK" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/black.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/black.vtf new file mode 100644 index 0000000..7e130c4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/black.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/blackbrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/blackbrick.vmt new file mode 100644 index 0000000..26be6b3 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/blackbrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/black" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/blacktile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/blacktile.vmt new file mode 100644 index 0000000..8d3e58d --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/blacktile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/black" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/blue.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/blue.vtf new file mode 100644 index 0000000..1fd00f1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/blue.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/bluebrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/bluebrick.vmt new file mode 100644 index 0000000..5c298f3 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/bluebrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/blue" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/bluetile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/bluetile.vmt new file mode 100644 index 0000000..d2fc714 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/bluetile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/blue" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/brick_normal.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/brick_normal.vtf new file mode 100644 index 0000000..aa1b459 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/brick_normal.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/darkblue.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/darkblue.vtf new file mode 100644 index 0000000..c236dbe Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/darkblue.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/darkbluebrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/darkbluebrick.vmt new file mode 100644 index 0000000..c3c7851 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/darkbluebrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/darkblue" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/darkbluetile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/darkbluetile.vmt new file mode 100644 index 0000000..39af3b6 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/darkbluetile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/darkblue" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/gray.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/gray.vtf new file mode 100644 index 0000000..6d9b170 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/gray.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/graybrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/graybrick.vmt new file mode 100644 index 0000000..89829ad --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/graybrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/gray" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/graytile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/graytile.vmt new file mode 100644 index 0000000..b59f297 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/graytile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/gray" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/green.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/green.vtf new file mode 100644 index 0000000..4f2311d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/green.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/greenbrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/greenbrick.vmt new file mode 100644 index 0000000..bfa1770 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/greenbrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/green" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/greentile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/greentile.vmt new file mode 100644 index 0000000..c0b2b77 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/greentile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/green" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/lightgreen.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/lightgreen.vtf new file mode 100644 index 0000000..4481027 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/lightgreen.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/lightgreenbrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/lightgreenbrick.vmt new file mode 100644 index 0000000..f16274d --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/lightgreenbrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/lightgreen" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/lightgreentile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/lightgreentile.vmt new file mode 100644 index 0000000..9e0fbe4 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/lightgreentile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/lightgreen" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/orange.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/orange.vtf new file mode 100644 index 0000000..c280124 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/orange.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/orangebrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/orangebrick.vmt new file mode 100644 index 0000000..f537d4c --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/orangebrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/orange" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/orangetile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/orangetile.vmt new file mode 100644 index 0000000..9fcf5ee --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/orangetile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/orange" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/pink.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/pink.vtf new file mode 100644 index 0000000..ec42e94 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/pink.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/pinkbrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/pinkbrick.vmt new file mode 100644 index 0000000..cff827a --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/pinkbrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/pink" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/pinktile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/pinktile.vmt new file mode 100644 index 0000000..9f014cc --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/pinktile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/pink" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/red.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/red.vtf new file mode 100644 index 0000000..421ba94 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/red.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/redbrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/redbrick.vmt new file mode 100644 index 0000000..7a9f41c --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/redbrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/red" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/redbrickvertex.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/redbrickvertex.vmt new file mode 100644 index 0000000..8144805 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/redbrickvertex.vmt @@ -0,0 +1,9 @@ +VertexLitGeneric +{ + "$basetexture" "medge/plain/red" + "$surfaceprop" "plaster" + "$envmap" "env_cubemap" + "$envmaptint" 0.5 + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/redtile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/redtile.vmt new file mode 100644 index 0000000..66cbb90 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/redtile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/red" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/tile_normal.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/tile_normal.vtf new file mode 100644 index 0000000..52acc4f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/tile_normal.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/violet.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/violet.vtf new file mode 100644 index 0000000..3add047 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/violet.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/violetbrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/violetbrick.vmt new file mode 100644 index 0000000..91cb866 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/violetbrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/violet" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/violettile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/violettile.vmt new file mode 100644 index 0000000..6d72b45 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/violettile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/violet" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/white.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/white.vtf new file mode 100644 index 0000000..33ae819 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/white.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/whitebrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/whitebrick.vmt new file mode 100644 index 0000000..ee5dbf9 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/whitebrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/white" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/whitetile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/whitetile.vmt new file mode 100644 index 0000000..073eada --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/whitetile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/white" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/yellow.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/plain/yellow.vtf new file mode 100644 index 0000000..48acb2f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/plain/yellow.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/yellowbrick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/yellowbrick.vmt new file mode 100644 index 0000000..e515882 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/yellowbrick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/yellow" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plain/yellowtile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plain/yellowtile.vmt new file mode 100644 index 0000000..903a1ae --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plain/yellowtile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/plain/yellow" + "$surfaceprop" "plaster" + "$bumpmap" "medge/plain/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plainplaster.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plainplaster.vmt new file mode 100644 index 0000000..78c92b2 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plainplaster.vmt @@ -0,0 +1,5 @@ +LightmappedGeneric +{ + "$basetexture" "medge/PLAINPLASTER" + "$surfaceprop" "plaster" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/plainplastervertex.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/plainplastervertex.vmt new file mode 100644 index 0000000..4c71880 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/plainplastervertex.vmt @@ -0,0 +1,6 @@ +VertexLitGeneric +{ + "$basetexture" "medge/PLAINPLASTER" + "$basetexturetransform" "center .5 .5 scale 0.5 0.5 rotate 0 translate 0 0" + "$color2" "[0.75 0.75 0.75]" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/red_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/red_brick.vmt new file mode 100644 index 0000000..f6e818e --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/red_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/RED" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/red_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/red_tile.vmt new file mode 100644 index 0000000..1135890 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/red_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/RED" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/redplainplastervertex.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/redplainplastervertex.vmt new file mode 100644 index 0000000..f809eb0 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/redplainplastervertex.vmt @@ -0,0 +1,6 @@ +VertexLitGeneric +{ + "$basetexture" "medge/PLAINPLASTER" + "$basetexturetransform" "center .5 .5 scale 0.5 0.5 rotate 0 translate 0 0" + "$color2" "[0.8 0.15 0.15]" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/tile_normal.vtf b/beatrun/gamemodes/beatrun/content/materials/medge/tile_normal.vtf new file mode 100644 index 0000000..e5278e0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/medge/tile_normal.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/violet_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/violet_brick.vmt new file mode 100644 index 0000000..d605507 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/violet_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/VIOLET" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/violet_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/violet_tile.vmt new file mode 100644 index 0000000..70af439 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/violet_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/VIOLET" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/white_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/white_brick.vmt new file mode 100644 index 0000000..d7f6372 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/white_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/WHITE" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/white_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/white_tile.vmt new file mode 100644 index 0000000..4f391b9 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/white_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/WHITE" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/yellow_brick.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/yellow_brick.vmt new file mode 100644 index 0000000..1d4f2db --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/yellow_brick.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/YELLOW" + "$surfaceprop" "plaster" + "$bumpmap" "medge/brick_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/medge/yellow_tile.vmt b/beatrun/gamemodes/beatrun/content/materials/medge/yellow_tile.vmt new file mode 100644 index 0000000..4d61139 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/medge/yellow_tile.vmt @@ -0,0 +1,9 @@ +LightmappedGeneric +{ + "$basetexture" "medge/YELLOW" + "$surfaceprop" "plaster" + "$bumpmap" "medge/tile_normal" + "$envmap" "env_cubemap" + "$envmapcontrast" "1" + "$normalmapalphaenvmapmask" "1" +} diff --git a/beatrun/gamemodes/beatrun/content/materials/radial.png b/beatrun/gamemodes/beatrun/content/materials/radial.png new file mode 100644 index 0000000..96a8e46 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/radial.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/MELogo.png b/beatrun/gamemodes/beatrun/content/materials/vgui/MELogo.png new file mode 100644 index 0000000..0d57b97 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/MELogo.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/editor/balance.png b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/balance.png new file mode 100644 index 0000000..7c5cf33 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/balance.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/editor/checkpoint.png b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/checkpoint.png new file mode 100644 index 0000000..66a5759 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/checkpoint.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/editor/ladder.png b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/ladder.png new file mode 100644 index 0000000..b356ff7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/ladder.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/editor/laser.png b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/laser.png new file mode 100644 index 0000000..0fe4538 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/laser.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/editor/mat.png b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/mat.png new file mode 100644 index 0000000..71deefd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/mat.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/editor/swingbar.png b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/swingbar.png new file mode 100644 index 0000000..b22a606 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/swingbar.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/editor/swingpipe.png b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/swingpipe.png new file mode 100644 index 0000000..127418a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/swingpipe.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/editor/swingrope.png b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/swingrope.png new file mode 100644 index 0000000..a703faf Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/swingrope.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/editor/zipline.png b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/zipline.png new file mode 100644 index 0000000..3df20cb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/editor/zipline.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/empty.png b/beatrun/gamemodes/beatrun/content/materials/vgui/empty.png new file mode 100644 index 0000000..91a5271 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/empty.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_reaction.vmt b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_reaction.vmt new file mode 100644 index 0000000..053048f --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_reaction.vmt @@ -0,0 +1,6 @@ +"UnlitGeneric" +{ + "$basetexture" "vgui/hud/crosshair_reaction" + "$ignorez" 1 + "$translucent" 1 +} diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_reaction.vtf b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_reaction.vtf new file mode 100644 index 0000000..d28fc5c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_reaction.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_standard.vmt b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_standard.vmt new file mode 100644 index 0000000..a523762 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_standard.vmt @@ -0,0 +1,6 @@ +"UnlitGeneric" +{ + "$basetexture" "vgui/hud/crosshair_standard" + "$ignorez" 1 + "$translucent" 1 +} diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_standard.vtf b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_standard.vtf new file mode 100644 index 0000000..99d5bf5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_standard.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_unarmed.vmt b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_unarmed.vmt new file mode 100644 index 0000000..31dae49 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_unarmed.vmt @@ -0,0 +1,6 @@ +"UnlitGeneric" +{ + "$basetexture" "vgui/hud/crosshair_unarmed" + "$ignorez" 1 + "$translucent" 1 +} diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_unarmed.vtf b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_unarmed.vtf new file mode 100644 index 0000000..d6dc8e3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_unarmed.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_weapon.vmt b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_weapon.vmt new file mode 100644 index 0000000..a523762 --- /dev/null +++ b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_weapon.vmt @@ -0,0 +1,6 @@ +"UnlitGeneric" +{ + "$basetexture" "vgui/hud/crosshair_standard" + "$ignorez" 1 + "$translucent" 1 +} diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_weapon.vtf b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_weapon.vtf new file mode 100644 index 0000000..03d03b7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/hud/crosshair_weapon.vtf differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/packetloss.png b/beatrun/gamemodes/beatrun/content/materials/vgui/packetloss.png new file mode 100644 index 0000000..91607d7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/packetloss.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/sealplead.png b/beatrun/gamemodes/beatrun/content/materials/vgui/sealplead.png new file mode 100644 index 0000000..76f6c78 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/sealplead.png differ diff --git a/beatrun/gamemodes/beatrun/content/materials/vgui/warning.png b/beatrun/gamemodes/beatrun/content/materials/vgui/warning.png new file mode 100644 index 0000000..aceac46 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/materials/vgui/warning.png differ diff --git a/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.dx80.vtx new file mode 100644 index 0000000..6de6932 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.dx90.vtx new file mode 100644 index 0000000..fef4ec5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.mdl b/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.mdl new file mode 100644 index 0000000..180299d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.sw.vtx b/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.sw.vtx new file mode 100644 index 0000000..d1848fc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.vvd b/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.vvd new file mode 100644 index 0000000..250ab75 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/beatrun/c_vmaniplegs.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.dx80.vtx new file mode 100644 index 0000000..560462f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.dx90.vtx new file mode 100644 index 0000000..607d224 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.mdl b/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.mdl new file mode 100644 index 0000000..3a2b301 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.sw.vtx b/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.sw.vtx new file mode 100644 index 0000000..0e1c1e4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.vvd b/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.vvd new file mode 100644 index 0000000..c75bf60 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/c_vmaniplegs_br.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/climbanim.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/climbanim.dx80.vtx new file mode 100644 index 0000000..f1e3f02 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/climbanim.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/climbanim.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/climbanim.dx90.vtx new file mode 100644 index 0000000..941e561 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/climbanim.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/climbanim.mdl b/beatrun/gamemodes/beatrun/content/models/climbanim.mdl new file mode 100644 index 0000000..218e20b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/climbanim.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/climbanim.sw.vtx b/beatrun/gamemodes/beatrun/content/models/climbanim.sw.vtx new file mode 100644 index 0000000..2a77a47 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/climbanim.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/climbanim.vvd b/beatrun/gamemodes/beatrun/content/models/climbanim.vvd new file mode 100644 index 0000000..c8e3dc9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/climbanim.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/disarmvictim.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/disarmvictim.dx80.vtx new file mode 100644 index 0000000..247757c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/disarmvictim.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/disarmvictim.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/disarmvictim.dx90.vtx new file mode 100644 index 0000000..965b09f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/disarmvictim.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/disarmvictim.mdl b/beatrun/gamemodes/beatrun/content/models/disarmvictim.mdl new file mode 100644 index 0000000..20a9d98 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/disarmvictim.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/disarmvictim.sw.vtx b/beatrun/gamemodes/beatrun/content/models/disarmvictim.sw.vtx new file mode 100644 index 0000000..24e7f19 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/disarmvictim.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/disarmvictim.vvd b/beatrun/gamemodes/beatrun/content/models/disarmvictim.vvd new file mode 100644 index 0000000..93d15f6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/disarmvictim.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/mantleanim.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/mantleanim.dx80.vtx new file mode 100644 index 0000000..33bda8e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/mantleanim.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/mantleanim.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/mantleanim.dx90.vtx new file mode 100644 index 0000000..7b622e0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/mantleanim.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/mantleanim.mdl b/beatrun/gamemodes/beatrun/content/models/mantleanim.mdl new file mode 100644 index 0000000..b870123 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/mantleanim.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/mantleanim.sw.vtx b/beatrun/gamemodes/beatrun/content/models/mantleanim.sw.vtx new file mode 100644 index 0000000..e1efba5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/mantleanim.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/mantleanim.vvd b/beatrun/gamemodes/beatrun/content/models/mantleanim.vvd new file mode 100644 index 0000000..7547bc1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/mantleanim.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/mirroranim.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/mirroranim.dx80.vtx new file mode 100644 index 0000000..edc76a8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/mirroranim.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/mirroranim.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/mirroranim.dx90.vtx new file mode 100644 index 0000000..5a5ebc5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/mirroranim.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/mirroranim.mdl b/beatrun/gamemodes/beatrun/content/models/mirroranim.mdl new file mode 100644 index 0000000..a7055de Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/mirroranim.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/mirroranim.sw.vtx b/beatrun/gamemodes/beatrun/content/models/mirroranim.sw.vtx new file mode 100644 index 0000000..5202b13 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/mirroranim.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/mirroranim.vvd b/beatrun/gamemodes/beatrun/content/models/mirroranim.vvd new file mode 100644 index 0000000..c2dfdd3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/mirroranim.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.dx80.vtx new file mode 100644 index 0000000..ca83a54 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.dx90.vtx new file mode 100644 index 0000000..87fc978 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.mdl b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.mdl new file mode 100644 index 0000000..c787ea1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.phy b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.phy new file mode 100644 index 0000000..0b4e2bf Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.phy differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.sw.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.sw.vtx new file mode 100644 index 0000000..c52ac38 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.vvd b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.vvd new file mode 100644 index 0000000..e81228e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.dx80.vtx new file mode 100644 index 0000000..443c5e7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.dx90.vtx new file mode 100644 index 0000000..a1a2e12 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.mdl b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.mdl new file mode 100644 index 0000000..0208ab9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.phy b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.phy new file mode 100644 index 0000000..3934989 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.phy differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.sw.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.sw.vtx new file mode 100644 index 0000000..ba94abe Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.vvd b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.vvd new file mode 100644 index 0000000..a0e879e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/air_condition_unit_wall.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.dx80.vtx new file mode 100644 index 0000000..b6bb43f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.dx90.vtx new file mode 100644 index 0000000..a4b219f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.mdl b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.mdl new file mode 100644 index 0000000..8099b88 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.phy b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.phy new file mode 100644 index 0000000..2beab87 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.phy differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.sw.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.sw.vtx new file mode 100644 index 0000000..4ea771b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.vvd b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.vvd new file mode 100644 index 0000000..6e22a8f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.dx80.vtx new file mode 100644 index 0000000..d48b054 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.dx90.vtx new file mode 100644 index 0000000..c150839 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.mdl b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.mdl new file mode 100644 index 0000000..d8aa277 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.phy b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.phy new file mode 100644 index 0000000..2a5c075 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.phy differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.sw.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.sw.vtx new file mode 100644 index 0000000..15be780 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.vvd b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.vvd new file mode 100644 index 0000000..78946f7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/awning_small.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.dx80.vtx new file mode 100644 index 0000000..5fee1b9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.dx90.vtx new file mode 100644 index 0000000..722a0cc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.mdl b/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.mdl new file mode 100644 index 0000000..4a1832c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.sw.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.sw.vtx new file mode 100644 index 0000000..25b5a35 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.vvd b/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.vvd new file mode 100644 index 0000000..0c9872e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/billboard.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.dx80.vtx new file mode 100644 index 0000000..4ee2feb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.dx90.vtx new file mode 100644 index 0000000..5e71819 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.mdl b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.mdl new file mode 100644 index 0000000..2cf7c29 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.phy b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.phy new file mode 100644 index 0000000..4ba1442 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.phy differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.sw.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.sw.vtx new file mode 100644 index 0000000..4536c57 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.vvd b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.vvd new file mode 100644 index 0000000..30f6771 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/door_standard.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.dx80.vtx new file mode 100644 index 0000000..9c4ab60 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.dx90.vtx new file mode 100644 index 0000000..b1f872c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.mdl b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.mdl new file mode 100644 index 0000000..08e13ba Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.phy b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.phy new file mode 100644 index 0000000..cfb9037 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.phy differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.sw.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.sw.vtx new file mode 100644 index 0000000..469fd93 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.vvd b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.vvd new file mode 100644 index 0000000..dae5b61 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/fan_vent.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.dx80.vtx new file mode 100644 index 0000000..c20b8c6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.dx90.vtx new file mode 100644 index 0000000..f80fb5b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.mdl b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.mdl new file mode 100644 index 0000000..bc425a8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.phy b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.phy new file mode 100644 index 0000000..6c8e810 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.phy differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.sw.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.sw.vtx new file mode 100644 index 0000000..a969fb6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.vvd b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.vvd new file mode 100644 index 0000000..c62d69a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/pipe_standard.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.dx80.vtx new file mode 100644 index 0000000..3379054 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.dx90.vtx new file mode 100644 index 0000000..6545076 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.mdl b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.mdl new file mode 100644 index 0000000..648d195 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.phy b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.phy new file mode 100644 index 0000000..d17ccf9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.phy differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.sw.vtx b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.sw.vtx new file mode 100644 index 0000000..ee12340 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.vvd b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.vvd new file mode 100644 index 0000000..df2b294 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/parkoursource/zipwire_tower.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/models/runnerhands.dx80.vtx b/beatrun/gamemodes/beatrun/content/models/runnerhands.dx80.vtx new file mode 100644 index 0000000..6011178 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/runnerhands.dx80.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/runnerhands.dx90.vtx b/beatrun/gamemodes/beatrun/content/models/runnerhands.dx90.vtx new file mode 100644 index 0000000..cf13dcd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/runnerhands.dx90.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/runnerhands.mdl b/beatrun/gamemodes/beatrun/content/models/runnerhands.mdl new file mode 100644 index 0000000..d941d0a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/runnerhands.mdl differ diff --git a/beatrun/gamemodes/beatrun/content/models/runnerhands.sw.vtx b/beatrun/gamemodes/beatrun/content/models/runnerhands.sw.vtx new file mode 100644 index 0000000..4d371e6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/runnerhands.sw.vtx differ diff --git a/beatrun/gamemodes/beatrun/content/models/runnerhands.vvd b/beatrun/gamemodes/beatrun/content/models/runnerhands.vvd new file mode 100644 index 0000000..2400f84 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/models/runnerhands.vvd differ diff --git a/beatrun/gamemodes/beatrun/content/resource/fonts/D-DIN.ttf b/beatrun/gamemodes/beatrun/content/resource/fonts/D-DIN.ttf new file mode 100644 index 0000000..249f231 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/resource/fonts/D-DIN.ttf differ diff --git a/beatrun/gamemodes/beatrun/content/resource/fonts/ProFontWindows.ttf b/beatrun/gamemodes/beatrun/content/resource/fonts/ProFontWindows.ttf new file mode 100644 index 0000000..b3d66b2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/resource/fonts/ProFontWindows.ttf differ diff --git a/beatrun/gamemodes/beatrun/content/resource/fonts/x14y24pxHeadUpDaisy.ttf b/beatrun/gamemodes/beatrun/content/resource/fonts/x14y24pxHeadUpDaisy.ttf new file mode 100644 index 0000000..3cb34e6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/resource/fonts/x14y24pxHeadUpDaisy.ttf differ diff --git a/beatrun/gamemodes/beatrun/content/sound/A_TT_CD_01.wav b/beatrun/gamemodes/beatrun/content/sound/A_TT_CD_01.wav new file mode 100644 index 0000000..0d3afdf Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/A_TT_CD_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/A_TT_CD_02.wav b/beatrun/gamemodes/beatrun/content/sound/A_TT_CD_02.wav new file mode 100644 index 0000000..cbacb8e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/A_TT_CD_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Negative.wav b/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Negative.wav new file mode 100644 index 0000000..75edc0b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Negative.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Neutral.wav b/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Neutral.wav new file mode 100644 index 0000000..faee5f6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Neutral.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Positive.wav b/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Positive.wav new file mode 100644 index 0000000..a18630d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Positive.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Proxy_Close.wav b/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Proxy_Close.wav new file mode 100644 index 0000000..13b34db Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/A_TT_CP_Proxy_Close.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/A_TT_Finish_Negative.wav b/beatrun/gamemodes/beatrun/content/sound/A_TT_Finish_Negative.wav new file mode 100644 index 0000000..cef1917 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/A_TT_Finish_Negative.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/A_TT_Finish_Positive.wav b/beatrun/gamemodes/beatrun/content/sound/A_TT_Finish_Positive.wav new file mode 100644 index 0000000..05b4a7c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/A_TT_Finish_Positive.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/A_TT_Record.wav b/beatrun/gamemodes/beatrun/content/sound/A_TT_Record.wav new file mode 100644 index 0000000..5b3954b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/A_TT_Record.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/A_TT_Stars.wav b/beatrun/gamemodes/beatrun/content/sound/A_TT_Stars.wav new file mode 100644 index 0000000..f1537c1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/A_TT_Stars.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/bad.wav b/beatrun/gamemodes/beatrun/content/sound/bad.wav new file mode 100644 index 0000000..593dc53 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/bad.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/bigspark1.wav b/beatrun/gamemodes/beatrun/content/sound/bigspark1.wav new file mode 100644 index 0000000..16f6809 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/bigspark1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/bigspark2.wav b/beatrun/gamemodes/beatrun/content/sound/bigspark2.wav new file mode 100644 index 0000000..5492515 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/bigspark2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/blackout_hit_01.wav b/beatrun/gamemodes/beatrun/content/sound/blackout_hit_01.wav new file mode 100644 index 0000000..0ab8715 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/blackout_hit_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/blackout_hit_02.wav b/beatrun/gamemodes/beatrun/content/sound/blackout_hit_02.wav new file mode 100644 index 0000000..5c330f9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/blackout_hit_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/blackout_hit_03.wav b/beatrun/gamemodes/beatrun/content/sound/blackout_hit_03.wav new file mode 100644 index 0000000..198df8e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/blackout_hit_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/buttonclick.wav b/beatrun/gamemodes/beatrun/content/sound/buttonclick.wav new file mode 100644 index 0000000..e629d2d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/buttonclick.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/buttonrollover.wav b/beatrun/gamemodes/beatrun/content/sound/buttonrollover.wav new file mode 100644 index 0000000..9e1556d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/buttonrollover.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/chat.wav b/beatrun/gamemodes/beatrun/content/sound/chat.wav new file mode 100644 index 0000000..c2a4c3a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/chat.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/clotheswind.wav b/beatrun/gamemodes/beatrun/content/sound/clotheswind.wav new file mode 100644 index 0000000..400418b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/clotheswind.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/cyborgrun.wav b/beatrun/gamemodes/beatrun/content/sound/cyborgrun.wav new file mode 100644 index 0000000..9e0e28f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/cyborgrun.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_01.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_01.wav new file mode 100644 index 0000000..2ee6d37 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_02.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_02.wav new file mode 100644 index 0000000..3ea2cda Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_03.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_03.wav new file mode 100644 index 0000000..c297e52 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_04.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_04.wav new file mode 100644 index 0000000..7a4dae3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_dirt_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_generic_01.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_generic_01.wav new file mode 100644 index 0000000..efece3a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_generic_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_generic_02.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_generic_02.wav new file mode 100644 index 0000000..28bac51 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_generic_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_generic_03.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_generic_03.wav new file mode 100644 index 0000000..51bca41 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_generic_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_01.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_01.wav new file mode 100644 index 0000000..c6bb92d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_02.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_02.wav new file mode 100644 index 0000000..a1978ea Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_03.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_03.wav new file mode 100644 index 0000000..1ed9f6c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_04.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_04.wav new file mode 100644 index 0000000..2d860cb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_glass_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_grate_01.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_grate_01.wav new file mode 100644 index 0000000..705cd97 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_grate_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_metal_01.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_metal_01.wav new file mode 100644 index 0000000..17d7c85 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_metal_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_metal_02.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_metal_02.wav new file mode 100644 index 0000000..aa4c6e1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_metal_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_metal_03.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_metal_03.wav new file mode 100644 index 0000000..dcbc807 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_metal_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_01.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_01.wav new file mode 100644 index 0000000..7795caf Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_02.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_02.wav new file mode 100644 index 0000000..eacf053 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_03.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_03.wav new file mode 100644 index 0000000..c1a6472 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_04.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_04.wav new file mode 100644 index 0000000..6a1414b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_slide_sand_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_01.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_01.wav new file mode 100644 index 0000000..4399182 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_02.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_02.wav new file mode 100644 index 0000000..d3bb424 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_03.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_03.wav new file mode 100644 index 0000000..a6c3df8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_04.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_04.wav new file mode 100644 index 0000000..b144a94 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_05.wav b/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_05.wav new file mode 100644 index 0000000..9044800 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/datae/fol_sprint_rustle_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/death.wav b/beatrun/gamemodes/beatrun/content/sound/death.wav new file mode 100644 index 0000000..8e1f0a1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/death.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/end.wav b/beatrun/gamemodes/beatrun/content/sound/end.wav new file mode 100644 index 0000000..2cf8f12 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/end.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/endofsimulation.wav b/beatrun/gamemodes/beatrun/content/sound/endofsimulation.wav new file mode 100644 index 0000000..e872c5d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/endofsimulation.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/enterwater_highvelocity_01.wav b/beatrun/gamemodes/beatrun/content/sound/enterwater_highvelocity_01.wav new file mode 100644 index 0000000..6c76405 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/enterwater_highvelocity_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/enterwater_highvelocity_02.wav b/beatrun/gamemodes/beatrun/content/sound/enterwater_highvelocity_02.wav new file mode 100644 index 0000000..687276e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/enterwater_highvelocity_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/enterwater_highvelocity_03.wav b/beatrun/gamemodes/beatrun/content/sound/enterwater_highvelocity_03.wav new file mode 100644 index 0000000..df49fea Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/enterwater_highvelocity_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/enterwater_lowvelocity_01.wav b/beatrun/gamemodes/beatrun/content/sound/enterwater_lowvelocity_01.wav new file mode 100644 index 0000000..c4de4a3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/enterwater_lowvelocity_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/enterwater_lowvelocity_02.wav b/beatrun/gamemodes/beatrun/content/sound/enterwater_lowvelocity_02.wav new file mode 100644 index 0000000..c60a0b0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/enterwater_lowvelocity_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/exitwater_01.wav b/beatrun/gamemodes/beatrun/content/sound/exitwater_01.wav new file mode 100644 index 0000000..5b1c410 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/exitwater_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/exitwater_02.wav b/beatrun/gamemodes/beatrun/content/sound/exitwater_02.wav new file mode 100644 index 0000000..df04b33 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/exitwater_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/glitch.wav b/beatrun/gamemodes/beatrun/content/sound/glitch.wav new file mode 100644 index 0000000..f46be7e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/glitch.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/good.wav b/beatrun/gamemodes/beatrun/content/sound/good.wav new file mode 100644 index 0000000..91ce5c9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/good.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/gtab.mp3 b/beatrun/gamemodes/beatrun/content/sound/gtab.mp3 new file mode 100644 index 0000000..4fb21f9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/gtab.mp3 differ diff --git a/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_01.wav b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_01.wav new file mode 100644 index 0000000..41061e8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_02.wav b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_02.wav new file mode 100644 index 0000000..84d7782 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_03.wav b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_03.wav new file mode 100644 index 0000000..cdf3bce Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_04.wav b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_04.wav new file mode 100644 index 0000000..4454880 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_05.wav b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_05.wav new file mode 100644 index 0000000..e5a0284 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_06.wav b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_06.wav new file mode 100644 index 0000000..a94f89d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_07.wav b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_07.wav new file mode 100644 index 0000000..22a3a47 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_08.wav b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_08.wav new file mode 100644 index 0000000..e69f6bd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/heartbeat_beat_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/holygrenade.mp3 b/beatrun/gamemodes/beatrun/content/sound/holygrenade.mp3 new file mode 100644 index 0000000..ae71019 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/holygrenade.mp3 differ diff --git a/beatrun/gamemodes/beatrun/content/sound/me_body_roll.wav b/beatrun/gamemodes/beatrun/content/sound/me_body_roll.wav new file mode 100644 index 0000000..02a4c10 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/me_body_roll.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/me_body_roll_cloth.wav b/beatrun/gamemodes/beatrun/content/sound/me_body_roll_cloth.wav new file mode 100644 index 0000000..8ec1aa2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/me_body_roll_cloth.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/me_faith_cloth_roll_cloth.wav b/beatrun/gamemodes/beatrun/content/sound/me_faith_cloth_roll_cloth.wav new file mode 100644 index 0000000..0923a58 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/me_faith_cloth_roll_cloth.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/me_faith_cloth_roll_land.wav b/beatrun/gamemodes/beatrun/content/sound/me_faith_cloth_roll_land.wav new file mode 100644 index 0000000..0438c17 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/me_faith_cloth_roll_land.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/me_faith_cloth_roll_swish.wav b/beatrun/gamemodes/beatrun/content/sound/me_faith_cloth_roll_swish.wav new file mode 100644 index 0000000..620ea5d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/me_faith_cloth_roll_swish.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh1.wav b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh1.wav new file mode 100644 index 0000000..9b45b54 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh2.wav b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh2.wav new file mode 100644 index 0000000..0a03818 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh3.wav b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh3.wav new file mode 100644 index 0000000..97eb528 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh4.wav b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh4.wav new file mode 100644 index 0000000..79c8b7e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh5.wav b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh5.wav new file mode 100644 index 0000000..944a549 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh6.wav b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh6.wav new file mode 100644 index 0000000..0670384 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/armswoosh6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/fist1.wav b/beatrun/gamemodes/beatrun/content/sound/melee/fist1.wav new file mode 100644 index 0000000..7b668a9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/fist1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/fist2.wav b/beatrun/gamemodes/beatrun/content/sound/melee/fist2.wav new file mode 100644 index 0000000..622860a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/fist2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/fist3.wav b/beatrun/gamemodes/beatrun/content/sound/melee/fist3.wav new file mode 100644 index 0000000..636d088 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/fist3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/fist4.wav b/beatrun/gamemodes/beatrun/content/sound/melee/fist4.wav new file mode 100644 index 0000000..ab283f9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/fist4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/fist5.wav b/beatrun/gamemodes/beatrun/content/sound/melee/fist5.wav new file mode 100644 index 0000000..d443c9a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/fist5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/foot1.wav b/beatrun/gamemodes/beatrun/content/sound/melee/foot1.wav new file mode 100644 index 0000000..7d965f7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/foot1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/foot2.wav b/beatrun/gamemodes/beatrun/content/sound/melee/foot2.wav new file mode 100644 index 0000000..77445a8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/foot2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/foot3.wav b/beatrun/gamemodes/beatrun/content/sound/melee/foot3.wav new file mode 100644 index 0000000..82f2d12 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/foot3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/foot4.wav b/beatrun/gamemodes/beatrun/content/sound/melee/foot4.wav new file mode 100644 index 0000000..fd30ee2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/foot4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/foot5.wav b/beatrun/gamemodes/beatrun/content/sound/melee/foot5.wav new file mode 100644 index 0000000..29ee1f6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/foot5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh1.wav b/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh1.wav new file mode 100644 index 0000000..5789613 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh2.wav b/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh2.wav new file mode 100644 index 0000000..c896a9f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh3.wav b/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh3.wav new file mode 100644 index 0000000..2aaa45b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh4.wav b/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh4.wav new file mode 100644 index 0000000..89c9afc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/melee/legswoosh4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mgs/reflex.sfk b/beatrun/gamemodes/beatrun/content/sound/mgs/reflex.sfk new file mode 100644 index 0000000..62b60ed Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mgs/reflex.sfk differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mgs/reflexin.wav b/beatrun/gamemodes/beatrun/content/sound/mgs/reflexin.wav new file mode 100644 index 0000000..9b378c7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mgs/reflexin.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mgs/reflexloop.wav b/beatrun/gamemodes/beatrun/content/sound/mgs/reflexloop.wav new file mode 100644 index 0000000..2ad9a2d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mgs/reflexloop.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mgs/reflexout.wav b/beatrun/gamemodes/beatrun/content/sound/mgs/reflexout.wav new file mode 100644 index 0000000..3392e8b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mgs/reflexout.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_01.wav new file mode 100644 index 0000000..54bafc8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_02.wav new file mode 100644 index 0000000..72ba329 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_03.wav new file mode 100644 index 0000000..f4604e1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_04.wav new file mode 100644 index 0000000..907945f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Body_Roll_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1a.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1a.wav new file mode 100644 index 0000000..5599fd2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1a.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1b.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1b.wav new file mode 100644 index 0000000..0098281 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1b.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1c.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1c.wav new file mode 100644 index 0000000..c66125a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1c.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1d.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1d.wav new file mode 100644 index 0000000..e24febd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1d.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1e.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1e.wav new file mode 100644 index 0000000..6281c82 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1e.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1f.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1f.wav new file mode 100644 index 0000000..60477ce Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/BF_Short_Hard_1f.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run1.wav new file mode 100644 index 0000000..0a4169c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run2.wav new file mode 100644 index 0000000..42ea0c1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run3.wav new file mode 100644 index 0000000..851656b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run4.wav new file mode 100644 index 0000000..2172c42 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run5.wav new file mode 100644 index 0000000..1591021 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run6.wav new file mode 100644 index 0000000..2b9c898 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run7.wav new file mode 100644 index 0000000..aaf7ad1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run8.wav new file mode 100644 index 0000000..93d5750 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Cloth_Movement_Run8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land1.wav new file mode 100644 index 0000000..502516b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land2.wav new file mode 100644 index 0000000..10d1e60 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land3.wav new file mode 100644 index 0000000..5c4de23 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land4.wav new file mode 100644 index 0000000..faa3b6c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land5.wav new file mode 100644 index 0000000..5010321 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land6.wav new file mode 100644 index 0000000..02e9f78 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land7.wav new file mode 100644 index 0000000..457767c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Roll_Land7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish1.wav new file mode 100644 index 0000000..e3d6695 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish10.wav new file mode 100644 index 0000000..24cdd30 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish11.wav new file mode 100644 index 0000000..d9d0043 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish12.wav new file mode 100644 index 0000000..ecc3cf7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish2.wav new file mode 100644 index 0000000..ce1862e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish3.wav new file mode 100644 index 0000000..2d12d7c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish4.wav new file mode 100644 index 0000000..612142b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish5.wav new file mode 100644 index 0000000..0db464a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish6.wav new file mode 100644 index 0000000..01da3e1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish7.wav new file mode 100644 index 0000000..5911d30 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish8.wav new file mode 100644 index 0000000..649d59e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish9.wav new file mode 100644 index 0000000..e16ba9d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth/ME_Faith_Cloth_Vault_Swish9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_01.wav new file mode 100644 index 0000000..f02d2ed Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_02.wav new file mode 100644 index 0000000..cdc32bb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_03.wav new file mode 100644 index 0000000..02a717e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_04.wav new file mode 100644 index 0000000..66bd6c0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_05.wav new file mode 100644 index 0000000..3979fdf Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_06.wav new file mode 100644 index 0000000..346acbf Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_07.wav new file mode 100644 index 0000000..762ab68 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_08.wav new file mode 100644 index 0000000..ced4332 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Run_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_01.wav new file mode 100644 index 0000000..a328822 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_02.wav new file mode 100644 index 0000000..ebca9c1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_03.wav new file mode 100644 index 0000000..a0922aa Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_04.wav new file mode 100644 index 0000000..c92f359 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_05.wav new file mode 100644 index 0000000..025ebbb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_06.wav new file mode 100644 index 0000000..63699e1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_07.wav new file mode 100644 index 0000000..5a2103a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_08.wav new file mode 100644 index 0000000..58332e7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Sneak_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_01.wav new file mode 100644 index 0000000..eb70ec3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_02.wav new file mode 100644 index 0000000..4f91301 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_03.wav new file mode 100644 index 0000000..e90cd56 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_04.wav new file mode 100644 index 0000000..26d5a2a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_05.wav new file mode 100644 index 0000000..da0c8b3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_06.wav new file mode 100644 index 0000000..a7e2dec Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_07.wav new file mode 100644 index 0000000..1c55595 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_08.wav new file mode 100644 index 0000000..6a035fc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Cloth_Movement_Walk_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_01.wav new file mode 100644 index 0000000..8cd89b3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_02.wav new file mode 100644 index 0000000..627aef5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_03.wav new file mode 100644 index 0000000..966b263 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_04.wav new file mode 100644 index 0000000..bc28850 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_05.wav new file mode 100644 index 0000000..fb0043d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_06.wav new file mode 100644 index 0000000..6c7e328 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_07.wav new file mode 100644 index 0000000..d330b25 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_08.wav new file mode 100644 index 0000000..d45c907 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_09.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_09.wav new file mode 100644 index 0000000..bdffa60 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ConcreteFootStepLand_09.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall1.wav new file mode 100644 index 0000000..1b52033 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall2.wav new file mode 100644 index 0000000..8ad850f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall3.wav new file mode 100644 index 0000000..5024272 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall4.wav new file mode 100644 index 0000000..c9b58ec Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/DeathFall4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/FallStatic.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/FallStatic.wav new file mode 100644 index 0000000..72d7f95 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/FallStatic.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_01.wav new file mode 100644 index 0000000..df16c64 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_02.wav new file mode 100644 index 0000000..f84223b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_03.wav new file mode 100644 index 0000000..8f3dcde Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_04.wav new file mode 100644 index 0000000..7749a63 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_05.wav new file mode 100644 index 0000000..d5a41fd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_06.wav new file mode 100644 index 0000000..13d91f7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_07.wav new file mode 100644 index 0000000..63390ce Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_08.wav new file mode 100644 index 0000000..856931d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_09.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_09.wav new file mode 100644 index 0000000..d76e946 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Flesh_09.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_01.wav new file mode 100644 index 0000000..6cfd65b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_02.wav new file mode 100644 index 0000000..ff77dce Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_03.wav new file mode 100644 index 0000000..ae40d18 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_04.wav new file mode 100644 index 0000000..99ff959 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_05.wav new file mode 100644 index 0000000..02301e9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_06.wav new file mode 100644 index 0000000..39e4a2e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_01.wav new file mode 100644 index 0000000..93c5e5a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_02.wav new file mode 100644 index 0000000..c002b67 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_03.wav new file mode 100644 index 0000000..868cd53 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_04.wav new file mode 100644 index 0000000..73ebb5e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_05.wav new file mode 100644 index 0000000..dd8a34a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_06.wav new file mode 100644 index 0000000..5629ff7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ConcreteFootStepWallRun_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun1.wav new file mode 100644 index 0000000..5052779 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun10.wav new file mode 100644 index 0000000..1cbc689 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun11.wav new file mode 100644 index 0000000..9d34600 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun12.wav new file mode 100644 index 0000000..b2ec851 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun13.wav new file mode 100644 index 0000000..56a05b0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun14.wav new file mode 100644 index 0000000..46828a8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun2.wav new file mode 100644 index 0000000..374b623 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun3.wav new file mode 100644 index 0000000..d9a210d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun4.wav new file mode 100644 index 0000000..6dfe4a9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun5.wav new file mode 100644 index 0000000..872f184 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun6.wav new file mode 100644 index 0000000..993642a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun7.wav new file mode 100644 index 0000000..6106904 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun8.wav new file mode 100644 index 0000000..5275211 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun9.wav new file mode 100644 index 0000000..00ddcc6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRun9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease1.wav new file mode 100644 index 0000000..8ad4c0c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease10.wav new file mode 100644 index 0000000..57385fb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease11.wav new file mode 100644 index 0000000..0b56a50 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease12.wav new file mode 100644 index 0000000..79aaa72 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease13.wav new file mode 100644 index 0000000..7366f5a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease14.wav new file mode 100644 index 0000000..51d62bb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease2.wav new file mode 100644 index 0000000..99429bd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease3.wav new file mode 100644 index 0000000..ec190a3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease4.wav new file mode 100644 index 0000000..727dbef Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease5.wav new file mode 100644 index 0000000..04085fd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease6.wav new file mode 100644 index 0000000..629d7fa Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease7.wav new file mode 100644 index 0000000..9478af4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease8.wav new file mode 100644 index 0000000..bf42880 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease9.wav new file mode 100644 index 0000000..8ba2eae Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land1.wav new file mode 100644 index 0000000..de74ac8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land2.wav new file mode 100644 index 0000000..0931f64 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land3.wav new file mode 100644 index 0000000..cda958e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land4.wav new file mode 100644 index 0000000..77ac77f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land5.wav new file mode 100644 index 0000000..ce6a9f6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land6.wav new file mode 100644 index 0000000..38401c3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land7.wav new file mode 100644 index 0000000..d2dfd67 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land8.wav new file mode 100644 index 0000000..cb219c1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land9.wav new file mode 100644 index 0000000..393400e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_FootStep_Concrete_Land9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith1.wav new file mode 100644 index 0000000..8540e90 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith10.wav new file mode 100644 index 0000000..5c7ee4c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith11.wav new file mode 100644 index 0000000..d390e4c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith12.wav new file mode 100644 index 0000000..9468a31 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith13.wav new file mode 100644 index 0000000..aa88058 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith14.wav new file mode 100644 index 0000000..b85e177 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith15.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith15.wav new file mode 100644 index 0000000..aa3cc64 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith15.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith16.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith16.wav new file mode 100644 index 0000000..9fa6a30 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith16.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith17.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith17.wav new file mode 100644 index 0000000..dd743c4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith17.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith18.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith18.wav new file mode 100644 index 0000000..dc63558 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith18.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith19.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith19.wav new file mode 100644 index 0000000..de395d1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith19.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith2.wav new file mode 100644 index 0000000..0c9723a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith20.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith20.wav new file mode 100644 index 0000000..f8a6613 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith20.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith21.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith21.wav new file mode 100644 index 0000000..759c138 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith21.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith22.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith22.wav new file mode 100644 index 0000000..7114113 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith22.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith3.wav new file mode 100644 index 0000000..f96e998 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith4.wav new file mode 100644 index 0000000..9011aa1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith5.wav new file mode 100644 index 0000000..5054f4a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith6.wav new file mode 100644 index 0000000..48f326d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith7.wav new file mode 100644 index 0000000..f1fa8f0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith8.wav new file mode 100644 index 0000000..8e12104 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith9.wav new file mode 100644 index 0000000..9e7b58e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith1.wav new file mode 100644 index 0000000..a318ed0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith10.wav new file mode 100644 index 0000000..4f556cb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith11.wav new file mode 100644 index 0000000..6498b8b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith12.wav new file mode 100644 index 0000000..9d91a31 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith13.wav new file mode 100644 index 0000000..e8bfc01 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith14.wav new file mode 100644 index 0000000..6a25a67 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith2.wav new file mode 100644 index 0000000..832a56a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith3.wav new file mode 100644 index 0000000..3d3a8c6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith4.wav new file mode 100644 index 0000000..1f39519 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith5.wav new file mode 100644 index 0000000..8c123a4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith6.wav new file mode 100644 index 0000000..104510c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith7.wav new file mode 100644 index 0000000..b7544dd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith8.wav new file mode 100644 index 0000000..1d99cff Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith9.wav new file mode 100644 index 0000000..740f391 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun1.wav new file mode 100644 index 0000000..0890e39 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun10.wav new file mode 100644 index 0000000..0eb4338 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun11.wav new file mode 100644 index 0000000..f2a2819 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun12.wav new file mode 100644 index 0000000..81c8c32 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun13.wav new file mode 100644 index 0000000..3a7cea4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun14.wav new file mode 100644 index 0000000..63fb7d9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun15.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun15.wav new file mode 100644 index 0000000..b39fabe Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun15.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun16.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun16.wav new file mode 100644 index 0000000..7189ccd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun16.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun17.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun17.wav new file mode 100644 index 0000000..97a3865 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun17.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun18.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun18.wav new file mode 100644 index 0000000..69ad82e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun18.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun19.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun19.wav new file mode 100644 index 0000000..bf9876f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun19.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun2.wav new file mode 100644 index 0000000..eaf5e4e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun20.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun20.wav new file mode 100644 index 0000000..35aff9f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun20.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun3.wav new file mode 100644 index 0000000..8e0a54e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun4.wav new file mode 100644 index 0000000..56af58f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun5.wav new file mode 100644 index 0000000..1059c07 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun6.wav new file mode 100644 index 0000000..cd24f75 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun7.wav new file mode 100644 index 0000000..75c94bf Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun8.wav new file mode 100644 index 0000000..d9a59a8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun9.wav new file mode 100644 index 0000000..11251f2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRun9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease1.wav new file mode 100644 index 0000000..c398b30 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease2.wav new file mode 100644 index 0000000..94532cc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease3.wav new file mode 100644 index 0000000..daf7ff0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease4.wav new file mode 100644 index 0000000..5e85768 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease5.wav new file mode 100644 index 0000000..289c665 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease6.wav new file mode 100644 index 0000000..b169cad Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease7.wav new file mode 100644 index 0000000..2ec80f4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease8.wav new file mode 100644 index 0000000..0e981b1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease9.wav new file mode 100644 index 0000000..2ae8109 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand1.wav new file mode 100644 index 0000000..a364101 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand2.wav new file mode 100644 index 0000000..b6e446e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand3.wav new file mode 100644 index 0000000..8f83f47 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand4.wav new file mode 100644 index 0000000..7b8617b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand5.wav new file mode 100644 index 0000000..1649b91 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand6.wav new file mode 100644 index 0000000..1bf02e1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand7.wav new file mode 100644 index 0000000..ec1f97f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Glass/ME_FootStep_GlassPanelLand7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy1.wav new file mode 100644 index 0000000..584cf1d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy10.wav new file mode 100644 index 0000000..4e66599 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy11.wav new file mode 100644 index 0000000..e248461 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy2.wav new file mode 100644 index 0000000..37f7e39 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy3.wav new file mode 100644 index 0000000..ccb992c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy4.wav new file mode 100644 index 0000000..338caf5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy5.wav new file mode 100644 index 0000000..0ec1aaa Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy6.wav new file mode 100644 index 0000000..ba652e3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy7.wav new file mode 100644 index 0000000..6200d58 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy8.wav new file mode 100644 index 0000000..b18537d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy9.wav new file mode 100644 index 0000000..0d883a0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint1.wav new file mode 100644 index 0000000..b694b5b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint10.wav new file mode 100644 index 0000000..9572109 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint11.wav new file mode 100644 index 0000000..5c06f7d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint12.wav new file mode 100644 index 0000000..2d34644 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint13.wav new file mode 100644 index 0000000..986ac05 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint14.wav new file mode 100644 index 0000000..993912a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint15.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint15.wav new file mode 100644 index 0000000..82b9d0f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint15.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint2.wav new file mode 100644 index 0000000..c2a66ec Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint3.wav new file mode 100644 index 0000000..11aa096 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint4.wav new file mode 100644 index 0000000..23edbf2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint5.wav new file mode 100644 index 0000000..6215808 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint6.wav new file mode 100644 index 0000000..e51f88a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint7.wav new file mode 100644 index 0000000..8affadd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint8.wav new file mode 100644 index 0000000..4a5fcbb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint9.wav new file mode 100644 index 0000000..ffb6525 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith1.wav new file mode 100644 index 0000000..8c58353 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith10.wav new file mode 100644 index 0000000..de2816b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith11.wav new file mode 100644 index 0000000..c85f604 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith12.wav new file mode 100644 index 0000000..3768106 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith13.wav new file mode 100644 index 0000000..6c3ef1b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith14.wav new file mode 100644 index 0000000..6d2b828 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith15.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith15.wav new file mode 100644 index 0000000..156e0e0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith15.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith2.wav new file mode 100644 index 0000000..cacaa56 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith3.wav new file mode 100644 index 0000000..7bbce21 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith4.wav new file mode 100644 index 0000000..f32c8c1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith5.wav new file mode 100644 index 0000000..e95b18e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith6.wav new file mode 100644 index 0000000..95ce1da Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith7.wav new file mode 100644 index 0000000..c7b8213 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith8.wav new file mode 100644 index 0000000..547ff04 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith9.wav new file mode 100644 index 0000000..0e516b5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun10.wav new file mode 100644 index 0000000..a300eb6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun11.wav new file mode 100644 index 0000000..f9b67ed Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun7.wav new file mode 100644 index 0000000..961d44e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun8.wav new file mode 100644 index 0000000..f516190 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun9.wav new file mode 100644 index 0000000..cac7838 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_FootStep_MetalDuctRun9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts1.wav new file mode 100644 index 0000000..69d0443 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts2.wav new file mode 100644 index 0000000..7c4c2fc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts3.wav new file mode 100644 index 0000000..3dbb8ef Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts4.wav new file mode 100644 index 0000000..a1a8ae8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release1.wav new file mode 100644 index 0000000..8a92339 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release2.wav new file mode 100644 index 0000000..fdf9ad2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release3.wav new file mode 100644 index 0000000..891350a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release4.wav new file mode 100644 index 0000000..aa1840d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release5.wav new file mode 100644 index 0000000..32e45b6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release6.wav new file mode 100644 index 0000000..d6e174f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release7.wav new file mode 100644 index 0000000..97840d2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release8.wav new file mode 100644 index 0000000..e826824 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release9.wav new file mode 100644 index 0000000..8decc9e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_01.wav new file mode 100644 index 0000000..57c5145 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_02.wav new file mode 100644 index 0000000..5e3973d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_03.wav new file mode 100644 index 0000000..1b94472 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_04.wav new file mode 100644 index 0000000..ba197a4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_05.wav new file mode 100644 index 0000000..bf5aedd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_06.wav new file mode 100644 index 0000000..d079979 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_07.wav new file mode 100644 index 0000000..6b7add9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_08.wav new file mode 100644 index 0000000..79aa4c4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_09.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_09.wav new file mode 100644 index 0000000..0c5c1f8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_09.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint1.wav new file mode 100644 index 0000000..9f40f2f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint10.wav new file mode 100644 index 0000000..6d40c1f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint11.wav new file mode 100644 index 0000000..d086db9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint12.wav new file mode 100644 index 0000000..04b6a42 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint13.wav new file mode 100644 index 0000000..c05d4de Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint14.wav new file mode 100644 index 0000000..a16228e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint15.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint15.wav new file mode 100644 index 0000000..3493586 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint15.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint16.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint16.wav new file mode 100644 index 0000000..5a75e0a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint16.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint17.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint17.wav new file mode 100644 index 0000000..b569ee1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint17.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint18.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint18.wav new file mode 100644 index 0000000..10ef062 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint18.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint19.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint19.wav new file mode 100644 index 0000000..e794994 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint19.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint2.wav new file mode 100644 index 0000000..715ba3b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint20.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint20.wav new file mode 100644 index 0000000..eea408b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint20.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint3.wav new file mode 100644 index 0000000..da79143 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint4.wav new file mode 100644 index 0000000..cffa999 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint5.wav new file mode 100644 index 0000000..ee2a256 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint6.wav new file mode 100644 index 0000000..57cc4f7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint7.wav new file mode 100644 index 0000000..9373ab4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint8.wav new file mode 100644 index 0000000..fdf45ad Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint9.wav new file mode 100644 index 0000000..255c98e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release1.wav new file mode 100644 index 0000000..8872cb6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release10.wav new file mode 100644 index 0000000..d10ee6d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release11.wav new file mode 100644 index 0000000..70d14ff Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release12.wav new file mode 100644 index 0000000..cc6e692 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release13.wav new file mode 100644 index 0000000..0ad6102 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release14.wav new file mode 100644 index 0000000..d5a1cda Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release15.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release15.wav new file mode 100644 index 0000000..07e0d01 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release15.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release2.wav new file mode 100644 index 0000000..2fdae2a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release3.wav new file mode 100644 index 0000000..98893ca Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release4.wav new file mode 100644 index 0000000..61120a7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release5.wav new file mode 100644 index 0000000..49ff91f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release6.wav new file mode 100644 index 0000000..9f23f48 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release7.wav new file mode 100644 index 0000000..3a05db7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release8.wav new file mode 100644 index 0000000..a9c1e19 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release9.wav new file mode 100644 index 0000000..80be1f4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release1.wav new file mode 100644 index 0000000..f251729 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release10.wav new file mode 100644 index 0000000..ad90779 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release11.wav new file mode 100644 index 0000000..e5cf248 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release12.wav new file mode 100644 index 0000000..8501eff Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release13.wav new file mode 100644 index 0000000..065c2f3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release14.wav new file mode 100644 index 0000000..cdc7341 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release2.wav new file mode 100644 index 0000000..639d82f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release3.wav new file mode 100644 index 0000000..6737a91 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release4.wav new file mode 100644 index 0000000..d8c0e79 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release5.wav new file mode 100644 index 0000000..1fc35e1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release6.wav new file mode 100644 index 0000000..ae21075 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release7.wav new file mode 100644 index 0000000..f34e5d6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release8.wav new file mode 100644 index 0000000..b933770 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release9.wav new file mode 100644 index 0000000..ad96df4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step1.wav new file mode 100644 index 0000000..bac9d30 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step10.wav new file mode 100644 index 0000000..641d8d8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step11.wav new file mode 100644 index 0000000..0c2e181 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step12.wav new file mode 100644 index 0000000..9c4d0c4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step13.wav new file mode 100644 index 0000000..cac731b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step2.wav new file mode 100644 index 0000000..670875b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step3.wav new file mode 100644 index 0000000..8a06451 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step4.wav new file mode 100644 index 0000000..56b676b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step5.wav new file mode 100644 index 0000000..4874e52 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step6.wav new file mode 100644 index 0000000..9125887 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step7.wav new file mode 100644 index 0000000..984c7f9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step8.wav new file mode 100644 index 0000000..626d16f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step9.wav new file mode 100644 index 0000000..8866326 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant1.wav new file mode 100644 index 0000000..b309603 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant10.wav new file mode 100644 index 0000000..00b390e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant11.wav new file mode 100644 index 0000000..4b6007c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant12.wav new file mode 100644 index 0000000..9f58c43 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant13.wav new file mode 100644 index 0000000..24764d1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant14.wav new file mode 100644 index 0000000..2c300c4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant15.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant15.wav new file mode 100644 index 0000000..cf04792 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant15.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant2.wav new file mode 100644 index 0000000..f54cc35 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant3.wav new file mode 100644 index 0000000..2529034 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant4.wav new file mode 100644 index 0000000..d1d36de Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant5.wav new file mode 100644 index 0000000..3253a00 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant6.wav new file mode 100644 index 0000000..1dd0fd8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant7.wav new file mode 100644 index 0000000..6c9df99 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant8.wav new file mode 100644 index 0000000..4e29bea Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant9.wav new file mode 100644 index 0000000..051be53 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease1.wav new file mode 100644 index 0000000..b9da3c7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease10.wav new file mode 100644 index 0000000..ff54143 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease11.wav new file mode 100644 index 0000000..928d281 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease12.wav new file mode 100644 index 0000000..d7903bc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease13.wav new file mode 100644 index 0000000..d091a02 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease14.wav new file mode 100644 index 0000000..aa93bec Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease15.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease15.wav new file mode 100644 index 0000000..30a8d55 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease15.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease2.wav new file mode 100644 index 0000000..eff6465 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease3.wav new file mode 100644 index 0000000..74e23b0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease4.wav new file mode 100644 index 0000000..88b0628 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease5.wav new file mode 100644 index 0000000..fbf6285 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease6.wav new file mode 100644 index 0000000..b15c782 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease7.wav new file mode 100644 index 0000000..02e8188 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease8.wav new file mode 100644 index 0000000..943cc78 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease9.wav new file mode 100644 index 0000000..bbb3da5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Gadgets/ME_Magrope_Fire.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Gadgets/ME_Magrope_Fire.wav new file mode 100644 index 0000000..e8bdb07 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Gadgets/ME_Magrope_Fire.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Fence.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Fence.wav new file mode 100644 index 0000000..37a243d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Fence.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Fence_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Fence_01.wav new file mode 100644 index 0000000..e666824 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Fence_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Fence_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Fence_02.wav new file mode 100644 index 0000000..040afc4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Fence_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Landing_01.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Landing_01.ogg new file mode 100644 index 0000000..d6d6114 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/Landing_01.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge1.wav new file mode 100644 index 0000000..e5854f2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge2.wav new file mode 100644 index 0000000..64f2f4f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge3.wav new file mode 100644 index 0000000..45f8bdb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge4.wav new file mode 100644 index 0000000..a692bd0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/GameplayObjects/ME_Door_Generic_Barge4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepFastRelease_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepFastRelease_01.wav new file mode 100644 index 0000000..e7ed89c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepFastRelease_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepFastRelease_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepFastRelease_02.wav new file mode 100644 index 0000000..2bac4a5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepFastRelease_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepFastRelease_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepFastRelease_03.wav new file mode 100644 index 0000000..b5397c3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepFastRelease_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepHard_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepHard_01.wav new file mode 100644 index 0000000..c1d492c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepHard_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepHard_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepHard_02.wav new file mode 100644 index 0000000..3fd2396 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepHard_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepHard_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepHard_03.wav new file mode 100644 index 0000000..b77497a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepHard_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_01.wav new file mode 100644 index 0000000..b10b854 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_02.wav new file mode 100644 index 0000000..746a7f6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_03.wav new file mode 100644 index 0000000..c05da95 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_04.wav new file mode 100644 index 0000000..70d13c9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Handsteps/Concrete/ConcreteHandStepSoft_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/LOD.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/LOD.wav new file mode 100644 index 0000000..7dc82bc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/LOD.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_01.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_01.ogg new file mode 100644 index 0000000..b1cd78e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_01.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_02.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_02.ogg new file mode 100644 index 0000000..60e08e2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_02.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_03.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_03.ogg new file mode 100644 index 0000000..faf26d6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_03.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_04.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_04.ogg new file mode 100644 index 0000000..569fd6a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_04.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_05.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_05.ogg new file mode 100644 index 0000000..4c2431e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_05.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_06.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_06.ogg new file mode 100644 index 0000000..abffc3c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepHvy_06.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_01.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_01.ogg new file mode 100644 index 0000000..49c492c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_01.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_02.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_02.ogg new file mode 100644 index 0000000..3cb7255 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_02.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_03.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_03.ogg new file mode 100644 index 0000000..714fe26 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_03.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_04.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_04.ogg new file mode 100644 index 0000000..42804a1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_04.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_05.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_05.ogg new file mode 100644 index 0000000..7462ce0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_05.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_06.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_06.ogg new file mode 100644 index 0000000..19e73e4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepMed_06.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_01.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_01.ogg new file mode 100644 index 0000000..c38d10b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_01.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_02.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_02.ogg new file mode 100644 index 0000000..11f4447 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_02.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_03.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_03.ogg new file mode 100644 index 0000000..89e0249 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_03.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_04.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_04.ogg new file mode 100644 index 0000000..cad589f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_04.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_05.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_05.ogg new file mode 100644 index 0000000..5d75d87 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_05.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_06.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_06.ogg new file mode 100644 index 0000000..cd362cc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderFootstepRelease_06.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_01.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_01.ogg new file mode 100644 index 0000000..4935787 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_01.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_02.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_02.ogg new file mode 100644 index 0000000..0168123 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_02.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_03.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_03.ogg new file mode 100644 index 0000000..25341fa Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_03.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_04.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_04.ogg new file mode 100644 index 0000000..2b51e8c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_04.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_05.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_05.ogg new file mode 100644 index 0000000..3f75eb2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_05.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_06.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_06.ogg new file mode 100644 index 0000000..808b16d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_06.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_07.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_07.ogg new file mode 100644 index 0000000..8bf87e9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_07.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_08.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_08.ogg new file mode 100644 index 0000000..4fe43c0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_08.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_09.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_09.ogg new file mode 100644 index 0000000..91d7efd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_09.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_10.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_10.ogg new file mode 100644 index 0000000..fbda11e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_10.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_21.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_21.ogg new file mode 100644 index 0000000..265f7a7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_21.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_22.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_22.ogg new file mode 100644 index 0000000..a80591a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_22.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_23.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_23.ogg new file mode 100644 index 0000000..f197960 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_23.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_24.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_24.ogg new file mode 100644 index 0000000..0736a45 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_24.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_25.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_25.ogg new file mode 100644 index 0000000..fc1e34e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_25.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_26.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_26.ogg new file mode 100644 index 0000000..14e6373 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_26.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_27.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_27.ogg new file mode 100644 index 0000000..9babae9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_27.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_28.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_28.ogg new file mode 100644 index 0000000..c575eb0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_28.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_29.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_29.ogg new file mode 100644 index 0000000..74fb1f6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_29.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_30.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_30.ogg new file mode 100644 index 0000000..3254412 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_30.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_41.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_41.ogg new file mode 100644 index 0000000..755354e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_41.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_42.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_42.ogg new file mode 100644 index 0000000..1f51288 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_42.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_43.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_43.ogg new file mode 100644 index 0000000..a28e127 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_43.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_44.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_44.ogg new file mode 100644 index 0000000..fa04d5b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_44.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_45.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_45.ogg new file mode 100644 index 0000000..483bfa3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_45.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_46.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_46.ogg new file mode 100644 index 0000000..4fe5b08 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_46.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_47.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_47.ogg new file mode 100644 index 0000000..d876d7b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_47.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_48.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_48.ogg new file mode 100644 index 0000000..c92a8d4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_48.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_49.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_49.ogg new file mode 100644 index 0000000..14870c6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_49.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_50.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_50.ogg new file mode 100644 index 0000000..2e99a1e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/LadderHandstep_50.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/Ladder_Land_01.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/Ladder_Land_01.ogg new file mode 100644 index 0000000..011e558 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/Ladder_Land_01.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/Ladder_Land_02.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/Ladder_Land_02.ogg new file mode 100644 index 0000000..4265c9a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/Ladder_Land_02.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/Ladder_Land_03.ogg b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/Ladder_Land_03.ogg new file mode 100644 index 0000000..454821f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Ladder/Ladder_Land_03.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump1.wav new file mode 100644 index 0000000..8c6bd39 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump10.wav new file mode 100644 index 0000000..1fddaf8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump2.wav new file mode 100644 index 0000000..a87bcf9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump3.wav new file mode 100644 index 0000000..1b89c70 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump4.wav new file mode 100644 index 0000000..490a0e3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump5.wav new file mode 100644 index 0000000..d71bc1e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump6.wav new file mode 100644 index 0000000..10f0f30 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump7.wav new file mode 100644 index 0000000..8a4073f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump8.wav new file mode 100644 index 0000000..e60eeda Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump9.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump9.wav new file mode 100644 index 0000000..35bf29b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyConcreteBump9.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall1.wav new file mode 100644 index 0000000..d183082 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall2.wav new file mode 100644 index 0000000..a3780b2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall3.wav new file mode 100644 index 0000000..3a2a813 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall4.wav new file mode 100644 index 0000000..7ef391f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall5.wav new file mode 100644 index 0000000..76df15a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_BodyFall5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootScuffs_Concrete_180_Turn.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootScuffs_Concrete_180_Turn.wav new file mode 100644 index 0000000..e1408d3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootScuffs_Concrete_180_Turn.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun1.wav new file mode 100644 index 0000000..f2d0038 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun2.wav new file mode 100644 index 0000000..0ee61fe Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun3.wav new file mode 100644 index 0000000..88ef6dd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun4.wav new file mode 100644 index 0000000..f30029b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun5.wav new file mode 100644 index 0000000..212cd13 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun6.wav new file mode 100644 index 0000000..c2d7ff5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_FootStep_ConcreteWallRun6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith1.wav new file mode 100644 index 0000000..1ad17a0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith2.wav new file mode 100644 index 0000000..aeac4fe Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith3.wav new file mode 100644 index 0000000..4ac043d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith4.wav new file mode 100644 index 0000000..1e9fc21 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith5.wav new file mode 100644 index 0000000..8371363 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith6.wav new file mode 100644 index 0000000..d44414e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith7.wav new file mode 100644 index 0000000..3f03b6d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh1.wav new file mode 100644 index 0000000..9b45b54 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh2.wav new file mode 100644 index 0000000..0a03818 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh3.wav new file mode 100644 index 0000000..97eb528 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh4.wav new file mode 100644 index 0000000..79c8b7e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh5.wav new file mode 100644 index 0000000..944a549 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh6.wav new file mode 100644 index 0000000..0670384 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/armswoosh6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist1.wav new file mode 100644 index 0000000..7b668a9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist2.wav new file mode 100644 index 0000000..622860a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist3.wav new file mode 100644 index 0000000..636d088 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist4.wav new file mode 100644 index 0000000..ab283f9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist5.wav new file mode 100644 index 0000000..d443c9a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/fist5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot1.wav new file mode 100644 index 0000000..7d965f7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot2.wav new file mode 100644 index 0000000..77445a8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot3.wav new file mode 100644 index 0000000..82f2d12 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot4.wav new file mode 100644 index 0000000..fd30ee2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot5.wav new file mode 100644 index 0000000..29ee1f6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/foot5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh1.wav new file mode 100644 index 0000000..5789613 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh2.wav new file mode 100644 index 0000000..c896a9f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh3.wav new file mode 100644 index 0000000..2aaa45b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh4.wav new file mode 100644 index 0000000..89c9afc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Melee/legswoosh4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Slide/ME_FootStep_ConcreteSlideLoop.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Slide/ME_FootStep_ConcreteSlideLoop.wav new file mode 100644 index 0000000..7b6a910 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Slide/ME_FootStep_ConcreteSlideLoop.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Slide/ME_FootStep_GlassSlideLoop.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Slide/ME_FootStep_GlassSlideLoop.wav new file mode 100644 index 0000000..c7622f6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Slide/ME_FootStep_GlassSlideLoop.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/UI/ME_UI_challenge_end_success.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/UI/ME_UI_challenge_end_success.wav new file mode 100644 index 0000000..0305aa0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/UI/ME_UI_challenge_end_success.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/UI/ME_UI_hud_select.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/UI/ME_UI_hud_select.wav new file mode 100644 index 0000000..93d2597 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/UI/ME_UI_hud_select.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_01.wav new file mode 100644 index 0000000..c3ca546 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_02.wav new file mode 100644 index 0000000..64913fa Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_03.wav new file mode 100644 index 0000000..47112c3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_04.wav new file mode 100644 index 0000000..de41ab2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_05.wav new file mode 100644 index 0000000..0fa694c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_06.wav new file mode 100644 index 0000000..ca2455f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_07.wav new file mode 100644 index 0000000..e143902 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_08.wav new file mode 100644 index 0000000..181383b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_In_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_01.wav new file mode 100644 index 0000000..a15bee9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_02.wav new file mode 100644 index 0000000..601865c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_03.wav new file mode 100644 index 0000000..9bfdc90 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_04.wav new file mode 100644 index 0000000..ad8c72b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_05.wav new file mode 100644 index 0000000..7a27cc5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_06.wav new file mode 100644 index 0000000..49cea98 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_07.wav new file mode 100644 index 0000000..4b07386 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_08.wav new file mode 100644 index 0000000..dc2ac53 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Long_Out_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_01.wav new file mode 100644 index 0000000..3dadb98 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_02.wav new file mode 100644 index 0000000..f58e092 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_03.wav new file mode 100644 index 0000000..21864e9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_04.wav new file mode 100644 index 0000000..66a2fbc Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_05.wav new file mode 100644 index 0000000..0cd8ac9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_06.wav new file mode 100644 index 0000000..4b3ba03 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_07.wav new file mode 100644 index 0000000..b2eb283 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_08.wav new file mode 100644 index 0000000..12b4510 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_In_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_01.wav new file mode 100644 index 0000000..2eb940b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_02.wav new file mode 100644 index 0000000..62bf75a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_03.wav new file mode 100644 index 0000000..ab021c2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_04.wav new file mode 100644 index 0000000..82a26b4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_05.wav new file mode 100644 index 0000000..7b935b2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_06.wav new file mode 100644 index 0000000..653b4a4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_07.wav new file mode 100644 index 0000000..67c30df Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_08.wav new file mode 100644 index 0000000..83e3b33 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Medium_Short_Out_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_01.wav new file mode 100644 index 0000000..3ecbd58 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_02.wav new file mode 100644 index 0000000..e49b875 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_03.wav new file mode 100644 index 0000000..1abda2a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_04.wav new file mode 100644 index 0000000..74a7cf9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_05.wav new file mode 100644 index 0000000..421c5cd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_06.wav new file mode 100644 index 0000000..a76d559 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_In_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_01.wav new file mode 100644 index 0000000..fa0a9cd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_02.wav new file mode 100644 index 0000000..d42cf66 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_03.wav new file mode 100644 index 0000000..72a1432 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_04.wav new file mode 100644 index 0000000..a1b2765 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_05.wav new file mode 100644 index 0000000..d454e0d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_06.wav new file mode 100644 index 0000000..15b9db4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Long_Out_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_01.wav new file mode 100644 index 0000000..7494932 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_02.wav new file mode 100644 index 0000000..18501e6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_03.wav new file mode 100644 index 0000000..3596a81 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_04.wav new file mode 100644 index 0000000..e46d331 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_05.wav new file mode 100644 index 0000000..3756bb4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_06.wav new file mode 100644 index 0000000..61f7fa7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_07.wav new file mode 100644 index 0000000..3e267c5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_08.wav new file mode 100644 index 0000000..d241525 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_In_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_01.wav new file mode 100644 index 0000000..2ecdc7d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_02.wav new file mode 100644 index 0000000..9e823b5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_03.wav new file mode 100644 index 0000000..62911d3 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_04.wav new file mode 100644 index 0000000..1ebb237 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_05.wav new file mode 100644 index 0000000..03361c8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_06.wav new file mode 100644 index 0000000..634285a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_07.wav new file mode 100644 index 0000000..d98ea6c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_08.wav new file mode 100644 index 0000000..372a4a5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Breath_Soft_Short_Out_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_01.wav new file mode 100644 index 0000000..961b393 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_02.wav new file mode 100644 index 0000000..a9cabe0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_03.wav new file mode 100644 index 0000000..461758e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_04.wav new file mode 100644 index 0000000..e0b07f7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_05.wav new file mode 100644 index 0000000..0f87997 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_06.wav new file mode 100644 index 0000000..25e0816 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_07.wav new file mode 100644 index 0000000..cdb3015 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_08.wav new file mode 100644 index 0000000..3d66460 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_09.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_09.wav new file mode 100644 index 0000000..34ef083 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_09.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_10.wav new file mode 100644 index 0000000..de6b620 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_11.wav new file mode 100644 index 0000000..77d61a7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_12.wav new file mode 100644 index 0000000..0a72437 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_13.wav new file mode 100644 index 0000000..90293d5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_14.wav new file mode 100644 index 0000000..984ed02 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Hard_14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_01.wav new file mode 100644 index 0000000..b726750 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_02.wav new file mode 100644 index 0000000..4ee8ea6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_03.wav new file mode 100644 index 0000000..7ceb8d6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_04.wav new file mode 100644 index 0000000..c9e84db Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_05.wav new file mode 100644 index 0000000..eb4aba6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_06.wav new file mode 100644 index 0000000..4a9b0d7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_07.wav new file mode 100644 index 0000000..eb92769 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_08.wav new file mode 100644 index 0000000..3113593 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_09.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_09.wav new file mode 100644 index 0000000..5b14148 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_09.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_10.wav new file mode 100644 index 0000000..cdb73a5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_11.wav new file mode 100644 index 0000000..0b666db Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_12.wav new file mode 100644 index 0000000..70c8061 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_13.wav new file mode 100644 index 0000000..df8ecef Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_14.wav new file mode 100644 index 0000000..3faa9c9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Med_14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_01.wav new file mode 100644 index 0000000..05f2078 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_02.wav new file mode 100644 index 0000000..25fa143 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_03.wav new file mode 100644 index 0000000..385cd39 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_04.wav new file mode 100644 index 0000000..ba806d5 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_05.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_05.wav new file mode 100644 index 0000000..0f6a724 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_06.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_06.wav new file mode 100644 index 0000000..1dd6c1b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_07.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_07.wav new file mode 100644 index 0000000..479de6b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_08.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_08.wav new file mode 100644 index 0000000..44f72a2 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_08.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_09.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_09.wav new file mode 100644 index 0000000..7ca3ef0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_09.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_10.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_10.wav new file mode 100644 index 0000000..2a1d201 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_10.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_11.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_11.wav new file mode 100644 index 0000000..61d0985 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_11.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_12.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_12.wav new file mode 100644 index 0000000..217e0cd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_12.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_13.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_13.wav new file mode 100644 index 0000000..ca0e18a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_13.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_14.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_14.wav new file mode 100644 index 0000000..0fff4d4 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Impact_Soft_14.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact1.wav new file mode 100644 index 0000000..a3cc2d0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact2.wav new file mode 100644 index 0000000..2c29939 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact3.wav new file mode 100644 index 0000000..0fed0ba Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact4.wav new file mode 100644 index 0000000..73d3bbe Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact5.wav new file mode 100644 index 0000000..485f368 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact6.wav new file mode 100644 index 0000000..eaa0408 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact7.wav new file mode 100644 index 0000000..4023f2f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/ME_FemaleImpact7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_1.wav new file mode 100644 index 0000000..5db9e29 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_2.wav new file mode 100644 index 0000000..99554f8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_3.wav new file mode 100644 index 0000000..a005fdb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_4.wav new file mode 100644 index 0000000..96bc30d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_5.wav new file mode 100644 index 0000000..2d8ca9b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_6.wav new file mode 100644 index 0000000..d6b4c24 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_7.wav new file mode 100644 index 0000000..c3b74e8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_8.wav new file mode 100644 index 0000000..44987bf Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Hard_8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_1.wav new file mode 100644 index 0000000..f84ee5c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_2.wav new file mode 100644 index 0000000..46eaafb Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_3.wav new file mode 100644 index 0000000..25ef760 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_4.wav new file mode 100644 index 0000000..b95ef74 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_5.wav new file mode 100644 index 0000000..20d3152 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_6.wav new file mode 100644 index 0000000..aeef20c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_7.wav new file mode 100644 index 0000000..d1730b9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_8.wav new file mode 100644 index 0000000..72e0aab Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Medium_8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_1.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_1.wav new file mode 100644 index 0000000..558a2e1 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_2.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_2.wav new file mode 100644 index 0000000..601aee7 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_3.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_3.wav new file mode 100644 index 0000000..bd89f5b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_3.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_4.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_4.wav new file mode 100644 index 0000000..e00b22e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_4.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_5.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_5.wav new file mode 100644 index 0000000..6db4dda Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_5.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_6.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_6.wav new file mode 100644 index 0000000..53163a6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_6.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_7.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_7.wav new file mode 100644 index 0000000..23a3058 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_7.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_8.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_8.wav new file mode 100644 index 0000000..578ca35 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/VO/Faith/Strain_Soft_8.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_01.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_01.wav new file mode 100644 index 0000000..bfddd17 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_02.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_02.wav new file mode 100644 index 0000000..5c3d898 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_03.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_03.wav new file mode 100644 index 0000000..37934ed Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_04.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_04.wav new file mode 100644 index 0000000..48990b9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/Vault_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/zipline_attach.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/zipline_attach.wav new file mode 100644 index 0000000..c7434f0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/zipline_attach.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/zipline_detach.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/zipline_detach.wav new file mode 100644 index 0000000..887c385 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/zipline_detach.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/zipline_loop.wav b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/zipline_loop.wav new file mode 100644 index 0000000..8b19c8c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/mirrorsedge/zipline_loop.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/misc/totsugeki1.mp3 b/beatrun/gamemodes/beatrun/content/sound/misc/totsugeki1.mp3 new file mode 100644 index 0000000..1b41b25 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/misc/totsugeki1.mp3 differ diff --git a/beatrun/gamemodes/beatrun/content/sound/misc/totsugeki2.mp3 b/beatrun/gamemodes/beatrun/content/sound/misc/totsugeki2.mp3 new file mode 100644 index 0000000..6bbfec0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/misc/totsugeki2.mp3 differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/Infection_Countdown.mp3 b/beatrun/gamemodes/beatrun/content/sound/music/Infection_Countdown.mp3 new file mode 100644 index 0000000..a8f4a60 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/Infection_Countdown.mp3 differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/Sunrise.mp3 b/beatrun/gamemodes/beatrun/content/sound/music/Sunrise.mp3 new file mode 100644 index 0000000..bdaecdf Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/Sunrise.mp3 differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/credits.mp3 b/beatrun/gamemodes/beatrun/content/sound/music/credits.mp3 new file mode 100644 index 0000000..f9dbab9 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/credits.mp3 differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/locloop.wav b/beatrun/gamemodes/beatrun/content/sound/music/locloop.wav new file mode 100644 index 0000000..7dd5b60 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/locloop.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/locloop_unk.wav b/beatrun/gamemodes/beatrun/content/sound/music/locloop_unk.wav new file mode 100644 index 0000000..ca87967 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/locloop_unk.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/shard/Puzzle_01.ogg b/beatrun/gamemodes/beatrun/content/sound/music/shard/Puzzle_01.ogg new file mode 100644 index 0000000..776b88f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/shard/Puzzle_01.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/shard/Puzzle_01_2.ogg b/beatrun/gamemodes/beatrun/content/sound/music/shard/Puzzle_01_2.ogg new file mode 100644 index 0000000..5ea4514 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/shard/Puzzle_01_2.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_011.ogg b/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_011.ogg new file mode 100644 index 0000000..4e34291 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_011.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_011_2.ogg b/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_011_2.ogg new file mode 100644 index 0000000..8e12705 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_011_2.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_012.ogg b/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_012.ogg new file mode 100644 index 0000000..c3e0602 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_012.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_012_2.ogg b/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_012_2.ogg new file mode 100644 index 0000000..88d230d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_012_2.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_01_intro.ogg b/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_01_intro.ogg new file mode 100644 index 0000000..f73f402 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/music/shard/puzzle_01_intro.ogg differ diff --git a/beatrun/gamemodes/beatrun/content/sound/ping.wav b/beatrun/gamemodes/beatrun/content/sound/ping.wav new file mode 100644 index 0000000..4c312ed Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/ping.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_01.wav b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_01.wav new file mode 100644 index 0000000..4e3a45e Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_02.wav b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_02.wav new file mode 100644 index 0000000..c5245d0 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_03.wav b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_03.wav new file mode 100644 index 0000000..7d024bd Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_04.wav b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_04.wav new file mode 100644 index 0000000..8659062 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_05.wav b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_05.wav new file mode 100644 index 0000000..2510710 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_06.wav b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_06.wav new file mode 100644 index 0000000..2fda481 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/player_damage_tonal_hit_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/quakejump.mp3 b/beatrun/gamemodes/beatrun/content/sound/quakejump.mp3 new file mode 100644 index 0000000..e4c791c Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/quakejump.mp3 differ diff --git a/beatrun/gamemodes/beatrun/content/sound/reset.wav b/beatrun/gamemodes/beatrun/content/sound/reset.wav new file mode 100644 index 0000000..e791d26 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/reset.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/reset2.wav b/beatrun/gamemodes/beatrun/content/sound/reset2.wav new file mode 100644 index 0000000..c001552 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/reset2.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/restart.wav b/beatrun/gamemodes/beatrun/content/sound/restart.wav new file mode 100644 index 0000000..333a9f6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/restart.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/runwind.wav b/beatrun/gamemodes/beatrun/content/sound/runwind.wav new file mode 100644 index 0000000..7f48306 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/runwind.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/start.wav b/beatrun/gamemodes/beatrun/content/sound/start.wav new file mode 100644 index 0000000..55efb60 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/start.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_01.wav b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_01.wav new file mode 100644 index 0000000..6b8a93a Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_02.wav b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_02.wav new file mode 100644 index 0000000..136c443 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_03.wav b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_03.wav new file mode 100644 index 0000000..9b5ab54 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_04.wav b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_04.wav new file mode 100644 index 0000000..b431d7b Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_in_04.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/suit_breathe_out_05.wav b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_out_05.wav new file mode 100644 index 0000000..818862d Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_out_05.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/suit_breathe_out_06.wav b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_out_06.wav new file mode 100644 index 0000000..1f2388f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_out_06.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/suit_breathe_out_07.wav b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_out_07.wav new file mode 100644 index 0000000..31a90d8 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/suit_breathe_out_07.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/underwater_inhelmet_tone_new.wav b/beatrun/gamemodes/beatrun/content/sound/underwater_inhelmet_tone_new.wav new file mode 100644 index 0000000..4655b6f Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/underwater_inhelmet_tone_new.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/vinethud.mp3 b/beatrun/gamemodes/beatrun/content/sound/vinethud.mp3 new file mode 100644 index 0000000..af72294 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/vinethud.mp3 differ diff --git a/beatrun/gamemodes/beatrun/content/sound/vmanip/goprone_01.wav b/beatrun/gamemodes/beatrun/content/sound/vmanip/goprone_01.wav new file mode 100644 index 0000000..dd8f6e6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/vmanip/goprone_01.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/vmanip/goprone_02.wav b/beatrun/gamemodes/beatrun/content/sound/vmanip/goprone_02.wav new file mode 100644 index 0000000..08b52a6 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/vmanip/goprone_02.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/vmanip/goprone_03.wav b/beatrun/gamemodes/beatrun/content/sound/vmanip/goprone_03.wav new file mode 100644 index 0000000..ece0dad Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/vmanip/goprone_03.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/vmanip/unprone.wav b/beatrun/gamemodes/beatrun/content/sound/vmanip/unprone.wav new file mode 100644 index 0000000..2695146 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/vmanip/unprone.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/walljump1.wav b/beatrun/gamemodes/beatrun/content/sound/walljump1.wav new file mode 100644 index 0000000..945ba50 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/walljump1.wav differ diff --git a/beatrun/gamemodes/beatrun/content/sound/walljump2.wav b/beatrun/gamemodes/beatrun/content/sound/walljump2.wav new file mode 100644 index 0000000..d727a62 Binary files /dev/null and b/beatrun/gamemodes/beatrun/content/sound/walljump2.wav differ diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_anticampbox/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_anticampbox/shared.lua new file mode 100644 index 0000000..bb9daa3 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_anticampbox/shared.lua @@ -0,0 +1,78 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Camp Box" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_TRANSLUCENT + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/hunter/blocks/cube025x025x025.mdl" + +ENT.IsFinish = false + +function ENT:Initialize() + self:SetModel(self.Model) + self:DrawShadow(false) + self:SetMoveType(MOVETYPE_NONE) + self:SetSolid(SOLID_BBOX) + self:SetCollisionGroup(COLLISION_GROUP_IN_VEHICLE) + self:SetCollisionBounds(Vector(-150,-150,0), Vector(150,150,150)) + if SERVER then + self:SetTrigger(true) + end + + self:SetPos(self:GetPos() + Vector(-0, -0, 0)) +end + +local screencolor = Color(64, 0, 0, 64) +function ENT:StartTouch(ent) + if ent:IsPlayer() then + ent.MemeTime = CurTime()+10 + end +end + +function ENT:Touch(ent) + if ent:IsPlayer() then + if CurTime() > ent.MemeTime then + if !ent.MemeMessage then + ent:ChatPrint("Are you having fun standing still in a parkour game? Let's spice things up a bit!") + ent.MemeMessage = true + end + if CurTime()-4 > ent.MemeTime then + ent:SetVelocity(VectorRand()*1000) + end + end + end +end + +function ENT:EndTouch(ent) + if ent:IsPlayer() then + ent.MemeMessage = false + end +end + +function ENT:UpdateTransmitState() + return TRANSMIT_NEVER +end + +function ENT:Use(activator, caller, usetype) + +end + +function ENT:OnRemove() + +end + +function ENT:DrawTranslucent() +end + + +function ENT:Draw() + +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_balance/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_balance/shared.lua new file mode 100644 index 0000000..8516cb7 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_balance/shared.lua @@ -0,0 +1,164 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Balancing beam" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_OPAQUE + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/parkoursource/pipe_standard.mdl" + +ENT.NoClimbing = true +ENT.Balance = true + +function ENT:SetupDataTables() + self:NetworkVar( "Float", 0, "BalanceLength" ) +end + +function ENT:BalanceLengthExact(length) + self:SetBalanceLength(length) + local mins, maxs = Vector(-15,-6,-0), Vector(6, 6,length) + self:SetCollisionBounds(mins,maxs) + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) +end + +function ENT:Initialize() + local height = 250 + if SERVER then + self:SetBalanceLength(height) + end + + self:SetModel(self.Model) + local ang = self:GetAngles() + local mins, maxs = Vector(-15,-6,-0), Vector(6, 6,height) + self:SetCollisionBounds(mins,maxs) + self:SetAngles(ang) + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + + if CLIENT then + self:SetRenderBounds(mins,maxs) + self.CLModel = ClientsideModel(self.Model) + self.CLModel:SetPos(self:GetPos()) + self.CLModel:SetAngles(self:GetAngles()) + self.CLModel:SetMaterial("medge/plain/redbrickvertex") + end + + self:SetPos(self:GetPos()-self:GetAngles():Forward()*10) +end + +function ENT:UpdateTransmitState() + return TRANSMIT_PVS +end + +function ENT:OnRemove() + if IsValid(self.CLModel) then + self.CLModel:Remove() + end +end + +function ENT:DrawTranslucent() +end + +function ENT:Think() + if SERVER then + local ang = self:GetAngles() + if ang.x != 90 then + ang.x = 90 + self:SetAngles(ang) + end + self:NextThink(CurTime()+1) + return true + end + + if ( CLIENT ) then + local physobj = self:GetPhysicsObject() + + if !IsValid(self.CLModel) then + self.CLModel = ClientsideModel(self.Model) + self.CLModel:SetPos(self:GetPos()) + self.CLModel:SetAngles(self:GetAngles()) + self.CLModel:SetMaterial("medge/plain/redbrickvertex") + end + + if ( IsValid( physobj ) ) then + physobj:SetPos( self:GetPos() ) + physobj:SetAngles( self:GetAngles() ) + self.CLModel:SetPos( self:GetPos() ) + self.CLModel:SetAngles( self:GetAngles() ) + + local mins, maxs = physobj:GetAABB() + local cmins, cmaxs = self:GetCollisionBounds() + if maxs.z != cmaxs.z then + self:PhysicsInitBox(cmins,cmaxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + end + else + local cmins, cmaxs = self:GetCollisionBounds() + self:PhysicsInitBox(cmins,cmaxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + end + end +end + +function ENT:Draw() + local pos = self:GetPos() + local ang = self:GetAngles() + local oldz = pos.z + local old = pos + local mins, maxs = self:GetCollisionBounds() + maxs.z = self:GetBalanceLength() + local num = maxs.z/250 + local numc = math.floor(num) + local extra = num-numc + + if !IsValid(self.CLModel) then + self.CLModel = ClientsideModel(self.Model) + self.CLModel:SetPos(self:GetPos()) + self.CLModel:SetAngles(self:GetAngles()) + self.CLModel:SetMaterial("medge/plain/redbrickvertex") + end + + self:SetRenderBounds(mins,maxs) + -- render.DrawWireframeBox(pos, ang, mins, maxs) + for i=0, numc do + pos = self:GetPos() + if num == 1 then + self.CLModel:DrawModel() + break + end + if i==numc then + pos = pos + ang:Up()*(250*(i-1)) + if i>0 then + pos = pos + ang:Up()*(250*extra) + end + self.CLModel:SetPos(pos) + self.CLModel:SetupBones() + self.CLModel:DrawModel() + else + pos = pos + ang:Up()*(250*i) + self.CLModel:SetPos(pos) + self.CLModel:SetupBones() + self.CLModel:DrawModel() + end + end +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_cube/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_cube/shared.lua new file mode 100644 index 0000000..6f5958c --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_cube/shared.lua @@ -0,0 +1,74 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Cube" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_OPAQUE + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/hunter/blocks/cube025x025x025.mdl" + +local mat +if CLIENT then + mat = CreateMaterial("blockmeasure", "VertexLitGeneric", {["$basetexture"]="dev/reflectivity_50b", ["$color2"]=Vector(0,1,0)}) +end +local reflec = Material("dev/reflectivity_50b") +function ENT:SetupDataTables() + +end + +function ENT:Initialize() + -- if ( CLIENT ) then return end -- We only want to run this code serverside + if CLIENT then + if tcmat and !tcmat["blockmeasure"] then + tcmat["blockmeasure"] = mat + tcmatshaders["blockmeasure"] = 1 + end + end + self:PhysicsInitBox(Vector(0,0,0), Vector(100,100,1000)) + + -- Set up solidity and movetype + self:SetMoveType( MOVETYPE_VPHYSICS ) + self:SetSolid( SOLID_VPHYSICS ) + self:EnableCustomCollisions( true ) + self:GetPhysicsObject():EnableMotion(false) +end + + +function ENT:OnRemove() + +end + +function ENT:DrawTranslucent() +end + +function ENT:Think() + if SERVER then + self:NextThink(CurTime()+1) + return true + end + + if ( CLIENT ) then + local physobj = self:GetPhysicsObject() + + if ( IsValid( physobj ) ) then + physobj:SetPos( self:GetPos() ) + physobj:SetAngles( self:GetAngles() ) + end + end +end + +local matrix +local vecscale +function ENT:Draw() + local mins, maxs = self:GetCollisionBounds() + self:SetRenderBounds(mins, maxs) + render.SetMaterial(mat) + render.DrawBox(self:GetPos(), self:GetAngles(), mins, maxs, color_white) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_databank/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_databank/shared.lua new file mode 100644 index 0000000..2f099f4 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_databank/shared.lua @@ -0,0 +1,124 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Data Bank" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_TRANSLUCENT + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/hunter/blocks/cube025x025x025.mdl" + +ENT.IsFinish = false + +function ENT:SetupDataTables() + +end + +local minb, maxb = Vector(-75, -75, 0), Vector(75, 75, 100) +function ENT:Initialize() + self:SetModel(self.Model) + self:DrawShadow(false) + self:SetMoveType(MOVETYPE_NONE) + self:SetSolid(SOLID_BBOX) + self:SetCollisionGroup(COLLISION_GROUP_IN_VEHICLE) + self:SetCollisionBounds(minb, maxb) + if CLIENT then + self:SetRenderBounds(minb, maxb) + self.offset = 0 + else + self:SetTrigger(true) + end + + self:SetPos(self:GetPos() + Vector(-0, -0, 0)) +end + +local screencolor = Color(64, 0, 0, 64) +function ENT:StartTouch(ent) + if ent:IsPlayer() and ent:GetNW2Entity("DataBank") == self and ent:GetNW2Int("DataCubes", 0) > 0 then + ent:SetNW2Int("DataBanked", ent:GetNW2Int("DataBanked", 0) + math.min(ent:GetNW2Int("DataCubes"), 5)) + ent:SetNW2Int("DataCubes", math.max(ent:GetNW2Int("DataCubes")-5, 0)) + ent:DataTheft_Bank() + self:EmitSound("mirrorsedge/ui/ME_UI_hud_select.wav", 60, 100+math.random(-10,5)) + end +end + +function ENT:UpdateTransmitState() + return TRANSMIT_ALWAYS +end + +function ENT:Use(activator, caller, usetype) + +end + +function ENT:OnRemove() + +end + +local radius = 75 +local red = Color(200, 200, 200, 200) +local circlepos = Vector() +local circleup = Vector(0,0,25) +function ENT:DrawTranslucent() + local db = LocalPlayer():GetNW2Entity("DataBank") + if IsValid(db) and db == self then + self:SetRenderBounds(minb, maxb) + render.SetColorMaterial() + red.a = math.Clamp(LocalPlayer():GetPos():Distance(self:GetPos()) * 0.2, 25, 200) + for i=0, 16 do + local angle = i * math.pi*2 / 16 + self.offset + circlepos:SetUnpacked(math.cos(angle)*radius, math.sin(angle)*radius, 0) + local newpos = self:GetPos()+circlepos + render.DrawBeam(newpos, newpos+circleup, 8, 0, 1, red, true) + end + -- local bmin, bmax = self:GetRenderBounds() + -- render.DrawWireframeBox(self:GetPos(), angle_zero, bmin, bmax) + self.offset = self.offset + (0.00075) + if self.offset >= 180 then + self.offset = 0 + end + end +end + + +function ENT:Draw() + +end + +local vecup = Vector(0,0,50) +hook.Add("HUDPaint", "DataBank", function() + local db = LocalPlayer():GetNW2Entity("DataBank") + if IsValid(db) then + local pos = db:GetPos() + pos:Add(vecup) + local w2s = pos:ToScreen() + if w2s.visible then + surface.SetTextColor(200,200,200) + surface.SetFont("BeatrunHUD") + local tw, th = surface.GetTextSize("Deposit") + surface.SetTextPos(w2s.x-(tw*0.5), w2s.y) + surface.DrawText("Deposit") + end + end +end) + + +local player = FindMetaTable("Player") +if SERVER then + function player:DataTheft_Bank() + local dbtbl = ents.FindByClass("br_databank") + local bank = dbtbl[1] + while self:GetNW2Entity("DataBank") == bank do + table.Shuffle(dbtbl) + bank = dbtbl[1] + end + if bank then + self:SetNW2Entity("DataBank", bank) + end + end +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_datacube/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_datacube/shared.lua new file mode 100644 index 0000000..d2e1962 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_datacube/shared.lua @@ -0,0 +1,78 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Data Cube" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_TRANSLUCENT + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/hunter/blocks/cube05x05x05.mdl" +ENT.DataCube = true + +local color_green = Color(0,255,0) +function ENT:Initialize() + self:SetModel(self.Model) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(COLLISION_GROUP_WEAPON) + self:SetCollisionBounds(Vector(-20,-20,-15), Vector(20,20,30)) + if SERVER then + self:PhysicsInit(SOLID_VPHYSICS) + local randvec = VectorRand()*200 + randvec.z = math.abs(randvec.z) + self:SetTrigger(true) + self:GetPhysicsObject():SetVelocity(randvec) + end + self:SetColor(color_green) + self:SetCustomCollisionCheck(true) +end +hook.Add( "ShouldCollide", "DataCubeCollisions", function( ent1, ent2 ) + + -- If players are about to collide with each other, then they won't collide. + if ( ent1.DataCube and ent2.DataCube ) then return false end + +end ) + +local screencolor = Color(64, 0, 0, 64) +function ENT:StartTouch(ent) + if ent:IsPlayer() then + ent:SetNW2Int("DataCubes", ent:GetNW2Int("DataCubes", 0)+1) + self:EmitSound("A_TT_Stars.wav", 75, 100+math.random(-10,5)) + self:Remove() + end +end + +function ENT:Touch(ent) + if ent:IsPlayer() then + + end +end + +function ENT:Think() + return true +end + +function ENT:Use(activator, caller, usetype) + +end + +function ENT:OnRemove() + +end + +local spinang = Angle(0,1,0) +function ENT:DrawTranslucent() + local curang = self:GetRenderAngles() or Angle() + curang:Add(spinang) + self:SetRenderAngles(curang) + self:DrawModel() +end + + +function ENT:Draw() +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_hookpoint/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_hookpoint/shared.lua new file mode 100644 index 0000000..0994435 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_hookpoint/shared.lua @@ -0,0 +1,63 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Hook Point" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_TRANSLUCENT + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/Roller.mdl" +ENT.HookPoint = true + +local color_green = Color(0,255,0) +function ENT:Initialize() + self:SetModel(self.Model) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(COLLISION_GROUP_WEAPON) + local mins, maxs = self:GetCollisionBounds() + + self:PhysicsInitBox(mins, maxs) + + -- Set up solidity and movetype + self:SetMoveType( MOVETYPE_NONE ) + self:GetPhysicsObject():EnableMotion(false) +end + + +function ENT:Think() + if SERVER then + self:NextThink(CurTime()+1) + return true + end + + if ( CLIENT ) then + local physobj = self:GetPhysicsObject() + + if ( IsValid( physobj ) ) then + physobj:SetPos( self:GetPos() ) + physobj:SetAngles( self:GetAngles() ) + end + end +end + +function ENT:Use(activator, caller, usetype) + +end + +function ENT:OnRemove() + +end + +function ENT:DrawTranslucent() + self:DrawModel() +end + + +function ENT:Draw() +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_intelmarker/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_intelmarker/shared.lua new file mode 100644 index 0000000..2a86ca1 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_intelmarker/shared.lua @@ -0,0 +1,82 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Intel Marker" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_TRANSLUCENT + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/hunter/blocks/cube025x025x025.mdl" + +function ENT:SetupDataTables() + + self:NetworkVar( "Int", 0, "Score" ) + +end + +local minb, maxb = Vector(-40, -40, 0), Vector(40, 40, 64) +function ENT:Initialize() + self:SetModel(self.Model) + self:DrawShadow(false) + self:SetMoveType(MOVETYPE_NONE) + self:SetSolid(SOLID_BBOX) + self:SetCollisionGroup(COLLISION_GROUP_IN_VEHICLE) + self:SetCollisionBounds(minb, maxb) + if CLIENT then + self:SetRenderBounds(minb, maxb) + self.offset = 0 + else + self:SetTrigger(true) + end +end + +function ENT:StartTouch(ent) + if ent:IsPlayer() then + end +end + +function ENT:UpdateTransmitState() + return TRANSMIT_ALWAYS +end + +function ENT:Use(activator, caller, usetype) + +end + +function ENT:OnRemove() + +end + +local radius = 35 +local red = Color(100, 255, 0, 125) +local circlepos = Vector() +local circleup = Vector(0,0,40) +local msin = math.sin +local mabs = math.abs +function ENT:DrawTranslucent() + self:SetRenderBounds(minb, maxb) + render.SetColorMaterial() + for i=0, 16 do + local angle = i * math.pi*2 / 16 + self.offset + circlepos:SetUnpacked(math.cos(angle)*radius, math.sin(angle)*radius, 0) + local newpos = self:GetPos()+circlepos + render.DrawBeam(newpos, newpos+circleup, 4, 0, 1, red, true) + end + local bmin, bmax = self:GetRenderBounds() + self.offset = self.offset + (0.00075) + if self.offset >= 180 then + self.offset = 0 + end + -- render.DrawWireframeBox(self:GetPos(), angle_zero, bmin, bmax) +end + + +function ENT:Draw() + +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_ladder/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_ladder/shared.lua new file mode 100644 index 0000000..3395132 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_ladder/shared.lua @@ -0,0 +1,238 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Ladder" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_OPAQUE + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/props_c17/metalladder002.mdl" +ENT.ModelEnd = "models/props_c17/metalladder002b.mdl" + +ENT.NoClimbing = true + +function ENT:SetupDataTables() + self:NetworkVar( "Float", 0, "LadderHeight" ) +end + +function LadderSpawnDebug() + local p=Entity(1):GetEyeTrace() + a=ents.Create('br_ladder') + a:SetAngles(p.HitNormal:Angle()) + a:SetPos(p.HitPos+p.HitNormal*10) + a:Spawn() + sk=util.QuickTrace(p.HitPos,Vector(0,0,100000)).HitPos-p.HitNormal*10 + a:LadderHeightExact(util.QuickTrace(sk, Vector(0,0,-100000)).HitPos:Distance(a:GetPos())-62) +end + +function ENT:LadderHeight(mul) + local height = 125*mul + self:SetLadderHeight(height-(75)) + local mins, maxs = Vector(5,-14,0), Vector(14, 14,height) + self:SetCollisionBounds(mins,maxs) + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) +end + +function ENT:LadderHeightExact(height) + self:SetLadderHeight(height) + height = height + 75 + local mins, maxs = Vector(5,-14,0), Vector(14, 14,height) + self:SetCollisionBounds(mins,maxs) + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) +end + +function ENT:Initialize() + local height = 125 + if SERVER then + self:SetLadderHeight(height-(75)) + end + + self:SetModel(self.Model) + local ang = self:GetAngles() + local mins, maxs = Vector(5,-14,0), Vector(14, 14,height) + self:SetCollisionBounds(mins,maxs) + self:SetAngles(ang) + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + + if CLIENT then + self:SetRenderBounds(mins,maxs) + self.CLModel = ClientsideModel(self.Model) + self.CLModel:SetPos(self:GetPos()) + self.CLModel:SetAngles(self:GetAngles()) + + self.CLModelEnd = ClientsideModel(self.ModelEnd) + self.CLModelEnd:SetPos(self:GetPos()) + self.CLModelEnd:SetAngles(self:GetAngles()) + + local scale = Vector(1,0.85,1) + local mat = Matrix() + mat:Scale(scale) + self.CLModel:EnableMatrix("RenderMultiply", mat) + self.CLModelEnd:EnableMatrix("RenderMultiply", mat) + + self.CLModel:SetMaterial("medge/plain/redbrickvertex") + self.CLModelEnd:SetMaterial("medge/plain/redbrickvertex") + end + + self:SetPos(self:GetPos()-self:GetAngles():Forward()*10) +end + +function ENT:UpdateTransmitState() + return TRANSMIT_PVS +end + +function ENT:OnRemove() + if IsValid(self.CLModel) then + self.CLModel:Remove() + end + + if IsValid(self.CLModelEnd) then + self.CLModelEnd:Remove() + end +end + +function ENT:DrawTranslucent() +end + +function ENT:Think() + if SERVER then + local ang = self:GetAngles() + if ang[1] != 0 or ang[3] != 0 then + ang.x = 0 + ang.z = 0 + self:SetAngles(ang) + end + self:NextThink(CurTime()+1) + return true + end + + if ( CLIENT ) then + local physobj = self:GetPhysicsObject() + + if !IsValid(self.CLModel) then + self.CLModel = ClientsideModel(self.Model) + self.CLModel:SetPos(self:GetPos()) + self.CLModel:SetAngles(self:GetAngles()) + end + + if !IsValid(self.CLModelEnd) then + + self.CLModelEnd = ClientsideModel(self.ModelEnd) + self.CLModelEnd:SetPos(self:GetPos()) + self.CLModelEnd:SetAngles(self:GetAngles()) + + + local scale = Vector(1,0.85,1) + local mat = Matrix() + mat:Scale(scale) + self.CLModel:EnableMatrix("RenderMultiply", mat) + self.CLModelEnd:EnableMatrix("RenderMultiply", mat) + + self.CLModel:SetMaterial("medge/plain/redbrickvertex") + self.CLModelEnd:SetMaterial("medge/plain/redbrickvertex") + end + + if ( IsValid( physobj ) ) then + physobj:SetPos( self:GetPos() ) + physobj:SetAngles( self:GetAngles() ) + self.CLModel:SetPos( self:GetPos() ) + self.CLModel:SetAngles( self:GetAngles() ) + self.CLModelEnd:SetPos( self:GetPos() ) + self.CLModelEnd:SetAngles( self:GetAngles() ) + local mins, maxs = physobj:GetAABB() + local cmins, cmaxs = self:GetCollisionBounds() + if maxs.z != cmaxs.z then + self:PhysicsInitBox(cmins,cmaxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + end + else + local cmins, cmaxs = self:GetCollisionBounds() + self:PhysicsInitBox(cmins,cmaxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(SOLID_VPHYSICS) + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + end + end +end + +function ENT:Draw() + local pos = self:GetPos() + local ang = self:GetAngles() + local oldz = pos.z + local mins, maxs = self:GetCollisionBounds() + maxs.z = self:GetLadderHeight()+75 + local num = maxs.z/125 + local numc = math.floor(num) + local extra = num-numc + if !IsValid(self.CLModel) then + self:SetRenderBounds(mins,maxs) + self.CLModel = ClientsideModel(self.Model) + self.CLModel:SetPos(self:GetPos()) + self.CLModel:SetAngles(self:GetAngles()) + end + + if !IsValid(self.CLModelEnd) then + + self.CLModelEnd = ClientsideModel(self.ModelEnd) + self.CLModelEnd:SetPos(self:GetPos()) + self.CLModelEnd:SetAngles(self:GetAngles()) + + + local scale = Vector(1,0.85,1) + local mat = Matrix() + mat:Scale(scale) + self.CLModel:EnableMatrix("RenderMultiply", mat) + self.CLModelEnd:EnableMatrix("RenderMultiply", mat) + + self.CLModel:SetMaterial("medge/plain/redbrickvertex") + self.CLModelEnd:SetMaterial("medge/plain/redbrickvertex") + end + + self:SetRenderBounds(mins,maxs) + for i=0, numc do + if num == 1 then + self.CLModel:DrawModel() + break + end + if i==numc then + if i>0 then + pos.z = pos.z+(125*extra) + end + self.CLModel:SetPos(pos) + self.CLModel:SetupBones() + self.CLModel:DrawModel() + else + pos.z = oldz+(125*i) + self.CLModel:SetPos(pos) + self.CLModel:SetupBones() + self.CLModel:DrawModel() + end + end + + pos.z = pos.z + 112 + self.CLModelEnd:SetPos(pos) + self.CLModelEnd:SetupBones() + self.CLModelEnd:DrawModel() +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_laser/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_laser/shared.lua new file mode 100644 index 0000000..8b1a86c --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_laser/shared.lua @@ -0,0 +1,112 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Laser Hazard" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_BOTH + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/maxofs2d/button_02.mdl" + + +ENT.NoClimbing = true +ENT.LaserLength = 100000 + +if CLIENT then + language.Add( "br_laser", "Laser Hazard" ) +end + +function ENT:SetupDataTables() + self:NetworkVar( "Vector", 1, "EndPos" ) +end + +local spawntr = {} +local spawntrout = {} +function ENT:Initialize() + local entstable = player.GetAll() + local ang = self:GetAngles() + entstable[#entstable+1] = self + self:SetEndPos(util.QuickTrace(self:GetPos(), ang:Up()*self.LaserLength, entstable).HitPos) + self:SetModel(self.Model) + local mins, maxs = Vector(0,-1,-1), Vector(0, 1, self:GetPos():Distance(self:GetEndPos())) + if SERVER then + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self:GetPhysicsObject():EnableMotion(false) + end + self.NoPlayerCollisions=true + self:EnableCustomCollisions(true) + + if CLIENT then + self:SetRenderBounds(mins,maxs) + self:SetCollisionBounds(mins,maxs) + end +end + +function ENT:OnRemove() + +end + +function ENT:BRCollisionFunc(ent) + if CLIENT then return false end + if ent:Health() <= 0 or (ent:IsPlayer() and ent:HasGodMode()) then return false end + local ang = self:GetAngles() + if util.QuickTrace(self:GetPos(), ang:Up()*self.LaserLength, self).Entity != ent then return false end + local dmginfo = DamageInfo() + dmginfo:SetAttacker(self) + dmginfo:SetDamage(100) + dmginfo:SetDamageType(DMG_DISSOLVE) + ent:TakeDamageInfo(dmginfo) + ent:EmitSound("bigspark"..math.random(1,2)..".wav") + return false +end + +function ENT:Think() + if CLIENT then return end + local entstable = player.GetAll() + local ang = self:GetAngles() + entstable[#entstable+1] = self + local tr = util.QuickTrace(self:GetPos(), ang:Up()*self.LaserLength, entstable) + local trpos = tr.HitPos + if trpos != self:GetEndPos() then + local mins, maxs = Vector(0,-1,-1), Vector(0, 1, self:GetPos():Distance(trpos)) + self:SetEndPos(trpos) + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self.NoPlayerCollisions=true + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + end + self:NextThink(CurTime()+5) + return true +end + +function ENT:UpdateTransmitState() + return TRANSMIT_ALWAYS +end + +local ropemat = Material("cable/physbeam") +local color_red = Color(255,0,0) +function ENT:Draw() + local mins, maxs = self:GetCollisionBounds() + self:SetRenderBounds(mins,maxs) + self:DrawModel() +end + +function ENT:DrawTranslucent() + render.SetMaterial(ropemat) + render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_white) +end + +function ENT:DrawLOC() + local mins, maxs = self:GetCollisionBounds() + self:SetRenderBounds(mins,maxs) + render.SetMaterial(ropemat) + render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_red) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_mat/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_mat/shared.lua new file mode 100644 index 0000000..930a510 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_mat/shared.lua @@ -0,0 +1,31 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Mat" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_OPAQUE + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/mechanics/robotics/stand.mdl" + +function ENT:SetupDataTables() + +end + +function ENT:Initialize() + self:SetModel(self.Model) + self:SetMoveType( MOVETYPE_VPHYSICS ) + self:SetSolid( SOLID_VPHYSICS ) + self:PhysicsInit(SOLID_VPHYSICS) + self:GetPhysicsObject():EnableMotion(false) +end + +function ENT:Draw() + self:DrawModel() +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_rabbitfrog/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_rabbitfrog/shared.lua new file mode 100644 index 0000000..e65cdec --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_rabbitfrog/shared.lua @@ -0,0 +1,251 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Rabbitfrog" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_OPAQUE + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/nt/props_vehicles/rabbitfrog_dynamic.mdl" +ENT.AutomaticFrameAdvance = true + +function ENT:SetupDataTables() + self:NetworkVar( "Entity", 0, "Passenger1" ) + self:NetworkVar( "Entity", 1, "Passenger2" ) + self:NetworkVar( "Entity", 2, "Passenger3" ) + self:NetworkVar( "Entity", 3, "Passenger4" ) + + self:NetworkVar( "Vector", 0, "DestinationPos" ) + self:NetworkVar( "Angle", 1, "DestinationAngle" ) +end + +local mins, maxs = Vector(-64, -64, 0), Vector(64, 64, 154) +function ENT:Initialize() + self:SetModel(self.Model) + -- self:SetMoveType(MOVETYPE_NONE) + -- self:SetSolid(SOLID_BBOX) + -- self:SetCollisionBounds(mins, maxs) + if SERVER then self:PhysicsInit(SOLID_VPHYSICS) end + self:SetMoveType(MOVETYPE_VPHYSICS) + self:ResetSequence(1) + if SERVER then self:SetUseType( SIMPLE_USE ) end +end + + +function ENT:OnRemove() + +end + +function ENT:UpdateTransmitState() + return TRANSMIT_ALWAYS +end + +function ENT:Think() + self:NextThink( CurTime() ) + return true +end + + +local blur = Material("pp/blurscreen") +local function draw_blur( a, d ) + + surface.SetDrawColor( 255, 255, 255 ) + surface.SetMaterial( blur ) + for i = 1, d do + + blur:SetFloat( "$blur", (i / d ) * ( a ) ) + blur:Recompute() + render.UpdateScreenEffectTexture() + surface.DrawTexturedRect( 0, 0, ScrW(), ScrH() ) + + end + +end +local blurint = 4 +local rabbitpos, rabbitang = Vector(), Angle() +local landseq = {[1]=true,[4]=true} +local initseq = 1 + + +local offset = Vector(-30,5,0) +local offsetdraw = Vector(0,70,0) +local angoffset = Angle(0,90,90) + +local lastpos = Vector() +local lastang = Angle() +local endlerp = 0 +local endlerppos = Vector() +local neweye = false + +local fx = false +local diff = 1 + +local function IsLanding(ent) + return landseq[ent:GetSequence()] or false +end + +local introalpha = 255 +local function LandingHUDPaint() + introalpha = introalpha-(FrameTime()*50) + surface.SetDrawColor(0,0,0,introalpha) + surface.DrawRect(0,0,ScrW(),ScrH()) + + if introalpha <= 0 then + hook.Remove("HUDPaint", "LandingHUDPaint") + end +end + +local function LandingHUDIntro() + introalpha = 255 + hook.Add("HUDPaint", "LandingHUDPaint", LandingHUDPaint) +end + +local function LandingIntro() + fx = false + neweye = false + endlerp = 0 + + surface.PlaySound("hopperland.mp3") + LandingHUDIntro() +end + + +function ENT:Draw() + -- Reset everything to known good + render.SetStencilWriteMask( 0xFF ) + render.SetStencilTestMask( 0xFF ) + render.SetStencilReferenceValue( 0 ) + -- render.SetStencilCompareFunction( STENCIL_ALWAYS ) + render.SetStencilPassOperation( STENCIL_KEEP ) + -- render.SetStencilFailOperation( STENCIL_KEEP ) + render.SetStencilZFailOperation( STENCIL_KEEP ) + render.ClearStencil() + + -- Enable stencils + render.SetStencilEnable( true ) + -- Set the reference value to 1. This is what the compare function tests against + render.SetStencilReferenceValue( 1 ) + -- Force everything to fail + render.SetStencilCompareFunction( STENCIL_NEVER ) + -- Save all the things we don't draw + render.SetStencilFailOperation( STENCIL_REPLACE ) + + -- Fail to draw our entities. + self:DrawModel() + -- Render all pixels that don't have their stencil value as 1 + render.SetStencilCompareFunction( STENCIL_EQUAL ) + -- Don't modify the stencil buffer when things fail + render.SetStencilFailOperation( STENCIL_KEEP ) + + -- Draw our big entities. They will have holes in them wherever the smaller entities were + -- for _, ent in pairs( ents.FindByClass( "sent_stencil_test_big" ) ) do + render.PushFilterMag( TEXFILTER.ANISOTROPIC ) + render.PushFilterMin( TEXFILTER.ANISOTROPIC ) + self:DrawModel() + cam.Start2D(vector_origin,angle_zero) + draw_blur(math.max(blurint*-diff,0),5) + -- DrawBokehDOF(5,0.99,8) + render.PopFilterMag() + render.PopFilterMin() + cam.End2D() + -- end + + -- Let everything render normally again + render.SetStencilEnable( false ) +end + +local function RabbitCalcView(ply, origin, ang) + local rabbit = ply:GetRabbit() + if IsValid(rabbit) and rabbit:GetCycle() < 1 and IsLanding(rabbit) then + if rabbit:GetCycle() < 1 then util.ScreenShake( vector_origin, 1, 100, 0.5, 0 ) end + local matrix = rabbit:GetBoneMatrix(0) + local pos = matrix:GetTranslation() + local angles = matrix:GetAngles() + local npos, nang = LocalToWorld(offset, angles, pos, angles) + angles:Sub(angoffset) + angles.x = -angles.x + angles.y = angles.y-90 + angles.z = angles.x + local oldangx = ang.x + ang.x = 0 + diff = ang:Forward():Dot(angles:Right()) + local absdiff = math.abs(diff) + ang.x = oldangx + angles.z = angles.z * absdiff + -- angles.x = angles.x * absdiff + + -- angles.x = angles.x*ang:Forward():Dot(ang:Forward()) + -- angles.z = angles.z*math.abs(ang:Forward():Dot(ang:Forward())) + + pos:Set(npos) + origin:Set(pos) + ang:Add(angles) + lastpos:Set(origin) + lastang:Set(ang) + elseif endlerp < 1 then + if !neweye then + lastang.z = 0 + ang:Set(lastang) + ply:SetEyeAngles(lastang) + neweye = true + ply:CLViewPunch(Angle(12,0,0)) + VManip:PlayAnim("vault") + end + origin:Set(LerpVector(endlerp, lastpos, origin)) + endlerp = endlerp + (FrameTime() * 4) + endlerppos:Set(origin) + end +end + +local function RabbitVM(wep, vm, oldpos, oldang, pos, ang) + local rabbit = LocalPlayer():GetRabbit() + local diffpos = pos-oldpos + local diffang = ang-oldang + if IsValid(rabbit) and rabbit:GetCycle() < 1 and IsLanding(rabbit) then + pos:Set(lastpos) + ang:Set(lastang) + + pos:Sub(diffpos) + ang:Sub(diffang) + elseif endlerp < 1 then + pos:Set(endlerppos) + end +end +-- hook.Add("CalcViewModelView", "RabbitVM", RabbitVM) + +-- hook.Add("BeatrunDrawHUD", "Rabbit", function() + -- if IsValid(rabbit) and rabbit:GetCycle() < 1 and IsLanding(rabbit) then + -- return false + -- end +-- end) + + +function ENT:Use(ply, caller, usetype, value) + if !ply:IsPlayer() then return end + print("hi") + ply:SetRabbit(self) + ply:SetRabbitSeat(1) +end + +-- hook.Add("CalcViewModelView", "RabbitVM", RabbitVM) +-- hook.Add("CalcView", "RabbitCalcView", RabbitCalcView) + + +local function RabbitPlayerMove(ply, mv, cmd) + local rabbit = ply:GetRabbit() + if IsValid(rabbit) then + local matrix = rabbit:GetBoneMatrix(0) + local pos = matrix:GetTranslation()-ply:GetViewOffset() + local angles = matrix:GetAngles() + local npos, nang = LocalToWorld(offset, angles, pos, angles) + ply:SetMoveType(MOVETYPE_NOCLIP) + mv:SetOrigin(npos) + end +end +-- hook.Add("SetupMove", "RabbitPlayerMove", RabbitPlayerMove) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_swingbar/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_swingbar/shared.lua new file mode 100644 index 0000000..0d3d3ad --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_swingbar/shared.lua @@ -0,0 +1,71 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Swingbar" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_OPAQUE + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/hunter/plates/plate2.mdl" + +ENT.NoWallrun = true +ENT.NoClimbing = true + +local red = Color(255,0,0) +local spawntr = {} +local spawntrout = {} +function ENT:Initialize() + self:DrawShadow(false) + self:SetColor(red) + self:SetModel(self.Model) + -- self:SetMoveType(MOVETYPE_NONE) + if SERVER then self:PhysicsInit(SOLID_VPHYSICS) end + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(COLLISION_GROUP_WEAPON) + self:SetCustomCollisionCheck(true) + self.NoPlayerCollisions = true + + -- local mins, maxs = self:GetCollisionBounds()*4 + -- spawntr.start = self:GetPos() + -- spawntr.endpos = spawntr.start + -- spawntr.filter = self + -- spawntr.output = spawntrout + -- spawntr.mins, spawntr.maxs = mins, maxs + -- util.TraceHull(spawntr) + + -- if spawntrout.Hit then + -- local ang = spawntrout.HitNormal:Angle() + -- ang.x = 0 + -- self:SetAngles(ang) + -- end + +end + +function ENT:CollisionFunc(ent) + -- if ent:GetPos().z+64>self:GetPos().z then + -- print("huh") + -- return true + -- else + -- return false + -- end +end + +function ENT:OnRemove() + +end + +function ENT:Think() + return true +end + +local matrix +local vecscale +function ENT:Draw() + self:DrawModel() +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_swingpipe/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_swingpipe/shared.lua new file mode 100644 index 0000000..18ee2ff --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_swingpipe/shared.lua @@ -0,0 +1,71 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Swingpipe" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_OPAQUE + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/parkoursource/pipe_standard.mdl" + +function ENT:SetupDataTables() +end + +local spawntr = {} +local spawntrout = {} +function ENT:Initialize() + self:DrawShadow(false) + self:SetModel(self.Model) + self:SetMoveType(MOVETYPE_NONE) + local mins, maxs = Vector(-15,-15,0), Vector(15, 15,180) + self:SetCollisionBounds(mins,maxs) + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self:SetCollisionGroup(COLLISION_GROUP_WEAPON) + self:EnableCustomCollisions(true) + if SERVER then + self:GetPhysicsObject():EnableMotion(false) + else + -- self:SetRenderOrigin(self:GetPos() - self:GetAngles():Forward()*15) + end + self:SetMaterial("medge/plain/redbrickvertex") + self.NoPlayerCollisions=true + + -- local mins, maxs = self:GetCollisionBounds()*4 + -- spawntr.start = self:GetPos() + -- spawntr.endpos = spawntr.start + -- spawntr.filter = self + -- spawntr.output = spawntrout + -- spawntr.mins, spawntr.maxs = mins, maxs + -- util.TraceHull(spawntr) + + -- if spawntrout.Hit then + -- local ang = spawntrout.HitNormal:Angle() + -- ang.x = 0 + -- self:SetAngles(ang) + -- end + +end + + +function ENT:OnRemove() + +end + + +function ENT:Think() +end + +local matrix +local vecscale +function ENT:Draw() + self:DrawModel() + -- local mins, maxs = self:GetCollisionBounds() + -- render.DrawWireframeBox(self:GetPos(), self:GetAngles(), mins, maxs) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_swingrope/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_swingrope/shared.lua new file mode 100644 index 0000000..1819c7f --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_swingrope/shared.lua @@ -0,0 +1,93 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Swingrope" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_OPAQUE + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/parkoursource/pipe_standard.mdl" + + +ENT.NoClimbing = true +ENT.NoWallrun = true + +function ENT:SetupDataTables() + self:NetworkVar( "Vector", 0, "StartPos" ) + self:NetworkVar( "Vector", 1, "EndPos" ) +end + +local spawntr = {} +local spawntrout = {} +function ENT:Initialize() + self:SetPos(self:GetStartPos()) + self:SetModel(self.Model) + local ang = (self:GetEndPos()-self:GetStartPos()):Angle() + local mins, maxs = Vector(-8,-8,0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + self:SetAngles(ang) + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self.NoPlayerCollisions=true + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + + if CLIENT then + self:SetRenderBounds(mins,maxs) + end +end + +function ENT:OnRemove() + +end + + +function ENT:Think() + if self:GetPos() != self:GetStartPos() then + self:SetStartPos(self:GetPos()) + local ang = (self:GetEndPos()-self:GetStartPos()):Angle() + local mins, maxs = Vector(-8,-8,0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + self:SetAngles(ang) + if CLIENT then + self:SetRenderAngles(ang) + end + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self.NoPlayerCollisions=true + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + end + self:NextThink(CurTime()+5) + return true +end + +function ENT:UpdateTransmitState() + return TRANSMIT_ALWAYS +end + +local ropemat = Material("cable/cable2") +local color_red = Color(255,0,0) +function ENT:Draw() + if LocalPlayer():GetGrappling() then + local grapplepos = LocalPlayer():GetGrapplePos() + if grapplepos == self:GetStartPos() or grapplepos == self:GetEndPos() then + return + end + end + local mins, maxs = self:GetCollisionBounds() + self:SetRenderBounds(mins,maxs) + render.SetMaterial(ropemat) + render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_white) +end + +function ENT:DrawLOC() + local mins, maxs = self:GetCollisionBounds() + self:SetRenderBounds(mins,maxs) + render.SetMaterial(ropemat) + render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_red) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/br_zipline/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/br_zipline/shared.lua new file mode 100644 index 0000000..5bc8596 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/br_zipline/shared.lua @@ -0,0 +1,87 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Zipline" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_OPAQUE + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/parkoursource/pipe_standard.mdl" + + +ENT.NoClimbing = true + +function ENT:SetupDataTables() + self:NetworkVar( "Vector", 0, "StartPos" ) + self:NetworkVar( "Vector", 1, "EndPos" ) + self:NetworkVar( "Bool", 0, "TwoWay" ) +end + +local spawntr = {} +local spawntrout = {} +function ENT:Initialize() + self:SetPos(self:GetStartPos()) + self:SetModel(self.Model) + local ang = (self:GetEndPos()-self:GetStartPos()):Angle() + local mins, maxs = Vector(-8,-8,0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + self:SetAngles(ang) + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self.NoPlayerCollisions=true + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + + if CLIENT then + self:SetRenderBounds(mins,maxs) + end +end + +function ENT:OnRemove() + +end + + +function ENT:Think() + if self:GetPos() != self:GetStartPos() then + self:SetStartPos(self:GetPos()) + local ang = (self:GetEndPos()-self:GetStartPos()):Angle() + local mins, maxs = Vector(-8,-8,0), Vector(self:GetStartPos():Distance(self:GetEndPos()), 0, 8) + self:SetAngles(ang) + if CLIENT then + self:SetRenderAngles(ang) + end + self:PhysicsInitBox(mins,maxs) + self:SetSolid(SOLID_VPHYSICS) + self.NoPlayerCollisions=true + self:EnableCustomCollisions(true) + self:GetPhysicsObject():EnableMotion(false) + end + self:NextThink(CurTime()+5) + return true +end + +function ENT:UpdateTransmitState() + return TRANSMIT_ALWAYS +end + +local ropemat = Material("cable/cable2") +local color_red = Color(255,0,0) +function ENT:Draw() + local mins, maxs = self:GetCollisionBounds() + self:SetRenderBounds(mins,maxs) + render.SetMaterial(ropemat) + render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_white) +end + +function ENT:DrawLOC() + local mins, maxs = self:GetCollisionBounds() + self:SetRenderBounds(mins,maxs) + render.SetMaterial(ropemat) + render.DrawBeam(self:GetPos(), self:GetEndPos(), 5, 0, 1, color_red) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/tt_block/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/tt_block/shared.lua new file mode 100644 index 0000000..15fd11e --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/tt_block/shared.lua @@ -0,0 +1,66 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Block" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_OPAQUE + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/hunter/blocks/cube025x025x025.mdl" + +local mat +if CLIENT then + mat = CreateMaterial("blockmeasure", "VertexLitGeneric", {["$basetexture"]="dev/dev_measuregeneric01b", ["$basetexturetransform"]="scale 0.5 0.5"}) +end +function ENT:SetupDataTables() + +end + +function ENT:Initialize() + self:DrawShadow(false) + self:SetModel(self.Model) + self:SetMoveType(MOVETYPE_NONE) + self:SetSolid(SOLID_BBOX) + self:SetCollisionBounds(Vector(-75, -75, 0), Vector(75, 75, 100)) + self:AddSolidFlags(FSOLID_CUSTOMRAYTEST) +end + + +function ENT:OnRemove() + +end + +function ENT:DrawTranslucent() +end + +function ENT:Think() + if SERVER then + local mins, maxs = self:GetCollisionBounds() + mins:Rotate(self:GetAngles()) + maxs:Rotate(self:GetAngles()) + self:SetCollisionBounds(mins, maxs) + self:NextThink(CurTime()+1) + return true + end +end + +local matrix +local vecscale +function ENT:Draw() + local mins, maxs = self:GetCollisionBounds() + matrix = matrix or Matrix() + vecscale = vecscale or Vector() + vecscale:SetUnpacked(maxs.x*0.025, maxs.y*0.025, 0) + matrix:SetScale(vecscale) + mat:SetMatrix("$basetexturetransform",matrix) + self:SetRenderBounds(mins, maxs) + render.SetColorModulation(1,1,1) + render.SetMaterial(mat) + render.DrawBox(self:GetPos(), self:GetAngles(), mins, maxs, color_white) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/entities/tt_cp/shared.lua b/beatrun/gamemodes/beatrun/entities/entities/tt_cp/shared.lua new file mode 100644 index 0000000..ead64ae --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/entities/tt_cp/shared.lua @@ -0,0 +1,122 @@ +ENT.Type = "anim" +ENT.Base = "base_entity" +ENT.PrintName = "Checkpoint" +ENT.Author = "" +ENT.Information = "" + +ENT.Spawnable = true + +ENT.RenderGroup = RENDERGROUP_TRANSLUCENT + +ENT.Category = "Beatrun" + +AddCSLuaFile() + +ENT.Model = "models/hunter/blocks/cube025x025x025.mdl" + +ENT.IsFinish = false + +function ENT:SetupDataTables() + + self:NetworkVar( "Int", 0, "CPNum" ) + +end + +local minb, maxb = Vector(-75, -75, 0), Vector(75, 75, 10000) +function ENT:Initialize() + self:SetModel(self.Model) + self:DrawShadow(false) + self:SetMoveType(MOVETYPE_NONE) + self:SetSolid(SOLID_BBOX) + self:SetCollisionGroup(COLLISION_GROUP_IN_VEHICLE) + self:SetCollisionBounds(minb, maxb) + if CLIENT then + self:SetRenderBounds(minb, maxb) + self.offset = 0 + else + self:SetTrigger(true) + end + + self:SetPos(self:GetPos() + Vector(-0, -0, 0)) +end + +local screencolor = Color(64, 0, 0, 64) +function ENT:StartTouch(ent) + if ent:IsPlayer() and Course_Name != "" and !ent.BuildMode and ent:GetNW2Int("CPNum", 1) == self:GetCPNum() then + ent:SetNW2Int("CPNum", ent:GetNW2Int("CPNum", 1) + 1) + if ent:GetNW2Int("CPNum", 1) > table.Count(Checkpoints) then + ReplayStop(ent) + FinishCourse(ent) + else + ent.CPSavePos = ent:GetPos() + ent.CPSaveAng = ent:EyeAngles() + ent.CPSaveVel = ent:GetVelocity() + ent:SaveParkourState() + net.Start("Checkpoint_Hit") + net.WriteUInt(ent:GetNW2Int("CPNum", 1), 8) + net.Send(ent) + end + ent:ScreenFade(SCREENFADE.IN, screencolor, 0.25, 0) + end +end + +function ENT:UpdateTransmitState() + return TRANSMIT_ALWAYS +end + +function ENT:Use(activator, caller, usetype) + +end + +function ENT:OnRemove() + +end + +local radius = 75 +local red = Color(255, 0, 0, 200) +local circlepos = Vector() +local circleup = Vector(0,0,10000) +function ENT:DrawTranslucent() + self:SetRenderBounds(minb, maxb) + if (!BuildMode and CheckpointNumber != self:GetCPNum()) and !LocalPlayer().InReplay then return end + render.SetColorMaterial() + red.a = math.Clamp(LocalPlayer():GetPos():Distance(self:GetPos()) * 0.2, 25, 200) + for i=0, 16 do + local angle = i * math.pi*2 / 16 + self.offset + circlepos:SetUnpacked(math.cos(angle)*radius, math.sin(angle)*radius, 0) + local newpos = self:GetPos()+circlepos + render.DrawBeam(newpos, newpos+circleup, 8, 0, 1, red, true) + end + -- local bmin, bmax = self:GetRenderBounds() + -- render.DrawWireframeBox(self:GetPos(), angle_zero, bmin, bmax) + self.offset = self.offset + (0.00075) + if self.offset >= 180 then + self.offset = 0 + end +end + + +function ENT:Draw() + +end + +local circlesprite = Material("circle.png","nocull") +function ENT:DrawLOC() + if (!BuildMode and CheckpointNumber != self:GetCPNum()) and !LocalPlayer().InReplay then return end + render.SetMaterial(circlesprite) + red.a = math.Clamp(LocalPlayer():GetPos():Distance(self:GetPos()) * 0.2, 25, 200) + local f = LocalPlayer():EyeAngles():Forward() + for i=0, 16 do + local angle = i * math.pi*2 / 16 + self.offset + circlepos:SetUnpacked(math.cos(angle)*radius, math.sin(angle)*radius, 0) + local newpos = self:GetPos()+circlepos + -- render.DrawLine(newpos, newpos+VectorRand()*5, red) + render.DrawQuadEasy(newpos,f,6,6,red) + end + -- local bmin, bmax = self:GetRenderBounds() + -- render.DrawWireframeBox(self:GetPos(), angle_zero, bmin, bmax) + self.offset = self.offset + (0.00075) + if self.offset >= 180 then + self.offset = 0 + end +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/weapons/aewep_357.lua b/beatrun/gamemodes/beatrun/entities/weapons/aewep_357.lua new file mode 100644 index 0000000..d85da93 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/weapons/aewep_357.lua @@ -0,0 +1,380 @@ +SWEP.ViewModel = "models/weapons/c_357.mdl" +SWEP.WorldModel = "models/weapons/w_357.mdl" + +SWEP.Weight = 5 +SWEP.AutoSwitchTo = false +SWEP.AutoSwitchFrom = false + +SWEP.Slot = 1 +SWEP.SlotPos = 2 +SWEP.DrawAmmo = true +SWEP.DrawCrosshair = true + +SWEP.Primary.ClipSize = 6 +SWEP.Primary.DefaultClip = 0 +SWEP.Primary.Automatic = false +SWEP.Primary.Ammo = "357" + +SWEP.UseHands = true + +SWEP.Secondary.ClipSize = -1 +SWEP.Secondary.DefaultClip = -1 +SWEP.Secondary.Automatic = false +SWEP.Secondary.Ammo = "none" + +SWEP.Spawnable = true +SWEP.BobScale = 0 +SWEP.SwayScale = 0 +SWEP.ViewModelFOV = 70 + +SWEP.PrintName = "357" -- This will be shown in the spawn menu, and in the weapon selection menu +SWEP.Author = "datae" -- These two options will be shown when you have the weapon highlighted in the weapon selection menu +SWEP.Instructions = "" + +SWEP.BulletData = {} +SWEP.Damage = 150 +SWEP.Force = 1 +SWEP.Distance = 56756 + +SWEP.ReloadTime = 0 + +SWEP.VMPos = Vector() +SWEP.VMAng = Angle() +SWEP.VMPosOffset = Vector() +SWEP.VMAngOffset = Angle() + +SWEP.VMPosOffset_Lerp = Vector() +SWEP.VMAngOffset_Lerp = Angle() + +SWEP.VMLookLerp = Angle() + +SWEP.StepBob = 0 +SWEP.StepBobLerp = 0 +SWEP.StepRandomX = 1 +SWEP.StepRandomY = 1 +SWEP.LastEyeAng = Angle() +SWEP.SmoothEyeAng = Angle() + +SWEP.LastVelocity = Vector() +SWEP.Velocity_Lerp = Vector() +SWEP.VelocityLastDiff = 0 + +SWEP.Breath_Intensity = 1 +SWEP.Breath_Rate = 1 + +-- SWEP.OffsetPos = Vector(10,-10,0) --NT +SWEP.OffsetPos = Vector(0,0,-2) +SWEP.OffsetAng = Angle() + +local coolswayCT = 0 +local function LerpC(t,a,b,powa) + +return a + (b - a) * math.pow(t,powa) + +end + +function SWEP:Move_Process(EyePos, EyeAng, velocity) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + local FT = FrameTime() + local sightedmult = 1 + + VMPos:Set(vector_origin) + VMAng:Set(angle_zero) + + VMPosOffset.x = self:GetOwner():GetVelocity().z*0.0015 * sightedmult + VMPosOffset.y = math.Clamp(velocity.y*-0.004, -1, 1) * sightedmult + + VMPosOffset_Lerp.x = Lerp(8*FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(8*FT, VMPosOffset_Lerp.y, VMPosOffset.y) + + VMAngOffset.x = math.Clamp(VMPosOffset.x * 8, -4, 4) + VMAngOffset.y = VMPosOffset.y * 5 + VMAngOffset.z = VMPosOffset.y * 0.5 + (VMPosOffset.x * -5) + + VMAngOffset_Lerp.x = LerpC(10*FT, VMAngOffset_Lerp.x, VMAngOffset.x, 0.75) + VMAngOffset_Lerp.y = LerpC(5*FT, VMAngOffset_Lerp.y, VMAngOffset.y, 0.6) + VMAngOffset_Lerp.z = Lerp(25*FT, VMAngOffset_Lerp.z, VMAngOffset.z) + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + + VMAng:Add(VMAngOffset_Lerp) + +end + +local stepend = math.pi*4 +function SWEP:Step_Process(EyePos,EyeAng, velocity) + local CT = CurTime() + if CT > coolswayCT then + coolswayCT = CT + else + return + end + + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + velocity = math.min(velocity:Length(), 500) + + local delta = math.abs(self.StepBob*2/(stepend)-1) + local FT = FrameTime() + local FTMult = 300 * FT + local sightedmult = 1 + local sprintmult = 1 + local onground = self:GetOwner():OnGround() + self.StepBob = self.StepBob + (velocity * 0.00015 + (math.pow(delta, 0.01)*0.03)) * (FTMult) + + if self.StepBob >= stepend then + self.StepBob = 0 + self.StepRandomX = math.Rand(1,1.5) + self.StepRandomY = math.Rand(1,1.5) + end + + if velocity == 0 then + self.StepBob = 0 + end + + if onground then + VMPosOffset.x = (math.sin(self.StepBob) * velocity * 0.000375 * sightedmult) * self.StepRandomX + VMPosOffset.y = (math.sin(self.StepBob * 0.5) * velocity * 0.0005 * sightedmult) * self.StepRandomY + VMPosOffset.z = math.sin(self.StepBob * 0.75) * velocity * 0.002 * sightedmult + end + + VMPosOffset_Lerp.x = Lerp(16*FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(4*FT, VMPosOffset_Lerp.y, VMPosOffset.y) + VMPosOffset_Lerp.z = Lerp(2*FT, VMPosOffset_Lerp.z, VMPosOffset.z) + + VMAngOffset.x = VMPosOffset_Lerp.x * 2 + VMAngOffset.y = VMPosOffset_Lerp.y * -7.5 + VMAngOffset.z = VMPosOffset_Lerp.y * 5 + + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + VMPos:Add(VMAng:Forward() * VMPosOffset_Lerp.z) + + VMAng:Add(VMAngOffset) +end + +function SWEP:Breath_Health() + local owner = self:GetOwner() + if !IsValid(owner) then return end + local health = owner:Health() + local maxhealth = owner:GetMaxHealth() + + self.Breath_Intensity = math.Clamp( maxhealth / health, 0, 2 ) + self.Breath_Rate = math.Clamp( ((maxhealth*0.5) / health ), 1, 1.5 ) +end + +function SWEP:Breath_StateMult() + local owner = self:GetOwner() + if !IsValid(owner) then return end + local sightedmult = 1 + + self.Breath_Intensity = self.Breath_Intensity * sightedmult +end + +function SWEP:Breath_Process(EyePos, EyeAng) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + + self:Breath_Health() + self:Breath_StateMult() + VMPosOffset.x = (math.sin(CurTime() * 2 * self.Breath_Rate) * 0.1) * self.Breath_Intensity + VMPosOffset.y = (math.sin(CurTime() * 2.5 * self.Breath_Rate) * 0.025) * self.Breath_Intensity + + VMAngOffset.x = VMPosOffset.x * 1.5 + VMAngOffset.y = VMPosOffset.y * 2 + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + + VMAng:Add(VMAngOffset) + +end + +function SWEP:Look_Process(EyePos, EyeAng) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local FT = FrameTime() + local sightedmult = 1 + self.SmoothEyeAng = LerpAngle(0.05, self.SmoothEyeAng, EyeAng-self.LastEyeAng) + + VMPosOffset.x = -self.SmoothEyeAng.x * -1 * sightedmult + VMPosOffset.y = self.SmoothEyeAng.y * 0.5 * sightedmult + + VMAngOffset.x = VMPosOffset.x * 2.5 + VMAngOffset.y = VMPosOffset.y * 1.25 + VMAngOffset.z = VMPosOffset.y * 2 + + self.VMLookLerp.y = Lerp(FT*10, self.VMLookLerp.y, VMAngOffset.y * 1.5 + self.SmoothEyeAng.y) + + VMAng.y = VMAng.y - self.VMLookLerp.y + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + + VMAng:Add(VMAngOffset) + +end + +function SWEP:GetVMPosition(EyePos, EyeAng) + return self.VMPos, self.VMAng +end + +function SWEP:GetViewModelPosition(eyepos, eyeang) + return self:GetVMPosition(eyepos, eyeang) +end + + +function SWEP:Deploy() + self:SendWeaponAnim(ACT_VM_DRAW) + self:SetNextPrimaryFire(CurTime()+0.5) + self:SetHoldType( "revolver" ) + + if CLIENT then + self.CLVM = ClientsideModel(self.ViewModel) + self:SetNoDraw(true) + end +end + +function SWEP:Holster() + if IsValid(self.CLVM) then + self.CLVM:Remove() + end + return true +end + +function SWEP:OnRemove() + if IsValid(self.CLVM) then + self.CLVM:Remove() + end +end + +function SWEP:GenerateBullet() + local tbl = self.BulletData + tbl.Attacker = self.Owner + tbl.Damage = self.Damage + tbl.Force = self.Force + tbl.Distance = self.Distance + tbl.Num = 1 + tbl.Spread = vector_origin + + tbl.Src = self.Owner:GetShootPos() + tbl.Dir = self.Owner:EyeAngles():Forward() + return tbl +end + +function SWEP:MuzzleFlash() + local vPoint = self.Owner:EyePos()+self.Owner:EyeAngles():Forward()*10 + local ed = EffectData() + ed:SetOrigin( vPoint ) + ed:SetScale(1) + ed:SetEntity(self) +end + +function SWEP:DryFire() + self:EmitSound("weapons/pistol/pistol_empty.wav") +end + +function SWEP:Reload() + if self:Clip1() >= self:GetMaxClip1() or self.Owner:GetAmmoCount( self.Primary.Ammo ) <= 0 then return end + if self.ReloadTime and CurTime() <= self.ReloadTime then return end + self:DefaultReload( ACT_VM_RELOAD ) + local AnimationTime = self.Owner:GetViewModel():SequenceDuration() + self.ReloadTime = CurTime() + AnimationTime + self:SetNextPrimaryFire(CurTime() + AnimationTime) + self:SetNextSecondaryFire(CurTime() + AnimationTime) + self:EmitSound("Weapon_357.Reload") +end + +function SWEP:Think() + if self.ReloadTime and CurTime() > self.ReloadTime then + self:SendWeaponAnim(ACT_VM_IDLE) + self.ReloadTime = nil + end +end + +function SWEP:PostDrawViewModel(vm, wep, ply) + local EyePos, EyeAng = EyePos(), EyeAngles() + local velocity = self:GetOwner():GetVelocity() + velocity = WorldToLocal(velocity, angle_zero, vector_origin, EyeAng) + self:Move_Process(EyePos, EyeAng, velocity) + self:Step_Process(EyePos, EyeAng, velocity) + self:Breath_Process(EyePos, EyeAng) + self:Look_Process(EyePos, EyeAng) + + self.LastEyeAng = EyeAng + self.LastEyePos = EyePos + self.LastVelocity = velocity + + local offsetpos, offsetang = LocalToWorld(self.OffsetPos, self.OffsetAng, self.VMPos, self.VMAng) + self.VMPos:Set(offsetpos) + if CLIENT and IsValid(self.CLVM) then + cam.Start3D(vector_origin, angle_zero, self.Owner:GetFOV()*0.8) + cam.IgnoreZ(true) + self.CLVM:SetPos(self.VMPos) + self.CLVM:SetAngles(self.VMAng) + + ply:GetHands():SetParent(self.CLVM) + ply:GetHands():SetupBones() + ply:GetHands():DrawModel() + + self.CLVM:SetSequence(vm:GetSequence()) + self.CLVM:SetCycle(vm:GetCycle()) + + self.CLVM:SetupBones() + self.CLVM:DrawModel() + cam.IgnoreZ(false) + cam.End3D() + end +end + +function SWEP:PreDrawViewModel(vm, wep, ply) + -- self:PostDrawViewModel(vm, wep, ply) + return true +end + +hook.Add("PreDrawTranslucentRenderables","ae", function() + local ply = LocalPlayer() + local activewep = ply:GetActiveWeapon() + if activewep.CLVM then + activewep:PostDrawViewModel(ply:GetViewModel(), activewep, ply) + end +end) + +hook.Add("VManipVMEntity", "ae", function() + local ply = LocalPlayer() + local activewep = ply:GetActiveWeapon() + if activewep.CLVM then + return activewep.CLVM + end +end) +hook.Add("VManipLegsVMEntity", "ae", function() + local ply = LocalPlayer() + local activewep = ply:GetActiveWeapon() + if activewep.CLVM then + return activewep.CLVM + end +end) + +function SWEP:PrimaryAttack() + if self:Clip1() < 1 then + self:DryFire() + self:SetNextPrimaryFire(CurTime()+1) + return + end + self:SetClip1(self:Clip1()-1) + self.Owner:MuzzleFlash() + self:SendWeaponAnim(ACT_VM_PRIMARYATTACK) + self:SetNextPrimaryFire(CurTime()+0.65) + self:EmitSound("Weapon_357.Single") + self:FireBullets( self:GenerateBullet() ) + self.Owner:ViewPunch(Angle(-10,0,0)) + return true +end +function SWEP:SecondaryAttack() + return true +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/weapons/aewep_base.lua b/beatrun/gamemodes/beatrun/entities/weapons/aewep_base.lua new file mode 100644 index 0000000..40c41e1 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/weapons/aewep_base.lua @@ -0,0 +1,310 @@ +SWEP.ViewModel = "models/weapons/c_smg1.mdl" +SWEP.WorldModel = "models/weapons/w_357.mdl" + +SWEP.Weight = 5 +SWEP.AutoSwitchTo = false +SWEP.AutoSwitchFrom = false + +SWEP.Slot = 1 +SWEP.SlotPos = 2 +SWEP.DrawAmmo = true +SWEP.DrawCrosshair = true + +SWEP.Primary.ClipSize = 45 +SWEP.Primary.DefaultClip = 45 +SWEP.Primary.Automatic = true +SWEP.Primary.Ammo = "smg1" + +SWEP.UseHands = true + +SWEP.Secondary.ClipSize = -1 +SWEP.Secondary.DefaultClip = -1 +SWEP.Secondary.Automatic = false +SWEP.Secondary.Ammo = "none" + +SWEP.Spawnable = true +SWEP.BobScale = 0 +SWEP.SwayScale = 0 +SWEP.ViewModelFOV = 70 + +SWEP.PrintName = "AE" -- This will be shown in the spawn menu, and in the weapon selection menu +SWEP.Author = "datae" -- These two options will be shown when you have the weapon highlighted in the weapon selection menu +SWEP.Instructions = "" + +SWEP.BulletData = {} +SWEP.Damage = 15 +SWEP.Force = 1 +SWEP.Distance = 56756 + +SWEP.ReloadTime = 0 + +SWEP.VMPos = Vector() +SWEP.VMAng = Angle() +SWEP.VMPosOffset = Vector() +SWEP.VMAngOffset = Angle() + +SWEP.VMPosOffset_Lerp = Vector() +SWEP.VMAngOffset_Lerp = Angle() + +SWEP.VMLookLerp = Angle() + +SWEP.StepBob = 0 +SWEP.StepBobLerp = 0 +SWEP.StepRandomX = 1 +SWEP.StepRandomY = 1 +SWEP.LastEyeAng = Angle() +SWEP.SmoothEyeAng = Angle() + +SWEP.LastVelocity = Vector() +SWEP.Velocity_Lerp = Vector() +SWEP.VelocityLastDiff = 0 + +SWEP.Breath_Intensity = 1 +SWEP.Breath_Rate = 1 + +-- SWEP.OffsetPos = Vector(10,-10,0) --NT +SWEP.OffsetPos = Vector(0,0,-2) +SWEP.OffsetAng = Angle() + +local coolswayCT = 0 +local oldCT = 0 +local function LerpC(t,a,b,powa) + +return a + (b - a) * math.pow(t,powa) + +end + +function SWEP:Move_Process(EyePos, EyeAng, velocity) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + local FT = FrameTime() + local sightedmult = 1 + + VMPos:Set(EyePos) + VMAng:Set(EyeAng) + + VMPosOffset.x = self:GetOwner():GetVelocity().z*0.0015 * sightedmult + VMPosOffset.y = math.Clamp(velocity.y*-0.004, -1, 1) * sightedmult + + VMPosOffset_Lerp.x = Lerp(8*FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(8*FT, VMPosOffset_Lerp.y, VMPosOffset.y) + + VMAngOffset.x = math.Clamp(VMPosOffset.x * 8, -4, 4) + VMAngOffset.y = VMPosOffset.y * -1 + VMAngOffset.z = VMPosOffset.y * 0.5 + (VMPosOffset.x * -5) + + VMAngOffset_Lerp.x = LerpC(10*FT, VMAngOffset_Lerp.x, VMAngOffset.x, 0.75) + VMAngOffset_Lerp.y = LerpC(5*FT, VMAngOffset_Lerp.y, VMAngOffset.y, 0.6) + VMAngOffset_Lerp.z = Lerp(25*FT, VMAngOffset_Lerp.z, VMAngOffset.z) + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + + VMAng:Add(VMAngOffset_Lerp) + +end + +local stepend = math.pi*4 +function SWEP:Step_Process(EyePos,EyeAng, velocity) + local CT = CurTime() + if CT > coolswayCT then + coolswayCT = CT + else + return + end + + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + velocity = math.min(velocity:Length(), 500) + + local delta = math.abs(self.StepBob*2/(stepend)-1) + local FT = FrameTime() + local FTMult = 300 * FT + local sightedmult = 1 + local sprintmult = 1 + local onground = self:GetOwner():OnGround() + self.StepBob = self.StepBob + (velocity * 0.00015 + (math.pow(delta, 0.01)*0.03)) * (FTMult) + + if self.StepBob >= stepend then + self.StepBob = 0 + self.StepRandomX = math.Rand(1,1.5) + self.StepRandomY = math.Rand(1,1.5) + end + + if velocity == 0 then + self.StepBob = 0 + end + + if onground then + VMPosOffset.x = (math.sin(self.StepBob) * velocity * 0.000375 * sightedmult) * self.StepRandomX + VMPosOffset.y = (math.sin(self.StepBob * 0.5) * velocity * 0.0005 * sightedmult) * self.StepRandomY + VMPosOffset.z = math.sin(self.StepBob * 0.75) * velocity * 0.002 * sightedmult + end + + VMPosOffset_Lerp.x = Lerp(16*FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(4*FT, VMPosOffset_Lerp.y, VMPosOffset.y) + VMPosOffset_Lerp.z = Lerp(2*FT, VMPosOffset_Lerp.z, VMPosOffset.z) + + VMAngOffset.x = VMPosOffset_Lerp.x * 2 + VMAngOffset.y = VMPosOffset_Lerp.y * -7.5 + VMAngOffset.z = VMPosOffset_Lerp.y * 5 + + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + VMPos:Add(VMAng:Forward() * VMPosOffset_Lerp.z) + + VMAng:Add(VMAngOffset) +end + +function SWEP:Breath_Health() + local owner = self:GetOwner() + if !IsValid(owner) then return end + local health = owner:Health() + local maxhealth = owner:GetMaxHealth() + + self.Breath_Intensity = math.Clamp( maxhealth / health, 0, 2 ) + self.Breath_Rate = math.Clamp( ((maxhealth*0.5) / health ), 1, 1.5 ) +end + +function SWEP:Breath_StateMult() + local owner = self:GetOwner() + if !IsValid(owner) then return end + local sightedmult = 1 + + self.Breath_Intensity = self.Breath_Intensity * sightedmult +end + +function SWEP:Breath_Process(EyePos, EyeAng) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + + self:Breath_Health() + self:Breath_StateMult() + VMPosOffset.x = (math.sin(CurTime() * 2 * self.Breath_Rate) * 0.1) * self.Breath_Intensity + VMPosOffset.y = (math.sin(CurTime() * 2.5 * self.Breath_Rate) * 0.025) * self.Breath_Intensity + + VMAngOffset.x = VMPosOffset.x * 1.5 + VMAngOffset.y = VMPosOffset.y * 2 + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + + VMAng:Add(VMAngOffset) + +end + +function SWEP:Look_Process(EyePos, EyeAng) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local FT = FrameTime() + local sightedmult = 1 + self.SmoothEyeAng = LerpAngle(FT*5, self.SmoothEyeAng, EyeAng-self.LastEyeAng) + + VMPosOffset.x = -self.SmoothEyeAng.x * -1 * sightedmult + VMPosOffset.y = self.SmoothEyeAng.y * 0.5 * sightedmult + + VMAngOffset.x = VMPosOffset.x * 2.5 + VMAngOffset.y = VMPosOffset.y * 1.25 + VMAngOffset.z = VMPosOffset.y * 2 + + self.VMLookLerp.y = Lerp(FT*10, self.VMLookLerp.y, VMAngOffset.y * 1.5 + self.SmoothEyeAng.y) + + VMAng.y = VMAng.y - self.VMLookLerp.y + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + + VMAng:Add(VMAngOffset) + +end + +function SWEP:GetVMPosition(EyePos, EyeAng) + if CurTime() == oldCT then return self.VMPos, self.VMAng end + local velocity = self:GetOwner():GetVelocity() + velocity = WorldToLocal(velocity, angle_zero, vector_origin, EyeAng) + self:Move_Process(EyePos, EyeAng, velocity) + self:Step_Process(EyePos, EyeAng, velocity) + self:Breath_Process(EyePos, EyeAng) + self:Look_Process(EyePos, EyeAng) + + self.LastEyeAng = EyeAng + self.LastEyePos = EyePos + self.LastVelocity = velocity + + local offsetpos, offsetang = LocalToWorld(self.OffsetPos, self.OffsetAng, self.VMPos, self.VMAng) + self.VMPos:Set(offsetpos) + -- self.VMAng:Add(offsetang) + oldCT = CurTime() + return self.VMPos, self.VMAng +end + +function SWEP:GetViewModelPosition(eyepos, eyeang) + return self:GetVMPosition(eyepos, eyeang) +end + + +function SWEP:Deploy() + self:SendWeaponAnim(ACT_VM_DRAW) + self:SetNextPrimaryFire(CurTime()+0.5) +end + +function SWEP:GenerateBullet() + local tbl = self.BulletData + tbl.Attacker = self.Owner + tbl.Damage = self.Damage + tbl.Force = self.Force + tbl.Distance = self.Distance + tbl.Num = 1 + tbl.Spread = Vector(0.05,0.05,0) + + tbl.Src = self.Owner:GetShootPos() + tbl.Dir = self.Owner:EyeAngles():Forward() + return tbl +end + +function SWEP:MuzzleFlash() + local vPoint = self.Owner:EyePos()+self.Owner:EyeAngles():Forward()*10 + local ed = EffectData() + ed:SetOrigin( vPoint ) + ed:SetScale(1) + ed:SetEntity(self) + util.Effect( "arccw_shelleffect", ed ) +end + +function SWEP:DryFire() + self:EmitSound("weapons/pistol/pistol_empty.wav") +end + +function SWEP:Reload() + if self:Clip1() >= self:GetMaxClip1() or self.Owner:GetAmmoCount( self.Primary.Ammo ) <= 0 then return end + if self.ReloadTime and CurTime() <= self.ReloadTime then return end + self:DefaultReload( ACT_VM_RELOAD ) + local AnimationTime = self.Owner:GetViewModel():SequenceDuration() + self.ReloadTime = CurTime() + AnimationTime + self:SetNextPrimaryFire(CurTime() + AnimationTime) + self:SetNextSecondaryFire(CurTime() + AnimationTime) + self:EmitSound("weapons/smg1/smg1_reload.wav") +end + +function SWEP:PrimaryAttack() + if self:Clip1() < 1 then + self:DryFire() + self:SetNextPrimaryFire(CurTime()+0.5) + return + end + self:SetClip1(self:Clip1()-1) + self.Owner:MuzzleFlash() + self:SendWeaponAnim(ACT_VM_PRIMARYATTACK) + self:SetNextPrimaryFire(CurTime()+0.065) + self:EmitSound("weapons/smg1/smg1_fire1.wav") + self:FireBullets( self:GenerateBullet() ) + self.Owner:ViewPunch(Angle(-0.1,0,0)) + if IsFirstTimePredicted() then self:MuzzleFlash() end + return true +end +function SWEP:SecondaryAttack() + return true +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/weapons/aewep_nt.lua b/beatrun/gamemodes/beatrun/entities/weapons/aewep_nt.lua new file mode 100644 index 0000000..61a66c4 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/weapons/aewep_nt.lua @@ -0,0 +1,310 @@ +SWEP.ViewModel = "models/weapons/v_jinrai_srm_s.mdl" +SWEP.WorldModel = "models/weapons/w_357.mdl" + +SWEP.Weight = 5 +SWEP.AutoSwitchTo = false +SWEP.AutoSwitchFrom = false + +SWEP.Slot = 1 +SWEP.SlotPos = 2 +SWEP.DrawAmmo = true +SWEP.DrawCrosshair = true + +SWEP.Primary.ClipSize = 45 +SWEP.Primary.DefaultClip = 45 +SWEP.Primary.Automatic = true +SWEP.Primary.Ammo = "smg1" + +SWEP.UseHands = true + +SWEP.Secondary.ClipSize = -1 +SWEP.Secondary.DefaultClip = -1 +SWEP.Secondary.Automatic = false +SWEP.Secondary.Ammo = "none" + +SWEP.Spawnable = true +SWEP.BobScale = 0 +SWEP.SwayScale = 0 +SWEP.ViewModelFOV = 70 + +SWEP.PrintName = "AE" -- This will be shown in the spawn menu, and in the weapon selection menu +SWEP.Author = "datae" -- These two options will be shown when you have the weapon highlighted in the weapon selection menu +SWEP.Instructions = "" + +SWEP.BulletData = {} +SWEP.Damage = 15 +SWEP.Force = 1 +SWEP.Distance = 56756 + +SWEP.ReloadTime = 0 + +SWEP.VMPos = Vector() +SWEP.VMAng = Angle() +SWEP.VMPosOffset = Vector() +SWEP.VMAngOffset = Angle() + +SWEP.VMPosOffset_Lerp = Vector() +SWEP.VMAngOffset_Lerp = Angle() + +SWEP.VMLookLerp = Angle() + +SWEP.StepBob = 0 +SWEP.StepBobLerp = 0 +SWEP.StepRandomX = 1 +SWEP.StepRandomY = 1 +SWEP.LastEyeAng = Angle() +SWEP.SmoothEyeAng = Angle() + +SWEP.LastVelocity = Vector() +SWEP.Velocity_Lerp = Vector() +SWEP.VelocityLastDiff = 0 + +SWEP.Breath_Intensity = 1 +SWEP.Breath_Rate = 1 + +SWEP.OffsetPos = Vector(10,-10,0) --NT +-- SWEP.OffsetPos = Vector(0,0,-2) +SWEP.OffsetAng = Angle() + +local coolswayCT = 0 +local oldCT = 0 +local function LerpC(t,a,b,powa) + +return a + (b - a) * math.pow(t,powa) + +end + +function SWEP:Move_Process(EyePos, EyeAng, velocity) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + local FT = FrameTime() + local sightedmult = 1 + + VMPos:Set(EyePos) + VMAng:Set(EyeAng) + + VMPosOffset.x = self:GetOwner():GetVelocity().z*0.0015 * sightedmult + VMPosOffset.y = math.Clamp(velocity.y*-0.004, -1, 1) * sightedmult + + VMPosOffset_Lerp.x = Lerp(8*FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(8*FT, VMPosOffset_Lerp.y, VMPosOffset.y) + + VMAngOffset.x = math.Clamp(VMPosOffset.x * 8, -4, 4) + VMAngOffset.y = VMPosOffset.y * -1 + VMAngOffset.z = VMPosOffset.y * 0.5 + (VMPosOffset.x * -5) + + VMAngOffset_Lerp.x = LerpC(10*FT, VMAngOffset_Lerp.x, VMAngOffset.x, 0.75) + VMAngOffset_Lerp.y = LerpC(5*FT, VMAngOffset_Lerp.y, VMAngOffset.y, 0.6) + VMAngOffset_Lerp.z = Lerp(25*FT, VMAngOffset_Lerp.z, VMAngOffset.z) + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + + VMAng:Add(VMAngOffset_Lerp) + +end + +local stepend = math.pi*4 +function SWEP:Step_Process(EyePos,EyeAng, velocity) + local CT = CurTime() + if CT > coolswayCT then + coolswayCT = CT + else + return + end + + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local VMPosOffset_Lerp, VMAngOffset_Lerp = self.VMPosOffset_Lerp, self.VMAngOffset_Lerp + velocity = math.min(velocity:Length(), 500) + + local delta = math.abs(self.StepBob*2/(stepend)-1) + local FT = FrameTime() + local FTMult = 300 * FT + local sightedmult = 1 + local sprintmult = 1 + local onground = self:GetOwner():OnGround() + self.StepBob = self.StepBob + (velocity * 0.00015 + (math.pow(delta, 0.01)*0.03)) * (FTMult) + + if self.StepBob >= stepend then + self.StepBob = 0 + self.StepRandomX = math.Rand(1,1.5) + self.StepRandomY = math.Rand(1,1.5) + end + + if velocity == 0 then + self.StepBob = 0 + end + + if onground then + VMPosOffset.x = (math.sin(self.StepBob) * velocity * 0.000375 * sightedmult) * self.StepRandomX + VMPosOffset.y = (math.sin(self.StepBob * 0.5) * velocity * 0.0005 * sightedmult) * self.StepRandomY + VMPosOffset.z = math.sin(self.StepBob * 0.75) * velocity * 0.002 * sightedmult + end + + VMPosOffset_Lerp.x = Lerp(16*FT, VMPosOffset_Lerp.x, VMPosOffset.x) + VMPosOffset_Lerp.y = Lerp(4*FT, VMPosOffset_Lerp.y, VMPosOffset.y) + VMPosOffset_Lerp.z = Lerp(2*FT, VMPosOffset_Lerp.z, VMPosOffset.z) + + VMAngOffset.x = VMPosOffset_Lerp.x * 2 + VMAngOffset.y = VMPosOffset_Lerp.y * -7.5 + VMAngOffset.z = VMPosOffset_Lerp.y * 5 + + + VMPos:Add(VMAng:Up() * VMPosOffset_Lerp.x) + VMPos:Add(VMAng:Right() * VMPosOffset_Lerp.y) + VMPos:Add(VMAng:Forward() * VMPosOffset_Lerp.z) + + VMAng:Add(VMAngOffset) +end + +function SWEP:Breath_Health() + local owner = self:GetOwner() + if !IsValid(owner) then return end + local health = owner:Health() + local maxhealth = owner:GetMaxHealth() + + self.Breath_Intensity = math.Clamp( maxhealth / health, 0, 2 ) + self.Breath_Rate = math.Clamp( ((maxhealth*0.5) / health ), 1, 1.5 ) +end + +function SWEP:Breath_StateMult() + local owner = self:GetOwner() + if !IsValid(owner) then return end + local sightedmult = 1 + + self.Breath_Intensity = self.Breath_Intensity * sightedmult +end + +function SWEP:Breath_Process(EyePos, EyeAng) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + + self:Breath_Health() + self:Breath_StateMult() + VMPosOffset.x = (math.sin(CurTime() * 2 * self.Breath_Rate) * 0.1) * self.Breath_Intensity + VMPosOffset.y = (math.sin(CurTime() * 2.5 * self.Breath_Rate) * 0.025) * self.Breath_Intensity + + VMAngOffset.x = VMPosOffset.x * 1.5 + VMAngOffset.y = VMPosOffset.y * 2 + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + + VMAng:Add(VMAngOffset) + +end + +function SWEP:Look_Process(EyePos, EyeAng) + local VMPos, VMAng = self.VMPos, self.VMAng + local VMPosOffset, VMAngOffset = self.VMPosOffset, self.VMAngOffset + local FT = FrameTime() + local sightedmult = 1 + self.SmoothEyeAng = LerpAngle(FT*5, self.SmoothEyeAng, EyeAng-self.LastEyeAng) + + VMPosOffset.x = -self.SmoothEyeAng.x * -1 * sightedmult + VMPosOffset.y = self.SmoothEyeAng.y * 0.5 * sightedmult + + VMAngOffset.x = VMPosOffset.x * 2.5 + VMAngOffset.y = VMPosOffset.y * 1.25 + VMAngOffset.z = VMPosOffset.y * 2 + + self.VMLookLerp.y = Lerp(FT*10, self.VMLookLerp.y, VMAngOffset.y * 1.5 + self.SmoothEyeAng.y) + + VMAng.y = VMAng.y - self.VMLookLerp.y + + VMPos:Add(VMAng:Up() * VMPosOffset.x) + VMPos:Add(VMAng:Right() * VMPosOffset.y) + + VMAng:Add(VMAngOffset) + +end + +function SWEP:GetVMPosition(EyePos, EyeAng) + if CurTime() == oldCT then return self.VMPos, self.VMAng end + local velocity = self:GetOwner():GetVelocity() + velocity = WorldToLocal(velocity, angle_zero, vector_origin, EyeAng) + self:Move_Process(EyePos, EyeAng, velocity) + self:Step_Process(EyePos, EyeAng, velocity) + self:Breath_Process(EyePos, EyeAng) + self:Look_Process(EyePos, EyeAng) + + self.LastEyeAng = EyeAng + self.LastEyePos = EyePos + self.LastVelocity = velocity + + local offsetpos, offsetang = LocalToWorld(self.OffsetPos, self.OffsetAng, self.VMPos, self.VMAng) + self.VMPos:Set(offsetpos) + -- self.VMAng:Add(offsetang) + oldCT = CurTime() + return self.VMPos, self.VMAng +end + +function SWEP:CalcViewModelView(vm, oldeyepos, oldeyeang, eyepos, eyeang) + return self:GetVMPosition(eyepos, eyeang) +end + + +function SWEP:Deploy() + self:SendWeaponAnim(ACT_VM_DRAW) + self:SetNextPrimaryFire(CurTime()+0.5) +end + +function SWEP:GenerateBullet() + local tbl = self.BulletData + tbl.Attacker = self.Owner + tbl.Damage = self.Damage + tbl.Force = self.Force + tbl.Distance = self.Distance + tbl.Num = 1 + tbl.Spread = Vector(0.05,0.05,0) + + tbl.Src = self.Owner:GetShootPos() + tbl.Dir = self.Owner:GetEyeTrace().Normal + return tbl +end + +function SWEP:MuzzleFlash() + local vPoint = self.Owner:EyePos()+self.Owner:EyeAngles():Forward()*10 + local ed = EffectData() + ed:SetOrigin( vPoint ) + ed:SetScale(1) + ed:SetEntity(self) + util.Effect( "arccw_shelleffect", ed ) +end + +function SWEP:DryFire() + self:EmitSound("weapons/pistol/pistol_empty.wav") +end + +function SWEP:Reload() + if self:Clip1() >= self:GetMaxClip1() or self.Owner:GetAmmoCount( self.Primary.Ammo ) <= 0 then return end + if self.ReloadTime and CurTime() <= self.ReloadTime then return end + self:DefaultReload( ACT_VM_RELOAD ) + local AnimationTime = self.Owner:GetViewModel():SequenceDuration() + self.ReloadTime = CurTime() + AnimationTime + self:SetNextPrimaryFire(CurTime() + AnimationTime) + self:SetNextSecondaryFire(CurTime() + AnimationTime) + self:EmitSound("weapons/smg1/smg1_reload.wav") +end + +function SWEP:PrimaryAttack() + if self:Clip1() < 1 then + self:DryFire() + self:SetNextPrimaryFire(CurTime()+0.5) + return + end + self:SetClip1(self:Clip1()-1) + self.Owner:MuzzleFlash() + self:SendWeaponAnim(ACT_VM_PRIMARYATTACK) + self:SetNextPrimaryFire(CurTime()+0.065) + self:EmitSound("weapons/smg1/smg1_fire1.wav") + self:FireBullets( self:GenerateBullet() ) + self.Owner:ViewPunch(Angle(-0.1,0,0)) + if IsFirstTimePredicted() then self:MuzzleFlash() end + return true +end +function SWEP:SecondaryAttack() + return true +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/weapons/runnerhands/shared.lua b/beatrun/gamemodes/beatrun/entities/weapons/runnerhands/shared.lua new file mode 100644 index 0000000..400804a --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/weapons/runnerhands/shared.lua @@ -0,0 +1,440 @@ +local cvarwindsound +local minimalvm +if CLIENT then + minimalvm = CreateClientConVar("Beatrun_MinimalVM", 1, true, true, "Lowers the running viewmodel", 0, 1) + cvarwindsound = CreateClientConVar("Beatrun_Wind", 1, true, false, "Wind noises") + SWEP.PrintName = "Unarmed" + SWEP.Slot = 0 + SWEP.SlotPos = 1 + SWEP.DrawAmmo = false + SWEP.DrawCrosshair = false + + + hook.Add("VManipPrePlayAnim", "LOCNoVManip", function() + if LocalPlayer():GetActiveWeapon():GetClass() == "runnerhands" or blinded then + return false + end + end) +end + +SWEP.Author = "" +SWEP.Contact = "" +SWEP.Purpose = "" +SWEP.Instructions = "" + +SWEP.BounceWeaponIcon = false +SWEP.DrawWeaponInfoBox = false + +SWEP.HoldType = "fist" + +SWEP.Spawnable = false +SWEP.AdminSpawnable = false + + +--[[Just don't draw the hands, we don't need 'em]] +SWEP.UseHands = false + +SWEP.ViewModel = "models/runnerhands.mdl" +SWEP.WorldModel = "" + +SWEP.ViewModelFOV=75 --65 75 + +SWEP.Primary.ClipSize = -1 +SWEP.Primary.DefaultClip = -1 +SWEP.Primary.Automatic = false +SWEP.Primary.Ammo = "none" + +SWEP.Secondary.ClipSize = -1 +SWEP.Secondary.DefaultClip = -1 +SWEP.Secondary.Automatic = false +SWEP.Secondary.Ammo = "none" + +SWEP.wepvelocity=0 + + +SWEP.lastpunch=1 --1 right 2 left 3 both +SWEP.lastanimenum=0 +SWEP.spamcount=0 +SWEP.spamlast=0 +SWEP.punchanims = {ACT_DOD_PRIMARYATTACK_PRONE, ACT_DOD_SECONDARYATTACK_PRONE, ACT_DOD_PRIMARYATTACK_KNIFE} +SWEP.punchanimsfb = {"punchright", "punchleft", "punchmid"} +SWEP.punchangles = {Angle(2,1,-2), Angle(2,-1,2), Angle(2.5,0,0)} +SWEP.punchdelays = {0.165, 0.175, 0.5} +SWEP.lastpunchtimer=0 +SWEP.punching=false +SWEP.doublepunch=false + +function SWEP:SetupDataTables() + self:NetworkVar( "Bool", 0, "SideStep" ) + self:NetworkVar( "Bool", 1, "BlockAnims" ) + self:NetworkVar( "Bool", 2, "WasOnGround" ) + self:NetworkVar( "Bool", 3, "QuakeJumping" ) + self:NetworkVar( "Float", 0, "OwnerVelocity" ) + self:NetworkVar( "Float", 1, "WeaponVelocity" ) + self:NetworkVar( "Int", 0, "Punch" ) + self:NetworkVar( "Float", 2, "PunchReset" ) +end + +local runseq = { +[6] = true, +[7] = true +} +local oddseq = { +[8] = true, +[9] = true, +[10] = true, +[19] = true, +} +function SWEP:GetViewModelPosition( pos, ang ) + if minimalvm:GetBool() then + if !self.posz then self.posz = pos.z end + local seq = self:GetSequence() + + if runseq[seq] then + self.posz = Lerp(10*FrameTime(), self.posz, -2) + else + self.posz = Lerp(10*FrameTime(), self.posz, 0) + end + pos.z=pos.z + self.posz + end + if oddseq[self:GetSequence()] then return pos, ang end + + self.BobScale = 0 + ang.x=math.Clamp(ang.x,-10,89) + + return pos, ang +end + +function SWEP:Deploy() + self:SetHoldType( "normal" ) + self:SendWeaponAnim(ACT_VM_DRAW) + self.RespawnDelay = 0 + self:SetWasOnGround(false) + self:SetBlockAnims(false) + + self:SetPunch(1) + RunConsoleCommand("fov_desired", 100) +end + +function SWEP:Initialize() + self.RunWind1 = CreateSound(self, "clotheswind.wav") + self.RunWind2 = CreateSound(self, "runwind.wav") + self.RunWindVolume = 0 + self:SendWeaponAnim(ACT_VM_DRAW) + self.RespawnDelay = 0 + self:SetWasOnGround(false) + self:SetBlockAnims(false) +end + +local jumpseq = { +ACT_VM_HAULBACK, +ACT_VM_SWINGHARD +} +local jumptr, jumptrout = {}, {} +local jumpvec = Vector(0,0,-50) +local fallang = Angle() +local infall +local fallct = 0 +function SWEP:Think() + +local ply=self.Owner +local viewmodel=ply:GetViewModel() + +if !IsValid(viewmodel) then return end + +if self:GetHoldType() == "fist" and CurTime() > self:GetPunchReset() then + self:SetHoldType("normal") +end + +if self:GetBlockAnims() then ply:GetViewModel():SetPlaybackRate(1) return end +local curseq=self:GetSequence() +local onground=ply:OnGround() +local vel = ply:GetVelocity() +vel.z = 0 +local ismoving = vel:Length()>100 and !ply:KeyDown(IN_BACK) and ply:IsSprinting() and !ply:Crouching() and !ply:KeyDown(IN_DUCK) +local injump = curseq==13 or curseq == 14 or curseq == 17 or curseq == -1 or curseq == 1 +infall = curseq==19 +self:SetSideStep((curseq==15 or curseq==16) and GetConVar("Beatrun_SideStep"):GetBool()) +local insidestep = self:GetSideStep() +local spvel = ply:GetVelocity() +local ang = ply:EyeAngles() +if spvel.z < -800 and ply:GetMoveType() != MOVETYPE_NOCLIP then + if !infall then + -- if CLIENT then + -- RemoveBodyAnim() + -- elseif game.SinglePlayer() then + -- self.Owner:SendLua("RemoveBodyAnim()") + -- end + self:SendWeaponAnim(ACT_RUN_ON_FIRE) + end + if CLIENT and fallct != CurTime() then + local vel = math.min(math.abs(spvel.z)/2500, 1) + local mult = 20 + fallang:SetUnpacked(2*vel*FrameTime()*mult, 1.25*vel*FrameTime()*mult, 1.5*vel*FrameTime()*mult) + fallang:Add(ang) + fallct = CurTime() + end + return +elseif infall then + self:SendWeaponAnim(ACT_VM_DRAW) + ang.z = 0 + ply:SetEyeAngles(ang) +end +spvel.z = 0 +local velocity = self:GetOwnerVelocity() +self.punching = curseq==8 or curseq==9 or curseq==10 or curseq==11 +if ply:KeyPressed(IN_JUMP) and self:GetWasOnGround() and !ply:GetJumpTurn() then + ply:ViewPunch(Angle(-2,0,0)) + local eyeang = ply:EyeAngles() + eyeang.x = 0 + + + if insidestep and viewmodel:GetCycle() <= 0.1 and GetConVar("Beatrun_QuakeJump"):GetBool() then + if SERVER then + ply:EmitSound("quakejump.mp3", 100, 100, 0.2) + end + ply.QuakeJumping = true + self:SetQuakeJumping(true) + end + + if !ismoving and !ply:Crouching() then + ParkourEvent("jumpstill",ply) + elseif !ply:Crouching() then + if !util.QuickTrace(ply:GetPos()+eyeang:Forward()*200, Vector(0,0,-100), ply).Hit then + self:SendWeaponAnim(jumpseq[1]) + ParkourEvent("jumpfar",ply) + else + self:SendWeaponAnim(jumpseq[2]) + ParkourEvent("jump",ply) + end + end + return +end + +if onground then + self:SetQuakeJumping(false) +end + +if ply:GetSliding() or ply:GetSlidingDelay()-0.15 > CurTime() then + self:SendWeaponAnim(ACT_VM_DRAW) + return +end + +if (self.punching) and viewmodel:GetCycle()>=1 then + self:SendWeaponAnim(ACT_VM_DRAW) +end + +if injump and (viewmodel:GetCycle()>=1 or (ply:GetMantle() != 0 and ply:KeyDown(IN_JUMP)) or ply:GetWallrun() > 1) then + self:SendWeaponAnim(ACT_VM_DRAW) +end + +self:SetWeaponVelocity(Lerp(5*FrameTime(),self:GetWeaponVelocity(),velocity)) +if !ismoving then + self:SetWeaponVelocity(velocity) +end +if !self.punching and !insidestep then + if onground and ismoving and curseq!=6 and velocity<=350 then + self:SendWeaponAnim(ACT_RUN) + elseif onground and ismoving and curseq!=7 and velocity>350 then + local cycle = self:GetCycle() + self:SendWeaponAnim(ACT_RUN_PROTECTED) + self:SetCycle(cycle) + elseif (curseq==6 or curseq==7) and (velocity<50 or !ismoving or !onground) and curseq!=13 then + self:SendWeaponAnim(ACT_VM_DRAW) + if !onground and ply:GetSafetyRollKeyTime() <= CurTime() and ply:GetSafetyRollTime() <= CurTime() then + ParkourEvent("fall", self.Owner) + end + end +end + +curseq = self:GetSequence() +if (curseq==6 or curseq==7) and ismoving then + local rate = (curseq==7 and 1.2) or 0.75 + if rate != ply:GetViewModel():GetPlaybackRate() then + ply:GetViewModel():SetPlaybackRate(rate) + end +else + ply:GetViewModel():SetPlaybackRate(1) +end + +if CLIENT then + if !self.RunWind1 or !self.RunWind1.Play then + self.RunWind1 = CreateSound(self, "clotheswind.wav") + self.RunWind2 = CreateSound(self, "runwind.wav") + end + + if velocity>250 and cvarwindsound:GetBool() then + self.RunWind1:Play() + self.RunWind2:Play() + + self.RunWindVolume = math.Clamp(self.RunWindVolume + (0.5*FrameTime()), 0, 1) + self.RunWind1:ChangeVolume(self.RunWindVolume) + self.RunWind2:ChangeVolume(self.RunWindVolume) + else + self.RunWindVolume = math.Clamp(self.RunWindVolume - (2.5*FrameTime()), 0, 1) + self.RunWind1:ChangeVolume(self.RunWindVolume) + self.RunWind2:ChangeVolume(self.RunWindVolume) + end +end + +if blinded then + self.RunWind1:ChangeVolume(0) + self.RunWind2:ChangeVolume(0) +end + +if insidestep and viewmodel:GetCycle()>=1 then + local mult = (ply:InOverdrive() and 1.25) or 1 + self:SendWeaponAnim(ACT_VM_DRAW) + ply:SetMEMoveLimit(350*mult) + ply:SetMESprintDelay(CurTime()) +elseif insidestep then + local mult = (ply:InOverdrive() and 1.25) or 1 + ply:SetMEMoveLimit(350*mult) + ply:SetMESprintDelay(CurTime()) +end +self:SetWasOnGround(ply:OnGround()) + +end + +if CLIENT then +local didfallang = false +local mouseang = Angle() +hook.Add("InputMouseApply", "FallView", function(cmd, x, y, ang) + local ply = LocalPlayer() + if infall and !BodyAnimArmCopy and ply:Alive() and ply:GetMoveType()!=MOVETYPE_NOCLIP then + mouseang.x, mouseang.y = y*0.01, x*-0.01 + fallang:Add(mouseang) + cmd:SetViewAngles(fallang) + didfallang = true + util.ScreenShake( vector_origin, 5*(math.abs(ply:GetVelocity().z)/1000), 5, 0.05, 5000 ) + return true + elseif didfallang then + fallang.z = 0 + fallang.x = math.Clamp(fallang.x, -89, 89) + if ply:Alive() then cmd:SetViewAngles(fallang) end + didfallang = false + end +end) +end + +function SWEP:Holster() + if self.RunWind1 then + self.RunWind1:Stop() + self.RunWind2:Stop() + end + return true +end + +function SWEP:OnRemove() + if self.RunWind1 then + self.RunWind1:Stop() + self.RunWind2:Stop() + end +end + +function SWEP:Reload() + if GetGlobalBool(GM_DATATHEFT) then return end + if !TUTORIALMODE and CurTime() > self.RespawnDelay and self.Owner:GetClimbing() == 0 and !IsValid(self.Owner:GetSwingbar()) and !self.Owner.BuildMode then + self.Owner:Spawn() + if self.Owner:KeyDown(IN_USE) then + if game.SinglePlayer() then + RunConsoleCommand("toggleblindness") + elseif CLIENT then + ToggleBlindness(!blinded) + end + end + self.RespawnDelay = CurTime() + 0.5 + end +end + +local tr = {} +local tr_result = {} +function SWEP:PrimaryAttack() + local ply = self.Owner + + if ply:KeyDown(IN_USE) and game.SinglePlayer() then + local mult = (ply:InOverdrive() and 1) or 1.25 + local fovmult = (mult == 1 and 1) or 1.1 + ply:SetMEMoveLimit(ply:GetMEMoveLimit()*0.75) + ply:SetOverdriveMult(mult) + ply:SetFOV(ply:GetInfoNum("Beatrun_FOV", 120)*fovmult, 0.125) + return + end + + if !ply:OnGround() or ply:Crouching() or ply:GetSliding() or ply:GetGrappling() or ply:GetWallrun() != 0 then + return + end + + + local curseq = self:GetSequence() + local infall = curseq==19 + if infall then return end + + if CurTime() > self:GetPunchReset() then + self:SetPunch(1) + end + local punch = self:GetPunch() + self:SendWeaponAnim(self.punchanims[punch]) + if CLIENT and IsFirstTimePredicted() then + ArmInterrupt(self.punchanimsfb[punch]) + elseif game.SinglePlayer() then + ply:SendLua("ArmInterrupt('"..self.punchanimsfb[punch].."')") + end + ply:ViewPunch(self.punchangles[punch]) + self:SetNextPrimaryFire(CurTime()+self.punchdelays[punch]) + self:SetPunchReset(CurTime()+0.5) + + tr.start = ply:GetShootPos() + tr.endpos = ply:GetShootPos() + ply:GetAimVector() * 50 + tr.filter = ply + tr.mins = Vector( -8 , -8 , -8 ) + tr.maxs = Vector( 8 , 8 , 8 ) + tr.output = tr_result + + if ply:IsPlayer() then + ply:LagCompensation( true ) + self:SetHoldType( "fist" ) + ply:AnimRestartGesture(GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_HL2MP_GESTURE_RANGE_ATTACK_FIST, true) + end + + util.TraceHull( tr ) + self:EmitSound("mirrorsedge/Melee/armswoosh"..math.random(1, 6)..".wav") + + if ply:IsPlayer() then + ply:LagCompensation( false ) + end + + if tr_result.Hit then + self:EmitSound("mirrorsedge/Melee/fist"..math.random(1, 5)..".wav") + local ent = tr_result.Entity + if SERVER and IsValid(ent) then + if !ply:IsPlayer() or (Course_Name == "" and !GetGlobalBool(GM_INFECTION)) then + local d = DamageInfo() + d:SetDamage( (punch != 3 and 10) or 20 ) + d:SetAttacker( ply ) + d:SetInflictor( self ) + d:SetDamageType( DMG_CLUB ) + d:SetDamagePosition(tr.start) + d:SetDamageForce(ply:EyeAngles():Forward()*7000) + + ent:TakeDamageInfo( d ) + if ent:IsNPC() then + ent:SetActivity(ACT_FLINCH_HEAD) + end + end + end + if game.SinglePlayer() or (CLIENT and IsFirstTimePredicted()) then + util.ScreenShake( Vector(0, 0, 0), 2.5, 10, 0.25, 0 ) + end + end + + self:SetPunch(punch+1) + if punch+1 > 3 then + self:SetPunch(1) + end +end + + +function SWEP:SecondaryAttack() + +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/weapons/shapedrawer/shared.lua b/beatrun/gamemodes/beatrun/entities/weapons/shapedrawer/shared.lua new file mode 100644 index 0000000..4520a63 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/weapons/shapedrawer/shared.lua @@ -0,0 +1,94 @@ +SWEP.PrintName = "X" +SWEP.Slot = 0 +SWEP.SlotPos = 1 +SWEP.DrawAmmo = false +SWEP.DrawCrosshair = true + + +SWEP.Author = "" +SWEP.Contact = "" +SWEP.Purpose = "" +SWEP.Instructions = "" + +SWEP.BounceWeaponIcon = false +SWEP.DrawWeaponInfoBox = false + +SWEP.HoldType = "crossbow" + +SWEP.Spawnable = true +SWEP.AdminSpawnable = true +SWEP.Category = "Beatrun" + +SWEP.UseHands = true + +SWEP.ViewModel = "models/weapons/c_pistol.mdl" +SWEP.WorldModel = "models/weapons/w_crossbow.mdl" + +SWEP.ViewModelFOV=75 --65 75 + +SWEP.Primary.ClipSize = -1 +SWEP.Primary.DefaultClip = -1 +SWEP.Primary.Automatic = true +SWEP.Primary.Ammo = "none" + +SWEP.Secondary.ClipSize = -1 +SWEP.Secondary.DefaultClip = -1 +SWEP.Secondary.Automatic = false +SWEP.Secondary.Ammo = "none" + +function SWEP:SetupDataTables() +end + +function SWEP:Deploy() + self:CallOnClient("Deploy") + self:SetHoldType( self.HoldType ) + self:SendWeaponAnim(ACT_VM_DRAW) + self.points = {} + self.center = Vector() +end + +function SWEP:Initialize() +end + +function SWEP:Think() + +end + + +function SWEP:Holster() + return true +end + +function SWEP:OnRemove() +end + +function SWEP:Reload() + self:CallOnClient("Reload") + table.Empty(self.points) +end + +function SWEP:PrimaryAttack() + self:CallOnClient("PrimaryAttack") + local ply = self.Owner + if !self.points[#self.points] or (ply:EyePos()+ply:EyeAngles():Forward()*50):Distance(self.points[#self.points]) > 5 then + table.insert(self.points, ply:EyePos()+ply:EyeAngles():Forward()*50) + end +end + + +function SWEP:SecondaryAttack() + self:CallOnClient("SecondaryAttack") + local ply = self.Owner + self.center:Set(ply:GetEyeTrace().HitPos) +end + +hook.Add("PostDrawTranslucentRenderables","ShapeGun",function() + local ply = Entity(1) + local wep = ply:GetActiveWeapon() + if IsValid(wep) and wep:GetClass()=="shapedrawer" then + for k,v in ipairs(wep.points) do + render.DrawWireframeBox(v,angle_zero,Vector(-1,-1,-1),Vector(1,1,1)) + end + render.DrawWireframeBox(wep.center,angle_zero,Vector(-2,-2,-2),Vector(2,2,2)) + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/entities/weapons/ziplinegun/shared.lua b/beatrun/gamemodes/beatrun/entities/weapons/ziplinegun/shared.lua new file mode 100644 index 0000000..df411e7 --- /dev/null +++ b/beatrun/gamemodes/beatrun/entities/weapons/ziplinegun/shared.lua @@ -0,0 +1,75 @@ +SWEP.PrintName = "Zipline Gun" +SWEP.Slot = 0 +SWEP.SlotPos = 1 +SWEP.DrawAmmo = false +SWEP.DrawCrosshair = true + + +SWEP.Author = "" +SWEP.Contact = "" +SWEP.Purpose = "" +SWEP.Instructions = "" + +SWEP.BounceWeaponIcon = false +SWEP.DrawWeaponInfoBox = false + +SWEP.HoldType = "crossbow" + +SWEP.Spawnable = true +SWEP.AdminSpawnable = true +SWEP.Category = "Beatrun" + +SWEP.UseHands = true + +SWEP.ViewModel = "models/weapons/c_crossbow.mdl" +SWEP.WorldModel = "models/weapons/w_crossbow.mdl" + +SWEP.ViewModelFOV=75 --65 75 + +SWEP.Primary.ClipSize = -1 +SWEP.Primary.DefaultClip = -1 +SWEP.Primary.Automatic = false +SWEP.Primary.Ammo = "none" + +SWEP.Secondary.ClipSize = -1 +SWEP.Secondary.DefaultClip = -1 +SWEP.Secondary.Automatic = false +SWEP.Secondary.Ammo = "none" + +function SWEP:SetupDataTables() +end + +function SWEP:Deploy() + self:SetHoldType( self.HoldType ) + self:SendWeaponAnim(ACT_VM_DRAW) +end + +function SWEP:Initialize() +end + +function SWEP:Think() + +end + + +function SWEP:Holster() + return true +end + +function SWEP:OnRemove() +end + +function SWEP:Reload() +end + +function SWEP:PrimaryAttack() + local ply = self.Owner + if SERVER then + CreateZipline(ply:EyePos(), ply:GetEyeTrace().HitPos) + end +end + + +function SWEP:SecondaryAttack() + +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut1.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut1.lua new file mode 100644 index 0000000..64daf15 Binary files /dev/null and b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut1.lua differ diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut2.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut2.lua new file mode 100644 index 0000000..8b40d2a Binary files /dev/null and b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut2.lua differ diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut3.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut3.lua new file mode 100644 index 0000000..4933e38 Binary files /dev/null and b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut3.lua differ diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut4.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut4.lua new file mode 100644 index 0000000..2a90e8c Binary files /dev/null and b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut4.lua differ diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut5.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut5.lua new file mode 100644 index 0000000..178eaeb Binary files /dev/null and b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut5.lua differ diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut6.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut6.lua new file mode 100644 index 0000000..b117d55 Binary files /dev/null and b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut6.lua differ diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut7.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut7.lua new file mode 100644 index 0000000..a2d3289 Binary files /dev/null and b/beatrun/gamemodes/beatrun/gamemode/Maps/TrainingData/tut7.lua differ diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/br_caca.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/br_caca.lua new file mode 100644 index 0000000..b4fe011 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/br_caca.lua @@ -0,0 +1,22 @@ +function CreateRopes() + local ents = ents.GetAll() + for k,v in pairs(ents) do + if v:GetClass() == "move_rope" then + local endpoint = v:GetInternalVariable("m_hEndPoint") + if IsValid(endpoint) then + local zipline = CreateZipline(v:GetPos(), endpoint:GetPos()) + zipline:SetNW2Bool("BRProtected", true) + end + end + end + + for k,v in pairs(ents) do + if v:GetClass():find("rope") then + v:Remove() + end + end + hook.Remove("InitPostEntity", "CreateRopes") +end + +hook.Add("InitPostEntity", "CreateRopes", CreateRopes) +hook.Add("PostCleanupMap", "CreateRopes", CreateRopes) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/br_node.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/br_node.lua new file mode 100644 index 0000000..170ee7a --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/br_node.lua @@ -0,0 +1,60 @@ +local START_Z = -15800 +local CURRENT_Z = 0 + +local ROTATION = { +Vector(-325.8125, 573.90625, START_Z), +Vector(-66.3125, 573.90625, START_Z), +Vector(189.15625, 573.90625, START_Z), +Vector(412.5625, 573.90625, START_Z), +Vector(568.09375, 316.59375, START_Z), +Vector(568.09375, 69.03125, START_Z), +Vector(568.09375, -189.28125, START_Z), +Vector(568.09375, -408.125, START_Z), +Vector(412.5625, -569.375, START_Z), +Vector(189.15625, -569.375, START_Z), +Vector(-66.3125, -569.375, START_Z), +Vector(-325.8125, -569.375, START_Z), +Vector(-568.65625, -408.125, START_Z), +Vector(-568.65625, -189.28125, START_Z), +Vector(-568.65625, 69.03125, START_Z), +Vector(-568.65625, 316.59375, START_Z), +} +local ANGLES = { +Angle(0, 0, 0), +Angle(0, 0, 0), +Angle(0, 0, 0), +Angle(0, 0, 0), +Angle(0, -90, 0), +Angle(0, -90, 0), +Angle(0, -90, 0), +Angle(0, -90, 0), +Angle(0, 0, 0), +Angle(0, 0, 0), +Angle(0, 0, 0), +Angle(0, 0, 0), +Angle(0, -90, 0), +Angle(0, -90, 0), +Angle(0, -90, 0), +Angle(0, -90, 0), +} + +local CURRENT_ROTATION = 1 +local MAX_ROTATION = #ROTATION + +for i=0, 100 do + local mdl = "models/hunter/blocks/cube2x3x025.mdl" + local plat = ents.Create("prop_physics") + plat:SetModel(mdl) + plat:SetPos(ROTATION[CURRENT_ROTATION]+Vector(0,0,CURRENT_Z)) + plat:SetAngles(ANGLES[CURRENT_ROTATION]) + + plat:Spawn() + plat:PhysicsDestroy() + + CURRENT_Z = CURRENT_Z+math.random(20,70) + CURRENT_ROTATION = CURRENT_ROTATION+1 + + if CURRENT_ROTATION > MAX_ROTATION then + CURRENT_ROTATION = 1 + end +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/br_training.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/br_training.lua new file mode 100644 index 0000000..2670b37 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/br_training.lua @@ -0,0 +1,55 @@ +local replaysdir = "beatrun/gamemode/Maps/TrainingData/" +TUTORIALMODE = true + +local tutorialcount = 3 + +for i=1, tutorialcount do + AddCSLuaFile(replaysdir.."tut"..i..".lua") +end + +hook.Add("PlayerDeath", "Ouch", function(ply) + ply:Spawn() + ply:SendLua("PTRD()") +end) + +slidegate = slidegate or nil +local movegate = false +local sentreset = false +local function CreateSlideGate() + slidegate = ents.Create("prop_physics") + slidegate:SetModel("models/hunter/blocks/cube8x8x025.mdl") + slidegate:SetPos(Vector(6332, 858, 895)) + slidegate:SetAngles(Angle(90,0,0)) + slidegate:Spawn() + slidegate:PhysicsDestroy() +end +hook.Add("InitPostEntity", "TutorialSlideGate", CreateSlideGate) + +local function ResetSlideGate() + if !IsValid(slidegate) then return end + slidegate:SetPos(Vector(6332, 858, 895)) + slidegate:SetAngles(Angle(90,0,0)) + movegate = false + sentreset = false +end +hook.Add("PostReplayRequest", "ResetSlideGate", ResetSlideGate) + +local function MoveSlideGate() + if !IsValid(slidegate) or !IsValid(Entity(1)) then return end + if !movegate then + if Entity(1):GetVelocity():Length() > 25 then + movegate = true + else + return + end + end + local pos = slidegate:GetPos() + if pos[3] > 350 then + pos[3] = math.max(350, pos[3]-2.75) + slidegate:SetPos(pos) + elseif !sentreset and !Entity(1).InReplay then + Entity(1):SendLua("SGR()") + sentreset = true + end +end +hook.Add("Tick", "MoveSlideGate", MoveSlideGate) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/br_training_cl.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/br_training_cl.lua new file mode 100644 index 0000000..989cbba --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/br_training_cl.lua @@ -0,0 +1,246 @@ +local replaysdir = "beatrun/gamemode/Maps/TrainingData/" +TUTORIALMODE = true + +local tutorialcount = 7 +local endticks = {300, 300, 350, 500, 500, 230, 800} +tutorials = {} + +curtutorial = 1 +local tutorialtext = { +"Move towards a wall while in the air to climb it", +{"Press [%s] before landing to break your fall","+speed"}, +"Jump towards an obstacle to vault over it", +{"Hold Jump while holding [%s] and looking at a wall to wallrun\nYou can release either key during the wallrun, you won't fall off", "+forward"}, +"Press Jump during a wallrun to jump off\nYou can chain wallruns this way", +"Hold Jump while moving towards a wall to wallclimb\nYou can release either key afterwards\nYou will automatically climb ledges", +{"Press [%s] while moving left or right to sidestep\nSidestep lets you move at max speed immediately\nHold Crouch to slide under the gate", "+attack2"} +} + +for i=1, tutorialcount do + tutorials[i] = util.JSONToTable(util.Decompress(file.Read(replaysdir.."tut"..i..".lua", "LUA"))) +end + +function PlayTutorialReplay(num) + local data = tutorials[num] + local ply = LocalPlayer() + + curtutorial = num + ply.ReplayEndAtTick = endticks[num] + ReplayPlay(ply, data[2], data[1]) +end +function PTRD() + PlayTutorialReplay(curtutorial) +end +function SGR() + if curtutorial == 7 and LocalPlayer():GetPos()[1] < 6345 then + PlayTutorialReplay(curtutorial) + end +end + +local curevent = {} +local eventcheck = {} +local eventwhitelist = { +["step"] = true, +["sidestep"] = true, +["jump"] = true, +["land"] = true, +["jumpwallrun"] = true +} + +local eventrequired = { +{"climb"}, +{"roll"}, +{"vault", "vault"}, +{"wallrunh"}, +{"wallrunh", "wallrunh"}, +{"wallrunv", "climb"}, +{"slide"} +} +local eventnicenames = { +["climb"] = "Climb", +["roll"] = "Roll", +["vault"] = "Vault", +["wallrunh"] = "Wallrun (H)", +["wallrunv"] = "Wallrun (V)", +["slide"] = "Slide", +["springboard"] = "Springboard", +["coil"] = "Coil" +} +local eventhudtext = {} +local function DrawTutorialText() + surface.SetFont("BeatrunHUD") + local offsetx, offsety = ScrW()*0.33, ScrH()*0.75 + local data = tutorialtext[curtutorial] + local text + if type(data) != "table" then + text = tutorialtext[curtutorial] + else + text = string.format(tutorialtext[curtutorial][1], input.LookupBinding(tutorialtext[curtutorial][2])) + end + + local textsplit = string.Split(text,"\n") + local linecount = #textsplit + + local tw, th = surface.GetTextSize(text) + local boxw = tw + surface.SetTextColor(220, 220, 220, 255) + surface.SetDrawColor(75, 75, 75, 45) + surface.DrawRect(ScrW()/2 - (tw*0.5)-15-1, offsety-1, boxw + 30+1, 3) + + for k,v in ipairs(textsplit) do + local tw, th = surface.GetTextSize(v) + surface.SetTextPos(ScrW()/2 - (tw*0.5), offsety + 30 - (th * 0.5) + (th * (k-1)) ) + surface.DrawText(v) + end + + table.Empty(eventhudtext) + for k,v in ipairs(curevent) do + if !eventwhitelist[v] and eventnicenames[v] then + table.insert(eventhudtext, eventnicenames[v]) + end + end + offsety = ScrH()*0.7 + text = table.concat(eventhudtext, " + ") + tw, th = surface.GetTextSize(text) + surface.SetTextPos(ScrW()/2 - (tw*0.5), offsety + 30 - (th * 0.5) ) + surface.DrawText(text) +end +hook.Add("HUDPaint", "TutorialText", DrawTutorialText) + +hook.Add("BeatrunHUDCourse", "TutorialHUD", function() + return "Tutorial" +end) + +local tutorialendpos = { +tutorials[2][1], +tutorials[3][1], +tutorials[4][1], +tutorials[5][1], +tutorials[6][1], +tutorials[7][1], +Vector() +} + +local function TutorialLogic() + local ply = LocalPlayer() + if !IsValid(ply) then return end + if ply.InReplay then return end + local endpos = tutorialendpos[curtutorial] + if !endpos then return end + + if ply:GetPos():Distance(endpos) < 20 then + table.Empty(eventcheck) + for k,v in ipairs(curevent) do + if !eventwhitelist[v] then + table.insert(eventcheck, v) + end + end + + if table.concat(eventcheck) == table.concat(eventrequired[curtutorial]) then + table.Empty(curevent) + table.Empty(eventcheck) + curtutorial = curtutorial + 1 + PlayTutorialReplay(curtutorial) + else + table.Empty(curevent) + table.Empty(eventcheck) + PlayTutorialReplay(curtutorial) + end + end +end +hook.Add("Tick", "TutorialLogic", TutorialLogic) + +local function TutorialEvents(event, ply) + if !eventnicenames[event] then return end + table.insert(curevent, event) + if #curevent > 10 then + table.remove(curevent, 1) + end +end +hook.Add("OnParkour", "TutorialEvents", TutorialEvents) + +function TutorialClearEvents() + table.Empty(curevent) +end + +local markerup = Vector() +local markercol = Color(255, 25, 25) +local function TutorialMarker() + local markerpos = tutorialendpos[curtutorial] + if markerpos then + markerup:Set(markerpos) + markerup[3] = markerup[3] + 50 + render.DrawLine(markerpos, markerup, markercol, true) + + local ang = EyeAngles() + ang.x = -90 + + markerup[3] = markerup[3] + 50 + math.sin(CurTime()*4)*5 + cam.Start3D2D(markerup - ang:Right()*13, ang, 1) + surface.SetFont("BeatrunHUD") + surface.SetTextPos(0,0) + surface.SetTextColor(markercol) + surface.DrawText("←") + cam.End3D2D() + end +end +hook.Add("PostDrawTranslucentRenderables", "TutorialMarker", TutorialMarker) + + +local creditslist = { +{3.25, "Beatrun"}, +{3.25, "Authored by datae"}, +{3.25, "Ideas stolen from Mirror's Edge"}, +{3.75, "Sounds stolen from Mirror's Edge"}, +{3.25, "Infection music stolen from Dying Light"}, +{1.75, "Maybe I forgot more?"}, +{3.25, "Anyways..."}, +{8.75, "Thanks for playing, %s!"}, +{7.5, ""}, +} +local creditstime = 0 +local curcredit = 1 + +local function CreditsThink() + if gui.IsGameUIVisible() then return end + cam.Start2D() + local data = creditslist[curcredit] + surface.SetDrawColor(0,0,0) + surface.DrawRect(0, 0, ScrW(), ScrH()) + surface.SetFont("BeatrunHUD") + local text = data[2] + text = string.format(text, LocalPlayer():Nick()) + local tw, th = surface.GetTextSize(text) + surface.SetTextColor(220, 220, 220, 255) + surface.SetTextPos(ScrW()/2 - (tw*0.5), ScrH()/2 - (th*0.5)) + surface.DrawText(text) + if CurTime() > creditstime+data[1] then + creditstime = CurTime() + curcredit = curcredit + 1 + if !creditslist[curcredit] then + hook.Remove("PreRender", "Credits") + RunConsoleCommand("disconnect") + end + end + cam.End2D() + return true +end + +local function CreditsStart() + creditstime = CurTime() + curcredit = 1 + hook.Add("PreRender", "Credits", CreditsThink) + + RunConsoleCommand("stopsound") + timer.Simple(0, function() EmitSound("music/credits.mp3", vector_origin, -2, CHAN_AUTO, 1, 75, SND_SHOULDPAUSE) end) +end + +local creditscheck = 0 +hook.Add("PlayerBindPress", "CreditsCheck", function(ply, bind, pressed) + if creditstime == 0 and bind == "+use" then + creditscheck = creditscheck + 1 + if creditscheck > (30-ply:GetLevel()) then + CreditsStart() + end + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/br_tuto_2_cl.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/br_tuto_2_cl.lua new file mode 100644 index 0000000..5aeca61 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/br_tuto_2_cl.lua @@ -0,0 +1,18 @@ +net.Receive("DeathStopSound", function() + if !blinded then + RunConsoleCommand("stopsound") + if LocalPlayer():GetPos().z < -2200 then + timer.Simple(0.011, function() RunConsoleCommand("stopsound") end) + timer.Simple(0.02, function() LocalPlayer():EmitSound("enterwater_highvelocity_0"..math.random(1,2)..".wav") end) + timer.Simple(0.02, function() + local rag = LocalPlayer():GetRagdollEntity() + if IsValid(rag) then + for i = 0, rag:GetPhysicsObjectCount() - 1 do + local phys = rag:GetPhysicsObjectNum( i ) + phys:EnableMotion(false) + end + end + end) + end + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/br_tuto_3_cl.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/br_tuto_3_cl.lua new file mode 100644 index 0000000..5aeca61 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/br_tuto_3_cl.lua @@ -0,0 +1,18 @@ +net.Receive("DeathStopSound", function() + if !blinded then + RunConsoleCommand("stopsound") + if LocalPlayer():GetPos().z < -2200 then + timer.Simple(0.011, function() RunConsoleCommand("stopsound") end) + timer.Simple(0.02, function() LocalPlayer():EmitSound("enterwater_highvelocity_0"..math.random(1,2)..".wav") end) + timer.Simple(0.02, function() + local rag = LocalPlayer():GetRagdollEntity() + if IsValid(rag) then + for i = 0, rag:GetPhysicsObjectCount() - 1 do + local phys = rag:GetPhysicsObjectNum( i ) + phys:EnableMotion(false) + end + end + end) + end + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/br_worlds.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/br_worlds.lua new file mode 100644 index 0000000..77ecd30 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/br_worlds.lua @@ -0,0 +1,24 @@ +local spawn = { +{"br_swingbar", Vector(935.281250, 847.187500, 13185), Angle(0, 0, 0)}, +{"br_swingbar", Vector(935.281250, 813.875000, 13185), Angle(0, 0, 0)}, +} + +function PrintAllBars() + for k,v in pairs(ents.FindByClass("br_swingbar")) do + local pos, ang = v:GetPos(), v:GetAngles() + local str = '{"br_swingbar", Vector('..pos.x..", "..pos.y..", "..pos.z.."), Angle("..ang.x..", "..ang.y..", "..ang.z..")}," + print(str) + end +end + +local function CreateSpawnEntities() + for k,v in ipairs(spawn) do + BRProtectedEntity(v[1], v[2], v[3]) + end +end +hook.Add("InitPostEntity", "CreateSpawnEntities", CreateSpawnEntities) +hook.Add("PostCleanupMap", "CreateSpawnEntities", CreateSpawnEntities) + + +print("Loaded worlds") +BlockWhitescaleSkypaint = true diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/dm_bwo_undercranes_r1.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/dm_bwo_undercranes_r1.lua new file mode 100644 index 0000000..435aca1 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/dm_bwo_undercranes_r1.lua @@ -0,0 +1,60 @@ +local blacklistedents = { +["weapon_pistol"] = true, +["weapon_357"] = true, +["weapon_crossbow"] = true, +["weapon_crowbar"] = true, +["weapon_ar2"] = true, +["weapon_rpg"] = true, +["weapon_shotgun"] = true, +["weapon_smg1"] = true, +["item_ammo_357"] = true, +["item_ammo_ar2"] = true, +["item_ammo_ar2_altfire"] = true, +["item_healthkit"] = true, +["item_healthvial"] = true, +["item_ammo_smg1"] = true, +["item_box_buckshot"] = true, +["item_battery"] = true, +["item_ammo_smg1_grenade"] = true, +["item_ammo_pistol"] = true, +["item_ammo_crossbow"] = true, +["item_rpg_round"] = true, +["item_ammo_smg1_large"] = true, +["weapon_frag"] = true +} +local old = game.CleanUpMap +local CleanUpMapDetoured = function(dsc, efilters) + if istable(efilters) then + table.insert(efilters, "env_skypaint") + end + old(dsc, efilters) +end + +game.CleanUpMap = CleanUpMapDetoured + +local skypaint +hook.Add("PlayerSpawn", "CubixInit", function() + RunConsoleCommand("sv_skyname","painted") + if !skypaint then + skypaint = ents.Create("env_skypaint") + WhitescaleOn() + end +end) + +hook.Add("OnEntityCreated", "BlacklistedEnts", function(ent) + if IsValid(ent) and blacklistedents[ent:GetClass()] then + ent:Remove() + return + end + + timer.Simple(0, function() + if IsValid(ent) and (ent:GetClass()=="prop_physics" or ent:GetClass()=="prop_physics_respawnable") then + local phys = ent:GetPhysicsObject() + if IsValid(phys) then + phys:EnableMotion(false) + end + end + end) +end) + +print("Loaded undercrane") diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/dm_cubix_fix.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/dm_cubix_fix.lua new file mode 100644 index 0000000..dbbf25f --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/dm_cubix_fix.lua @@ -0,0 +1,247 @@ +local blacklistedents = { +["weapon_pistol"] = true, +["weapon_357"] = true, +["weapon_crossbow"] = true, +["weapon_crowbar"] = true, +["weapon_ar2"] = true, +["weapon_rpg"] = true, +["weapon_shotgun"] = true, +["weapon_smg1"] = true, +["item_ammo_357"] = true, +["item_ammo_ar2"] = true, +["item_ammo_ar2_altfire"] = true, +["item_healthkit"] = true, +["item_healthvial"] = true, +["item_ammo_smg1"] = true, +["item_box_buckshot"] = true, +["item_battery"] = true, +["item_ammo_smg1_grenade"] = true, +["item_ammo_pistol"] = true, +["item_ammo_crossbow"] = true, +["item_rpg_round"] = true, +["item_ammo_smg1_large"] = true +} +local old = game.CleanUpMap +local CleanUpMapDetoured = function(dsc, efilters) + if istable(efilters) then + table.insert(efilters, "env_skypaint") + end + old(dsc, efilters) +end + +local spawn = { +{"br_swingbar", Vector(-473.625, 2578.53125, 219.5625), Angle(0, 90, 0)}, +{"br_swingbar", Vector(-303.8125, 2578.53125, 219.5625), Angle(0, 90, 0)}, +{"br_swingbar", Vector(-398.15625, 2578.53125, 219.5625), Angle(0, 90, 0)}, +{"br_swingbar", Vector(3387.78125, 2381.0625, 235.1875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(3387.78125, 2286.84375, 235.1875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1222.21875, 1197.59375, 561.15625), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1566.3125, 1181.9375, 465.78125), Angle(0, -45, 0)}, +{"br_swingbar", Vector(1792.15625, 1228.65625, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1792.15625, 1062.25, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1792.15625, 1156.25, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2309.21875, 1417.1875, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2309.21875, 1323.1875, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2309.21875, 1489.59375, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2309.21875, 1417.1875, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2309.21875, 1323.1875, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2309.21875, 1489.59375, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2076.34375, 1417.1875, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2076.34375, 1323.1875, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2076.375, 1489.59375, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1792.15625, 1417.1875, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1792.15625, 1323.1875, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1792.15625, 1489.59375, 228.59375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2014.34375, 2145.6875, 670.9375), Angle(0, 45, 0)}, +{"br_swingbar", Vector(2014.34375, 2145.6875, 355.125), Angle(0, 45, 0)}, +{"br_swingbar", Vector(1967.34375, 1558.59375, 582.5625), Angle(0, 90, 0)}, +{"br_swingbar", Vector(2014.34375, 2145.6875, 454.21875), Angle(0, 45, 0)}, +{"br_swingbar", Vector(-302.65625, 5230.15625, 461.625), Angle(0, 90, 0)}, +{"br_swingbar", Vector(-445.125, 5230.15625, 461.59375), Angle(0, 90, 0)}, +{"br_swingbar", Vector(-350.5, 5230.15625, 461.59375), Angle(0, 90, 0)}, +{"br_swingbar", Vector(-350.5, 5692.8125, 381.84375), Angle(0, 90, 0)}, +{"br_swingbar", Vector(-302.65625, 5692.8125, 381.84375), Angle(0, 90, 0)}, +{"br_swingbar", Vector(-445.125, 5692.8125, 381.84375), Angle(0, 90, 0)}, +{"br_swingbar", Vector(-350.5, 5489.90625, 420.3125), Angle(0, 90, 0)}, +{"br_swingbar", Vector(-302.65625, 5489.90625, 420.34375), Angle(0, 90, 0)}, +{"br_swingbar", Vector(-445.125, 5489.90625, 420.3125), Angle(0, 90, 0)}, +{"br_swingbar", Vector(446.40625, 4603.78125, 370.9375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(446.40625, 4698.09375, 370.9375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(446.40625, 4509.8125, 370.9375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(446.40625, 4415.53125, 370.9375), Angle(0, 0, 0)}, +{"br_swingbar", Vector(748.8125, 4341.1875, 374), Angle(0, 90, 0)}, +{"br_swingbar", Vector(654.09375, 4341.1875, 374), Angle(0, 90, 0)}, +{"br_swingbar", Vector(558.34375, 4341.1875, 374), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1261.25, 4447.3125, 229.40625), Angle(0, -90, 0)}, +{"br_swingbar", Vector(1425.46875, 4447.3125, 229.40625), Angle(0, -90, 0)}, +{"br_swingbar", Vector(1331.21875, 4447.3125, 229.40625), Angle(0, -90, 0)}, +{"br_swingbar", Vector(1261.25, 4259.6875, 165.875), Angle(0, -90, 0)}, +{"br_swingbar", Vector(1425.46875, 4259.6875, 165.875), Angle(0, -90, 0)}, +{"br_swingbar", Vector(1331.21875, 4259.6875, 165.875), Angle(0, -90, 0)}, +{"br_swingbar", Vector(377.3125, 4595.125, -248.8125), Angle(-15, 0, 0)}, +{"br_swingbar", Vector(377.3125, 4689.65625, -248.8125), Angle(-15, 0, 0)}, +{"br_swingbar", Vector(1504.59375, 4527.5625, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1504.59375, 4811.40625, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1504.59375, 4622.09375, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1504.59375, 4716.84375, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1166.28125, 4527.5625, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1166.28125, 4811.40625, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1166.28125, 4622.09375, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1166.28125, 4716.84375, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1718, 4527.5625, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(967.34375, 4811.40625, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1718, 4622.09375, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1718, 4716.84375, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(538.03125, 4595.125, -248.78125), Angle(-14.96875, 0, 0)}, +{"br_swingbar", Vector(538.03125, 4689.65625, -248.78125), Angle(-14.96875, 0, 0)}, +{"br_swingbar", Vector(967.3125, 4622.09375, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(967.3125, 4527.5625, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(967.3125, 4716.84375, 216.03125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(967.3125, 4622.09375, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(967.3125, 4527.5625, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(967.3125, 4716.84375, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1202.625, 4622.09375, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1202.625, 4527.5625, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1202.625, 4716.84375, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1481.375, 4622.09375, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1481.375, 4527.5625, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1481.375, 4716.84375, -37.53125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1773.0625, 4249.3125, -0.875), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1774.59375, 4251.5, -0.1875), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1938, 4251.5, -0.1875), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1866.53125, 4249.3125, -0.875), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1868.0625, 4251.5, -0.1875), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1936.46875, 4249.3125, -0.875), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1773.0625, 4399.96875, -91.1875), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1938, 4402.15625, -90.5), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1866.53125, 4399.96875, -91.1875), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1868.0625, 4402.15625, -90.5), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1936.46875, 4399.96875, -91.1875), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1774.59375, 4402.15625, -90.5), Angle(0, 90, 0)}, +{"br_swingbar", Vector(538.03125, 4689.65625, -5.46875), Angle(-15, 0, 0)}, +{"br_swingbar", Vector(538.03125, 4595.125, -5.46875), Angle(-15, 0, 0)}, +{"br_swingbar", Vector(377.3125, 4595.125, -5.46875), Angle(-15, 0, 0)}, +{"br_swingbar", Vector(377.3125, 4689.65625, -5.46875), Angle(-15, 0, 0)}, +{"br_swingbar", Vector(-740.78125, 2292.65625, 638.25), Angle(0, 0, 0)}, +{"br_swingbar", Vector(-740.75, 2385.21875, 638.25), Angle(0, 0, 0)}, +{"br_swingbar", Vector(-519.09375, 2385.21875, 638.25), Angle(0, 0, 0)}, +{"br_swingbar", Vector(-519.09375, 2292.65625, 638.25), Angle(0, 0, 0)}, +{"br_swingbar", Vector(-238.9375, 2385.21875, 638.25), Angle(0, 0, 0)}, +{"br_swingbar", Vector(-17.28125, 2292.65625, 638.25), Angle(0, 0, 0)}, +{"br_swingbar", Vector(-238.9375, 2292.65625, 638.25), Angle(0, 0, 0)}, +{"br_swingbar", Vector(-17.28125, 2385.21875, 638.25), Angle(0, 0, 0)}, +{"br_swingbar", Vector(927.21875, 2399.8125, 115.3125), Angle(0, 135, 0)}, +{"br_swingbar", Vector(913.59375, 2681.71875, 114.09375), Angle(0, 90, 0)}, +{"br_swingbar", Vector(1309.09375, 2333.59375, 19), Angle(0, -45, 0)}, +{"br_swingbar", Vector(1360.53125, 2053.5625, -3.59375), Angle(0, -90, 0)}, +{"br_swingbar", Vector(1360.90625, 1734.5625, -65.09375), Angle(0, -90, 0)}, +{"br_swingbar", Vector(1316.84375, 1415.65625, -84.125), Angle(0, -60, 0)}, +{"br_swingbar", Vector(1765.78125, 1377.84375, -99.6875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1765.78125, 1284.0625, -99.6875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1529.1875, 1197.1875, -99.6875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(1529.1875, 1290.96875, -99.6875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2635.4375, 1493.15625, 8.46875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2635.4375, 1330.03125, 8.5), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2713.09375, 1418.4375, 99.78125), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2055, 1418.4375, -183.6875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2055, 1488.59375, -183.6875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2055, 1325.46875, -183.6875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2237, 1418.4375, -140.96875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2237, 1488.59375, -141), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2237, 1325.46875, -140.96875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2463.84375, 1418.4375, -85.6875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2463.84375, 1488.59375, -85.71875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2463.84375, 1325.46875, -85.6875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(2635.4375, 1423, 8.46875), Angle(0, 0, 0)}, +{"br_swingbar", Vector(-2400.0625, 95.59375, 307.90625), Angle(0, 45, 0)}, +{"br_swingbar", Vector(2274.5, 2412.0625, 136.46875), Angle(0, -90, 0)}, +{"br_swingbar", Vector(2274.5, 2650.0625, 123.46875), Angle(0, -90, 0)}, +{"br_swingbar", Vector(2606.75, 1556, 594.78125), Angle(0, -90, 0)}, +{"br_swingbar", Vector(2600.21875, 1798.09375, 611.125), Angle(0, -90, 0)}, +{"br_swingbar", Vector(2582.125, 2146.9375, 531.6875), Angle(0, -45, 0)}, +{"br_swingbar", Vector(2437.125, 2715.25, 377.5), Angle(0, 90, 0)}, +{"br_swingbar", Vector(2345.5, 2715.25, 377.5), Angle(0, 90, 0)}, +{"br_swingbar", Vector(2376.90625, 2456.28125, 377.5), Angle(0, 90, 0)}, +{"br_swingbar", Vector(2285.28125, 2456.28125, 377.5), Angle(0, 90, 0)}, +{"br_anticampbox", Vector(-778.63702392578, -1732.625, 1833.2685546875), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(-1413.6267089844, -889.77520751953, 1408.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(-2296.6579589844, -766.48419189453, 1152.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(-1411.6685791016, 7568.8515625, 1024.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(653.60040283203, 7546.6235351563, 1024.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(1083.7712402344, 3445.6235351563, 896.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(1605.3482666016, 3456.8474121094, 896.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(2105.6247558594, 3471.8090820313, 896.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(4092.0490722656, 4081.3520507813, 1280.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(4089.609375, 2811.6884765625, 1280.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(3846.6906738281, 2050.796875, 1216.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(3843.7377929688, 1138.6533203125, 1216.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(2306.8647460938, 1014.7623291016, 1474.8770751953), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(501.71005249023, 63.838512420654, 1280.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(-74.375015258789, 125.63264465332, 1408.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(-136.48791503906, -894.35400390625, 1408.03125), Angle(0, 0, 0)}, +{"br_anticampbox", Vector(-380.66781616211, 1725.1768798828, 2131.5939941406), Angle(0, 0, 0)}, + + +} + +function PrintAllBars() + for k,v in pairs(ents.FindByClass("br_swingbar")) do + local pos, ang = v:GetPos(), v:GetAngles() + local str = '{"br_swingbar", Vector('..pos.x..", "..pos.y..", "..pos.z.."), Angle("..ang.x..", "..ang.y..", "..ang.z..")}," + print(str) + end +end + +function PrintAllCampBoxes() + for k,v in pairs(ents.FindByClass("br_anticampbox")) do + local pos, ang = v:GetPos(), v:GetAngles() + local str = '{"br_anticampbox", Vector('..pos.x..", "..pos.y..", "..pos.z.."), Angle("..ang.x..", "..ang.y..", "..ang.z..")}," + print(str) + end +end + +local function CreateSpawnEntities() + for k,v in ipairs(spawn) do + BRProtectedEntity(v[1], v[2], v[3]) + end +end +hook.Add("InitPostEntity", "CreateSpawnEntities", CreateSpawnEntities) +hook.Add("PostCleanupMap", "CreateSpawnEntities", CreateSpawnEntities) + +game.CleanUpMap = CleanUpMapDetoured + +local skypaint +hook.Add("PlayerSpawn", "CubixInit", function() + RunConsoleCommand("sv_skyname","painted") + if !skypaint then + skypaint = ents.Create("env_skypaint") + WhitescaleOn() + end +end) + +hook.Add("OnEntityCreated", "BlacklistedEnts", function(ent) + if IsValid(ent) and blacklistedents[ent:GetClass()] then + ent:Remove() + return + end + if IsValid(ent) and ent:GetClass()=="func_button" and ent:GetName() == "device_ctrl" then + ent:Remove() + return + end + + timer.Simple(0, function() + if IsValid(ent) and (ent:GetClass()=="prop_physics" or ent:GetClass()=="prop_physics_respawnable") then + local phys = ent:GetPhysicsObject() + if IsValid(phys) then + phys:EnableMotion(false) + end + end + end) +end) + +hook.Add("PlayerUse", "button", function(ply, ent) + if ent:GetName() == "device_ctrl" then + return false + end +end) +print("Loaded cubix") diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/dm_luster_v1.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/dm_luster_v1.lua new file mode 100644 index 0000000..3a57d34 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/dm_luster_v1.lua @@ -0,0 +1,17 @@ +local spawn = { +{"br_databank", Vector(46.673126220703,957.37548828125,256.03125)}, +{"br_databank", Vector(-3.3380174636841,-939.83837890625,256.03125)}, +{"br_databank", Vector(946.02209472656,269.16903686523,522.03125)}, +{"br_databank", Vector(-802.15405273438,343.96166992188,272.03125)}, +{"br_databank", Vector(-694.69586181641,-590.50836181641,272.03125)}, +{"br_databank", Vector(-46.449630737305,-1083.9945068359,256.03125)}, +{"br_databank", Vector(651.01989746094,-464.4665222168,458.03125)}, +} + +local function CreateSpawnEntities() + for k,v in ipairs(spawn) do + BRProtectedEntity(v[1], v[2], angle_zero) + end +end +hook.Add("InitPostEntity", "CreateSpawnEntities", CreateSpawnEntities) +hook.Add("PostCleanupMap", "CreateSpawnEntities", CreateSpawnEntities) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/gm_city_freerun_2_v1.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/gm_city_freerun_2_v1.lua new file mode 100644 index 0000000..6170b1b --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/gm_city_freerun_2_v1.lua @@ -0,0 +1,13 @@ +hook.Add("OnEntityCreated", "lol", function(ent) + if ent:IsNPC() then + SafeRemoveEntityDelayed(ent, 0.1) + end + + if ent:GetClass()=="trigger_weapon_strip" then + ent:Remove() + end + + if ent:GetClass()=="trigger_once" then + ent:Remove() + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/pf_kijun_b4.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/pf_kijun_b4.lua new file mode 100644 index 0000000..b4fe011 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/pf_kijun_b4.lua @@ -0,0 +1,22 @@ +function CreateRopes() + local ents = ents.GetAll() + for k,v in pairs(ents) do + if v:GetClass() == "move_rope" then + local endpoint = v:GetInternalVariable("m_hEndPoint") + if IsValid(endpoint) then + local zipline = CreateZipline(v:GetPos(), endpoint:GetPos()) + zipline:SetNW2Bool("BRProtected", true) + end + end + end + + for k,v in pairs(ents) do + if v:GetClass():find("rope") then + v:Remove() + end + end + hook.Remove("InitPostEntity", "CreateRopes") +end + +hook.Add("InitPostEntity", "CreateRopes", CreateRopes) +hook.Add("PostCleanupMap", "CreateRopes", CreateRopes) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/pf_overview_remake_v1.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/pf_overview_remake_v1.lua new file mode 100644 index 0000000..b4fe011 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/pf_overview_remake_v1.lua @@ -0,0 +1,22 @@ +function CreateRopes() + local ents = ents.GetAll() + for k,v in pairs(ents) do + if v:GetClass() == "move_rope" then + local endpoint = v:GetInternalVariable("m_hEndPoint") + if IsValid(endpoint) then + local zipline = CreateZipline(v:GetPos(), endpoint:GetPos()) + zipline:SetNW2Bool("BRProtected", true) + end + end + end + + for k,v in pairs(ents) do + if v:GetClass():find("rope") then + v:Remove() + end + end + hook.Remove("InitPostEntity", "CreateRopes") +end + +hook.Add("InitPostEntity", "CreateRopes", CreateRopes) +hook.Add("PostCleanupMap", "CreateRopes", CreateRopes) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/pf_pink_p9.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/pf_pink_p9.lua new file mode 100644 index 0000000..b4fe011 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/pf_pink_p9.lua @@ -0,0 +1,22 @@ +function CreateRopes() + local ents = ents.GetAll() + for k,v in pairs(ents) do + if v:GetClass() == "move_rope" then + local endpoint = v:GetInternalVariable("m_hEndPoint") + if IsValid(endpoint) then + local zipline = CreateZipline(v:GetPos(), endpoint:GetPos()) + zipline:SetNW2Bool("BRProtected", true) + end + end + end + + for k,v in pairs(ents) do + if v:GetClass():find("rope") then + v:Remove() + end + end + hook.Remove("InitPostEntity", "CreateRopes") +end + +hook.Add("InitPostEntity", "CreateRopes", CreateRopes) +hook.Add("PostCleanupMap", "CreateRopes", CreateRopes) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/Maps/pf_rebound_final.lua b/beatrun/gamemodes/beatrun/gamemode/Maps/pf_rebound_final.lua new file mode 100644 index 0000000..b4fe011 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/Maps/pf_rebound_final.lua @@ -0,0 +1,22 @@ +function CreateRopes() + local ents = ents.GetAll() + for k,v in pairs(ents) do + if v:GetClass() == "move_rope" then + local endpoint = v:GetInternalVariable("m_hEndPoint") + if IsValid(endpoint) then + local zipline = CreateZipline(v:GetPos(), endpoint:GetPos()) + zipline:SetNW2Bool("BRProtected", true) + end + end + end + + for k,v in pairs(ents) do + if v:GetClass():find("rope") then + v:Remove() + end + end + hook.Remove("InitPostEntity", "CreateRopes") +end + +hook.Add("InitPostEntity", "CreateRopes", CreateRopes) +hook.Add("PostCleanupMap", "CreateRopes", CreateRopes) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/AddonWarning.lua b/beatrun/gamemodes/beatrun/gamemode/cl/AddonWarning.lua new file mode 100644 index 0000000..0371fb8 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/AddonWarning.lua @@ -0,0 +1,214 @@ +local bigboy = false +local welcome = { + w = 700, + h = 400 +} +welcome.x = 960 - welcome.w * 0.5 +welcome.y = 540 - welcome.h * 0.5 +welcome.bgcolor = Color(32, 32, 32) +welcome.outlinecolor = Color(54, 55, 56) +welcome.alpha = 0.9 +welcome.elements = {} + +local function closebutton(self) + LocalPlayer():EmitSound("holygrenade.mp3") + AEUI:Clear() +end + +local function warnclosebutton(self) + LocalPlayer():EmitSound("holygrenade.mp3") + AEUI:Clear() + + bigboy = true +end + +if not game.SinglePlayer() then + return +end + +local addons = 0 +local warning = Material("vgui/warning.png") +local shit = { + ["378401390"] = true, + ["2027577882"] = true, + ["1440226338"] = true, + ["1418478031"] = true, + ["1190705063"] = true, + ["123514260"] = true, + ["2416989205"] = true, + ["2591814455"] = true, + ["240159269"] = true, + ["2230307188"] = true, + ["2137973704"] = true, + ["577145478"] = true, + ["2589006389"] = true, + ["1632091428"] = true, + ["104548572"] = true, + ["1622199072"] = true, + ["2840019616"] = true, + ["583517911"] = true, + ["2106330193"] = true, + ["2593047682"] = true, + ["2564569716"] = true, + ["142911907"] = true, + ["2316713217"] = true +} +local warnpanel = { + w = 500, + h = 350 +} +warnpanel.x = 960 - warnpanel.w * 0.5 +warnpanel.y = 540 - warnpanel.h * 0.5 +warnpanel.bgcolor = Color(32, 32, 32) +warnpanel.outlinecolor = Color(54, 55, 56) +warnpanel.alpha = 0.9 +warnpanel.elements = {} +local conflictpanel = { + w = 400, + h = 150, + x = 1008 - warnpanel.w * 0.5, + y = 648 - warnpanel.h * 0.5, + bgcolor = Color(32, 32, 32), + outlinecolor = Color(54, 55, 56), + alpha = 1, + elements = {} +} +local warntext = { + type = "Text", + font = "AEUIDefault", + x = warnpanel.w * 0.5, + y = warnpanel.h * 0.125, + centered = true, + color = color_white, + string = "NOTICE\nPlease disable the following addons before playing:" +} + +table.insert(warnpanel.elements, warntext) + +local quitbutton = { + type = "Button", + font = "AEUIDefault", + x = warnpanel.w * 0.5, + y = warnpanel.h * 0.85, + centered = true, + color = color_white, + string = "Return to Main Menu", + onclick = function (self) + surface.PlaySound("garrysmod/ui_click.wav") + MsgC(Color(255, 100, 100), "Quitting Beatrun due to conflicting addons!") + timer.Simple(0.5, function () + RunConsoleCommand("killserver") + end) + + self.onclick = nil + end +} + +table.insert(warnpanel.elements, quitbutton) +AEUI:AddButton(warnpanel, "Play, but at my own peril", warnclosebutton, "AEUIDefault", warnpanel.w * 0.5, warnpanel.h * 0.93, true) + +local conflictlist = { + type = "Text", + font = "AEUIDefault", + x = 0, + y = 0, + centered = false, + color = color_white, + string = "" +} + +table.insert(conflictpanel.elements, conflictlist) + +local function CheckAddons() + addons = 0 + + for k, v in pairs(engine.GetAddons()) do + if v.mounted and (v.tags:find("tool") or v.tags:find("Fun") or v.tags:find("Realism")) and not v.tags:find("map") and not v.tags:find("Weapon") and not v.tags:find("Model") then + addons = addons + 1 + end + + if v.mounted and shit[v.wsid] then + conflictlist.string = conflictlist.string .. v.title .. "\n" + end + end + + print(conflictlist.string) + + return addons +end + +local sealplead = Material("vgui/sealplead.png") +local lightlerp = Vector() + +local function Seal() + local ply = LocalPlayer() + local vpang = ply:GetViewPunchAngles() + local x = vpang.z + ply.ViewPunchAngle.z * 500 + local y = vpang.x + ply.ViewPunchAngle.x * 500 - 10 + local w = sealplead:Width() + local h = sealplead:Height() + local eyepos = EyePos() + local eyeang = EyeAngles() + + LocalPlayer():DrawViewModel(false) + render.RenderView({ + y = 0, + x = 0, + origin = eyepos, + angles = (-eyeang:Forward()):Angle(), + w = w, + h = h + }) + render.SetScissorRect(0, 0, w, h, true) + + local light = render.GetLightColor(eyepos) + col = lightlerp + local colx = col[1] + local coly = col[2] + local colz = col[3] + col[1] = Lerp(25 * FrameTime(), colx, light[1] * 500) + col[2] = Lerp(25 * FrameTime(), coly, light[2] * 500) + col[3] = Lerp(25 * FrameTime(), colz, light[3] * 500) + colz = col[3] + coly = col[2] + colx = col[1] + + surface.SetDrawColor(math.min(colx, 255), math.min(coly, 255), math.min(colz, 255), 255) + surface.SetMaterial(sealplead) + surface.DrawTexturedRectRotated(x + w * 0.5, y + h * 0.5, w + x, h + y + math.abs(math.sin(CurTime()) * 10), eyeang.z) + render.SetScissorRect(0, 0, 0, 0, false) + surface.SetFont("BeatrunHUD") + surface.SetTextPos(2, 0) + surface.SetTextColor(220, 20, 20, math.abs(math.sin(CurTime() * 2) * 255)) + surface.DrawText(REC .. " LIVE PLAYER CAM") + LocalPlayer():DrawViewModel(true) +end + +local function WarningIcon() + surface.SetMaterial(warning) + + if bigboy then + Seal() + + return + else + surface.SetDrawColor(15, 15, 15, 125) + end + + surface.DrawRect(0, 0, 33, 29) + surface.SetDrawColor(255, 255, 255, 125) + surface.DrawTexturedRect(0, 1, 32, 26) +end + +if CheckAddons() > 100 then + hook.Add("HUDPaint", "AddonWarning", WarningIcon) +else + hook.Remove("HUDPaint", "AddonWarning") +end + +if conflictlist.string ~= "" then + timer.Simple(0, function () + AEUI:AddPanel(warnpanel) + AEUI:AddPanel(conflictpanel) + end) +end diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/BodyAnim.lua b/beatrun/gamemodes/beatrun/gamemode/cl/BodyAnim.lua new file mode 100644 index 0000000..e6237e7 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/BodyAnim.lua @@ -0,0 +1,860 @@ +local playermodelbones = { + "ValveBiped.Bip01_R_Clavicle", + "ValveBiped.Bip01_R_UpperArm", + "ValveBiped.Bip01_R_Forearm", + "ValveBiped.Bip01_R_Hand", + "ValveBiped.Bip01_L_Clavicle", + "ValveBiped.Bip01_L_UpperArm", + "ValveBiped.Bip01_L_Forearm", + "ValveBiped.Bip01_L_Hand", + "ValveBiped.Bip01_L_Wrist", + "ValveBiped.Bip01_R_Wrist", + "ValveBiped.Bip01_L_Finger4", + "ValveBiped.Bip01_L_Finger41", + "ValveBiped.Bip01_L_Finger42", + "ValveBiped.Bip01_L_Finger3", + "ValveBiped.Bip01_L_Finger31", + "ValveBiped.Bip01_L_Finger32", + "ValveBiped.Bip01_L_Finger2", + "ValveBiped.Bip01_L_Finger21", + "ValveBiped.Bip01_L_Finger22", + "ValveBiped.Bip01_L_Finger1", + "ValveBiped.Bip01_L_Finger11", + "ValveBiped.Bip01_L_Finger12", + "ValveBiped.Bip01_L_Finger0", + "ValveBiped.Bip01_L_Finger01", + "ValveBiped.Bip01_L_Finger02", + "ValveBiped.Bip01_R_Finger4", + "ValveBiped.Bip01_R_Finger41", + "ValveBiped.Bip01_R_Finger42", + "ValveBiped.Bip01_R_Finger3", + "ValveBiped.Bip01_R_Finger31", + "ValveBiped.Bip01_R_Finger32", + "ValveBiped.Bip01_R_Finger2", + "ValveBiped.Bip01_R_Finger21", + "ValveBiped.Bip01_R_Finger22", + "ValveBiped.Bip01_R_Finger1", + "ValveBiped.Bip01_R_Finger11", + "ValveBiped.Bip01_R_Finger12", + "ValveBiped.Bip01_R_Finger0", + "ValveBiped.Bip01_R_Finger01", + "ValveBiped.Bip01_R_Finger02" +} +BodyAnim = BodyAnim or nil +BodyAnimMDL = BodyAnimMDL or nil +BodyAnimMDLarm = BodyAnimMDLarm or nil +BodyAnimWEPMDL = BodyAnimWEPMDL or nil +BodyAnimCycle = 0 +BodyAnimEyeAng = Angle(0, 0, 0) +BodyAnimString = "nil" +BodyAnimMDLString = "nil" +BodyAnimSpeed = 1 +bodyanimlastattachang = Angle(0, 0, 0) +followplayer = true +deleteonend = true +lockang = false +CamAddAng = false +CamIgnoreAng = false +local BodyAnimPos = Vector(0, 0, 0) +local BodyAnimAngLerp = Angle(0, 0, 0) +local DidDraw = false +local AnimString = "nil" +local angclosenuff = false +local savedeyeangb = Angle(0, 0, 0) +local bodylockview = false +local bodyanimdone = false +local holstertime = 0 +local animmodelstring = "" +local showweapon = false +local showvm = false +local usefullbody = false +local ignorez = false +local customcycle = false +deathanim = false +local allowmove = false +local allowedangchange = false +local attach, attachId, weapontoidle = nil +local smoothend = false +local endlerp = 0 +camoffset = Vector() +camjoint = "eyes" +BodyAnimCrouchLerp = 1 +BodyAnimCrouchLerpZ = 0 +BodyAnimLimitEase = false +CamShake = false +CamShakeAng = Angle() +CamShakeMult = 1 +local lastangy = 0 +viewtiltlerp = Angle() +ViewTiltAngle = Angle() +local BodyAnimStartPos = Vector() +local view = {} +local justremoved = false + +function RemoveBodyAnim(noang) + local shouldremove = hook.Run("BodyAnimPreRemove") + + if shouldremove then + return + end + + local ply = LocalPlayer() + local ang = ply:EyeAngles() + local newang = ply:EyeAngles() + local noang = noang or false + + if allowedangchange then + newang = view.angles + else + newang = BodyAnimEyeAng + end + + newang.z = 0 + + if IsValid(BodyAnim) then + hook.Run("BodyAnimRemove") + BodyAnim:SetNoDraw(true) + + if IsValid(BodyAnimMDL) then + BodyAnimMDL:SetRenderMode(RENDERMODE_NONE) + + if BodyAnimMDL.callback ~= nil then + BodyAnimMDL:RemoveCallback("BuildBonePositions", BodyAnimMDL.callback) + end + + BodyAnimMDL:Remove() + end + + if IsValid(BodyAnimMDLarm) then + BodyAnimMDLarm:Remove() + end + + if IsValid(BodyAnimWEPMDL) then + BodyAnimWEPMDL:Remove() + end + + if not noang then + ply:SetEyeAngles(newang) + end + + if not smoothend then + endlerp = 1 + end + + BodyAnim:Remove() + + justremoved = true + + ply:DrawViewModel(true) + + DidDraw = false + end + + local currentwep = ply:GetActiveWeapon() + local vm = ply:GetViewModel() + + if IsValid(currentwep) and currentwep:GetClass() ~= "runnerhands" then + if currentwep.PlayViewModelAnimation then + currentwep:PlayViewModelAnimation("Draw") + else + weapontoidle = currentwep + + currentwep:SendWeaponAnim(ACT_VM_DRAW) + timer.Simple(vm:SequenceDuration(vm:SelectWeightedSequence(ACT_VM_DRAW)), function () + if ply:GetActiveWeapon() == weapontoidle and weapontoidle:GetSequenceActivityName(weapontoidle:GetSequence()) == "ACT_VM_DRAW" then + weapontoidle:GetSequenceActivityName(weapontoidle:GetSequence()) + weapontoidle:SendWeaponAnim(ACT_VM_IDLE) + end + end) + end + end +end + +cachebody = {} +matrixfrom = {} +local transitionlerp = 0 +local transition = false +local matrixto = {} +local scalevec = Vector(1, 1, 1) +local matrixfrompos = Vector() +armbones = { + ["ValveBiped.Bip01_L_Finger0"] = true, + ["ValveBiped.Bip01_L_Finger02"] = true, + ["ValveBiped.Bip01_R_Finger3"] = true, + ["ValveBiped.Bip01_L_Finger42"] = true, + ["ValveBiped.Bip01_L_Finger32"] = true, + ["ValveBiped.Bip01_L_Finger41"] = true, + ["ValveBiped.Bip01_R_UpperArm"] = true, + ["ValveBiped.Bip01_L_Hand"] = true, + ["ValveBiped.Bip01_R_Finger4"] = true, + ["ValveBiped.Bip01_L_Finger4"] = true, + ["ValveBiped.Bip01_L_UpperArm"] = true, + ["ValveBiped.Bip01_R_Wrist"] = true, + ["ValveBiped.Bip01_L_Clavicle"] = true, + ["ValveBiped.Bip01_L_Forearm"] = true, + ["ValveBiped.Bip01_L_Finger1"] = true, + ["ValveBiped.Bip01_R_Finger41"] = true, + ["ValveBiped.Bip01_R_Hand"] = true, + ["ValveBiped.Bip01_L_Finger3"] = true, + ["ValveBiped.Bip01_R_Ulna"] = true, + ["ValveBiped.Bip01_L_Finger31"] = true, + ["ValveBiped.Bip01_L_Finger2"] = true, + ["ValveBiped.Bip01_R_Finger42"] = true, + ["ValveBiped.Bip01_R_Finger32"] = true, + ["ValveBiped.Bip01_L_Wrist"] = true, + ["ValveBiped.Bip01_R_Finger2"] = true, + ["ValveBiped.Bip01_R_Finger21"] = true, + ["ValveBiped.Bip01_R_Finger22"] = true, + ["ValveBiped.Bip01_R_Finger1"] = true, + ["ValveBiped.Bip01_L_Finger11"] = true, + ["ValveBiped.Bip01_R_Finger11"] = true, + ["ValveBiped.Bip01_R_Finger12"] = true, + ["ValveBiped.Bip01_R_Finger0"] = true, + ["ValveBiped.Bip01_R_Finger01"] = true, + ["ValveBiped.Bip01_L_Ulna"] = true, + ["ValveBiped.Bip01_L_Finger12"] = true, + ["ValveBiped.Bip01_R_Finger02"] = true, + ["ValveBiped.Bip01_R_Forearm"] = true, + ["ValveBiped.Bip01_L_Finger21"] = true, + ["ValveBiped.Bip01_L_Finger22"] = true, + ["ValveBiped.Bip01_L_Finger01"] = true, + ["ValveBiped.Bip01_R_Clavicle"] = true, + ["ValveBiped.Bip01_R_Finger31"] = true +} + +function CacheBodyAnim() + if not IsValid(BodyAnim) then + return + end + + local pos = LocalPlayer():GetPos() + + BodyAnim:SetupBones() + matrixfrompos:Set(LocalPlayer():GetPos()) + + for i = 0, BodyAnim:GetBoneCount() - 1 do + local m = BodyAnim:GetBoneMatrix(i) + + m:SetTranslation(m:GetTranslation() - pos) + + cachebody[i] = m + end + + matrixto = {} + transition = true + transitionlerp = 0 +end + +function CacheLerpBodyAnim() + if not LocalPlayer():Alive() then + transition = false + + return + end + + if transition and transitionlerp < 1 then + BodyAnim:SetupBones() + BodyAnimMDL:SetNoDraw(true) + + local pos = LocalPlayer():GetPos() + local posdelta = pos - matrixfrompos + local self = BodyAnim + self.m = self.m or Matrix() + local from = matrixfrom + local to = matrixto + + for bone = 0, self:GetBoneCount() - 1 do + if not armbones[BodyAnim:GetBoneName(bone)] then + if not to[bone] then + to[bone] = { + {}, + {}, + {} + } + end + + local ModelBoneMatrix = BodyAnim:GetBoneMatrix(bone) + + ModelBoneMatrix:SetTranslation(ModelBoneMatrix:GetTranslation()) + + from[bone] = cachebody[bone]:FastToTable(from[bone]) or from[bone] + to[bone] = to[bone] or ModelBoneMatrix:FastToTable(to[bone]) + local bonematrix = self:GetBoneMatrix(bone) + + bonematrix:SetTranslation(bonematrix:GetTranslation() - pos) + + to[bone] = bonematrix:FastToTable(to[bone]) + + for i = 1, 3 do + local from = from[bone][i] + local v = to[bone][i] + v[1] = LerpL(transitionlerp, from[1], v[1]) + v[2] = LerpL(transitionlerp, from[2], v[2]) + v[3] = LerpL(transitionlerp, from[3], v[3]) + v[4] = LerpL(transitionlerp, from[4], v[4]) + end + + if not self.m then + self.m = Matrix(to[bone]) + else + local bt = to[bone] + local bt1 = bt[1] + local bt2 = bt[2] + local bt3 = bt[3] + slot15 = bt[4] + + self.m:SetUnpacked(bt1[1], bt1[2], bt1[3], bt1[4], bt2[1], bt2[2], bt2[3], bt2[4], bt3[1], bt3[2], bt3[3], bt3[4], 0, 0, 0, 1) + end + + self.m:SetTranslation(self.m:GetTranslation() + pos) + self.m:SetScale(scalevec) + self:SetBoneMatrix(bone, self.m) + end + end + + transitionlerp = math.min(transitionlerp + FrameTime() * 4, 1) + elseif transition and transitionlerp >= 1 then + BodyAnimMDL:SetNoDraw(false) + end +end + +function StartBodyAnim(animtable) + local prestart = hook.Run("BodyAnimPreStart", animtable) + + if prestart then + return + end + + if IsValid(BodyAnim) and not justremoved then + return + end + + justremoved = false + local ply = LocalPlayer() + + if ply:InVehicle() then + return + end + + animmodelstring = animtable.animmodelstring + AnimString = animtable.AnimString + BodyAnimString = AnimString + BodyAnimSpeed = animtable.BodyAnimSpeed or 1 + BodyAnimMDLString = animmodelstring + BodyLimitX = animtable.BodyLimitX or 30 + BodyLimitY = animtable.BodyLimitY or 50 + CamIgnoreAng = animtable.CamIgnoreAng or false + smoothend = animtable.smoothend or false + camjoint = animtable.camjoint or "eyes" + usefullbody = animtable.usefullbody or 2 + deleteonend = animtable.deleteonend + followplayer = animtable.followplayer or false + lockang = animtable.lockang or false + allowmove = animtable.allowmove or false + ignorez = animtable.ignorez or false + deathanim = animtable.deathanim or false + customcycle = animtable.customcycle or false + showweapon = animtable.showweapon or false + showvm = animtable.showvm or false + ply.OrigEyeAng = ply:EyeAngles() + ply.OrigEyeAng.x = 0 + + if VMLegs and VMLegs:IsActive() then + VMLegs:Remove() + end + + if deleteonend == nil then + deleteonend = true + end + + if followplayer == nil then + followplayer = true + end + + hook.Add("CalcView", "BodyAnimCalcView2", BodyAnimCalcView2) + + BodyAnimAngLerp = ply:EyeAngles() + + if AnimString == nil or not ply:Alive() and not deathanim then + return + end + + savedeyeangb = Angle(0, 0, 0) + BodyAnim = ClientsideModel("models/" .. tostring(animmodelstring) .. ".mdl", RENDERGROUP_BOTH) + + BodyAnim:SetAngles(Angle(0, ply:EyeAngles().y, 0)) + BodyAnim:SetPos(ply:GetPos()) + BodyAnim:SetNoDraw(false) + BodyAnimStartPos:Set(BodyAnim:GetPos()) + + if not IsValid(ply:GetHands()) then + return + end + + local plymodel = ply + local playermodel = string.Replace(ply:GetModel(), "models/models/", "models/") + local handsmodel = string.Replace(ply:GetHands():GetModel(), "models/models/", "models/") + + if usefullbody == 2 then + BodyAnimMDL = ClientsideModel(playermodel, RENDERGROUP_BOTH) + + function BodyAnimMDL.GetPlayerColor() + return LocalPlayer():GetPlayerColor() + end + + BodyAnimMDL:SnatchModelInstance(ply) + + BodyAnimMDLarm = ClientsideModel(handsmodel, RENDERGROUP_BOTH) + + function BodyAnimMDLarm.GetPlayerColor() + return LocalPlayer():GetPlayerColor() + end + + BodyAnimMDLarm:SetLocalPos(Vector(0, 0, 0)) + BodyAnimMDLarm:SetLocalAngles(Angle(0, 0, 0)) + BodyAnimMDLarm:SetParent(BodyAnim) + BodyAnimMDLarm:AddEffects(EF_BONEMERGE) + + for num, _ in pairs(ply:GetHands():GetBodyGroups()) do + BodyAnimMDLarm:SetBodygroup(num - 1, ply:GetHands():GetBodygroup(num - 1)) + BodyAnimMDLarm:SetSkin(ply:GetHands():GetSkin()) + end + + for k, v in ipairs(playermodelbones) do + local plybone = BodyAnimMDL:LookupBone(v) + + if plybone then + BodyAnimMDL:ManipulateBoneScale(plybone, vector_origin) + end + end + + if not ply:ShouldDrawLocalPlayer() then + local head = BodyAnim:LookupBone("ValveBiped.Bip01_Head1") + + if head then + BodyAnim:ManipulateBoneScale(head, vector_origin) + end + end + elseif usefullbody == 1 then + BodyAnimMDL = ClientsideModel(playermodel, RENDERGROUP_BOTH) + else + BodyAnimMDL = ClientsideModel(string.Replace(handsmodel, "models/models/", "models/"), RENDERGROUP_BOTH) + + function BodyAnimMDL.GetPlayerColor() + return LocalPlayer():GetPlayerColor() + end + + plymodel = ply:GetHands() + end + + for num, _ in pairs(plymodel:GetBodyGroups()) do + BodyAnimMDL:SetBodygroup(num - 1, plymodel:GetBodygroup(num - 1)) + BodyAnimMDL:SetSkin(plymodel:GetSkin()) + end + + BodyAnimMDL:SetLocalPos(Vector(0, 0, 0)) + BodyAnimMDL:SetLocalAngles(Angle(0, 0, 0)) + BodyAnimMDL:SetParent(BodyAnim) + BodyAnimMDL:AddEffects(EF_BONEMERGE) + BodyAnim:SetSequence(AnimString) + + if tobool(showweapon) and IsValid(ply:GetActiveWeapon()) and ply:GetActiveWeapon():GetModel() ~= "" then + BodyAnimWEPMDL = ClientsideModel(ply:GetActiveWeapon():GetModel(), RENDERGROUP_BOTH) + + BodyAnimWEPMDL:SetPos(ply:GetPos()) + BodyAnimWEPMDL:SetAngles(Angle(0, EyeAngles().y, 0)) + BodyAnimWEPMDL:SetParent(BodyAnim) + BodyAnimWEPMDL:AddEffects(EF_BONEMERGE) + end + + if BodyAnimMDL:LookupBone("ValveBiped.Bip01_Head1") ~= nil and not ply:ShouldDrawLocalPlayer() then + BodyAnimMDL:ManipulateBoneScale(BodyAnimMDL:LookupBone("ValveBiped.Bip01_Head1"), Vector(0, 0, 0)) + end + + if not showvm then + ply:DrawViewModel(false) + end + + BodyAnimCycle = 0 + DidDraw = false + angclosenuff = false + + hook.Run("BodyAnimStart") +end + +hook.Add("Think", "BodyAnimThink", function () + if not IsValid(BodyAnim) then + return + end + + local ply = LocalPlayer() + + if not ply:Alive() and not deathanim then + RemoveBodyAnim() + + return + end + + BodyAnimCycle = BodyAnimCycle + FrameTime() / BodyAnim:SequenceDuration() * BodyAnimSpeed + + if not customcycle then + BodyAnim:SetCycle(BodyAnimCycle) + end + + hook.Run("BodyAnimThink") + + if deleteonend and not customcycle and BodyAnimCycle >= 1 then + RemoveBodyAnim() + end +end) + +local BodyAnimPosEase = Vector() +local BodyAnimPosEaseLerp = 1 + +function BodyAnimSetEase(pos) + BodyAnimPosEase:Set(pos) + + BodyAnimPosEaseLerp = 0 +end + +local lastattachpos = Vector(0, 0, 0) +local lastatt, savedatt = nil +local lerpchangeatt = 1 +local lastattdata = nil +local lerpedpos = Vector() +local lastlockang = false +local lastlockangstart = Angle() +local lasteyeang = Angle() +local lerpedang = Vector() + +function BodyAnimCalcView2(ply, pos, angles, fov) + if ply:InVehicle() then + RemoveBodyAnim() + + return + end + + if IsValid(BodyAnim) or attach ~= nil then + if IsValid(BodyAnim) then + if followplayer then + local pos = ply:GetPos() + + if BodyAnimCrouchLerp < 1 and (BodyAnimCrouchLerp ~= 0 or math.abs(BodyAnimCrouchLerpZ - pos.z) > 16 or math.abs(ply:GetNW2Float("BodyAnimCrouchLerpZ") - pos.z) > 16) then + if ply:OnGround() then + BodyAnimCrouchLerp = 1 + end + + if ply:Crouching() then + local from = BodyAnimCrouchLerpZ + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) and activewep:GetClass() == "runnerhands" then + from = ply:EyePos().z - 64 + end + + pos.z = Lerp(BodyAnimCrouchLerp, from, pos.z) + BodyAnimCrouchLerp = math.Approach(BodyAnimCrouchLerp, 1, FrameTime() * 5) + end + end + + if BodyAnimPosEaseLerp < 1 then + local easedpos = LerpVector(BodyAnimPosEaseLerp, BodyAnimPosEase, pos) + BodyAnimPosEaseLerp = math.Approach(BodyAnimPosEaseLerp, 1, FrameTime() * 5) + + BodyAnim:SetPos(easedpos) + BodyAnim:SetRenderOrigin(easedpos) + else + BodyAnim:SetPos(pos) + BodyAnim:SetRenderOrigin(pos) + end + elseif BodyAnimPosEaseLerp < 1 then + local easedpos = LerpVector(BodyAnimPosEaseLerp, BodyAnimPosEase, BodyAnimStartPos) + BodyAnimPosEaseLerp = math.Approach(BodyAnimPosEaseLerp, 1, FrameTime() * 5) + + BodyAnim:SetPos(easedpos) + BodyAnim:SetRenderOrigin(easedpos) + end + + local oldang = BodyAnim:GetAngles() + local eyeang = ply:EyeAngles() + eyeang.x = 0 + eyeang.z = 0 + + if CamIgnoreAng then + BodyAnim:SetAngles(eyeang) + end + + if lastatt and lastatt ~= camjoint then + savedatt = lastatt + lerpchangeatt = 0 + end + + local head = BodyAnim:LookupBone("ValveBiped.Bip01_Head1") + + if head then + BodyAnim:ManipulateBonePosition(head, vector_origin) + end + + attachId = BodyAnim:LookupAttachment(camjoint) + attach = BodyAnim:GetAttachment(attachId) or attach + + if lerpchangeatt < 1 then + local attachId = BodyAnim:LookupAttachment(savedatt) + lastattdata = BodyAnim:GetAttachment(attachId) or attach + lerpedpos = LerpVector(lerpchangeatt, lastattdata.Pos, attach.Pos) + lerpchangeatt = math.Approach(lerpchangeatt, 1, FrameTime() * 5) + end + + if not ply:ShouldDrawLocalPlayer() then + local head = BodyAnim:LookupBone("ValveBiped.Bip01_Head1") + + if head then + BodyAnim:ManipulateBonePosition(head, Vector(-1000, 0, 0)) + end + end + + BodyAnim:SetAngles(oldang) + end + + if attach ~= nil then + view.origin = attach.Pos + + if savedeyeangb == Angle(0, 0, 0) then + savedeyeangb = Angle(0, attach.Ang.y, 0) + end + + view.angles = ply:EyeAngles() + + if lockang2 then + view.angles = attach.Ang + view.angles.x = ply:EyeAngles().x + view.origin = attach.Pos + end + + allowedangchange = true + + if lockang ~= lastlockang then + lerplockang = 0 + lastlockang = lockang + + lastlockangstart:Set(lasteyeang) + end + + if ply:Alive() and lockang then + local attachId = BodyAnim:LookupAttachment(camjoint) + local attach = BodyAnim:GetAttachment(attachId) or attach + local ang = attach.Ang + + if lerplockang < 1 then + ang = LerpAngle(lerplockang, lastlockangstart, attach.Ang) + lerplockang = math.Approach(lerplockang, 1, FrameTime() * 4.5) + end + + view.angles = ang + + view.angles:Add(ViewTiltAngle) + + allowedangchange = false + local neweyeang = Angle(view.angles) + neweyeang.y = BodyAnim:GetAngles().y + neweyeang.z = 0 + + ply:SetEyeAngles(neweyeang) + end + + lasteyeang:Set(ply:EyeAngles()) + + local vm = ply:GetViewModel() + BodyAnimEyeAng = attach.Ang + BodyAnimPos = attach.Pos + lastattachpos = attach.Pos + bodyanimlastattachang = ply:EyeAngles() + view.pos = attach.Pos + + if not IsValid(BodyAnim) and endlerp < 1 then + endlerp = math.Approach(endlerp, 1, RealFrameTime() * 6) + attach.Pos = LerpVector(endlerp, attach.Pos, ply:EyePos()) + attach.Ang = LerpAngle(endlerp * 2, attach.Ang, ply:EyeAngles() + ply:GetViewPunchAngles() + ply:GetCLViewPunchAngles()) + + if IsValid(vm) then + vm:SetNoDraw(false) + end + elseif not IsValid(BodyAnim) and endlerp == 1 then + attach = nil + endlerp = 0 + + hook.Remove("CalcView", "BodyAnimCalcView2") + + if IsValid(vm) then + vm:SetNoDraw(false) + end + + return + end + + if not ply:ShouldDrawLocalPlayer() and not ply:InVehicle() then + local ang = ply:GetAngles() + local FT = RealFrameTime() + ang[1] = 0 + ang[3] = 0 + local MEAng = math.Truncate(ang.y, 2) + local target = not lockang and MEAng or ply.OrigEyeAng.y + viewtiltlerp.y = math.ApproachAngle(viewtiltlerp.y, target, FT * (1 + math.abs(math.AngleDifference(viewtiltlerp.y, target)) * 5)) + local MEAngDiff = math.AngleDifference(viewtiltlerp.y, not lockang and lastangy or ply.OrigEyeAng.y) * 0.15 + ViewTiltAngle = Angle(0, 0, MEAngDiff + viewtiltlerp.z) + + view.angles:Add(ViewTiltAngle) + ply:SetNoDraw(false) + view.angles:Add(ply:GetViewPunchAngles() + ply:GetCLViewPunchAngles()) + hook.Run("BodyAnimCalcView", view) + pos:Set(view.origin) + angles:Set(view.angles) + + if lerpchangeatt < 1 then + pos:Set(lerpedpos) + end + + camang = angles + campos = pos + lastatt = camjoint + + if CamShake then + CamShakeAng:Set(AngleRand() * 0.005 * CamShakeMult) + angles:Add(CamShakeAng) + end + + lastangy = ang.y + + hook.Run("CalcViewBA", ply, pos, angles) + + return + else + ply:SetNoDraw(true) + end + end + + if attach == nil or CurTime() < (mantletimer or 0) then + view.origin = lastattachpos + + pos:Set(lastattachpos) + + return + end + end +end + +hook.Add("CreateMove", "BodyLimitMove", function (cmd) + local ply = LocalPlayer() + + if IsValid(BodyAnimMDL) and not allowmove then + cmd:ClearButtons() + cmd:ClearMovement() + end +end) +hook.Add("PostDrawOpaqueRenderables", "IgnoreZBodyAnim", function (depth, sky) + if IsValid(BodyAnimMDL) then + CacheLerpBodyAnim() + + if ignorez then + cam.IgnoreZ(true) + BodyAnimMDL:DrawModel() + + local customarmdraw = hook.Run("BodyAnimDrawArm") + + if not customarmdraw and IsValid(BodyAnimMDLarm) then + BodyAnimMDLarm:DrawModel() + end + + cam.IgnoreZ(false) + end + end +end) + +local lasteyeang = Angle() +local lastlimitx = 0 +local lastlimity = 0 +local pastlimitx = false +local pastlimity = false + +hook.Add("CreateMove", "BodyAnim_Mouse", function (cmd) + local ply = LocalPlayer() + + if not lockang and IsValid(BodyAnim) then + local nang = cmd:GetViewAngles() + local oang = ply.OrigEyeAng + local limitx = BodyLimitX or 30 + local limity = BodyLimitY or 50 + pastlimitx = limitx < math.AngleDifference(nang.x, oang.x) + pastlimity = limity < math.abs(math.AngleDifference(nang.y, oang.y)) + + if limitx ~= lastlimitx and pastlimitx or limity ~= lastlimity and pastlimity then + BodyAnimLimitEase = true + end + + if pastlimitx then + local ang = nang + + if BodyAnimLimitEase then + ply:CLViewPunch(Angle(-0.2, 0, 0)) + + ang.x = math.Approach(ang.x, oang.x + limitx, FrameTime() * 125) + else + ang.x = oang.x + limitx + end + + cmd:SetViewAngles(ang) + elseif not pastlimity then + BodyAnimLimitEase = false + end + + if pastlimity then + local ang = ply:EyeAngles() + + if math.AngleDifference(nang.y, oang.y) < 0 then + if BodyAnimLimitEase then + ang.y = math.ApproachAngle(ang.y, oang.y - limity, FrameTime() * 300) + else + ang.y = oang.y - limity + end + elseif BodyAnimLimitEase then + ang.y = math.ApproachAngle(ang.y, oang.y + limity, FrameTime() * 300) + else + ang.y = oang.y + limity + end + + cmd:SetViewAngles(ang) + elseif not pastlimitx then + BodyAnimLimitEase = false + end + + lasteyeang = nang + lastlimity = BodyLimitY + lastlimitx = BodyLimitX + end +end) +hook.Add("InputMouseApply", "BodyAnim_Mouse", function (cmd) + local newvalues = false + + if lockang then + cmd:SetMouseX(0) + cmd:SetMouseY(0) + + return true + end + + if pastlimitx then + cmd:SetMouseY(0) + + newvalues = true + end + + if pastlimity then + cmd:SetMouseX(0) + + newvalues = true + end + + if newvalues then + return true + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/Breathing.lua b/beatrun/gamemodes/beatrun/gamemode/cl/Breathing.lua new file mode 100644 index 0000000..6550703 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/Breathing.lua @@ -0,0 +1,46 @@ +local stress = 0 +local breathin = true +nextbreath = 0 + +hook.Add("Tick", "BreathingLogic", function () + local ply = LocalPlayer() + + if not IsValid(ply) or not ply:Alive() or ply:WaterLevel() == 3 then + return + end + + local vel = ply:GetVelocity() + local CT = CurTime() + vel.z = 0 + vel = vel:Length() + + if (vel > 100 or ply:GetClimbing() ~= 0) and (ply:OnGround() or ply:GetWallrun() > 0) then + stress = stress + 0.2 + elseif ply:OnGround() then + stress = stress - 0.25 + elseif not breathin then + return + end + + stress = math.Clamp(stress, -50, 150) + + if stress == -50 and breathin then + return + end + + local breathtype = breathin and "In" or "Out" + local breathstring = stress > 50 and "Medium" or "Soft" + local breathstringdur = vel > 200 and "Short" or "Long" + local extradur = 0 + + if vel > 200 then + extradur = math.abs(stress / 150 - 1) * 0.25 + end + + if nextbreath < CT then + ply:FaithVO("Faith.Breath." .. breathstring .. breathstringdur .. breathtype) + + nextbreath = CT + (vel > 200 and 0.5 or 1.25 + math.random(0, 0.1)) + extradur + breathin = not breathin + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/BuildModeHUD.lua b/beatrun/gamemodes/beatrun/gamemode/cl/BuildModeHUD.lua new file mode 100644 index 0000000..6f821e9 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/BuildModeHUD.lua @@ -0,0 +1,247 @@ +local rtcache = {} +local rtmatcache = {} +local propspanel = { + w = 384, + h = 400 +} +propspanel.x = 1632 - propspanel.w * 0.5 +propspanel.y = 702 - propspanel.h * 0.5 +propspanel.bgcolor = Color(32, 32, 32) +propspanel.outlinecolor = Color(55, 55, 55) +propspanel.alpha = 0.9 +propspanel.elements = {} +local elementstogglepanel = { + w = 384, + h = 40 +} +elementstogglepanel.x = 1632 - elementstogglepanel.w * 0.5 +elementstogglepanel.y = 459 +elementstogglepanel.bgcolor = Color(32, 32, 32) +elementstogglepanel.outlinecolor = Color(55, 55, 55) +elementstogglepanel.alpha = 0.9 +elementstogglepanel.elements = {} +local bmbuttons = { + w = 190, + h = 100, + x = 1632 - propspanel.w * 0.5 +} +bmbuttons.y = 972 - bmbuttons.h * 0.5 +bmbuttons.bgcolor = Color(32, 32, 32) +bmbuttons.outlinecolor = Color(55, 55, 55) +bmbuttons.alpha = 0.45 +bmbuttons.elements = {} +local bminfo = { + w = 190, + h = 100, + x = 1634 +} +bminfo.y = 972 - bminfo.h * 0.5 +bminfo.bgcolor = Color(32, 32, 32) +bminfo.outlinecolor = Color(55, 55, 55) +bminfo.alpha = 0.45 +bminfo.elements = {} +local propspanel_elements = propspanel.elements +local EntitiesElements = {} + +local function infostring() + local p, y, r = BuildModeAngle:Unpack() + r = math.Round(r) + y = math.Round(y) + p = math.Round(p) + local a = "Index: " .. BuildModeIndex .. "\nSelected: " .. table.Count(buildmode_selected) .. "\nAngle: " .. p .. ", " .. y .. ", " .. r + + return a +end + +AEUI:AddText(bminfo, infostring, "AEUIDefault", bminfo.w / 2, bminfo.h / 2 - 20, true) + +local function BuildModeHUDButton(e) + buildmodeinputs[e.key](true) +end + +local function GreyButtons() + return table.Count(buildmode_selected) == 0 +end + +local function PanelElementsToggle(e) + local showingents = propspanel.elements == EntitiesElements + propspanel.elements = showingents and propspanel_elements or EntitiesElements + e.string = showingents and "Menu / Props" or "Menu / Entities" + propspanel.maxscroll = nil + propspanel.scroll = nil +end + +local b = AEUI:AddButton(bmbuttons, "Drag (G)", BuildModeHUDButton, "AEUIDefault", 2, 0, false) +b.key = KEY_G +b.greyed = GreyButtons +local b = AEUI:AddButton(bmbuttons, "Dupe (SHIFT+D)", BuildModeHUDButton, "AEUIDefault", 2, 25, false) +b.key = KEY_D +b.greyed = GreyButtons +local b = AEUI:AddButton(bmbuttons, "Delete (DEL/BCKSPC)", BuildModeHUDButton, "AEUIDefault", 2, 50, false) +b.key = KEY_DELETE +b.greyed = GreyButtons +local b = AEUI:AddButton(bmbuttons, "Highlight (T)", BuildModeHUDButton, "AEUIDefault", 2, 75, false) +b.key = KEY_T +b.greyed = GreyButtons + +AEUI:AddButton(elementstogglepanel, "Menu / Props", PanelElementsToggle, "AEUILarge", 192, 20, true) + +local dummy = ClientsideModel("models/hunter/blocks/cube025x025x025.mdl") + +dummy:SetNoDraw(true) + +function GenerateBuildModeRT(model) + if not rtcache[model] then + local texw = 64 + local texh = 64 + local tex = GetRenderTarget("BMRT-" .. model, texw, texh) + + render.PushFilterMag(TEXFILTER.ANISOTROPIC) + render.PushFilterMin(TEXFILTER.ANISOTROPIC) + render.PushRenderTarget(tex, 0, 0, texw, texh) + render.SuppressEngineLighting(true) + dummy:SetModel(model) + + local sicon = PositionSpawnIcon(dummy, vector_origin) + + cam.Start3D(sicon.origin, sicon.angles, sicon.fov) + render.Clear(0, 0, 0, 0) + render.ClearDepth() + render.SetWriteDepthToDestAlpha(false) + render.SetModelLighting(0, 4, 4, 4) + render.SetModelLighting(1, 2, 2, 2) + render.SetModelLighting(2, 2, 2, 2) + render.SetModelLighting(3, 4, 4, 4) + render.SetModelLighting(4, 3, 3, 3) + render.SetModelLighting(5, 4, 4, 4) + dummy:DrawModel() + cam.End3D() + render.PopRenderTarget() + render.PopFilterMag() + render.PopFilterMin() + render.SuppressEngineLighting(false) + + rtcache[model] = tex + local mat = CreateMaterial("BM-" .. model, "UnlitGeneric", { + ["$vertexcolor"] = 1, + ["$translucent"] = 1, + ["$vertexalpha"] = 1, + ["$basetexture"] = tex:GetName() + }) + rtmatcache[model] = mat + end + + return rtmatcache[model] +end + +local function BMPropClick(e) + BuildModeIndex = e.prop or 0 + + print(e.prop) + LocalPlayer():EmitSound("buttonclick.wav") + + if BuildModeIndex == 0 then + SafeRemoveEntity(GhostModel) + + return + end + + BuildModeCreateGhost() + GhostModel:SetModel(buildmode_props[BuildModeIndex] or buildmode_entmodels[BuildModeIndex]) + + PlaceStartPos = nil + PlaceEndPos = nil + PlaceAxisLock = 0 +end + +local img = AEUI:AddImage(propspanel, Material("vgui/empty.png"), BMPropClick, 0, 0, 64, 64) +img.prop = 0 +img.hover = "Select" +local row = 1 +local col = 0 + +for k, v in pairs(buildmode_props) do + local spawnicon = "spawnicons/" .. v:Left(-5) .. ".png" + + if file.Exists("materials/" .. spawnicon, "GAME") then + rtmatcache[v] = Material(spawnicon) + else + GenerateBuildModeRT(v) + end + + local img = AEUI:AddImage(propspanel, rtmatcache[v], BMPropClick, 64 * row, 64 * col, 64, 64) + img.prop = k + img.hover = v + row = row + 1 + + if row > 5 then + col = col + 1 + row = 0 + end +end + +local img = AEUI:AddImage(propspanel, Material("vgui/empty.png"), BMPropClick, 64 * row, 64 * col, 64, 64) +img.prop = 0 +img.hover = "Select" + +local function BuildModeElements() + propspanel.elements = EntitiesElements + + table.Empty(EntitiesElements) + + row = 1 + col = 0 + local img = AEUI:AddImage(propspanel, Material("vgui/empty.png"), BMPropClick, 0, 0, 64, 64) + img.prop = 0 + img.hover = "Select" + local buildmode_enticons = { + br_swingbar = Material("vgui/editor/swingbar.png"), + br_swingpipe = Material("vgui/editor/swingpipe.png"), + br_zipline = Material("vgui/editor/zipline.png"), + br_ladder = Material("vgui/editor/ladder.png"), + br_balance = Material("vgui/editor/balance.png"), + br_laser = Material("vgui/editor/laser.png"), + br_swingrope = Material("vgui/editor/swingrope.png"), + br_mat = Material("vgui/editor/mat.png"), + tt_cp = Material("vgui/editor/checkpoint.png") + } + local buildmode_entnames = { + br_zipline = "Zipline (SHIFT = 2-Way)" + } + local obsolete = Material("editor/obsolete") + + for k, v in pairs(buildmode_ents) do + local img = AEUI:AddImage(propspanel, buildmode_enticons[k] or obsolete, BMPropClick, 64 * row, 64 * col, 64, 64) + img.prop = k + img.hover = buildmode_entnames[k] or scripted_ents.GetMember(k, "PrintName") + row = row + 1 + + if row > 5 then + col = col + 1 + row = 0 + end + end + + propspanel.elements = propspanel_elements + + hook.Remove("InitPostEntity", "BuildModeElements") +end + +BuildModeElements() +hook.Add("InitPostEntity", "BuildModeElements", BuildModeElements) + +local function BMPanel(state) + if state then + AEUI:AddPanel(elementstogglepanel) + AEUI:AddPanel(propspanel) + AEUI:AddPanel(bmbuttons) + AEUI:AddPanel(bminfo) + else + AEUI:RemovePanel(elementstogglepanel) + AEUI:RemovePanel(propspanel) + AEUI:RemovePanel(bmbuttons) + AEUI:RemovePanel(bminfo) + end +end + +hook.Add("BuildModeState", "BMPanel", BMPanel) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/CA.lua b/beatrun/gamemodes/beatrun/gamemode/cl/CA.lua new file mode 100644 index 0000000..f320f32 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/CA.lua @@ -0,0 +1,213 @@ +local rx = 0 +local gx = 0 +local bx = 0 +local ry = 0 +local gy = 0 +local by = 0 +local black = Material("vgui/black") +local ca_r = CreateMaterial("ca_r", "UnlitGeneric", { + ["$ignorez"] = 1, + ["$basetexture"] = "vgui/black", + ["$additive"] = 1, + ["$color2"] = "[1 0 0]" +}) +local ca_g = CreateMaterial("ca_g", "UnlitGeneric", { + ["$ignorez"] = 1, + ["$basetexture"] = "vgui/black", + ["$additive"] = 1, + ["$color2"] = "[0 1 0]" +}) +local ca_b = CreateMaterial("ca_b", "UnlitGeneric", { + ["$ignorez"] = 1, + ["$basetexture"] = "vgui/black", + ["$additive"] = 1, + ["$color2"] = "[0 0 1]" +}) +local zoom = Material("vgui/zoom.vtf") + +local function CA(rx, gx, bx, ry, gy, by) + render.UpdateScreenEffectTexture() + + local screentx = render.GetScreenEffectTexture() + + ca_r:SetTexture("$basetexture", screentx) + ca_g:SetTexture("$basetexture", screentx) + ca_b:SetTexture("$basetexture", screentx) + render.SetMaterial(black) + render.DrawScreenQuad() + render.SetMaterial(ca_r) + render.DrawScreenQuadEx(-rx / 2, -ry / 2, ScrW() + rx, ScrH() + ry) + render.SetMaterial(ca_g) + render.DrawScreenQuadEx(-gx / 2, -gy / 2, ScrW() + gx, ScrH() + gy) + render.SetMaterial(ca_b) + render.DrawScreenQuadEx(-bx / 2, -by / 2, ScrW() + bx, ScrH() + by) +end + +function RenderCA() + rx = 10 + ry = 10 + gx = 10 * (GlitchIntensity * 5 or 1) + gy = 10 * (GlitchIntensity * 5 or 1) + bx = 2 * (GlitchIntensity * 5 or 1) + by = 2 * (GlitchIntensity * 5 or 1) + + CA(rx, gx, bx, ry, gy, by) + + local gi = math.max(1, GlitchIntensity * 4) + + DrawMotionBlur(0.25, 0.75 * GlitchIntensity, 0.005) + DrawBloom(0, 0.5, 0.1 * gi, 0.1 * gi, 1, 1, 1, 1, 1) +end + +surface.CreateFont("DaisyHUDSmall", { + shadow = true, + blursize = 0, + underline = false, + rotary = false, + strikeout = false, + additive = false, + antialias = false, + extended = false, + scanlines = 2, + font = "x14y24pxHeadUpDaisy", + italic = false, + outline = false, + symbol = false, + weight = 500, + size = ScreenScale(6) +}) + +local deletiontable = {} +local deletiontime = 0 +local deletiontypetime = 0 +local deletiontype = 0 +deletionentry = 0 +local garble = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!\"#$%&()*+,-./:;<=>?@[]^_`{|}~" +local garblelen = #garble +local deletionrare = false +local deletionraretbl = { + "...", + "Kc7bUS7z", + "817" +} +local deletioncredits = { + "Beatrun", + " ", + " ", + "Programming", + "| datae", + " ", + " ", + "Various assets & concepts", + "| Mirror's Edge (EA)", + "| Tetris Effect (Resonair)", + "| Dying Light (Techland)", + " ", + " ", + "Credits music", + "| \"Sunrise\" from OneShot", + " ", + " ", + "Special thanks to", + "", + " ", + " ", + " ", + " ", + " ", + "Get the fuck out of the credits this part of the mod isnt finished" +} +incredits = false +local deletionstring = "" +local deletionlen = 0 + +function DrawDeletionText() + surface.SetFont("DaisyHUDSmall") + + local oldgi = GlitchIntensity + + if incredits then + GlitchIntensity = math.max(0.15, GlitchIntensity) + end + + local deletionstringc = deletionstring:Left(deletiontype) + + if deletiontypetime < CurTime() then + deletiontype = deletiontype + 1 + deletiontypetime = CurTime() + ((deletionrare or incredits) and 0.125 or 0.025) + end + + if deletionlen < deletiontype then + deletionrare = math.random() <= 0.01 + + if incredits then + deletioncredits[19] = LocalPlayer():SteamID() or "Someone..?" + + if deletionentry + 1 > #deletioncredits then + blindpopulatespeed = 150 + blindfakepopulate = true + vanishlimit = 100 + + return + end + + deletionstring = deletioncredits[deletionentry + 1] + else + deletionstring = not deletionrare and "Deleting /usr/fragments/mem" .. deletionentry .. ".dat" or deletionraretbl[math.random(#deletionraretbl)] + end + + deletionlen = #deletionstring + deletionrare = deletionrare + deletiontype = 0 + deletionentry = deletionentry + 1 + + table.insert(deletiontable, deletionstringc) + + if #deletiontable >= 6 then + table.remove(deletiontable, 1) + end + end + + local tw, th = surface.GetTextSize(deletionstringc) + + cam.Start2D() + + local num = 0 + local ply = LocalPlayer() + local vp = ply:GetViewPunchAngles() + local vpcl = ply.ViewPunchAngle or angle_zero + + vp:Add(vpcl) + + local GlitchIntensity = incredits and 2 or GlitchIntensity + + surface.SetTextColor(255, 255, 255, 2.5 * (num + 1) * GlitchIntensity) + + for k, v in ipairs(deletiontable) do + surface.SetTextColor(255, 255, 255, 2.5 * k * GlitchIntensity) + + local text = v + + for i = 1, 4 do + local index = math.random(1, #text) + + if text[index] ~= " " then + text = text:SetChar(index, garble[math.random(1, garblelen)]) + end + end + + surface.SetTextPos(ScrW() * 0.01 + vp.x, ScrH() * 0.05 + (k - 1) * th + vp.y) + surface.DrawText(text) + + num = k + end + + if deletiontype > 0 then + surface.SetTextPos(ScrW() * 0.01 + vp.x, ScrH() * 0.05 + num * th + vp.y) + surface.DrawText(deletionstringc) + end + + cam.End2D() + + GlitchIntensity = oldgi +end diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/Death.lua b/beatrun/gamemodes/beatrun/gamemode/cl/Death.lua new file mode 100644 index 0000000..d7cc712 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/Death.lua @@ -0,0 +1,5 @@ +net.Receive("DeathStopSound", function () + if not blinded then + RunConsoleCommand("stopsound") + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/DebugInfo.lua b/beatrun/gamemodes/beatrun/gamemode/cl/DebugInfo.lua new file mode 100644 index 0000000..9f07088 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/DebugInfo.lua @@ -0,0 +1,121 @@ +surface.CreateFont("BeatrunDebug", { + shadow = false, + blursize = 0, + underline = false, + rotary = false, + strikeout = false, + additive = false, + antialias = false, + extended = false, + scanlines = 0, + font = "ProFontWindows", + italic = false, + outline = false, + symbol = false, + weight = 50, + size = ScreenScale(6) +}) + +local color_red = Color(220, 20, 20) +local startx = 0.2 +local starty = 0.75 +local debugdata = { + "BodyAnim", + "BodyAnimCycle", + "BodyAnimString", + "campos", + "camang" +} +local debugdata2 = { + "BodyAnimArmCopy", + "TraceCount" +} +local debugoffset = { + 0, + 0, + 0 +} +local debuglist = { + debugdata, + debugdata2 +} +TraceLine_o = TraceLine_o or util.TraceLine +local TraceLine_o = TraceLine_o +local traces = {} +TraceCount = 0 + +function TraceLine_d(data) + local result = TraceLine_o(data) + + table.insert(traces, { + Vector(data.start), + Vector(data.endpos), + result.Hit and color_red or color_white + }) + + return result +end + +local function DrawDebugInfo() + local sx = ScrW() * startx + local sy = ScrH() * starty + local htw = 0 + + surface.SetFont("BeatrunDebug") + surface.SetTextPos(sx, sy) + surface.SetTextColor(255, 255, 255) + + for num, tbl in ipairs(debuglist) do + htw = 0 + + for k, v in ipairs(tbl) do + local value = _G[v] + + if isnumber(value) then + value = math.Round(value, 4) + end + + local text = v .. ": " .. tostring(value) + local tw, th = surface.GetTextSize(text) + debugoffset[num + 1] = debugoffset[num + 1] < tw and tw or debugoffset[num + 1] + + surface.SetTextPos(sx + debugoffset[num], sy + th * k) + surface.DrawText(text) + end + end +end + +local function RenderTraces() + cam.Start3D() + + for k, v in ipairs(traces) do + render.DrawLine(v[1], v[2], v[3], true) + end + + cam.End3D() + + TraceCount = #traces + + table.Empty(traces) +end + +local debugging = false + +concommand.Add("Beatrun_DebugToggle", function () + debugging = not debugging + + if debugging then + hook.Add("HUDPaint", "DrawDebugInfo", DrawDebugInfo) + hook.Add("PostRender", "RenderTraces", RenderTraces) + + function GAMEMODE.HUDDrawTargetID() + end + + util.TraceLine = TraceLine_d + else + hook.Remove("HUDPaint", "DrawDebugInfo") + hook.Remove("PostRender", "RenderTraces") + + util.TraceLine = TraceLine_o + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/Disarm.lua b/beatrun/gamemodes/beatrun/gamemode/cl/Disarm.lua new file mode 100644 index 0000000..0ecd49b --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/Disarm.lua @@ -0,0 +1,296 @@ +valvebiped = { + "ValveBiped.Bip01_Pelvis", + "ValveBiped.Bip01_Spine", + "ValveBiped.Bip01_Spine1", + "ValveBiped.Bip01_Spine2", + "ValveBiped.Bip01_Spine4", + "ValveBiped.Bip01_Neck1", + "ValveBiped.Bip01_Head1", + "ValveBiped.forward", + "ValveBiped.Bip01_R_Clavicle", + "ValveBiped.Bip01_R_UpperArm", + "ValveBiped.Bip01_R_Forearm", + "ValveBiped.Bip01_R_Hand", + "ValveBiped.Anim_Attachment_RH", + "ValveBiped.Bip01_R_Finger4", + "ValveBiped.Bip01_R_Finger41", + "ValveBiped.Bip01_R_Finger42", + "ValveBiped.Bip01_R_Finger3", + "ValveBiped.Bip01_R_Finger31", + "ValveBiped.Bip01_R_Finger32", + "ValveBiped.Bip01_R_Finger2", + "ValveBiped.Bip01_R_Finger21", + "ValveBiped.Bip01_R_Finger22", + "ValveBiped.Bip01_R_Finger1", + "ValveBiped.Bip01_R_Finger11", + "ValveBiped.Bip01_R_Finger12", + "ValveBiped.Bip01_R_Finger0", + "ValveBiped.Bip01_R_Finger01", + "ValveBiped.Bip01_R_Finger02", + "ValveBiped.Bip01_R_Ulna", + "ValveBiped.Bip01_R_Wrist", + "ValveBiped.Bip01_R_Elbow", + "ValveBiped.Bip01_R_Bicep", + "ValveBiped.Bip01_R_Shoulder", + "ValveBiped.Bip01_R_Trapezius", + "ValveBiped.Bip01_L_Clavicle", + "ValveBiped.Bip01_L_UpperArm", + "ValveBiped.Bip01_L_Forearm", + "ValveBiped.Bip01_L_Hand", + "ValveBiped.Anim_Attachment_LH", + "ValveBiped.Bip01_L_Finger4", + "ValveBiped.Bip01_L_Finger41", + "ValveBiped.Bip01_L_Finger42", + "ValveBiped.Bip01_L_Finger3", + "ValveBiped.Bip01_L_Finger31", + "ValveBiped.Bip01_L_Finger32", + "ValveBiped.Bip01_L_Finger2", + "ValveBiped.Bip01_L_Finger21", + "ValveBiped.Bip01_L_Finger22", + "ValveBiped.Bip01_L_Finger1", + "ValveBiped.Bip01_L_Finger11", + "ValveBiped.Bip01_L_Finger12", + "ValveBiped.Bip01_L_Finger0", + "ValveBiped.Bip01_L_Finger01", + "ValveBiped.Bip01_L_Finger02", + "ValveBiped.Bip01_L_Ulna", + "ValveBiped.Bip01_L_Wrist", + "ValveBiped.Bip01_L_Elbow", + "ValveBiped.Bip01_L_Bicep", + "ValveBiped.Bip01_L_Shoulder", + "ValveBiped.Bip01_L_Trapezius", + "ValveBiped.Bip01_R_Thigh", + "ValveBiped.Bip01_R_Calf", + "ValveBiped.Bip01_R_Foot", + "ValveBiped.Bip01_R_Toe0", + "ValveBiped.Bip01_L_Thigh", + "ValveBiped.Bip01_L_Calf", + "ValveBiped.Bip01_L_Foot", + "ValveBiped.Bip01_L_Toe0", + "ValveBiped.Bip01_L_Pectoral", + "ValveBiped.Bip01_R_Pectoral", + "ValveBiped.Cod", + "j_ringpalm_L", + "j_pinkypalm_L", + "j_ringpalm_ri", + "j_pinkypalm_ri" +} +local scalevec = Vector(1, 1, 1) + +local function Disarm_Render(self) + if not IsValid(self) or not IsValid(self.ModelBM) or not IsValid(self.Victim) then + return + end + + local owner = self.Victim + + self:SetupBones() + self.ModelBM:SetupBones() + owner:SetupBones() + + if owner.DisarmNoDraw then + owner:SetNoDraw(true) + end + + for k, v in ipairs(valvebiped) do + local lookbone = self.ModelBM:LookupBone(valvebiped[k]) + + if lookbone then + self.GhostMatrix = self.ModelBM:GetBoneMatrix(lookbone) + local ModelBone = owner:LookupBone(v) + local GhostBone = self.ModelBM:LookupBone(v) + + if GhostBone ~= nil and ModelBone ~= nil then + local ModelBoneMatrix = nil + ModelBoneMatrix = owner:GetBoneMatrix(ModelBone) + + if ModelBoneMatrix ~= nil then + self.bonematrixtablefrom[lookbone] = self.GhostMatrix:FastToTable(self.bonematrixtablefrom[lookbone]) or self.bonematrixtablefrom[lookbone] + self.bonematrixtableto[lookbone] = self.bonematrixtableto[lookbone] or ModelBoneMatrix:FastToTable(self.bonematrixtableto[lookbone]) + local blerpvalue = self.bonelerpvalue + + for i = 1, 3 do + local from = self.bonematrixtablefrom[lookbone][i] + local v = self.bonematrixtableto[lookbone][i] + v[1] = LerpL(blerpvalue, v[1], from[1]) + v[2] = LerpL(blerpvalue, v[2], from[2]) + v[3] = LerpL(blerpvalue, v[3], from[3]) + v[4] = LerpL(blerpvalue, v[4], from[4]) + end + + if not self.m then + self.m = Matrix(self.bonematrixtableto[lookbone]) + else + local bt = self.bonematrixtableto[lookbone] + local bt1 = bt[1] + local bt2 = bt[2] + local bt3 = bt[3] + slot16 = bt[4] + + self.m:SetUnpacked(bt1[1], bt1[2], bt1[3], bt1[4], bt2[1], bt2[2], bt2[3], bt2[4], bt3[1], bt3[2], bt3[3], bt3[4], 0, 0, 0, 1) + end + + self.m:SetScale(scalevec) + self.ModelBM:SetBoneMatrix(GhostBone, self.m) + end + end + end + end + + local cycle = self:GetCycle() + + if cycle then + self.bonelerpvalue = math.Clamp(self.bonelerpvalue + FrameTime() * (0.1 + self:GetCycle() * 2), 0, 1) + end +end + +function Disarm_CleanUp() + local ply = LocalPlayer() + + if ply.DisarmVictim then + ply.DisarmVictim:Remove() + end + + if ply.DisarmVictimMDL then + ply.DisarmVictimMDL:Remove() + end + + hook.Remove("Think", "Disarm_Think") +end + +function Disarm_Think() + local ba = IsValid(BodyAnim) + + if ba then + local victimanim = LocalPlayer().DisarmVictim + + victimanim:SetPos(BodyAnim:GetPos()) + victimanim:SetAngles(BodyAnim:GetAngles()) + victimanim:SetCycle(BodyAnimCycle) + end + + if not ba or BodyAnimCycle >= 1 then + Disarm_CleanUp() + end +end + +function Disarm_BlockMove(cmd) + cmd:SetForwardMove(0) + cmd:SetSideMove(0) + cmd:SetUpMove(0) + cmd:SetButtons(0) + + if BodyAnimCycle > 0 and not lockang or not LocalPlayer():Alive() or LocalPlayer().DisarmForcedEnd < CurTime() then + hook.Remove("CreateMove", "Disarm_BlockMove") + end +end + +function Disarm_Init(victim) + if not IsValid(victim) then + return + end + + local ply = LocalPlayer() + + Disarm_CleanUp() + + local eyeang = ply:EyeAngles() + eyeang.x = 0 + eyeang.z = 0 + + ParkourEvent("disarmscar", ply, true) + + ply.OrigEyeAng = eyeang + + BodyAnim:SetAngles(eyeang) + + victim.InDisarm = true + ply.DisarmForcedEnd = CurTime() + 4 + ply.DisarmVictim = ClientsideModel("models/disarmvictim.mdl") + ply.DisarmVictimMDL = ClientsideModel(victim:GetModel()) + local victimanim = ply.DisarmVictim + local victimMDL = ply.DisarmVictimMDL + victimanim.bonelerpvalue = 0 + + victimanim:SetSequence("snatchscar") + + victimanim.ModelBM = victimMDL + victimanim.bonematrixtablefrom = {} + victimanim.bonematrixtableto = {} + victimanim.Victim = victim + + victimMDL:SetParent(victimanim) + victimMDL:AddEffects(EF_BONEMERGE) + victimMDL:SnatchModelInstance(victim) + victimMDL:SetSkin(victim:GetSkin() or 0) + + for i = 0, victimMDL:GetNumBodyGroups() do + local bodyg = victim:GetBodygroup(i) + + victimMDL:SetBodygroup(i, bodyg) + end + + hook.Add("Think", "Disarm_Think", Disarm_Think) + hook.Add("CreateMove", "Disarm_BlockMove", Disarm_BlockMove) + + victimanim.RenderOverride = Disarm_Render + + timer.Simple(0.001, function () + victim.DisarmNoDraw = true + + victim:SetNoDraw(true) + end) +end + +net.Receive("DisarmStart", function () + Disarm_Init(net.ReadEntity()) +end) +hook.Add("CreateClientsideRagdoll", "Disarm_Ragdoll", function (ent, oldrag) + if ent.InDisarm then + local ply = LocalPlayer() + local victimanim = ply.DisarmVictim + local rag = ClientsideRagdoll(ent:GetModel()) + + rag:SetNoDraw(false) + rag:SetRenderMode(RENDERMODE_NORMAL) + rag:DrawShadow(true) + rag:SnatchModelInstance(oldrag) + rag:SetSkin(oldrag:GetSkin() or 0) + + for i = 0, rag:GetNumBodyGroups() do + local bodyg = oldrag:GetBodygroup(i) + + rag:SetBodygroup(i, bodyg) + end + + local vel = Vector() + local num = rag:GetPhysicsObjectCount() - 1 + + for i = 0, num do + local bone = rag:GetPhysicsObjectNum(i) + + if IsValid(bone) then + local lookup = victimanim:LookupBone(rag:GetBoneName(rag:TranslatePhysBoneToBone(i))) + + if lookup then + local bp, ba = victimanim:GetBonePosition(lookup) + + if bp and ba then + bone:SetPos(bp) + bone:SetAngles(ba) + end + end + end + end + + oldrag:Remove() + timer.Simple(30, function () + if IsValid(rag) then + rag:SetSaveValue("m_bFadingOut", true) + end + end) + timer.Simple(0, function () + Disarm_CleanUp() + end) + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/Fall.lua b/beatrun/gamemodes/beatrun/gamemode/cl/Fall.lua new file mode 100644 index 0000000..0974cfc --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/Fall.lua @@ -0,0 +1,82 @@ +sound.Add( { + name = "FallStatic", + channel = CHAN_STATIC, + volume = 1, + level = 80, + pitch = 100, + sound = "MirrorsEdge/FallStatic.wav" +} ) + +local zoom = Material("vgui/zoom.vtf") + +local nextbeat = 0 +local beatvol = 0.3 +local blurpass = 0 + +local vignettealpha = 0 +local function FallCheck() + local ply = LocalPlayer() + if !IsValid(ply) then return end + local speed = ply:GetVelocity().z + if !ply.FallStatic and speed <= -800 and ply:GetMoveType()!=MOVETYPE_NOCLIP then + ply:EmitSound("FallStatic") + ply.FallStatic = true + nextbeat = CurTime()+0.5 + beatvol = 0.3 + blurpass = 0 + vignettealpha = 0 + CamShake = true + CamShakeMult = 0 + if !ply:GetJumpTurn() then + ParkourEvent("falluncontrolled", ply, true) + end + elseif ply.FallStatic and speed > -800 then + ply:SetFOV(ply:GetInfoNum("Beatrun_FOV", 120)) + ply:StopSound("FallStatic") + ply.FallStatic = false + CamShake = false + ParkourEvent("fallrecover", ply, true) + end +end + +hook.Add("Tick", "FallCheck", FallCheck) + +local function FallEffect() + local ply = LocalPlayer() + if ply.FallStatic then + local vel = math.abs(ply:GetVelocity().z)/1400 + local csm = CamShakeMult + -- DrawMotionBlur( 0.4, 0.8, 0.015*vel ) + CamShakeMult = math.Approach(csm, 3, FrameTime()*1.5) + DrawMaterialOverlay( "effects/fall_warp", CamShakeMult*0.025 ) + if blurpass >= 1 then + -- DrawToyTown(math.Truncate(blurpass), ScrH()*blurpass) + end + if CurTime() > nextbeat then + nextbeat = CurTime() + math.Clamp(0.5 / vel, 0.3, 0.5) + ply:EmitSound("heartbeat_beat_0"..math.random(1,8)..".wav", 80, 100, beatvol) + beatvol = math.min(beatvol+0.05, 1) + blurpass = math.min(blurpass+0.1, 10) + end + + ply:SetFOV(ply:GetInfoNum("Beatrun_FOV", 120)+math.Rand(0, CamShakeMult*2.5)) + end +end +hook.Add("RenderScreenspaceEffects", "FallEffect", FallEffect) + +hook.Add("HUDPaint", "FallVignette", function() + if !LocalPlayer().FallStatic then return end + vignettealpha = math.min(255, vignettealpha+(FrameTime()*100)) + surface.SetMaterial(zoom) + surface.SetDrawColor(255,255,255,vignettealpha) + surface.DrawTexturedRect(0,0,ScrW(),ScrH()) + surface.DrawTexturedRectRotated(ScrW()*0.5,ScrH()*0.5,ScrW(),ScrH(),180) +end) + +hook.Add("InputMouseApply", "FallLock", function(cmd, x, y, ang) + if LocalPlayer().FallStatic then + cmd:SetMouseX(0) + cmd:SetMouseY(0) + return true + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/HUD.lua b/beatrun/gamemodes/beatrun/gamemode/cl/HUD.lua new file mode 100644 index 0000000..7da4fb8 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/HUD.lua @@ -0,0 +1,531 @@ +local showtotalXP = CreateClientConVar("Beatrun_HUDXP", "1", true, false, "Show total XP near nickname", 0, 1) +local sway = CreateClientConVar("Beatrun_HUDSway", "1", true, false, "Display HUD swaying", 0, 1) +local dynamic = CreateClientConVar("Beatrun_HUDDynamic", "0", true, false, "Hide HUD when moving", 0, 1) +local hidden = CreateClientConVar("Beatrun_HUDHidden", "0", true, false, "Hides most of the XP HUD", 0, 2) +local reticle = CreateClientConVar("Beatrun_HUDReticle", "1", true, false, "Display a reticle", 0, 1) +local packetloss = Material("vgui/packetloss.png") +local lastloss = 0 +local MELogo = Material("vgui/MELogo.png", "mips smooth") +local hide = { + CHudBattery = true, + CHudHealth = true, + CHudDamageIndicator = true +} + +hook.Add("HUDShouldDraw", "BeatrunHUDHide", function (name) + if hide[name] then + return false + end +end) + +local color = 1 +local tab = { + ["$pp_colour_contrast"] = 1, + ["$pp_colour_addg"] = 0, + ["$pp_colour_addb"] = 0, + ["$pp_colour_addr"] = 0, + ["$pp_colour_brightness"] = 0, + ["$pp_colour_mulg"] = 0, + ["$pp_colour_mulb"] = 0, + ["$pp_colour_mulr"] = 0, + ["$pp_colour_colour"] = color +} + +hook.Add("RenderScreenspaceEffects", "BeatrunNoclipBW", function () + if render.GetDXLevel() < 90 then + return + end + + local ply = LocalPlayer() + local inp = color ~= 1 + local noclipping = ply:GetMoveType() == MOVETYPE_NOCLIP and not BuildMode and ply:GetMantle() == 0 and ply:GetClimbing() == 0 and not IsValid(ply:GetLadder()) + + if noclipping or inp then + tab["$pp_colour_colour"] = color + + DrawColorModify(tab) + end + + if noclipping then + color = math.Approach(color, 0.5, RealFrameTime()) + elseif inp then + color = math.Approach(color, 1, RealFrameTime() * 2) + end + + if LocalPlayer():Health() < 100 then + tab["$pp_colour_colour"] = math.max(LocalPlayer():Health() / LocalPlayer():GetMaxHealth(), 0) + + DrawColorModify(tab) + end +end) +surface.CreateFont("BeatrunHUD", { + shadow = true, + blursize = 0, + underline = false, + rotary = false, + strikeout = false, + additive = false, + antialias = false, + extended = false, + scanlines = 2, + font = "x14y24pxHeadUpDaisy", + italic = false, + outline = false, + symbol = false, + weight = 500, + size = ScreenScale(7) +}) +surface.CreateFont("BeatrunHUDSmall", { + shadow = true, + blursize = 0, + underline = false, + rotary = false, + strikeout = false, + additive = false, + antialias = false, + extended = false, + scanlines = 2, + font = "x14y24pxHeadUpDaisy", + italic = false, + outline = false, + symbol = false, + weight = 500, + size = ScreenScale(6) +}) + +local blur = Material("pp/blurscreen") + +local function DrawBlurRect(x, y, w, h, a) + if render.GetDXLevel() < 90 then + return + end + + local X = 0 + local Y = 0 + + surface.SetDrawColor(255, 255, 255, a) + surface.SetMaterial(blur) + + for i = 1, 2 do + blur:SetFloat("$blur", i / 3 * 5) + blur:Recompute() + render.UpdateScreenEffectTexture() + render.SetScissorRect(x, y, x + w, y + h, true) + surface.DrawTexturedRect(X * -1, Y * -1, ScrW(), ScrH()) + render.SetScissorRect(0, 0, 0, 0, false) + end +end + +local hidealpha = 0 + +local function BeatrunHUD() + local ply = LocalPlayer() + local scrw = ScrW() + local scrh = ScrH() + + surface.SetFont("DebugFixedSmall") + + local vtext = VERSIONGLOBAL + local tw, th = surface.GetTextSize(vtext) + + surface.SetTextColor(255, 255, 255, 15) + surface.SetTextPos(scrw - tw, 0) + surface.DrawText(vtext) + surface.SetFont("BeatrunHUD") + + local pl = ply:GetNW2Int("PLoss") + local CT = CurTime() + + if pl > 10 or CT < lastloss then + local alpha = math.Clamp(math.abs(math.sin(CurTime() * 4) * 255), 25, 255) + + surface.SetDrawColor(255, 255, 255, alpha) + surface.SetMaterial(packetloss) + surface.DrawTexturedRect(5, 5, 58.75, 41.75) + surface.SetTextPos(65, 20) + surface.SetTextColor(255, 195, 90, alpha) + surface.DrawText(pl) + + if pl > 10 then + lastloss = CT + 4 + end + end + + if BuildMode then + return + end + + if hidden:GetInt() > 1 then + return + end + + local shoulddraw = hook.Run("BeatrunDrawHUD") + + if shoulddraw == false then + return + end + + local vp = ply:GetViewPunchAngles() + + if not sway:GetBool() then + vp.x = 0 + vp.z = 0 + end + + local coursename = nil + local customname = hook.Run("BeatrunHUDCourse") + coursename = customname and customname or Course_Name ~= "" and Course_Name or "Freeplay" + local lastxp = ply.LastXP or 0 + local nicktext = nil + + if showtotalXP:GetBool() then + nicktext = ply:Nick() .. " | " .. ply:GetXP() .. "XP" + else + nicktext = ply:Nick() + end + + surface.SetFont("BeatrunHUDSmall") + + local nickw, nickh = surface.GetTextSize(nicktext) + + surface.SetFont("BeatrunHUD") + + local coursew, courseh = surface.GetTextSize(coursename) + local bgpadw = nickw + local bgpadh = nickh + + if bgpadw < coursew then + bgpadw = coursew + end + + local bgpadding = bgpadw > 200 and bgpadw + 40 or 200 + + if not hidden:GetBool() then + if dynamic:GetBool() then + hidealpha = math.Approach(hidealpha, 150 * ply:GetVelocity():Length() / 250, 100 * RealFrameTime()) + else + hidealpha = 0 + end + + surface.SetDrawColor(20, 20, 20, math.max(150 - hidealpha, 50)) + surface.DrawRect(-20 + vp.z, scrh * 0.895 + vp.x, 40, SScaleY(85)) + DrawBlurRect(20 + vp.z, scrh * 0.895 + vp.x, SScaleX(bgpadding), SScaleY(85), math.max(255 - hidealpha, 2)) + surface.SetDrawColor(20, 20, 20, math.max(100 - hidealpha, 50)) + surface.DrawOutlinedRect(20 + vp.z, scrh * 0.895 + vp.x, SScaleX(bgpadding), SScaleY(85)) + surface.SetFont("BeatrunHUD") + surface.SetTextColor(255, 255, 255, math.max(255 - hidealpha, 2)) + surface.SetTextPos(scrw * 0.015 + vp.z, scrh * 0.9 + vp.x) + surface.DrawText("Lv." .. ply:GetLevel()) + + if PuristMode:GetBool() then + surface.SetDrawColor(230, 230, 230) + surface.SetMaterial(MELogo) + surface.DrawTexturedRect(scrw * 0.00125 + vp.z, scrh * 0.9 + vp.x + SScaleY(16) * 0.25, SScaleX(16), SScaleY(16)) + else + surface.SetTextPos(scrw * 0.002 + vp.z, scrh * 0.9 + vp.x) + surface.DrawText(STAR) + end + + surface.SetFont("BeatrunHUDSmall") + surface.SetTextPos(scrw * 0.015 + vp.z, scrh * 0.92 + vp.x) + surface.DrawText(nicktext) + surface.SetDrawColor(25, 25, 25, math.max(255 - hidealpha, 2)) + surface.DrawRect(scrw * 0.015 + vp.z, scrh * 0.94 + 1 + vp.x, SScaleX(150), SScaleY(4)) + surface.SetDrawColor(255, 255, 255, math.max(255 - hidealpha, 2)) + surface.DrawRect(scrw * 0.015 + vp.z, scrh * 0.94 + vp.x, SScaleX(150 * math.min(ply:GetLevelRatio(), 1)), SScaleY(5)) + + for k, v in pairs(XP_floatingxp) do + surface.SetFont("BeatrunHUD") + surface.SetTextColor(255, 255, 255, math.Clamp(1000 * math.abs(CurTime() - k) / 5 - hidealpha, 0, 255)) + surface.SetTextPos(scrw * 0.015 + vp.z + nickw + 3, scrh * 0.92 + vp.x + nickh - 42 + 50 * math.abs(CurTime() - k) / 5) + surface.DrawText(v) + + if k < CurTime() then + XP_floatingxp[k] = nil + end + end + end + + surface.SetFont("BeatrunHUD") + surface.SetTextColor(255, 255, 255, math.max(200 - hidealpha, 2)) + surface.SetTextPos(scrw * 0.015 + vp.z, scrh * 0.95 + vp.x) + surface.DrawText(coursename) +end + +local allply = nil +local allplytimer = 0 +local niltime = "--:--:--" +local placecolors = { + Color(255, 215, 0), + Color(192, 192, 192), + Color(205, 127, 50) +} +local infectorcolor = Color(200, 25, 25) + +local function sortleaderboard(a, b) + local atime = a:GetNW2Float("PBTime") + local btime = b:GetNW2Float("PBTime") + + if GetGlobalBool(GM_INFECTION) then + if atime == 0 then + atime = -1 + end + + if btime == 0 then + btime = -1 + end + + return atime > btime + elseif GetGlobalBool(GM_DATATHEFT) then + atime = a:GetNW2Int("DataBanked", 0) + btime = b:GetNW2Int("DataBanked", 0) + + if atime == 0 then + atime = -1 + end + + if btime == 0 then + btime = -1 + end + + return atime > btime + else + if atime == 0 then + atime = inf + end + + if btime == 0 then + btime = inf + end + + return atime < btime + end +end + +function BeatrunLeaderboard(forced) + if not forced and Course_Name == "" and not GetGlobalBool(GM_INFECTION) and not GetGlobalBool(GM_DATATHEFT) then + return + end + + local isinfection = GetGlobalBool(GM_INFECTION) + local isdatatheft = GetGlobalBool(GM_DATATHEFT) + local ply = LocalPlayer() + local vp = ply:GetViewPunchAngles() + local scrw = ScrW() + local scrh = ScrH() + + if not sway:GetBool() then + vp.x = 0 + vp.z = 0 + end + + allply = allply or player.GetAll() + + if allplytimer < CurTime() then + allply = player.GetAll() + allplytimer = CurTime() + 5 + + table.sort(allply, sortleaderboard) + end + + local allplycount = #allply + 1 + + surface.SetDrawColor(20, 20, 20, math.max(150 - hidealpha, 50)) + surface.DrawRect(-20 + vp.z, scrh * 0.2 + vp.x, 40, SScaleY(30 * allplycount)) + DrawBlurRect(20 + vp.z, scrh * 0.2 + vp.x, SScaleX(400), SScaleY(30 * allplycount), math.max(255 - hidealpha, 2)) + surface.SetDrawColor(20, 20, 20, math.max(100 - hidealpha, 50)) + surface.DrawOutlinedRect(20 + vp.z, scrh * 0.2 + vp.x, SScaleX(400), SScaleY(30 * allplycount)) + surface.SetFont("BeatrunHUD") + surface.SetTextColor(255, 255, 255, math.max(255 - hidealpha, 2)) + + local i = 0 + + for k, v in ipairs(allply) do + if IsValid(v) then + i = i + 1 + local pbtimenum = v:GetNW2Float("PBTime") + local pbtime = niltime + + if isdatatheft then + pbtimenum = v:GetNW2Int("DataBanked", 0) + pbtime = pbtimenum + + surface.SetTextColor(pbtimenum ~= 0 and placecolors[k] or color_white) + else + surface.SetTextColor(pbtimenum ~= 0 and placecolors[k] or color_white) + + if pbtimenum ~= 0 then + pbtime = string.FormattedTime(v:GetNW2Float("PBTime"), "%02i:%02i:%02i") + end + end + + surface.SetTextPos(30 + vp.z, scrh * 0.2 + vp.x + 25 * k) + surface.DrawText(k .. ". " .. v:Nick():Left(14)) + surface.SetTextPos(SScaleX(220 + vp.z), scrh * 0.2 + vp.x + 25 * k) + + if isinfection and pbtimenum == 0 and v:GetNW2Bool("Infected") then + surface.SetTextColor(infectorcolor) + surface.DrawText(" | Infector") + else + surface.DrawText(" | " .. pbtime) + end + + if k < 4 and pbtimenum ~= 0 then + surface.SetTextPos(SScaleX(380 + vp.z), scrh * 0.2 + vp.x + 25 * k) + surface.DrawText(STAR) + end + end + end +end + +hook.Add("HUDPaint", "BeatrunHUD", BeatrunHUD) +hook.Add("HUDPaint", "BeatrunLeaderboard", BeatrunLeaderboard) + +local lastchatply = nil + +hook.Add("OnPlayerChat", "BeatrunChatSound", function (ply, text, teamChat, isDead) + if lastchatply ~= ply then + LocalPlayer():EmitSound("friends/message.wav") + + lastchatply = ply + end +end) + +local pp = { + ["$pp_colour_contrast"] = 1.05, + ["$pp_colour_addg"] = -0.015, + ["$pp_colour_addb"] = 0.0025, + ["$pp_colour_addr"] = -0.015, + ["$pp_colour_colour"] = 0.8, + ["$pp_colour_brightness"] = -0.02, + ["$pp_colour_mulg"] = 0, + ["$pp_colour_mulb"] = 0, + ["$pp_colour_mulr"] = 0 +} + +hook.Add("RenderScreenspaceEffects", "FilterPP", function () + if render.GetDXLevel() < 90 then + return + end + + if not blinded or not blindinverted then + DrawColorModify(pp) + end +end) + +local maxentries = SScaleX(375) +speedrecord = {} +local lastx = 0 +local lasty = 0 +local sgoffsetx = 0.75 +local sgoffsety = 0.75 + +local function DrawSpeedGraph() + if not speedrecord or not LocalPlayer().InReplay then + return + end + + local offsetx = ScrW() * sgoffsetx + local offsety = ScrH() * sgoffsety + local boxscaledx = SScaleX(400) + local boxscaledy = SScaleY(200) + + render.SetScissorRect(offsetx, offsety, offsetx + boxscaledx, offsety + boxscaledy, true) + surface.SetDrawColor(25, 25, 25, 100) + surface.DrawRect(offsetx, offsety, boxscaledx, boxscaledy) + surface.SetFont("DebugFixedSmall") + render.PushFilterMag(TEXFILTER.POINT) + render.PushFilterMin(TEXFILTER.POINT) + + for i = 1, #speedrecord do + local speed = speedrecord[i] + speedcol = speed * 2 + + surface.SetDrawColor(speedcol * 0.1, speedcol * 0.5, speedcol * 0.25, speedcol * 2) + surface.DrawLine(offsetx + i - 1, offsety + boxscaledy, offsetx + i, offsety + boxscaledy - speed) + + lasty = speed + end + + local entrycount = #speedrecord + local lastrecord = speedrecord[entrycount] + + if lastrecord then + surface.SetTextColor(255, 255, 255) + surface.SetTextPos(offsetx + entrycount, offsety + boxscaledy - lastrecord) + surface.DrawText(math.Round(lastrecord)) + end + + render.SetScissorRect(0, 0, 0, 0, false) + render.PopFilterMag() + render.PopFilterMin() + surface.SetDrawColor(45, 45, 45, 145) + surface.DrawOutlinedRect(offsetx - 1, offsety - 1, boxscaledx + 1, boxscaledy + 1) +end + +hook.Add("HUDPaint", "SpeedGraph", DrawSpeedGraph) + +local smoothvel = true +local lastvel = 0 + +local function RecordSpeedGraph() + if not LocalPlayer().InReplay then + return + end + + local lenrecord = #speedrecord + local vel = LocalPlayer():GetVelocity() + local oldrecord = false + + if LocalPlayer():GetClimbing() ~= 0 then + oldrecord = speedrecord[lenrecord] or 0 + end + + if maxentries <= lenrecord then + table.remove(speedrecord, 1) + end + + if not oldrecord then + vel.z = math.max(vel.z, 0) + local power = nil + + if smoothvel then + power = math.pow(Lerp(0, lastvel, vel:Length()), 2) + else + power = math.pow(vel:Length(), 2) + end + + table.insert(speedrecord, SScaleY(power * 0.001 * power * 5e-06)) + else + table.insert(speedrecord, oldrecord) + end + + lastvel = Lerp(0.1, lastvel, vel:Length()) +end + +hook.Add("Tick", "SpeedGraph", RecordSpeedGraph) + +local crosshair_unarmed = Material("vgui/hud/crosshair_unarmed") +local crosshair_standard = Material("vgui/hud/crosshair_standard") +local crosshair_weapon = Material("vgui/hud/crosshair_weapon") +local crosshair_reaction = Material("vgui/hud/crosshair_reaction") + +local function BeatrunReticle() + if not reticle:GetBool() then + return + end + + local wep = LocalPlayer():GetActiveWeapon() + + if not IsValid(wep) or wep:GetClass() ~= "runnerhands" then + return + end + + surface.SetDrawColor(255, 255, 255) + surface.SetMaterial(crosshair_standard) + surface.DrawTexturedRect(ScrW() * 0.5 - 4, ScrH() * 0.5 - 4, 8, 8) + surface.SetMaterial(crosshair_unarmed) + surface.DrawTexturedRect(ScrW() * 0.5 - 4, ScrH() * 0.5 - 4, 8, 8) +end + +hook.Add("HUDPaint", "BeatrunReticle", BeatrunReticle) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/JumpAnim.lua b/beatrun/gamemodes/beatrun/gamemode/cl/JumpAnim.lua new file mode 100644 index 0000000..05e396a --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/JumpAnim.lua @@ -0,0 +1,1746 @@ +local animtable = { + lockang = false, + allowmove = true, + followplayer = true, + ignorez = false, + BodyAnimSpeed = 1, + deleteonend = false, + BodyLimitX = 90, + AnimString = "jumpslow", + CamIgnoreAng = true, + animmodelstring = "climbanim", + BodyLimitY = 180, + usefullbody = 2 +} +fbanims = { + ladderexittoplefthand = true, + runfwdstart = true, + vaultkong = true, + walktostandleft = true, + wallrunverticalstart = true, + meleeair = true, + vaultonto = true, + fallinguncontrolled = true, + stand = true, + meslideend = true, + walkbalancefwd = true, + meleewrleft = true, + runfwd = true, + jumpzipline = true, + springboardleftleg = true, + jumpcoilend = true, + hangstraferight = true, + hangfoldedstart = true, + jumpslow = true, + hangheaveup = true, + jumpwrright = true, + meleeairhit = true, + vaultover = true, + jumpstill = true, + dodgejumpright = true, + jumpturnflyidle = true, + ladderclimbdownfast = true, + ladderclimbuprighthand = true, + wallrunverticalturn = true, + jumpturnlandidle = true, + hanghardstart = true, + hangstrafeleft = true, + walkfwd = true, + jumpfast = true, + meslidestart45 = true, + hangfoldedendhang = true, + wallrunleft = true, + zipline = true, + wallrunleftstart = true, + sprintfwd = true, + walkbalancelosebalanceright = true, + jumpwrleft = true, + grapplecenter = true, + swingstraight = true, + jumpcoil = true, + hang = true, + runland = true, + crouchfwd = true, + crouchbwd = true, + meslideloop = true, + crouchstill = true, + snatchsniper = true, + meslidestart = true, + ladderclimbuplefthandstill = true, + bargein = true, + meslideendprone = true, + diveidle = true, + diveslidestart = true, + diveslideidle = true, + wallrunright = true, + diveslideend = true, + vaultontohigh = true, + divestart = true, + hangfoldedheaveup = true, + vaultoverhigh = true, + ziplinestart = true, + dodgejumpleft = true, + evaderoll = true, + hanghardstart2 = true, + diestand = true, + jumpturnlandstand = true, + runbwd = true, + hanghardstartvertical = true, + walkbalancestill = true, + ladderenterbottom = true, + wallrunrightstart = true, + walkbalancefalloffleft = true, + wallrunvertical = true, + ladderclimbhangstart = true, + jumpturnland = true, + jumpturnlandstandgun = true, + meleewrright = true, + diestandlong = true, + ladderclimbuplefthand = true, + walkbalancelosebalanceleft = true, + jumpturnfly = true, + meslideloop45 = true, + meleeslide = true, + stepuprightleg = true, + ladderexittoprighthand = true, + ladderclimbuprighthandstill = true, + jumpidle = true, + jumpair = true, + walkbalancefalloffright = true, + meleeairstill = true, + swingjumpoff = true, + snatchscar = true +} +local jumpanims = { + jumpwrleft = true, + jumpfast = true, + jumpslow = true, + jumpwrright = true, + jumpstill = true, + jumpidle = true, + jumpair = true, + jumpcoil = true, + jumpzipline = true +} +local jumpanims2 = { + jumpfast = true, + jumpslow = true, + jumpstill = true +} +local runanims = { + crouchfwd = true, + crouchbwd = true, + walktostandleft = true, + stand = true, + runfwd = true, + walkfwd = true, + crouchstill = true, + sprintfwd = true, + runbwd = true +} +local events = { + ladderenter = true, + divestart = true, + fall = true, + ladderclimbleft = true, + jumpwallrun = true, + vaultonto = true, + ziplinestart = true, + hangstrafeleft = true, + hangstraferight = true, + climbhard = true, + walkbalancefwd = true, + hangfoldedheaveup = true, + jumpturnlandstand = true, + swingjump = true, + sidestepleft = true, + swingpiperight = true, + jumpfar = true, + hangfoldedstart = true, + jumpslide = true, + swingpipeleft = true, + ladderenterhang = true, + vault = true, + disarmsniper = true, + jumpstill = true, + climb = true, + stepup = true, + ladderclimbdownfast = true, + sidestepright = true, + jumpwallrunleft = true, + meleeslide = true, + meleeair = true, + disarmscar = true, + falluncontrolled = true, + meleewrright = true, + meleewrleft = true, + meleeairhit = true, + climbhard2 = true, + walkbalancestill = true, + hangfoldedendhang = true, + walkbalancefalloffleft = true, + walkbalancefalloffright = true, + swingbar = true, + jump = true, + jumpwallrunright = true, + coil = true, + ladderexittoplefthand = true, + climbheave = true, + diveslidestart = true, + bargedoor = true, + hangjump = true, + diveslideend = true, + landcoil = true, + ladderexittoprighthand = true, + hangend = true, + springboard = true, + vaultkong = true, + ladderclimbright = true, + meleeairstill = true, + vaultontohigh = true +} +local eventslut = { + ladderenter = "ladderenterbottom", + divestart = "divestart", + jumpwallrunright = "jumpwrleft", + hangfoldedheaveup = "hangfoldedheaveup", + jumpwallrun = "jumpfast", + hangstrafeleft = "hangstrafeleft", + ziplinestart = "ziplinestart", + climbhard2 = "hanghardstart2", + vaultonto = "vaultonto", + climbhard = "hanghardstart", + walkbalancefwd = "walkbalancefwd", + jumpwallrunleft = "jumpwrright", + jumpturnlandstand = "jumpturnlandstand", + swingjump = "swingjumpoff", + sidestepleft = "dodgejumpleft", + vaulthigh = "vaultoverhigh", + hangstraferight = "hangstraferight", + hangfoldedstart = "hangfoldedstart", + ladderexittoprighthand = "ladderexittoprighthand", + swingpipeleft = "stand", + ladderenterhang = "ladderclimbhangstart", + vault = "vaultover", + disarmsniper = "snatchsniper", + jumpstill = "jumpstill", + climb = "hanghardstartvertical", + stepup = "stepuprightleg", + springboard = "jumpfast", + ladderexittoplefthand = "ladderexittoplefthand", + slide45 = "meslidestart45", + sidestepright = "dodgejumpright", + meleeslide = "meleeslide", + disarmscar = "snatchscar", + falluncontrolled = "fallinguncontrolled", + meleewrright = "meleewrright", + meleeairhit = "meleeairhit", + meleewrleft = "meleewrleft", + meleeair = "meleeair", + jumpslide = "jumpfast", + hangfoldedendhang = "hangfoldedendhang", + walkbalancestill = "walkbalancestill", + walkbalancefalloffleft = "walkbalancefalloffleft", + walkbalancefalloffright = "walkbalancefalloffright", + swingbar = "swingstraight", + ladderclimbleft = "ladderclimbuplefthand", + coil = "jumpcoil", + fall = "jumpair", + climbheave = "hangheaveup", + slide = "meslidestart", + bargedoor = "bargein", + hangjump = "jumpfast", + diveslidestart = "diveslidestart", + landcoil = "jumpcoilend", + diveslideend = "diveslideend", + hangend = "jumpair", + ladderclimbdownfast = "ladderclimbdownfast", + swingpiperight = "stand", + vaultkong = "vaultkong", + ladderclimbright = "ladderclimbuprighthand", + meleeairstill = "meleeairstill", + vaultontohigh = "vaultontohigh" +} +local armfollowanims = { + stand = true, + diveslideidle = true, + walktostandleft = true, + diestandlong = true, + diveslidestart = true, + vaultoverhigh = true, + walkfwd = true +} +local armlock = { + meleeairhit = true, + bargein = true, + wallrunverticalstart = true, + ladderexittoprighthand = true, + meleeair = true, + ladderclimbuplefthand = true, + ladderexittoplefthand = true, + ladderenterbottom = true, + snatchsniper = true, + ladderclimbuplefthandstill = true, + ladderclimbuprighthandstill = true, + wallrunvertical = true, + ladderclimbdownfast = true, + ladderclimbuprighthand = true, + ladderclimbhangstart = true, + vaultontohigh = true, + snatchscar = true +} +local stillanims = { + jumpturnlandstandgun = true, + meslideloop = true, + jumpturnlandidle = true, + snatchsniper = true, + meslidestart = true, + meslideloop45 = true, + meslidestart45 = true, + bargein = true, + jumpturnflyidle = true, + jumpturnfly = true, + jumpturnlandstand = true, + jumpturnland = true, + meleeslide = true, + snatchscar = true +} +local arminterrupts = { + punchright = true, + doorbash = true, + punchmid = true, + punchleft = true +} +local transitionanims = { + hanghardstart = "hang", + divestart = "diveidle", + ladderexittoplefthand = "runfwd", + walktostandleft = "stand", + fallinguncontrolled = "runfwd", + vaultoverhigh = "runfwd", + vaultonto = "runfwd", + hangstrafeleft = "hang", + ladderclimbhangstart = "ladderclimbuprighthandstill", + hanghardstart2 = "hang", + meslideend = "runfwd", + hangfoldedheaveup = "runfwd", + jumpturnlandstand = "stand", + ziplinestart = "zipline", + springboardleftleg = "runfwd", + hanghardstartvertical = "hang", + hangstraferight = "hang", + zipline = "jumpzipline", + ladderenterbottom = "ladderclimbuplefthandstill", + hangheaveup = "runfwd", + dodgejumpleft = "stand", + walkbalancefalloffleft = "jumpair", + vaultover = "runfwd", + meleeairhit = "jumpair", + dodgejumpright = "stand", + meleeair = "jumpair", + walkbalancefalloffright = "jumpair", + swingjumpoff = "jumpslow", + wallrunverticalstart = "wallrunvertical", + jumpturnland = "jumpturnlandidle", + jumpcoilend = "runfwd", + bargeout = "runfwd", + jumpturnlandstandgun = "stand", + meleewrright = "jumpair", + diveslidestart = "diveslideidle", + diveslideend = "runfwd", + hangfoldedendhang = "hang", + ladderclimbuplefthand = "ladderclimbuplefthandstill", + jumpturnfly = "jumpturnflyidle", + meleewrleft = "jumpair", + vaultkong = "runfwd", + meleeslide = "meslideloop", + stepuprightleg = "runfwd", + snatchsniper = "stand", + ladderexittoprighthand = "runfwd", + meslideendprone = "jumpturnlandidle", + wallrunverticalturn = "jumpslow", + ladderclimbuprighthand = "ladderclimbuprighthandstill", + meleeairstill = "jumpair", + vaultontohigh = "runfwd", + snatchscar = "stand" +} +local nospinebend = { + ladderclimbuplefthand = true, + divestart = true, + hang = true, + hangfoldedheaveup = true, + ladderexittoprighthand = true, + ziplinestart = true, + hangfoldedendhang = true, + hangstrafeleft = true, + zipline = true, + hanghardstart2 = true, + snatchsniper = true, + grapplecenter = true, + hanghardstart = true, + ladderexittoplefthand = true, + diveidle = true, + hanghardstartvertical = true, + hangstraferight = true, + hangfoldedstart = true, + ladderenterbottom = true, + hangheaveup = true, + diveslidestart = true, + ladderclimbuplefthandstill = true, + ladderclimbuprighthandstill = true, + diveslideidle = true, + diveslideend = true, + wallrunvertical = true, + ladderclimbdownfast = true, + ladderclimbuprighthand = true, + ladderclimbhangstart = true, + vaultontohigh = true, + snatchscar = true +} +local worldarm = { + ladderclimbuplefthand = true, + ladderclimbuplefthandstill = true, + hanghardstart = true, + hangfoldedheaveup = true, + hang = true, + snatchsniper = true, + hangfoldedendhang = true, + hangstrafeleft = true, + bargein = true, + hanghardstart2 = true, + grapplecenter = true, + diveslidestart = true, + diveslideidle = true, + ladderexittoplefthand = true, + diveslideend = true, + hanghardstartvertical = true, + hangstraferight = true, + hangfoldedstart = true, + ladderenterbottom = true, + hangheaveup = true, + ladderexittoprighthand = true, + ladderclimbuprighthandstill = true, + ladderclimbdownfast = true, + ladderclimbuprighthand = true, + ladderclimbhangstart = true, + snatchscar = true +} +local ignorezarm = { + wallrunvertical = true, + hangfoldedstart = true, + hangfoldedendhang = true, + hangfoldedheaveup = true, + wallrunverticalstart = true, + diestandlong = true, + vaultontohigh = true +} +local nocyclereset = { + jumpwrright = true, + jumpwrleft = true, + meslidestart = true +} +local ignorebac = { + evaderoll = true, + meroll = true +} +local customspeed = { + vaultonto = 1.15, + vaultontohigh = 1 +} +local vaultoverhighcam1 = Vector(0, 0, -7.5) +local vaultoverhighcam2 = Vector(0, 0, 0) +local vaultoverhigharm1 = Vector(4, -4, 13.5) +local vaultoverhigharm2 = Vector(4, 0, -2.5) +local ladderexitarm1 = Vector(-2.5, 0, 0) +local ladderexitarm2 = Vector(-10, 0, 0) +local vaultontohigharm1 = Vector(5, -10, 3.5) +local vaultontohigharm2 = Vector(10, 0, 0) +local snatchscarcam1 = Vector(0, 0, 0) +local snatchscarcam2 = Vector(10, 0, 5) +local customarmoffset = { + meslidestart = Vector(2, 5, 9.5), + meslideloop = Vector(2, 5, 9.5), + meslidestart45 = Vector(2, 5, 5), + meslideloop45 = Vector(2, 5, 5), + meslideend = Vector(2, 5, 9.5), + meslideendprone = Vector(2, 5, 9.5), + meleeslide = Vector(2, 5, 9.5), + jumpturnfly = Vector(0, 2.5, 7.5), + jumpturnflyidle = Vector(0, 2.5, 7.5), + jumpturnland = Vector(0, 2.5, 7.5), + jumpturnlandidle = Vector(0, 2.5, 7.5), + jumpturnlandstand = Vector(0, 2.5, 7.5), + jumpturnlandstandgun = Vector(0, 2.5, 7.5), + wallrunvertical = Vector(0, 0, 5), + wallrunverticalstart = Vector(0, 0, 5), + wallrunverticalturn = Vector(0, 0, 5), + vaultover = Vector(0, 4, -2.5), + vaultoverhigh = Vector(0, 0, 9.5), + vaultontohigh = Vector(5, -10, 2.5), + fallinguncontrolled = Vector(5, 0, 6), + ladderexittoplefthand = Vector(5, 0, 0), + ladderexittoprighthand = Vector(5, 0, 0), + ladderclimbhangstart = Vector(-5, 0, 0), + ladderenterbottom = Vector(-7.5, 0, 0), + crouchstill = Vector(-10, 0, 10), + crouchfwd = Vector(-10, 0, 10), + crouchbwd = Vector(-10, 0, 10), + walkfwd = Vector(10, 0, -10), + runbwd = Vector(0, 0, 3), + stand = Vector(10, 0, -10), + walktostandleft = Vector(10, 0, -10) +} +local customcamoffset = { + jumpturnfly = Vector(0, 0, 7.5), + jumpturnflyidle = Vector(0, 0, 7.5), + jumpturnland = Vector(0, 0, 7.5), + jumpturnlandidle = Vector(0, 0, 7.5), + jumpturnlandstand = Vector(0, 0, 7.5), + jumpturnlandstandgun = Vector(0, 0, 7.5), + meslideendprone = Vector(0, 0, 7.5), + vaultover = Vector(0, 0, -2.5), + vaultoverhigh = Vector(0, 0, -7.5), + ladderexittoplefthand = Vector(-5, 0, 0), + ladderexittoprighthand = Vector(-5, 0, 0), + ladderenterbottom = Vector(-5, 0, 0), + hangstrafeleft = Vector(-2.5, 0, 0), + hangstraferight = Vector(-2.5, 0, 0), + snatchscar = snatchscarcam1, + crouchstill = Vector(0, 0, -10), + crouchfwd = Vector(10, 0, -17.5), + crouchbwd = Vector(20, 0, -10) +} +local transitionchecks = { + meleeairstill = function (ply) + if BodyAnimCycle >= 1 or ply:OnGround() then + return true + end + end, + swingjumpoff = function (ply) + if BodyAnimCycle >= 0.15 or ply:OnGround() then + BodyAnimCycle = 0 + + return true + end + end, + jumpcoilend = function (ply) + if ply:GetVelocity():Length() < 10 and BodyAnimCycle > 0.5 or BodyAnimCycle > 0.9 then + return true + end + end, + vaultover = function (ply) + if BodyAnimCycle >= 1 or ply:OnGround() and ply:GetMantle() == 0 then + BodyLimitX = 90 + BodyLimitY = 180 + + return true + end + end, + vaultkong = function (ply) + if BodyAnimCycle >= 1 or ply:OnGround() and ply:GetMantle() == 0 then + BodyLimitX = 90 + BodyLimitY = 180 + + return true + end + end, + vaultoverhigh = function (ply) + if BodyAnimCycle < 0.45 then + customarmoffset.vaultoverhigh = vaultoverhigharm1 + customcamoffset.vaultoverhigh = vaultoverhighcam1 + else + customarmoffset.vaultoverhigh = vaultoverhigharm2 + customcamoffset.vaultoverhigh = vaultoverhighcam2 + end + + if BodyAnimCycle >= 1 or BodyAnimCycle > 0.75 and ply:OnGround() and ply:GetMantle() == 0 then + BodyLimitX = 90 + BodyLimitY = 180 + + return true + else + BodyLimitX = 25 + BodyLimitY = 40 + end + end, + vaultontohigh = function (ply) + if BodyAnimCycle < 0.45 then + customarmoffset.vaultontohigh = vaultontohigharm1 + else + customarmoffset.vaultontohigh = vaultontohigharm2 + end + + local ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + + if BodyAnimCycle >= 1 then + BodyLimitX = 90 + BodyLimitY = 180 + + return true + elseif BodyAnimCycle >= 0.15 then + BodyLimitX = 10 + BodyLimitY = 45 + else + BodyLimitX = 10 + BodyLimitY = 0 + end + + if BodyAnimCycle >= 0.45 then + local eyeang = ply:EyeAngles() + eyeang.x = 0 + eyeang.z = 0 + ply.OrigEyeAng = eyeang + + BodyAnim:SetAngles(eyeang) + end + end, + zipline = function (ply) + if not IsValid(ply:GetZipline()) then + BodyAnimCycle = 0 + + return true + end + end, + jumpzipline = function (ply) + lockang = false + BodyLimitX = 90 + BodyLimitY = 180 + end, + stepuprightleg = function (ply) + if BodyAnimCycle >= 1 then + return true + end + end, + springboardleftleg = function (ply) + if BodyAnimCycle >= 0.75 or ply:OnGround() then + return true + end + end, + jumpturnlandstand = function (ply) + if BodyAnimCycle >= 0.85 then + BodyLimitX = 90 + BodyLimitY = 180 + + return true + end + end, + jumpturnlandstandgun = function (ply) + if BodyAnimCycle >= 0.85 then + BodyLimitX = 90 + BodyLimitY = 180 + + return true + end + end, + fallinguncontrolled = function (ply) + if not ply.FallStatic then + return true + end + end, + ladderclimbuplefthand = function (ply) + if BodyAnimCycle >= 0.75 then + return true + end + end, + ladderclimbuprighthand = function (ply) + if BodyAnimCycle >= 0.75 then + return true + end + end, + ladderenterbottom = function (ply) + if BodyAnimCycle >= 0.35 then + return true + end + end, + ladderexittoplefthand = function (ply) + if BodyAnimCycle < 0.25 then + customarmoffset.ladderexittoplefthand = ladderexitarm1 + else + customarmoffset.ladderexittoplefthand = ladderexitarm2 + end + + if BodyAnimCycle >= 1 or ply:OnGround() then + return true + end + end, + ladderexittoprighthand = function (ply) + if BodyAnimCycle < 0.25 then + customarmoffset.ladderexittoprighthand = ladderexitarm1 + else + customarmoffset.ladderexittoprighthand = ladderexitarm2 + end + + if BodyAnimCycle >= 1 or ply:OnGround() then + return true + end + end, + wallrunverticalturn = function (ply) + if ply:GetWallrun() ~= 4 then + return true + end + end, + hangfoldedheaveup = function (ply) + if BodyAnimCycle >= 0.65 then + return true + end + end, + hanghardstart = function (ply) + if BodyAnimCycle >= 1 then + ply.hangyaw = 0 + + return true + end + end, + hanghardstart2 = function (ply) + if BodyAnimCycle >= 0.75 then + ply.hangyaw = 0 + + return true + end + end, + snatchscar = function (ply) + lockang = true + + if BodyAnimCycle < 0.35 or BodyAnimCycle > 0.8 then + customcamoffset.snatchscar = snatchscarcam1 + else + customcamoffset.snatchscar = snatchscarcam2 + end + + if BodyAnimCycle >= 1 then + lockang = false + + return true + end + end, + snatchsniper = function (ply) + lockang = true + + if BodyAnimCycle >= 1 then + lockang = false + + return true + end + end, + ziplinestart = function (ply) + if BodyAnimCycle >= 0.75 then + return true + end + end, + walkbalancefalloffleft = function (ply) + lockang = true + + if BodyAnimCycle >= 1 then + lockang = false + + return true + end + end, + walkbalancefalloffright = function (ply) + lockang = true + + if BodyAnimCycle >= 1 then + lockang = false + + return true + end + end +} +fbfunctions = { + vaultontohigh = function (ply) + return true + end, + swingstraight = function (ply) + BodyAnim:SetPoseParameter("swing", (ply:GetSBOffset() / 45 - 1) * 100) + end, + ziplinestart = function (ply) + if IsValid(ply:GetZipline()) then + lockang = true + CamIgnoreAng = false + BodyLimitX = 30 + BodyLimitY = 90 + local ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + end + + return true + end, + zipline = function (ply) + lockang = true + CamIgnoreAng = false + BodyLimitX = 30 + BodyLimitY = 90 + local ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + + return true + end, + hang = function (ply) + CamIgnoreAng = false + local ang = ply.OrigEyeAng + local eyeang = ply:EyeAngles() + local eyeangx = eyeang.x + eyeang.x = 0 + + BodyAnim:SetAngles(ang) + + local mul = ang:Forward():Dot(eyeang:Forward()) + 1.1 + mul = math.Clamp(mul, 0.4, 1) + BodyLimitX = 80 * mul + BodyLimitY = 175 + local a = math.Clamp(math.AngleDifference(ang.y, eyeang.y), -179, 179) + + if not ply.hangyaw then + ply.hangyaw = 0 + end + + if math.abs(a) < 42 then + a = 0 + end + + ply.hangyaw = Lerp(FrameTime() * 15, ply.hangyaw, a) + a = ply.hangyaw + + if IsValid(BodyAnimArmCopy) and IsValid(BodyAnim) then + BodyAnim:SetPoseParameter("hang_yaw", a) + BodyAnimArmCopy:SetPoseParameter("hang_yaw", a) + + a = LocalPlayer():EyeAngles().x + + BodyAnim:SetPoseParameter("hang_pitch", a) + BodyAnimArmCopy:SetPoseParameter("hang_pitch", a) + end + + if BodyLimitX <= eyeangx then + eyeang.x = BodyLimitX - 0.1 + + ply:SetEyeAngles(eyeang) + end + + return true + end, + hangstrafeleft = function (ply) + BodyLimitY = 40 + + return true + end, + hangstraferight = function (ply) + BodyLimitY = 40 + + return true + end, + hanghardstartvertical = function (ply) + BodyLimitX = 30 + BodyLimitY = 120 + local ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + + return true + end, + hanghardstart = function (ply) + BodyLimitX = 30 + BodyLimitY = 120 + local ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + + return true + end, + hanghardstart2 = function (ply) + BodyLimitX = 30 + BodyLimitY = 120 + local ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + + return true + end, + hangheaveup = function (ply) + BodyLimitX = 30 + BodyLimitY = 90 + local ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + + return true + end, + hangfoldedstart = function (ply) + BodyLimitX = 30 + BodyLimitY = 90 + local ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + + return true + end, + hangfoldedendhang = function (ply) + BodyLimitX = 30 + BodyLimitY = 90 + local ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + + ply.hangyaw = 0 + + return true + end, + hangfoldedheaveup = function (ply) + BodyLimitX = 30 + BodyLimitY = 90 + local ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + + return true + end, + dodgejumpleft = function (ply) + BodyLimitX = 30 + BodyLimitY = 180 + end, + dodgejumpright = function (ply) + BodyLimitX = 30 + BodyLimitY = 180 + end, + ladderclimbdownfast = function (ply) + lockang = true + end +} +local defaultcamoffset = Vector() +local playermodelbones = { + "ValveBiped.Bip01_L_UpperArm", + "ValveBiped.Bip01_R_UpperArm" +} +local fingers = { + "ValveBiped.Bip01_L_Finger4", + "ValveBiped.Bip01_L_Finger41", + "ValveBiped.Bip01_L_Finger3", + "ValveBiped.Bip01_L_Finger31", + "ValveBiped.Bip01_L_Finger2", + "ValveBiped.Bip01_L_Finger21", + "ValveBiped.Bip01_L_Finger1", + "ValveBiped.Bip01_L_Finger11", + "ValveBiped.Bip01_R_Finger4", + "ValveBiped.Bip01_R_Finger41", + "ValveBiped.Bip01_R_Finger3", + "ValveBiped.Bip01_R_Finger31", + "ValveBiped.Bip01_R_Finger2", + "ValveBiped.Bip01_R_Finger21", + "ValveBiped.Bip01_R_Finger1", + "ValveBiped.Bip01_R_Finger11" +} +local fingerscustom = { + ["ValveBiped.Bip01_L_Finger4"] = Angle(-10, 10, 0), + ["ValveBiped.Bip01_L_Finger3"] = Angle(-10, 20, 0), + ["ValveBiped.Bip01_L_Finger2"] = Angle(0, 20, 0), + ["ValveBiped.Bip01_L_Finger1"] = Angle(10, 20, 0), + ["ValveBiped.Bip01_R_Finger4"] = Angle(30, 10, 0), + ["ValveBiped.Bip01_R_Finger3"] = Angle(20, 20, 0), + ["ValveBiped.Bip01_R_Finger2"] = Angle(10, 20, 0) +} +eventsounds = { + hangfoldedendhang = { + [0.42] = "Handsteps.ConcreteHard", + [0.05] = "Handsteps.ConcreteSoft", + [0.25] = "Handsteps.ConcreteRelease", + [0.15] = "Handsteps.ConcreteRelease", + [0.5] = "Faith.StrainHard" + }, + hangfoldedheaveup = { + [0.1] = "Faith.StrainHard" + }, + hangfoldedstart = { + [0.1] = "Faith.Impact" + }, + hangheaveup = { + [0] = "Faith.StrainMedium" + }, + vaultontohigh = { + [0.2] = "Vault", + [0.05] = "Handsteps.ConcreteHard", + [0.25] = "Faith.StrainSoft", + [0.45] = "Footsteps.Concrete", + [0.5] = "Cloth.MovementRun", + [0.3] = "Cloth.VaultSwish" + }, + vaultonto = { + [0.1] = "Footsteps.Concrete", + [0.01] = "Handsteps.ConcreteHard", + [0.025] = "Cloth.MovementRun" + }, + vaultkong = { + [0.025] = "Vault" + }, + snatchscar = { + [0.35] = "Melee.Foot", + [0.05] = "Melee.ArmSwoosh", + [0.1] = "Melee.LegSwoosh", + [0.15] = "Faith.StrainMedium" + }, + meleeslide = { + [0.025] = "Melee.LegSwoosh" + }, + meleewrleft = { + [0.035] = "Melee.LegSwoosh", + [0.075] = "Faith.StrainHard" + }, + meleewrright = { + [0.035] = "Melee.LegSwoosh", + [0.075] = "Faith.StrainHard" + }, + ladderclimbhangstart = { + [0] = "Footsteps.LadderHeavy", + [0.1] = "Land.Ladder" + }, + ladderclimbuplefthand = { + [0] = "Release.Ladder", + [0.15] = "Footsteps.LadderMedium", + [0.2] = "Handsteps.Ladder" + }, + ladderclimbuprighthand = { + [0] = "Release.Ladder", + [0.15] = "Footsteps.LadderMedium", + [0.2] = "Handsteps.Ladder" + }, + ladderexittoplefthand = { + [0.45] = "Release.Ladder", + [0.1] = "Handsteps.Ladder", + [0.5] = "Release.Ladder", + [0.15] = "Handsteps.Ladder" + }, + ladderexittoprighthand = { + [0.45] = "Release.Ladder", + [0.1] = "Handsteps.Ladder", + [0.5] = "Release.Ladder", + [0.15] = "Handsteps.Ladder" + }, + jumpturnlandstand = { + [0.025] = "me_faith_cloth_roll_cloth.wav", + [0.25] = "Faith.StrainSoft", + [0.3] = "me_body_roll.wav" + } +} +local CharaName = "Faith" +local CharaLen = #CharaName + +local function BodyEventSounds(anim) + local tbl = eventsounds[anim] + + if tbl then + local ply = LocalPlayer() + + for k, v in pairs(tbl) do + local func = nil + + if v:Left(CharaLen) == CharaName then + func = ply.FaithVO + else + func = ply.EmitSound + end + + timer.Simple(k, function () + func(ply, v) + end) + end + end +end + +camint = 1 +campos = Vector() +camang = Angle() +local customoffset = Vector() +local customoffsetlerp = Vector() +local movedback = false + +local function JumpCalcView(view) + if not fbanims[BodyAnimString] then + hook.Remove("BodyAnimCalcView", "JumpCalcView") + hook.Remove("BodyAnimDrawArm", "JumpArmThink") + hook.Remove("PostDrawOpaqueRenderables", "JumpArmDraw") + + if IsValid(BodyAnimArmCopy) then + BodyAnimArmCopy:Remove() + end + end + + local eyepos = LocalPlayer():EyePos() + local vieworigin = view.origin + + BodyAnim:SetupBones() + + local m = BodyAnim:GetBoneMatrix(68) + local pos, ang = nil + + if m then + ang = m:GetAngles() + pos = m:GetTranslation() + end + + if IsValid(ang) then + ang:Sub(view.angles) + ang:Mul(camint) + view.angles:Add(ang) + end + + customoffsetlerp = LerpVector(math.min(10 * FrameTime(), 1), customoffsetlerp, customcamoffset[BodyAnimString] or defaultcamoffset) + campos = view.origin + camang = view.angles + + campos:Add(LocalToWorld(customoffsetlerp, angle_zero, vector_origin, BodyAnim:GetAngles())) + + if IsValid(BodyAnim) and jumpanims[BodyAnimString] and BodyAnimCycle >= 1 then + BodyAnim:SetSequence(BodyAnim:LookupSequence("jumpidle")) + end +end + +local function CreateBodyAnimArmCopy() + if not IsValid(BodyAnimArmCopy) and IsValid(BodyAnim) and not ignorebac[BodyAnimString] then + local ply = LocalPlayer() + BodyAnimArmCopy = ClientsideModel("models/" .. BodyAnimMDLString .. ".mdl", RENDERGROUP_BOTH) + local seq = BodyAnim:GetSequence() + + if seq then + BodyAnimArmCopy:SetSequence(seq) + end + + for num, _ in pairs(BodyAnim:GetBodyGroups()) do + BodyAnimArmCopy:SetBodygroup(num - 1, BodyAnim:GetBodygroup(num - 1)) + BodyAnimArmCopy:SetSkin(BodyAnim:GetSkin()) + end + + for k, v in ipairs(fingers) do + local b = BodyAnimArmCopy:LookupBone(v) + + if b then + BodyAnimArmCopy:ManipulateBoneAngles(b, Angle(0, 30, 0)) + end + end + + for k, v in pairs(fingerscustom) do + local b = BodyAnimArmCopy:LookupBone(k) + + if b then + BodyAnimArmCopy:ManipulateBoneAngles(b, v) + end + end + + ply.BAC = BodyAnimArmCopy + end + + return BodyAnimArmCopy +end + +hook.Add("BodyAnimRemove", "BodyAnimArmRemove", function () + if IsValid(BodyAnimArmCopy) then + BodyAnimArmCopy:Remove() + end +end) + +local function JumpArmThink() + local bac = CreateBodyAnimArmCopy() + + if IsValid(bac) then + return true + end +end + +function ArmInterrupting(bac) + return IsValid(bac) and arminterrupts[bac:GetSequenceName(bac:GetSequence())] +end + +local defaultarmoffset = Vector() +local armoffset = Vector() +local armoffsetlerp = Vector() +local drawnorigin = false +local drawnskytime = 0 + +local function JumpArmDraw(a, b, c) + local bac = CreateBodyAnimArmCopy() + + if IsValid(bac) and not LocalPlayer():ShouldDrawLocalPlayer() and IsValid(BodyAnim) and not c then + local ply = LocalPlayer() + local ang = ply:EyeAngles() + ang.z = 0 + + if not nospinebend[BodyAnimString] then + BodyAnim:ManipulateBoneAngles(1, Angle(0, math.max(ang.x * 0.5, 0), 0)) + else + BodyAnim:ManipulateBoneAngles(1, angle_zero) + end + + cam.IgnoreZ(true) + + local camposoff = campos - ply:EyePos() + local attachId = bac:LookupAttachment("eyes") + local offset = bac:GetAttachment(attachId) + + if not offset then + return + end + + local arminterrupting = ArmInterrupting(bac) + local arminterruptboost = arminterrupting and 4 or 1 + armoffsetlerp = LerpVector(math.min(10 * FrameTime() * arminterruptboost, 1), armoffsetlerp, not arminterrupting and customarmoffset[BodyAnimString] or defaultarmoffset) + + armoffset:Set(armoffsetlerp) + + local pos = offset.Pos + local ang = offset.Ang + + if not IsValid(BodyAnimMDLarm) then + return + end + + BodyAnimMDLarm:SetNoDraw(true) + bac:SetParent(nil) + bac:SetAngles(angle_zero) + bac:SetPos(Vector(0, 0, -64)) + + if not worldarm[BodyAnimString] then + bac:SetRenderOrigin(bac:GetPos()) + end + + BodyAnimMDLarm:SetParent(bac) + + if not ply.armfollowlerp then + ply.armfollowlerp = 0 + end + + if armfollowanims[BodyAnimString] and not ArmInterrupting(bac) then + ang.x = ply.armfollowlerp < 1 and Lerp(ply.armfollowlerp, 0, ply:EyeAngles().x) or ply:EyeAngles().x + ply.armfollowlerp = math.Approach(ply.armfollowlerp, 1, FrameTime() * 1.5) + elseif armlock[BodyAnimString] then + ang.x = ply:EyeAngles().x + ang.y = ply:EyeAngles().y - ply.OrigEyeAng.y + else + ang.x = ply.armfollowlerp > 0 and Lerp(ply.armfollowlerp, 0, ply:EyeAngles().x) or 0 + ang.y = 0 + ply.armfollowlerp = math.Approach(ply.armfollowlerp, 0, FrameTime() * 2.5 * arminterruptboost) + end + + pos:Add(armoffset) + pos:Add(customoffsetlerp) + ang:Add(ViewTiltAngle) + + if CamShake then + ang:Add(CamShakeAng) + end + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) and activewep:GetClass() == "runnerhands" then + if not worldarm[BodyAnimString] then + cam.Start3D(pos, ang) + cam.IgnoreZ(ignorezarm[BodyAnimString] or false) + BodyAnimMDLarm:SetPos(pos) + bac:SetupBones() + BodyAnimMDLarm:DrawModel() + cam.End3D() + else + local armoff = LocalToWorld(armoffset, angle_zero, vector_origin, BodyAnim:GetAngles()) + + cam.IgnoreZ(ignorezarm[BodyAnimString] or false) + bac:SetAngles(BodyAnim:GetAngles()) + bac:SetPos(BodyAnim:GetPos() + armoff) + bac:SetRenderOrigin(nil) + BodyAnimMDLarm:SetPos(BodyAnim:GetPos() + armoff) + bac:SetupBones() + BodyAnimMDLarm:DrawModel() + end + elseif IsValid(activewep) then + ply:DrawViewModel(true) + ply:GetViewModel():SetNoDraw(false) + end + + cam.IgnoreZ(false) + + local seq = BodyAnim:GetSequence() + + if seq and (not arminterrupts[bac:GetSequenceName(bac:GetSequence())] or bac:GetCycle() >= 1) then + if bac:GetSequence() ~= seq then + for k, v in ipairs(fingers) do + local b = bac:LookupBone(v) + + if b then + bac:ManipulateBoneAngles(b, Angle(0, 30, 0)) + end + end + + for k, v in pairs(fingerscustom) do + local b = bac:LookupBone(k) + + if b then + bac:ManipulateBoneAngles(b, v) + end + end + end + + bac:SetSequence(seq) + bac:SetCycle(BodyAnim:GetCycle() or 1) + elseif seq and drawnskytime < CurTime() then + bac:SetCycle(bac:GetCycle() + FrameTime() / bac:SequenceDuration()) + end + + if (not b or not skybox3d) and not worldarm[BodyAnimString] then + bac:SetRenderOrigin(campos) + + drawnorigin = true + end + + drawnskytime = CurTime() + end +end + +hook.Add("PreRender", "JumpArmOriginVar", function () + drawnorigin = false +end) +hook.Add("PostDrawSkyBox", "JumpArm3DSky", function () + skybox3d = true + + hook.Remove("PostDrawSkyBox", "JumpArm3DSky") +end) +hook.Add("CalcViewModelView", "lol", function (wep, vm, oldpos, oldang, pos, ang) + pos:Sub(oldpos) + pos:Add(campos) + ang:Sub(oldang) + ang:Add(camang) + + if wep.m_ViewModel then + local vmoffsets = wep.ViewModelVars + local lerpaimpos = vmoffsets.LerpAimPos + lerpaimpos.y = 0 + local cpos, cang = LocalToWorld(vector_origin, angle_zero, lerpaimpos, vmoffsets.LerpAimAngles) + + pos:Add(cpos) + ang:Add(cang) + wep.m_ViewModel:SetRenderOrigin(pos) + wep.m_ViewModel:SetAngles(ang) + end +end) + +local function JumpAnim(event, ply) + if events[event] then + local wasjumpanim = fbanims[BodyAnimString] and IsValid(BodyAnim) + + if not wasjumpanim then + RemoveBodyAnim() + end + + if event == "jump" or event == "jumpfar" or event:Left(11) == "jumpwallrun" and ply:GetWallrunDir():Dot(ply:EyeAngles():Forward()) < 0.75 then + if event == "jumpfar" then + animtable.AnimString = "jumpfast" + else + animtable.AnimString = "jumpslow" + end + + lockang = false + CamIgnoreAng = true + BodyLimitX = 90 + BodyLimitY = 180 + else + BodyAnimCycle = 0 + animtable.AnimString = eventslut[event] + end + + BodyAnimString = animtable.AnimString + + BodyEventSounds(BodyAnimString) + + if not nocyclereset[BodyAnimString] then + BodyAnimCycle = 0 + end + + if not wasjumpanim then + StartBodyAnim(animtable) + + if not IsValid(BodyAnim) then + return + end + + CreateBodyAnimArmCopy() + + if not ply:ShouldDrawLocalPlayer() or CurTime() < 10 then + for k, v in ipairs(playermodelbones) do + local b = BodyAnim:LookupBone(v) + + if b then + BodyAnim:ManipulateBonePosition(b, Vector(0, 0, 100 * (k == 1 and -1 or 1))) + end + end + end + + hook.Add("BodyAnimCalcView", "JumpCalcView", JumpCalcView) + hook.Add("BodyAnimDrawArm", "JumpArmThink", JumpArmThink) + hook.Add("PostDrawOpaqueRenderables", "JumpArmDraw", JumpArmDraw) + else + BodyAnim:ResetSequence(BodyAnim:LookupSequence(BodyAnimString)) + end + end +end + +hook.Add("OnParkour", "JumpAnim", JumpAnim) + +function ArmInterrupt(anim) + if arminterrupts[anim] then + local arm = CreateBodyAnimArmCopy() + + if IsValid(arm) then + for k, v in ipairs(fingers) do + local b = BodyAnimArmCopy:LookupBone(v) + + if b then + arm:ManipulateBoneAngles(b, angle_zero) + end + end + + for k, v in pairs(fingerscustom) do + local b = BodyAnimArmCopy:LookupBone(k) + + if b then + arm:ManipulateBoneAngles(b, angle_zero) + end + end + + arm:SetSequence(anim) + arm:SetCycle(0) + end + end +end + +local lastwr = 0 + +hook.Add("Think", "FBAnimHandler", function () + local ply = LocalPlayer() + + if not IsValid(BodyAnim) and ply:Alive() then + JumpAnim("fall", ply) + + camjoint = "eyes" + BodyAnimSpeed = 1 + BodyLimitX = 90 + BodyLimitY = 180 + end + + if ply:GetWallrun() >= 2 then + BodyLimitY = 95 + end + + if ply:GetWallrun() == 0 and lastwr > 0 then + BodyLimitY = 180 + end + + lastwr = ply:GetWallrun() +end) + +local animtr, animtr_result = nil +local oldnewang = Angle() + +local function JumpThink() + if IsValid(BodyAnim) then + if not animtr then + animtr = {} + animtr_result = {} + animtr.filter = ply + animtr.output = animtr_result + end + + local lastBAString = BodyAnimString + BodyAnimString = BodyAnim:GetSequenceName(BodyAnim:GetSequence()) + + if fbanims[BodyAnimString] then + local ply = LocalPlayer() + + if jumpanims[BodyAnimString] and (ply:OnGround() or ply:GetWallrun() ~= 0 or ply:GetMantle() ~= 0) then + BodyAnim:SetSequence(BodyAnim:LookupSequence("runfwd")) + + BodyAnimCycle = 0 + end + + local ang = ply:EyeAngles() + ang[1] = 0 + animtr.start = ply:GetPos() + local angold = ang + local lerpspeed = 10 + local vel = LocalPlayer():GetVelocity() + local vel_l = vel:Length() + local moving = ply:KeyDown(IN_FORWARD) or ply:KeyDown(IN_MOVELEFT) or ply:KeyDown(IN_MOVERIGHT) + local back = ply:KeyDown(IN_BACK) + + if runanims[BodyAnimString] then + if lastBAString == "stand" and vel_l > 0 then + BodyAnimCycle = ply:GetStepRight() and 0.5 or 0 + end + + lockang = false + CamIgnoreAng = true + BodyLimitX = 90 + BodyLimitY = 180 + vel.z = 0 + + if back and vel_l > 10 then + ang = vel:Angle() + + if ang:Forward():Dot(angold:Forward()) < 0 then + ang:RotateAroundAxis(Vector(0, 0, 1), 180) + end + + BodyAnimSpeed = math.Clamp(vel_l / 150, 0.1, 0.8) + lerpspeed = 300 + moveback = true + + if not ply:Crouching() then + BodyAnim:SetSequence(BodyAnim:LookupSequence("runbwd")) + else + BodyAnim:SetSequence(BodyAnim:LookupSequence("crouchbwd")) + end + elseif vel_l > 0 and moving then + ang = vel:Angle() + + if moveback then + ang:RotateAroundAxis(Vector(0, 0, 1), -180) + + if ply:KeyDown(IN_FORWARD) then + moveback = false + else + BodyAnim:SetSequence(BodyAnim:LookupSequence("runbwd")) + end + end + + if ply:InOverdrive() then + BodyAnimSpeed = math.Clamp(vel_l / 320, 0.85, 1.5) + else + local dot = ang:Forward():Dot(angold:Forward()) + + if dot < 0 then + ang:RotateAroundAxis(Vector(0, 0, 1), 180 * math.abs(dot)) + end + + if vel_l > 295 then + BodyAnimSpeed = math.Clamp(vel_l / 300, 0.85, 1) + elseif moveback then + BodyAnimSpeed = math.Clamp(vel_l / 150, 0.1, 0.8) + else + BodyAnimSpeed = math.Clamp(vel_l / 255, 0.85, 1.15) + end + end + + lerpspeed = 30 + + if vel:Length() > 300 and ply:OnGround() then + if ply:InOverdrive() and BodyAnimString ~= "sprintfwd" and vel:Length() < 300 then + ply:EmitSound("CyborgRun") + end + + BodyAnim:SetSequence(BodyAnim:LookupSequence("sprintfwd")) + elseif ply:OnGround() and not moveback then + if not ply:Crouching() then + if ply:KeyDown(IN_WALK) or vel:Length() < 150 then + BodyAnim:SetSequence(BodyAnim:LookupSequence("walkfwd")) + else + BodyAnim:SetSequence(BodyAnim:LookupSequence("runfwd")) + end + else + BodyAnim:SetSequence(BodyAnim:LookupSequence("crouchfwd")) + end + end + else + if not ply:Crouching() and BodyAnimString:Left(6) == "crouch" or BodyAnimString == "walkfwd" or BodyAnimString == "runfwd" or BodyAnimString == "sprintfwd" or BodyAnimString == "runbwd" then + BodyAnimCycle = 0 + + BodyAnim:SetSequence(BodyAnim:LookupSequence("walktostandleft")) + end + + if (BodyAnimString == "stand" or BodyAnimString == "walktostandleft" or BodyAnimString == "jumpcoilend") and ply:Crouching() or BodyAnimString == "crouchfwd" or BodyAnimString == "crouchbwd" then + BodyAnimCycle = 0 + + BodyAnim:SetSequence(BodyAnim:LookupSequence("crouchstill")) + end + end + + if vel_l < 64 then + ang = angold + end + else + lerpspeed = 10 + BodyAnimSpeed = customspeed[BodyAnimString] or animtable.BodyAnimSpeed + end + + if jumpanims2[BodyAnimString] and vel.z < -5 then + local pos = ply:GetPos() + local groundcheck = Vector(0, 0, -35) + + groundcheck:Add(pos) + + animtr.start = pos + animtr.endpos = groundcheck + animtr.filter = ply + + util.TraceLine(animtr) + + if animtr_result.Hit then + BodyAnim:SetSequence("jumpidle") + end + end + + if ply:GetWallrun() >= 2 and ply:GetWallrun() < 4 and ply:GetMelee() == 0 then + vel.z = 0 + ang = vel:Angle() + CamIgnoreAng = false + local bs = ply:GetWallrun() == 2 and "wallrunrightstart" or "wallrunleftstart" + local bl = ply:GetWallrun() == 2 and "wallrunright" or "wallrunleft" + + if BodyAnimString == bs and BodyAnimCycle >= 1 then + BodyAnim:SetSequence(BodyAnim:LookupSequence(bl)) + + BodyAnimSpeed = 1.5 + elseif BodyAnimString ~= bl then + BodyAnim:SetSequence(BodyAnim:LookupSequence(bs)) + end + elseif BodyAnimString == "wallrunright" or BodyAnimString == "wallrunleft" or BodyAnimString == "wallrunrightstart" or BodyAnimString == "wallrunleftstart" then + BodyAnimCycle = 0 + + BodyAnim:SetSequence(BodyAnim:LookupSequence("jumpair")) + end + + if BodyAnimString == "jumpturnfly" or BodyAnimString == "jumpturnflyidle" then + if ply:GetQuickturn() then + BodyAnim:SetAngles(ang + Angle(0, 6.5, 0)) + + ply.OrigEyeAng = ang + end + + if ply:OnGround() then + BodyAnimCycle = 0 + + BodyAnim:SetSequence("jumpturnland") + ply:EmitSound("Cloth.FallShortHard") + ply:FaithVO("Faith.Impact") + DoImpactBlur(6) + end + elseif (BodyAnimString == "jumpturnland" or BodyAnimString == "jumpturnlandidle" or BodyAnimString == "jumpturnlandstand" or BodyAnimString == "jumpturnlandstandgun") and not ply:OnGround() and ply:GetMoveType() ~= MOVETYPE_NOCLIP and ply:WaterLevel() < 3 then + BodyAnimCycle = 0 + + BodyAnim:SetSequence("jumpturnflyidle") + end + + if ply:GetSliding() then + ang = vel:Angle() + end + + local check = transitionchecks[BodyAnimString] + + if check and check(ply) or not check and BodyAnimCycle >= 0.9 and transitionanims[BodyAnimString] then + BodyAnim:SetSequence(transitionanims[BodyAnimString]) + end + + if BodyAnimString == "wallrunverticalstart" or BodyAnimString == "wallrunvertical" then + ang = ply.WallrunOrigAng or ang + BodyAnimSpeed = 1.2 * math.Clamp((LocalPlayer():GetWallrunTime() - CurTime()) / 1.2, 0.5, 1) + end + + if BodyAnimString == "vaultover" or BodyAnimString == "vaultkong" or BodyAnimString == "stepuprightleg" or BodyAnimString == "vaultonto" then + if BodyAnimCycle < 0.65 then + local target = ply:GetMantleEndPos() - ply:GetMantleStartPos() + target.z = 0 + target = target:Angle() + ang = target or ang + + if BodyAnimString == "vaultover" or BodyAnimString == "vaultkong" or BodyAnimString == "vaultonto" then + BodyLimitX = 15 + BodyLimitY = 70 + + if BodyAnimString == "vaultkong" then + BodyLimitX = 25 + end + end + else + BodyLimitX = 90 + BodyLimitY = 180 + end + end + + if BodyAnimString == "wallrunverticalturn" then + BodyAnimSpeed = 1.5 + ang = ply:EyeAngles() + ang.x = 0 + ang.z = 0 + + BodyAnim:SetAngles(ang) + + ply.OrigEyeAng = ang + + return + end + + if BodyAnimString:Left(6) == "ladder" and BodyAnimString ~= "ladderclimbdownfast" then + BodyLimitX = 25 + BodyLimitY = 90 + ang = ply.OrigEyeAng + + BodyAnim:SetAngles(ang) + + CamIgnoreAng = false + lockang = false + + return + end + + local func = fbfunctions[BodyAnimString] + func = func and func(ply) + + if func == true then + return + end + + if ply:GetMantle() == 4 then + BodyAnim:SetSequence("vaultoverhigh") + + return + end + + if ply:GetMantle() == 5 then + BodyAnim:SetSequence("vaultontohigh") + + return + end + + if not stillanims[BodyAnimString] then + local speed = vel_l > 5 and math.min(vel_l / 200, 1) or 1 + local newang = LerpAngle(math.min(lerpspeed * FrameTime() * speed, 1), BodyAnim:GetAngles(), ang) + local ang = ply:EyeAngles() + ang[1] = 0 + ang[3] = 0 + + if vel_l > 0 or BodyAnimString == "walktostandleft" or ply:Crouching() or IsValid(ply:GetBalanceEntity()) then + if newang:Forward():Dot(ang:Forward()) > -0.25 then + ply.OrigEyeAng = newang + + BodyAnim:SetAngles(newang) + oldnewang:Set(BodyAnim:GetAngles()) + else + oldnewang:Set(LerpAngle(FrameTime() * 8, oldnewang, ang)) + + ply.OrigEyeAng = Angle(oldnewang) + + BodyAnim:SetAngles(oldnewang) + end + elseif newang:Forward():Dot(ang:Forward()) < 0.25 then + local stepmat = ply.LastStepMat or game.SinglePlayer() and ply:GetNW2String("LastStepMat", "Concrete") or "Concrete" + BodyAnimCycle = 0 + + BodyAnim:SetSequence(BodyAnim:LookupSequence("walktostandleft")) + ply:EmitSound("Release." .. stepmat) + timer.Simple(0.15, function () + ply:EmitSound("Footsteps." .. stepmat) + end) + end + end + end + end +end + +hook.Add("Think", "JumpThink", JumpThink) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/MapScript.lua b/beatrun/gamemodes/beatrun/gamemode/cl/MapScript.lua new file mode 100644 index 0000000..28c1896 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/MapScript.lua @@ -0,0 +1,3 @@ +if file.Exists("beatrun/gamemode/Maps/" .. game.GetMap() .. "_cl.lua", "LUA") then + include("beatrun/gamemode/Maps/" .. game.GetMap() .. "_cl.lua") +end diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/Menu_Course.lua b/beatrun/gamemodes/beatrun/gamemode/cl/Menu_Course.lua new file mode 100644 index 0000000..4f6be6b --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/Menu_Course.lua @@ -0,0 +1,75 @@ +local coursepanel = { + w = 1200, + h = 650 +} +coursepanel.x = 960 - coursepanel.w * 0.5 +coursepanel.y = 540 - coursepanel.h * 0.5 +coursepanel.bgcolor = Color(32, 32, 32) +coursepanel.outlinecolor = Color(54, 55, 56) +coursepanel.alpha = 0.9 +coursepanel.elements = {} + +local function closebutton(self) + AEUI:Clear() +end + +local function stopbutton(self) + net.Start("Course_Stop") + net.SendToServer() +end + +local function sacheck(self) + return not LocalPlayer():IsSuperAdmin() +end + +AEUI:AddText(coursepanel, "Time Trials - " .. game.GetMap(), "AEUIVeryLarge", 20, 30) +AEUI:AddButton(coursepanel, " X ", closebutton, "AEUILarge", coursepanel.w - 47, 0) + +local stopbutton = AEUI:AddButton(coursepanel, "Return to Freeplay", stopbutton, "AEUILarge", coursepanel.w - 295, coursepanel.h - 50) +stopbutton.greyed = sacheck +local courselist = { + w = 800, + h = 450, + x = 979.2 - coursepanel.w * 0.5, + y = 648 - coursepanel.h * 0.5, + bgcolor = Color(32, 32, 32), + outlinecolor = Color(54, 55, 56), + alpha = 0.9, + elements = {} +} + +function OpenCourseMenu(ply) + AEUI:AddPanel(coursepanel) + AEUI:AddPanel(courselist) + + local dir = "beatrun/courses/" .. game.GetMap() .. "/" + local dirsearch = dir .. "*.txt" + local files = file.Find(dirsearch, "DATA", "datedesc") + + PrintTable(files) + table.Empty(courselist.elements) + + for k, v in pairs(files) do + local data = file.Read(dir .. v, "DATA") + data = util.Decompress(data) + + if data then + data = util.JSONToTable(data) + local courseentry = AEUI:AddText(courselist, data[5] or "ERROR", "AEUILarge", 10, 40 * #courselist.elements) + courseentry.courseid = v:Split(".txt")[1] + + function courseentry:onclick() + LocalPlayer():EmitSound("A_TT_CP_Positive.wav") + LoadCourse(self.courseid) + end + + courseentry.greyed = sacheck + end + end +end + +hook.Add("InitPostEntity", "CourseMenuCommand", function () + concommand.Add("Beatrun_CourseMenu", OpenCourseMenu) + hook.Remove("InitPostEntity", "CourseMenuCommand") +end) +concommand.Add("Beatrun_CourseMenu", OpenCourseMenu) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/Nametags.lua b/beatrun/gamemodes/beatrun/gamemode/cl/Nametags.lua new file mode 100644 index 0000000..6209085 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/Nametags.lua @@ -0,0 +1,72 @@ +local enemy = Color(255, 0, 0) + +local function HideNearby(ply) + if ply == LocalPlayer() then + return + end + + if GetGlobalBool(GM_DATATHEFT) then + return + end + + ply.distfromlocal = LocalPlayer():GetPos():Distance(ply:GetPos()) + local Distance = ply.distfromlocal or 40000 + + if Distance < 20000 then + local infectionmode = GetGlobalBool(GM_INFECTION) + local localinfected = LocalPlayer():GetNW2Bool("Infected") + local plyinfected = ply:GetNW2Bool("Infected") + local ang = LocalPlayer():EyeAngles() + local color = color_white + local dontdraw = false + + if (ply.distfromlocal or 100) < 30 then + if infectionmode and CurTime() > (LocalPlayer().InfectionTouchDelay or 0) and localinfected and not plyinfected then + LocalPlayer().InfectionTouchDelay = CurTime() + 1 + + net.Start("Infection_Touch") + net.WriteEntity(ply) + net.SendToServer() + end + + dontdraw = true + end + + if infectionmode and localinfected and not plyinfected or not localinfected and plyinfected then + color = enemy + elseif infectionmode then + return + end + + local pos = nil + + if Distance < 250 then + local bone = ply:LookupBone("ValveBiped.Bip01_Head1") + + if bone then + pos = ply:GetBonePosition(bone) + end + end + + local offset = 15 + + if not pos then + pos = ply:GetPos() + offset = 80 + end + + pos.z = pos.z + offset + + ang:RotateAroundAxis(ang:Forward(), 90) + ang:RotateAroundAxis(ang:Right(), 90) + cam.Start3D2D(pos, Angle(0, ang.y, 90), math.max(2.5 * Distance / 2000, 0.5)) + cam.IgnoreZ(true) + draw.DrawText(ply:Nick(), "BeatrunHUD", 2, 2, color, TEXT_ALIGN_CENTER) + cam.IgnoreZ(false) + cam.End3D2D() + + return dontdraw + end +end + +hook.Add("PrePlayerDraw", "HideNearby", HideNearby) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/OnlineCourse.lua b/beatrun/gamemodes/beatrun/gamemode/cl/OnlineCourse.lua new file mode 100644 index 0000000..5a40552 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/OnlineCourse.lua @@ -0,0 +1,85 @@ +local apikey = CreateConVar("beatrun_apikey", "0", true, { + FCVAR_ARCHIVE, + FCVAR_UNLOGGED +}) + +function UploadCourse() + print("This is dangerous as you'd be connecting to a potentionally malicious site. If you wish to reenable this functionality, find this string in the beatrun folder and uncomment some stuff.") + --if Course_Name == "" or Course_ID == "" then + -- print("Can't upload in Freeplay") +-- +-- -- return +-- --end +-- +-- --local file = file.Open("beatrun/courses/" .. game.GetMap() .. "/" .. Course_ID .. ".txt", "rb", "DATA") +-- --local filedata = util.Decompress(file:Read(file:Size())) +-- +-- --local function h_failed(reason) +-- -- print("HTTP failed: ", reason) +-- --end +-- +-- --local function h_success(code, body, headers) +-- -- print(body) +-- --end +-- +-- --local h_method = "POST" +-- --local h_url = "https://datae.org/beatrun/upload.php" +-- --local h_headers = { +-- -- ["Content-Type"] = "text/plain", +-- -- ["Content-Length"] = filedata:len(), +-- -- ["User-Agent"] = "Beatrun/1.0.0", +-- -- ["Accept-Encoding"] = "gzip, deflate", +-- -- Authorization = apikey:GetString(), +-- -- ["Game-Map"] = game.GetMap() +-- --} +-- --local h_type = "text/plain" +-- --local h_body = filedata +-- +-- --HTTP({ +-- -- failed = h_failed, +-- -- success = h_success, +-- -- method = h_method, +-- -- url = h_url, +-- -- headers = h_headers, +-- -- type = h_type, +-- -- body = h_body + --}) +end + +concommand.Add("Beatrun_UploadCourse", UploadCourse) + +local GetCourse_Errors = { + ["Bad map"] = "Error: You are not playing on the map this course was intended for.", + ["Not member"] = "Membership error. For more info, login at datae.org/beatrun", + ["Bad code"] = "Error: The share code provided is invalid.", + ["Not valid key"] = "Error: The API key used is not valid." +} + +function GetCourse(sharecode) + print("This is dangerous as you'd be connecting to a potentionally malicious site. If you wish to reenable this functionality, find this string in the beatrun folder and uncomment some stuff.") + --http.Fetch("https://datae.org/beatrun/getcourse.php?sharecode=" .. sharecode .. "&map=" .. game.GetMap() .. "&key=" .. apikey:GetString(), function (body, length, headers, code) + -- local errorcode = GetCourse_Errors[body] +-- +-- -- if not errorcode then +-- -- print("Success | Code:", code, "Length:", length) +-- -- PrintTable(headers) +-- -- LoadCourseRaw(util.Compress(body)) +-- +-- -- return true +-- -- else +-- -- print(errorcode) +-- +-- -- return false +-- -- end +-- --end, function (message) +-- -- print("An error occurred.", message) +-- +-- -- return false +-- --end, { +-- -- ["accept-encoding"] = "gzip, deflate" + --}) +end + +concommand.Add("Beatrun_LoadCode", function (ply, cmd, args, argstr) + GetCourse(args[1]) +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/PacketLossFix.lua b/beatrun/gamemodes/beatrun/gamemode/cl/PacketLossFix.lua new file mode 100644 index 0000000..72adcd1 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/PacketLossFix.lua @@ -0,0 +1,23 @@ +local checktimer = 0 +local errorc = Color(255, 25, 25) +local whitelist = { + c_ladderanim = true +} +local whitelistanims = fbanims + +local function BodyAnimAntiStuck() + if not IsValid(BodyAnim) then + checktimer = 0 + + return + end + + local ply = LocalPlayer() + + if not deleteonend and not whitelist[BodyAnimMDLString] and not whitelistanims[BodyAnimString] and not ply:GetSliding() and ply:GetWallrun() == 0 then + RemoveBodyAnim() + MsgC(errorc, "Removing potentially stuck anim!!\n") + end +end + +hook.Add("Think", "PacketLossFix", BodyAnimAntiStuck) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/SteamPresence.lua b/beatrun/gamemodes/beatrun/gamemode/cl/SteamPresence.lua new file mode 100644 index 0000000..cd1bf0b --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/SteamPresence.lua @@ -0,0 +1,60 @@ +if not system.IsWindows() or not file.Exists("lua/bin/gmcl_steamfriends_win64.dll", "GAME") then + return +end + +local richtext = "" +local nextupdate = 0 + +local function UpdateRichPresence() + if CurTime() < nextupdate then + return + end + + local rp = steamworks.SetRichPresence + + if not rp then + return + end + + local ply = LocalPlayer() + + if not ply.GetLevel then + return + end + + local map = game.GetMap() + local level = LocalPlayer():GetLevel() + local course = nil + local customname = hook.Run("BeatrunHUDCourse") + course = customname and customname or Course_Name ~= "" and Course_Name or "Freeplay" + + if course == nil then + course = "Freeplay" + end + + local updatedtext = "Beatrun Lv. " .. level .. " (" .. map .. ") | " .. course + + if richtext ~= updatedtext then + richtext = updatedtext + + rp("generic", richtext) + print("Updating presence") + end + + nextupdate = CurTime() + 60 +end + +local function LoadRichPresenceDLL() + require("steamfriends") +end + +hook.Add("OnGamemodeLoaded", "LoadDLL", function () + local dllfound = pcall(LoadRichPresenceDLL) + LoadRichPresenceDLL = nil + + if not dllfound then + hook.Remove("Tick", "UpdateRichPresence") + else + hook.Add("Tick", "UpdateRichPresence", UpdateRichPresence) + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/Synesthesia.lua b/beatrun/gamemodes/beatrun/gamemode/cl/Synesthesia.lua new file mode 100644 index 0000000..1a3fb7e --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/Synesthesia.lua @@ -0,0 +1,421 @@ +Synesthesia = Synesthesia or {} +local syn = Synesthesia + +function syn:Reset() + if IsValid(self.channel) then + if self.channel.Stop then + self.channel:Stop() + end + + self.channel = nil + end + + self.events = nil + self.curevent = 1 + self.length = 0 + self.lasttime = 0 + self.finished = false + + hook.Remove("PreRender", "Synesthesia") +end + +function syn:Looped() + self.curevent = 1 + self.lasttime = 0 + self.finished = false +end + +function syn:Finished() + self.finished = true +end + +function syn:Play(file, events) + self:Reset() + sound.PlayFile(file, "noblock", function (a) + if IsValid(a) then + timer.Simple(0, function () + a:EnableLooping(true) + end) + + self.length = a:GetLength() + self.channel = a + self.events = events + + hook.Add("PreRender", "Synesthesia", self.Think) + else + ErrorNoHaltWithStack("Failed to play ", file) + + return + end + end) +end + +function syn:Stop() + self:Reset() +end + +function syn:GetEvents() + return self.events +end + +function syn:CurEvent() + return self.curevent +end + +function syn:UpEvent() + self.curevent = self.curevent + 1 + + return self.curevent +end + +function syn:GetLength() + return self.length +end + +function syn:GetTime() + return self.channel:GetTime() +end + +function syn:GetFinished() + return self.finished +end + +function syn:Think() + local self = syn + local curtime = self:GetTime() + local curevent = self:GetEvents()[self:CurEvent()] + + if not self:GetFinished() and curevent[1] <= curtime then + curevent[2]() + + local nextevent = self:UpEvent() + + if not self:GetEvents()[nextevent] then + self:Finished() + end + end + + if curtime < self.lasttime then + self:Looped() + end + + self.lasttime = self:GetTime() +end + +local testbuildup = false +local testfovconvar = GetConVar("Beatrun_FOV", 110) +local testfov = 100 +local colbeatr = 250 +local colbeatg = 120 +local colbeatb = 40 +local colr = 250 +local colg = 120 +local colb = 40 +local testcurcolor = 1 +local testcolor = Color(151, 166, 182) + +local function test_beat() + testfov = testfovconvar:GetFloat() + BlindGetColor().r = colbeatr + BlindGetColor().g = colbeatg + BlindGetColor().b = colbeatb + + if not testbuildup then + blindrandx = 2 + blindrandy = 2 + blindrandz = 2 + end + + vanishrandx = 0 + vanishrandy = 0 + vanishrandz = 4 + vanishusenormal = false + + LocalPlayer():SetFOV(testfov - 1) + LocalPlayer():SetFOV(testfov, 1) +end + +local function test_beathard() + BlindGetColor().r = colbeatr + BlindGetColor().g = colbeatg + BlindGetColor().b = colbeatb + + if not testbuildup then + blindrandx = 2 + blindrandy = 2 + blindrandz = 2 + end + + vanishrandx = 0 + vanishrandy = 0 + vanishrandz = 4 + vanishusenormal = false + + LocalPlayer():SetFOV(testfov + 2) + LocalPlayer():SetFOV(testfov, 2) +end + +local function test_color1() + colbeatb = 200 + colbeatg = 200 + colbeatr = 240 + colb = 185 + colg = 160 + colr = 150 + testcurcolor = 1 +end + +local function test_color2() + colbeatb = 5 + colbeatg = 75 + colbeatr = 250 + colb = 40 + colg = 120 + colr = 250 + testcurcolor = 2 +end + +local function test_pullback() + eyedot = 0.52 +end + +local function test_startbuildup() + blindrandx = 0.5 + blindrandy = 0.5 + blindrandz = 0.5 + testbuildup = true +end + +local function test_endbuildup() + testbuildup = false +end + +local function test_think() + BlindGetColor().r = math.Approach(BlindGetColor().r, colr, FrameTime() * 100) + BlindGetColor().g = math.Approach(BlindGetColor().g, colg, FrameTime() * 100) + BlindGetColor().b = math.Approach(BlindGetColor().b, colb, FrameTime() * 100) + vanishrandx = math.Approach(vanishrandx, 0.5, FrameTime() * 50) + vanishrandy = math.Approach(vanishrandy, 0.5, FrameTime() * 50) + vanishrandz = math.Approach(vanishrandz, 0.5, FrameTime() * 50) + vanishusenormal = vanishrandx == 0.5 + + if testcurcolor == 1 then + eyedot = math.Approach(eyedot, 0.6, FrameTime() * 0.15) + else + eyedot = 0.4 + end + + if testbuildup then + GlitchIntensity = math.Approach(GlitchIntensity, 0.65, FrameTime() * 0.1) + blindrandx = math.Approach(blindrandx, 1.5, FrameTime() * 0.1) + blindrandy = math.Approach(blindrandy, 1.5, FrameTime() * 0.1) + blindrandz = math.Approach(blindrandz, 1.5, FrameTime() * 0.1) + else + GlitchIntensity = math.Approach(GlitchIntensity, 0.1, FrameTime() * 4) + blindrandx = math.Approach(blindrandx, 0.5, FrameTime() * 10) + blindrandy = math.Approach(blindrandy, 0.5, FrameTime() * 10) + blindrandz = math.Approach(blindrandz, 0.5, FrameTime() * 10) + end +end + +local testevents = { + { + 0, + test_color1 + }, + { + 0, + test_endbuildup + }, + { + 0, + test_beat + }, + { + 0.75, + test_pullback + }, + { + 1.1, + test_pullback + }, + { + 1.9, + test_pullback + }, + { + 3.25, + test_beat + }, + { + 6.75, + test_beat + }, + { + 7.6, + test_pullback + }, + { + 8, + test_pullback + }, + { + 8.85, + test_pullback + }, + { + 9, + test_pullback + }, + { + 9.02, + test_pullback + }, + { + 10.25, + test_beat + }, + { + 13.675, + test_beat + }, + { + 14.5, + test_pullback + }, + { + 15, + test_pullback + }, + { + 15, + test_startbuildup + }, + { + 15.8, + test_pullback + }, + { + 15.9, + test_pullback + }, + { + 16, + test_pullback + }, + { + 17.065, + test_beat + }, + { + 20.5, + test_beat + }, + { + 21.3, + test_pullback + }, + { + 21.7, + test_pullback + }, + { + 22.5, + test_pullback + }, + { + 22.8, + test_pullback + }, + { + 22.82, + test_pullback + }, + { + 24, + test_beat + }, + { + 27.375, + test_beathard + }, + { + 27.375, + test_color2 + }, + { + 30.75, + test_beat + }, + { + 34.25, + test_beathard + }, + { + 37.65, + test_beat + }, + { + 41, + test_endbuildup + }, + { + 41.1, + test_beat + }, + { + 44, + test_startbuildup + }, + { + 44.5, + test_beat + }, + { + 48, + test_beathard + }, + { + 51.4, + test_beat + }, + { + 54.8, + test_beat + }, + { + 54.8, + test_endbuildup + }, + { + 58.25, + test_beat + }, + { + 59, + test_startbuildup + }, + { + 61.65, + test_beathard + }, + { + 65, + test_beat + } +} + +function test_syn(a) + if a then + customglitch = true + + BlindSetColor(testcolor) + Synesthesia:Play("sound/music/shard/puzzle_012.ogg", testevents) + hook.Add("PreRender", "test_think", test_think) + else + Synesthesia:Stop() + hook.Remove("PreRender", "test_think") + end +end + +hook.Add("Blind", "syntest", test_syn) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/Viewpunch.lua b/beatrun/gamemodes/beatrun/gamemode/cl/Viewpunch.lua new file mode 100644 index 0000000..6efba27 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/Viewpunch.lua @@ -0,0 +1,139 @@ +local meta = FindMetaTable("Player") +local metavec = FindMetaTable("Vector") +local PUNCH_DAMPING = 9 +local PUNCH_SPRING_CONSTANT = 120 +local viewbob_intensity = CreateClientConVar("Beatrun_ViewbobIntensity", "20", true, true, "Viewbob Intensity", -100, 100) +local viewbob_stabilized = CreateClientConVar("Beatrun_ViewbobStabilized", "0", true, true, "Turn on to reduce motion sickness by making viewbobbing keep the player's look position centered", 0, 1) + +local function lensqr(ang) + return ang[1]^2 + ang[2]^2 + ang[3]^2 +end + +function metavec:Approach(x, y, z, speed) + if not isnumber(x) then + local vec = x + speed = y + x, y, z = vec:Unpack() + end + + self[1] = math.Approach(self[1], x, speed) + self[2] = math.Approach(self[2], y, speed) + self[3] = math.Approach(self[3], z, speed) +end + +local function CLViewPunchThink() + local self = LocalPlayer() + + if not self.ViewPunchVelocity then + self.ViewPunchVelocity = Angle() + self.ViewPunchAngle = Angle() + end + + local vpa = self.ViewPunchAngle + local vpv = self.ViewPunchVelocity + + if not self.ViewPunchDone and lensqr(vpa) + lensqr(vpv) > 1e-06 then + local FT = FrameTime() + vpa = vpa + vpv * FT + local damping = 1 - PUNCH_DAMPING * FT + + if damping < 0 then + damping = 0 + end + + vpv = vpv * damping + local springforcemagnitude = PUNCH_SPRING_CONSTANT * FT + springforcemagnitude = math.Clamp(springforcemagnitude, 0, 2) + vpv = vpv - vpa * springforcemagnitude + vpa[1] = math.Clamp(vpa[1], -89.9, 89.9) + vpa[2] = math.Clamp(vpa[2], -179.9, 179.9) + vpa[3] = math.Clamp(vpa[3], -89.9, 89.9) + self.ViewPunchAngle = vpa + self.ViewPunchVelocity = vpv + else + self.ViewPunchDone = true + end +end + +hook.Add("Think", "CLViewPunch", CLViewPunchThink) + +local PunchPos = Vector() +local runfwd = 0 +local runangmul = 1 +local crouchmul = 1 +local capmul = 0 + +local function CLViewPunchCalc(ply, pos, ang) + local ply = LocalPlayer() + + if ply.ViewPunchAngle then + ang:Add(ply.ViewPunchAngle) + end + + local stabilize = viewbob_stabilized:GetBool() and 1 or -1 + local vel = ply:GetVelocity():Length() + local punchang = ply:GetViewPunchAngles() + (ply.ViewPunchAngle or angle_zero) + + if ply:OnGround() and not ArmInterrupting(ply.BAC) and not ply:Crouching() and not ply:GetRolling() and ply:KeyDown(IN_FORWARD) and vel > 155 then + local offset = Vector(0, -1, 0) + + if runfwd < 0.8 then + capmul = math.Approach(capmul, 1, FrameTime() * 2) + else + capmul = math.Approach(capmul, 0, FrameTime() * 8) + end + + vel = Lerp(capmul, vel, 290) + + offset:Mul(punchang.z * math.min(math.max((vel / 300 - 1) * stabilize, 0), 1) * 165) + PunchPos:Approach(offset, FrameTime() * vel / 100 * 150 * math.abs(runfwd - 1.35) * 0.65) + + runfwd = math.Approach(runfwd, 0.1, FrameTime() * 0.25) + else + PunchPos:Approach(0, 0, 0, FrameTime() * 5) + + runfwd = math.Approach(runfwd, 1.25, FrameTime() * 5) + end + + local grounded = ply:OnGround() and ply:GetMantle() == 0 and ply:GetClimbing() == 0 and not ply:GetSliding() and not ply:Crouching() + + if not grounded then + crouchmul = math.Approach(crouchmul, 0, FrameTime() * 10) + else + crouchmul = math.Approach(crouchmul, 1, FrameTime() * 1.5) + end + + local punchlocal = LocalToWorld(PunchPos, angle_zero, pos, ang) + + punchlocal:Sub(pos) + punchlocal:Mul(math.abs(runfwd - 1.25)) + + punchlocal.z = math.max(math.abs(PunchPos.y) * math.abs(runfwd - 1) * 2, -0.5) * crouchmul + + punchlocal:Mul(0.66) + pos:Add(punchlocal) + punchlocal:Mul(1.5151515151515151) + + runangmul = math.Approach(runangmul, grounded and 0.5 or 0, FrameTime() * (grounded and 5 or 15)) + + ang:Sub(ply:GetViewPunchAngles() * math.abs(runfwd - 0.75) * runangmul) + + ang.z = ang.z - PunchPos.y * 0.15 * math.Clamp(-(runfwd - 1) * 1.25, 0, 1.25) + ang.x = ang.x + punchlocal.z * 0.1 * math.Clamp(runfwd * 1.25 - 0.125, 0, 1.25) +end + +hook.Add("CalcViewBA", "CLViewPunch", CLViewPunchCalc) + +function meta:CLViewPunch(angle) + self.ViewPunchVelocity:Add(angle * viewbob_intensity:GetFloat()) + + local ang = self.ViewPunchVelocity + ang[1] = math.Clamp(ang[1], -180, 180) + ang[2] = math.Clamp(ang[2], -180, 180) + ang[3] = math.Clamp(ang[3], -180, 180) + self.ViewPunchDone = false +end + +function meta:GetCLViewPunchAngles() + return self.ViewPunchAngle +end diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/Watermark.lua b/beatrun/gamemodes/beatrun/gamemode/cl/Watermark.lua new file mode 100644 index 0000000..ab62128 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/Watermark.lua @@ -0,0 +1,24 @@ +local wmx, wmy = 0, 0 +local wmtime = 0 +hook.Add("PostRender", "Watermark", function() + -- surface.SetFont("DebugFixed") + -- surface.SetTextColor(255,255,255, 75) + -- local steamid = LocalPlayer():SteamID() + -- local tw, th = surface.GetTextSize(steamid) + + -- if SysTime() > wmtime then + -- wmx, wmy = math.random(0, ScrW()-100), math.random(0, ScrH()-100) + -- wmtime = SysTime() + 2 + -- end + + -- cam.Start2D() + -- surface.SetTextPos(wmx,wmy) + -- surface.DrawText("Beta") + -- surface.SetTextPos(wmx,wmy+th) + -- surface.DrawText(steamid) + -- surface.SetTextPos(wmx,wmy+(th*2)) + -- surface.DrawText(system.SteamTime()) + -- surface.SetTextPos(wmx,wmy+(th*3)) + -- surface.DrawText(LocalPlayer():Nick()) + -- cam.End2D() +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/Whitescale.lua b/beatrun/gamemodes/beatrun/gamemode/cl/Whitescale.lua new file mode 100644 index 0000000..ffd8d6d --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/Whitescale.lua @@ -0,0 +1,61 @@ +local worldmats +local editedmats + +local worldmats_texture = {} +local worldmats_color = {} +local whitescale = false + +local function World_Whitescale() + worldmats = game.GetWorld():GetMaterials() + editedmats = {} + + local propmats = ents.FindByClass("prop_dynamic") + local dupeprops = {} + for k,v in pairs(propmats) do + if dupeprops[v:GetModel()] then continue end + for k,v in pairs(v:GetMaterials()) do + table.insert(worldmats, v) + end + dupeprops[v:GetModel()] = true + end + + for k,v in pairs(worldmats) do + if v:find("water/") then continue end + local newmat = Material(v) + table.insert(editedmats, newmat) + table.insert(worldmats_color, newmat:GetVector("$color")) + table.insert(worldmats_texture, newmat:GetString("$basetexture") or 0) + newmat:SetTexture("$basetexture", "models/debug/debugwhite") + -- if math.random()>0.5 then + local noise = util.SharedRandom(k, -0.25, 0) + newmat:SetVector("$color",Vector(0.65+noise,0.65+noise,0.65+noise)) + -- else + -- newmat:SetVector("$color",Vector(0.95,0.05,0.05)) + -- end + end + whitescale = true + net.Start("ToggleWhitescale") + net.WriteBool(whitescale) + net.SendToServer() +end + +local function World_WhitescaleOff() + if !editedmats then return end + for k,v in pairs(editedmats) do + local oldtexture = worldmats_texture[k] + if oldtexture != 0 then + v:SetTexture("$basetexture",worldmats_texture[k]) + end + v:SetVector("$color",worldmats_color[k]) + end + whitescale = false +end + +local function ToggleWhitescale() + if whitescale then + World_WhitescaleOff() + else + World_Whitescale() + end +end +concommand.Add("ToggleWhitescale",ToggleWhitescale) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/XP.lua b/beatrun/gamemodes/beatrun/gamemode/cl/XP.lua new file mode 100644 index 0000000..7c3b6e2 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/XP.lua @@ -0,0 +1,149 @@ +local meta = FindMetaTable("Player") +local XP_max = 2000000 +local XP_ratiocache = nil +local parkourevent_lastpos = Vector() + +function XP_nextlevel(level) + return math.Round(0.25 * level^3 + 0.8 * level^2 + 2 * level) +end + +local ParkourXP = { + roll = 3, + sidestep = 1, + slide = 1, + vault = 2, + climb = 4, + wallrunh = 2, + springboard = 2, + wallrunv = 2, + coil = 1, + swingbar = 4, + step = 1 +} +local ParkourXP_RNG = { + sidestep = 0.1 +} +local ParkourXP_PosCheck = { + climb = true, + vault = true, + wallrunh = true, + wallrunv = true +} +XP_floatingxp = {} + +hook.Add("OnParkour", "ParkourXP", function (event) + local ply = LocalPlayer() + + if ply.InReplay then + return + end + + local pos = ply:GetPos() + + if math.random() < (ParkourXP_RNG[event] or 1) and (not ParkourXP_PosCheck[event] or parkourevent_lastpos:Distance(pos) > 200) then + local xp = (ParkourXP[event] or 0) * math.max(math.Round(ply:GetLevel() * 0.05), 1) + + ply:AddXP(xp) + + if ParkourXP_PosCheck[event] then + parkourevent_lastpos:Set(pos) + end + end +end) + +function meta:GetLevel() + return self.Level or 0 +end + +function meta:GetLevelRatio() + local lastratio = XP_nextlevel(self:GetLevel() - 1) + XP_ratiocache = XP_ratiocache or (self:GetXP() - lastratio) / (XP_nextlevel(self:GetLevel()) - lastratio) + + return XP_ratiocache +end + +function meta:SetLevel(level) + self.Level = level + XP_ratiocache = nil +end + +function meta:LevelUp() + local i = 0 + + while self:GetLevelRatio() >= 1 do + self:SetLevel(self:GetLevel() + 1) + + i = i + 1 + + if i > 1000 then + break + end + end + + if i > 0 then + self:EmitSound("MirrorsEdge/UI/ME_UI_challenge_end_success.wav", 35, 100 + math.random(-5, 5)) + end +end + +function meta:GetXP() + return self.XP or 0 +end + +function meta:SetXP(xp) + self.XP = math.Round(xp) + XP_ratiocache = nil + + self:LevelUp() +end + +function meta:AddXP(xp) + self.XP = math.Round((self.XP or 0) + xp) + XP_ratiocache = nil + + self:LevelUp() + + self.LastXP = CurTime() + + if xp > 0 then + XP_floatingxp[CurTime() + 2] = "+" .. xp + end +end + +local function SaveXP() + local xp = util.TableToJSON({ + LocalPlayer().XP or 0, + LocalPlayer().Level or 1 + }) + local xpold = file.Read("beatrun/local/xp.txt", "DATA") + + if xpold then + xpold = util.Decompress(xpold) + + if LocalPlayer().XP < util.JSONToTable(xpold)[1] then + return + end + end + + local xp = util.Compress(xp) + + file.CreateDir("beatrun/local") + file.Write("beatrun/local/xp.txt", xp) +end + +hook.Add("ShutDown", "SaveXP", SaveXP) + +local function LoadXP() + local xp = file.Read("beatrun/local/xp.txt", "DATA") + + if xp then + xp = util.JSONToTable(util.Decompress(xp)) + + LocalPlayer():SetXP(xp[1]) + LocalPlayer():SetLevel(xp[2]) + else + LocalPlayer():SetXP(0) + LocalPlayer():SetLevel(1) + end +end + +hook.Add("InitPostEntity", "LoadXP", LoadXP) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/_UI.lua b/beatrun/gamemodes/beatrun/gamemode/cl/_UI.lua new file mode 100644 index 0000000..a4e6e78 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/_UI.lua @@ -0,0 +1,544 @@ +AEUI = {} +local AEUI = AEUI +local SScaleX_cached = {} +local SScaleY_cached = {} + +function SScaleX(sizex) + local iswide = AEUI.ScrW / AEUI.ScrH > 1.6 + + if SScaleX_cached[sizex] then + return SScaleX_cached[sizex] + end + + SScaleX_cached[sizex] = math.ceil(sizex / (1920 / AEUI.ScrW)) + + return SScaleX_cached[sizex] +end + +function SScaleY(sizey) + local iswide = AEUI.ScrW / AEUI.ScrH > 1.6 + + if SScaleY_cached[sizey] then + return SScaleY_cached[sizey] + end + + SScaleY_cached[sizey] = math.ceil(sizey / (1080 / AEUI.ScrH)) + + return SScaleY_cached[sizey] +end + +local SScaleX = SScaleX +local SScaleY = SScaleY + +function AEUIFonts() + surface.CreateFont("AEUIDefault", { + shadow = false, + blursize = 0, + underline = false, + rotary = false, + strikeout = false, + additive = false, + antialias = true, + extended = false, + scanlines = 0, + font = "D-DIN", + italic = false, + outline = false, + symbol = false, + weight = 500, + size = ScreenScale(7) + }) + surface.CreateFont("AEUILarge", { + shadow = false, + blursize = 0, + underline = false, + rotary = false, + strikeout = false, + additive = false, + antialias = true, + extended = false, + scanlines = 0, + font = "D-DIN", + italic = false, + outline = false, + symbol = false, + weight = 500, + size = ScreenScale(12) + }) + surface.CreateFont("AEUIVeryLarge", { + shadow = false, + blursize = 0, + underline = false, + rotary = false, + strikeout = false, + additive = false, + antialias = true, + extended = false, + scanlines = 0, + font = "D-DIN", + italic = false, + outline = false, + symbol = false, + weight = 500, + size = ScreenScale(18) + }) +end + +AEUIFonts() + +AEUI.Panels = {} +AEUI.Elements = {} +AEUI.MY = 0 +AEUI.MX = 0 +AEUI.LastClick = 0 +AEUI.ScrH = ScrH() +AEUI.ScrW = ScrW() +AEUI.HoveredPanel = nil + +function AEUI:DrawPanel(panel) + local x = SScaleX(panel.x) + local y = SScaleY(panel.y) + local w = SScaleX(panel.w) + local h = SScaleY(panel.h) + + surface.SetDrawColor(panel.bgcolor) + surface.DrawRect(x, y, w, h) + surface.SetDrawColor(panel.outlinecolor) + surface.DrawOutlinedRect(x, y, w, h) + render.SetScissorRect(x, y, x + w, y + h, true) +end + +function AEUI:AddPanel(panel) + if table.HasValue(AEUI.Panels, panel) then + return + end + + table.insert(AEUI.Panels, panel) + gui.EnableScreenClicker(true) +end + +function AEUI:RemovePanel(panel) + table.RemoveByValue(AEUI.Panels, panel) + + if #AEUI.Panels <= 0 then + gui.EnableScreenClicker(false) + end +end + +function AEUI:AddText(panel, str, font, x, y, centered, color) + font = font or "AEUIDefault" + x = x or 0 + y = y or 0 + centered = centered or false + color = color or color_white + local text = { + x = x, + y = y, + centered = centered, + color = color, + font = font, + string = str, + type = "Text" + } + + table.insert(panel.elements, text) + + return text +end + +function AEUI:AddButton(panel, str, func, font, x, y, centered, color) + font = font or "AEUIDefault" + x = x or 0 + y = y or 0 + centered = centered or false + color = color or color_white + func = func or function () + end + local button = { + x = x, + y = y, + centered = centered, + color = color, + font = font, + string = str, + type = "Button", + onclick = func + } + + table.insert(panel.elements, button) + + return button +end + +function AEUI:AddImage(panel, mat, func, x, y, w, h, color) + font = font or "AEUIDefault" + x = x or 0 + y = y or 0 + centered = centered or false + color = color or color_white + func = func or function () + end + local image = { + x = x, + y = y, + w = w, + h = h, + centered = centered, + color = color, + font = font, + mat = mat, + type = "Image", + onclick = func + } + + table.insert(panel.elements, image) + + return image +end + +function AEUI:Clear() + table.Empty(AEUI.Panels) + gui.EnableScreenClicker(false) +end + +function AEUI:DrawElement(panel, data) + AEUI.Elements[data.type](panel, data) +end + +local function AEUIDraw() + if AEUI.NoDraw then + return + end + + for k, v in ipairs(AEUI.Panels) do + surface.SetAlphaMultiplier(v.alpha or 1) + AEUI:DrawPanel(v) + surface.SetAlphaMultiplier(1) + + if v.elements then + for l, b in ipairs(v.elements) do + AEUI:DrawElement(v, b) + end + end + + render.SetScissorRect(0, 0, 0, 0, false) + + local maxscroll = math.abs(v.maxscroll or 0) + + if (v.maxscroll or 0) > 0 then + local ratio = math.abs((v.scroll or 0) / maxscroll) + local visratio = v.h / maxscroll + local height = maxscroll * visratio * 0.5 + + surface.SetDrawColor(255, 255, 255) + surface.DrawRect(SScaleX(v.x + v.w), SScaleY(v.y + height * ratio), SScaleX(8), SScaleY(height)) + end + end + + if AEUI.HoveredElement then + local e = AEUI.HoveredElement + + if e.hover then + local mx = AEUI.MX + SScaleX(20) + local my = AEUI.MY + SScaleY(20) + + surface.SetTextColor(255, 255, 255) + surface.SetFont("AEUIDefault") + + local tw, th = surface.GetTextSize(e.hover) + + if ScrW() < mx + tw then + mx = mx - tw + end + + surface.SetTextPos(mx + 2, my + 2) + surface.SetDrawColor(AEUI.HoveredPanel.bgcolor) + surface.DrawRect(mx, my, tw + 4, th + 4) + surface.SetDrawColor(AEUI.HoveredPanel.outlinecolor) + surface.DrawOutlinedRect(mx, my, tw + 4, th + 4) + surface.DrawText(e.hover) + end + end +end + +hook.Add("HUDPaint", "AEUIDraw", AEUIDraw) +hook.Add("StartCommand", "AEUI_StartCommand", function (ply, cmd) + local mx = gui.MouseX() + local my = gui.MouseY() + AEUI.MY = my + AEUI.MX = mx + + for i = 1, #AEUI.Panels do + local panel = AEUI.Panels[#AEUI.Panels + 1 - i] + local x = SScaleX(panel.x) + local y = SScaleY(panel.y) + local w = SScaleX(panel.w) + local h = SScaleY(panel.h) + + if x < mx and mx < x + w and y < my and my < y + h then + AEUI.HoveredPanel = panel + + break + else + AEUI.HoveredPanel = nil + end + end + + local wheelup = input.WasMousePressed(MOUSE_WHEEL_UP) and 63 or 0 + local wheeldown = input.WasMousePressed(MOUSE_WHEEL_DOWN) and -63 or 0 + local scrolldelta = wheelup + wheeldown + local hoveredpanel = AEUI.HoveredPanel + + if scrolldelta ~= 0 and hoveredpanel and (hoveredpanel.maxscroll or 0) > 0 then + hoveredpanel.scroll = math.Clamp((hoveredpanel.scroll or 0) + scrolldelta, -hoveredpanel.maxscroll, 0) + end + + local click = input.WasMousePressed(MOUSE_LEFT) + + if hoveredpanel then + for k, v in ipairs(hoveredpanel.elements) do + if (v.onclick or v.hover) and (not v.greyed or not v.greyed()) and v.w and v.h then + local x = SScaleX(hoveredpanel.x) + SScaleX(v.x) + local y = SScaleY(hoveredpanel.y) + SScaleY(v.y) + (hoveredpanel.scroll or 0) + local w = v.w + local h = v.h + + if v.centered then + x = x - w * 0.5 + y = y - h * 0.5 + end + + if x < mx and mx < x + w and y < my and my < y + h then + AEUI.HoveredElement = v + + if v.onclick and click and AEUI.LastClick < CurTime() then + v:onclick() + + AEUI.LastClick = CurTime() + 0.1 + end + + break + else + AEUI.HoveredElement = nil + end + end + end + else + AEUI.HoveredElement = nil + end +end) +hook.Add("OnScreenSizeChanged", "AEUI_ScreenSize", function () + AEUI.ScrH = ScrH() + AEUI.ScrW = ScrW() + + table.Empty(SScaleX_cached) + table.Empty(SScaleY_cached) + AEUIFonts() +end) + +function AEUI.Elements.Text(panel, data) + local ox = SScaleX(panel.x) + local oy = SScaleY(panel.y) + (panel.scroll or 0) + local isgreyed = false + + if data.greyed then + isgreyed = data.greyed() + end + + surface.SetFont(data.font) + + if isgreyed then + local colr, colg, colb = data.color:Unpack() + + surface.SetDrawColor(colr, colg, colb, 50) + surface.SetTextColor(colr, colg, colb, 50) + else + surface.SetDrawColor(data.color) + surface.SetTextColor(data.color) + end + + if not isgreyed and AEUI.HoveredElement == data then + surface.SetTextColor(0, 230, 0) + end + + local posy = 0 + local dataw = 0 + local datah = 0 + local str = data.string + + if isfunction(str) then + str = str() or "" + end + + for k, v in ipairs(string.Split(str, "\n")) do + if v ~= "" then + if data.centered then + local tw, th = surface.GetTextSize(v) + local x = ox + SScaleX(data.x) - tw * 0.5 + local y = oy + SScaleY(data.y) - th * 0.5 + th * (k - 1) + datah = datah + th + + if dataw < tw then + dataw = tw + end + + if posy < y then + posy = y + th * (k - 1) + end + + surface.SetTextPos(x, y) + else + local tw, th = surface.GetTextSize(v) + local x = ox + SScaleX(data.x) + local y = oy + SScaleY(data.y) + th * (k - 1) + datah = datah + th + + if dataw < tw then + dataw = tw + end + + if posy < y then + posy = y + th * (k - 1) + end + + surface.SetTextPos(x, y) + end + + surface.DrawText(v) + end + end + + data.h = datah + data.w = dataw + posy = posy - oy - SScaleY(panel.h) + + if not panel.maxscroll or panel.maxscroll < posy then + panel.maxscroll = posy + end +end + +function AEUI.Elements.Button(panel, data) + local ox = SScaleX(panel.x) + local oy = SScaleY(panel.y) + (panel.scroll or 0) + + surface.SetFont(data.font) + + local isgreyed = false + + if data.greyed then + isgreyed = data.greyed() + end + + if isgreyed then + local colr, colg, colb = data.color:Unpack() + + surface.SetDrawColor(colr, colg, colb, 50) + surface.SetTextColor(colr, colg, colb, 50) + else + surface.SetDrawColor(data.color) + surface.SetTextColor(data.color) + end + + if not isgreyed and AEUI.HoveredElement == data then + surface.SetDrawColor(0, 230, 0) + surface.SetTextColor(0, 230, 0) + end + + local posy = 0 + local v = data.string + local tw, th = surface.GetTextSize(v) + local dataw = 0 + local datah = 0 + + if data.centered then + datah = th + 4 + dataw = tw + 4 + + surface.DrawOutlinedRect(ox + SScaleX(data.x) - tw * 0.5 - 2, oy + SScaleY(data.y) - th * 0.5 - 2, dataw, datah) + + local x = ox + SScaleX(data.x) - tw * 0.5 + local y = oy + SScaleY(data.y) - th * 0.5 + + if posy < y then + posy = y + th + end + + surface.SetTextPos(x, y) + else + datah = th + dataw = tw + + surface.DrawOutlinedRect(ox + SScaleX(data.x), oy + SScaleY(data.y), tw, th) + + local x = ox + SScaleX(data.x) + local y = oy + SScaleY(data.y) + + if posy < y then + posy = y + th + end + + surface.SetTextPos(x, y) + end + + data.h = datah + data.w = dataw + + surface.DrawText(v) + + posy = posy - oy - SScaleY(panel.h) + + if not panel.maxscroll or panel.maxscroll < posy then + panel.maxscroll = posy + end +end + +function AEUI.Elements.Image(panel, data) + if not data.wo then + data.ho = data.h + data.wo = data.w + end + + local isgreyed = false + + if data.greyed then + isgreyed = data.greyed() + end + + local ox = SScaleX(panel.x) + local oy = SScaleY(panel.y) + (panel.scroll or 0) + local dataw = SScaleX(data.wo) + local datah = SScaleY(data.ho) + + if not isgreyed and AEUI.HoveredElement == data then + surface.SetDrawColor(0, 230, 0) + surface.DrawOutlinedRect(ox + SScaleX(data.x), oy + SScaleY(data.y), dataw, datah) + end + + local posy = 0 + local x = ox + SScaleX(data.x) + local y = oy + SScaleY(data.y) + + if isgreyed then + local colr, colg, colb = data.color:Unpack() + + surface.SetDrawColor(colr, colg, colb, 50) + else + surface.SetDrawColor(data.color) + end + + if posy < y then + posy = y + datah + end + + data.h = datah + data.w = dataw + + surface.SetMaterial(data.mat) + surface.DrawTexturedRect(ox + SScaleX(data.x), oy + SScaleY(data.y), dataw, datah) + + posy = posy - oy - SScaleY(panel.h) + + if not panel.maxscroll or panel.maxscroll < posy then + panel.maxscroll = posy + end +end diff --git a/beatrun/gamemodes/beatrun/gamemode/cl/blind.lua b/beatrun/gamemodes/beatrun/gamemode/cl/blind.lua new file mode 100644 index 0000000..6795819 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl/blind.lua @@ -0,0 +1,718 @@ +local function push_right(self, x) + assert(x ~= nil) + + self.tail = self.tail + 1 + self[self.tail] = x +end + +local function push_left(self, x) + assert(x ~= nil) + + self[self.head] = x + self.head = self.head - 1 +end + +local function pop_right(self) + if self:is_empty() then + return nil + end + + local r = self[self.tail] + self[self.tail] = nil + self.tail = self.tail - 1 + + return r +end + +local function pop_left(self) + if self:is_empty() then + return nil + end + + local r = self[self.head + 1] + self.head = self.head + 1 + local r = self[self.head] + self[self.head] = nil + + return r +end + +local function length(self) + return self.tail - self.head +end + +local function is_empty(self) + return self:length() == 0 +end + +local function iter_left(self) + local i = self.head + + return function () + if i < self.tail then + i = i + 1 + + return self[i] + end + end +end + +local function iter_right(self) + local i = self.tail + 1 + + return function () + if i > self.head + 1 then + i = i - 1 + + return self[i] + end + end +end + +local function contents(self) + local r = {} + + for i = self.head + 1, self.tail do + r[i - self.head] = self[i] + end + + return r +end + +local methods = { + push_right = push_right, + push_left = push_left, + peek_right = peek_right, + peek_left = peek_left, + pop_right = pop_right, + pop_left = pop_left, + rotate_right = rotate_right, + rotate_left = rotate_left, + remove_right = remove_right, + remove_left = remove_left, + iter_right = iter_right, + iter_left = iter_left, + length = length, + is_empty = is_empty, + contents = contents +} + +local function new() + local r = { + head = 0, + tail = 0 + } + + return setmetatable(r, { + __index = methods + }) +end + +local vecmeta = FindMetaTable("Vector") + +function vecmeta:LerpTemp(t, start, endpos) + local xs, ys, zs = start:Unpack() + local xe, ye, ze = endpos:Unpack() + + self:SetUnpacked(LerpL(t, xs, xe), LerpL(t, ys, ye), LerpL(t, zs, ze)) +end + +hitpoints = new() +hitcolor = new() +hitnormal = new() +soundpoints = new() +GlitchIntensity = 0 +local tr = {} +local tr_result = {} +local randvector = Vector() +local box_mins = Vector(-0.5, -0.5, -0.5) +local box_maxs = Vector(0.5, 0.5, 0.5) +local awareness = CreateClientConVar("blindness_awareness", 10000, true, false, "Awareness in hu") +local quality = CreateClientConVar("blindness_highquality", 1, true, false, "Draws quads instead of lines") +local boxang = Angle() +local vanishvec = Vector() +local vanishvecrand = Vector() +vanishrandx = 0.5 +vanishrandy = 0.5 +vanishrandz = 0.5 +blindrandx = 0.5 +blindrandy = 0.5 +blindrandz = 0.5 +blindrandobeyglitch = true +vanishlimit = 50 +vanishusenormal = true +eyedot = 0.4 +local red = Color(255, 0, 0) +local blue = Color(0, 0, 255) +local white = Color(210, 159, 110, 255) +local green = Color(0, 255, 0) +local circle = Material("circle.png", "nocull") +whiteg = white +customcolors = { + Color(210, 159, 110, 255), + Color(203, 145, 65, 255), + Color(205, 205, 220, 255), + Color(150, 50, 150, 255), + Color(250, 20, 80, 255), + Color(250, 120, 40, 255), + Color(250, 20, 40, 255), + Color(10, 255, 20, 255) +} +local forcelines = false + +function BlindSetColor(newcol) + white = newcol +end + +function BlindGetColor() + return white +end + +local grass = Color(20, 150, 10) +local sand = Color(76, 70, 50) +local glass = Color(10, 20, 150) +local limit = 5400 +local pinged = false +local camvector = Vector() +local camang = Angle() +local camlerp = 0 +local lerp, sound, bgm = nil +blindcolor = { + 0, + 0, + 0 +} +local colors = { + [MAT_DEFAULT] = blue, + [MAT_GLASS] = glass, + [MAT_SAND] = sand, + [MAT_DIRT] = sand, + [MAT_GRASS] = grass, + [MAT_FLESH] = red +} +local colorslist = { + green, + grass, + sand, + glass +} +blindrandrendermin = 0.9 +blindinverted = false +blindpopulate = false +blindpopulatespeed = 1000 +blindfakepopulate = false +customglitch = false +blindcustomlerp = 0 +blindcustompoints = { + Vector() +} +local blindcustompoints = blindcustompoints +local sizemult = 1 + +function InvertColors() + for k, v in ipairs(colorslist) do + v.r = 255 - v.r + v.g = 255 - v.g + v.b = 255 - v.b + end + + blindinverted = not blindinverted + + if blindinverted then + white.r = 0 + white.g = 0 + white.b = 0 + sizemult = 4 + blindcolor[1] = 61 + blindcolor[2] = 61 + blindcolor[3] = 61 + blindrandrendermin = 1 + else + white.r = 210 + white.g = 159 + white.b = 110 + blindcolor[1] = 0 + blindcolor[2] = 0 + blindcolor[3] = 0 + blindrandrendermin = 0.9 + end +end + +function TogglePopulate() + blindfakepopulate = not blindfakepopulate +end + +local colorsclass = { + prop_door_rotating = green, + func_door_rotating = green, + func_door = green +} +local blindedsounds = { + ["bad.wav"] = true, + ["music/locloop_unk.wav"] = true, + ["lidar/burst1.wav"] = true, + ["glitch.wav"] = true, + ["A_TT_CD_02.wav"] = true, + ["good.wav"] = true, + ["reset.wav"] = true, + ["ping.wav"] = true, + ["music/locloop.wav"] = true, + ["lidar/burst2.wav"] = true, + ["reset2.wav"] = true, + ["A_TT_CD_01.wav"] = true, + ["lidar/scan.wav"] = true, + ["lidar/burst4.wav"] = true, + ["lidar/burst3.wav"] = true, + ["lidar/scanstop.wav"] = true +} +local trw = { + collisiongroup = COLLISION_GROUP_WORLD +} +local trwr = {} + +local function IsInWorld(pos) + trw.start = pos + trw.endpos = pos + trw.output = trwr + + util.TraceLine(trw) + + return trwr.HitWorld +end + +local function RandomizeCam(eyepos, eyeang) + local ctsin = 1 / (LocalPlayer():GetEyeTrace().Fraction * 200) + + if IsInWorld(eyepos) then + ctsin = 100 + end + + lerp = Lerp(25 * FrameTime(), camlerp, ctsin) + camvector.x = eyepos.x + lerp + camvector.y = eyepos.y + lerp + camvector.z = eyepos.z + lerp + camang.p = eyeang.p + camang.y = eyeang.y + camang.r = eyeang.r +end + +local function populatetrace(eyepos) + local af = awareness:GetFloat() or 1000 + randvector.x = eyepos.x + math.random(-af, af) + randvector.y = eyepos.y + math.random(-af, af) + randvector.z = eyepos.z + math.random(-af * 0.5, af) + tr.start = eyepos + tr.endpos = randvector + tr.output = tr_result + + if not IsValid(tr.filter) then + tr.filter = LocalPlayer() + end + + util.TraceLine(tr) + + return tr_result +end + +local function Echo(t) + table.insert(soundpoints, t.Pos) + + if not blindedsounds[t.SoundName] and t.SoundName:Left(3) ~= "te/" then + return false + end +end + +local function PopThatMotherfucker() + hitpoints:pop_left() + hitcolor:pop_left() + hitnormal:pop_left() +end + +local blindcolor = blindcolor +local fakepopulatevec = Vector(1, 2, 3) +LOCEntities = LOCEntities or {} +meshtbl = meshtbl or new() +local meshtbl = meshtbl +pausescan = false +local mathrandom = math.random + +local function OptimizeMeshes() + local i = 0 + local vertexcount = 0 + + for v in meshtbl:iter_left() do + if i >= 90 then + break + end + + v:Destroy() + + i = i + 1 + end +end + +glob_blindangles = Angle() +glob_blindorigin = Vector() +curmesh = Mesh() +local lastpointcount = 0 +local nextcachecheck = 0 + +local function Blindness(origin, angles) + local ply = LocalPlayer() + local eyepos = origin + local eyeang = angles + local FT = FrameTime() + local quality = quality:GetBool() + + glob_blindorigin:Set(origin) + glob_blindangles:Set(angles) + + local hitpointscount = nil + local vel_l = ply:GetVelocity():Length() + local vel = 2.5 + cang = math.pi * 2 / 16 + (ply.offset or 0) + cpos = Vector(0, math.cos(cang) * 75, math.sin(cang) * 250) + ply.offset = (ply.offset or 0) + FrameTime() + + if ply.offset >= 180 then + ply.offset = 0 + end + + local randrender = math.Rand(blindrandrendermin, 1) + + render.Clear(blindcolor[1] * randrender, blindcolor[2] * randrender, blindcolor[3] * randrender, 0) + render.ClearDepth() + render.ClearStencil() + + if blindpopulate then + for i = 0, FT * blindpopulatespeed do + if not blindfakepopulate then + local trace = populatetrace(blindorigin or eyepos) + + if trace.Hit then + hitpoints:push_right(trace.HitPos) + + local invert = mathrandom() + + if invert < 0.05 then + trace.HitNormal:Mul(-1) + end + + hitnormal:push_right(trace.HitNormal) + + local hcol = colors[trace.MatType] + local hcolclass = colorsclass[trace.Entity:GetClass()] + + hitcolor:push_right(hcol or hcolclass or white) + + if limit < hitpoints:length() then + PopThatMotherfucker() + end + end + else + hitpoints:push_right(fakepopulatevec) + hitnormal:push_right(fakepopulatevec) + hitcolor:push_right(white) + + if limit < hitpoints:length() then + PopThatMotherfucker() + end + end + end + end + + hitpointscount = soundpoints:length() + + while limit < hitpointscount do + soundpoints:pop_left() + + hitpointscount = soundpoints:length() + end + + RandomizeCam(eyepos, eyeang) + + if sound then + sound:ChangeVolume((lerp - 0.1) * 0.25) + end + + cam.Start3D(camvector, camang) + + for k, v in pairs(LOCEntities) do + if not IsValid(k) then + LOCEntities[k] = nil + else + k:DrawLOC() + end + end + + local lastpos = hitpoints[hitpoints.tail] + local f = eyeang:Forward() + local eyediff = Vector() + local k = limit + local k2 = 0 + local vanishlimit = vanishlimit + local vanishrandx = vanishrandx + local vanishrandy = vanishrandy + local vanishrandz = vanishrandz + local blindrandx = blindrandx + local blindrandy = blindrandy + local blindrandz = blindrandz + local blindrandobeyglitch = blindrandobeyglitch + + render.SetMaterial(circle) + + if not customglitch then + GlitchIntensity = lerp + end + + LocalPlayer().offset = (LocalPlayer().offset or 0) + FrameTime() * 2 + + if LocalPlayer().offset >= 180 then + LocalPlayer().offset = 0 + end + + local ed = eyedot + local anggg = ply:EyeAngles() + anggg.x = 0 + local eyep = ply:EyePos() + anggg:Forward() * 200 + local hitindex = 1 + local drawcount = #blindcustompoints + local drawiters = 0 + local lerpt = blindcustomlerp + + if not pausescan then + if not curmesh:IsValid() or CurTime() < nextcachecheck then + local dynmesh = nil + + if CurTime() < nextcachecheck then + if curmesh:IsValid() then + curmesh:Destroy() + end + + dynmesh = mesh.Begin(MATERIAL_QUADS, limit) + else + curmesh = Mesh() + dynmesh = mesh.Begin(curmesh, MATERIAL_QUADS, limit) + end + + for v in hitpoints:iter_right() do + local col = hitcolor[hitcolor.tail - k2] or BlindGetColor() + + eyediff:Set(v) + + local drawindex = hitindex % drawcount + 1 + + if drawindex == 1 then + drawiters = drawiters + 1 + end + + eyep = blindcustompoints[drawindex] + Vector(math.random() * 2, math.random() * 2, math.random() * 2) + + if drawiters < 2 then + eyediff:LerpTemp(lerpt, eyediff, eyep) + end + + eyediff:Sub(eyepos) + + if ed < f:Dot(eyediff) / eyediff:Length() then + eyediff:Set(v) + + if v ~= fakepopulatevec then + if quality and not forcelines then + mesh.QuadEasy(eyediff, hitnormal[hitnormal.tail - k2], 2, 2, col) + else + render.DrawLine(eyediff, v, col) + end + end + + lastpos = v + end + + k = k - 1 + k2 = k2 + 1 + hitindex = hitindex + 1 + end + + mesh.End() + + if curmesh:IsValid() then + curmesh:Draw() + end + else + curmesh:Draw() + end + + if lastpointcount ~= hitpoints:length() then + nextcachecheck = CurTime() + 0.1 + end + + lastpointcount = hitpoints:length() + end + + for v in meshtbl:iter_left() do + v:Draw() + end + + hook.Run("Blind3D", origin, angles) + cam.End3D() + hook.Run("Blind3DPost", origin, angles) + + local ctsin = math.sin(CurTime()) + local col = white + col.a = alpha + + hook.Run("RenderScreenspaceEffects") + + local AEUIDraw = hook.GetTable().HUDPaint.AEUIDraw + + if AEUIDraw then + cam.Start2D() + AEUIDraw() + cam.End2D() + end + + return true +end + +blinded = false + +local function BlindnessPreUI() + if blinded then + cam.Start3D() + render.Clear(10, 10, 10, 0) + cam.End3D() + draw.NoTexture() + end +end + +local te = "te/metamorphosis/" +local jingles = { + land = te .. "3-linedrop", + jump = te .. "1-linemove", + jumpwallrun = te .. "3-spin", + wallrunh = te .. "3-spin", + wallrunv = te .. "3-spin", + coil = te .. "3-spin" +} +local jinglescount = { + jump = 6, + wallrunh = 6, + jumpwallrun = 6, + wallrunv = 6, + land = 11, + coil = 6 +} + +local function BlindnessJingles(event) + if jingles[event] then + LocalPlayer():EmitSound(jingles[event] .. math.random(1, jinglescount[event]) .. ".wav") + end +end + +function ToggleBlindness(toggle) + blinded = toggle + + if blinded then + local ply = LocalPlayer() + local activewep = ply:GetActiveWeapon() + local usingrh = IsValid(activewep) and activewep:GetClass() == "runnerhands" + + if usingrh and activewep.RunWind1 then + activewep.RunWind1:Stop() + activewep.RunWind2:Stop() + end + + gui.HideGameUI() + hook.Add("EntityEmitSound", "Echo", Echo) + hook.Add("RenderScene", "Blindness", Blindness) + hook.Add("PreDrawHUD", "Blindness", BlindnessPreUI) + hook.Add("RenderScreenspaceEffects", "CA", RenderCA) + + local milestone = ply:GetLevel() >= 100 + local bgmstring = milestone and "music/locloop.wav" or "music/locloop_unk.wav" + forcelines = not milestone + + BlindSetColor(milestone and customcolors[1] or customcolors[3]) + + if not sound then + sound = CreateSound(LocalPlayer(), "glitch.wav") + end + + if not bgm then + bgm = CreateSound(LocalPlayer(), bgmstring) + end + + sound:PlayEx(0, 100) + + if incredits then + EmitSound("music/Sunrise.mp3", vector_origin, -2, 0, 1, 75, SND_SHOULDPAUSE) + end + + hook.Run("Blind", true) + else + hook.Remove("EntityEmitSound", "Echo") + hook.Remove("RenderScene", "Blindness") + hook.Remove("PreDrawHUD", "Blindness") + hook.Remove("RenderScreenspaceEffects", "CA") + surface.SetAlphaMultiplier(1) + + if sound then + sound:Stop() + end + + if bgm then + bgm:Stop() + + bgm = nil + end + + hook.Run("Blind", false) + end +end + +function cool() + local k = limit + local k2 = 0 + a = Mesh(circle) + + mesh.Begin(a, MATERIAL_QUADS, limit) + + local ed = Vector() + local meshlen = meshtbl:length() + + for v in hitpoints:iter_right() do + mesh.QuadEasy(v, hitnormal[hitnormal.tail - k2], 2, 2, hitcolor[hitcolor.tail - k2] or white) + + k = k - 1 + k2 = k2 + 1 + end + + mesh.End() + meshtbl:push_right(a) + + if meshtbl:length() > 160 then + meshtbl:pop_left():Destroy() + end +end + +net.Receive("BlindPlayers", function () + ToggleBlindness(net.ReadBool()) +end) +net.Receive("BlindNPCKilled", function () + LocalPlayer():EmitSound("bad.wav", 50, 100 + math.random(-5, 2)) +end) +hook.Add("OnEntityCreated", "BlindnessEntities", function (ent) + timer.Simple(0.5, function () + if IsValid(ent) and ent.DrawLOC then + LOCEntities[ent] = true + end + end) +end) +hook.Add("InitPostEntity", "Beatrun_LOC", function () + if GetGlobalBool("LOC") then + ToggleBlindness(true) + end + + hook.Remove("EntityEmitSound", "zzz_TFA_EntityEmitSound") + hook.Remove("InitPostEntity", "Beatrun_LOC") +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/cl_init.lua b/beatrun/gamemodes/beatrun/gamemode/cl_init.lua new file mode 100644 index 0000000..6b4a535 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/cl_init.lua @@ -0,0 +1,6 @@ +include( "shared.lua" ) + +for k,v in ipairs(file.Find("beatrun/gamemode/cl/*.lua", "LUA")) do + print(v) + include("cl/"..v) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/init.lua b/beatrun/gamemodes/beatrun/gamemode/init.lua new file mode 100644 index 0000000..5055546 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/init.lua @@ -0,0 +1,17 @@ +AddCSLuaFile( "cl_init.lua" ) +AddCSLuaFile( "shared.lua" ) +include( "shared.lua" ) + +for k,v in ipairs(file.Find("beatrun/gamemode/cl/*.lua", "LUA")) do + AddCSLuaFile("cl/"..v) +end + +for k,v in ipairs(file.Find("beatrun/gamemode/sh/*.lua", "LUA")) do + print(v) + include("sh/"..v) + AddCSLuaFile("sh/"..v) +end + +for k,v in ipairs(file.Find("beatrun/gamemode/sv/*.lua", "LUA")) do + include("sv/"..v) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/player_class/player_beatrun.lua b/beatrun/gamemodes/beatrun/gamemode/player_class/player_beatrun.lua new file mode 100644 index 0000000..62405a9 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/player_class/player_beatrun.lua @@ -0,0 +1,487 @@ + +AddCSLuaFile() +DEFINE_BASECLASS( "player_default" ) + +if ( CLIENT ) then + + CreateConVar( "cl_playercolor", "0.24 0.34 0.41", { FCVAR_ARCHIVE, FCVAR_USERINFO, FCVAR_DONTRECORD }, "The value is a Vector - so between 0-1 - not between 0-255" ) + CreateConVar( "cl_weaponcolor", "0.30 1.80 2.10", { FCVAR_ARCHIVE, FCVAR_USERINFO, FCVAR_DONTRECORD }, "The value is a Vector - so between 0-1 - not between 0-255" ) + CreateConVar( "cl_playerskin", "0", { FCVAR_ARCHIVE, FCVAR_USERINFO, FCVAR_DONTRECORD }, "The skin to use, if the model has any" ) + CreateConVar( "cl_playerbodygroups", "0", { FCVAR_ARCHIVE, FCVAR_USERINFO, FCVAR_DONTRECORD }, "The bodygroups to use, if the model has any" ) + +end + +local PLAYER = {} + +PLAYER.DuckSpeed = 0.01 -- How fast to go from not ducking, to ducking +PLAYER.UnDuckSpeed = 0.01 -- How fast to go from ducking, to not ducking + +-- +-- Creates a Taunt Camera +-- +PLAYER.TauntCam = TauntCamera() + +-- +-- See gamemodes/base/player_class/player_default.lua for all overridable variables +-- +PLAYER.WalkSpeed = 200 +PLAYER.RunSpeed = 400 + +-- +-- Set up the network table accessors +-- +function PLAYER:SetupDataTables() + + BaseClass.SetupDataTables( self ) + self.Player:NetworkVar( "Float", 0, "MEMoveLimit" ) + self.Player:NetworkVar( "Float", 1, "MESprintDelay" ) + self.Player:NetworkVar( "Float", 2, "MEAng" ) + + self.Player:NetworkVar( "Int", 0, "Climbing" ) + self.Player:NetworkVar( "Float", 3, "ClimbingTime" ) + self.Player:NetworkVar( "Vector", 0, "ClimbingStart" ) + self.Player:NetworkVar( "Vector", 1, "ClimbingEnd" ) + self.Player:NetworkVar( "Vector", 7, "ClimbingEndOld" ) + self.Player:NetworkVar( "Float", 24, "ClimbingDelay" ) + self.Player:NetworkVar( "Angle", 3, "ClimbingAngle" ) + + self.Player:NetworkVar( "Int", 1, "Wallrun") + self.Player:NetworkVar( "Float", 4, "WallrunTime") + self.Player:NetworkVar( "Float", 5, "WallrunSoundTime") + self.Player:NetworkVar( "Vector", 2, "WallrunDir") + self.Player:NetworkVar( "Vector", 8, "WallrunOrigVel") + self.Player:NetworkVar( "Int", 4, "WallrunCount") + + self.Player:NetworkVar( "Bool", 0, "Sliding" ) + self.Player:NetworkVar( "Float", 6, "SlidingTime" ) + self.Player:NetworkVar( "Float", 7, "SlidingDelay" ) + self.Player:NetworkVar( "Vector", 4, "SlidingLastPos" ) + self.Player:NetworkVar( "Float", 18, "SlidingVel" ) + self.Player:NetworkVar( "Float", 19, "SlidingStrafe" ) + self.Player:NetworkVar( "Bool", 9, "SlidingSlippery" ) + self.Player:NetworkVar( "Float", 20, "SlidingSlipperyUpdate" ) + self.Player:NetworkVar( "Angle", 2, "SlidingAngle" ) + + self.Player:NetworkVar( "Bool", 1, "StepRight" ) + self.Player:NetworkVar( "Float", 8, "StepRelease" ) + + self.Player:NetworkVar( "Bool", 2, "Grappling" ) + self.Player:NetworkVar( "Vector", 3, "GrapplePos" ) + self.Player:NetworkVar( "Float", 29, "GrappleLength") + + self.Player:NetworkVar( "Entity", 0, "Swingbar" ) + + self.Player:NetworkVar( "Bool", 3, "CrouchJump" ) + self.Player:NetworkVar( "Float", 9, "CrouchJumpTime" ) + self.Player:NetworkVar( "Bool", 12, "CrouchJumpBlocked" ) + + self.Player:NetworkVar( "Float", 9, "SafetyRollKeyTime" ) + self.Player:NetworkVar( "Float", 10, "SafetyRollTime" ) + self.Player:NetworkVar( "Angle", 0, "SafetyRollAng" ) + + self.Player:NetworkVar( "Bool", 4, "Quickturn" ) + self.Player:NetworkVar( "Float", 10, "QuickturnTime" ) + self.Player:NetworkVar( "Angle", 1, "QuickturnAng" ) + + self.Player:NetworkVar( "Bool", 5, "WallrunElevated" ) + + + --We have to store this info on the player as multiple people can use one swingbar + self.Player:NetworkVar( "Float", 11, "SBOffset" ) + self.Player:NetworkVar( "Float", 12, "SBOffsetSpeed" ) + self.Player:NetworkVar( "Float", 13, "SBStartLerp" ) + self.Player:NetworkVar( "Float", 14, "SBDelay" ) + self.Player:NetworkVar( "Int", 2, "SBPeak" ) + self.Player:NetworkVar( "Bool",6, "SBDir" ) + self.Player:NetworkVar( "Entity",1, "SwingbarLast" ) + + self.Player:NetworkVar( "Entity", 2, "Swingpipe" ) + self.Player:NetworkVar( "Entity", 3, "Rabbit" ) + self.Player:NetworkVar( "Int", 3, "RabbitSeat" ) + + + self.Player:NetworkVar( "Float", 15, "OverdriveCharge" ) + self.Player:NetworkVar( "Float", 16, "OverdriveMult" ) + + + self.Player:NetworkVar( "Bool", 7, "JumpTurn" ) + self.Player:NetworkVar( "Float", 17, "JumpTurnRecovery" ) + + self.Player:NetworkVar( "Bool", 8, "WasOnGround" ) + + self.Player:NetworkVar( "Entity", 4, "Ladder" ) + self.Player:NetworkVar( "Float", 21, "LadderDelay" ) + self.Player:NetworkVar( "Float", 22, "LadderHeight" ) + self.Player:NetworkVar( "Bool", 10, "LadderEntering" ) + self.Player:NetworkVar( "Bool", 11, "LadderHand" ) + self.Player:NetworkVar( "Vector", 5, "LadderStartPos" ) + self.Player:NetworkVar( "Vector", 6, "LadderEndPos" ) + self.Player:NetworkVar( "Float", 23, "LadderLerp" ) + + self.Player:NetworkVar( "Entity", 5, "Zipline" ) + self.Player:NetworkVar( "Float", 21, "ZiplineStart" ) + self.Player:NetworkVar( "Float", 22, "ZiplineFraction" ) + self.Player:NetworkVar( "Float", 23, "ZiplineSpeed" ) + self.Player:NetworkVar( "Float", 25, "ZiplineDelay" ) + + self.Player:NetworkVar( "Int", 5, "MeleeDamage") + self.Player:NetworkVar( "Float", 26, "MeleeTime") + self.Player:NetworkVar( "Float", 27, "MeleeDelay") + self.Player:NetworkVar( "Int", 6, "Melee") + + self.Player:NetworkVar( "Float", 28, "Balance") + self.Player:NetworkVar( "Entity", 6, "BalanceEntity") + + self.Player:NetworkVar( "Bool", 13, "Dive" ) + +end + + +function PLAYER:Loadout() + + if GetGlobalBool(GM_DATATHEFT) then + for k,v in ipairs(DATATHEFT_LOADOUTS[ math.random( #DATATHEFT_LOADOUTS ) ]) do + local wep = self.Player:Give(v) + self.Player:GiveAmmo(300, wep:GetPrimaryAmmoType()) + end + else + self.Player:RemoveAllAmmo() + end + self.Player:Give( "runnerhands" ) + + self.Player:SelectWeapon("runnerhands") + self.Player:SetJumpPower(230) + self.Player:SetCrouchedWalkSpeed( 0.5 ) + self.Player:SetFOV(self.Player:GetInfoNum("Beatrun_FOV", 120)) + self.Player:SetCanZoom(false) + +end + +hook.Add("PlayerSwitchWeapon", "ResetFOV", function(ply) + local fovmult = (ply:InOverdrive() and 1.1) or 1 + ply:SetFOV(ply:GetInfoNum("Beatrun_FOV", 120)*fovmult) +end) + +function PLAYER:SetModel() + + BaseClass.SetModel( self ) + + local skin = self.Player:GetInfoNum( "cl_playerskin", 0 ) + self.Player:SetSkin( skin ) + + local groups = self.Player:GetInfo( "cl_playerbodygroups" ) + if ( groups == nil ) then groups = "" end + local groups = string.Explode( " ", groups ) + for k = 0, self.Player:GetNumBodyGroups() - 1 do + self.Player:SetBodygroup( k, tonumber( groups[ k + 1 ] ) or 0 ) + end + +end + +-- +-- Called when the player spawns +-- +if SERVER then + util.AddNetworkString("BeatrunSpawn") +end + +function PLAYER:Spawn() + + BaseClass.Spawn( self ) + + local ply = self.Player + local col = ply:GetInfo( "cl_playercolor" ) + ply:SetPlayerColor( Vector( col ) ) + local faststartmult = (ply:GetInfoNum("Beatrun_FastStart", 0) > 0 and 0.5) or 1 + + local col = Vector( ply:GetInfo( "cl_weaponcolor" ) ) + if ( col:Length() < 0.001 ) then + col = Vector( 0.001, 0.001, 0.001 ) + end + ply:SetWeaponColor( col ) + + local CPSave = false + if Course_Name != "" and Course_StartPos != vector_origin then + if ply:GetInfoNum("Beatrun_CPSave", 0) >= 1 and ply:GetNW2Float("CPNum", 1) > 1 and ply.CPSavePos and ply.LastSpawnTime+0.6 < CurTime() then + ply:SetPos(ply.CPSavePos) + ply:SetEyeAngles(ply.CPSaveAng) + ply:SetLocalVelocity(ply.CPSaveVel) + ply:LoadParkourState() + CPSave = true + else + ply.CPSavePos = nil + ply.CPsaveAng = nil + ply.CPsaveVel = nil + ply:SetPos(Course_StartPos) + ply:SetEyeAngles(Angle(0,Course_StartAng,0)) + ply:SetLocalVelocity(vector_origin) + timer.Simple(0.1, function() ply:SetLocalVelocity(vector_origin) ply:SetPos(Course_StartPos) end) --Failsafe + ReplayStop(ply) + ReplayStart(ply) + end + end + + if !ply.InReplay and !CPSave then + ply:SetNW2Float("CPNum", 1) + end + if !CPSave then + ply.Course_StartTime = CurTime() + (2*faststartmult) + net.Start("BeatrunSpawn") + net.WriteFloat(CurTime()) + net.WriteBool(ply.InReplay) + net.Send(ply) + + ply.SpawnFreezeTime = CurTime() + (1.75*faststartmult) + end + + if !GetGlobalBool(GM_DATATHEFT) then + ply:SetCollisionGroup(COLLISION_GROUP_WEAPON) + ply:SetCustomCollisionCheck(true) + else + ply:SetCollisionGroup(COLLISION_GROUP_PLAYER) + ply:SetCustomCollisionCheck(false) + ply:DataTheft_Bank() + end + ply:SetAvoidPlayers(false) + + ply:SetLaggedMovementValue( 0 ) --otherwise they drift off + timer.Simple(0.1, function() ply:SetLaggedMovementValue( 1 ) end) + if ply.SlideLoopSound and ply.SlideLoopSound.Stop then + ply.SlideLoopSound:Stop() + end + + ply:ResetParkourState() + + ply:SetOverdriveCharge(0) + ply:SetOverdriveMult(1) + + ply.LastSpawnTime = CurTime() +end + +hook.Add( "IsSpawnpointSuitable", "CheckSpawnPoint", function( ply, spawnpointent, bMakeSuitable ) + if !GetGlobalBool(GM_DATATHEFT) then return end + local pos = spawnpointent:GetPos() + + -- Note that we're searching the default hull size here for a player in the way of our spawning. + -- This seems pretty rough, seeing as our player's hull could be different.. but it should do the job. + -- (HL2DM kills everything within a 128 unit radius) + local ents = ents.FindInBox( pos + Vector( -16, -16, 0 ), pos + Vector( 16, 16, 72 ) ) + + local Blockers = 0 + + for _, v in ipairs( ents ) do + if ( v:IsPlayer() and v:Alive() ) then + Blockers = Blockers + 1 + + if ( bMakeSuitable ) then + v:Kill() + end + end + end + + if ( bMakeSuitable ) then return true end + if ( Blockers > 0 ) then return false end + + return true +end) + +hook.Add("SetupMove", "SpawnFreeze", function(ply, mv, cmd) + if ply.SpawnFreezeTime and Course_Name != "" and Course_StartPos != vector_origin then + if Course_StartPos and ply.SpawnFreezeTime > CurTime() then + mv:SetOrigin(Course_StartPos) + end + end +end) + +hook.Add( "ShouldCollide", "NoPlayerCollisions", function( ent1, ent2 ) + if ( ent1:IsPlayer() and (ent2:IsPlayer() or ent2.NoPlayerCollisions) ) then + if ent2.BRCollisionFunc then + return ent2:BRCollisionFunc(ent1) + else + return false + end + end + + if ( ent2:IsPlayer() and ent1:IsNPC() ) then + return true + end + +end ) + +hook.Add( "PhysgunPickup", "AllowPlayerPickup", function( ply, ent ) + if ( ply:IsSuperAdmin() and ent:IsPlayer() ) then + return true + end +end ) + +function PLAYER:ShouldDrawLocal() + + if ( self.TauntCam:ShouldDrawLocalPlayer( self.Player, self.Player:IsPlayingTaunt() ) ) then return true end + +end + +function PLAYER:CreateMove( cmd ) + + if ( self.TauntCam:CreateMove( cmd, self.Player, self.Player:IsPlayingTaunt() ) ) then return true end + +end + +function PLAYER:CalcView( view ) + + if ( self.TauntCam:CalcView( view, self.Player, self.Player:IsPlayingTaunt() ) ) then return true end + +end + +function PLAYER:GetHandsModel() + + local cl_playermodel = self.Player:GetInfo( "cl_playermodel" ) + return player_manager.TranslatePlayerHands( cl_playermodel ) + +end + +function PLAYER:StartMove( move ) + +end + +function PLAYER:FinishMove( move ) + +end + +hook.Add("FinishMove", "BeatrunRHVelocity", function(ply, mv) + local activewep = ply:GetActiveWeapon() + if IsValid(activewep) and activewep:GetClass()=="runnerhands" and activewep.SetOwnerVelocity then + activewep:SetOwnerVelocity(math.Round(mv:GetVelocity():Length())) + end +end) + +local meta = FindMetaTable("Player") +function meta:ResetParkourState() + self:SetSliding(false) + self:SetCrouchJump(false) + self:SetQuickturn(false) + self:SetGrappling(false) + self:SetSwingbar(nil) + self:SetZipline(nil) + self:SetLadder(nil) + self:SetMantle(0) + self:SetWallrun(0) + self:SetMEMoveLimit(0) + self:SetMESprintDelay(0) + self:SetMEAng(0) + self:SetClimbing(0) + self:SetClimbingTime(0) + self:SetWallrunTime(0) + self:SetWallrunSoundTime(0) + self:SetSlidingTime(0) + self:SetSlidingDelay(0) + self:SetCrouchJumpTime(0) + self:SetSafetyRollKeyTime(0) + self:SetSafetyRollTime(0) + self:SetQuickturnTime(0) + self:SetMeleeTime(0) + self:SetMeleeDelay(0) + self:SetJumpTurn(false) + self:SetDive(false) + self:SetViewOffsetDucked(Vector(0,0,32)) + + self.Swingrope = nil + self.DiveSliding = false + + ParkourEvent("jump", self) + + self:StopSound("ZiplineLoop") +end + +function meta:SaveParkourState() + self.ParkourSave = { + self:GetSliding(), + self:GetCrouchJump(), + self:GetQuickturn(), + self:GetGrappling(), + self:GetSwingbar(), + self:GetZipline(), + self:GetLadder(), + self:GetMantle(), + self:GetWallrun(), + self:GetMEMoveLimit(), + self:GetMESprintDelay(), + self:GetMEAng(), + self:GetClimbing(), + self:GetClimbingTime(), + self:GetWallrunTime(), + self:GetWallrunSoundTime(), + self:GetSlidingTime(), + self:GetSlidingDelay(), + self:GetCrouchJumpTime(), + self:GetSafetyRollKeyTime(), + self:GetSafetyRollTime(), + self:GetQuickturnTime(), + self:GetJumpTurn(), + self:GetDive(), + } +end + +function meta:LoadParkourState() + local save = self.ParkourSave + if !save then return end + + self:SetSliding(save[1]) + self:SetCrouchJump(save[2]) + self:SetQuickturn(save[3]) + self:SetGrappling(save[4]) + self:SetSwingbar(save[5]) + self:SetZipline(save[6]) + self:SetLadder(save[7]) + self:SetMantle(save[8]) + self:SetWallrun(save[9]) + self:SetMEMoveLimit(save[10]) + self:SetMESprintDelay(save[11]) + self:SetMEAng(save[12]) + self:SetClimbing(save[13]) + self:SetClimbingTime(save[14]) + self:SetWallrunTime(save[15]) + self:SetWallrunSoundTime(save[16]) + self:SetSlidingTime(save[17]) + self:SetSlidingDelay(save[18]) + self:SetCrouchJumpTime(save[19]) + self:SetSafetyRollKeyTime(save[20]) + self:SetSafetyRollTime(save[21]) + self:SetQuickturnTime(save[22]) + self:SetJumpTurn(save[23]) + self:SetDive(save[24]) +end + +function meta:ResetParkourTimes() + self:SetClimbingTime(0) + self:SetWallrunTime(0) + self:SetWallrunSoundTime(0) + self:SetSlidingTime(0) + self:SetSlidingDelay(0) + self:SetCrouchJumpTime(0) + self:SetSafetyRollKeyTime(0) + self:SetSafetyRollTime(0) + self:SetQuickturnTime(0) +end + +function meta:InOverdrive() + if !self.GetOverdriveMult then return false end + return self:GetOverdriveMult() != 1 +end + +function meta:GetRolling() + return self:GetSafetyRollTime() > CurTime() +end + +hook.Add("PlayerSpawn", "ResetStateTransition", function(ply, transition) + timer.Simple(0, function() + if transition and IsValid(ply) then + ply:ResetParkourTimes() + ply:SetJumpPower(230) + ply:SetFOV(ply:GetInfoNum("Beatrun_FOV", 110)) + ply:SetCanZoom(false) + ply.ClimbingTrace = nil + end + end) +end) + +player_manager.RegisterClass( "player_beatrun", PLAYER, "player_default" ) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Balance.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Balance.lua new file mode 100644 index 0000000..c0c476f --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Balance.lua @@ -0,0 +1,223 @@ +local dircache = nil + +hook.Add("PlayerFootstepME", "Balance", function (ply, pos, foot, sound, volume, filter, skipcheck) + if IsValid(ply:GetBalanceEntity()) then + return + end + + if not ply.BalanceTrace then + ply.BalanceTrace = {} + ply.BalanceTraceOut = {} + ply.BalanceTrace.mask = MASK_PLAYERSOLID + ply.BalanceTrace.output = ply.BalanceTraceOut + ply.BalanceTrace.mins, ply.BalanceTrace.maxs = ply:GetHull() + ply.BalanceTraceOut.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + end + + local tr = ply.BalanceTrace + local trout = ply.BalanceTraceOut + tr.filter = ply + tr.start = pos + tr.endpos = pos - Vector(0, 0, 25) + + util.TraceHull(tr) + + if trout.Entity.Balance then + ply:SetBalance(0.1) + ply:SetBalanceEntity(trout.Entity) + timer.Simple(0, function () + ParkourEvent("walkbalancefwd", ply) + end) + + if CLIENT then + BodyAnimSetEase(ply:GetPos()) + elseif game.SinglePlayer() then + ply:SetNW2Vector("SPBAEase", ply:GetPos()) + ply:SendLua("BodyAnimSetEase(LocalPlayer():GetNW2Vector('SPBAEase'))") + end + end +end) +hook.Add("SetupMove", "Balance", function (ply, mv, cmd) + if IsValid(ply:GetBalanceEntity()) then + local balance = ply:GetBalanceEntity() + + mv:SetForwardSpeed(math.max(mv:GetForwardSpeed() * 0.01, 0)) + + local dist, nearest, distlen = util.DistanceToLine(balance:GetPos(), balance:GetPos() + balance:GetAngles():Up() * balance:GetBalanceLength(), mv:GetOrigin()) + local distend = balance:GetPos():Distance(balance:GetPos() + balance:GetAngles():Up() * balance:GetBalanceLength()) + nearest.z = mv:GetOrigin().z + + mv:SetOrigin(nearest) + mv:SetButtons(bit.band(mv:GetButtons(), bit.bnot(IN_JUMP))) + cmd:RemoveKey(IN_JUMP) + + local tr = ply.BalanceTrace + tr.start = mv:GetOrigin() + tr.endpos = tr.start - Vector(0, 0, 50) + tr.filter = ply + + util.TraceLine(tr) + + if mv:KeyDown(IN_MOVELEFT) then + ply:SetBalance(math.Clamp(ply:GetBalance() - FrameTime() * (60 + math.abs(ply:GetBalance())), -100, 100)) + elseif mv:KeyDown(IN_MOVERIGHT) then + ply:SetBalance(math.Clamp(ply:GetBalance() + FrameTime() * (60 + math.abs(ply:GetBalance())), -100, 100)) + end + + mv:SetSideSpeed(0) + + if mv:KeyPressed(IN_FORWARD) then + ParkourEvent("walkbalancefwd", ply) + elseif not mv:KeyDown(IN_FORWARD) and mv:GetVelocity():Length() > 0 then + ParkourEvent("walkbalancestill", ply) + end + + if CLIENT_IFTP() and mv:KeyPressed(IN_ATTACK2) then + dircache.y = dircache.y - 180 + end + + local mult = mv:KeyDown(IN_FORWARD) and 50 or 200 + + if math.abs(ply:GetBalance()) < 5 then + mult = mult * 0.1 + end + + if math.abs(ply:GetBalance()) > 60 then + mult = mult * 2 + end + + ply:SetBalance(math.Clamp(ply:GetBalance() + ply:GetBalance() / mult, -100, 100)) + + local out = ply.BalanceTraceOut + + if out.Entity ~= balance and not out.Entity:IsPlayer() or distlen < 25 or distend < distlen + 30 or math.abs(ply:GetBalance()) >= 100 then + ParkourEvent("fall", ply) + + if math.abs(ply:GetBalance()) >= 100 then + if CLIENT then + BodyAnimSetEase(mv:GetOrigin()) + elseif game.SinglePlayer() then + ply:SetNW2Vector("SPBAEase", mv:GetOrigin()) + ply:SendLua("BodyAnimSetEase(LocalPlayer():GetNW2Vector('SPBAEase'))") + end + + ParkourEvent(ply:GetBalance() > 0 and "walkbalancefalloffright" or "walkbalancefalloffleft", ply) + + local bang = ply:GetBalanceEntity():GetAngles() + local tr = ply.BalanceTrace + local trout = ply.BalanceTraceOut + local ang = cmd:GetViewAngles() + ang.x = 0 + + if ang:Forward():Dot(bang:Up()) > 0.5 then + local fallpos = mv:GetOrigin() + ply:GetBalanceEntity():GetAngles():Right() * 0.75 * ply:GetBalance() + tr.start = fallpos + tr.endpos = fallpos + + util.TraceHull(tr) + + if not trout.Hit then + mv:SetOrigin(fallpos) + else + mv:SetOrigin(mv:GetOrigin() - Vector(0, 0, 100)) + end + else + local fallpos = mv:GetOrigin() + ply:GetBalanceEntity():GetAngles():Right() * -0.75 * ply:GetBalance() + tr.start = fallpos + tr.endpos = fallpos + + util.TraceHull(tr) + + if not trout.Hit then + mv:SetOrigin(fallpos) + else + mv:SetOrigin(mv:GetOrigin() - Vector(0, 0, 100)) + end + end + end + + ply:SetBalanceEntity(nil) + ply:SetMEMoveLimit(150) + end + elseif ply:KeyDown(IN_WALK) and ply:OnGround() and mv:GetVelocity():Length() >= 65 then + hook.GetTable().PlayerFootstepME.Balance(ply, mv:GetOrigin()) + end +end) + +local angy = 0 +local attack2 = false + +hook.Add("CreateMove", "Balance", function (cmd) + local ply = LocalPlayer() + + if IsValid(ply:GetBalanceEntity()) and IsValid(BodyAnim) then + local ang = cmd:GetViewAngles() + local bang = dircache or ply:GetBalanceEntity():GetAngles() + + if not dircache then + local angx = ang.x + ang.x = 0 + + if ang:Forward():Dot(bang:Up()) > 0.5 then + bang:RotateAroundAxis(bang:Right(), 180) + end + + ang.x = angx + dircache = bang + end + + if game.SinglePlayer() then + if cmd:KeyDown(IN_ATTACK2) and not attack2 then + dircache.y = dircache.y - 180 + attack2 = true + elseif not cmd:KeyDown(IN_ATTACK2) then + attack2 = false + end + end + + angy = math.ApproachAngle(angy, bang.y, FrameTime() * 150) + ang.y = angy + + cmd:SetViewAngles(ang) + BodyAnim:SetPoseParameter("lean_roll", math.Clamp(ply:GetBalance(), -60, 60)) + + if IsValid(BodyAnimArmCopy) then + BodyAnimArmCopy:SetPoseParameter("lean_roll", math.Clamp(ply:GetBalance(), -60, 60)) + end + + local moving = ply:KeyDown(IN_FORWARD) + + if ply:GetVelocity():Length() == 0 and BodyAnimString == "walkbalancefwd" then + BodyAnim:SetSequence("walkbalancestill") + end + + if ply:GetBalance() >= 60 and moving then + BodyAnim:SetSequence("walkbalancelosebalanceright") + elseif ply:GetBalance() <= -60 and moving then + BodyAnim:SetSequence("walkbalancelosebalanceleft") + elseif BodyAnim:GetSequence() == BodyAnim:LookupSequence("walkbalancelosebalanceleft") or BodyAnim:GetSequence() == BodyAnim:LookupSequence("walkbalancelosebalanceright") then + if moving then + BodyAnim:SetSequence("walkbalancefwd") + else + BodyAnim:SetSequence("walkbalancestill") + end + elseif BodyAnimString:Left(5) ~= "walkb" then + BodyAnim:SetSequence("walkbalancefwd") + end + + BodyLimitX = 90 + lockang2 = true + else + if IsValid(BodyAnim) and BodyAnim:GetSequence() == BodyAnim:LookupSequence("walkbalancefwd") then + BodyAnim:SetSequence("runfwd") + end + + if lockang2 then + viewtiltlerp.z = BodyAnimEyeAng.z + end + + angy = cmd:GetViewAngles().y + lockang2 = false + dircache = nil + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Checkpoints.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Checkpoints.lua new file mode 100644 index 0000000..5721795 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Checkpoints.lua @@ -0,0 +1,365 @@ +Checkpoints = Checkpoints or {} +CheckpointNumber = CheckpointNumber or 1 +local Checkpoints = Checkpoints +Course_StartTime = 0 +Course_GoTime = 0 +Course_EndTime = 0 +Course_ID = Course_ID or "" +Course_Name = Course_Name or "" +local cptimes = {} +local lastcptime = 0 +local pbtimes = nil +local pbtotal = 0 +local color_positive = Color(0, 255, 0, 255) +local color_negative = Color(255, 0, 0, 255) +local color_neutral = Color(200, 200, 200, 255) +local timetext = "" +local timealpha = 1000 +local timecolor = color_neutral + +if SERVER then + util.AddNetworkString("Checkpoint_Hit") + util.AddNetworkString("Checkpoint_Finish") +else + surface.CreateFont("BeatrunHUD", { + shadow = true, + blursize = 0, + underline = false, + rotary = false, + strikeout = false, + additive = false, + antialias = true, + extended = false, + scanlines = 0, + font = "Roboto", + italic = false, + outline = false, + symbol = false, + size = 32, + weight = 2000 + }) +end + +function LoadCheckpoints() + table.Empty(Checkpoints) + + if SERVER then + for k, v in pairs(player.GetAll()) do + v:SetNW2Int("CPNum", 1) + end + end + + if CLIENT then + timer.Simple(1, function () + for k, v in pairs(ents.FindByClass("tt_cp")) do + if IsValid(v) and v.GetCPNum then + Checkpoints[v:GetCPNum()] = v + end + end + end) + else + for k, v in pairs(ents.FindByClass("tt_cp")) do + Checkpoints[v:GetCPNum()] = v + end + end +end + +if CLIENT then + local FastStart = CreateClientConVar("Beatrun_FastStart", "0", true, true, "Faster start countdown") + + net.Receive("Checkpoint_Hit", function () + local timetaken = CurTime() - lastcptime + local vspb = nil + + if pbtimes then + vspb = timetaken - (pbtimes[CheckpointNumber] or 0) + end + + table.insert(cptimes, timetaken) + + lastcptime = CurTime() + CheckpointNumber = net.ReadUInt(8) + + if blinded then + LocalPlayer():EmitSound("good.wav", 75, 75) + end + + if not pbtimes or vspb == 0 then + LocalPlayer():EmitSound("A_TT_CP_Neutral.wav") + + timecolor = color_neutral + timetext = string.FormattedTime(math.abs(timetaken), "%02i:%02i:%02i") + elseif vspb < 0 then + LocalPlayer():EmitSound("A_TT_CP_Positive.wav") + + timecolor = color_positive + timetext = "-" .. string.FormattedTime(math.abs(vspb), "%02i:%02i:%02i") + else + LocalPlayer():EmitSound("A_TT_CP_Negative.wav") + + timecolor = color_negative + timetext = "+" .. string.FormattedTime(math.abs(vspb), "%02i:%02i:%02i") + end + + LocalPlayer():AddXP(5) + + timealpha = 1000 + + print(timetaken, vspb) + end) + net.Receive("Checkpoint_Finish", function () + table.insert(cptimes, CurTime() - lastcptime) + + local totaltime = CurTime() - Course_StartTime + local timestr = totaltime - pbtotal + + LocalPlayer():AddXP(math.min(10 * CheckpointNumber, 100)) + + CheckpointNumber = -1 + Course_EndTime = totaltime + + if blinded then + LocalPlayer():EmitSound("reset.wav", 75, 75) + end + + if pbtotal == 0 or totaltime < pbtotal then + timetext = "-" .. string.FormattedTime(math.abs(timestr), "%02i:%02i:%02i") + timecolor = color_positive + + LocalPlayer():EmitSound("A_TT_Finish_Positive.wav") + SaveCheckpointTime() + SaveReplayData() + else + timetext = "+" .. string.FormattedTime(math.abs(timestr), "%02i:%02i:%02i") + timecolor = color_negative + + LocalPlayer():EmitSound("A_TT_Finish_Negative.wav") + end + + net.Start("Checkpoint_Finish") + net.WriteFloat(totaltime) + net.SendToServer() + + timealpha = 1000 + end) +end + +if SERVER then + net.Receive("Checkpoint_Finish", function (len, ply) + local pb = net.ReadFloat() or 0 + local svtime = CurTime() - ply.Course_StartTime + + if math.abs(svtime - pb) > 5 then + pb = svtime + end + + if ply:GetNW2Int("CPNum", 1) == -1 and (ply:GetNW2Float("PBTime") == 0 or pb < ply:GetNW2Float("PBTime")) then + ply:SetNW2Float("PBTime", pb) + end + end) +end + +local finishcolor = Color(45, 45, 175, 100) + +function FinishCourse(ply) + ply:ScreenFade(SCREENFADE.IN, finishcolor, 0, 4) + ply:SetLaggedMovementValue(0.1) + ply:DrawViewModel(false) + net.Start("Checkpoint_Finish") + net.Send(ply) + ply:SetNW2Int("CPNum", -1) + timer.Simple(4, function () + ply:SetLaggedMovementValue(1) + ply:DrawViewModel(true) + end) +end + +local countdown = 0 +local countdownalpha = 255 +local countdowntext = { + "Ready", + "Set", + "Go!!" +} + +local function StartCountdown() + local CT = CurTime() + local faststartmult = LocalPlayer():GetInfoNum("Beatrun_FastStart", 0) > 0 and 0.5 or 1 + + if Course_GoTime <= CT then + Course_GoTime = CT + 1 * faststartmult + countdown = countdown + 1 + + if countdown >= 3 then + LocalPlayer():EmitSound("A_TT_CD_02.wav") + hook.Remove("Think", "StartCountdown") + hook.Remove("StartCommand", "StartFreeze") + else + LocalPlayer():EmitSound("A_TT_CD_01.wav") + end + end +end + +local function StartCountdownHUD() + local text = countdowntext[countdown] or "" + + surface.SetFont("DermaLarge") + surface.SetTextColor(255, 255, 255, countdownalpha) + + local w, h = surface.GetTextSize(text) + + surface.SetTextPos(ScrW() * 0.5 - w * 0.5, ScrH() * 0.3) + surface.DrawText(text) + + if countdown >= 3 then + countdownalpha = countdownalpha - FrameTime() * 250 + + if countdownalpha <= 0 then + hook.Remove("HUDPaint", "StartCountdownHUD") + end + end +end + +function CourseHUD() + local ply = LocalPlayer() + local vp = ply:GetViewPunchAngles() + local vpx = vp.x + local vpz = vp.z + local incourse = Course_Name ~= "" + + surface.SetFont("DermaLarge") + surface.SetTextColor(255, 255, 255, 255) + + local totaltime = CheckpointNumber ~= -1 and math.max(0, CurTime() - Course_StartTime) or Course_EndTime + + if incourse then + local text = string.FormattedTime(totaltime, "%02i:%02i:%02i") + local w, h = surface.GetTextSize(text) + + surface.SetTextPos(ScrW() * 0.85 - w * 0.5 + vpx, ScrH() * 0.075 + vpz) + surface.DrawText(text) + end + + if GetConVar("Beatrun_HUDHidden") and not GetConVar("Beatrun_HUDHidden"):GetBool() and not BuildMode and hook.Run("BeatrunDrawHUD") ~= false and not ply.InReplay then + local speed = math.Round(ply:GetVelocity():Length() * 0.06858125) + + if speed < 10 then + speed = "0" .. speed + end + + text = speed .. " km/h" + w, h = surface.GetTextSize(text) + + surface.SetTextPos(ScrW() * 0.85 - w * 0.5 + vpx, ScrH() * 0.85 + vpz) + surface.DrawText(text) + end + + if incourse and pbtimes then + local text = string.FormattedTime(pbtotal, "%02i:%02i:%02i") + local w, h = surface.GetTextSize(text) + + surface.SetTextPos(ScrW() * 0.85 - w * 0.5 + vpx, ScrH() * 0.075 + h + vpz) + surface.SetTextColor(255, 255, 255, 125) + surface.DrawText(text) + end + + if timealpha > 0 then + local w, h = surface.GetTextSize(timetext) + timealpha = math.max(0, timealpha - FrameTime() * 250) + timecolor.a = math.min(255, timealpha) + + surface.SetTextPos(ScrW() * 0.5 - w * 0.5 + vpx, ScrH() * 0.3 + vpz) + surface.SetTextColor(timecolor) + surface.DrawText(timetext) + end +end + +hook.Add("HUDPaint", "CourseHUD", CourseHUD) + +local function StartFreeze(ply, cmd) + cmd:ClearButtons() + cmd:ClearMovement() + cmd:SetMouseX(0) + cmd:SetMouseY(0) +end + +function SaveCheckpointTime() + local times = util.TableToJSON(cptimes) + local dir = "beatrun/times/" .. game.GetMap() .. "/" + + file.CreateDir(dir) + file.Write(dir .. Course_ID .. ".txt", times) +end + +function LoadCheckpointTime() + local dir = "beatrun/times/" .. game.GetMap() .. "/" + local times = file.Read(dir .. Course_ID .. ".txt") + times = times and util.JSONToTable(times) + + return times or nil +end + +function SaveReplayData() + local replay = util.TableToJSON(LocalPlayer().ReplayTicks) + local dir = "beatrun/replays/" .. game.GetMap() .. "/" + + if not replay then + return + end + + file.CreateDir(dir) + file.Write(dir .. Course_ID .. ".txt", util.Compress(replay)) +end + +function LoadReplayData() + local dir = "beatrun/replays/" .. game.GetMap() .. "/" + local replay = file.Read(dir .. Course_ID .. ".txt") + replay = replay and util.JSONToTable(util.Decompress(replay)) + + return replay or nil +end + +function StartCourse(spawntime) + local faststartmult = LocalPlayer():GetInfoNum("Beatrun_FastStart", 0) > 0 and 0.5 or 1 + + table.Empty(cptimes) + + pbtimes = LoadCheckpointTime() + pbtotal = 0 + + if pbtimes then + for k, v in pairs(pbtimes) do + pbtotal = pbtotal + v + end + end + + CheckpointNumber = 1 + countdown = 0 + countdownalpha = 255 + Course_GoTime = spawntime + Course_StartTime = spawntime + 2 * faststartmult + lastcptime = Course_StartTime + + if Course_Name ~= "" then + hook.Add("Think", "StartCountdown", StartCountdown) + hook.Add("HUDPaint", "StartCountdownHUD", StartCountdownHUD) + hook.Add("StartCommand", "StartFreeze", StartFreeze) + else + hook.Remove("Think", "StartCountdown") + hook.Remove("HUDPaint", "StartCountdownHUD") + hook.Remove("StartCommand", "StartFreeze") + end +end + +net.Receive("BeatrunSpawn", function () + local spawntime = net.ReadFloat() + local replay = net.ReadBool() + + hook.Run("BeatrunSpawn") + + LocalPlayer().InReplay = replay + + if LocalPlayer().GetInfoNum then + StartCourse(spawntime) + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Climb.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Climb.lua new file mode 100644 index 0000000..a0bdb08 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Climb.lua @@ -0,0 +1,765 @@ +local ClimbingTimes = { + 5, + 1.25, + 1, + 1, + nil, + 2 +} +local CLIMB_HANG = 1 +local CLIMB_HEAVEUP = 2 +local CLIMB_STRAFELEFT = 3 +local CLIMB_STRAFERIGHT = 4 +local CLIMB_FOLDEDSTART = 5 +local CLIMB_FOLDEDHEAVEUP = 6 +local climb1 = { + followplayer = false, + animmodelstring = "climbanim", + allowmove = true, + lockang = false, + ignorez = true, + smoothend = true, + AnimString = "climb1" +} +local climbstrings = { + "climb1", + "climb2" +} + +if game.SinglePlayer() and SERVER then + util.AddNetworkString("Climb_SPFix") +elseif game.SinglePlayer() and CLIENT then + net.Receive("Climb_SPFix", function () + local lock = net.ReadBool() + local neweyeang = net.ReadBool() + local ang = net.ReadAngle() + local oldlock = net.ReadBool() + lockang = lock + + if oldlock ~= nil then + lockang = oldlock + end + + if neweyeang then + LocalPlayer().OrigEyeAng = ang + end + end) +end + +local function ClimbingEnd(ply, mv, cmd) + mv:SetOrigin(ply:GetClimbingEnd()) + ply:SetClimbing(0) + ply:SetMoveType(MOVETYPE_WALK) + + local tr = { + filter = ply + } + tr.mins, tr.maxs = ply:GetHull() + tr.start = mv:GetOrigin() + tr.endpos = tr.start + tr.mask = MASK_PLAYERSOLID + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + local trout = util.TraceHull(tr) + + if trout.Hit then + local trout = {} + tr.output = trout + local start = tr.start + + for i = 1, 64 do + start.z = start.z + 1 + + util.TraceHull(tr) + + if not trout.Hit then + mv:SetOrigin(start) + + break + end + end + end + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) then + activewep:SendWeaponAnim(ACT_VM_DRAW) + end + + lockang2 = false + lockang = false + + if game.SinglePlayer() then + net.Start("Climb_SPFix") + net.WriteBool(false) + net.WriteBool(false) + net.WriteAngle(angle_zero) + net.WriteBool(false) + net.Send(ply) + end +end + +local function ClimbingThink(ply, mv, cmd) + if ply:GetClimbing() == 5 then + if mv:KeyPressed(IN_FORWARD) and ply:GetClimbingDelay() < CurTime() + 0.65 or mv:KeyDown(IN_FORWARD) and ply:GetClimbingDelay() < CurTime() then + ParkourEvent("hangfoldedheaveup", ply) + ply:SetClimbing(6) + ply:SetClimbingTime(0) + elseif ply:GetClimbingDelay() < CurTime() then + ParkourEvent("hangfoldedendhang", ply) + ply:SetClimbing(1) + ply:SetClimbingDelay(CurTime() + 1.35) + end + + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + mv:SetUpSpeed(0) + mv:SetButtons(bit.band(mv:GetButtons(), bit.bnot(IN_DUCK))) + mv:SetButtons(bit.band(mv:GetButtons(), bit.bnot(IN_JUMP))) + + return + end + + if (ply:GetClimbing() == 2 or ply:GetClimbing() == 6) and ply:GetClimbingTime() >= 1 then + mv:SetButtons(0) + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + mv:SetUpSpeed(0) + ClimbingEnd(ply, mv, cmd) + + return + end + + mv:SetVelocity(vector_origin) + + if ply:GetClimbing() == 1 and ply:GetClimbingDelay() < CurTime() then + if ply.ClimbLockAng < CurTime() then + lockang2 = false + lockang = false + + if game.SinglePlayer() then + net.Start("Climb_SPFix") + net.WriteBool(false) + net.WriteBool(false) + net.WriteAngle(angle_zero) + net.WriteBool(false) + net.Send(ply) + end + end + + if mv:KeyDown(IN_DUCK) then + mv:SetOrigin(ply:GetClimbingStart() - ply:GetClimbingAngle():Forward() * 5) + ply:SetMoveType(MOVETYPE_WALK) + mv:SetButtons(0) + ply:SetClimbing(0) + ply:SetCrouchJumpBlocked(true) + ParkourEvent("hangend", ply) + + if CLIENT_IFTP() then + lockang2 = false + lockang = false + BodyLimitX = 90 + BodyLimitY = 180 + elseif game.SinglePlayer() then + ply:SendLua("lockang2=false lockang=false BodyLimitX=90 BodyLimitY=180") + end + + return + end + + local ang = cmd:GetViewAngles() + ang = math.abs(math.AngleDifference(ang.y, ply.wallang.y)) + + if mv:KeyDown(IN_JUMP) and ang > 42 then + mv:SetOrigin(ply:GetClimbingStart() - ply:GetClimbingAngle():Forward() * 0.6) + ply:SetMoveType(MOVETYPE_WALK) + mv:SetButtons(0) + ply:SetClimbing(0) + ply:SetSafetyRollKeyTime(CurTime() + 0.1) + ParkourEvent("hangjump", ply) + + if CLIENT_IFTP() then + lockang2 = false + lockang = false + BodyLimitX = 90 + BodyLimitY = 180 + local ang = ply:EyeAngles() + ang.x = 0 + ang.z = 0 + + BodyAnim:SetAngles(ang) + elseif game.SinglePlayer() then + ply:SendLua("lockang2=false lockang=false BodyLimitX=90 BodyLimitY=180 local ang=LocalPlayer():EyeAngles() ang.x=0 ang.z=0 BodyAnim:SetAngles(ang)") + end + + local ang = cmd:GetViewAngles() + ang.x = math.min(ang.x, 0) + ang = ang:Forward() + + ang:Mul(350) + + ang.z = 250 + + mv:SetVelocity(ang) + + return + end + + if mv:KeyPressed(IN_FORWARD) and ang <= 42 then + local tr = ply.ClimbingTraceSafety + local trout = ply.ClimbingTraceSafetyOut + local mins, maxs = ply:GetHull() + mins.z = maxs.z * 0.25 + tr.start = ply:GetClimbingEnd() + tr.endpos = tr.start + tr.maxs = maxs + tr.mins = mins + tr.filter = ply + tr.output = trout + + util.TraceHull(tr) + + if not trout.Hit then + tr.start = ply:GetClimbingEnd() + tr.endpos = tr.start - ply:GetClimbingAngle():Forward() * 20 + + util.TraceHull(tr) + + if not trout.Hit then + ply:SetClimbing(2) + ParkourEvent("climbheave", ply) + end + end + end + + if ply:GetClimbing() == 1 and (mv:KeyDown(IN_MOVELEFT) or mv:KeyDown(IN_MOVERIGHT)) and ply:GetClimbingDelay() < CurTime() then + local wallang = ply:GetClimbingAngle() + local dir = wallang:Right() + local isright = mv:KeyDown(IN_MOVERIGHT) + local mult = isright and 30 or -30 + + dir:Mul(mult) + + local tr = ply.ClimbingTraceEnd + local trout = ply.ClimbingTraceEndOut + local oldstart = tr.start + local oldend = tr.endpos + local start = mv:GetOrigin() + wallang:Forward() * 20 + Vector(0, 0, 100) + dir + tr.start = start + tr.endpos = start - Vector(0, 0, 80) + + util.TraceLine(tr) + + if trout.Entity and trout.Entity.IsNPC and (trout.Entity:IsNPC() or trout.Entity:IsPlayer()) then + return false + end + + local fail = trout.Fraction < 0.25 or trout.Fraction > 0.5 + + if not fail then + local ostart = tr.start + local oendpos = tr.endpos + tr.start = ply:GetClimbingEnd() + dir + tr.endpos = tr.start - Vector(0, 0, 100) + + util.TraceLine(tr) + + dir.z = trout.HitPos.z - mv:GetOrigin().z - 77 + tr.endpos = oendpos + tr.start = ostart + tr = ply.ClimbingTraceSafety + trout = ply.ClimbingTraceSafetyOut + tr.start = mv:GetOrigin() + dir - wallang:Forward() * 0.533 + tr.endpos = tr.start + + util.TraceHull(tr) + + if not trout.Hit then + ply:SetClimbingEndOld(ply:GetClimbingEnd()) + ply:SetClimbing(isright and 4 or 3) + ply:SetClimbingStart(mv:GetOrigin()) + ply:SetClimbingEnd(mv:GetOrigin() + dir) + ply:SetClimbingTime(0) + + tr.start = mv:GetOrigin() + ply:GetClimbingAngle():Forward() * 20 + Vector(0, 0, 100) + dir + tr.endpos = tr.start - Vector(0, 0, 80) + + if isright then + ParkourEvent("hangstraferight", ply) + else + ParkourEvent("hangstrafeleft", ply) + end + + ply:SetClimbingDelay(CurTime() + 0.9) + end + end + end + end + + if ply:GetClimbing() == 3 or ply:GetClimbing() == 4 then + local isright = mv:KeyDown(IN_MOVERIGHT) + local dir = ply:GetClimbingAngle():Right() + local mult = isright and 30 or -30 + + dir:Mul(mult) + + local tr = ply.ClimbingTraceEnd + local trout = ply.ClimbingTraceEndOut + + util.TraceLine(tr) + + if trout.Entity and trout.Entity.IsNPC and (trout.Entity:IsNPC() or trout.Entity:IsPlayer()) then + return false + end + + local fail = trout.Fraction < 0.25 or trout.Fraction == 1 + + if not fail then + local lerp = ply:GetClimbingTime() + local lerprate = ClimbingTimes[ply:GetClimbing()] + local poslerp = LerpVector(lerp, ply:GetClimbingStart(), ply:GetClimbingEnd()) + + ply:SetClimbingEndOld(trout.HitPos) + mv:SetOrigin(poslerp) + ply:SetClimbingTime(ply:GetClimbingTime() + FrameTime() * lerprate) + end + + if fail or ply:GetClimbingTime() >= 1 then + ply:SetClimbing(1) + ply:SetClimbingStart(mv:GetOrigin()) + ply:SetClimbingEnd(ply:GetClimbingEndOld()) + ply:SetClimbingTime(0) + end + end + + if ply:GetClimbing() == 2 or ply:GetClimbing() == 6 then + if game.SinglePlayer() then + net.Start("Climb_SPFix") + net.WriteBool(false) + net.WriteBool(false) + net.WriteAngle(angle_zero) + net.WriteBool(false) + net.Send(ply) + end + + local lerp = ply:GetClimbingTime() + local lerprate = ClimbingTimes[ply:GetClimbing()] + + if lerp > 0.5 then + lerprate = lerprate * 0.75 + end + + local poslerp = LerpVector(lerp, ply:GetClimbingStart(), ply:GetClimbingEnd()) + + mv:SetOrigin(poslerp) + ply:SetClimbingTime(lerp + FrameTime() * lerprate) + end + + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + mv:SetUpSpeed(0) + mv:SetButtons(bit.band(mv:GetButtons(), bit.bnot(IN_DUCK))) + mv:SetButtons(bit.band(mv:GetButtons(), bit.bnot(IN_JUMP))) +end + +local function ClimbingRemoveInput(ply, cmd) +end + +hook.Add("StartCommand", "ClimbingRemoveInput", ClimbingRemoveInput) + +local function ClimbingCheck(ply, mv, cmd) + local mins, maxs = ply:GetHull() + + if not ply.ClimbingTrace then + ply.ClimbingTrace = {} + ply.ClimbingTraceOut = {} + ply.ClimbingTraceEnd = {} + ply.ClimbingTraceEndOut = {} + ply.ClimbingTraceSafety = {} + ply.ClimbingTraceSafetyOut = {} + ply.ClimbingTraceSafety.output = ply.ClimbingTraceSafetyOut + + TraceParkourMask(ply.ClimbingTrace) + TraceParkourMask(ply.ClimbingTraceEnd) + TraceParkourMask(ply.ClimbingTraceSafety) + end + + local eyeang = ply:EyeAngles() + local oldpos = mv:GetOrigin() + eyeang.x = 0 + local tr = ply.ClimbingTrace + local trout = ply.ClimbingTraceOut + mins.z = 45 + tr.start = mv:GetOrigin() + + if ply:GetDive() then + tr.start:Sub(Vector(0, 0, 48)) + end + + tr.endpos = tr.start + eyeang:Forward() * 50 + tr.maxs = maxs + tr.mins = mins + tr.filter = ply + tr.output = trout + + util.TraceHull(tr) + + mins.z = 0 + + if not trout.Hit then + return + end + + local wallang = trout.HitNormal:Angle() + wallang.y = wallang.y - 180 + + if wallang.x ~= 0 then + return + end + + if math.abs(math.AngleDifference(wallang.y, eyeang.y)) > 50 then + return + end + + if IsValid(trout.Entity) and trout.Entity.NoClimbing then + return + end + + ply:SetClimbingAngle(wallang) + + local tr = ply.ClimbingTraceEnd + local trout = ply.ClimbingTraceEndOut + local upvalue = ply:GetWallrun() == 1 and Vector(0, 0, 90) or Vector(0, 0, 65) + local plymins, plymaxs = ply:GetHull() + tr.start = mv:GetOrigin() + wallang:Forward() * 45 + upvalue + tr.endpos = tr.start - Vector(0, 0, 90) + tr.maxs = plymaxs + tr.mins = plymins + tr.filter = ply + tr.output = trout + + util.TraceLine(tr) + + if trout.Entity and trout.Entity.IsNPC and (trout.Entity:IsNPC() or trout.Entity:IsPlayer()) then + return false + end + + local fraction = trout.Fraction + local detectionlen = 60 + + if trout.Fraction <= 0 or trout.Fraction >= 0.5 then + tr.start = mv:GetOrigin() + wallang:Forward() * 20 + upvalue + tr.endpos = tr.start - Vector(0, 0, 90) + + util.TraceLine(tr) + + if trout.Fraction <= 0 or trout.Fraction >= 0.5 then + return + end + + detectionlen = 25 + end + + local endpos = trout.HitPos + local height = trout.Fraction + local startpos = ply.ClimbingTraceOut.HitPos + startpos.z = trout.HitPos.z - 77 + + startpos:Add(wallang:Forward() * 0.533) + + if ply:GetDive() then + local origin = mv:GetOrigin() + startpos.z = trout.HitPos.z - 30 + + mv:SetOrigin(startpos) + + if Vault5(ply, mv, eyeang, ply.mantletr, ply.mantlehull) then + if CLIENT then + BodyAnimSetEase(origin) + elseif game.SinglePlayer() then + ply:SetNW2Vector("SPBAEase", origin) + ply:SendLua("BodyAnimSetEase(LocalPlayer():GetNW2Vector('SPBAEase'))") + end + + startpos.z = trout.HitPos.z - 60 + + ply:SetViewOffsetDucked(Vector(0, 0, 64)) + ply:SetMantleStartPos(startpos) + + return + else + mv:SetOrigin(origin) + end + + return + end + + local tr = ply.ClimbingTraceSafety + local trout = ply.ClimbingTraceSafetyOut + tr.filter = ply + tr.start = endpos + tr.endpos = tr.start - wallang:Forward() * detectionlen + + util.TraceLine(tr) + + if trout.Hit then + return + end + + tr.start = startpos + Vector(0, 0, 77) + tr.endpos = tr.start + wallang:Forward() * detectionlen * 0.5 + + util.TraceLine(tr) + + if trout.Hit then + return + end + + local steep = trout.HitNormal:Distance(Vector(0, 0, 1)) > 0.01 + local tr = ply.ClimbingTraceSafety + local trout = ply.ClimbingTraceSafetyOut + tr.start = mv:GetOrigin() + tr.endpos = tr.start + Vector(0, 0, 75) + + util.TraceLine(tr) + + if trout.Hit then + return + end + + local origin = mv:GetOrigin() + local tr = ply.ClimbingTraceSafety + local trout = ply.ClimbingTraceSafetyOut + tr.start = startpos + tr.endpos = startpos + + util.TraceLine(tr) + + if trout.Hit then + return + end + + startpos.z = startpos.z + ply.ClimbingStartPosCache = startpos + ply.ClimbingStartSmooth = origin + + mv:SetOrigin(startpos) + + local resetstartpos = false + + if mv:KeyDown(IN_FORWARD) then + resetstartpos = true + + if ply:GetWallrun() ~= 1 then + startpos.z = startpos.z + 17 + + mv:SetOrigin(startpos) + end + + if Vault4(ply, mv, eyeang, ply.mantletr, ply.mantlehull) then + if CLIENT then + BodyAnimSetEase(origin) + elseif game.SinglePlayer() then + ply:SetNW2Vector("SPBAEase", origin) + ply:SendLua("BodyAnimSetEase(LocalPlayer():GetNW2Vector('SPBAEase'))") + end + + return + else + if ply:GetWallrun() == 1 then + startpos.z = startpos.z + 17 + end + + mv:SetOrigin(startpos) + + if Vault5(ply, mv, eyeang, ply.mantletr, ply.mantlehull) then + if CLIENT then + BodyAnimSetEase(origin) + elseif game.SinglePlayer() then + ply:SetNW2Vector("SPBAEase", origin) + ply:SendLua("BodyAnimSetEase(LocalPlayer():GetNW2Vector('SPBAEase'))") + end + + return + end + end + end + + if resetstartpos then + startpos.z = startpos.z - 17 + ply.ClimbingStartPosCache = startpos + + mv:SetOrigin(startpos) + end + + tr.start = startpos - wallang:Forward() * 0.533 + tr.endpos = tr.start + + util.TraceHull(tr) + + if trout.Hit then + mv:SetOrigin(oldpos) + + return + end + + if CLIENT then + BodyAnimSetEase(origin) + elseif game.SinglePlayer() then + ply:SetNW2Vector("SPBAEase", origin) + ply:SendLua("BodyAnimSetEase(LocalPlayer():GetNW2Vector('SPBAEase'))") + end + + local wr = ply:GetWallrun() + local wrtime = ply:GetWallrunTime() - CurTime() + local vel = mv:GetVelocity() + + if wr ~= 0 then + ply:SetWallrun(0) + ply:EmitSound("Wallrun.Concrete") + end + + local climbvalue = 1 + + ply:SetClimbing(climbvalue) + ply:SetClimbingStart(startpos) + ply:SetClimbingEnd(endpos) + ply:SetClimbingTime(0) + ply:SetClimbingDelay(CurTime() + 0.75) + + ply.ClimbLockAng = CurTime() + 1.45 + + ply:SetCrouchJumpBlocked(false) + ply:SetQuickturn(false) + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) then + usingrh = activewep:GetClass() == "runnerhands" + end + + if usingrh and activewep.SendWeaponAnim then + activewep:SendWeaponAnim(ACT_VM_HITCENTER) + activewep:SetBlockAnims(false) + end + + local folded = mv:GetVelocity().z < -400 + + if folded then + local tr = ply.ClimbingTraceSafety + local trout = ply.ClimbingTraceSafetyOut + local mins, maxs = ply:GetCollisionBounds() + mins.z = maxs.z * 0.25 + tr.start = ply:GetClimbingEnd() + tr.endpos = tr.start + tr.maxs = maxs + tr.mins = mins + tr.filter = ply + tr.output = trout + + util.TraceHull(tr) + + folded = not trout.Hit + end + + local lastvel = mv:GetVelocity() + + mv:SetVelocity(vector_origin) + ply:SetMoveType(MOVETYPE_NOCLIP) + ply:ViewPunch(Angle(5, 0, 0.5)) + + local wallangc = Angle(wallang) + + if folded then + ply:SetClimbing(5) + ply:SetClimbingDelay(CurTime() + 0.8) + ParkourEvent("hangfoldedstart", ply) + else + local event = "climbhard" + + if wr == 1 then + event = "climb" + wallangc.x = -30 + elseif lastvel.z < -200 then + event = "climbhard2" + end + + ParkourEvent(event, ply) + end + + ply.wallang = wallang + + if IsFirstTimePredicted() then + if CLIENT or game.SinglePlayer() then + timer.Simple(0.05, function () + ply:EmitSound("Bump.Concrete") + end) + end + + ply:EmitSound("Handsteps.ConcreteHard") + ply:EmitSound("Cloth.RollLand") + + if CLIENT_IFTP() then + ply.OrigEyeAng = wallang + lockang2 = true + + if folded then + DoImpactBlur(8) + + lockang2 = false + lockang = true + end + end + + if game.SinglePlayer() then + net.Start("Climb_SPFix") + net.WriteBool(false) + net.WriteBool(true) + net.WriteAngle(wallang) + + if folded then + ply:SendLua("DoImpactBlur(8)") + net.WriteBool(true) + end + + net.Send(ply) + end + end + + if CLIENT and IsFirstTimePredicted() then + timer.Simple(0, function () + BodyLimitX = 80 + BodyLimitY = 170 + end) + elseif game.SinglePlayer() then + timer.Simple(0, function () + ply:SendLua("BodyLimitX=80 BodyLimitY=170") + end) + end + + if CLIENT or game.SinglePlayer() then + ply:ConCommand("-jump") + end + + mv:SetButtons(0) + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + mv:SetUpSpeed(0) +end + +hook.Add("SetupMove", "Climbing", function (ply, mv, cmd) + if ply:GetClimbing() == nil or not ply:Alive() then + ply:SetClimbing(0) + end + + if IsValid(ply:GetSwingbar()) then + return + end + + if (not ply:GetCrouchJump() or ply:GetDive()) and not ply:GetJumpTurn() and (mv:KeyDown(IN_FORWARD) or mv:GetVelocity().z < -50 or ply:GetWallrun() == 1) and ply:GetClimbing() == 0 and ply:GetWallrun() ~= 4 and not ply:OnGround() and ply:GetMoveType() ~= MOVETYPE_NOCLIP and ply:GetMoveType() ~= MOVETYPE_LADDER then + ClimbingCheck(ply, mv, cmd) + end + + if ply:GetClimbing() ~= 0 then + ClimbingThink(ply, mv, cmd) + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Conflicts.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Conflicts.lua new file mode 100644 index 0000000..fd6cc40 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Conflicts.lua @@ -0,0 +1,17 @@ +local problematichooks = { + SetupMove = { + "vmanip_vault" + } +} + +local function RemoveConflicting() + for k, v in pairs(problematichooks) do + for l, b in ipairs(v) do + hook.Remove(k, b) + end + end + + hook.Remove("InitPostEntity", "RemoveConflicting") +end + +hook.Add("InitPostEntity", "RemoveConflicting", RemoveConflicting) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/CrouchJump.lua b/beatrun/gamemodes/beatrun/gamemode/sh/CrouchJump.lua new file mode 100644 index 0000000..008adfc --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/CrouchJump.lua @@ -0,0 +1,136 @@ +local usingrh = nil +local punch = Angle(0.5, 0, 0) +local punchland = Angle(10, 0, 0.5) +local punchthink = Angle() + +if SERVER then + util.AddNetworkString("CrouchJumpSP") +elseif CLIENT and game.SinglePlayer() then + net.Receive("CrouchJumpSP", function () + local ply = LocalPlayer() + + if BodyAnimArmCopy then + BodyAnimCycle = 0 + BodyAnimCrouchLerp = 0 + BodyAnimCrouchLerpZ = ply:GetPos().z - 32 + local ang = ply:EyeAngles() + ang.x = 0 + ply.OrigEyeAng = ang + BodyLimitX = 40 + + return + end + end) +end + +hook.Add("SetupMove", "CrouchJump", function (ply, mv, cmd) + if ply:OnGround() and ply:GetCrouchJumpBlocked() then + ply:SetCrouchJumpBlocked(false) + end + + if ply:Alive() and not ply:GetCrouchJumpBlocked() and not IsValid(ply:GetZipline()) and not IsValid(ply:GetLadder()) and ply:GetClimbing() == 0 and not ply:GetJumpTurn() and ply:GetMantle() == 0 and not ply:OnGround() and ply:GetVelocity().z > -350 and ply:GetCrouchJumpTime() < CurTime() and ply:GetWallrun() == 0 and mv:KeyPressed(IN_DUCK) then + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) then + usingrh = activewep:GetClass() == "runnerhands" + end + + if CLIENT then + local ang = ply:EyeAngles() + ang.x = 0 + BodyLimitX = 40 + ply.OrigEyeAng = ang + + if IsFirstTimePredicted() then + BodyAnimCycle = 0 + BodyAnimCrouchLerp = 0 + + if usingrh then + BodyAnimCrouchLerpZ = mv:GetOrigin().z - 32 + else + BodyAnimCrouchLerpZ = mv:GetOrigin().z + end + end + end + + if game.SinglePlayer() then + net.Start("CrouchJumpSP") + net.WriteBool(true) + net.Send(ply) + ply:SetNW2Float("BodyAnimCrouchLerpZ", ply:GetPos().z - 32) + end + + ParkourEvent("coil", ply) + ply:SetCrouchJump(true) + ply:SetCrouchJumpTime(CurTime() + 1) + ply:ViewPunch(punch) + ply:SetViewOffsetDucked(Vector(0, 0, 28)) + + if usingrh then + activewep:SendWeaponAnim(ACT_VM_HOLSTER) + end + elseif (ply:OnGround() or ply:GetCrouchJumpTime() < CurTime() or not ply:Alive()) and ply:GetCrouchJump() then + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) then + usingrh = activewep:GetClass() == "runnerhands" + end + + if game.SinglePlayer() then + net.Start("CrouchJumpSP") + net.WriteBool(false) + net.Send(ply) + end + + ply:SetCrouchJump(false) + + if usingrh and IsValid(activewep) then + activewep:SendWeaponAnim(ACT_VM_DRAW) + end + + if ply:OnGround() and not ply:GetDive() then + ply:ViewPunch(punchland) + + local event = "landcoil" + + ParkourEvent(event, ply) + end + + ply:SetViewOffsetDucked(Vector(0, 0, 32)) + ply:SetCrouchJumpTime(0) + elseif ply:GetCrouchJump() then + if CLIENT and IsFirstTimePredicted() then + local p = CurTime() - ply:GetCrouchJumpTime() + + if ply:GetDive() then + p = p + 0.5 + end + + punchthink.x = math.max(p + 0.5, -0) + + ply:CLViewPunch(punchthink) + elseif game.SinglePlayer() then + local p = CurTime() - ply:GetCrouchJumpTime() + + if ply:GetDive() then + p = p + 0.5 + end + + punchthink.x = math.max(p + 0.75, -0) + + ply:ViewPunch(punchthink) + end + end +end) +hook.Add("CreateMove", "VManipCrouchJumpDuck", function (cmd) + local ply = LocalPlayer() + + if ply:GetCrouchJump() and ply:GetMoveType() == MOVETYPE_WALK and not ply:OnGround() and not ply:GetDive() then + cmd:SetButtons(bit.bor(cmd:GetButtons(), IN_DUCK)) + end + + if ply:GetCrouchJumpBlocked() and cmd:KeyDown(IN_DUCK) then + cmd:SetButtons(bit.bor(cmd:GetButtons(), IN_BULLRUSH)) + cmd:RemoveKey(IN_DUCK) + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Damage.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Damage.lua new file mode 100644 index 0000000..c873058 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Damage.lua @@ -0,0 +1,111 @@ +if SERVER then + util.AddNetworkString("DBNO") +else + net.Receive("DBNO", function () + DoJumpTurn() + end) +end + +hook.Add("ScalePlayerDamage", "MissedMe", function (ply, hitgroup, dmginfo) + if IsValid(dmginfo:GetAttacker()) and dmginfo:GetAttacker():IsPlayer() then + return + end + + local vel = ply:GetVelocity() + local vel_len = vel:Length() + + if vel_len > 310 or ply:GetSliding() and vel_len > 100 or ply:GetWallrun() > 0 and vel_len > 200 or ply:GetJumpTurn() and not ply:OnGround() then + return true + end +end) +hook.Add("EntityTakeDamage", "MissedMe", function (victim, dmginfo) + if not victim:IsPlayer() then + return + end + + local dmgtype = dmginfo:GetDamageType() + + if victim:GetSliding() and (dmgtype == DMG_SLASH or dmgtype == DMG_CLUB) then + return true + end +end) +hook.Add("PlayerShouldTakeDamage", "DBNO", function (ply, attacker) + if not IsValid(attacker) then + return + end + + local class = attacker:GetClass() + + if class == "npc_antlionguard" or class == "npc_antlionguardian" then + local atteyeang = attacker:EyeAngles() + atteyeang.x = 0 + atteyeang.z = 0 + atteyeang.y = atteyeang.y - 180 + + ply:SetEyeAngles(atteyeang) + ply:SetJumpTurn(true) + ply:SetPos(ply:GetPos() + Vector(0, 0, 8)) + ply:SetLocalVelocity(atteyeang:Forward() * 100 + Vector(0, 0, 100)) + + if game.SinglePlayer() then + timer.Simple(0, function () + net.Start("DBNO") + net.Send(ply) + end) + else + net.Start("DBNO") + net.Send(ply) + end + end + + if ply:GetJumpTurn() and not ply:OnGround() and attacker:IsNPC() then + return false + end +end) + +if CLIENT then + local radial = Material("radial.png") + local dmgalpha = 0 + + hook.Add("HUDPaint", "NTScreenEffects", function () + local ply = LocalPlayer() + + if not ply:Alive() then + return + end + + local w = ScrW() + local h = ScrH() + dmgalpha = math.min(300 * math.abs(ply:Health() / ply:GetMaxHealth() - 1), 255) + + surface.SetMaterial(radial) + surface.SetDrawColor(0, 0, 0, dmgalpha * 0.85) + surface.DrawTexturedRect(0, 0, ScrW(), ScrH()) + surface.DrawTexturedRectRotated(ScrW() * 0.5, ScrH() * 0.5, ScrW(), ScrH(), 180) + surface.SetDrawColor(255, 25, 25, dmgalpha * math.max(0, math.sin(CurTime() * 6) * 0.045)) + surface.DrawTexturedRect(0, 0, w, h) + end) +end + +if SERVER then + hook.Add("PlayerPostThink", "HealthRegen", function (ply) + if not ply.LastHP then + ply.LastHP = ply:Health() + ply.RegenTime = 0 + + return + end + + if ply:Health() < ply.LastHP then + ply.RegenTime = CurTime() + 5 + end + + if ply:Alive() and ply.RegenTime < CurTime() and ply:Health() < ply:GetMaxHealth() then + ply:SetHealth(math.Approach(ply:Health(), ply:GetMaxHealth(), 1)) + + ply.RegenTime = CurTime() + 0.05 + end + + ply.LastHP = ply:Health() + end) +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/DataTheft.lua b/beatrun/gamemodes/beatrun/gamemode/sh/DataTheft.lua new file mode 100644 index 0000000..de53875 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/DataTheft.lua @@ -0,0 +1,104 @@ +GM_DATATHEFT = 1 +DATATHEFT_LOADOUTS = { + { + "weapon_ss2_colt", + "weapon_ss2_circularsaw" + } +} + +if SERVER then + util.AddNetworkString("DataTheft_Start") + util.AddNetworkString("DataTheft_Sync") + + function Beatrun_StartDataTheft() + SetGlobalBool(GM_DATATHEFT, true) + net.Start("DataTheft_Start") + net.Broadcast() + + for k, v in ipairs(player.GetAll()) do + v:DataTheft_Bank() + v:SetNW2Int("DataCubes", 0) + v:SetNW2Int("DataBanked", 0) + v:SetCollisionGroup(COLLISION_GROUP_PLAYER) + v:SetCustomCollisionCheck(false) + + if v:GetMoveType() == MOVETYPE_NOCLIP then + v:SetMoveType(MOVETYPE_WALK) + v:Spawn() + else + for l, b in ipairs(DATATHEFT_LOADOUTS[math.random(#DATATHEFT_LOADOUTS)]) do + local wep = v:Give(b) + + v:GiveAmmo(300, wep:GetPrimaryAmmoType()) + end + end + end + end + + function Beatrun_StopDataTheft() + SetGlobalBool(GM_DATATHEFT, false) + end + + local function DataTheftSync(ply) + if GetGlobalBool(GM_DATATHEFT) and not ply.DataTheftSynced then + net.Start("Infection_Sync") + net.WriteFloat(Infection_StartTime) + net.WriteFloat(Infection_EndTime) + net.Send(ply) + + ply.DataTheftSynced = true + end + end + + hook.Add("PlayerSpawn", "DataTheftSync", DataTheftSync) + + local function DataTheftDeath(ply, inflictor, attacker) + if GetGlobalBool(GM_DATATHEFT) then + local datacount = ply:GetNW2Int("DataCubes", 0) + + if datacount > 0 then + local pos = ply:GetPos() + Vector(0, 0, 32) + + for i = 1, datacount + 1 do + local datacube = ents.Create("br_datacube") + + datacube:SetPos(pos) + datacube:Spawn() + end + + ply:SetNW2Int("DataCubes", 0) + elseif IsValid(attacker) and attacker ~= ply then + local pos = ply:GetPos() + Vector(0, 0, 32) + local datacube = ents.Create("br_datacube") + + datacube:SetPos(pos) + datacube:Spawn() + end + end + end + + hook.Add("PlayerDeath", "DataTheftDeath", DataTheftDeath) +end + +if CLIENT then + local function DataTheftHUDName() + if GetGlobalBool(GM_DATATHEFT) then + local datacubes = LocalPlayer():GetNW2Int("DataCubes", 0) + + return "Data Theft (" .. datacubes .. ")" + else + hook.Remove("BeatrunHUDCourse", "DataTheftHUDName") + end + end + + net.Receive("DataTheft_Sync", function () + hook.Add("BeatrunHUDCourse", "DataTheftHUDName", DataTheftHUDName) + end) + + local chatcolor = Color(200, 200, 200) + + net.Receive("DataTheft_Start", function () + hook.Add("BeatrunHUDCourse", "DataTheftHUDName", DataTheftHUDName) + chat.AddText(chatcolor, "Data Theft! Kill players to collect data, deposit data in banks") + end) +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Dive.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Dive.lua new file mode 100644 index 0000000..78d98a5 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Dive.lua @@ -0,0 +1,100 @@ +local totsugeki = CreateConVar("Beatrun_Totsugeki", 1, { + FCVAR_REPLICATED, + FCVAR_ARCHIVE +}, "Oh no...", 0, 1) +local totsugekispam = CreateConVar("Beatrun_TotsugekiSpam", 0, { + FCVAR_REPLICATED, + FCVAR_ARCHIVE +}, "OH NO...", 0, 1) +local totsugekiheading = CreateConVar("Beatrun_TotsugekiHeading", 0, { + FCVAR_REPLICATED, + FCVAR_ARCHIVE +}, "Can we dive on the x axis?", 0, 1) +local totsugekidir = CreateConVar("Beatrun_TotsugekiDir", 0, { + FCVAR_REPLICATED, + FCVAR_ARCHIVE +}, "Can we dive into another dir?", 0, 1) + +local function Dive(ply, mv, cmd) + if (not ply:GetDive() or ply:GetDive() and ply.QuakeJumping and totsugeki:GetBool() and totsugekispam:GetBool()) and ply:GetCrouchJump() and mv:KeyPressed(IN_ATTACK2) then + local vel = mv:GetVelocity() + local vel2 = Vector(vel) + vel2.z = 0 + local vel2len = vel2:Length() + local ang = cmd:GetViewAngles() + ang.x = 0 + local velmul = 15 / (math.max(vel2len - 100, 40) * 0.003) + + vel:Add(ang:Forward() * velmul) + vel:Add(Vector(0, 0, 70)) + mv:SetVelocity(vel) + ply:SetCrouchJumpTime(CurTime() + 1.65) + ply:SetDive(true) + ParkourEvent("divestart", ply) + + if ply:UsingRH() and ply:GetActiveWeapon():GetQuakeJumping() and totsugeki:GetBool() then + if SERVER then + ply:EmitSound("misc/totsugeki" .. math.random(1, 2) .. ".mp3", 60, 100, 1, CHAN_VOICE) + + local vPoint = mv:GetOrigin() + local effectdata = EffectData() + + effectdata:SetOrigin(vPoint) + util.Effect("WaterSurfaceExplosion", effectdata) + elseif CLIENT_IFTP() then + local vPoint = mv:GetOrigin() + local effectdata = EffectData() + + effectdata:SetOrigin(vPoint) + util.Effect("WaterSurfaceExplosion", effectdata) + end + + local ang = cmd:GetViewAngles() + + if not totsugekiheading:GetBool() then + ang.x = 0 + end + + vel:Set(ang:Forward() * 800) + + if not totsugekidir:GetBool() then + vel:Set(vel2) + vel:Add(ang:Forward() * 200) + end + + vel:Add(Vector(0, 0, 70)) + mv:SetVelocity(vel) + end + end + + mv:AddKey(IN_BULLRUSH) + + if ply:GetDive() then + if ply:GetMoveType() == MOVETYPE_NOCLIP or ply:WaterLevel() >= 3 or not ply:Alive() then + ply:SetDive(false) + ply:SetCrouchJump(false) + + ply.DiveSliding = false + + ParkourEvent("diveslideend", ply) + + return + end + + if not cmd:KeyDown(IN_DUCK) then + mv:AddKey(IN_BULLRUSH) + end + + mv:AddKey(IN_DUCK) + + if ply:OnGround() and ply:GetSafetyRollKeyTime() <= CurTime() then + ply.DiveSliding = true + + ply:SetDive(false) + elseif ply:OnGround() and mv:KeyDown(IN_BULLRUSH) then + mv:SetButtons(0) + end + end +end + +hook.Add("SetupMove", "Dive", Dive) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Endless_Run.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Endless_Run.lua new file mode 100644 index 0000000..9e58b87 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Endless_Run.lua @@ -0,0 +1,26 @@ +print("h") + +local prefabs = { + basic_floor = { + { + Vector(), + Vector(300, 300, 50), + 0, + 0, + 0 + } + } +} + +function SpawnPrefab(pos, data) + for k, v in ipairs(data) do + local mins = v[1] + local maxs = v[2] + local offsetx = v[3] or 0 + local offsety = v[4] or 0 + local offsetz = v[5] or 0 + local offsetvec = Vector(offsetx, offsety, offsetz) + + offsetvec:Add(pos) + end +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Grapple.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Grapple.lua new file mode 100644 index 0000000..79efe89 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Grapple.lua @@ -0,0 +1,323 @@ +if CLIENT then + local circle = Material("circlesmooth.png", "nocull smooth") + + hook.Add("HUDPaint", "grappleicon", function () + local ply = LocalPlayer() + + if ply:GetMantle() ~= 0 or ply:GetClimbing() ~= 0 then + return + end + + if not ply:Alive() or Course_Name ~= "" and ply:GetNW2Int("CPNum", 1) ~= -1 then + return + end + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) and activewep:GetClass() ~= "runnerhands" then + return + end + + if GetGlobalBool(GM_INFECTION) then + return + end + + if not ply.GrappleHUD_tr then + ply.GrappleHUD_tr = {} + ply.GrappleHUD_trout = {} + ply.GrappleHUD_tr.output = ply.GrappleHUD_trout + ply.GrappleHUD_tr.collisiongroup = COLLISION_GROUP_WEAPON + end + + if ply:GetGrappling() then + cam.Start3D() + + local w2s = ply:GetGrapplePos():ToScreen() + + cam.End3D() + surface.SetDrawColor(255, 255, 255) + surface.SetMaterial(circle) + surface.DrawTexturedRect(w2s.x - SScaleX(4), w2s.y - SScaleY(4), SScaleX(8), SScaleY(8)) + + return + end + + if ply:EyeAngles().x > -15 or ply:GetWallrun() ~= 0 then + return + end + + local trout = ply:GetEyeTrace() + local dist = trout.HitPos:DistToSqr(ply:GetPos()) + + if trout.Fraction > 0 and dist < 2750000 and dist > 90000 then + cam.Start3D() + + local w2s = trout.HitPos:ToScreen() + + cam.End3D() + surface.SetDrawColor(255, 255, 255) + surface.SetMaterial(circle) + surface.DrawTexturedRect(w2s.x - SScaleX(4), w2s.y - SScaleY(4), SScaleX(8), SScaleY(8)) + end + end) +end + +local zpunchstart = Angle(2, 0, 0) + +hook.Add("SetupMove", "Grapple", function (ply, mv, cmd) + if ply:GetMantle() ~= 0 or ply:GetClimbing() ~= 0 then + return + end + + if not ply:Alive() or Course_Name ~= "" and ply:GetNW2Int("CPNum", 1) ~= -1 and not ply:GetNW2Entity("Swingrope") then + return + end + + if GetGlobalBool(GM_INFECTION) and not ply:GetNW2Entity("Swingrope") then + return + end + + local activewep = ply:GetActiveWeapon() + local usingrh = IsValid(activewep) and activewep:GetClass() == "runnerhands" + + if not ply.Grapple_tr then + ply.Grapple_tr = {} + ply.Grapple_trout = {} + ply.Grapple_tr.output = ply.Grapple_trout + ply.Grapple_tr.collisiongroup = COLLISION_GROUP_WEAPON + end + + local grappled = nil + + if not ply:GetGrappling() and ply:GetMelee() == 0 and not ply:OnGround() and ply:GetSafetyRollKeyTime() < CurTime() and ply:GetWallrun() == 0 and usingrh and cmd:GetViewAngles().x <= -15 then + local trout = ply:GetEyeTrace() + local dist = trout.HitPos:DistToSqr(mv:GetOrigin()) + + if trout.Fraction > 0 and dist < 2750000 and dist > 90000 and mv:KeyPressed(IN_JUMP) then + local vel = mv:GetVelocity() + vel.z = -math.abs(vel.z) + + mv:SetVelocity(vel) + ply:SetGrapplePos(trout.HitPos) + ply:SetGrappling(true) + ply:SetGrappleLength(mv:GetOrigin():Distance(trout.HitPos)) + ply:SetWallrunCount(0) + ply:SetJumpTurn(false) + ply:SetCrouchJumpBlocked(false) + + if CLIENT_IFTP() or game.SinglePlayer() then + ply:EmitSound("MirrorsEdge/Gadgets/ME_Magrope_Fire.wav", 40, 100 + math.random(-25, 10)) + end + + ply:ViewPunch(zpunchstart) + + grappled = true + ply.GrappleLengthOld = ply:GetGrappleLength() + end + end + + if ply:GetGrappling() then + local startshrink = (ply.GrappleLengthOld or 0) - ply:GetGrappleLength() < 200 + local shmovemul = startshrink and 4 or 1 + local gpos = ply:GetGrapplePos() + local pos = mv:GetOrigin() + local eyepos = mv:GetOrigin() + eyepos.z = eyepos.z + 64 + + if not ply:Alive() or mv:KeyPressed(IN_JUMP) and not grappled and not ply:OnGround() or ply:GetClimbing() ~= 0 or ply:GetMantle() ~= 0 or not usingrh then + ply:SetGrappling(false) + + if CLIENT_IFTP() or game.SinglePlayer() then + ply:EmitSound("MirrorsEdge/zipline_detach.wav", 40, 100 + math.random(-25, 10)) + end + + if mv:KeyPressed(IN_JUMP) then + local ang = cmd:GetViewAngles() + ang.x = 0 + ang = ang:Forward() + + ang:Mul(200) + + ang.z = 200 + + mv:SetVelocity(mv:GetVelocity() * 0.5 + ang) + ply:SetNW2Entity("Swingrope", nil) + end + + ParkourEvent("jump", ply) + table.Empty(ply.ZiplineTraceOut) + + return + end + + if mv:KeyDown(IN_ATTACK) and mv:GetOrigin().z < ply:GetGrapplePos().z - 64 then + ply:SetGrappleLength(ply:GetGrappleLength() - FrameTime() * 100) + elseif mv:KeyDown(IN_ATTACK2) then + ply:SetGrappleLength(ply:GetGrappleLength() + FrameTime() * 100) + end + + if startshrink then + ply:SetGrappleLength(ply:GetGrappleLength() - FrameTime() * 250) + end + + local vel = mv:GetVelocity() + local ang = cmd:GetViewAngles() + ang.x = 0 + local fmove = ang:Forward() * mv:GetForwardSpeed() * 6e-05 * shmovemul + local smove = ang:Right() * mv:GetSideSpeed() * 2.5e-05 * shmovemul + local newvel = fmove + smove + local gposd = ply:GetGrapplePos() + local posd = mv:GetOrigin() + gposd.z = 0 + posd.z = 0 + newvel.z = gposd:Distance(posd) / ply:GetGrappleLength() * 5 + + mv:SetVelocity(mv:GetVelocity() + newvel) + + if ply:GetGrappleLength() < ply:GetGrapplePos():Distance(pos) and not ply:OnGround() then + local tr = ply.Grapple_tr + local trout = ply.Grapple_trout + tr.start = mv:GetOrigin() + tr.endpos = mv:GetOrigin() + local mins, maxs = ply:GetHull() + + mins:Mul(1.01) + maxs:Mul(1.01) + + tr.mins = mins + tr.maxs = maxs + tr.filter = ply + tr.output = trout + + util.TraceHull(tr) + + local vel = pos - ply:GetGrapplePos() + + vel:Normalize() + + if not trout.Hit then + mv:SetOrigin(mv:GetOrigin() - vel * (ply:GetGrapplePos():Distance(pos) - ply:GetGrappleLength() - 10)) + end + + mv:SetVelocity(mv:GetVelocity() - vel * (ply:GetGrapplePos():Distance(pos) - ply:GetGrappleLength())) + elseif ply:OnGround() then + ply:SetGrappleLength(mv:GetOrigin():Distance(ply:GetGrapplePos()) + 10) + end + + if startshrink then + mv:SetVelocity(mv:GetVelocity() + Vector(0, 0, 2.5)) + end + + if mv:GetOrigin().z > ply:GetGrapplePos().z - 64 then + mv:SetVelocity(mv:GetVelocity() - Vector(0, 0, 10)) + end + end +end) + +local cablemat = Material("cable/cable2") +local ropetop = Vector() +local ropelerp = 0 +local ropedown = Vector(0, 0, 20) + +hook.Add("PostDrawTranslucentRenderables", "GrappleBeam", function () + local ply = LocalPlayer() + + if ply:GetGrappling() then + local BA = BodyAnimArmCopy + + if ply:ShouldDrawLocalPlayer() then + BA = BodyAnim + end + + if not IsValid(BA) then + return + end + + BA:SetupBones() + + local rhand = BA:LookupBone("ValveBiped.Bip01_R_Finger41") + local lhand = BA:LookupBone("ValveBiped.Bip01_L_Finger21") + + if BA:GetBoneMatrix(rhand) == nil then + return + end + + local rhandpos = BA:GetBoneMatrix(rhand):GetTranslation() + + if not rhandpos then + return + end + + rhandpos:Sub(BA:GetRight() * 2.5) + + local lhandpos = BA:GetBoneMatrix(lhand):GetTranslation() + + ropetop:Set(lhandpos) + render.SetMaterial(cablemat) + render.StartBeam(2) + + local up = (rhandpos - lhandpos):Angle():Forward() + + up:Mul(20) + rhandpos:Add(up) + render.DrawBeam(LerpVector(ropelerp, lhandpos - ropedown, rhandpos), lhandpos, 1.5, 0, 1) + render.DrawBeam(ropetop, ply:GetGrapplePos(), 1.5, 0, 1) + BodyAnim:SetSequence("grapplecenter") + + ropelerp = math.Approach(ropelerp, 1, FrameTime() * 2) + else + ropelerp = 0 + end +end) + +function CreateSwingrope(startpos, length) + if startpos and length then + local swingrope = ents.Create("br_swingrope") + + swingrope:SetStartPos(startpos) + swingrope:SetEndPos(startpos - Vector(0, 0, length)) + swingrope:Spawn() + + return swingrope + end +end + +local function Swingrope(ply, mv, cmd) + if not ply.ZiplineTrace then + return + end + + if not IsValid(ply:GetZipline()) and not ply:GetGrappling() and not ply:Crouching() and not ply:OnGround() and ply:GetZiplineDelay() < CurTime() then + local trout = ply.ZiplineTraceOut + local trentity = trout.Entity + + if IsValid(trentity) and trentity:GetClass() == "br_swingrope" and ply:GetMoveType() == MOVETYPE_WALK then + local vel = mv:GetVelocity() + local startpos = trentity:GetStartPos() + local endpos = trentity:GetEndPos() + local bestpos = endpos.z < startpos.z and startpos or endpos + vel.z = -math.abs(vel.z) + + mv:SetVelocity(vel) + ply:SetGrapplePos(bestpos) + ply:SetGrappling(true) + ply:SetGrappleLength(mv:GetOrigin():Distance(bestpos)) + ply:SetWallrunCount(0) + ply:SetJumpTurn(false) + + ply.GrappleLengthOld = ply:GetGrappleLength() + 200 + + ply:SetZiplineDelay(CurTime() + 0.25) + ply:SetCrouchJumpBlocked(true) + ply:SetNW2Entity("Swingrope", trentity) + + local eyeang = cmd:GetViewAngles() + vel.z = 0 + eyeang.x = 0 + + mv:SetVelocity(eyeang:Forward() * vel:Length() * 0.85 + vel * 0.65) + end + end +end + +hook.Add("SetupMove", "Swingrope", Swingrope) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Infection.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Infection.lua new file mode 100644 index 0000000..3f8fa36 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Infection.lua @@ -0,0 +1,520 @@ +GM_INFECTION = 0 +Infection_StartTime = 0 +Infection_EndTime = 0 +local rand = math.random + +function table.Shuffle(t) + local n = #t + + while n > 1 do + local k = rand(n) + t[k] = t[n] + t[n] = t[k] + n = n - 1 + end + + return t +end + +local function HumanCount() + local count = 0 + + for k, v in ipairs(player.GetAll()) do + if IsValid(v) and not v:GetNW2Bool("Infected") then + count = count + 1 + end + end + + return count +end + +if SERVER then + util.AddNetworkString("Infection_Start") + util.AddNetworkString("Infection_End") + util.AddNetworkString("Infection_Touch") + util.AddNetworkString("Infection_Announce") + util.AddNetworkString("Infection_XPReward") + util.AddNetworkString("Infection_LastMan") + util.AddNetworkString("Infection_Sync") + + local revealed = false + local ended = false + local didmusic = false + local didgun = false + local cachedhumancount = -1 + + local function GiveLastManGun() + if cachedhumancount == 1 then + for k, v in pairs(player.GetAll()) do + if not didgun and not ended and v:Alive() and not v:GetNW2Bool("Infected") then + hook.Run("Infection_LastManGun", v) + + didgun = true + + break + end + end + end + end + + net.Receive("Infection_Touch", function (len, ply) + local victim = net.ReadEntity() + + if ended or not ply:Alive() or not ply:GetNW2Bool("Infected") or victim:GetNW2Bool("Infected") then + return + end + + if IsValid(victim) and victim:IsPlayer() and ply:GetPos():Distance(victim:GetPos()) < 300 then + victim:SetNW2Bool("Infected", true) + net.Start("Infection_Announce") + net.WriteEntity(ply) + net.WriteEntity(victim) + net.Broadcast() + victim:SetNW2Float("PBTime", CurTime() - Infection_StartTime) + + local humancount = HumanCount() + cachedhumancount = humancount + + timer.Simple(0.01, GiveLastManGun) + + if humancount < 1 then + victim:EmitSound("blackout_hit_0" .. rand(1, 3) .. ".wav") + net.Start("Infection_End") + net.WriteFloat(CurTime()) + net.Broadcast() + + ended = true + + timer.Simple(15, function () + if ended and GetGlobalBool(GM_INFECTION) then + Beatrun_StartInfection() + end + end) + else + victim:EmitSound("player_damage_tonal_hit_0" .. rand(1, 6) .. ".wav") + end + end + end) + + local function InfectionSync(ply) + if GetGlobalBool(GM_INFECTION) and not ply.InfectionSynced then + net.Start("Infection_Sync") + net.WriteFloat(Infection_StartTime) + net.WriteFloat(Infection_EndTime) + net.Send(ply) + + ply.InfectionSynced = true + end + end + + hook.Add("PlayerSpawn", "InfectionSync", InfectionSync) + + function Beatrun_StopInfection() + SetGlobalBool(GM_INFECTION, false) + + local players = player.GetAll() + + for k, v in ipairs(players) do + v:SetNW2Float("PBTime", 0) + v:SetNW2Bool("Infected", false) + end + + Infection_StartTime = 0 + Infection_EndTime = 0 + + hook.Remove("Think", "InfectionTimer") + end + + local function Beatrun_FirstInfection() + local players = player.GetAll() + local numinfected = math.max(math.floor(#players / 4), 1) + + for k, v in pairs(players) do + if not v:Alive() then + v:Spawn() + end + end + + if numinfected == 1 then + local infected = players[rand(#players)] + + infected:SetNW2Bool("Infected", true) + net.Start("Infection_XPReward") + net.WriteBool(false) + net.Send(infected) + else + table.Shuffle(players) + + for i = 1, numinfected do + players[i]:SetNW2Bool("Infected", true) + net.Start("Infection_XPReward") + net.WriteBool(false) + net.Send(players[i]) + end + end + end + + local function InfectionTimer() + if not GetGlobalBool(GM_INFECTION) then + return + end + + if player.GetCount() <= 1 then + Beatrun_StopInfection() + + return + end + + if not revealed and Infection_StartTime <= CurTime() then + revealed = true + + Beatrun_FirstInfection() + end + + local timeremaining = Infection_EndTime - CurTime() + + if not didmusic and revealed and timeremaining <= 60 and timeremaining >= 50 and player.GetCount() >= 5 and cachedhumancount == 1 then + timer.Simple(0.1, function () + for k, v in ipairs(player.GetAll()) do + if v:Alive() and not v:GetNW2Bool("Infected") then + net.Start("Infection_LastMan") + net.Send(v) + + break + end + end + end) + + didmusic = true + end + + if Infection_EndTime <= CurTime() and not ended then + for k, v in ipairs(player.GetAll()) do + if v:GetNW2Float("PBTime") == 0 and not v:GetNW2Bool("Infected") then + v:SetNW2Float("PBTime", Infection_EndTime - Infection_StartTime) + end + end + + net.Start("Infection_End") + net.WriteFloat(CurTime()) + net.Broadcast() + + ended = true + + timer.Simple(15, function () + if ended and GetGlobalBool(GM_INFECTION) then + Beatrun_StartInfection() + end + end) + end + end + + function Beatrun_StartInfection() + if GetGlobalBool(GM_INFECTION) and not ended then + return + end + + if Course_Name ~= "" then + return + end + + if player.GetCount() < 2 then + return + end + + net.Start("Infection_Start") + net.WriteFloat(CurTime()) + net.Broadcast() + SetGlobalBool(GM_INFECTION, true) + + revealed = false + ended = false + didmusic = false + didgun = false + cachedhumancount = 0 + local players = player.GetAll() + + for k, v in ipairs(players) do + v:SetNW2Float("PBTime", 0) + v:SetNW2Bool("Infected", false) + v:SelectWeapon("runnerhands") + v:StripAmmo() + + v.InfectionSynced = true + v.InfectionWuzHere = true + + if v:GetMoveType() == MOVETYPE_NOCLIP then + v:SetMoveType(MOVETYPE_WALK) + v:Spawn() + end + end + + Infection_StartTime = CurTime() + 10 + Infection_EndTime = CurTime() + 190 + + hook.Add("Think", "InfectionTimer", InfectionTimer) + end + + function InfectionDeath(ply) + if not GetGlobalBool(GM_INFECTION) then + return + end + + if revealed and Infection_StartTime < CurTime() and not ply:GetNW2Bool("Infected") then + if ply.InfectionWuzHere then + ply:SetNW2Float("PBTime", CurTime() - Infection_StartTime) + end + + ply:SetNW2Bool("Infected", true) + net.Start("Infection_Announce") + net.WriteEntity(ply) + net.WriteEntity(ply) + net.Broadcast() + + local humancount = HumanCount() + cachedhumancount = humancount + + timer.Simple(0.01, GiveLastManGun) + + if humancount < 1 then + net.Start("Infection_End") + net.WriteFloat(CurTime()) + net.Broadcast() + + ended = true + + timer.Simple(15, function () + if ended and GetGlobalBool(GM_INFECTION) then + Beatrun_StartInfection() + end + end) + end + + local timeremaining = Infection_EndTime - CurTime() + + if timeremaining <= 70 and timeremaining >= 50 and player.GetCount() > 6 and humancount == 1 then + timer.Simple(0.1, function () + for k, v in ipairs(player.GetAll()) do + if v:Alive() and not v:GetNW2Bool("Infected") then + net.Start("Infection_LastMan") + net.Send(v) + + break + end + end + end) + end + end + end + + hook.Add("PlayerDeath", "InfectionDeath", InfectionDeath) + hook.Add("PlayerSpawn", "InfectionDeath", InfectionDeath) +end + +if CLIENT then + local endtime = 0 + local noclipkey = 0 + + local function InfectionHUDName() + if GetGlobalBool(GM_INFECTION) then + local team = LocalPlayer():GetNW2Bool("Infected") and "(Infected)" or "(Human)" + + return "Infection " .. team + else + hook.Remove("BeatrunHUDCourse", "InfectionHUDName") + end + end + + local view = {} + local lookingbehind = true + + local function blankfunc() + end + + local function InfectionCalcView(ply, pos, ang) + if GetGlobalBool(GM_INFECTION) then + local keydown = input.IsKeyDown(noclipkey) + + if keydown then + ang.x = 0 + ang.z = 0 + ang.y = ang.y + 180 + view.origin = pos + view.angles = ang + lookingbehind = true + + LocalPlayer():DrawViewModel(false) + + BodyAnimMDL.RenderOverride = blankfunc + BodyAnimMDLarm.RenderOverride = blankfunc + end + + if lookingbehind and not keydown then + lookingbehind = false + + LocalPlayer():DrawViewModel(true) + + BodyAnimMDL.RenderOverride = nil + BodyAnimMDLarm.RenderOverride = nil + end + elseif CurTime() > Infection_StartTime + 1 then + if IsValid(BodyAnimMDL) then + BodyAnimMDL:SetNoDraw(false) + end + + if IsValid(BodyAnimMDLarm) then + BodyAnimMDLarm:SetNoDraw(false) + end + + LocalPlayer():DrawViewModel(true) + hook.Remove("CalcView", "InfectionCalcView") + end + end + + local chatcolor = Color(200, 200, 200) + + net.Receive("Infection_Start", function () + local start = net.ReadFloat() + local noclipbind = input.LookupBinding("noclip") or "n" + noclipkey = input.GetKeyCode(noclipbind) + endtime = 0 + Infection_StartTime = start + 10 + Infection_EndTime = start + 190 + + hook.Add("BeatrunHUDCourse", "InfectionHUDName", InfectionHUDName) + hook.Add("CalcView", "InfectionCalcView", InfectionCalcView) + chat.AddText(chatcolor, "Infection! Touch other players to infect them\n", math.max(math.floor(player.GetCount() / 4), 1) .. " player(s) will become infected in 10s") + end) + + local music = nil + + net.Receive("Infection_End", function () + local survivors = "" + endtime = net.ReadFloat() + + timer.Simple(0.5, function () + for k, v in ipairs(player.GetAll()) do + if not v:GetNW2Bool("Infected") then + survivors = survivors .. v:Nick() .. ", " + + if v == LocalPlayer() then + LocalPlayer():AddXP(200) + end + end + end + + survivors = survivors:sub(1, -3) + + if survivors == "" then + survivors = "None..." + + LocalPlayer():EmitSound("death.wav") + end + + chat.AddText(chatcolor, "The game has ended!\nSurvivors: " .. survivors .. "\nRestarting in 15s") + end) + + if music and music.Stop then + music:Stop() + end + end) + net.Receive("Infection_LastMan", function () + sound.PlayFile("sound/music/infection_countdown.mp3", "", function (station, errCode, errStr) + if IsValid(station) then + station:SetVolume(0.5) + station:Play() + + music = station + end + end) + end) + + local red = Color(255, 25, 25) + local yellow = Color(255, 255, 100) + + net.Receive("Infection_Announce", function () + local attacker = net.ReadEntity() + local victim = net.ReadEntity() + + if IsValid(attacker) and IsValid(victim) then + if attacker == victim then + chat.AddText(attacker, red, " died!") + else + chat.AddText(attacker, red, " has infected ", victim, "!") + end + + attacker.InfectionTouchDelay = CurTime() + 3 + + if attacker == LocalPlayer() then + LocalPlayer():AddXP(25) + end + end + end) + + local function InfectionHUD() + if not GetGlobalBool(GM_INFECTION) then + return + end + + surface.SetTextColor(color_white) + surface.SetFont("BeatrunHUD") + + local remainingtime = Infection_EndTime - (endtime == 0 and CurTime() or endtime) + + if CurTime() < Infection_StartTime then + remainingtime = Infection_StartTime - CurTime() + end + + remainingtime = math.max(remainingtime, 0) + local timer = string.FormattedTime(remainingtime, "%02i:%02i:%02i") + local tw, th = surface.GetTextSize(timer) + + surface.SetTextPos(ScrW() * 0.5 - tw * 0.5, ScrH() * 0.25) + surface.DrawText(timer) + end + + local tab = { + ["$pp_colour_contrast"] = 1.05, + ["$pp_colour_addg"] = 0.023529411764705882, + ["$pp_colour_addb"] = 0.023529411764705882, + ["$pp_colour_addr"] = 0.12549019607843137, + ["$pp_colour_colour"] = 0.91, + ["$pp_colour_brightness"] = -0.1, + ["$pp_colour_mulg"] = 0, + ["$pp_colour_mulb"] = 0, + ["$pp_colour_mulr"] = 0 + } + + hook.Add("BeatrunSpawn", "InfectionSpawnDelay", function () + LocalPlayer().InfectionTouchDelay = CurTime() + 6 + end) + + local function BeatrunInfectedVision() + if GetGlobalBool(GM_INFECTION) and LocalPlayer():GetNW2Bool("Infected") then + tab["$pp_colour_colour"] = CurTime() > (LocalPlayer().InfectionTouchDelay or 0) and 0.91 or 0.1 + + DrawColorModify(tab) + end + end + + hook.Add("HUDPaint", "InfectionHUD", InfectionHUD) + hook.Add("RenderScreenspaceEffects", "BeatrunInfectedVision", BeatrunInfectedVision) + net.Receive("Infection_XPReward", function () + local humanwin = net.ReadBool() + + if humanwin then + chat.AddText(chatcolor, "You were awarded 200 XP for surviving") + LocalPlayer():AddXP(200) + else + chat.AddText(chatcolor, "You were awarded 100 XP for spawning as an infected") + LocalPlayer():AddXP(100) + end + end) + net.Receive("Infection_Sync", function () + endtime = 0 + Infection_StartTime = net.ReadFloat() + Infection_EndTime = net.ReadFloat() + + hook.Add("BeatrunHUDCourse", "InfectionHUDName", InfectionHUDName) + end) +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Ladder.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Ladder.lua new file mode 100644 index 0000000..16b6f8a --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Ladder.lua @@ -0,0 +1,283 @@ +if SERVER and game.SinglePlayer() then + util.AddNetworkString("Ladder_SPFix") +elseif CLIENT and game.SinglePlayer() then + net.Receive("Ladder_SPFix", function () + local ply = LocalPlayer() + local ang = ply:EyeAngles() + ang.y = ply:GetLadder():GetAngles().y - 180 + ang.x = 0 + ply.OrigEyeAng = ang + + if not ply:OnGround() then + DoImpactBlur(10) + end + end) +end + +local function LadderCheck(ply, mv, cmd, ladder) + local ladderang = ladder:GetAngles() + + if math.abs(math.AngleDifference(cmd:GetViewAngles().y, ladderang.y - 180)) > 30 then + return false + end + + local zlevel = mv:GetOrigin().z + local newpos = ladder:GetPos() + ladderang:Forward() * 19 + newpos.z = zlevel + ladderang.z = 0 + ladderang.x = 0 + ladderang.y = ladderang.y - 180 + local origin = mv:GetOrigin() + + if CLIENT then + BodyAnimSetEase(origin) + elseif game.SinglePlayer() then + ply:SetNW2Vector("SPBAEase", origin) + ply:SendLua("BodyAnimSetEase(LocalPlayer():GetNW2Vector('SPBAEase'))") + end + + if CLIENT_IFTP() then + local ang = ply:EyeAngles() + ang.y = ladder:GetAngles().y - 180 + ang.x = 0 + ply.OrigEyeAng = ang + + if not ply:OnGround() then + DoImpactBlur(10) + end + elseif game.SinglePlayer() then + net.Start("Ladder_SPFix") + net.Send(ply) + end + + ply:SetLadder(ladder) + ply:SetLadderHeight(zlevel - ladder:GetPos().z) + + local event = ply:OnGround() and "ladderenter" or "ladderenterhang" + + ParkourEvent(event, ply) + ply:SetLadderStartPos(mv:GetOrigin()) + ply:SetLadderEndPos(newpos) + mv:SetOrigin(newpos) + ply:SetLadderEntering(true) + ply:SetLadderHand(true) + ply:SetMoveType(MOVETYPE_NOCLIP) + + ply.LadderEnd = false + ply.LadderHardStart = not ply:OnGround() + + if not ply:OnGround() then + ply:ViewPunch(Angle(10, 0, 0)) + ply:SetLadderDelay(CurTime() + 0.75) + ply:SetLadderHand(false) + else + ply:SetLadderDelay(CurTime() + 0.25) + end +end + +local function LadderThink(ply, mv, cmd, ladder) + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + cmd:ClearMovement() + + if ply:GetLadderEntering() then + local lerprate = 2 + + if ply.LadderHardStart then + lerprate = 5 + end + + mv:SetOrigin(ply:GetLadderEndPos()) + + if ply:GetLadderLerp() >= 1 then + ply:SetLadderEntering(false) + + return + end + + ply:SetLadderLerp(math.min(ply:GetLadderLerp() + FrameTime() * lerprate, 1)) + + return + end + + if mv:KeyDown(IN_FORWARD) and ply:GetLadderDelay() < CurTime() and ply:GetLadderHeight() < ladder:GetLadderHeight() then + local pos = mv:GetOrigin() + + ply:SetLadderDelay(CurTime() + 0.35) + ply:SetLadderStartPos(pos) + + pos.z = pos.z + 15.75 + + ply:SetLadderEndPos(pos) + ply:SetLadderLerp(0) + ply:SetLadderHand(not ply:GetLadderHand()) + ply:ViewPunch(Angle(0, 0, ply:GetLadderHand() and -1.5 or 1.5)) + + local event = ply:GetLadderHand() and "ladderclimbleft" or "ladderclimbright" + + ParkourEvent(event, ply) + + ply.LadderDown = false + elseif mv:KeyDown(IN_BACK) and ply:GetLadderDelay() < CurTime() and ply:GetLadderHeight() > 1 then + local pos = mv:GetOrigin() + + ply:SetLadderDelay(CurTime() + 0.15) + ply:SetLadderStartPos(pos) + + pos.z = pos.z - (40 + math.min(ply:GetLadderHeight() - 40, 0)) + + ply:SetLadderEndPos(pos) + ply:SetLadderLerp(0) + ply:SetLadderHand(false) + + if not ply.LadderDown then + ParkourEvent("ladderclimbdownfast", ply) + end + + ply.LadderDown = true + elseif ply.LadderDown and ply:GetLadderDelay() < CurTime() then + ply.LadderDown = false + + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(5, 0, 0)) + BodyAnim:SetSequence("ladderclimbuprighthandstill") + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(5, 0, 0)) + ply:SendLua("BodyAnim:SetSequence('ladderclimbuprighthandstill')") + end + end + + ply:SetLadderHeight(ply:GetPos().z - ladder:GetPos().z) + + if ladder:GetLadderHeight() <= ply:GetLadderHeight() and not ply.LadderEnd then + if not ply.LadderTrace then + ply.LadderTraceOut = {} + ply.LadderTrace = { + mask = MASK_SHOT_HULL, + collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT, + maxs = maxs, + mins = mins, + output = ply.LadderTraceOut + } + end + + local tr = ply.LadderTrace + local trout = ply.LadderTraceOut + ply.LadderTrace.start = mv:GetOrigin() + Vector(0, 0, 100) + ladder:GetAngles():Forward() * -35 + ply.LadderTrace.endpos = ply.LadderTrace.start - Vector(0, 0, 150) + ply.LadderTrace.filter = ply + + util.TraceLine(tr) + + if trout.Hit then + ply:SetLadderDelay(CurTime() + 4) + ply:SetLadderLerp(0) + ply:SetLadderStartPos(mv:GetOrigin()) + ply:SetLadderEndPos(trout.HitPos) + + ply.LadderEnd = true + local event = ply:GetLadderHand() and "ladderexittoplefthand" or "ladderexittoprighthand" + + ParkourEvent(event, ply) + end + end + + if ply:GetLadderLerp() < 1 then + local lerp = ply:GetLadderLerp() + local lerprate = 4 + + if ply.LadderEnd then + lerprate = 1.5 + + if ply:GetLadderDelay() - CurTime() > 3.7 then + lerprate = 0.01 + else + lerprate = math.Clamp(lerprate * lerp * 10, 0.45, 2) + + if lerp < 0.5 then + if CLIENT and IsFirstTimePredicted() then + ply:CLViewPunch(Angle(0.5, 0, 0)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(0.5, 0, 0)) + end + end + end + end + + mv:SetOrigin(LerpVector(ply:GetLadderLerp(), ply:GetLadderStartPos(), ply:GetLadderEndPos())) + ply:SetLadderLerp(math.min(ply:GetLadderLerp() + FrameTime() * lerprate, 1)) + else + mv:SetOrigin(ply:GetLadderEndPos()) + + if ply.LadderEnd then + ply:SetMoveType(MOVETYPE_WALK) + ply:SetLadder(nil) + end + end + + mv:SetVelocity(vector_origin) + mv:SetButtons(0) +end + +local function Ladder(ply, mv, cmd) + if not ply.LadderTrace then + ply.LadderTrace = {} + ply.LadderTraceOut = {} + ply.LadderTrace.mask = MASK_PLAYERSOLID + ply.LadderTrace.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + end + + if not IsValid(ply:GetLadder()) and not ply:Crouching() then + local tr = ply.LadderTrace + tr.output = ply.LadderTraceOut + tr.start = mv:GetOrigin() + Vector(0, 0, 64) + tr.endpos = tr.start + cmd:GetViewAngles():Forward() * 100 + tr.filter = ply + + util.TraceLine(tr) + + local eyetr = ply.LadderTraceOut + local eyetrentity = eyetr.Entity + local fraction = eyetr.Fraction + + if (fraction or 1) <= 0.35 and eyetrentity:GetClass() == "br_ladder" and ply:GetMoveType() == MOVETYPE_WALK then + LadderCheck(ply, mv, cmd, eyetrentity) + end + end + + if IsValid(ply:GetLadder()) then + LadderThink(ply, mv, cmd, ply:GetLadder()) + end +end + +hook.Add("SetupMove", "Ladder", Ladder) + +local ladderang = Angle() +local laddertraceup = Vector(0, 0, 10000) +local laddertracedown = Vector(0, 0, -10000) + +function CreateLadder(pos, angy, mul) + if isvector(pos) and angy then + ladderang[2] = angy + + if not mul then + local ledgedetect = nil + maxheight = util.QuickTrace(pos, laddertraceup).HitPos + + maxheight:Sub(ladderang:Forward() * 10) + + maxheight = util.QuickTrace(maxheight, laddertracedown).HitPos.z + mul = (maxheight - pos.z) / 125 + 0.1 + end + + local ladder = ents.Create("br_ladder") + + pos:Add(ladderang:Forward() * 10) + ladder:SetPos(pos) + ladder:SetAngles(ladderang) + ladder:Spawn() + ladder:LadderHeight(mul) + + return ladder + end +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/MP_Sync.lua b/beatrun/gamemodes/beatrun/gamemode/sh/MP_Sync.lua new file mode 100644 index 0000000..355fc33 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/MP_Sync.lua @@ -0,0 +1,24 @@ +if CLIENT then + hook.Add("InitPostEntity", "JoinSync", function () + net.Start("JoinSync") + net.SendToServer() + end) +end + +if SERVER then + util.AddNetworkString("JoinSync") + net.Receive("JoinSync", function (len, ply) + if not ply.Synced then + net.Start("BuildMode_Sync") + net.WriteFloat(Course_StartPos.x) + net.WriteFloat(Course_StartPos.y) + net.WriteFloat(Course_StartPos.z) + net.WriteFloat(Course_StartAng) + net.WriteString(Course_Name) + net.WriteString(Course_ID) + net.Send(ply) + + ply.Synced = true + end + end) +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Melee.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Melee.lua new file mode 100644 index 0000000..0ca4168 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Melee.lua @@ -0,0 +1,323 @@ +local kickglitch = CreateConVar("Beatrun_KickGlitch", 1, { + FCVAR_REPLICATED, + FCVAR_ARCHIVE +}) +local tr = {} +local tr_result = {} +MELEE_WRRIGHT = 6 +MELEE_WRLEFT = 5 +MELEE_DROPKICK = 4 +MELEE_AIRKICK = 3 +MELEE_SLIDEKICK = 2 +MELEE_PUNCH = 1 +local meleedata = { + { + "meleeslide", + 0.15, + 1, + function (ply, mv, cmd) + ply:CLViewPunch(Angle(2, 0, 0)) + end, + angle_zero, + 20 + }, + { + "meleeslide", + 0.175, + 0.6, + function (ply, mv, cmd) + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(0.05, 0, -1)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(0.1, 0, -1.5)) + end + end, + Angle(-4, 0, 0), + 50, + true + }, + { + "meleeairstill", + 0.1, + 1, + function (ply, mv, cmd) + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(0.5, 0, -0.1)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(1, 0, -0.25)) + end + end, + Angle(-15, 0, -5), + 50 + }, + { + "meleeair", + 0.15, + 1, + function (ply, mv, cmd) + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(0.05, 0, -1)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(0.1, 0, -1.5)) + end + end, + Angle(-5, 0, -2.5), + 50 + } +} +meleedata[5] = { + "meleewrleft", + 0.2, + 0.75, + function (ply, mv, cmd) + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(0.075, 0, 1)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(0.1, 0, 1.5)) + end + + ply:SetWallrunTime(0) + + local vel = mv:GetVelocity() + vel.z = 50 + + mv:SetVelocity(vel) + + if CLIENT_IFTP() or game.SinglePlayer() then + local ang = ply:EyeAngles() + ang.y = ang.y + (CurTime() - ply:GetMeleeDelay()) / 0.15 * 0.25 + + ply:SetEyeAngles(ang) + end + end, + Angle(-5, 0, 2.5), + 80 +} +meleedata[6] = { + "meleewrright", + 0.2, + 0.75, + function (ply, mv, cmd) + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(0.075, 0, -1)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(0.1, 0, -1.5)) + end + + ply:SetWallrunTime(0) + + local vel = mv:GetVelocity() + vel.z = 50 + + mv:SetVelocity(vel) + + if CLIENT_IFTP() or game.SinglePlayer() then + local ang = ply:EyeAngles() + ang.y = ang.y - (CurTime() - ply:GetMeleeDelay()) / 0.15 * 0.25 + + ply:SetEyeAngles(ang) + end + end, + Angle(-5, 0, -2.5), + 80 +} +local doors = { + prop_door_rotating = true, + func_door_rotating = true +} + +local function KeyMelee(ply, mv) + return mv:KeyPressed(IN_ALT2) or mv:KeyPressed(IN_ATTACK) and IsValid(ply:GetActiveWeapon()) and ply:GetActiveWeapon():GetClass() == "runnerhands" +end + +local function MeleeType(ply, mv, cmd) + if IsValid(ply:GetZipline()) or ply:GetGrappling() or IsValid(ply:GetLadder()) then + return 0 + end + + if ply:GetWallrun() ~= 0 then + if ply:GetWallrun() == 1 then + return ply:GetMelee() + end + + ply:SetMelee(ply:GetWallrun() == 3 and MELEE_WRLEFT or MELEE_WRRIGHT) + elseif not ply:OnGround() then + local vel = mv:GetVelocity() + vel.z = 0 + + ply:SetMelee(vel:Length() > 100 and MELEE_DROPKICK or MELEE_AIRKICK) + else + ply:SetMelee(ply:GetSliding() and MELEE_SLIDEKICK or 0) + end + + return ply:GetMelee() +end + +local function MeleeCheck(ply, mv, cmd) + local melee = MeleeType(ply, mv, cmd) + + if melee == 0 then + return + end + + ParkourEvent(meleedata[melee][1], ply) + ply:SetMeleeTime(CurTime() + meleedata[melee][2]) + ply:SetMeleeDelay(CurTime() + meleedata[melee][3]) + + ply.MeleeDir = mv:GetVelocity() + ply.MeleeDir.z = 0 + + ply.MeleeDir:Normalize() + + if ply.MeleeDir:Length() < 1 then + ply.MeleeDir = ply:GetAimVector() + end +end + +local function MeleeThink(ply, mv, cmd) + if ply:GetMeleeTime() <= CurTime() then + if ply:GetMelee() == MELEE_WRLEFT or ply:GetMelee() == MELEE_WRRIGHT then + ply.MeleeDir = ply:GetAimVector() + end + + ply:ViewPunch(meleedata[ply:GetMelee()][5] or angle_zero) + ply:SetMeleeTime(0) + + tr.start = ply:GetShootPos() + tr.endpos = ply:GetShootPos() + ply.MeleeDir * 75 + tr.filter = ply + tr.mins = Vector(-8, -8, ply:OnGround() and -8 or -64) + tr.maxs = Vector(8, 8, 16) + tr.output = tr_result + tr.mask = MASK_SHOT_HULL + + ply:LagCompensation(true) + ply:AnimRestartGesture(GESTURE_SLOT_ATTACK_AND_RELOAD, ACT_HL2MP_GESTURE_RANGE_ATTACK_FIST, true) + util.TraceHull(tr) + ply:LagCompensation(false) + + if ply:GetMelee() >= 5 then + local vel = mv:GetVelocity() + + vel:Add(ply:GetWallrunDir() * 0.5 * vel:Length()) + mv:SetVelocity(vel) + end + + if tr_result.Hit then + if SERVER then + ply:EmitSound(meleedata[ply:GetMelee()][7] and "Melee.Foot" or "Melee.Fist") + end + + if ply:GetMelee() == MELEE_DROPKICK then + ParkourEvent("meleeairhit", ply) + end + + local ent = tr_result.Entity + + if SERVER and IsValid(ent) and (not ent:IsPlayer() or Course_Name == "" and not GetGlobalBool(GM_INFECTION) and GetConVar("sbox_playershurtplayers"):GetBool()) then + local d = DamageInfo() + + d:SetDamage(meleedata[ply:GetMelee()][6]) + d:SetAttacker(ply) + d:SetInflictor(ply) + d:SetDamageType(DMG_CLUB) + d:SetDamagePosition(tr.start) + d:SetDamageForce(ply:EyeAngles():Forward() * 7000) + ent:TakeDamageInfo(d) + + if SERVER and ent:GetClass() == "func_breakable_surf" then + ent:Input("Shatter", nil, nil, Vector(0, 0, 250)) + timer.Simple(0, function () + local BLEH = ents.Create("prop_physics") + + BLEH:SetPos(tr_result.HitPos) + BLEH:SetAngles(Angle(0, 0, 0)) + BLEH:SetModel("models/props_junk/wood_crate001a.mdl") + BLEH:SetNoDraw(true) + BLEH:SetCollisionGroup(COLLISION_GROUP_WORLD) + BLEH:Spawn() + BLEH:Activate() + timer.Simple(0.01, function () + if BLEH and IsValid(BLEH) then + BLEH:Remove() + end + end) + end) + end + + if ent:IsNPC() then + ent:SetActivity(ACT_FLINCH_HEAD) + end + + if doors[ent:GetClass()] then + if ent:GetInternalVariable("m_bLocked") then + return + end + + local speed = ent:GetInternalVariable("speed") + + if not ent.oldspeed then + ent.oldspeed = speed + ent.bashdelay = 0 + end + + ent:SetSaveValue("speed", ent.oldspeed * 4) + ent:Use(ply) + + ent.bashdelay = CurTime() + 1 + + ent:SetCycle(1) + ent:Fire("Lock") + timer.Simple(1, function () + if IsValid(ent) then + ent:SetSaveValue("speed", ent.oldspeed) + ent:Fire("Unlock") + end + end) + ent:EmitSound("Door.Barge") + + return false + end + end + + if game.SinglePlayer() or CLIENT and IsFirstTimePredicted() then + util.ScreenShake(Vector(0, 0, 0), 2.5, 10, 0.25, 0) + end + end + else + meleedata[ply:GetMelee()][4](ply, mv, cmd) + end +end + +hook.Add("SetupMove", "Melee", function (ply, mv, cmd) + if not ply:Alive() then + ply:SetMeleeTime(0) + ply:SetMelee(0) + + return + end + + if ply:GetMeleeDelay() < CurTime() and ply:GetMelee() ~= 0 then + if kickglitch:GetBool() and ply:GetMelee() >= 5 and mv:KeyDown(IN_JUMP) and not ply:OnGround() then + local vel = mv:GetVelocity() + + vel:Mul(1.25) + + vel.z = 300 + + mv:SetVelocity(vel) + ParkourEvent("jumpslow", ply) + end + + ply:SetMeleeTime(0) + ply:SetMelee(0) + end + + if KeyMelee(ply, mv) and ply:GetMeleeDelay() < CurTime() and ply:GetMeleeTime() == 0 and not ply:GetCrouchJump() and not ply:GetJumpTurn() and ply:GetClimbing() == 0 and ply:GetMantle() == 0 then + MeleeCheck(ply, mv, cmd) + end + + if ply:GetMeleeTime() ~= 0 then + MeleeThink(ply, mv, cmd) + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/MenuBinds.lua b/beatrun/gamemodes/beatrun/gamemode/sh/MenuBinds.lua new file mode 100644 index 0000000..2d8a767 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/MenuBinds.lua @@ -0,0 +1,5 @@ +hook.Add("PlayerButtonDown", "PlayerButtonDownWikiExample", function (ply, button) + if (game.SinglePlayer() or CLIENT and IsFirstTimePredicted()) and button == KEY_F4 then + ply:ConCommand("Beatrun_CourseMenu") + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Misc.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Misc.lua new file mode 100644 index 0000000..2a656b0 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Misc.lua @@ -0,0 +1,206 @@ +if SERVER then + local meta = FindMetaTable("Player") + + util.AddNetworkString("SPParkourEvent") + + local spawn = { + "PlayerGiveSWEP", + "PlayerSpawnEffect", + "PlayerSpawnNPC", + "PlayerSpawnObject", + "PlayerSpawnProp", + "PlayerSpawnRagdoll", + "PlayerSpawnSENT", + "PlayerSpawnSWEP", + "PlayerSpawnVehicle" + } + + local function BlockSpawn(ply) + if not ply:IsSuperAdmin() then + return false + end + end + + for k, v in ipairs(spawn) do + hook.Add(v, "BlockSpawn", BlockSpawn) + end + + hook.Add("IsSpawnpointSuitable", "NoSpawnFrag", function (ply) + return true + end) + hook.Add("AllowPlayerPickup", "AllowAdminsPickUp", function (ply, ent) + local sa = ply:IsSuperAdmin() + + if not sa then + return false + end + end) + + function meta:GTAB(minutes) + local ID = self:SteamID64() + + for k, v in pairs(player.GetAll()) do + v:EmitSound("gtab.mp3", 0, 100, 1) + end + + timer.Simple(7.5, function () + if IsValid(self) and self:SteamID64() == ID then + self:Ban(minutes, "GTAB") + + for k, v in pairs(player.GetAll()) do + v:EmitSound("vinethud.mp3", 0, 100, 1) + end + end + end) + end +end + +if CLIENT then + CreateClientConVar("Beatrun_FOV", 90, true, true, "'Woah how are you moving this fast' and other hilarious jokes", 70, 175) + CreateClientConVar("Beatrun_CPSave", 1, true, true, "Respawning during a course will go back to the last hit checkpoint", 0, 1) +end + +hook.Add("PlayerNoClip", "BlockNoClip", function (ply, enabled) + if enabled and Course_Name ~= "" and ply:GetNW2Int("CPNum", 1) ~= -1 then + ply:SetNW2Int("CPNum", -1) + + if CLIENT_IFTP() then + notification.AddLegacy("Noclip Enabled: Respawn to run the course", NOTIFY_ERROR, 2) + elseif SERVER and game.SinglePlayer() then + ply:SendLua("notification.AddLegacy( \"Noclip Enabled: Respawn to run the course\", NOTIFY_ERROR, 2 )") + end + end + + if enabled and (GetGlobalBool(GM_INFECTION) or GetGlobalBool(GM_DATATHEFT)) then + return false + end +end) + +function ParkourEvent(event, ply, ignorepred) + if IsFirstTimePredicted() or ignorepred then + hook.Run("OnParkour", event, ply or CLIENT and LocalPlayer()) + + if game.SinglePlayer() and SERVER then + net.Start("SPParkourEvent") + net.WriteString(event) + net.Broadcast() + end + end +end + +hook.Add("SetupMove", "JumpDetect", function (ply, mv, cmd) + if ply:OnGround() and not ply:GetWasOnGround() and mv:GetVelocity():Length() > 50 and ply:GetMEMoveLimit() < 375 then + local vel = mv:GetVelocity() + vel.z = 0 + + ply:SetMEMoveLimit(math.max(vel:Length(), 150)) + + if ply:GetMESprintDelay() < 0 then + ply:SetMEMoveLimit(350) + ply:SetMESprintDelay(0) + end + + ply.QuakeJumping = false + + if game.SinglePlayer() then + ply:SendLua("LocalPlayer().QuakeJumping = false") + end + end + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) and activewep:GetClass() == "runnerhands" then + ply:SetWasOnGround(ply:OnGround()) + + return + end + + local ismoving = mv:GetVelocity():Length() > 100 and not mv:KeyDown(IN_BACK) and not ply:Crouching() and not mv:KeyDown(IN_DUCK) + local eyeang = cmd:GetViewAngles() + local eyeangx = eyeang.x + eyeang.x = 0 + eyeang.z = 0 + + if not ply:OnGround() and ply:GetWasOnGround() and not ply:GetJumpTurn() then + if ismoving and mv:GetVelocity().z > 50 then + ply:ViewPunch(Angle(-2, 0, 0)) + + if not util.QuickTrace(mv:GetOrigin() + eyeang:Forward() * 200, Vector(0, 0, -100), ply).Hit then + ParkourEvent("jumpfar", ply) + else + ParkourEvent("jump", ply) + end + elseif ply:GetSafetyRollKeyTime() <= CurTime() and ply:GetSafetyRollTime() <= CurTime() then + ParkourEvent("fall", ply) + end + end + + if not ply:GetSliding() and not ply:GetJumpTurn() and not ply:Crouching() then + ply:SetCurrentViewOffset(Vector(0, 0, 64) + eyeang:Forward() * math.Clamp(eyeangx * 0.177, 0, 90)) + end + + ply:SetWasOnGround(ply:OnGround()) +end) +hook.Add("CanProperty", "BlockProperty", function (ply) + if not ply:IsSuperAdmin() then + return false + end +end) +hook.Add("CanDrive", "BlockDrive", function (ply) + if not ply:IsSuperAdmin() then + return false + end +end) + +if CLIENT and game.SinglePlayer() then + net.Receive("SPParkourEvent", function () + local event = net.ReadString() + + hook.Run("OnParkour", event, LocalPlayer()) + end) +end + +if SERVER then + hook.Add("OnEntityCreated", "RemoveMirrors", function (ent) + if IsValid(ent) and ent:GetClass() == "func_reflective_glass" then + SafeRemoveEntityDelayed(ent, 0.1) + end + end) +end + +if CLIENT then + local blur = Material("pp/blurscreen") + + function draw_blur(a, d) + if render.GetDXLevel() < 90 then + return + end + + surface.SetDrawColor(255, 255, 255) + surface.SetMaterial(blur) + + for i = 1, d do + blur:SetFloat("$blur", i / d * a) + blur:Recompute() + render.UpdateScreenEffectTexture() + surface.DrawTexturedRect(0, 0, ScrW(), ScrH()) + end + end + + local draw_blur = draw_blur + local impactblurlerp = 0 + local lastintensity = 0 + + hook.Add("HUDPaint", "DrawImpactBlur", function () + if impactblurlerp > 0 then + impactblurlerp = math.Approach(impactblurlerp, 0, 25 * FrameTime()) + + draw_blur(math.min(impactblurlerp, 10), 4) + end + end) + + function DoImpactBlur(intensity) + impactblurlerp = intensity + lastintensity = intensity + end +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Monkey.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Monkey.lua new file mode 100644 index 0000000..34812bb --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Monkey.lua @@ -0,0 +1,187 @@ +local function SwingbarCheck(ply, mv, cmd) + local mins, maxs = ply:GetCollisionBounds() + mins.z = maxs.z * 0.85 + maxs.z = maxs.z * 1.75 + maxs.x = maxs.x * 1.5 + mins.x = mins.x * 1.5 + maxs.y = maxs.y * 1.5 + mins.y = mins.y * 1.5 + local tr = ply.Monkey_tr + local trout = ply.Monkey_trout + tr.start = mv:GetOrigin() + tr.endpos = tr.start + tr.maxs = maxs + tr.mins = mins + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_WEAPON + + util.TraceHull(tr) + + if IsValid(trout.Entity) and trout.Entity:GetClass() == "br_swingbar" and (ply:GetSwingbarLast() ~= trout.Entity or ply:GetSBDelay() < CurTime()) then + local swingbar = trout.Entity + local dot = cmd:GetViewAngles():Forward():Dot(swingbar:GetAngles():Forward()) + local dir = dot > 0 and true or false + + if math.abs(dot) < 0.7 then + return + end + + if CLIENT then + swingbar:SetPredictable(true) + end + + ply:SetSwingbar(swingbar) + ply:SetWallrunTime(0) + ply:SetWallrunCount(0) + ply:SetSBDir(dir) + ply:SetSBStartLerp(0) + ply:SetSBOffset(30) + ply:SetSBPeak(0) + ply:SetDive(false) + ply:SetCrouchJump(false) + ParkourEvent("swingbar", ply) + mv:SetVelocity(vector_origin) + + if mv:KeyDown(IN_FORWARD) or mv:GetVelocity():Length() > 150 then + ply:SetSBOffsetSpeed(2) + else + ply:SetSBOffsetSpeed(0) + end + + if CLIENT and IsFirstTimePredicted() or game.SinglePlayer() then + ply:EmitSound("Handsteps.ConcreteHard") + end + end +end + +local radius = 30 +local red = Color(255, 0, 0, 200) +local circlepos = Vector() +local axis = Vector(0, 0, 1) +local dummyvec = Vector(1000, 1000, 1000) + +local function SwingbarThink(ply, mv, cmd) + local swingbar = ply:GetSwingbar() + + if not ply:Alive() then + ply:SetMoveType(MOVETYPE_WALK) + ply:SetSwingbar(nil) + ply:SetSBDelay(CurTime() + 1) + + if CLIENT then + swingbar:SetPredictable(false) + end + + return + end + + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + + local pos = swingbar:GetPos() + local dir = ply:GetSBDir() and 1 or -1 + local ang = swingbar:GetAngles() + local startlerp = ply:GetSBStartLerp() + + ang:RotateAroundAxis(axis, 90) + + pos.z = pos.z - 60 + + ply:SetMoveType(MOVETYPE_NONE) + + local angle = ply:GetSBOffset() * math.pi * 2 / 180 + + circlepos:SetUnpacked(0, math.cos(angle) * radius * dir, -math.sin(angle) * radius) + circlepos:Rotate(ang) + + pos = pos + circlepos + local origin = startlerp < 1 and LerpVector(startlerp, mv:GetOrigin(), pos) or pos + + ply:SetSBStartLerp(math.min(startlerp + 10 * FrameTime(), 1)) + mv:SetOrigin(origin) + + local offset = ply:GetSBOffset() + + if ply:GetSBOffset() >= 100 then + ply:SetSBPeak(1) + ply:SetSBOffsetSpeed(-1) + end + + if ply:GetSBOffset() <= 0 then + ply:SetSBPeak(2) + ply:SetSBOffsetSpeed(1) + end + + if ply:GetSBPeak() ~= 0 and ply:GetSBOffset() < 6 and ply:GetSBOffset() > 40 then + ply:SetSBPeak(0) + end + + if mv:KeyDown(IN_FORWARD) and ply:GetSBPeak() ~= 1 then + ply:SetSBOffsetSpeed(math.Approach(math.max(ply:GetSBOffsetSpeed(), 0), 1 + ply:GetSBOffset() / 50, math.abs(ply:GetSBOffset() / 100 - 1) * 5 * FrameTime())) + elseif mv:KeyDown(IN_BACK) and ply:GetSBPeak() ~= 2 then + ply:SetSBOffsetSpeed(math.Approach(math.min(ply:GetSBOffsetSpeed(), 0), -1, math.abs(ply:GetSBOffset() / 100 - 1) * 5 * FrameTime())) + else + local a = (ply:GetSBOffset() - 50) / 50 + + ply:SetSBOffsetSpeed(math.Approach(ply:GetSBOffsetSpeed(), 0, a * 5 * FrameTime())) + end + + if math.abs(ply:GetSBOffsetSpeed()) <= 0.25 and (not mv:KeyDown(IN_FORWARD) and not mv:KeyDown(IN_BACK) or ply:GetSBPeak() ~= 0) then + ply:SetSBOffset(math.Approach(ply:GetSBOffset(), 45, 2)) + else + ply:SetSBOffset(math.Clamp(ply:GetSBOffset() + ply:GetSBOffsetSpeed(), 0, 100)) + end + + offset = ply:GetSBOffset() + + if mv:KeyPressed(IN_JUMP) or mv:KeyDown(IN_JUMP) and offset > 90 then + ParkourEvent("swingjump", ply) + + if mv:KeyPressed(IN_JUMP) and offset > 90 then + ply:SetSBOffsetSpeed(2.4) + end + + local ang = cmd:GetViewAngles() + ang.x = 0 + local vel = ang:Forward() * 125 * ply:GetSBOffsetSpeed() + vel.z = ply:GetSBOffset() * 2 + + ply:SetMoveType(MOVETYPE_WALK) + ply:SetSwingbarLast(ply:GetSwingbar()) + ply:SetSwingbar(nil) + ply:SetWallrunDir(dummyvec) + mv:SetVelocity(vel) + ply:SetSBDelay(CurTime() + 1) + + if CLIENT_IFTP() or game.SinglePlayer() then + ply:EmitSound("Cloth.VaultSwish") + end + + ply:SetMEMoveLimit(350) + ply:SetMESprintDelay(-1) + + if CLIENT then + swingbar:SetPredictable(false) + end + + return + end +end + +local function Swingbar(ply, mv, cmd) + if not ply.Monkey_tr then + ply.Monkey_tr = {} + ply.Monkey_trout = {} + ply.Monkey_tr.output = ply.Monkey_trout + end + + if not ply:OnGround() and not ply:GetJumpTurn() and not IsValid(ply:GetSwingbar()) and ply:GetMoveType() == MOVETYPE_WALK then + SwingbarCheck(ply, mv, cmd) + end + + if IsValid(ply:GetSwingbar()) then + SwingbarThink(ply, mv, cmd) + end +end + +hook.Add("SetupMove", "Swingbar", Swingbar) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/PuristMode.lua b/beatrun/gamemodes/beatrun/gamemode/sh/PuristMode.lua new file mode 100644 index 0000000..fb0f913 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/PuristMode.lua @@ -0,0 +1,23 @@ +if CLIENT then + PuristMode = CreateClientConVar("Beatrun_PuristMode", "1", true, true, "Purist mode is a clientside preference that severely weakens the ability to strafe while in the air, which is how Mirror's Edge games handle this.\n0 = No restrictions\n1 = Reduced move speed in the air") +end + +local PuristModeForce = CreateConVar("Beatrun_PuristModeForce", 0, { + FCVAR_REPLICATED, + FCVAR_ARCHIVE +}, "Force players to adhere to purist rules", 0, 1) + +local function PuristMove(ply, mv, cmd) + if not ply:OnGround() and not ply:GetGrappling() then + local purist = ply:GetInfoNum("Beatrun_PuristMode", 0) + + if (purist > 0 or PuristModeForce:GetBool()) and ply:WaterLevel() == 0 then + mv:SetForwardSpeed(mv:GetForwardSpeed() * 0.001) + mv:SetSideSpeed(mv:GetSideSpeed() * 0.001) + cmd:SetForwardMove(cmd:GetForwardMove() * 0.001) + cmd:SetSideMove(cmd:GetSideMove() * 0.001) + end + end +end + +hook.Add("SetupMove", "PuristMove", PuristMove) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Quickturn.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Quickturn.lua new file mode 100644 index 0000000..d528f7d --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Quickturn.lua @@ -0,0 +1,250 @@ +if CLIENT then + QuickturnGround = CreateClientConVar("Beatrun_QuickturnGround", "0", true, true, "Enables quickturning with secondary attack while on the ground") +end + +function DoJumpTurn(lookbehind) + if not LocalPlayer():Alive() then + return + end + + VMLegs:Remove() + BodyAnim:SetSequence("jumpturnfly") + + BodyAnimCycle = 0 + BodyAnimSpeed = 1 + BodyLimitX = 40 + BodyLimitY = 75 + + if lookbehind then + local vel = LocalPlayer():GetVelocity() + + vel:Normalize() + + vel.z = 0 + local ang = vel:Angle() + + ang:RotateAroundAxis(Vector(0, 0, 1), 180) + BodyAnim:SetAngles(ang) + + LocalPlayer().OrigEyeAng = ang + end +end + +function DoJumpTurnStand() + if not LocalPlayer():Alive() then + return + end + + VMLegs:Remove() + + local activewep = LocalPlayer():GetActiveWeapon() + + if IsValid(activewep) and activewep:GetClass() ~= "runnerhands" then + BodyAnim:SetSequence("jumpturnlandstandgun") + else + BodyAnim:SetSequence("jumpturnlandstand") + ParkourEvent("jumpturnlandstand", LocalPlayer(), game.SinglePlayer()) + end + + BodyAnimCycle = 0 + BodyLimitX = 40 + BodyLimitY = 75 +end + +local standpunch = Angle(-5, 0, 0) + +local function Quickturn(ply, mv, cmd) + local keypressed = mv:KeyPressed(IN_ATTACK2) + + if ply:GetWallrun() ~= 0 then + if mv:KeyDown(IN_BACK) and mv:KeyPressed(IN_JUMP) or ply:GetQuickturn() then + keypressed = true + + if ply:GetWallrun() == 4 and not ply:GetQuickturn() then + keypressed = false + end + end + + if mv:KeyPressed(IN_JUMP) and (mv:KeyDown(IN_MOVELEFT) or mv:KeyDown(IN_MOVERIGHT)) then + keypressed = true + ply.vwrturn = mv:KeyDown(IN_MOVERIGHT) and 1 or -1 + local eyeang = cmd:GetViewAngles() + eyeang.x = 0 + ply.vwrdot = -ply:GetWallrunDir():Dot(eyeang:Forward()) + + ply:SetWallrunTime(CurTime()) + ply:SetQuickturn(true) + ply:SetQuickturnTime(CurTime()) + ply:SetQuickturnAng(cmd:GetViewAngles()) + end + end + + if not ply:GetQuickturn() and not ply:GetJumpTurn() and not ply:GetCrouchJump() and not ply:GetGrappling() and keypressed and not mv:KeyDown(IN_MOVELEFT) and not mv:KeyDown(IN_MOVERIGHT) and (ply:GetWallrun() > 0 or not ply:OnGround() or ply:GetInfoNum("Beatrun_QuickturnGround", 0) == 1 and not ply:Crouching()) then + if ply:GetWallrun() == 0 and not ply:OnGround() then + local eyedir = cmd:GetViewAngles() + eyedir.x = 0 + eyedir = eyedir:Forward() + local vel = mv:GetVelocity() + vel.z = 0 + local lookahead = vel:GetNormalized():Dot(eyedir) >= 0.85 + local lookbehind = vel:GetNormalized():Dot(eyedir) < -0.5 + + if not lookahead and not lookbehind and ply:WaterLevel() < 3 and not IsValid(ply:GetSwingbar()) and not IsValid(ply:GetZipline()) then + return + elseif (lookahead or lookbehind) and ply:WaterLevel() < 3 and not IsValid(ply:GetSwingbar()) and not IsValid(ply:GetZipline()) then + if CLIENT_IFTP() then + DoJumpTurn(lookbehind) + elseif SERVER and game.SinglePlayer() then + ply:SendLua("DoJumpTurn(" .. tostring(lookbehind) .. ")") + end + + ply:SetJumpTurn(true) + + if lookbehind then + return + end + + ply:ViewPunch(Angle(2.5, 0, 5)) + end + + if IsValid(ply:GetSwingbar()) then + ply:SetSBDir(not ply:GetSBDir()) + ply:SetSBOffset(math.abs(ply:GetSBOffset() - 100)) + ply:SetSBPeak(0) + end + end + + local usingrh = false + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) then + usingrh = activewep:GetClass() == "runnerhands" + end + + if not usingrh and ply:GetWallrun() >= 2 then + return + end + + ply:SetQuickturn(true) + ply:SetQuickturnTime(CurTime()) + ply:SetQuickturnAng(cmd:GetViewAngles()) + + if ply:GetWallrun() == 1 then + ply:SetWallrun(4) + ply:SetWallrunTime(CurTime() + 0.75) + + if CLIENT and IsFirstTimePredicted() then + BodyLimitX = 90 + BodyLimitY = 180 + BodyAnimCycle = 0 + BodyAnimSpeed = 2 + + BodyAnim:SetSequence("wallrunverticalturn") + elseif game.SinglePlayer() then + ply:SendLua("BodyLimitX=90 BodyLimitY=180 BodyAnimCycle=0 BodyAnim:SetSequence(\"wallrunverticalturn\")") + end + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) then + usingrh = activewep:GetClass() == "runnerhands" + end + + if usingrh then + activewep:SendWeaponAnim(ACT_VM_PRIMARYATTACK) + activewep:SetBlockAnims(true) + end + end + end + + if ply:GetJumpTurn() then + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + mv:SetUpSpeed(0) + + if not ply:OnGround() then + mv:SetButtons(bit.bor(mv:GetButtons(), IN_FORWARD)) + end + + if ply:OnGround() or ply:GetMoveType() == MOVETYPE_NOCLIP then + ply:SetViewOffsetDucked(Vector(0, 0, 17)) + ply:SetViewOffset(Vector(0, 0, 64)) + else + ply:SetViewOffset(Vector(0, 0, 17)) + end + + if (ply:OnGround() or ply:WaterLevel() >= 3) and (mv:KeyPressed(IN_JUMP) or mv:KeyPressed(IN_FORWARD)) or ply:GetMoveType() == MOVETYPE_NOCLIP or not ply:Alive() then + ply:SetJumpTurn(false) + ply:SetJumpTurnRecovery(CurTime() + 1) + ply:SetViewOffsetDucked(Vector(0, 0, 32)) + + if CLIENT then + DoJumpTurnStand() + elseif game.SinglePlayer() then + ply:SendLua("DoJumpTurnStand()") + end + end + + if ply:OnGround() then + mv:SetButtons(bit.bor(mv:GetButtons(), IN_DUCK)) + end + end + + if CurTime() < ply:GetJumpTurnRecovery() then + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + mv:SetUpSpeed(0) + mv:SetButtons(0) + cmd:ClearMovement() + + if not ply:OnGround() and ply:GetMoveType() ~= MOVETYPE_NOCLIP and ply:WaterLevel() < 3 then + ply:SetJumpTurn(true) + end + + standpunch.x = -math.abs(math.min(CurTime() - ply:GetJumpTurnRecovery() + 0.5, 0)) + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) and activewep:GetClass() ~= "runnerhands" then + standpunch.x = standpunch.x * 0.1 + standpunch.z = standpunch.x * 10 + else + standpunch.x = standpunch.x * 15 + standpunch.z = 0 + end + + if CLIENT_IFTP() then + ply:CLViewPunch(standpunch) + elseif game.SinglePlayer() then + ply:ViewPunch(standpunch) + end + end + + if ply:GetQuickturn() then + local wr = ply:GetWallrun() + local target = ply:GetQuickturnAng() + local dir = wr == 2 and 1 or -1 + + if ply.vwrturn ~= 0 then + target.y = target.y - 90 * ply.vwrturn * ply.vwrdot + else + target.y = target.y + ((wr == 2 or wr == 3) and 115 * dir or 180) + end + + local diff = CurTime() - ply:GetQuickturnTime() + local lerptime = diff * 6.5 + local lerp = Lerp(math.min(lerptime, 1), ply:GetQuickturnAng().y, target.y) + target.y = lerp + + if CLIENT_IFTP() or game.SinglePlayer() then + ply:SetEyeAngles(target) + end + + if lerptime >= 1 then + ply:SetQuickturn(false) + end + else + ply.vwrturn = 0 + end +end + +hook.Add("SetupMove", "Quickturn", Quickturn) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Replay.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Replay.lua new file mode 100644 index 0000000..1574e02 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Replay.lua @@ -0,0 +1,263 @@ +if SERVER then + util.AddNetworkString("ReplaySendToClient") +end + +function ReplayCmd(ply, cmd) + if not ply.ReplayRecording then + return + end + + if cmd:TickCount() == 0 then + return + end + + if not ply.ReplayFirstTick and cmd:TickCount() ~= 0 then + ply.ReplayFirstTick = cmd:TickCount() + end + + local ang = cmd:GetViewAngles() + + if ply.ReplayLastAng == ang then + ang = 0 + else + ply.ReplayLastAng = ang + end + + local curtick = cmd:TickCount() - ply.ReplayFirstTick + 1 + + if ang == 0 then + ply.ReplayTicks[curtick] = { + cmd:GetButtons(), + cmd:GetForwardMove(), + cmd:GetSideMove() + } + else + ply.ReplayTicks[curtick] = { + cmd:GetButtons(), + ang.x, + ang.y, + cmd:GetForwardMove(), + cmd:GetSideMove() + } + end + + if curtick > 23760 then + print("Replay recording stopped - too long") + + ply.ReplayRecording = false + end +end + +hook.Add("StartCommand", "ReplayStart", ReplayCmd) + +function ReplayStart(ply) + if not game.SinglePlayer() then + return + end + + if ply.InReplay then + return + end + + print("Starting Replay") + + ply.ReplayRecording = true + ply.ReplayTicks = {} + ply.ReplayFirstTick = false + ply.ReplayStartPos = ply:GetPos() + ply.ReplayLastAng = nil +end + +function ReplayStop(ply, debugdump) + if not game.SinglePlayer() then + return + end + + if not ply.ReplayTicks then + return + end + + if ply.InReplay then + return + end + + print("Ending Replay (" .. #ply.ReplayTicks .. "ticks)") + + ply.InReplay = false + ply.ReplayRecording = false + local debugdata = { + ply.ReplayStartPos, + ply.ReplayTicks + } + local replay = util.Compress(util.TableToJSON(debugdata)) + local dir = "beatrun/replays/" .. game.GetMap() .. "/" + + file.CreateDir(dir) + file.Write(dir .. "replaydump.txt", replay) +end + +local RFF = true + +function ReplayPlayback(ply, cmd) + if not ply.InReplay or not ply.ReplayTicks then + return + end + + local cmdtc = cmd:TickCount() + + if cmdtc == 0 then + return + end + + if not ply.ReplayFirstTick then + ply.ReplayFirstTick = cmdtc + + if SERVER then + ply:SetNWInt("ReplayFirstTick", cmdtc) + end + end + + local firsttick = ply:GetNWInt("ReplayFirstTick") + + if ply.ReplayTicks[cmdtc - firsttick + 1] then + tickcount = cmdtc - firsttick + 1 + + if ply.ReplayEndAtTick and ply.ReplayEndAtTick <= tickcount then + ply.ReplayTicks = {} + + return + end + + local tickdata = ply.ReplayTicks[tickcount] + local shortdata = #tickdata == 3 + local ang = shortdata and 0 or Angle(tickdata[2], tickdata[3], cmd:GetViewAngles().z) + + if not shortdata then + ply.ReplayLastAng = ang + end + + cmd:SetButtons(tickdata[1]) + cmd:SetViewAngles(ply.ReplayLastAng) + + if shortdata then + cmd:SetForwardMove(tickdata[2]) + cmd:SetSideMove(tickdata[3]) + else + cmd:SetForwardMove(tickdata[4]) + cmd:SetSideMove(tickdata[5]) + end + + cmd:RemoveKey(IN_RELOAD) + elseif SERVER and cmdtc - firsttick + 1 > 0 or CLIENT and not ply:GetNWBool("InReplay") and RFF < CurTime() then + print("Replay cancelled: nil tick at " .. cmdtc - firsttick + 1, firsttick) + + if SERVER then + ply:SetNWBool("InReplay", false) + end + + hook.Remove("StartCommand", "ReplayPlay") + hook.Remove("RenderScreenspaceEffects", "BeatrunReplayVision") + hook.Remove("HUDPaint", "BeatrunReplayHUD") + + ply.InReplay = false + ply.ReplayFirstTick = false + + if TUTORIALMODE then + net.Start("ReplayTutorialPos") + net.WriteVector(ply.ReplayStartPos) + net.SendToServer() + TutorialClearEvents() + end + end +end + +function ReplaySendToClient(ply) + if not game.SinglePlayer() then + return + end + + local replaydata = util.JSONToTable(util.Decompress(file.Read("beatrun/replays/" .. game.GetMap() .. "/replaydump.txt", "DATA"))) + ply.ReplayFirstTick = false + ply.ReplayStartPos = replaydata[1] + ply.ReplayTicks = replaydata[2] + + ply:SetNWBool("InReplay", true) + net.Start("ReplaySendToClient") + net.Send(ply) + + ply.InReplay = true + + ply:SetPos(ply.ReplayStartPos) + ply:SetVelocity(vector_origin) + hook.Add("StartCommand", "ReplayPlay", ReplayPlayback) +end + +if CLIENT then + local tab = { + ["$pp_colour_contrast"] = 0.9, + ["$pp_colour_addg"] = 0.5799, + ["$pp_colour_addb"] = 1.12, + ["$pp_colour_addr"] = 0, + ["$pp_colour_colour"] = 0.14, + ["$pp_colour_brightness"] = -0.57, + ["$pp_colour_mulg"] = 0, + ["$pp_colour_mulb"] = 0, + ["$pp_colour_mulr"] = 0 + } + + local function BeatrunReplayVision() + if LocalPlayer().ReplayFirstTick then + DrawColorModify(tab) + end + end + + local rcol = Color(200, 200, 200) + + local function BeatrunReplayHUD() + if LocalPlayer().ReplayTicks and not LocalPlayer().ReplayTicks.reliable then + surface.SetFont("BeatrunHUD") + surface.SetTextColor(rcol) + surface.SetTextPos(5, ScrH() * 0.975) + + local text = TUTORIALMODE and "" or "*Clientside replay: may not be accurate " + + surface.DrawText(text .. tickcount .. "/" .. #LocalPlayer().ReplayTicks) + end + end + + function ReplayBegin() + LocalPlayer().InReplay = true + RFF = CurTime() + 1 + + hook.Add("StartCommand", "ReplayPlay", ReplayPlayback) + hook.Add("RenderScreenspaceEffects", "BeatrunReplayVision", BeatrunReplayVision) + hook.Add("HUDPaint", "BeatrunReplayHUD", BeatrunReplayHUD) + surface.PlaySound("friends/friend_join.wav") + end + + net.Receive("ReplayRequest", ReplayBegin) + net.Receive("ReplaySendToClient", function (length) + if length < 100 then + LocalPlayer().ReplayTicks = util.JSONToTable(util.Decompress(file.Read("beatrun/replays/" .. game.GetMap() .. "/replaydump.txt", "DATA")))[2] + else + LocalPlayer().ReplayTicks = util.JSONToTable(util.Decompress(net.ReadData(length))) + end + + LocalPlayer().ReplayFirstTick = false + + ReplayBegin() + end) +end + +function ReplayCancel(ply) + hook.Remove("StartCommand", "ReplayPlay") + hook.Remove("RenderScreenspaceEffects", "BeatrunReplayVision") + hook.Remove("HUDPaint", "BeatrunReplayHUD") + + ply.InReplay = false + ply.ReplayFirstTick = false + + net.Start("ReplayRequest") + net.WriteBool(true) + net.SendToServer() +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Rope.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Rope.lua new file mode 100644 index 0000000..94279a5 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Rope.lua @@ -0,0 +1,37 @@ +local yaw = 0 +local pitch = 0 + +hook.Add("CreateMove", "Rope", function (cmd) + local ply = LocalPlayer() + local vtl = viewtiltlerp + + if not ply:GetGrappling() or not IsValid(BodyAnim) or not IsValid(BodyAnimArmCopy) then + pitch = 0 + yaw = 0 + vtl.z = vtl.z ~= 0 and math.Approach(viewtiltlerp.z, 0, FrameTime() * (10 + math.abs(vtl.z) * 5)) or vtl.z + + return + end + + local ang = LocalPlayer():EyeAngles() + ang.x = 0 + local grapplepos = LocalPlayer():GetGrapplePos() + local vel = LocalPlayer():GetVelocity() + vel.z = 0 + velf = vel:Dot(ang:Forward()) * 80 + velr = vel:Dot(ang:Right()) * 80 + grapplepos.z = 0 + local mul = (grapplepos - LocalPlayer():EyePos()):Dot(ang:Forward()) > 0 and 1 or -1 + grapplepos = vel * mul + local y = math.Clamp(-grapplepos:Dot(ang:Forward()), -90, 90) + local p = math.Clamp(-grapplepos:Dot(ang:Right()), -90, 90) + pitch = Lerp(FrameTime() * 1.5, pitch, p) + yaw = Lerp(FrameTime() * 1.5, yaw, y) + + BodyAnim:SetPoseParameter("rope_yaw", yaw) + BodyAnimArmCopy:SetPoseParameter("rope_yaw", yaw) + BodyAnim:SetPoseParameter("rope_pitch", pitch) + BodyAnimArmCopy:SetPoseParameter("rope_pitch", pitch) + + viewtiltlerp.z = -pitch * 0.1 +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/SafetyRoll.lua b/beatrun/gamemodes/beatrun/gamemode/sh/SafetyRoll.lua new file mode 100644 index 0000000..1753c83 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/SafetyRoll.lua @@ -0,0 +1,191 @@ +if game.SinglePlayer() and SERVER then + util.AddNetworkString("RollAnimSP") +end + +local landang = Angle(0, 0, 0) + +local function SafetyRollThink(ply, mv, cmd) + local speed = mv:GetVelocity().z + + if speed <= -350 and not ply:OnGround() and not ply:GetWasOnGround() and (mv:KeyPressed(IN_SPEED) or mv:KeyPressed(IN_DUCK) or mv:KeyPressed(IN_BULLRUSH)) then + ply:SetSafetyRollKeyTime(CurTime() + 0.5) + mv:SetButtons(bit.band(mv:GetButtons(), bit.bnot(IN_DUCK))) + end + + if CurTime() < ply:GetSafetyRollTime() then + ply.FootstepLand = false + local ang = ply:GetSafetyRollAng() + + mv:SetSideSpeed(0) + mv:SetForwardSpeed(0) + + if ang ~= landang then + local vel = mv:GetVelocity() + vel.x = 0 + vel.y = 0 + + mv:SetVelocity(ply:GetSafetyRollAng():Forward() * 200 + vel) + ply:SetMEMoveLimit(400) + else + mv:SetVelocity(vector_origin) + end + end +end + +hook.Add("SetupMove", "SafetyRoll", SafetyRollThink) + +local roll = { + followplayer = true, + animmodelstring = "mirroranim", + showweapon = true, + lockang = true, + BodyAnimSpeed = 1.15, + ignorez = true, + deleteonend = true, + AnimString = "rollanim" +} + +net.Receive("RollAnimSP", function () + if net.ReadBool() then + roll.AnimString = "land" + roll.animmodelstring = "mirroranim" + roll.BodyAnimSpeed = 1 + elseif net.ReadBool() then + roll.AnimString = "evaderoll" + roll.animmodelstring = "climbanim" + roll.BodyAnimSpeed = 1.5 + else + roll.AnimString = "meroll" + roll.animmodelstring = "climbanim" + roll.BodyAnimSpeed = 1.15 + end + + CacheBodyAnim() + RemoveBodyAnim() + StartBodyAnim(roll) +end) +hook.Add("SetupMove", "EvadeRoll", function (ply, mv, cmd) + if ply:GetJumpTurn() and ply:OnGround() and mv:KeyPressed(IN_BACK) then + local ang = cmd:GetViewAngles() + + ply:SetViewOffset(Vector(0, 0, 64)) + + ang.x = 0 + ang.z = 0 + + ang:RotateAroundAxis(Vector(0, 0, 1), 180) + ply:SetJumpTurn(false) + ply:SetSafetyRollAng(ang) + ply:SetSafetyRollTime(CurTime() + 0.9) + + roll.AnimString = "evaderoll" + roll.animmodelstring = "climbanim" + roll.usefullbody = false + + if SERVER and not land then + ply:EmitSound("Cloth.Roll") + ply:EmitSound("Cloth.RollLand") + elseif CLIENT_IFTP() then + ply:EmitSound("Handsteps.ConcreteHard") + ply:EmitSound("Land.Concrete") + end + + if CLIENT_IFTP() then + CacheBodyAnim() + RemoveBodyAnim() + StartBodyAnim(roll) + elseif game.SinglePlayer() then + net.Start("RollAnimSP") + net.WriteBool(false) + net.WriteBool(true) + net.Send(ply) + end + end +end) +hook.Add("OnPlayerHitGround", "SafetyRoll", function (ply, water, floater, speed) + local tr = { + filter = ply, + start = ply:GetPos() + } + tr.endpos = tr.start - Vector(0, 0, 150) + local out = util.TraceLine(tr) + local normal = out.HitNormal + local sang = normal:Angle() + + if sang.x <= 314 and not ply:InOverdrive() and (speed >= 350 or ply:GetDive()) and speed < 800 and (CurTime() < ply:GetSafetyRollKeyTime() and not ply:GetDive() or ply:GetDive() and not ply:KeyDown(IN_DUCK)) and not ply:GetJumpTurn() and (not ply:Crouching() or ply:GetDive()) then + ply:SetCrouchJump(false) + ply:SetDive(false) + ParkourEvent("roll", ply) + + local ang = ply:EyeAngles() + local land = ply:GetVelocity() + ang.x = 0 + ang.z = 0 + land.z = 0 + + if land:Length() < 200 or ply:KeyDown(IN_BACK) then + land = true + + ply:SetSafetyRollAng(landang) + ply:SetSafetyRollTime(CurTime() + 0.6) + + roll.AnimString = "land" + roll.animmodelstring = "mirroranim" + roll.usefullbody = true + else + land = false + + ply:SetSafetyRollAng(ang) + ply:SetSafetyRollTime(CurTime() + 1.05) + + roll.AnimString = "meroll" + roll.animmodelstring = "climbanim" + roll.usefullbody = false + end + + if SERVER and not land then + ply:EmitSound("Cloth.Roll") + ply:EmitSound("Cloth.RollLand") + elseif CLIENT_IFTP() then + ply:EmitSound("Handsteps.ConcreteHard") + ply:EmitSound("Land.Concrete") + end + + if CLIENT_IFTP() then + CacheBodyAnim() + RemoveBodyAnim() + StartBodyAnim(roll) + elseif game.SinglePlayer() then + net.Start("RollAnimSP") + net.WriteBool(land) + net.WriteBool(false) + net.Send(ply) + end + end +end) + +if SERVER then + local safelandents = { + br_mat = true + } + + hook.Add("GetFallDamage", "SafetyRoll", function (ply, speed) + local groundent = ply:GetGroundEntity() + + if IsValid(groundent) and safelandents[groundent:GetClass()] then + groundent:EmitSound("mirrorsedge/GameplayObjects/Landing_01.ogg", 80, 100 + math.random(-30, 10)) + + return 0 + end + + if speed >= 800 and not ply:InOverdrive() then + if speed < 800 and CurTime() < ply:GetSafetyRollKeyTime() and not ply:GetCrouchJump() and not ply:Crouching() then + return 0 + else + return 1000 + end + end + + return 0 + end) +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Sliding.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Sliding.lua new file mode 100644 index 0000000..6a297a4 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Sliding.lua @@ -0,0 +1,706 @@ +local qslide_duration = 3 +local qslide_speedmult = 1 +local slide_sounds = { + [MAT_DIRT] = { + "datae/fol_slide_dirt_01.wav", + "datae/fol_slide_dirt_02.wav", + "datae/fol_slide_dirt_03.wav", + "datae/fol_slide_dirt_04.wav" + }, + [MAT_SAND] = { + "datae/fol_slide_sand_01.wav", + "datae/fol_slide_sand_02.wav", + "datae/fol_slide_sand_03.wav", + "datae/fol_slide_sand_04.wav" + }, + [MAT_METAL] = { + "datae/fol_slide_metal_01.wav", + "datae/fol_slide_metal_02.wav", + "datae/fol_slide_metal_03.wav" + }, + [MAT_GLASS] = { + "datae/fol_slide_glass_01.wav", + "datae/fol_slide_glass_02.wav", + "datae/fol_slide_glass_03.wav", + "datae/fol_slide_glass_04.wav" + }, + [MAT_GRATE] = { + "datae/fol_slide_grate_01.wav" + }, + [MAT_SLOSH] = { + "ambient/water/water_splash1.wav", + "ambient/water/water_splash2.wav", + "ambient/water/water_splash3.wav" + }, + [MAT_WOOD] = { + "datae/fol_slide_generic_01.wav", + "datae/fol_slide_generic_02.wav", + "datae/fol_slide_generic_03.wav" + } +} +local slideloop_sounds = { + [0] = "MirrorsEdge/Slide/ME_FootStep_ConcreteSlideLoop.wav", + [MAT_GLASS] = "MirrorsEdge/Slide/ME_FootStep_GlassSlideLoop.wav" +} +slide_sounds[MAT_GRASS] = slide_sounds[MAT_DIRT] +slide_sounds[MAT_SNOW] = slide_sounds[MAT_DIRT] +slide_sounds[MAT_VENT] = slide_sounds[MAT_METAL] +slide_sounds[0] = slide_sounds[MAT_DIRT] +local animtable = { + lockang = false, + allowmove = true, + followplayer = true, + ignorez = true, + BodyAnimSpeed = 1.1, + deleteonend = false, + BodyLimitX = 50, + AnimString = "meslidestart", + animmodelstring = "climbanim", + camjoint = "camerajoint", + usefullbody = 2 +} +local blocked = false + +local function SlidingAnimThink() + local ba = BodyAnim + local ply = LocalPlayer() + + if not ply:GetSliding() then + hook.Remove("Think", "SlidingAnimThink") + end + + if IsValid(ba) and ba:GetSequence() == 5 and BodyAnimCycle >= 0.55 then + ba:SetSequence(6) + end + + if IsValid(ba) and ba:GetSequence() == ba:LookupSequence("meslidestart45") and BodyAnimCycle >= 0.55 then + ba:SetSequence("meslideloop45") + end + + if IsValid(ba) then + ply.OrigEyeAng:Set(ply:GetSlidingAngle()) + + ply.OrigEyeAng.x = 0 + local tr = util.QuickTrace(ply:GetPos(), Vector(0, 0, -64), ply) + local normal = tr.HitNormal + local oldang = ba:GetAngles() + local ang = ba:GetAngles() + local slidey = ply:GetSlidingAngle().y + oldang[2] = slidey + ang[2] = slidey + ang.x = math.max(normal:Angle().x + 90, 360) + local newang = LerpAngle(20 * FrameTime(), oldang, ang) + + ba:SetAngles(newang) + + BodyLimitX = math.min(40 + ang[1] - 360, 60) + CamShakeMult = ply:GetVelocity():Length() * 0.0005 + end +end + +local function SlidingAnimStart() + if not IsFirstTimePredicted() and not game.SinglePlayer() then + return + end + + local ply = LocalPlayer() + + if not ply:Alive() then + return + end + + deleteonend = false + BodyLimitY = 80 + BodyLimitX = 40 + + VMLegs:Remove() + + if game.SinglePlayer() and not net.ReadBool() or not game.SinglePlayer() and not ply.DiveSliding then + CamIgnoreAng = false + camjoint = ply:GetSlidingSlippery() and "eyes" or "CameraJoint" + + if BodyAnimString == "meslideend" then + BodyAnimCycle = 0.075 + else + BodyAnimCycle = 0 + end + + BodyAnim:SetSequence(ply:GetSlidingSlippery() and "meslidestart45" or 5) + else + ParkourEvent("diveslidestart", ply, true) + end + + BodyAnim:SetAngles(ply:GetSlidingAngle()) + + ply.OrigEyeAng = ply:GetSlidingAngle() + + if ply:Crouching() or CurTime() < ply:GetCrouchJumpTime() then + BodyAnimCycle = 0.1 + + BodyAnim:SetCycle(0.1) + end + + CamShake = ply:GetSlidingSlippery() + + hook.Add("Think", "SlidingAnimThink", SlidingAnimThink) +end + +local function SlidingAnimEnd(slippery, diving) + if not IsValid(BodyAnim) then + return + end + + local ply = LocalPlayer() + + if ply:GetJumpTurn() then + camjoint = "eyes" + CamIgnoreAng = true + + return + end + + if not slippery then + if not ply.DiveSliding and not diving then + BodyAnimString = "meslideend" + + BodyAnim:ResetSequence("meslideend") + else + ply.DiveSliding = false + + ParkourEvent("diveslideend", ply, true) + end + + BodyAnimCycle = 0 + + BodyAnim:SetCycle(0) + + BodyAnimSpeed = 1.3 + + timer.Simple(0.2, function () + if ply:Alive() and BodyAnimString == "meslideend" and BodyAnimArmCopy and not ply:GetSliding() and not ply:OnGround() then + BodyAnimCycle = 0 + camjoint = "eyes" + + BodyAnim:ResetSequence("jumpair") + end + end) + else + BodyAnimCycle = 0 + camjoint = "eyes" + end + + timer.Simple(0.5, function () + if ply:Alive() and BodyAnimArmCopy and not ply:GetSliding() then + camjoint = "eyes" + BodyLimitY = 180 + BodyLimitX = 90 + CamIgnoreAng = true + end + end) + + if blocked then + timer.Simple(0.35, function () + if IsValid(BodyAnim) then + BodyAnim:SetSequence("crouchstill") + end + end) + end + + CamShake = false + + hook.Remove("Think", "SlidingAnimThink") +end + +if game.SinglePlayer() then + if SERVER then + util.AddNetworkString("sliding_spfix") + util.AddNetworkString("sliding_spend") + else + net.Receive("sliding_spfix", function () + SlidingAnimStart() + end) + net.Receive("sliding_spend", function () + blocked = net.ReadBool() + local slippery = net.ReadBool() + local diving = net.ReadBool() + + SlidingAnimEnd(slippery, diving) + end) + end +end + +local slidepunch = Angle(2.5, 0, -0.5) +local slidepunchend = Angle(3, 0, -3.5) +local trace_down = Vector(0, 0, 32) +local trace_up = Vector(0, 0, 32) +local trace_tbl = {} + +local function SlideSurfaceSound(ply, pos) + trace_tbl.start = pos + trace_tbl.endpos = pos - trace_down + trace_tbl.filter = ply + local tr = util.TraceLine(trace_tbl) + local sndtable = slide_sounds[tr.MatType] or slide_sounds[0] + + ply:EmitSound(sndtable[math.random(#sndtable)], 75, 100 + math.random(-20, -15), 0.5) + + if ply:WaterLevel() > 0 then + sndtable = slide_sounds[MAT_SLOSH] + + ply:EmitSound(sndtable[math.random(#sndtable)]) + end + + return tr.MatType +end + +local function SlideLoopSound(ply, pos, mat) + local sndtable = slideloop_sounds[mat] or slideloop_sounds[0] + ply.SlideLoopSound = CreateSound(ply, sndtable) + + ply.SlideLoopSound:PlayEx(0.05, 100) +end + +local COORD_FRACTIONAL_BITS = 5 +local COORD_DENOMINATOR = bit.lshift(1, COORD_FRACTIONAL_BITS) +local COORD_RESOLUTION = 1 / COORD_FRACTIONAL_BITS +local metaent = FindMetaTable("Entity") +metaent.oldOnGround = metaent.oldOnGround or metaent.OnGround + +function metaent:OnGround() + return self:IsPlayer() and self:GetSlidingSlippery() or self:oldOnGround() +end + +hook.Add("SetupMove", "qslide", function (ply, mv, cmd) + if not ply:Alive() then + return + end + + if not ply.OldDuckSpeed then + ply.OldDuckSpeed = ply:GetDuckSpeed() + ply.OldUnDuckSpeed = ply:GetUnDuckSpeed() + end + + local sliding = ply:GetSliding() + local speed = mv:GetVelocity() + speed.z = 0 + speed = speed:Length() + local runspeed = ply:GetRunSpeed() + local slidetime = math.max(0.1, qslide_duration) + local ducking = mv:KeyDown(IN_DUCK) + local crouching = ply:Crouching() + local sprinting = mv:KeyDown(IN_SPEED) + local onground = ply:OnGround() + local CT = CurTime() + + if not ply.SlideSlipperyTrace then + local mins, maxs = ply:GetHull() + ply.SlideSlipperyTraceOut = {} + ply.SlideSlipperyTrace = { + mask = MASK_SHOT_HULL, + collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT, + maxs = maxs, + mins = mins, + output = ply.SlideSlipperyTraceOut + } + end + + local slipperytrace = ply.SlideSlipperyTrace + local slipperytraceout = ply.SlideSlipperyTraceOut + local slipfail = true + + if ply:GetMoveType() == MOVETYPE_WALK then + slipperytrace.start = mv:GetOrigin() + slipperytrace.endpos = slipperytrace.start + + util.TraceHull(slipperytrace) + + local safestart = slipperytraceout.HitPos + slipperytrace.start = safestart + slipperytrace.endpos = Vector(safestart) + slipperytrace.endpos.z = safestart.z - ply:GetStepSize() * 0.5 + + util.TraceHull(slipperytrace) + + if slipperytraceout.Fraction > 0 and slipperytraceout.Fraction < 1 and not slipperytraceout.StartSolid then + local slipnormal = slipperytraceout.HitNormal + local hitpos = slipperytraceout.HitPos + local delta = math.abs(mv:GetOrigin().z - hitpos.z) + local ent = slipperytraceout.Entity + slipperytrace.start = safestart + slipperytrace.endpos = safestart - Vector(0, 0, 120) + + util.TraceLine(slipperytrace) + + if slipperytraceout.Hit and slipperytraceout.HitNormal:DistToSqr(slipnormal) < 0.3 then + local normal = slipnormal + local sang = normal:Angle() + + if sang.x > 315 and sang.x < 330 then + mv:SetOrigin(hitpos) + ply:SetGroundEntity(ent) + ply:SetCrouchJumpBlocked(false) + + onground = true + slipfail = false + + ply:SetCrouchJump(false) + + if SERVER and mv:GetVelocity().z <= -1250 then + local dmg = DamageInfo() + + dmg:SetDamageType(DMG_FALL) + dmg:SetDamage(1000) + ply:TakeDamageInfo(dmg) + end + end + end + end + end + + if (not onground or slipfail or ply:GetSlidingSlipperyUpdate() < CT or not slipperytraceout.HitNormal) and slipfail then + slipperytrace.filter = ply + slipperytrace.start = mv:GetOrigin() + slipperytrace.endpos = slipperytrace.start - Vector(0, 0, 32) + + util.TraceHull(slipperytrace) + ply:SetSlidingSlipperyUpdate(CT + 0.25) + end + + local normal = slipperytraceout.HitNormal + local sang = normal:Angle() + local slippery = sang.x > 315 and sang.x < 330 and ply:GetMoveType() ~= MOVETYPE_NOCLIP and not ply:GetCrouchJump() and onground and not slipfail + + ply:SetSlidingSlippery(slippery) + + if slippery then + sang.x = 0 + sang.y = math.floor(sang.y) + + ply:SetSlidingAngle(sang) + + local vel = mv:GetVelocity() + vel.z = 0 + + if vel:Length() == 0 then + local ang = cmd:GetViewAngles() + ang.x = 0 + + mv:SetVelocity(ang:Forward() * 10) + end + end + + if ply:GetSlidingDelay() < CT and ply:Alive() and (ducking and sprinting and speed > runspeed * 0.5 or slippery and ply:GetSafetyRollTime() <= CurTime() - 0.25 or ply:GetDive() and ply:GetSafetyRollKeyTime() <= CurTime()) and onground and not sliding then + vel = math.min(speed, 541.44) * ply:GetOverdriveMult() + + ParkourEvent(slippery and "slide45" or "slide", ply) + + if slippery then + vel = 230 + + ply:SetDive(false) + + ply.DiveSliding = false + end + + if ply:GetDive() then + ply.DiveSliding = true + end + + ply:SetViewOffset(Vector(0, 0, 64)) + ply:SetSliding(true) + + local slidecalctime = slidetime * math.min(vel / 300, 1) + + ply:SetSlidingTime(CT + slidecalctime) + + if not ply:Crouching() then + ply:ViewPunch(slidepunch) + end + + ply:SetDuckSpeed(0.1) + ply:SetUnDuckSpeed(0.05) + + if not slippery then + if not ply.DiveSliding then + ply:SetSlidingAngle(mv:GetVelocity():Angle()) + else + local ang = cmd:GetViewAngles() + ang.x = 0 + + ply:SetSlidingAngle(ang) + end + end + + ply:SetSlidingVel(vel) + ply:SetSlidingStrafe(0) + + ply.SlidingInitTime = CT + + if game.SinglePlayer() then + ply:SendLua("LocalPlayer().SlidingInitTime = CurTime()") + end + + ply:SetJumpTurn(false) + ply:SetJumpTurnRecovery(0) + + if SERVER then + local pos = mv:GetOrigin() + local mat = SlideSurfaceSound(ply, pos) + + SlideLoopSound(ply, pos, mat) + end + + if game.SinglePlayer() then + net.Start("sliding_spfix") + net.WriteBool(ply:GetDive()) + net.Send(ply) + end + + if CLIENT_IFTP() then + SlidingAnimStart() + hook.Add("Think", "SlidingAnimThink", SlidingAnimThink) + end + elseif (not ducking and ply:GetMelee() == 0 and not slippery or not onground) and sliding then + blocked = false + + if not ducking then + ply.SlideHull = ply.SlideHull or {} + ply.SlideHullOut = ply.SlideHullOut or {} + local hulltr = ply.SlideHull + local hulltrout = ply.SlideHullOut + local mins, maxs = ply:GetHull() + local origin = mv:GetOrigin() + hulltr.start = origin + hulltr.endpos = origin + hulltr.maxs = maxs + hulltr.mins = mins + hulltr.filter = ply + hulltr.mask = MASK_PLAYERSOLID + hulltr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + hulltr.output = hulltrout + + util.TraceHull(hulltr) + + if hulltrout.Hit then + blocked = true + end + end + + ply:SetCrouchJumpBlocked(false) + ply:SetSliding(false) + ply:SetSlidingTime(0) + ply:ViewPunch(Angle(0.85, 0.35, 0)) + + if ply:GetSlidingVel() > 400 then + ply:SetMEMoveLimit(600) + end + + if game.SinglePlayer() then + net.Start("sliding_spend") + net.WriteBool(blocked) + net.WriteBool(false) + net.WriteBool(ply.DiveSliding) + net.Send(ply) + + ply.DiveSliding = false + elseif CLIENT_IFTP() then + SlidingAnimEnd(false, ply.DiveSliding) + + ply.DiveSliding = false + end + + ply:SetSlidingDelay(CT + 0.1) + + if SERVER and ply.SlideLoopSound then + ply.SlideLoopSound:Stop() + end + + ply:ConCommand("-duck") + ply:SetViewOffsetDucked(Vector(0, 0, 32)) + end + + sliding = ply:GetSliding() + + if sliding then + local eyeang = cmd:GetViewAngles() + eyeang.x = 0 + eyeang.z = 0 + eyeang = eyeang:Forward() + + ply:SetViewOffsetDucked(Vector(0, 0, 28) + eyeang * -25) + + local slidedelta = (ply:GetSlidingTime() - CT) / slidetime + local speed = ply:GetSlidingVel() * math.min(1.75, (ply:GetSlidingTime() - CT + 0.5) / slidetime) * qslide_speedmult + + mv:SetVelocity(ply:GetSlidingAngle():Forward() * speed) + + local pos = mv:GetOrigin() + + if not ply:GetSlidingLastPos() then + ply:SetSlidingLastPos(pos) + end + + if not slippery and pos.z > ply:GetSlidingLastPos().z + 1 then + ply:SetSlidingTime(ply:GetSlidingTime() - 0.025) + elseif slippery or slidedelta < 1 and pos.z < ply:GetSlidingLastPos().z - 0.25 then + ply:SetSlidingTime(CT + slidetime) + ply:SetSlidingVel(math.min(mv:GetVelocity():Length() * 0.865, 450 * ply:GetOverdriveMult()) * ply:GetOverdriveMult()) + end + + ply:SetSlidingLastPos(pos) + + if slippery then + if mv:KeyDown(IN_MOVERIGHT) then + ply:SetSlidingStrafe(math.Clamp(ply:GetSlidingStrafe() - FrameTime() * 125, -300, 300)) + elseif mv:KeyDown(IN_MOVELEFT) then + ply:SetSlidingStrafe(math.Clamp(ply:GetSlidingStrafe() + FrameTime() * 125, -300, 300)) + else + ply:SetSlidingStrafe(math.Approach(ply:GetSlidingStrafe(), 0, FrameTime() * 5)) + end + + mv:SetVelocity(mv:GetVelocity() - ply:GetSlidingAngle():Right() * ply:GetSlidingStrafe()) + + if mv:KeyPressed(IN_JUMP) then + local vel = mv:GetVelocity() + + vel:Mul(math.min(math.max(speed, 300) / 300, 1)) + + vel.z = 175 + + ply:SetSliding(false) + ply:SetSlidingTime(0) + + if CLIENT then + BodyAnimSetEase(mv:GetOrigin()) + elseif game.SinglePlayer() then + ply:SetNW2Vector("SPBAEase", mv:GetOrigin()) + ply:SendLua("BodyAnimSetEase(LocalPlayer():GetNW2Vector('SPBAEase'))") + end + + mv:SetOrigin(mv:GetOrigin() + Vector(0, 0, 33)) + ply:SetGroundEntity(nil) + ply:SetSlidingSlippery(false) + mv:SetVelocity(vel) + ParkourEvent("jumpslide", ply) + end + end + + if not slippery then + if mv:KeyDown(IN_MOVELEFT) then + local ang = ply:GetSlidingAngle() + ang.y = ang.y + 0.25 + + ply:SetSlidingAngle(ang) + elseif mv:KeyDown(IN_MOVERIGHT) then + local ang = ply:GetSlidingAngle() + ang.y = ang.y - 0.25 + + ply:SetSlidingAngle(ang) + end + end + + if mv:KeyPressed(IN_BACK) and ply:GetMelee() == 0 and ply:GetSlidingTime() < CT + slidetime * 0.95 then + if CLIENT or game.SinglePlayer() then + cmd:SetViewAngles(ply:GetSlidingAngle()) + end + + ply.DiveSliding = false + + ply:SetSlidingTime(0) + ply:SetSliding(false) + ply:SetQuickturn(true) + ply:SetQuickturnTime(CT) + ply:SetQuickturnAng(cmd:GetViewAngles()) + + if CLIENT then + DoJumpTurn(false) + elseif game.SinglePlayer() then + ply:SendLua("DoJumpTurn(false)") + end + + ply:SetJumpTurn(true) + ply:ViewPunch(Angle(2.5, 0, 5)) + ply:SetViewOffsetDucked(Vector(0, 0, 17)) + ply:SetViewOffset(Vector(0, 0, 64)) + mv:SetOrigin(mv:GetOrigin() + Vector(0, 0, 48)) + mv:SetVelocity(mv:GetVelocity() * 0.75 + Vector(0, 0, 251)) + end + + if ply:GetVelocity():Length() <= 75 then + ply:SetSlidingTime(0) + end + + if ply:GetMelee() ~= 0 then + ply:SetSlidingTime(math.max(ply:GetSlidingTime(), CurTime() + 0.1)) + end + + if ply:GetSlidingTime() < CT and ply:GetMelee() == 0 then + ply:SetSliding(false) + ply:SetSlidingTime(0) + ply:ViewPunch(Angle(0.85, 0, 0.15)) + + if SERVER and game.SinglePlayer() then + net.Start("sliding_spend") + net.WriteBool(false) + net.WriteBool(slippery) + net.WriteBool(ply.DiveSliding) + net.Send(ply) + elseif CLIENT_IFTP() then + SlidingAnimEnd(slippery, ply.DiveSliding) + end + + ply:SetSlidingDelay(CT + 0.1) + + if SERVER then + ply.SlideLoopSound:Stop() + end + + ply.DiveSliding = false + + if not mv:KeyDown(IN_ATTACK2) or mv:KeyDown(IN_FORWARD) then + ply:ConCommand("-duck") + ply:SetViewOffsetDucked(Vector(0, 0, 32)) + else + ply:SetViewOffsetDucked(Vector(0, 0, 17)) + ply:SetViewOffset(Vector(0, 0, 64)) + ply:SetJumpTurn(true) + + if CLIENT then + DoJumpTurn(false) + BodyAnim:SetSequence("meslideendprone") + elseif game.SinglePlayer() then + ply:SendLua("DoJumpTurn(false) BodyAnim:SetSequence('meslideendprone')") + end + end + end + end + + sliding = ply:GetSliding() + + if not crouching and not sliding then + ply:SetDuckSpeed(ply.OldDuckSpeed) + ply:SetUnDuckSpeed(ply.OldUnDuckSpeed) + end +end) +hook.Add("PlayerFootstep", "qslidestep", function (ply) + if ply:GetSliding() then + return true + end +end) +hook.Add("StartCommand", "qslidespeed", function (ply, cmd) + if ply:GetSliding() then + cmd:RemoveKey(IN_SPEED) + + if not ply:GetSlidingSlippery() then + cmd:RemoveKey(IN_JUMP) + end + + cmd:ClearMovement() + + local slidetime = math.max(0.1, qslide_duration) + + if (ply:GetSlidingTime() - CurTime()) / slidetime > 0.8 and (ply.SlidingInitTime > CurTime() - 0.25 or ply:GetSlidingSlippery()) then + cmd:SetButtons(bit.bor(cmd:GetButtons(), IN_DUCK)) + end + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_!Precache.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_!Precache.lua new file mode 100644 index 0000000..d094571 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_!Precache.lua @@ -0,0 +1,10 @@ +soundAdd_old = sound.Add + +local function soundAdd_detour(tbl) + if !tbl.name then return end + soundAdd_old(tbl) + timer.Simple(2, function() + util.PrecacheSound(tbl.name) + end) +end +sound.Add = soundAdd_detour \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Cloth.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Cloth.lua new file mode 100644 index 0000000..0846954 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Cloth.lua @@ -0,0 +1,97 @@ +sound.Add({ + name = "Cloth.VaultSwish", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish1.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish10.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish11.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish12.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish2.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish3.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish4.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish5.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish6.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish7.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish8.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Vault_Swish9.wav" + } +}) +sound.Add({ + name = "Cloth.MovementRun", + volume = 0.75, + level = 30, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Cloth/ME_Cloth_Movement_Run1.wav", + "MirrorsEdge/Cloth/ME_Cloth_Movement_Run2.wav", + "MirrorsEdge/Cloth/ME_Cloth_Movement_Run3.wav", + "MirrorsEdge/Cloth/ME_Cloth_Movement_Run4.wav", + "MirrorsEdge/Cloth/ME_Cloth_Movement_Run5.wav", + "MirrorsEdge/Cloth/ME_Cloth_Movement_Run6.wav", + "MirrorsEdge/Cloth/ME_Cloth_Movement_Run7.wav", + "MirrorsEdge/Cloth/ME_Cloth_Movement_Run8.wav" + } +}) +sound.Add({ + name = "Cloth.RollLand", + volume = 1, + level = 35, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Cloth/ME_Faith_Cloth_Roll_Land1.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Roll_Land2.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Roll_Land3.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Roll_Land4.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Roll_Land5.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Roll_Land6.wav", + "MirrorsEdge/Cloth/ME_Faith_Cloth_Roll_Land7.wav" + } +}) +sound.Add({ + name = "Cloth.Roll", + volume = 1, + level = 75, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Body_Roll_01.wav", + "MirrorsEdge/Body_Roll_02.wav", + "MirrorsEdge/Body_Roll_03.wav", + "MirrorsEdge/Body_Roll_04.wav" + } +}) +sound.Add({ + name = "Cloth.FallShortHard", + volume = 1, + level = 75, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Cloth/BF_Short_Hard_1a.wav", + "MirrorsEdge/Cloth/BF_Short_Hard_1b.wav", + "MirrorsEdge/Cloth/BF_Short_Hard_1c.wav", + "MirrorsEdge/Cloth/BF_Short_Hard_1d.wav", + "MirrorsEdge/Cloth/BF_Short_Hard_1e.wav", + "MirrorsEdge/Cloth/BF_Short_Hard_1f.wav" + } +}) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Footsteps.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Footsteps.lua new file mode 100644 index 0000000..4da4862 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Footsteps.lua @@ -0,0 +1,664 @@ +sound.Add({ + name = "Footsteps.Concrete", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun1.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun10.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun11.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun12.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun13.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun14.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun2.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun3.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun4.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun5.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun6.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun7.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun8.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRun9.wav" + } +}) +sound.Add({ + name = "Release.Concrete", + volume = 1, + level = 30, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease1.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease2.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease3.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease4.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease5.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease6.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease7.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease8.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease9.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease10.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease11.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease12.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease13.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_ConcreteRunRelease14.wav" + } +}) +sound.Add({ + name = "Land.Concrete", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_Concrete_Land1.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_Concrete_Land2.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_Concrete_Land3.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_Concrete_Land4.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_Concrete_Land5.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_Concrete_Land6.wav", + "MirrorsEdge/Footsteps/Concrete/ME_FootStep_Concrete_Land7.wav" + } +}) +sound.Add({ + name = "Footsteps.Glass", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun1.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun10.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun11.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun12.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun13.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun14.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun15.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun16.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun17.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun18.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun19.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun2.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun20.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun3.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun4.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun5.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun6.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun7.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun8.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRun9.wav" + } +}) +sound.Add({ + name = "Release.Glass", + volume = 1, + level = 30, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease1.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease2.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease3.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease4.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease5.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease6.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease7.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease8.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPaneRunRelease9.wav" + } +}) +sound.Add({ + name = "Land.Glass", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPanelLand1.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPanelLand2.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPanelLand3.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPanelLand4.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPanelLand5.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPanelLand6.wav", + "MirrorsEdge/Footsteps/Glass/ME_FootStep_GlassPanelLand7.wav" + } +}) +sound.Add({ + name = "Footsteps.Metal", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint1.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint10.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint11.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint12.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint13.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint14.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint15.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint16.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint17.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint18.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint19.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint2.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint20.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint3.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint4.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint5.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint6.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint7.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint8.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint9.wav" + } +}) +sound.Add({ + name = "Release.Metal", + volume = 0.3, + level = 30, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release1.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release10.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release11.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release12.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release13.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release14.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release15.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release2.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release3.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release4.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release5.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release6.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release7.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release8.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Polished_Sprint_Release9.wav" + } +}) +sound.Add({ + name = "Footsteps.Duct", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Metal/ME_FootStep_MetalDuctRun7.wav", + "MirrorsEdge/Footsteps/Metal/ME_FootStep_MetalDuctRun8.wav", + "MirrorsEdge/Footsteps/Metal/ME_FootStep_MetalDuctRun9.wav", + "MirrorsEdge/Footsteps/Metal/ME_FootStep_MetalDuctRun10.wav", + "MirrorsEdge/Footsteps/Metal/ME_FootStep_MetalDuctRun11.wav" + } +}) +sound.Add({ + name = "Footsteps.Gantry", + volume = 0.5, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_01.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_02.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_03.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_04.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_05.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_06.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_07.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_08.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Steps_Sprint_New_09.wav" + } +}) +sound.Add({ + name = "Release.Gantry", + volume = 0.5, + level = 30, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release1.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release2.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release3.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release4.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release5.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release6.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release7.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release8.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Metal_Gantry_Release9.wav" + } +}) +sound.Add({ + name = "Metal.Ringout", + volume = 0.5, + level = 50, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts1.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts2.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts3.wav", + "MirrorsEdge/Footsteps/Metal/ME_Footsteps_Master_Metal_Vault_Ringouts4.wav" + } +}) +sound.Add({ + name = "Footsteps.Wood", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant1.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant10.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant11.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant12.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant13.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant14.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant15.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant2.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant3.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant4.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant5.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant6.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant7.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant8.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunFootplant9.wav" + } +}) +sound.Add({ + name = "Release.Wood", + volume = 1, + level = 30, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease1.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease10.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease11.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease12.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease13.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease14.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease15.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease2.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease3.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease4.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease5.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease6.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease7.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease8.wav", + "MirrorsEdge/Footsteps/Wood/ME_FootStep_WoodGeneric_RunRelease9.wav" + } +}) +sound.Add({ + name = "Footsteps.Water", + volume = 0.25, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step1.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step10.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step11.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step12.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step13.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step2.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step3.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step4.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step5.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step6.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step7.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step8.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Step9.wav" + } +}) +sound.Add({ + name = "Release.Water", + volume = 1, + level = 30, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release1.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release10.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release11.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release12.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release13.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release14.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release2.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release3.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release4.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release5.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release6.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release7.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release8.wav", + "MirrorsEdge/Footsteps/Water/ME_Faith_Water_Shallow_Sprint_Release9.wav" + } +}) +sound.Add({ + name = "Footsteps.Gravel", + volume = 0.25, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint1.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint10.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint11.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint12.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint13.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint2.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint3.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint4.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint5.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint6.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint7.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint8.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint9.wav" + } +}) +sound.Add({ + name = "Release.Gravel", + volume = 1, + level = 30, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith1.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith10.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith11.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith12.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith13.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith14.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith2.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith3.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith4.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith5.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith6.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith7.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith8.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Sprint_Release_Faith9.wav" + } +}) +sound.Add({ + name = "Land.Gravel", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy1.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy10.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy11.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy2.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy3.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy4.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy5.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy6.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy7.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy8.wav", + "MirrorsEdge/Footsteps/Gravel/ME_Footsteps_Gravel_Land_Heavy9.wav" + } +}) +sound.Add({ + name = "Footsteps.LadderHeavy", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Ladder/LadderFootstepHvy_01.ogg", + "MirrorsEdge/Ladder/LadderFootstepHvy_02.ogg", + "MirrorsEdge/Ladder/LadderFootstepHvy_03.ogg", + "MirrorsEdge/Ladder/LadderFootstepHvy_04.ogg", + "MirrorsEdge/Ladder/LadderFootstepHvy_05.ogg", + "MirrorsEdge/Ladder/LadderFootstepHvy_06.ogg" + } +}) +sound.Add({ + name = "Footsteps.LadderMedium", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Ladder/LadderFootstepMed_01.ogg", + "MirrorsEdge/Ladder/LadderFootstepMed_02.ogg", + "MirrorsEdge/Ladder/LadderFootstepMed_03.ogg", + "MirrorsEdge/Ladder/LadderFootstepMed_04.ogg", + "MirrorsEdge/Ladder/LadderFootstepMed_05.ogg", + "MirrorsEdge/Ladder/LadderFootstepMed_06.ogg" + } +}) +sound.Add({ + name = "Release.Ladder", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Ladder/LadderFootstepRelease_01.ogg", + "MirrorsEdge/Ladder/LadderFootstepRelease_02.ogg", + "MirrorsEdge/Ladder/LadderFootstepRelease_03.ogg", + "MirrorsEdge/Ladder/LadderFootstepRelease_04.ogg", + "MirrorsEdge/Ladder/LadderFootstepRelease_05.ogg", + "MirrorsEdge/Ladder/LadderFootstepRelease_06.ogg" + } +}) +sound.Add({ + name = "OWallrun.Concrete", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith1.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith10.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith11.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith12.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith13.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith14.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith2.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith3.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith4.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith5.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith6.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith7.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith8.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Slow_Faith9.wav" + } +}) +sound.Add({ + name = "OWallrunFast.Concrete", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith1.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith2.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith3.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith4.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith5.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith6.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith7.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith8.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith9.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith10.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith11.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith12.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith13.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith14.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith15.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith16.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith17.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith18.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith19.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith20.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith21.wav", + "MirrorsEdge/Footsteps/Concrete/ME_Footsteps_Congrete_Clean_WallRun_Fast_Faith22.wav" + } +}) +sound.Add({ + name = "Wallrun.Concrete", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRun_01.wav", + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRun_02.wav", + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRun_03.wav", + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRun_04.wav", + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRun_05.wav", + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRun_06.wav" + } +}) +sound.Add({ + name = "WallrunRelease.Concrete", + volume = 1, + level = 35, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_01.wav", + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_02.wav", + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_03.wav", + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_04.wav", + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_05.wav", + "MirrorsEdge/Footsteps/Concrete/ConcreteFootStepWallRunRelease_06.wav" + } +}) +sound.Add({ + name = "Footsteps.Spark", + volume = 0.2, + level = 40, + channel = CHAN_STATIC, + pitch = { + 85, + 115 + }, + sound = { + "bigspark1.wav", + "bigspark2.wav" + } +}) +sound.Add({ + name = "CyborgRun", + volume = 0.75, + sound = "cyborgrun.wav", + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + } +}) + +FOOTSTEPS_LUT = { + ["player/footsteps/woodpanel"] = "Wood", + ["player/footsteps/gravel"] = "Gravel", + ["player/footsteps/sand"] = "Gravel", + ["player/footsteps/metalgrate"] = "Gantry", + ["player/footsteps/concrete"] = "Concrete", + ["player/footsteps/metal"] = "Metal", + ["physics/wood/wood_box_footstep"] = "Wood", + ["physics/glass/glass_sheet_step"] = "Glass", + ["player/footsteps/duct"] = "Duct", + ["player/footsteps/wood"] = "Wood", + ["player/footsteps/chainlink"] = "Gantry" +} +FOOTSTEPS_RELEASE_LUT = { + ["player/footsteps/woodpanel"] = "Wood", + ["player/footsteps/gravel"] = "Gravel", + ["player/footsteps/sand"] = "Gravel", + ["player/footsteps/metalgrate"] = "Gantry", + ["player/footsteps/concrete"] = "Concrete", + ["player/footsteps/metal"] = "Metal", + ["physics/wood/wood_box_footstep"] = "Wood", + ["physics/glass/glass_sheet_step"] = "Glass", + ["player/footsteps/duct"] = "Metal", + ["player/footsteps/wood"] = "Wood", + ["player/footsteps/chainlink"] = "Gantry" +} +FOOTSTEPS_LAND_LUT = { + ["physics/glass/glass_sheet_step"] = "Glass", + ["player/footsteps/concrete"] = "Concrete", + ["player/footsteps/sand"] = "Gravel", + ["player/footsteps/gravel"] = "Gravel" +} diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Handsteps.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Handsteps.lua new file mode 100644 index 0000000..5d24a1a --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Handsteps.lua @@ -0,0 +1,88 @@ +sound.Add({ + name = "Handsteps.ConcreteSoft", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Handsteps/Concrete/ConcreteHandStepSoft_01.wav", + "MirrorsEdge/Handsteps/Concrete/ConcreteHandStepSoft_02.wav", + "MirrorsEdge/Handsteps/Concrete/ConcreteHandStepSoft_03.wav", + "MirrorsEdge/Handsteps/Concrete/ConcreteHandStepSoft_04.wav" + } +}) +sound.Add({ + name = "Handsteps.ConcreteHard", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Handsteps/Concrete/ConcreteHandStepHard_01.wav", + "MirrorsEdge/Handsteps/Concrete/ConcreteHandStepHard_02.wav", + "MirrorsEdge/Handsteps/Concrete/ConcreteHandStepHard_03.wav" + } +}) +sound.Add({ + name = "Handsteps.Ladder", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 75, + 90 + }, + sound = { + "MirrorsEdge/Ladder/LadderHandstep_01.ogg", + "MirrorsEdge/Ladder/LadderHandstep_02.ogg", + "MirrorsEdge/Ladder/LadderHandstep_03.ogg", + "MirrorsEdge/Ladder/LadderHandstep_04.ogg", + "MirrorsEdge/Ladder/LadderHandstep_05.ogg", + "MirrorsEdge/Ladder/LadderHandstep_06.ogg", + "MirrorsEdge/Ladder/LadderHandstep_07.ogg", + "MirrorsEdge/Ladder/LadderHandstep_08.ogg", + "MirrorsEdge/Ladder/LadderHandstep_09.ogg", + "MirrorsEdge/Ladder/LadderHandstep_10.ogg", + "MirrorsEdge/Ladder/LadderHandstep_21.ogg", + "MirrorsEdge/Ladder/LadderHandstep_22.ogg", + "MirrorsEdge/Ladder/LadderHandstep_23.ogg", + "MirrorsEdge/Ladder/LadderHandstep_24.ogg", + "MirrorsEdge/Ladder/LadderHandstep_25.ogg", + "MirrorsEdge/Ladder/LadderHandstep_26.ogg", + "MirrorsEdge/Ladder/LadderHandstep_27.ogg", + "MirrorsEdge/Ladder/LadderHandstep_28.ogg", + "MirrorsEdge/Ladder/LadderHandstep_29.ogg", + "MirrorsEdge/Ladder/LadderHandstep_30.ogg", + "MirrorsEdge/Ladder/LadderHandstep_41.ogg", + "MirrorsEdge/Ladder/LadderHandstep_42.ogg", + "MirrorsEdge/Ladder/LadderHandstep_43.ogg", + "MirrorsEdge/Ladder/LadderHandstep_44.ogg", + "MirrorsEdge/Ladder/LadderHandstep_45.ogg", + "MirrorsEdge/Ladder/LadderHandstep_46.ogg", + "MirrorsEdge/Ladder/LadderHandstep_47.ogg", + "MirrorsEdge/Ladder/LadderHandstep_48.ogg", + "MirrorsEdge/Ladder/LadderHandstep_49.ogg", + "MirrorsEdge/Ladder/LadderHandstep_50.ogg" + } +}) +sound.Add({ + name = "Handsteps.ConcreteRelease", + volume = 0.5, + level = 40, + channel = CHAN_STATIC, + pitch = { + 75, + 90 + }, + sound = { + "MirrorsEdge/Handsteps/Concrete/ConcreteHandStepFastRelease_01.wav", + "MirrorsEdge/Handsteps/Concrete/ConcreteHandStepFastRelease_02.wav", + "MirrorsEdge/Handsteps/Concrete/ConcreteHandStepFastRelease_03.wav" + } +}) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Melee.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Melee.lua new file mode 100644 index 0000000..864f84c --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Melee.lua @@ -0,0 +1,68 @@ +sound.Add({ + name = "Melee.Foot", + volume = 1, + level = 50, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "melee/foot1.wav", + "melee/foot2.wav", + "melee/foot3.wav", + "melee/foot4.wav", + "melee/foot5.wav" + } +}) +sound.Add({ + name = "Melee.Fist", + volume = 1, + level = 45, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "melee/fist1.wav", + "melee/fist2.wav", + "melee/fist3.wav", + "melee/fist4.wav", + "melee/fist5.wav" + } +}) +sound.Add({ + name = "Melee.LegSwoosh", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "melee/legswoosh1.wav", + "melee/legswoosh2.wav", + "melee/legswoosh3.wav", + "melee/legswoosh4.wav" + } +}) +sound.Add({ + name = "Melee.ArmSwoosh", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "melee/armswoosh1.wav", + "melee/armswoosh2.wav", + "melee/armswoosh3.wav", + "melee/armswoosh4.wav", + "melee/armswoosh5.wav", + "melee/armswoosh6.wav" + } +}) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Misc.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Misc.lua new file mode 100644 index 0000000..1f7386a --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_Misc.lua @@ -0,0 +1,118 @@ +sound.Add({ + name = "Bump.Concrete", + volume = 1, + level = 50, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/ME_BodyConcreteBump1.wav", + "MirrorsEdge/ME_BodyConcreteBump2.wav", + "MirrorsEdge/ME_BodyConcreteBump3.wav", + "MirrorsEdge/ME_BodyConcreteBump4.wav", + "MirrorsEdge/ME_BodyConcreteBump5.wav", + "MirrorsEdge/ME_BodyConcreteBump6.wav", + "MirrorsEdge/ME_BodyConcreteBump7.wav", + "MirrorsEdge/ME_BodyConcreteBump8.wav", + "MirrorsEdge/ME_BodyConcreteBump9.wav", + "MirrorsEdge/ME_BodyConcreteBump10.wav" + } +}) +sound.Add({ + name = "Door.Barge", + volume = 1, + level = 60, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/GameplayObjects/ME_Door_Generic_Barge1.wav", + "MirrorsEdge/GameplayObjects/ME_Door_Generic_Barge2.wav", + "MirrorsEdge/GameplayObjects/ME_Door_Generic_Barge3.wav", + "MirrorsEdge/GameplayObjects/ME_Door_Generic_Barge4.wav" + } +}) +sound.Add({ + name = "FenceClimb", + volume = 1, + level = 60, + channel = CHAN_STATIC, + pitch = { + 95, + 105 + }, + sound = { + "MirrorsEdge/GameplayObjects/Fence_01.wav", + "MirrorsEdge/GameplayObjects/Fence_02.wav" + } +}) +sound.Add({ + name = "FenceClimbEnd", + volume = 0.5, + sound = "MirrorsEdge/GameplayObjects/Fence.wav", + level = 60, + channel = CHAN_STATIC, + pitch = { + 95, + 105 + } +}) +sound.Add({ + name = "Vault", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Vault_01.wav", + "MirrorsEdge/Vault_02.wav", + "MirrorsEdge/Vault_03.wav", + "MirrorsEdge/Vault_04.wav" + } +}) +sound.Add({ + name = "ZiplineStart", + volume = 1, + sound = "MirrorsEdge/zipline_attach.wav", + pitch = 100, + level = 40, + channel = CHAN_STATIC +}) +sound.Add({ + name = "ZiplineEnd", + volume = 1, + sound = "MirrorsEdge/zipline_detach.wav", + pitch = 100, + level = 40, + channel = CHAN_STATIC +}) +sound.Add({ + name = "ZiplineLoop", + volume = 1, + sound = "MirrorsEdge/zipline_loop.wav", + pitch = 100, + level = 40, + channel = CHAN_STATIC +}) +sound.Add({ + name = "Land.Ladder", + volume = 1, + level = 40, + channel = CHAN_STATIC, + pitch = { + 90, + 110 + }, + sound = { + "MirrorsEdge/Ladder/Ladder_Land_01.ogg", + "MirrorsEdge/Ladder/Ladder_Land_02.ogg", + "MirrorsEdge/Ladder/Ladder_Land_03.ogg" + } +}) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_VO.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_VO.lua new file mode 100644 index 0000000..67ddf73 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_VO.lua @@ -0,0 +1,224 @@ +local FaithVO = CreateConVar("Beatrun_FaithVO", 0, { + FCVAR_REPLICATED, + FCVAR_ARCHIVE +}) +local meta = FindMetaTable("Player") + +sound.Add({ + name = "Faith.StrainSoft", + volume = 0.75, + pitch = 100, + level = 40, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Strain_Soft_1.wav", + "MirrorsEdge/VO/Faith/Strain_Soft_2.wav", + "MirrorsEdge/VO/Faith/Strain_Soft_3.wav", + "MirrorsEdge/VO/Faith/Strain_Soft_4.wav", + "MirrorsEdge/VO/Faith/Strain_Soft_5.wav", + "MirrorsEdge/VO/Faith/Strain_Soft_6.wav", + "MirrorsEdge/VO/Faith/Strain_Soft_7.wav", + "MirrorsEdge/VO/Faith/Strain_Soft_8.wav" + } +}) +sound.Add({ + name = "Faith.StrainMedium", + volume = 0.75, + pitch = 100, + level = 40, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Strain_Medium_1.wav", + "MirrorsEdge/VO/Faith/Strain_Medium_2.wav", + "MirrorsEdge/VO/Faith/Strain_Medium_3.wav", + "MirrorsEdge/VO/Faith/Strain_Medium_4.wav", + "MirrorsEdge/VO/Faith/Strain_Medium_5.wav", + "MirrorsEdge/VO/Faith/Strain_Medium_6.wav", + "MirrorsEdge/VO/Faith/Strain_Medium_7.wav", + "MirrorsEdge/VO/Faith/Strain_Medium_8.wav" + } +}) +sound.Add({ + name = "Faith.StrainHard", + volume = 0.75, + pitch = 100, + level = 40, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Strain_Hard_1.wav", + "MirrorsEdge/VO/Faith/Strain_Hard_2.wav", + "MirrorsEdge/VO/Faith/Strain_Hard_3.wav", + "MirrorsEdge/VO/Faith/Strain_Hard_4.wav", + "MirrorsEdge/VO/Faith/Strain_Hard_5.wav", + "MirrorsEdge/VO/Faith/Strain_Hard_6.wav", + "MirrorsEdge/VO/Faith/Strain_Hard_7.wav", + "MirrorsEdge/VO/Faith/Strain_Hard_8.wav" + } +}) +sound.Add({ + name = "Faith.Impact", + volume = 0.75, + pitch = 100, + level = 40, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Impact_Med_01.wav", + "MirrorsEdge/VO/Faith/Impact_Med_02.wav", + "MirrorsEdge/VO/Faith/Impact_Med_03.wav", + "MirrorsEdge/VO/Faith/Impact_Med_04.wav", + "MirrorsEdge/VO/Faith/Impact_Med_05.wav", + "MirrorsEdge/VO/Faith/Impact_Med_06.wav", + "MirrorsEdge/VO/Faith/Impact_Med_07.wav", + "MirrorsEdge/VO/Faith/Impact_Med_08.wav", + "MirrorsEdge/VO/Faith/Impact_Med_09.wav", + "MirrorsEdge/VO/Faith/Impact_Med_10.wav", + "MirrorsEdge/VO/Faith/Impact_Med_11.wav", + "MirrorsEdge/VO/Faith/Impact_Med_12.wav", + "MirrorsEdge/VO/Faith/Impact_Med_13.wav", + "MirrorsEdge/VO/Faith/Impact_Med_14.wav" + } +}) +sound.Add({ + name = "Faith.Breath.SoftShortIn", + volume = 0.75, + pitch = 100, + level = 35, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Breath_Soft_Short_In_01.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_In_02.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_In_03.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_In_04.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_In_05.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_In_06.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_In_07.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_In_08.wav" + } +}) +sound.Add({ + name = "Faith.Breath.SoftShortOut", + volume = 0.75, + pitch = 100, + level = 35, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Breath_Soft_Short_Out_01.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_Out_02.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_Out_03.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_Out_04.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_Out_05.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_Out_06.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_Out_07.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Short_Out_08.wav" + } +}) +sound.Add({ + name = "Faith.Breath.SoftLongIn", + volume = 0.75, + pitch = 100, + level = 35, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Breath_Soft_Long_In_01.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Long_In_02.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Long_In_03.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Long_In_04.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Long_In_05.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Long_In_06.wav" + } +}) +sound.Add({ + name = "Faith.Breath.SoftLongOut", + volume = 0.75, + pitch = 100, + level = 35, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Breath_Soft_Long_Out_01.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Long_Out_02.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Long_Out_03.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Long_Out_04.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Long_Out_05.wav", + "MirrorsEdge/VO/Faith/Breath_Soft_Long_Out_06.wav" + } +}) +sound.Add({ + name = "Faith.Breath.MediumShortIn", + volume = 0.75, + pitch = 100, + level = 35, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Breath_Medium_Short_In_01.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_In_02.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_In_03.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_In_04.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_In_05.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_In_06.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_In_07.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_In_08.wav" + } +}) +sound.Add({ + name = "Faith.Breath.MediumShortOut", + volume = 0.75, + pitch = 100, + level = 35, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Breath_Medium_Short_Out_01.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_Out_02.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_Out_03.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_Out_04.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_Out_05.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_Out_06.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_Out_07.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Short_Out_08.wav" + } +}) +sound.Add({ + name = "Faith.Breath.MediumLongIn", + volume = 0.75, + pitch = 100, + level = 35, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Breath_Medium_Long_In_01.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_In_02.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_In_03.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_In_04.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_In_05.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_In_06.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_In_07.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_In_08.wav" + } +}) +sound.Add({ + name = "Faith.Breath.MediumLongOut", + volume = 0.75, + pitch = 100, + level = 35, + channel = CHAN_VOICE, + sound = { + "MirrorsEdge/VO/Faith/Breath_Medium_Long_Out_01.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_Out_02.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_Out_03.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_Out_04.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_Out_05.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_Out_06.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_Out_07.wav", + "MirrorsEdge/VO/Faith/Breath_Medium_Long_Out_08.wav" + } +}) + +function meta:FaithVO(vo) + if FaithVO:GetBool() then + if CLIENT then + nextbreath = CurTime() + 1 + elseif game.SinglePlayer() then + Entity(1):SendLua("nextbreath = CurTime()+1") + end + + self:EmitSound(vo) + end +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_zzzEnd.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_zzzEnd.lua new file mode 100644 index 0000000..a0d6dd8 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Sounds_zzzEnd.lua @@ -0,0 +1,2 @@ +sound.Add = soundAdd_old +soundAdd_old = nil diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/SwingPipe.lua b/beatrun/gamemodes/beatrun/gamemode/sh/SwingPipe.lua new file mode 100644 index 0000000..20b4d70 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/SwingPipe.lua @@ -0,0 +1,200 @@ +local function SwingpipeCheck(ply, mv, cmd) + local mins, maxs = ply:GetCollisionBounds() + maxs.x = maxs.x * 2 + mins.x = mins.x * 2 + maxs.y = maxs.y * 2 + mins.y = mins.y * 2 + local tr = ply.Monkey_tr + local trout = ply.Monkey_trout + tr.start = mv:GetOrigin() + tr.endpos = tr.start + tr.maxs = maxs + tr.mins = mins + tr.filter = ply + tr.ignoreworld = true + + util.TraceHull(tr) + + tr.ignoreworld = false + + if IsValid(trout.Entity) and trout.Entity:GetClass() == "br_swingpipe" and (ply:GetSwingbarLast() ~= trout.Entity or ply:GetSBDelay() < CurTime()) then + local swingpipe = trout.Entity + local dot = cmd:GetViewAngles():Forward():Dot(swingpipe:GetAngles():Forward()) + + if CLIENT then + swingpipe:SetPredictable(true) + end + + local pos = swingpipe:GetPos() + pos.z = mv:GetOrigin().z + local entvector = pos - ply:GetShootPos() + entvector.z = pos.z + local entdot = entvector:Dot(mv:GetAngles():Right()) + local dir = entdot < 0 + local trwall = util.QuickTrace(mv:GetOrigin(), mv:GetAngles():Right() * 100 * (dir and -1 or 1), ply) + + if trwall.Hit then + ply.swingbarang = (trwall.HitNormal:Angle():Right():Angle() + Angle(0, 90 * (dir and -1 or 1))).y + else + ply.swingbarang = (ply:EyeAngles() + Angle(0, 90)).y + end + + ply.SwingHullCheck = false + + ply:SetSwingpipe(swingpipe) + ply:SetWallrunTime(0) + ply:SetSBDir(dir) + ply:SetSBStartLerp(0) + ply:SetSBOffset(0) + ply:SetSBPeak(0) + ply:SetClimbingStart(pos) + + if mv:KeyDown(IN_FORWARD) or mv:GetVelocity():Length() > 150 then + ply:SetSBOffsetSpeed(2) + else + ply:SetSBOffsetSpeed(0) + end + end +end + +local radius = 40 +local red = Color(255, 0, 0, 200) +local circlepos = Vector() +local axis = Vector(0, 1, 0) + +local function SwingpipeThink(ply, mv, cmd) + local swingpipe = ply:GetSwingpipe() + + if not ply:Alive() then + ply:SetMoveType(MOVETYPE_WALK) + ply:SetSwingbar(nil) + ply:SetSBDelay(CurTime() + 1) + + if CLIENT then + swingpipe:SetPredictable(false) + end + + return + end + + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + + local pos = ply:GetClimbingStart() + local dir = ply:GetSBDir() and 1 or -1 + local ang = Angle() + local startlerp = ply:GetSBStartLerp() + + ang:RotateAroundAxis(axis, 90) + + local angle = math.NormalizeAngle(ply:GetSBOffset() - ply.swingbarang) * math.pi * 2 / 360 + + circlepos:SetUnpacked(0, math.cos(angle) * radius * -1, -math.sin(angle) * radius) + circlepos:Rotate(ang) + + if not ply.SwingHullCheck then + local angleend = math.NormalizeAngle(60 * -dir - ply.swingbarang) * math.pi * 2 / 360 + local spendpos = Vector(0, math.cos(angleend) * radius * -1, -math.sin(angleend) * radius) + + spendpos:Rotate(ang) + spendpos:Add(pos) + + if ply:GetSBDir() then + spendpos:Add(mv:GetAngles():Right() * 17) + else + spendpos:Sub(mv:GetAngles():Right() * 17) + end + + local minhull, maxhull = ply:GetHull() + + if util.TraceHull({ + start = spendpos, + endpos = spendpos, + filter = { + ply:GetSwingpipe(), + ply + }, + mins = minhull, + maxs = maxhull + }).Hit then + ply:SetMoveType(MOVETYPE_WALK) + ply:SetSwingbarLast(ply:GetSwingpipe()) + ply:SetSwingpipe(nil) + ply:SetSBDelay(CurTime() + 0.05) + + return + end + + if CLIENT and IsFirstTimePredicted() or game.SinglePlayer() then + ply:EmitSound("Handsteps.ConcreteHard") + end + + ply:ViewPunch(Angle(1, 0, 0)) + ply:SetCrouchJump(false) + ply:SetDive(false) + + if ply:GetSBDir() then + ParkourEvent("swingpipeleft", ply) + else + ParkourEvent("swingpiperight", ply) + end + + ply.SwingHullCheck = true + end + + pos = pos + circlepos + local origin = startlerp < 1 and LerpVector(startlerp, mv:GetOrigin(), pos) or pos + + ply:SetSBStartLerp(math.min(startlerp + 5 * FrameTime(), 1)) + + if ply:GetSBDir() then + ply:SetSBOffset(math.max(ply:GetSBOffset() - 250 * FrameTime() * math.min(startlerp + 0.5 - math.min(math.max(math.abs(ply:GetSBOffset()) - 65, 0) / 30, 0.6), 1.15), -90)) + origin:Add(mv:GetAngles():Right() * 17 * startlerp) + else + ply:SetSBOffset(math.min(ply:GetSBOffset() + 250 * FrameTime() * math.min(startlerp + 0.5 - math.min(math.max(math.abs(ply:GetSBOffset()) - 65, 0) / 30, 0.6), 1.15), 90)) + origin:Sub(mv:GetAngles():Right() * 17 * startlerp) + end + + mv:SetOrigin(origin) + mv:SetVelocity(vector_origin) + + if CLIENT or game.SinglePlayer() then + ply:SetEyeAngles(LerpAngle(startlerp, ply:EyeAngles(), circlepos:Angle())) + + if CLIENT_IFTP() then + viewtiltlerp.z = startlerp * -10 * dir + + ply:CLViewPunch(Angle(0, 0.1 * dir)) + elseif SERVER then + ply:SendLua("viewtiltlerp.z = " .. startlerp .. "*-10*" .. dir) + ply:ViewPunch(Angle(0, 0.1 * dir)) + end + end + + if math.abs(ply:GetSBOffset()) >= 90 then + ply:SetMoveType(MOVETYPE_WALK) + ply:SetSwingbarLast(ply:GetSwingpipe()) + ply:SetSwingpipe(nil) + ply:SetSBDelay(CurTime() + 0.5) + mv:SetVelocity(cmd:GetViewAngles():Forward() * 260 + Vector(0, 0, 150)) + ParkourEvent("jumpfar", ply) + end +end + +local function Swingpipe(ply, mv, cmd) + if not ply.Monkey_tr then + ply.Monkey_tr = {} + ply.Monkey_trout = {} + ply.Monkey_tr.output = ply.Monkey_trout + end + + if not ply:OnGround() and not IsValid(ply:GetSwingpipe()) and ply:GetMoveType() == MOVETYPE_WALK and mv:GetVelocity().z < 800 then + SwingpipeCheck(ply, mv, cmd) + end + + if IsValid(ply:GetSwingpipe()) then + SwingpipeThink(ply, mv, cmd) + end +end + +hook.Add("SetupMove", "Swingpipe", Swingpipe) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/TimeSlow.lua b/beatrun/gamemodes/beatrun/gamemode/sh/TimeSlow.lua new file mode 100644 index 0000000..0b3b361 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/TimeSlow.lua @@ -0,0 +1,60 @@ +if not game.SinglePlayer() then + return +end + +local slow = false +local slowlerp = 1 +local slowtarget = 0.35 +local slowspeed = 2 + +if SERVER then + util.AddNetworkString("SlowSounds") + hook.Add("Think", "TimeSlow", function () + if slow and slowlerp ~= slowtarget then + slowlerp = math.Approach(slowlerp, slowtarget, slowspeed * FrameTime()) + + game.SetTimeScale(slowlerp) + elseif not slow and slowlerp ~= 1 then + slowlerp = math.Approach(slowlerp, 1, slowspeed * 2 * FrameTime()) + + game.SetTimeScale(slowlerp) + end + end) +end + +local function TimeSlowSounds(t) + local slow = slow + + if CLIENT then + slow = game.GetTimeScale() <= slowtarget + end + + if slow then + t.Pitch = t.Pitch * 0.35 + + return true + end +end + +net.Receive("SlowSounds", function () + local slowed = net.ReadBool() + + if slowed then + hook.Add("EntityEmitSound", "TimeSlow", TimeSlowSounds) + else + hook.Remove("EntityEmitSound", "TimeSlow") + end +end) +concommand.Add("ToggleTimeSlow", function (ply) + slow = not slow + + net.Start("SlowSounds") + net.WriteBool(slow) + net.Send(ply) + + if slow then + hook.Add("EntityEmitSound", "TimeSlow", TimeSlowSounds) + else + hook.Remove("EntityEmitSound", "TimeSlow") + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Vaulting.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Vaulting.lua new file mode 100644 index 0000000..1660517 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Vaulting.lua @@ -0,0 +1,813 @@ +local chestvec = Vector(0, 0, 32) +local thoraxvec = Vector(0, 0, 48) +local neckvec = Vector(0, 0, 54) +local neckvecduck = Vector(0, 0, 54) +local eyevec = Vector(0, 0, 64) +local eyevecduck = Vector(0, 0, 64) +local hairvec = Vector(0, 0, 80) +local aircheck = Vector(0, 0, 600) +local mantlevec = Vector(0, 0, 16) +local vault1vec = Vector(0, 0, 24) +local vpunch1 = Angle(0, 0, -0.5) +local vpunch2 = Angle(0, 0, -2.5) +local vpunch3 = Angle(1, 0, 0) +local meta = FindMetaTable("Player") + +function meta:GetMantle() + return self:GetDTInt(13) +end + +function meta:SetMantle(value) + return self:SetDTInt(13, value) +end + +function meta:GetMantleLerp() + return self:GetDTFloat(13) +end + +function meta:SetMantleLerp(value) + return self:SetDTFloat(13, value) +end + +function meta:GetMantleStartPos() + return self:GetDTVector(13) +end + +function meta:SetMantleStartPos(value) + return self:SetDTVector(13, value) +end + +function meta:GetMantleEndPos() + return self:GetDTVector(14) +end + +function meta:SetMantleEndPos(value) + return self:SetDTVector(14, value) +end + +local function PlayVaultAnim(ply, legs, ang) + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) and activewep:GetClass() == "runnerhands" and activewep:GetSequence() == 17 then + activewep:SendWeaponAnim(ACT_VM_DRAW) + end + + if game.SinglePlayer() and SERVER then + local ang = ang or ply:EyeAngles() + ang.x = 0 + ang.z = 0 + + ply:SetNW2Angle("SPOrigEyeAng", ang) + ply:SendLua("LocalPlayer().OrigEyeAng=LocalPlayer():GetNW2Angle(\"SPOrigEyeAng\")") + + return + end + + if CLIENT then + local ang = ang or ply:EyeAngles() + ang.x = 0 + ang.z = 0 + ply.OrigEyeAng = ang + end +end + +local function Vault1(ply, mv, ang, t, h) + local mins, maxs = ply:GetHull() + t.start = mv:GetOrigin() + eyevec + ang:Forward() * 25 + t.endpos = t.start - neckvec + t.filter = ply + + TraceParkourMask(t) + + t = util.TraceLine(t) + + if t.Entity and t.Entity.NoPlayerCollisions then + return false + end + + if t.Entity and t.Entity.IsNPC and t.Entity:IsPlayer() then + return false + end + + if IsValid(t.Entity) and t.Entity:GetClass() == "br_swingbar" then + return false + end + + if t.Hit and t.Fraction > 0.3 then + local stepup = t.Fraction > 0.65 + local vaultend = stepup and t.HitPos + mantlevec or t.HitPos + ang:Forward() * 50 + mantlevec + local tsafety = {} + local tsafetyout = nil + local start = t.StartPos - ang:Forward() * 50 + + TraceSetData(tsafety, start, t.StartPos, mins, maxs, ply) + TraceParkourMask(tsafety) + + tsafetyout = util.TraceLine(tsafety) + + if tsafetyout.Hit then + return false + end + + TraceSetData(tsafety, t.HitPos, t.HitPos, mins, maxs, ply) + + tsafetyout = util.TraceHull(tsafety) + + if tsafetyout.Hit then + return false + end + + TraceParkourMask(h) + TraceSetData(h, vaultend, vaultend, mins, maxs, ply) + + local hulltr = util.TraceHull(h) + + if hulltr.Hit then + vaultend = stepup and t.HitPos + ang:Forward() * 50 + mantlevec or t.HitPos + mantlevec + + TraceSetData(h, vaultend, vaultend, mins, maxs, ply) + + hulltr = util.TraceHull(h) + stepup = not stepup + end + + if not hulltr.Hit then + if t.HitNormal.x ~= 0 then + t.HitPos.z = t.HitPos.z + 12 + end + + local mat = t.MatType + local start = mv:GetOrigin() + eyevec + local vaultendcheck = Vector(vaultend) + vaultendcheck.z = vaultendcheck.z + 64 + + TraceSetData(t, start, vaultendcheck, ply) + + t = util.TraceLine(t) + + if t.Hit then + return + end + + ply:SetMantleStartPos(mv:GetOrigin()) + ply:SetMantleEndPos(vaultend) + ply:SetMantleLerp(0) + ply:SetMantle(1) + ply:SetWallrunTime(0) + PlayVaultAnim(ply) + ply:ViewPunch(vpunch1) + + ply.MantleInitVel = mv:GetVelocity() + ply.MantleMatType = mat + + if stepup then + ParkourEvent("stepup", ply) + + ply.VaultStepUp = true + else + ParkourEvent("vaultonto", ply) + + ply.VaultStepUp = false + end + + if game.SinglePlayer() then + ply:PlayStepSound(1) + end + + return true + end + end + + return false +end + +local function Vault2(ply, mv, ang, t, h) + if ply:GetWallrun() == 1 then + local highvault = Vault4(ply, mv, ang, t, h) + + if highvault then + if CLIENT then + BodyAnimSetEase(mv:GetOrigin()) + elseif game.SinglePlayer() then + ply:SetNW2Vector("SPBAEase", mv:GetOrigin()) + ply:SendLua("BodyAnimSetEase(LocalPlayer():GetNW2Vector('SPBAEase'))") + end + end + + return highvault + end + + local mins, maxs = ply:GetHull() + maxs.z = maxs.z * 0.5 + local start = mv:GetOrigin() + chestvec + ang:Forward() * 35 + + TraceSetData(t, start, start, mins, maxs, ply) + TraceParkourMask(t) + + local vaultpos = t.endpos + ang:Forward() * 35 + t = util.TraceHull(t) + + if t.Entity and t.Entity.NoPlayerCollisions then + return false + end + + if t.Entity and t.Entity.IsNPC and t.Entity:IsPlayer() then + return false + end + + if IsValid(t.Entity) and t.Entity:GetClass() == "br_swingbar" then + return false + end + + if t.Hit then + local tsafety = {} + local tsafetyout = {} + local start = nil + + TraceParkourMask(tsafety) + + tsafety.output = tsafetyout + start = mv:GetOrigin() + eyevec + + TraceSetData(tsafety, start, start + ang:Forward() * 100, mins, maxs, ply) + util.TraceLine(tsafety) + + if tsafetyout.Hit then + return false + end + + start = start + ang:Forward() * 100 + + TraceSetData(tsafety, start, start - thoraxvec) + util.TraceLine(tsafety) + + if tsafetyout.Hit then + return false + end + + start = t.StartPos + chestvec + + TraceSetData(h, start, start, mins, maxs, ply) + TraceParkourMask(h) + + local hulltr = util.TraceHull(h) + mins, maxs = ply:GetHull() + + TraceSetData(h, vaultpos, vaultpos, mins, maxs, ply) + + local hulltr2 = util.TraceHull(h) + + if not hulltr.Hit and not hulltr2.Hit then + if t.MatType == MAT_GRATE and (CLIENT_IFTP() or game.SinglePlayer()) then + ply:EmitSound("FenceClimb") + end + + ply:SetMantleData(mv:GetOrigin(), vaultpos, 0, 2) + ply:SetWallrunTime(0) + PlayVaultAnim(ply, 1) + ply:ViewPunch(vpunch2) + + ply.MantleInitVel = mv:GetVelocity() + ply.MantleInitVel.z = 0 + ply.MantleMatType = t.MatType + + ParkourEvent("vault", ply) + + if game.SinglePlayer() or CLIENT and IsFirstTimePredicted() then + timer.Simple(0.1, function () + ply:EmitSound("Cloth.VaultSwish") + ply:FaithVO("Faith.StrainSoft") + end) + ply:EmitSound("Handsteps.ConcreteHard") + end + + return true + end + end + + return false +end + +local function Vault3(ply, mv, ang, t, h) + local mins, maxs = ply:GetHull() + maxs.z = maxs.z * 0.5 + t.start = mv:GetOrigin() + chestvec + ang:Forward() * 35 + t.endpos = t.start + t.filter = ply + + TraceParkourMask(t) + + t.maxs = maxs + t.mins = mins + local vaultpos = t.endpos + ang:Forward() * 60 + t = util.TraceHull(t) + + if t.Entity and t.Entity.NoPlayerCollisions then + return false + end + + if t.Entity and t.Entity.IsNPC and (t.Entity:IsNPC() or t.Entity:IsPlayer()) then + return false + end + + if IsValid(t.Entity) and t.Entity:GetClass() == "br_swingbar" then + return false + end + + if t.Hit then + local tsafety = {} + local tsafetyout = {} + local start = nil + + TraceParkourMask(tsafety) + + tsafety.output = tsafetyout + start = mv:GetOrigin() + eyevec + + TraceSetData(tsafety, start, start + ang:Forward() * 150, ply) + util.TraceLine(tsafety) + + if tsafetyout.Hit then + return false + end + + start = mv:GetOrigin() + eyevec + ang:Forward() * 150 + + TraceSetData(tsafety, start, start - thoraxvec) + util.TraceLine(tsafety) + + if tsafetyout.Hit then + return false + end + + start = mv:GetOrigin() + eyevec + ang:Forward() * 150 + + TraceSetData(tsafety, start, start - aircheck) + util.TraceLine(tsafety) + + if not tsafetyout.Hit then + return false + end + + mins.z = mins.z * 1 + h.start = t.StartPos + chestvec + h.endpos = h.start + h.filter = ply + h.maxs = maxs + h.mins = mins + + TraceParkourMask(h) + + local hulltr = util.TraceHull(h) + local mins, maxs = ply:GetHull() + h.start = vaultpos + h.endpos = h.start + h.filter = ply + h.maxs = maxs + h.mins = mins + local hulltr2 = util.TraceHull(h) + + if not hulltr.Hit and not hulltr2.Hit then + if t.MatType == MAT_GRATE and (CLIENT_IFTP() or game.SinglePlayer()) then + ply:EmitSound("FenceClimb") + end + + ply:SetMantleData(mv:GetOrigin(), vaultpos, 0, 3) + ply:SetWallrunTime(0) + PlayVaultAnim(ply, 2) + ply:ViewPunch(vpunch3) + + ply.MantleInitVel = mv:GetVelocity() + ply.MantleInitVel.z = 0 + ply.MantleMatType = t.MatType + + ParkourEvent("vaultkong", ply) + + if game.SinglePlayer() or CLIENT and IsFirstTimePredicted() then + timer.Simple(0.1, function () + ply:EmitSound("Cloth.VaultSwish") + ply:FaithVO("Faith.StrainSoft") + end) + ply:EmitSound("Handsteps.ConcreteHard") + end + + return true + end + end + + return false +end + +function Vault4(ply, mv, ang, t, h) + local mins, maxs = ply:GetHull() + t.StartPos = mv:GetOrigin() + eyevec + ang:Forward() * 50 + local vaultpos = mv:GetOrigin() + ang:Forward() * 65 + vault1vec + local tsafety = { + start = mv:GetOrigin() + hairvec + } + tsafety.endpos = tsafety.start + ang:Forward() * 75 + tsafety.filter = ply + tsafety.mask = MASK_PLAYERSOLID + tsafety.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + local tsafetyout = util.TraceLine(tsafety) + + if tsafetyout.Hit then + return false + end + + tsafety.start = mv:GetOrigin() + aircheck + ang:Forward() * 40 + tsafety.endpos = tsafety.start - hairvec + local tsafetyout = util.TraceLine(tsafety) + + if tsafetyout.Hit then + return false + end + + tsafety.start = mv:GetOrigin() + chestvec + tsafety.endpos = tsafety.start + ang:Forward() * 150 + local tsafetyout = util.TraceLine(tsafety) + + if not tsafetyout.Hit then + return false + end + + mins.z = mins.z * 1 + h.start = vaultpos + h.endpos = vaultpos + h.filter = ply + h.mask = MASK_PLAYERSOLID + h.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + h.maxs = maxs + h.mins = mins + local hsafetyout = util.TraceHull(h) + + if hsafetyout.Hit then + return false + end + + local startpos = ply:GetWallrun() ~= 1 and mv:GetOrigin() or mv:GetOrigin() + Vector(0, 0, 20) - ang:Forward() * 5 + + ply:SetMantleData(startpos, vaultpos, 0, 4) + ply:SetWallrunTime(0) + PlayVaultAnim(ply, 1) + ply:ViewPunch(Angle(2.5, 0, 0)) + + ply.MantleInitVel = mv:GetVelocity() + ply.MantleInitVel.z = 0 + ply.MantleMatType = t.MatType + + ParkourEvent("vaulthigh", ply) + + if CLIENT then + CamIgnoreAng = false + elseif game.SinglePlayer() then + ply:SendLua("CamIgnoreAng=false") + end + + if game.SinglePlayer() or CLIENT and IsFirstTimePredicted() then + timer.Simple(0.1, function () + ply:EmitSound("Cloth.VaultSwish") + ply:FaithVO("Faith.StrainSoft") + end) + ply:EmitSound("Handsteps.ConcreteHard") + end + + if CLIENT and IsFirstTimePredicted() or game.SinglePlayer() then + tsafety.start = ply:EyePos() + tsafety.endpos = tsafety.start + ang:Forward() * 100 + local tsafetyout = util.TraceLine(tsafety) + + if tsafetyout.MatType == MAT_GRATE then + ply:EmitSound("FenceClimb") + timer.Simple(0.45, function () + ply:EmitSound("FenceClimbEnd") + end) + end + end + + return true +end + +function Vault5(ply, mv, ang, t, h) + if ply:GetWallrun() == 1 and ply:GetWallrunTime() - CurTime() < 0.75 then + return false + end + + if mv:GetVelocity().z < (not ply:GetDive() and -100 or -1000) then + return false + end + + local eyevec = not ply:Crouching() and eyevec or eyevecduck + local neckvec = not ply:Crouching() and neckvec or neckvecduck + t.start = mv:GetOrigin() + eyevec + ang:Forward() * 70 + t.endpos = t.start - neckvec + t.filter = ply + t.mask = MASK_PLAYERSOLID + t.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + t = util.TraceLine(t) + + if not t.Hit then + return false + end + + if t.Entity and t.Entity.NoPlayerCollisions then + return false + end + + local vaultend = t.HitPos + mantlevec + local tsafety = { + start = t.StartPos - ang:Forward() * 70, + endpos = t.StartPos, + filter = ply, + mask = MASK_PLAYERSOLID, + collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + } + tsafety = util.TraceLine(tsafety) + + if tsafety.Hit then + return false + end + + tsafety.start = mv:GetOrigin() + hairvec + tsafety.endpos = tsafety.start + ang:Forward() * 60 + local tsafetyout = util.TraceLine(tsafety) + + if tsafetyout.Hit then + return false + end + + h.start = vaultend + h.endpos = h.start + h.filter = ply + h.mask = MASK_PLAYERSOLID + h.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + h.mins, h.maxs = ply:GetHull() + local hulltr = util.TraceHull(h) + + if not hulltr.Hit then + if t.HitNormal.x ~= 0 then + t.HitPos.z = t.HitPos.z + 12 + end + + ply:SetMantleStartPos(mv:GetOrigin()) + ply:SetMantleEndPos(vaultend) + ply:SetMantleLerp(0) + ply:SetMantle(5) + ply:SetWallrunTime(0) + PlayVaultAnim(ply, false, ang) + ply:ViewPunch(vpunch1) + + ply.MantleInitVel = mv:GetVelocity() + ply.MantleMatType = t.MatType + + ParkourEvent("vaultontohigh", ply) + + if game.SinglePlayer() then + ply:PlayStepSound(1) + end + + return true + end + + return false +end + +hook.Add("SetupMove", "BeatrunVaulting", function (ply, mv, cmd) + if ply.MantleDisabled or IsValid(ply:GetSwingbar()) or ply:GetClimbing() ~= 0 or ply:GetMelee() ~= 0 then + return + end + + if not ply:Alive() then + if ply:GetMantle() ~= 0 then + ply:SetMantle(0) + end + + return + end + + if ply:GetMantle() == 0 then + local mvtype = ply:GetMoveType() + + if ply:OnGround() or mv:GetVelocity().z < -350 or mvtype == MOVETYPE_NOCLIP or mvtype == MOVETYPE_LADDER then + return + end + end + + ply.mantletr = ply.mantletr or {} + ply.mantlehull = ply.mantlehull or {} + local t = ply.mantletr + local h = ply.mantlehull + + if not h.filter then + h.filter = ply + h.mins, h.maxs = ply:GetHull() + end + + if ply:GetMantle() == 0 and not ply:OnGround() and mv:KeyDown(IN_FORWARD) and not mv:KeyDown(IN_DUCK) and not ply:Crouching() then + local ang = mv:GetAngles() + ang.x = 0 + ang.z = 0 + + if not Vault2(ply, mv, ang, t, h) and not Vault3(ply, mv, ang, t, h) then + Vault1(ply, mv, ang, t, h) + end + end + + if ply:GetMantle() ~= 0 then + mv:SetMaxClientSpeed(0) + mv:SetSideSpeed(0) + mv:SetUpSpeed(0) + mv:SetForwardSpeed(0) + cmd:ClearMovement() + mv:SetVelocity(vector_origin) + ply:SetMoveType(MOVETYPE_NOCLIP) + + local mantletype = ply:GetMantle() + local mlerp = ply:GetMantleLerp() + local FT = FrameTime() + local TargetTick = 1 / FT / 66.66 + local mlerpend = mantletype == 1 and 0.8 or 1 + local mlerprate = (mantletype == 1 and 0.075 or 0.06) / TargetTick + local mvec = LerpVector(ply:GetMantleLerp(), ply:GetMantleStartPos(), ply:GetMantleEndPos()) + + mv:SetOrigin(mvec) + + if mantletype == 1 then + if not ply.VaultStepUp and mlerp > 0.01 and mlerp < 0.65 then + mlerprate = mlerprate * mlerp / 0.5 + + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(0.1 / (mlerp / 0.25), 0, 0.05)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(0.33 / (mlerp / 0.25), 0, 0.05)) + end + end + + ply:SetMantleLerp(Lerp(mlerprate, mlerp, 1)) + elseif mantletype == 2 then + ply:SetMEMoveLimit(500) + ply:SetMESprintDelay(-1) + + mlerprate = mlerprate * 0.75 + + if mlerp < 0.25 then + if mlerp > 0.1 then + local mult = math.max(0.5, 0.5 + ply.MantleInitVel:Length() / 375 * 0.3 - 0.2) + mlerprate = mlerprate * mult + end + + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(0.25 * mlerp / 0.2, -0.05, -0.15)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(0.75 * mlerp / 0.2, -0.25, -0.5)) + end + elseif mlerp > 0.45 and mlerp < 0.7 then + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(-0.15, 0.1, 0.15)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(-0.75, 0.25, 0.5)) + end + end + + ply:SetMantleLerp(math.Approach(mlerp, 1, mlerprate)) + elseif mantletype == 3 then + if mlerp < 0.45 then + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(0.15, 0, 0)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(0.3, 0, 0)) + end + elseif mlerp > 0.45 and mlerp < 0.8 then + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(-0.05, 0, 0)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(-0.25, 0, 0)) + end + end + + local mult = math.max(0.75, 0.75 + ply.MantleInitVel:Length() / 350 * 0.3 - 0.2) + mlerprate = mlerprate * mult + + ply:SetMantleLerp(math.Approach(mlerp, 1, mlerprate)) + elseif mantletype == 4 then + mlerprate = 0.03 / TargetTick + + if mlerp < 0.0575 then + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(0.25 * mlerp / 0.2, 0, -0.25)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(0.75 * mlerp / 0.1, 0, -0.5)) + end + + mlerprate = mlerprate * 0.1 + elseif CLIENT_IFTP() then + ply:CLViewPunch(Angle(-0.05, 0, 0.25 / (mlerp / 0.3))) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(-0.15, 0, 0.5 / (mlerp / 0.3))) + end + + if mlerp > 0.3 then + mlerprate = mlerprate * 1.5 + end + + ply:SetMantleLerp(math.Approach(mlerp, 1, mlerprate)) + elseif mantletype == 5 then + mlerprate = 0.03 / TargetTick + + if mlerp < 0.0575 then + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(-0.15 * mlerp / 0.1, 0, -0.25)) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(0.15 * mlerp / 0.1, 0, -0.5)) + end + + mlerprate = mlerprate * 0.1 + else + if CLIENT_IFTP() then + ply:CLViewPunch(Angle(0.01, 0, 0.5 / (mlerp / 0.15))) + elseif game.SinglePlayer() then + ply:ViewPunch(Angle(-0.05, 0, 0.5 / (mlerp / 0.3))) + end + + if mlerp < 0.7 then + mlerprate = mlerprate * 0.8 + else + mlerprate = mlerprate * 0.6 + end + end + + ply:SetMantleLerp(math.Approach(mlerp, 1, mlerprate)) + end + + mlerp = ply:GetMantleLerp() + h.start = mvec + h.endpos = h.start + h.filter = ply + h.mask = MASK_PLAYERSOLID + h.mins, h.maxs = ply:GetHull() + local hulltr = util.TraceHull(h) + + if mlerpend <= mlerp or not hulltr.Hit and (mantletype == 1 and mlerp > 0.4 or mantletype == 2 and mlerp > 0.5 or mantletype == 5 and mlerp > 0.75) then + local ang = mv:GetAngles() + ang.x = 0 + ang.z = 0 + + if mantletype >= 2 and mantletype ~= 4 and mantletype ~= 5 then + mv:SetVelocity(ang:Forward() * math.Clamp(ply.MantleInitVel:Length(), 200, 600)) + end + + ply:SetViewOffsetDucked(Vector(0, 0, 32)) + ply:SetMantle(0) + ply:SetMoveType(MOVETYPE_WALK) + + if hulltr.Hit then + mv:SetOrigin(ply:GetMantleEndPos()) + end + + if mantletype == 4 then + mv:SetVelocity(ang:Forward() * 150) + ply:SetMEMoveLimit(150) + end + + if mv:KeyDown(IN_JUMP) and mantletype < 4 then + if CLIENT_IFTP() then + BodyLimitX = 90 + BodyLimitY = 180 + elseif game.SinglePlayer() then + ply:SendLua("BodyLimitX=90 BodyLimitY=180") + end + + ply:ViewPunch(Angle(-2.5, 0, 0)) + ParkourEvent("springboard", ply) + + if IsFirstTimePredicted() then + if game.SinglePlayer() or CLIENT then + ply:EmitSound("Cloth.VaultSwish") + end + + if ply.MantleMatType == 77 or ply.MantleMatType == 86 then + ply:EmitSound("Metal.Ringout") + end + + hook.Run("PlayerFootstep", ply, mv:GetOrigin(), 1, "Footsteps.Concrete", 1) + end + + local springboardvel = ang:Forward() * math.Clamp((ply.MantleInitVel or vector_origin):Length() * 0.75, 200, 300) + Vector(0, 0, 350) + + springboardvel:Mul(ply:GetOverdriveMult()) + + springboardvel[3] = springboardvel[3] / ply:GetOverdriveMult() + + mv:SetVelocity(springboardvel) + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) and activewep:GetClass() == "runnerhands" and mantletype == 1 then + activewep:SendWeaponAnim(ACT_VM_RECOIL1) + end + end + else + mv:SetButtons(0) + end + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Wallrun.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Wallrun.lua new file mode 100644 index 0000000..fa898d8 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Wallrun.lua @@ -0,0 +1,541 @@ +local vwrtime = 1.5 +local hwrtime = 1.5 +tiltdir = 1 +local tilt = 0 +PuristWallrun = CreateConVar("Beatrun_PuristWallrun", 1, { + FCVAR_REPLICATED, + FCVAR_ARCHIVE +}, "'Realistic' wallrunning", 0, 1) + +function WallrunningTilt(ply, pos, ang, fov) + local wr = ply:GetWallrun() + + if wr < 2 and tilt == 0 then + hook.Remove("CalcViewBA", "WallrunningTilt") + + return + end + + ang.z = ang.z + tilt + local tiltspeed = wr >= 2 and math.max(math.abs(tilt / 15 * tiltdir - 1) * 1.75, 0.1) or 1 + tilt = math.Approach(tilt, wr >= 2 and 15 * tiltdir or 0, RealFrameTime() * (wr >= 2 and 30 or 70) * tiltspeed) +end + +if SERVER then + util.AddNetworkString("BodyAnimWallrun") + util.AddNetworkString("WallrunTilt") +end + +if CLIENT and game.SinglePlayer() then + net.Receive("BodyAnimWallrun", function () + local a = net.ReadBool() + + if a then + local ply = LocalPlayer() + local eyeang = ply:EyeAngles() + eyeang.x = 0 + ply.WallrunOrigAng = net.ReadAngle() + BodyLimitX = 25 + BodyLimitY = 70 + BodyAnimCycle = 0 + + BodyAnim:SetSequence("wallrunverticalstart") + else + BodyLimitX = 90 + BodyLimitY = 180 + BodyAnimCycle = 0 + + BodyAnim:SetSequence("jumpair") + end + end) + net.Receive("WallrunTilt", function () + if net.ReadBool() then + tiltdir = -1 + else + tiltdir = 1 + end + + hook.Add("CalcViewBA", "WallrunningTilt", WallrunningTilt) + end) +end + +local wrmins = Vector(-16, -16, 0) +local wrmaxs = Vector(16, 16, 16) + +local function WallrunningThink(ply, mv, cmd) + local wr = ply:GetWallrun() + + if wr ~= 0 and ply:OnGround() then + ply:SetWallrunTime(0) + end + + if mv:KeyPressed(IN_DUCK) then + ply:SetCrouchJumpBlocked(true) + ply:SetWallrunTime(0) + mv:SetButtons(mv:GetButtons() - IN_DUCK) + end + + local wrtimeremains = CurTime() < ply:GetWallrunTime() + + if PuristWallrun:GetBool() then + PuristWallrunningThink(ply, mv, cmd, wr, wrtimeremains) + + return + end + + if wr == 4 then + local ang = cmd:GetViewAngles() + ang.x = 0 + local vel = ang:Forward() * 30 + vel.z = 25 + + mv:SetVelocity(vel) + mv:SetSideSpeed(0) + mv:SetForwardSpeed(0) + + if ply:GetWallrunTime() < CurTime() or mv:GetVelocity():Length() < 10 then + ply:SetWallrun(0) + ply:SetQuickturn(false) + mv:SetVelocity(vel * 4) + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) then + usingrh = activewep:GetClass() == "runnerhands" + end + + if usingrh then + activewep:SendWeaponAnim(ACT_VM_HITCENTER) + activewep:SetBlockAnims(false) + end + + return + end + + if mv:KeyPressed(IN_JUMP) then + ParkourEvent("jumpwallrun", ply) + ply:SetSafetyRollKeyTime(CurTime() + 0.001) + + vel.z = 30 + + vel:Mul(ply:GetOverdriveMult()) + mv:SetVelocity(vel * 8) + ply:SetWallrun(0) + ply:SetQuickturn(false) + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) then + usingrh = activewep:GetClass() == "runnerhands" + end + + if usingrh then + activewep:SendWeaponAnim(ACT_VM_HITCENTER) + activewep:SetBlockAnims(false) + end + end + + return + end + + if wr == 1 and wrtimeremains then + local velz = math.Clamp((ply:GetWallrunTime() - CurTime()) / vwrtime, 0.1, 1) + local vecvel = Vector() + vecvel.z = 200 * velz + + vecvel:Add(ply:GetWallrunDir():Angle():Forward() * -50) + vecvel:Mul(ply:GetOverdriveMult()) + mv:SetVelocity(vecvel) + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + + local tr = ply.WallrunTrace + local trout = ply.WallrunTraceOut + local eyeang = ply.WallrunOrigAng or Angle() + eyeang.x = 0 + tr.start = ply:EyePos() - Vector(0, 0, 5) + tr.endpos = tr.start + eyeang:Forward() * 40 + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if not trout.Hit then + ply:SetWallrunTime(0) + end + + if mv:KeyPressed(IN_JUMP) and (mv:KeyDown(IN_MOVELEFT) or mv:KeyDown(IN_MOVERIGHT)) then + local dir = mv:KeyDown(IN_MOVERIGHT) and 1 or -1 + local vel = mv:GetVelocity() + vel.z = 250 + + mv:SetVelocity(vel + eyeang:Right() * 150 * dir) + + local event = ply:GetWallrun() == 3 and "jumpwallrunright" or "jumpwallrunleft" + + ParkourEvent(event, ply) + + if IsFirstTimePredicted() then + ply:EmitSound("Wallrun.Concrete") + end + end + end + + if wr >= 2 and wrtimeremains then + local dir = wr == 2 and 1 or -1 + + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + + local ovel = ply:GetWallrunOrigVel() + local vecvel = ply:GetWallrunDir():Angle():Right() * dir * math.max(ovel:Length() + 50, 75) + + if ovel:Length() > 400 then + ovel:Mul(0.975) + ply:SetWallrunOrigVel(ovel) + end + + local tr = ply.WallrunTrace + local trout = ply.WallrunTraceOut + local mins, maxs = ply:GetCollisionBounds() + mins.z = -32 + + if not ply:GetWallrunElevated() then + tr.start = mv:GetOrigin() + tr.endpos = tr.start + tr.maxs = maxs + tr.mins = mins + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceHull(tr) + end + + if not ply:GetWallrunElevated() and trout.Hit then + vecvel.z = 100 + elseif not ply:GetWallrunElevated() and not trout.Hit then + ply:SetWallrunElevated(true) + end + + if ply:GetWallrunElevated() then + vecvel.z = 5 + math.Clamp(-(CurTime() - ply:GetWallrunTime() + 0.8) * 250, -400, 25) + end + + if vecvel:Length() > 300 then + vecvel:Mul(ply:GetOverdriveMult()) + end + + mv:SetVelocity(vecvel) + + local eyeang = ply:EyeAngles() + eyeang.x = 0 + + if ply:GetVelocity():Length() <= 75 then + ply:SetWallrunTime(0) + end + + tr.start = ply:EyePos() + tr.endpos = tr.start + eyeang:Right() * 45 * dir + tr.maxs = wrmaxs + tr.mins = wrmins + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceHull(tr) + + if not trout.Hit and ply:GetWallrunTime() - CurTime() < hwrtime * 0.7 then + tr.start = ply:EyePos() + tr.endpos = tr.start + eyeang:Forward() * -60 + tr.filter = ply + tr.output = trout + + util.TraceLine(tr) + + if not trout.Hit then + ply:SetWallrunTime(0) + else + if not ply:GetWallrunDir():IsEqualTol(trout.HitNormal, 0.75) then + ply:SetWallrunTime(0) + end + + ply:SetWallrunDir(trout.HitNormal) + end + elseif ply:GetWallrunTime() - CurTime() < hwrtime * 0.7 then + tr.start = ply:EyePos() + tr.endpos = tr.start + eyeang:Right() * 45 * dir + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if trout.Hit and ply:GetWallrunDir():IsEqualTol(trout.HitNormal, 0.75) then + ply:SetWallrunDir(trout.HitNormal) + end + end + + if mv:KeyPressed(IN_JUMP) and ply:GetWallrunTime() - CurTime() ~= hwrtime then + ply:SetQuickturn(false) + ply:SetWallrunTime(0) + ply:SetSafetyRollKeyTime(CurTime() + 0.001) + mv:SetVelocity(eyeang:Forward() * math.max(150, vecvel:Length() - 50) + Vector(0, 0, 250)) + + local event = ply:GetWallrun() == 3 and "jumpwallrunright" or "jumpwallrunleft" + + ParkourEvent(event, ply) + + if IsFirstTimePredicted() then + ply:EmitSound("Wallrun.Concrete") + end + end + end + + if ply:GetWallrunSoundTime() < CurTime() then + local delay = nil + local wr = ply:GetWallrun() + + if wr == 1 then + delay = math.Clamp(math.abs(ply:GetWallrunTime() - CurTime() - 2.75) / vwrtime * 0.165, 0.175, 0.3) + else + delay = math.Clamp(math.abs(ply:GetWallrunTime() - CurTime() - 2.75) / hwrtime * 0.165, 0.15, 1.75) + end + + if SERVER then + ply:EmitSound("Wallrun.Concrete") + timer.Simple(0.025, function () + ply:EmitSound("WallrunRelease.Concrete") + end) + end + + ply:SetWallrunSoundTime(CurTime() + delay) + ply:ViewPunch(Angle(0.25, 0, 0)) + end + + if ply:GetWallrunTime() < CurTime() or mv:GetVelocity():Length() < 10 then + if ply.vwrturn == 0 then + ply:SetQuickturn(false) + end + + if CLIENT and IsFirstTimePredicted() and wr == 1 then + BodyLimitX = 90 + BodyLimitY = 180 + BodyAnimCycle = 0 + + BodyAnim:SetSequence("jumpair") + elseif game.SinglePlayer() and wr == 1 then + net.Start("BodyAnimWallrun") + net.WriteBool(false) + net.Send(ply) + end + + ply:SetWallrun(0) + + return + end +end + +local upcheck = Vector(0, 0, 75) + +local function WallrunningCheck(ply, mv, cmd) + if not ply.WallrunTrace then + ply.WallrunTrace = {} + ply.WallrunTraceOut = {} + end + + local eyeang = ply:EyeAngles() + eyeang.x = 0 + local vel = mv:GetVelocity() + vel.z = 0 + local timemult = math.max(1 - math.max(ply:GetWallrunCount() - 1, 0) * 0.2, 0.5) + local speedmult = math.max(0.9, math.min(vel:Length(), 260) / 250) + + if ply:GetGrappling() then + return + end + + if ply:GetJumpTurn() then + return + end + + if PuristWallrun:GetBool() then + PuristWallrunningCheck(ply, mv, cmd, vel, eyeang, timemult, speedmult) + + return + end + + if not ply:OnGround() and mv:KeyDown(IN_JUMP) and mv:GetVelocity().z > -200 then + local tr = ply.WallrunTrace + local trout = ply.WallrunTraceOut + tr.start = ply:EyePos() - Vector(0, 0, 15) + tr.endpos = tr.start + eyeang:Forward() * 25 + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if trout.HitNormal:IsEqualTol(ply:GetWallrunDir(), 0.25) then + return + end + + if trout.Entity and trout.Entity.IsNPC and (trout.Entity.NoWallrun or trout.Entity:IsNPC() or trout.Entity:IsPlayer()) then + return false + end + + if trout.Hit and timemult > 0.5 then + tr.start = tr.start + Vector(0, 0, 10) + tr.endpos = tr.start + eyeang:Forward() * 30 + + util.TraceLine(tr) + + if trout.Hit then + local angdir = trout.HitNormal:Angle() + angdir.y = angdir.y - 180 + local wallnormal = trout.HitNormal + local eyeang = Angle(angdir) + eyeang.x = 0 + tr.start = ply:EyePos() - Vector(0, 0, 5) + tr.endpos = tr.start + eyeang:Forward() * 40 + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if not trout.Hit then + return + end + + if SERVER then + ply:EmitSound("Bump.Concrete") + end + + ply.WallrunOrigAng = angdir + + ply:SetWallrunData(1, CurTime() + vwrtime * timemult * speedmult, wallnormal) + ply:ViewPunch(Angle(-5, 0, 0)) + ParkourEvent("wallrunv", ply) + + if CLIENT_IFTP() then + BodyLimitX = 30 + BodyLimitY = 70 + BodyAnimCycle = 0 + + BodyAnim:SetSequence("wallrunverticalstart") + + ply.OrigEyeAng = angdir + elseif game.SinglePlayer() then + net.Start("BodyAnimWallrun") + net.WriteBool(true) + net.WriteAngle(angdir) + net.Send(ply) + end + + return + end + end + end + + if mv:KeyDown(IN_JUMP) and not ply:OnGround() or mv:KeyPressed(IN_JUMP) then + local tr = ply.WallrunTrace + local trout = ply.WallrunTraceOut + tr.start = ply:EyePos() + tr.endpos = tr.start + eyeang:Right() * 25 + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if trout.HitNormal:IsEqualTol(ply:GetWallrunDir(), 0.25) then + return + end + + if trout.Hit and trout.HitNormal:IsEqualTol(ply:GetEyeTrace().HitNormal, 0.1) then + local ovel = mv:GetVelocity() + ovel.z = 0 + + ply:SetWallrunOrigVel(ovel) + ply:SetWallrunElevated(false) + mv:SetVelocity(vector_origin) + ply:SetWallrunData(2, CurTime() + hwrtime * timemult, trout.HitNormal) + ParkourEvent("wallrunh", ply) + + if CLIENT and IsFirstTimePredicted() then + tiltdir = -1 + + hook.Add("CalcViewBA", "WallrunningTilt", WallrunningTilt) + elseif SERVER and game.SinglePlayer() then + net.Start("WallrunTilt") + net.WriteBool(true) + net.Send(ply) + end + + return + end + end + + if mv:KeyDown(IN_JUMP) and not ply:OnGround() or mv:KeyPressed(IN_JUMP) then + local tr = ply.WallrunTrace + local trout = ply.WallrunTraceOut + tr.start = ply:EyePos() + tr.endpos = tr.start + eyeang:Right() * -25 + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if trout.HitNormal:IsEqualTol(ply:GetWallrunDir(), 0.25) then + return + end + + if trout.Hit and trout.HitNormal:IsEqualTol(ply:GetEyeTrace().HitNormal, 0.1) then + local ovel = mv:GetVelocity() + ovel.z = 0 + + ply:SetWallrunOrigVel(ovel) + ply:SetWallrunDir(trout.HitNormal) + mv:SetVelocity(vector_origin) + ply:SetWallrunElevated(false) + ply:SetWallrunData(3, CurTime() + hwrtime * timemult, trout.HitNormal) + ParkourEvent("wallrunh", ply) + + if CLIENT and IsFirstTimePredicted() then + tiltdir = 1 + + hook.Add("CalcViewBA", "WallrunningTilt", WallrunningTilt) + elseif game.SinglePlayer() then + net.Start("WallrunTilt") + net.WriteBool(false) + net.Send(ply) + end + + return + end + end +end + +local vecdir = Vector(1000, 1000, 1000) + +hook.Add("SetupMove", "Wallrunning", function (ply, mv, cmd) + if ply:GetWallrun() == nil or not ply:Alive() then + ply:SetWallrun(0) + end + + if ply:GetWallrun() == 0 and mv:GetVelocity().z > -450 and not ply:OnGround() and mv:KeyDown(IN_FORWARD) and not ply:Crouching() and not mv:KeyDown(IN_DUCK) and ply:GetMoveType() ~= MOVETYPE_NOCLIP then + WallrunningCheck(ply, mv, cmd) + end + + if ply:GetWallrun() ~= 0 then + WallrunningThink(ply, mv, cmd) + end + + if ply:GetWallrun() == 0 and (ply:OnGround() or ply:GetGrappling() or ply:GetClimbing() ~= 0) then + ply:SetWallrunDir(vecdir) + ply:SetWallrunCount(0) + end +end) diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/WallrunME.lua b/beatrun/gamemodes/beatrun/gamemode/sh/WallrunME.lua new file mode 100644 index 0000000..ad11a40 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/WallrunME.lua @@ -0,0 +1,431 @@ +local vwrtime = 1.5 +local hwrtime = 1.5 +tiltdir = 1 +local tilt = 0 +local wrmins = Vector(-16, -16, 0) +local wrmaxs = Vector(16, 16, 16) + +function PuristWallrunningCheck(ply, mv, cmd, vel, eyeang, timemult, speedmult) + local downvel = mv:GetVelocity().z + + if downvel > -75 then + downvel = math.max(downvel, 10) + end + + timemult = math.Clamp(math.max(downvel * 0.1, -10), 0.5, 1.1) + + if not ply:OnGround() and mv:KeyDown(IN_JUMP) and mv:GetVelocity().z > -200 then + local tr = ply.WallrunTrace + local trout = ply.WallrunTraceOut + tr.start = ply:EyePos() - Vector(0, 0, 15) + tr.endpos = tr.start + eyeang:Forward() * 25 + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if trout.HitNormal:IsEqualTol(ply:GetWallrunDir(), 0.25) then + return + end + + if trout.Entity and trout.Entity.IsNPC and (trout.Entity.NoWallrun or trout.Entity:IsNPC() or trout.Entity:IsPlayer()) then + return false + end + + if trout.Hit and timemult > 0.5 then + tr.start = tr.start + Vector(0, 0, 10) + tr.endpos = tr.start + eyeang:Forward() * 30 + + util.TraceLine(tr) + + if trout.Hit then + local angdir = trout.HitNormal:Angle() + angdir.y = angdir.y - 180 + local wallnormal = trout.HitNormal + local eyeang = Angle(angdir) + eyeang.x = 0 + tr.start = ply:EyePos() - Vector(0, 0, 5) + tr.endpos = tr.start + eyeang:Forward() * 40 + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if not trout.Hit then + return + end + + if SERVER then + ply:EmitSound("Bump.Concrete") + end + + if ply:GetWallrunTime() - CurTime() > -2 then + timemult = math.max(1 - math.max(ply:GetWallrunCount() - 1, 0) * 0.4, 0.25) + else + ply:SetWallrunCount(0) + end + + ply.WallrunOrigAng = angdir + + ply:SetWallrunData(1, CurTime() + vwrtime * timemult * speedmult, wallnormal) + ply:ViewPunch(Angle(-5, 0, 0)) + ParkourEvent("wallrunv", ply) + + if CLIENT_IFTP() then + BodyLimitX = 30 + BodyLimitY = 70 + BodyAnimCycle = 0 + + BodyAnim:SetSequence("wallrunverticalstart") + + ply.OrigEyeAng = angdir + elseif game.SinglePlayer() then + net.Start("BodyAnimWallrun") + net.WriteBool(true) + net.WriteAngle(angdir) + net.Send(ply) + end + + return + end + end + end + + if not ply:OnGround() or mv:KeyPressed(IN_JUMP) then + local tr = ply.WallrunTrace + local trout = ply.WallrunTraceOut + tr.start = ply:EyePos() + tr.endpos = tr.start + eyeang:Right() * 25 + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if trout.HitNormal:IsEqualTol(ply:GetWallrunDir(), 0.25) then + return + end + + if trout.Hit and trout.HitNormal:IsEqualTol(ply:GetEyeTrace().HitNormal, 0.1) then + local ovel = mv:GetVelocity() * 0.85 + ovel.z = 0 + + ply:SetWallrunOrigVel(ovel) + ply:SetWallrunElevated(false) + mv:SetVelocity(vector_origin) + ply:SetWallrunData(2, CurTime() + hwrtime * timemult, trout.HitNormal) + ParkourEvent("wallrunh", ply) + ply:ViewPunch(Angle(0, 1, 0)) + + if CLIENT and IsFirstTimePredicted() then + tiltdir = -1 + + hook.Add("CalcViewBA", "WallrunningTilt", WallrunningTilt) + elseif SERVER and game.SinglePlayer() then + net.Start("WallrunTilt") + net.WriteBool(true) + net.Send(ply) + end + + return + end + end + + if not ply:OnGround() or mv:KeyPressed(IN_JUMP) then + local tr = ply.WallrunTrace + local trout = ply.WallrunTraceOut + tr.start = ply:EyePos() + tr.endpos = tr.start + eyeang:Right() * -25 + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if trout.HitNormal:IsEqualTol(ply:GetWallrunDir(), 0.25) then + return + end + + if trout.Hit and trout.HitNormal:IsEqualTol(ply:GetEyeTrace().HitNormal, 0.1) then + local ovel = mv:GetVelocity() * 0.85 + ovel.z = 0 + + ply:SetWallrunOrigVel(ovel) + ply:SetWallrunDir(trout.HitNormal) + mv:SetVelocity(vector_origin) + ply:SetWallrunElevated(false) + ply:SetWallrunData(3, CurTime() + hwrtime * timemult, trout.HitNormal) + ParkourEvent("wallrunh", ply) + ply:ViewPunch(Angle(0, -1, 0)) + + if CLIENT and IsFirstTimePredicted() then + tiltdir = 1 + + hook.Add("CalcViewBA", "WallrunningTilt", WallrunningTilt) + elseif game.SinglePlayer() then + net.Start("WallrunTilt") + net.WriteBool(false) + net.Send(ply) + end + + return + end + end +end + +function PuristWallrunningThink(ply, mv, cmd, wr, wrtimeremains) + if wr == 4 then + local ang = cmd:GetViewAngles() + ang.x = 0 + local vel = ang:Forward() * 30 + vel.z = 25 + + mv:SetVelocity(vel) + mv:SetSideSpeed(0) + mv:SetForwardSpeed(0) + + if ply:GetWallrunTime() < CurTime() or mv:GetVelocity():Length() < 10 then + ply:SetWallrun(0) + ply:SetQuickturn(false) + mv:SetVelocity(vel * 4) + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) then + usingrh = activewep:GetClass() == "runnerhands" + end + + if usingrh then + activewep:SendWeaponAnim(ACT_VM_HITCENTER) + activewep:SetBlockAnims(false) + end + + return + end + + if mv:KeyPressed(IN_JUMP) then + ParkourEvent("jumpwallrun", ply) + ply:SetSafetyRollKeyTime(CurTime() + 0.001) + + vel.z = 30 + + vel:Mul(ply:GetOverdriveMult()) + mv:SetVelocity(vel * 8) + ply:SetWallrun(0) + ply:SetQuickturn(false) + + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) then + usingrh = activewep:GetClass() == "runnerhands" + end + + if usingrh then + activewep:SendWeaponAnim(ACT_VM_HITCENTER) + activewep:SetBlockAnims(false) + end + end + + return + end + + if wr == 1 and wrtimeremains then + local velz = math.Clamp((ply:GetWallrunTime() - CurTime()) / vwrtime, 0.1, 1) + local vecvel = Vector() + vecvel.z = 200 * velz + + vecvel:Add(ply:GetWallrunDir():Angle():Forward() * -50) + vecvel:Mul(ply:GetOverdriveMult()) + mv:SetVelocity(vecvel) + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + + local tr = ply.WallrunTrace + local trout = ply.WallrunTraceOut + local eyeang = ply.WallrunOrigAng or Angle() + eyeang.x = 0 + tr.start = ply:EyePos() - Vector(0, 0, 5) + tr.endpos = tr.start + eyeang:Forward() * 40 + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if not trout.Hit then + ply:SetWallrunTime(0) + end + + if mv:KeyPressed(IN_JUMP) and (mv:KeyDown(IN_MOVELEFT) or mv:KeyDown(IN_MOVERIGHT)) then + local dir = mv:KeyDown(IN_MOVERIGHT) and 1 or -1 + local vel = mv:GetVelocity() + vel.z = 250 + + mv:SetVelocity(vel + eyeang:Right() * 150 * dir) + + local event = ply:GetWallrun() == 3 and "jumpwallrunright" or "jumpwallrunleft" + + ParkourEvent(event, ply) + + if IsFirstTimePredicted() then + ply:EmitSound("Wallrun.Concrete") + end + end + end + + if wr >= 2 and wrtimeremains then + local dir = wr == 2 and 1 or -1 + + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + + local ovel = ply:GetWallrunOrigVel() + local vecvel = ply:GetWallrunDir():Angle():Right() * dir * math.max(ovel:Length() + 50, 75) + + if ovel:Length() > 400 then + ovel:Mul(0.975) + ply:SetWallrunOrigVel(ovel) + end + + local tr = ply.WallrunTrace + local trout = ply.WallrunTraceOut + local mins, maxs = ply:GetCollisionBounds() + mins.z = -32 + + if not ply:GetWallrunElevated() then + tr.start = mv:GetOrigin() + tr.endpos = tr.start + tr.maxs = maxs + tr.mins = mins + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceHull(tr) + end + + if not ply:GetWallrunElevated() and trout.Hit then + vecvel.z = 100 + elseif not ply:GetWallrunElevated() and not trout.Hit then + ply:SetWallrunElevated(true) + end + + if ply:GetWallrunElevated() then + vecvel.z = 0 + math.Clamp(-(CurTime() - ply:GetWallrunTime() + 1.025) * 250, -400, 25) + end + + if vecvel:Length() > 300 then + vecvel:Mul(ply:GetOverdriveMult()) + end + + mv:SetVelocity(vecvel) + + local eyeang = ply:EyeAngles() + eyeang.x = 0 + + if ply:GetVelocity():Length() <= 75 then + ply:SetWallrunTime(0) + end + + tr.start = ply:EyePos() + tr.endpos = tr.start + eyeang:Right() * 45 * dir + tr.maxs = wrmaxs + tr.mins = wrmins + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceHull(tr) + + if not trout.Hit and ply:GetWallrunTime() - CurTime() < hwrtime * 0.7 then + tr.start = ply:EyePos() + tr.endpos = tr.start + eyeang:Forward() * -60 + tr.filter = ply + tr.output = trout + + util.TraceLine(tr) + + if not trout.Hit then + ply:SetWallrunTime(0) + else + if not ply:GetWallrunDir():IsEqualTol(trout.HitNormal, 0.75) then + ply:SetWallrunTime(0) + end + + ply:SetWallrunDir(trout.HitNormal) + end + elseif ply:GetWallrunTime() - CurTime() < hwrtime * 0.7 then + tr.start = ply:EyePos() + tr.endpos = tr.start + eyeang:Right() * 45 * dir + tr.filter = ply + tr.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + tr.output = trout + + util.TraceLine(tr) + + if trout.Hit and ply:GetWallrunDir():IsEqualTol(trout.HitNormal, 0.75) then + ply:SetWallrunDir(trout.HitNormal) + end + end + + if mv:KeyPressed(IN_JUMP) and ply:GetWallrunTime() - CurTime() ~= hwrtime then + ply:SetQuickturn(false) + ply:SetWallrunTime(0) + ply:SetSafetyRollKeyTime(CurTime() + 0.001) + mv:SetVelocity(eyeang:Forward() * math.max(150, vecvel:Length() - 25) + Vector(0, 0, 250)) + + local event = ply:GetWallrun() == 3 and "jumpwallrunright" or "jumpwallrunleft" + + ParkourEvent(event, ply) + + if IsFirstTimePredicted() then + ply:EmitSound("Wallrun.Concrete") + end + end + end + + if ply:GetWallrunSoundTime() < CurTime() then + local delay = nil + local wr = ply:GetWallrun() + + if wr == 1 then + delay = math.Clamp(math.abs(ply:GetWallrunTime() - CurTime() - 2.75) / vwrtime * 0.165, 0.175, 0.3) + else + delay = math.Clamp(math.abs(ply:GetWallrunTime() - CurTime()) / hwrtime * 0.165, 0.15, 1.75) + end + + if SERVER then + ply:EmitSound("Wallrun.Concrete") + timer.Simple(0.025, function () + ply:EmitSound("WallrunRelease.Concrete") + end) + end + + ply:SetWallrunSoundTime(CurTime() + delay) + ply:ViewPunch(Angle(0.25, 0, 0)) + end + + if ply:GetWallrunTime() < CurTime() or mv:GetVelocity():Length() < 10 then + if ply.vwrturn == 0 then + ply:SetQuickturn(false) + end + + if CLIENT and IsFirstTimePredicted() and wr == 1 then + BodyLimitX = 90 + BodyLimitY = 180 + BodyAnimCycle = 0 + + BodyAnim:SetSequence("jumpair") + elseif game.SinglePlayer() and wr == 1 then + net.Start("BodyAnimWallrun") + net.WriteBool(false) + net.Send(ply) + end + + ply:SetWallrun(0) + + return + end +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/Zipline.lua b/beatrun/gamemodes/beatrun/gamemode/sh/Zipline.lua new file mode 100644 index 0000000..23aecea --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/Zipline.lua @@ -0,0 +1,272 @@ +if SERVER and game.SinglePlayer() then + util.AddNetworkString("Zipline_SPFix") +elseif CLIENT and game.SinglePlayer() then + net.Receive("Zipline_SPFix", function () + local ply = LocalPlayer() + local zipline = ply:GetZipline() + + if not IsValid(zipline) then + return + end + + local startpos = zipline:GetStartPos() + local endpos = zipline:GetEndPos() + + if net.ReadBool() then + local startp = startpos + startpos = endpos + endpos = startp + end + + ply.OrigEyeAng = (endpos - startpos):Angle() + end) +end + +local function ZiplineCheck(ply, mv, cmd, zipline) + local startpos = zipline:GetStartPos() + local endpos = zipline:GetEndPos() + + if zipline:GetTwoWay() and cmd:GetViewAngles():Forward():Dot((endpos - startpos):Angle():Forward()) < 0.5 then + local startp = startpos + startpos = endpos + endpos = startp + ply.ZiplineTwoWay = true + else + ply.ZiplineTwoWay = false + end + + local dist, near = util.DistanceToLine(startpos, endpos, mv:GetOrigin()) + local neardist = near:Distance(endpos) + local totaldist = startpos:Distance(endpos) + local start = math.abs(neardist / totaldist - 1) + + if start < 1 then + local tr = ply.ZiplineTrace + local trout = ply.ZiplineTraceOut + local omins = tr.mins + local omaxs = tr.maxs + tr.start = LerpVector(start, startpos, endpos) + tr.endpos = tr.start + tr.mins, tr.maxs = ply:GetHull() + + util.TraceHull(tr) + + if trout.Hit and trout.Entity ~= zipline then + local div = startpos:Distance(endpos) + local fail = true + + for i = 1, 32 do + start = start + 25 / div + tr.start = LerpVector(start, startpos, endpos) + tr.endpos = tr.start + + util.TraceHull(tr) + + if not trout.Hit or trout.Entity == zipline and start < 1 then + fail = false + + break + end + end + + if fail then + tr.maxs = omaxs + tr.mins = omins + + ply:SetZiplineDelay(CurTime() + 0.1) + + return + end + end + + tr.maxs = omaxs + tr.mins = omins + local origin = mv:GetOrigin() + + if CLIENT then + BodyAnimSetEase(origin) + elseif game.SinglePlayer() then + ply:SetNW2Vector("SPBAEase", origin) + ply:SendLua("BodyAnimSetEase(LocalPlayer():GetNW2Vector('SPBAEase'))") + end + + mv:SetOrigin(near) + ply:SetJumpTurn(false) + ply:SetZipline(zipline) + ply:SetZiplineStart(start) + ply:SetZiplineFraction(start) + ply:SetDive(false) + ply:SetCrouchJump(false) + ply:SetWallrunCount(0) + + local vel = mv:GetVelocity() + vel.z = 0 + + ply:SetZiplineSpeed(math.min(vel:Length(), 750)) + ply:SetCrouchJumpBlocked(false) + + if CLIENT_IFTP() then + local zipline = ply:GetZipline() + ply.OrigEyeAng = (endpos - startpos):Angle() + elseif game.SinglePlayer() then + net.Start("Zipline_SPFix") + net.WriteBool(ply.ZiplineTwoWay) + net.Send(ply) + end + + if CLIENT_IFTP() or game.SinglePlayer() then + ply:EmitSound("ZiplineLoop") + ply:EmitSound("ZiplineStart") + end + + ParkourEvent("ziplinestart", ply) + end +end + +local zipvec = Vector(0, 0, 85) + +local function ZiplineThink(ply, mv, cmd, zipline) + local fraction = ply:GetZiplineFraction() + local speed = ply:GetZiplineSpeed() + local startpos = zipline:GetStartPos() + local endpos = zipline:GetEndPos() + local dir = (endpos - startpos):Angle():Forward() + + if zipline:GetTwoWay() and ply.ZiplineTwoWay then + local startp = startpos + startpos = endpos + endpos = startp + + dir:Mul(-1) + end + + if fraction >= 1 or cmd:KeyDown(IN_DUCK) then + ply:SetZipline(nil) + ply:SetMoveType(MOVETYPE_WALK) + ply:SetCrouchJumpBlocked(true) + mv:SetVelocity(dir * speed * 0.75) + mv:SetButtons(0) + ply:SetZiplineDelay(CurTime() + 0.75) + + if CLIENT_IFTP() or game.SinglePlayer() then + ply:EmitSound("ZiplineEnd") + ply:StopSound("ZiplineLoop") + + if game.SinglePlayer() then + ply:SendLua("viewtiltlerp.z = BodyAnimEyeAng.z") + else + viewtiltlerp.z = BodyAnimEyeAng.z + end + end + + return + end + + local newfraction = math.Approach(fraction, 1, FrameTime() * speed / startpos:Distance(endpos)) + + ply:SetZiplineFraction(newfraction) + + local ziplerp = LerpVector(newfraction, startpos, endpos) + + ziplerp:Sub(zipline:GetUp() * 75) + + local tr = ply.ZiplineTrace + local trout = ply.ZiplineTraceOut + local omins = tr.mins + local omaxs = tr.maxs + tr.start = ziplerp + tr.endpos = ziplerp + tr.mins, tr.maxs = ply:GetHull() + + util.TraceHull(tr) + + if trout.Hit and trout.Entity ~= zipline and newfraction > 0.1 then + ply:SetZipline(nil) + ply:SetMoveType(MOVETYPE_WALK) + mv:SetVelocity(dir * speed * 0.75) + ply:SetZiplineDelay(CurTime() + 0.75) + + if CLIENT_IFTP() or game.SinglePlayer() then + ply:EmitSound("ZiplineEnd") + ply:StopSound("ZiplineLoop") + + if game.SinglePlayer() then + ply:SendLua("viewtiltlerp.z = BodyAnimEyeAng.z") + else + viewtiltlerp.z = BodyAnimEyeAng.z + end + end + + tr.maxs = omaxs + tr.mins = omins + + return + end + + tr.maxs = omaxs + tr.mins = omins + + mv:SetOrigin(ziplerp) + ply:SetZiplineSpeed(math.Approach(speed, 750, FrameTime() * 250)) + mv:SetVelocity(dir * speed) + mv:SetButtons(0) + mv:SetForwardSpeed(0) + mv:SetSideSpeed(0) + mv:SetUpSpeed(0) +end + +local function Zipline(ply, mv, cmd) + if not ply.ZiplineTrace then + ply.ZiplineTrace = {} + ply.ZiplineTraceOut = {} + local tr = ply.ZiplineTrace + local mins, maxs = ply:GetHull() + mins.z = maxs.z * 0.8 + maxs.z = maxs.z * 2 + + mins:Mul(2) + maxs:Mul(2) + + mins.z = mins.z * 0.5 + maxs.z = maxs.z * 0.5 + tr.maxs = maxs + tr.mins = mins + ply.ZiplineTrace.mask = MASK_PLAYERSOLID + ply.ZiplineTrace.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT + end + + if not IsValid(ply:GetZipline()) and not ply:GetGrappling() and (not ply:Crouching() or ply:GetDive()) and not ply:OnGround() and ply:GetZiplineDelay() < CurTime() then + local tr = ply.ZiplineTrace + local trout = ply.ZiplineTraceOut + tr.output = trout + tr.start = mv:GetOrigin() + tr.endpos = tr.start + tr.filter = ply + + util.TraceHull(tr) + + local trentity = trout.Entity + + if IsValid(trentity) and trentity:GetClass() == "br_zipline" and ply:GetMoveType() == MOVETYPE_WALK then + ZiplineCheck(ply, mv, cmd, trentity) + end + end + + if IsValid(ply:GetZipline()) then + ZiplineThink(ply, mv, cmd, ply:GetZipline()) + end +end + +hook.Add("SetupMove", "Zipline", Zipline) + +function CreateZipline(startpos, endpos) + if startpos and endpos then + local zipline = ents.Create("br_zipline") + + zipline:SetStartPos(startpos) + zipline:SetEndPos(endpos) + zipline:Spawn() + + return zipline + end +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/_Helpers.lua b/beatrun/gamemodes/beatrun/gamemode/sh/_Helpers.lua new file mode 100644 index 0000000..18a28ec --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/_Helpers.lua @@ -0,0 +1,126 @@ +local vmatrixmeta = FindMetaTable("VMatrix") +local playermeta = FindMetaTable("Player") + +function CLIENT_IFTP() + return CLIENT and IsFirstTimePredicted() +end + +local matrixdatatmp = { + { + 0, + 0, + 0, + 0 + }, + { + 0, + 0, + 0, + 0 + }, + { + 0, + 0, + 0, + 0 + }, + { + 0, + 0, + 0, + 1 + } +} +local mtmp = { + { + 0, + 0, + 0, + 0 + }, + { + 0, + 0, + 0, + 0 + }, + { + 0, + 0, + 0, + 0 + }, + { + 0, + 0, + 0, + 1 + } +} + +function vmatrixmeta:FastToTable(tbl) + tbl = tbl or table.Copy(mtmp) + local tbl1 = tbl[1] + local tbl2 = tbl[2] + local tbl3 = tbl[3] + tbl1[1], tbl1[2], tbl1[3], tbl1[4], tbl2[1], tbl2[2], tbl2[3], tbl2[4], tbl3[1], tbl3[2], tbl3[3], tbl3[4] = self:Unpack() + + return tbl +end + +function LerpL(t, a, b) + return a + (b - a) * t +end + +function LerpC(t, a, b, powa) + return a + (b - a) * math.pow(t, powa) +end + +function TraceSetData(tbl, start, endpos, mins, maxs, filter) + tbl.start = start + tbl.endpos = endpos + + if tbl.mins then + tbl.mins = mins + tbl.maxs = maxs + end + + if filter then + tbl.filter = filter + elseif not maxs then + tbl.filter = mins + end +end + +function TraceParkourMask(tbl) + tbl.mask = MASK_PLAYERSOLID + tbl.collisiongroup = COLLISION_GROUP_PLAYER_MOVEMENT +end + +function playermeta:SetMantleData(startpos, endpos, lerp, mantletype) + self:SetMantleStartPos(startpos) + self:SetMantleEndPos(endpos) + self:SetMantleLerp(lerp) + self:SetMantle(mantletype) +end + +function playermeta:SetWallrunData(wr, wrtime, dir) + local count = self:GetWallrunCount() + + self:SetWallrun(wr) + self:SetWallrunCount(count + 1) + self:SetWallrunTime(wrtime) + self:SetWallrunSoundTime(CurTime() + 0.1) + self:SetWallrunDir(dir) +end + +function playermeta:UsingRH(wep) + local usingrh = false + local activewep = wep or self:GetActiveWeapon() + + if IsValid(activewep) then + usingrh = activewep:GetClass() == "runnerhands" + end + + return usingrh +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/sh_buildmode.lua b/beatrun/gamemodes/beatrun/gamemode/sh/sh_buildmode.lua new file mode 100644 index 0000000..a8e7a18 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/sh_buildmode.lua @@ -0,0 +1,1692 @@ +local mousex = 0 +local mousey = 0 +buildmode_props = {} +local propmatsblacklist = {} +local blocksdir = "models/hunter/blocks/" +local blocksdir_s = blocksdir .. "*.mdl" + +for k, v in ipairs(file.Find(blocksdir_s, "GAME")) do + table.insert(buildmode_props, blocksdir .. v:lower()) +end + +local blocksdir = "models/hunter/triangles/" +local blocksdir_s = blocksdir .. "*.mdl" + +for k, v in ipairs(file.Find(blocksdir_s, "GAME")) do + table.insert(buildmode_props, blocksdir .. v:lower()) +end + +local blocksdir = "models/props_phx/construct/glass/" +local blocksdir_s = blocksdir .. "*.mdl" + +for k, v in ipairs(file.Find(blocksdir_s, "GAME")) do + local key = table.insert(buildmode_props, blocksdir .. v:lower()) + propmatsblacklist[key] = true +end + +buildmode_entmodels = { + br_swingpipe = "models/parkoursource/pipe_standard.mdl", + br_ladder = "models/maxofs2d/lamp_projector.mdl", + br_balance = "models/maxofs2d/lamp_projector.mdl", + br_mat = "models/mechanics/robotics/stand.mdl", + br_swingrope = "models/hunter/blocks/cube025x025x025.mdl", + br_laser = "models/maxofs2d/button_02.mdl", + br_zipline = "models/hunter/blocks/cube025x025x025.mdl", + tt_cp = "models/props_phx/construct/windows/window_angle360.mdl", + br_swingbar = "models/hunter/plates/plate2.mdl" +} +local misc = { + "models/hunter/misc/lift2x2.mdl", + "models/hunter/misc/stair1x1.mdl", + "models/hunter/misc/stair1x1inside.mdl", + "models/hunter/misc/stair1x1outside.mdl", + "models/props_combine/combine_barricade_short02a.mdl", + "models/props_combine/combine_bridge_b.mdl", + "models/props_docks/channelmarker_gib02.mdl", + "models/props_docks/channelmarker_gib04.mdl", + "models/props_docks/channelmarker_gib03.mdl", + "models/props_lab/blastdoor001a.mdl", + "models/props_lab/blastdoor001c.mdl", + "models/props_wasteland/cargo_container01.mdl", + "models/props_wasteland/cargo_container01b.mdl", + "models/props_wasteland/cargo_container01c.mdl", + "models/props_wasteland/horizontalcoolingtank04.mdl", + "models/props_wasteland/laundry_washer001a.mdl", + "models/props_wasteland/laundry_washer003.mdl", + "models/props_junk/TrashDumpster01a.mdl", + "models/props_junk/TrashDumpster02.mdl", + "models/props_junk/wood_crate001a.mdl", + "models/props_junk/wood_crate002a.mdl", + "models/props_junk/wood_pallet001a.mdl", + "models/props_c17/fence01a.mdl", + "models/props_c17/fence01b.mdl", + "models/props_c17/fence02a.mdl", + "models/props_c17/fence03a.mdl", + "models/props_c17/fence04a.mdl", + "models/props_wasteland/interior_fence001g.mdl", + "models/props_wasteland/interior_fence002d.mdl", + "models/props_wasteland/interior_fence002e.mdl", + "models/props_building_details/Storefront_Template001a_Bars.mdl", + "models/props_wasteland/wood_fence01a.mdl", + "models/props_wasteland/wood_fence02a.mdl", + "models/props_c17/concrete_barrier001a.mdl", + "models/props_wasteland/medbridge_base01.mdl", + "models/props_wasteland/medbridge_post01.mdl", + "models/props_wasteland/medbridge_strut01.mdl", + "models/props_c17/column02a.mdl", + "models/props_junk/iBeam01a_cluster01.mdl", + "models/props_junk/iBeam01a.mdl", + "models/props_canal/canal_cap001.mdl", + "models/props_canal/canal_bridge04.mdl", + "models/Mechanics/gears2/pinion_80t3.mdl", + "models/props_phx/gears/rack36.mdl", + "models/props_phx/gears/rack70.mdl", + "models/cranes/crane_frame.mdl", + "models/cranes/crane_docks.mdl", + "models/props_wasteland/cranemagnet01a.mdl" +} + +for k, v in ipairs(misc) do + local key = table.insert(buildmode_props, v:lower()) + propmatsblacklist[key] = true +end + +misc = nil +buildmode_ents = { + br_swingpipe = true, + br_swingrope = true, + br_ladder = true, + br_balance = true, + br_mat = true, + br_laser = true, + br_zipline = true, + tt_cp = true, + br_swingbar = true +} +PlaceStartPos = nil +PlaceEndPos = nil +local PlaceMaxs = Vector() +local PlaceMins = Vector() +PlaceAxisLock = 0 +entplacefunc_prespawn = { + br_zipline = true, + br_swingrope = true +} +entplacefunc = { + br_ladder = function (self, vecextra) + self:SetPos(self:GetPos() + self:GetAngles():Forward() * 10) + vecextra:Set(vecextra + self:GetAngles():Forward() * 10) + self:LadderHeightExact(vecextra:Distance(self:GetPos()) - 75) + end, + br_balance = function (self, vecextra) + self:BalanceLengthExact(vecextra:Distance(self:GetPos())) + end, + br_zipline = function (self, vecextra, vec) + self:SetPos(vec) + self:SetStartPos(vec) + self:SetEndPos(vecextra) + self:SetTwoWay(net.ReadBool()) + end, + br_swingrope = function (self, vecextra, vec) + self:SetPos(vec) + self:SetStartPos(vec) + self:SetEndPos(vecextra) + end +} +entplacefunc_cl = { + tt_cp = function () + local svec = util.AimVector(LocalPlayer():EyeAngles(), 133, mousex, mousey, ScrW(), ScrH()) + local start = LocalPlayer():EyePos() + + svec:Mul(100000) + + local tr = util.QuickTrace(start, svec, LocalPlayer()) + local pos = tr.HitPos + + net.Start("BuildMode_Checkpoint") + net.WriteFloat(pos.x) + net.WriteFloat(pos.y) + net.WriteFloat(pos.z) + net.SendToServer() + timer.Simple(0.1, function () + LoadCheckpoints() + end) + + BuildModePlaceDelay = CurTime() + 0.05 + + return true + end, + br_ladder = function () + if not PlaceStartPos then + PlaceAxisLock = 3 + PlaceStartPos = Vector(BuildModePos) + PlaceMins, PlaceMaxs = GhostModel:GetRenderBounds() + + return true + end + + net.Start("BuildMode_Place") + net.WriteUInt(65535, 16) + net.WriteString(BuildModeIndex) + net.WriteFloat(PlaceStartPos.x) + net.WriteFloat(PlaceStartPos.y) + net.WriteFloat(PlaceStartPos.z) + net.WriteAngle(BuildModeAngle) + net.WriteVector(BuildModePos) + net.SendToServer() + LocalPlayer():EmitSound("buttonclick.wav") + + BuildModePlaceDelay = CurTime() + 0.05 + PlaceStartPos = nil + PlaceEndPos = nil + PlaceAxisLock = 0 + + return true + end, + br_zipline = function () + if not PlaceStartPos then + PlaceAxisLock = 0 + PlaceStartPos = Vector(BuildModePos) + PlaceMins, PlaceMaxs = GhostModel:GetRenderBounds() + + return true + end + + net.Start("BuildMode_Place") + net.WriteUInt(65535, 16) + net.WriteString(BuildModeIndex) + net.WriteFloat(PlaceStartPos.x) + net.WriteFloat(PlaceStartPos.y) + net.WriteFloat(PlaceStartPos.z) + net.WriteAngle(BuildModeAngle) + net.WriteVector(BuildModePos) + net.WriteBool(input.IsKeyDown(KEY_LSHIFT)) + net.SendToServer() + LocalPlayer():EmitSound("buttonclick.wav") + + BuildModePlaceDelay = CurTime() + 0.05 + PlaceStartPos = nil + PlaceEndPos = nil + PlaceAxisLock = 0 + + return true + end, + br_swingrope = function () + if not PlaceStartPos then + PlaceAxisLock = -3 + PlaceStartPos = Vector(BuildModePos) + PlaceMins, PlaceMaxs = GhostModel:GetRenderBounds() + + return true + end + + net.Start("BuildMode_Place") + net.WriteUInt(65535, 16) + net.WriteString(BuildModeIndex) + net.WriteFloat(PlaceStartPos.x) + net.WriteFloat(PlaceStartPos.y) + net.WriteFloat(PlaceStartPos.z) + net.WriteAngle(BuildModeAngle) + net.WriteVector(BuildModePos) + net.SendToServer() + LocalPlayer():EmitSound("buttonclick.wav") + + BuildModePlaceDelay = CurTime() + 0.05 + PlaceStartPos = nil + PlaceEndPos = nil + PlaceAxisLock = 0 + + return true + end, + br_balance = function () + if not PlaceStartPos then + PlaceAxisLock = 1 + PlaceStartPos = Vector(BuildModePos) + PlaceMins, PlaceMaxs = GhostModel:GetRenderBounds() + + return true + end + + net.Start("BuildMode_Place") + net.WriteUInt(65535, 16) + net.WriteString(BuildModeIndex) + net.WriteFloat(PlaceStartPos.x) + net.WriteFloat(PlaceStartPos.y) + net.WriteFloat(PlaceStartPos.z) + net.WriteAngle(BuildModeAngle) + net.WriteVector(BuildModePos) + net.SendToServer() + LocalPlayer():EmitSound("buttonclick.wav") + + BuildModePlaceDelay = CurTime() + 0.05 + PlaceStartPos = nil + PlaceEndPos = nil + PlaceAxisLock = 0 + + return true + end +} +entsavefunc = { + br_zipline = function (self, tbl) + tbl.StartPos = self:GetStartPos() + tbl.EndPos = self:GetEndPos() + tbl.TwoWay = self:GetTwoWay() + end, + br_ladder = function (self, tbl) + tbl.LadderHeight = self:GetLadderHeight() + end, + br_balance = function (self, tbl) + tbl.BalanceLength = self:GetBalanceLength() + end, + br_swingrope = function (self, tbl) + tbl.StartPos = self:GetStartPos() + tbl.EndPos = self:GetEndPos() + end +} +entreadfunc = { + br_zipline = function (self, tbl) + self:SetPos(tbl.StartPos) + self:SetStartPos(tbl.StartPos) + self:SetEndPos(tbl.EndPos) + self:SetTwoWay(tbl.TwoWay or false) + + return true + end, + br_ladder = function (self, tbl) + timer.Simple(0, function () + if IsValid(self) and self.LadderHeightExact then + self:LadderHeightExact(tbl.LadderHeight) + end + end) + self:SetPos(tbl.pos + tbl.ang:Forward() * 10) + self:SetAngles(tbl.ang) + + return true + end, + br_balance = function (self, tbl) + timer.Simple(0, function () + if IsValid(self) and self.BalanceLengthExact then + self:BalanceLengthExact(tbl.BalanceLength) + end + end) + self:SetPos(tbl.pos + tbl.ang:Forward() * 10) + self:SetAngles(tbl.ang) + + return true + end, + br_swingrope = function (self, tbl) + self:SetPos(tbl.StartPos) + self:SetStartPos(tbl.StartPos) + self:SetEndPos(tbl.EndPos) + + return true + end +} +local buildmode_props_index = {} + +for k, v in pairs(buildmode_props) do + buildmode_props_index[v] = k +end + +local function CustomPropMat(prop) + if propmatsblacklist[buildmode_props_index[prop:GetModel()]] then + return + end + + if prop.hr then + prop:SetMaterial("medge/redplainplastervertex") + else + prop:SetMaterial("medge/plainplastervertex") + end +end + +Course_StartPos = Course_StartPos or Vector() +Course_StartAng = Course_StartAng or 0 + +if SERVER then + util.AddNetworkString("BuildMode") + util.AddNetworkString("BuildMode_Place") + util.AddNetworkString("BuildMode_Remove") + util.AddNetworkString("BuildMode_Drag") + util.AddNetworkString("BuildMode_Duplicate") + util.AddNetworkString("BuildMode_Delete") + util.AddNetworkString("BuildMode_Highlight") + util.AddNetworkString("BuildMode_ReadSave") + util.AddNetworkString("BuildMode_Checkpoint") + util.AddNetworkString("BuildMode_Entity") + util.AddNetworkString("BuildMode_SetSpawn") + util.AddNetworkString("BuildMode_SaveCourse") + util.AddNetworkString("BuildMode_ReadCourse") + util.AddNetworkString("BuildMode_Sync") + util.AddNetworkString("Course_Stop") + + buildmodelogs = {} + local buildmodelogs = buildmodelogs + + function Course_Sync() + net.Start("BuildMode_Sync") + net.WriteFloat(Course_StartPos.x) + net.WriteFloat(Course_StartPos.y) + net.WriteFloat(Course_StartPos.z) + net.WriteFloat(Course_StartAng) + net.WriteString(Course_Name) + net.WriteString(Course_ID) + net.Broadcast() + end + + function Course_Stop(len, ply) + if ply and not ply:IsSuperAdmin() then + return + end + + Course_Name = "" + Course_ID = "" + + game.CleanUpMap() + Course_Sync() + end + + net.Receive("Course_Stop", Course_Stop) + + buildmode_placed = buildmode_placed or {} + + function BuildMode_Toggle(ply) + if not ply.BuildMode and not ply:IsSuperAdmin() and not ply.BuildModePerm then + return + end + + ply.BuildMode = not ply.BuildMode + + if ply.BuildMode then + ply:SetMoveType(MOVETYPE_NOCLIP) + else + ply:SetMoveType(MOVETYPE_WALK) + + CheckpointNumber = 1 + end + + net.Start("BuildMode") + net.WriteBool(ply.BuildMode) + net.Send(ply) + end + + concommand.Add("buildmode", function (ply, cmd, args) + BuildMode_Toggle(ply) + end) + net.Receive("BuildMode_Place", function (len, ply) + if not ply.BuildMode then + return + end + + local prop = net.ReadUInt(16) + + if prop == 65535 then + prop = net.ReadString() + end + + local x = net.ReadFloat() + local y = net.ReadFloat() + local z = net.ReadFloat() + local ang = net.ReadAngle() + local vec = Vector(x, y, z) + local vecextra = net.ReadVector() + + if not isstring(prop) then + local a = ents.Create("prop_physics") + + a:SetModel(buildmode_props[prop]) + CustomPropMat(a) + a:SetPos(vec) + a:SetAngles(ang) + a:Spawn() + + local phys = a:GetPhysicsObject() + + phys:EnableMotion(false) + phys:Sleep() + a:PhysicsDestroy() + a:SetHealth(inf) + else + local a = ents.Create(prop) + local prespawn = entplacefunc_prespawn[prop] + + a:SetPos(vec) + a:SetAngles(ang) + + if prespawn and entplacefunc[prop] then + entplacefunc[prop](a, vecextra, vec) + end + + a:Spawn() + + if not prespawn and entplacefunc[prop] then + entplacefunc[prop](a, vecextra, vec) + end + end + + table.insert(buildmode_placed, a) + + local bmlog = tostring(ply) .. " placed " .. tostring(a) + + table.insert(buildmodelogs, bmlog) + end) + net.Receive("BuildMode_Duplicate", function (len, ply) + if not ply.BuildMode then + return + end + + local selected = net.ReadTable() + local selectedents = net.ReadTable() + + for k, v in pairs(selected) do + local a = ents.Create("prop_physics") + + a:SetModel(v:GetModel()) + CustomPropMat(a) + a:SetPos(v:GetPos()) + a:SetAngles(v:GetAngles()) + a:Spawn() + + a.hr = v.hr + + CustomPropMat(a) + + local phys = a:GetPhysicsObject() + + phys:EnableMotion(false) + phys:Sleep() + a:PhysicsDestroy() + a:SetHealth(inf) + end + + for k, v in pairs(selectedents) do + local a = ents.Create(v:GetClass()) + + a:SetPos(v:GetPos()) + a:SetAngles(v:GetAngles()) + a:Spawn() + end + + local bmlog = tostring(ply) .. " duped " .. tostring(table.Count(selected)) .. " props" + + table.insert(buildmodelogs, bmlog) + end) + net.Receive("BuildMode_Delete", function (len, ply) + if not ply.BuildMode then + return + end + + local selected = net.ReadTable() + + for k, v in pairs(selected) do + if IsValid(v) then + v:Remove() + end + end + + local bmlog = tostring(ply) .. " deleted " .. tostring(table.Count(selected)) .. " entities" + + table.insert(buildmodelogs, bmlog) + end) + net.Receive("BuildMode_Highlight", function (len, ply) + if not ply.BuildMode then + return + end + + local selected = net.ReadTable() + + for k, v in pairs(selected) do + v.hr = not v.hr + + CustomPropMat(v) + end + end) + net.Receive("BuildMode_Remove", function (len, ply) + if not ply.BuildMode then + return + end + + local ent = net.ReadEntity() + + SafeRemoveEntity(ent) + end) + net.Receive("BuildMode_ReadSave", function (len, ply) + if not ply.BuildMode then + return + end + + local a = util.Decompress(net.ReadData(len)) + local props = util.JSONToTable(a) + + for k, v in pairs(props) do + local a = ents.Create("prop_physics") + + print(buildmode_props[v.model], v.model) + a:SetModel(buildmode_props[v.model]) + CustomPropMat(a) + a:SetPos(v.pos + ply:EyePos()) + a:SetAngles(v.ang) + a:Spawn() + + local phys = a:GetPhysicsObject() + + phys:EnableMotion(false) + phys:Sleep() + a:PhysicsDestroy() + a:SetHealth(inf) + end + end) + net.Receive("BuildMode_Checkpoint", function (len, ply) + if not ply.BuildMode then + return + end + + local x = net.ReadFloat() + local y = net.ReadFloat() + local z = net.ReadFloat() + + LoadCheckpoints() + PrintTable(Checkpoints) + + local a = ents.Create("tt_cp") + + a:SetPos(Vector(x, y, z)) + a:SetCPNum(table.Count(Checkpoints) + 1) + a:Spawn() + LoadCheckpoints() + end) + net.Receive("BuildMode_Entity", function (len, ply) + if not ply.BuildMode then + return + end + + local ent = net.ReadString() + local x = net.ReadFloat() + local y = net.ReadFloat() + local z = net.ReadFloat() + local a = ents.Create(ent) + + a:SetPos(Vector(x, y, z)) + + if entplacefunc[ent] then + entplacefunc[ent](a) + end + + a:Spawn() + end) + net.Receive("BuildMode_SetSpawn", function (len, ply) + if not ply.BuildMode then + return + end + + local x = net.ReadFloat() + local y = net.ReadFloat() + local z = net.ReadFloat() + local ang = net.ReadFloat() + + Course_StartPos:SetUnpacked(x, y, z) + + Course_StartAng = ang + end) + + function Beatrun_ReadCourseNet(len, ply) + if not ply:IsSuperAdmin() then + return + end + + Beatrun_ReadCourse(net.ReadData(len)) + end + + function Beatrun_ReadCourseLocal(id) + local dir = "beatrun/courses/" .. game.GetMap() .. "/" + local save = file.Read(dir .. id .. ".txt", "DATA") + + if not save then + print("NON-EXISTENT SAVE", id) + + return + end + + Course_ID = id + + Beatrun_ReadCourse(save) + end + + function Beatrun_ReadCourse(data) + game.CleanUpMap() + + local a = util.Decompress(data) + local crc = util.CRC(a) + local data = util.JSONToTable(a) + + PrintTable(data) + + local props = data[1] + local cp = data[2] + local pos = data[3] + local ang = data[4] + local name = data[5] + local entities = data[6] + + for k, v in pairs(props) do + local a = ents.Create("prop_physics") + a.hr = v.hr + + a:SetModel(buildmode_props[v.model]) + CustomPropMat(a) + a:SetPos(v.pos) + a:SetAngles(v.ang) + a:Spawn() + + local phys = a:GetPhysicsObject() + + phys:EnableMotion(false) + phys:Sleep() + a:PhysicsDestroy() + a:SetHealth(inf) + end + + for k, v in ipairs(cp) do + LoadCheckpoints() + + local a = ents.Create("tt_cp") + + a:SetPos(v) + a:SetCPNum(table.Count(Checkpoints) + 1) + a:Spawn() + LoadCheckpoints() + print(k, v, a) + end + + if entities then + for k, v in ipairs(entities) do + local a = ents.Create(v.ent) + local dontsetpos = nil + + if entreadfunc[v.ent] then + dontsetpos = entreadfunc[v.ent](a, v) + end + + if not dontsetpos then + a:SetPos(v.pos) + a:SetAngles(v.ang) + end + + a:Spawn() + end + end + + Course_StartPos:Set(pos) + + Course_StartAng = ang + Course_Name = name + Course_ID = crc + + Course_Sync() + + for k, v in pairs(player.GetAll()) do + v:SetNW2Float("PBTime", 0) + v:SetNW2Int("CPNum", 1) + v:SetMoveType(MOVETYPE_WALK) + v:Spawn() + end + end + + net.Receive("BuildMode_ReadCourse", Beatrun_ReadCourseNet) + net.Receive("BuildMode_Drag", function (len, ply) + if not ply.BuildMode then + return + end + + local selected = net.ReadTable() + + for k, v in pairs(selected) do + k:SetPos(v.pos or k:GetPos()) + k:SetAngles(v.ang or k:GetAngles()) + end + end) + + return +end + +if CLIENT then + BuildModePlaceDelay = 0 + BuildMode = false + GhostModel = nil + BuildModeIndex = 0 + local GhostColor = Color(255, 255, 255, 200) + BuildModeAngle = Angle() + BuildModePos = Vector() + local BuildModeDist = 500 + local usedown = false + local mousedown = false + local axislock = 0 + local axislist = { + "x", + "y", + "z" + } + local axiscolors = { + Color(255, 0, 0), + Color(0, 255, 0), + Color(0, 0, 255) + } + local axisdisplay1 = Vector() + local axisdisplay2 = Vector() + mousey = 0 + mousex = 0 + local mousemoved = false + local camcontrol = false + local scrw = ScrW() + local scrh = ScrH() + local nscrw = ScrW() + local nscrh = ScrH() + local aimvector = Vector() + local dragstartx = 0 + local dragstarty = 0 + local dragstartvec = Vector() + local dragging = false + local dragoffset = Vector() + local hulltr = {} + local hulltrout = {} + buildmode_placed = buildmode_placed or {} + buildmode_selected = {} + local keytime = 0 + playerstart = IsValid(playerstart) and playerstart or ClientsideModel("models/editor/playerstart.mdl") + + playerstart:SetNoDraw(true) + + local playerstartang = Angle() + local ZiplineStart, ZiplineEnd = nil + local ziplinemins = Vector(-8, -8, -8) + local ziplinemaxs = Vector(8, 8, 8) + + surface.CreateFont("BuildMode", { + shadow = false, + blursize = 0, + underline = false, + rotary = false, + strikeout = false, + additive = false, + antialias = true, + extended = false, + scanlines = 0, + font = "D-DIN", + italic = false, + outline = false, + symbol = false, + weight = 500, + size = ScreenScale(10) + }) + + local blur = Material("pp/blurscreen") + + local function DrawBlurRect(x, y, w, h) + local X = 0 + local Y = 0 + + surface.SetDrawColor(255, 255, 255) + surface.SetMaterial(blur) + + for i = 1, 5 do + blur:SetFloat("$blur", i / 3 * 5) + blur:Recompute() + render.UpdateScreenEffectTexture() + render.SetScissorRect(x, y, x + w, y + h, true) + surface.DrawTexturedRect(X * -1, Y * -1, scrw, scrh) + render.SetScissorRect(0, 0, 0, 0, false) + end + end + + function BuildModeCreateGhost() + if not IsValid(GhostModel) then + GhostModel = ClientsideModel(buildmode_props[BuildModeIndex] or buildmode_entmodels[BuildModeIndex], RENDERGROUP_TRANSLUCENT) + else + if propmatsblacklist[BuildModeIndex] then + GhostModel:SetMaterial("") + end + + return + end + + GhostModel:SetColor(GhostColor) + GhostModel:SetRenderMode(RENDERMODE_TRANSCOLOR) + GhostModel:SetNoDraw(true) + CustomPropMat(GhostModel) + end + + local trace = {} + local tracer = {} + local flatn = Angle(0, 0, 1) + + function BuildModeGhost() + if ZiplineStart then + render.DrawWireframeBox(ZiplineStart, angle_zero, ziplinemins, ziplinemaxs, color_white, true) + end + + if BuildModeIndex == 0 then + return + end + + if AEUI.HoveredPanel then + return + end + + BuildModeCreateGhost() + + local ply = LocalPlayer() + local eyepos = ply:EyePos() + local eyeang = ply:EyeAngles() + local mins, maxs = GhostModel:GetRenderBounds() + aimvector = util.AimVector(eyeang, 133, mousex, mousey, ScrW(), ScrH()) + trace.start = eyepos + trace.endpos = eyepos + aimvector * (not PlaceStartPos and 100000 or PlaceStartPos:Distance(ply:GetPos())) + trace.filter = ply + trace.output = tracer + + util.TraceLine(trace) + + local ghostpos = tracer.HitPos + ghostpos.z = ghostpos.z - mins.z + + if axislock > 0 then + BuildModePos[axislist[axislock]] = ghostpos[axislist[axislock]] + else + BuildModePos:Set(ghostpos) + end + + if PlaceStartPos and PlaceAxisLock and math.abs(PlaceAxisLock) > 0 then + local mul = PlaceAxisLock > 0 and 1 or -1 + + if PlaceAxisLock == 1 then + BuildModePos = PlaceStartPos + BuildModeAngle:Forward() * BuildModePos:Distance(PlaceStartPos) * mul + elseif PlaceAxisLock == 2 then + BuildModePos = PlaceStartPos + -BuildModeAngle:Forward() * BuildModePos:Distance(PlaceStartPos) * mul + else + BuildModePos = PlaceStartPos + BuildModeAngle:Up() * BuildModePos:Distance(PlaceStartPos) * mul + end + end + + GhostModel:SetPos(BuildModePos) + GhostModel:SetAngles(BuildModeAngle) + GhostModel:DrawModel() + render.DrawWireframeBox(BuildModePos, BuildModeAngle, mins, maxs, color_white, true) + + if PlaceStartPos then + render.DrawWireframeBox(PlaceStartPos, BuildModeAngle, PlaceMins, PlaceMaxs, color_white, true) + end + + if axislock > 0 then + axisdisplay1:Set(BuildModePos) + + local num = axisdisplay1[axislist[axislock]] + axisdisplay1[axislist[axislock]] = num + 200 + + axisdisplay2:Set(BuildModePos) + + axisdisplay2[axislist[axislock]] = num - 200 + + render.DrawLine(axisdisplay2, axisdisplay1, axiscolors[axislock]) + end + + ghostpos.z = ghostpos.z + mins.z + + render.DrawLine(tracer.StartPos + eyeang:Forward() * 5, ghostpos, axiscolors[3]) + end + + function BuildModePlayerStart() + playerstartang.y = Course_StartAng + + playerstart:SetPos(Course_StartPos) + playerstart:SetAngles(playerstartang) + playerstart:DrawModel() + end + + function CourseData(name) + local save = { + {}, + {}, + Course_StartPos, + Course_StartAng, + name or "Unnamed", + {} + } + + for k, v in pairs(buildmode_placed) do + if not IsValid(v) then + -- Nothing + elseif v:GetNW2Bool("BRProtected") then + print("ignoring protected ent") + else + local class = v:GetClass() + + if class == "prop_physics" and not buildmode_props_index[v:GetModel():lower()] then + print("ignoring", v:GetModel():lower()) + elseif class == "prop_physics" then + local hr = v:GetMaterial() == "medge/redplainplastervertex" and true or nil + + table.insert(save[1], { + model = buildmode_props_index[v:GetModel():lower()], + pos = v:GetPos(), + ang = v:GetAngles(), + hr = hr + }) + elseif buildmode_ents[class] then + local index = table.insert(save[6], { + ent = class, + pos = v:GetPos(), + ang = v:GetAngles() + }) + + if entsavefunc[class] then + entsavefunc[class](v, save[6][index]) + end + end + end + end + + for k, v in ipairs(Checkpoints) do + table.insert(save[2], v:GetPos()) + end + + return save + end + + function SaveCourse(name, compress) + local save = CourseData(name) + local jsonsave = util.TableToJSON(save) + local crc = util.CRC(jsonsave) + local dir = "beatrun/courses/" .. game.GetMap() .. "/" + + file.CreateDir(dir) + + if compress then + file.Write(dir .. crc .. ".txt", util.Compress(jsonsave)) + else + file.Write(dir .. crc .. ".txt", jsonsave) + end + + print("Save created:", crc) + end + + concommand.Add("Beatrun_SaveCourse", function (ply, cmd, args, argstr) + local name = args[1] or "Unnamed" + local compress = not args[2] + + print(compress) + SaveCourse(name, compress) + end) + + function LoadCourse(id) + local dir = "beatrun/courses/" .. game.GetMap() .. "/" + local save = file.Read(dir .. id .. ".txt", "DATA") + + if not save then + print("NON-EXISTENT SAVE", id) + + return + end + + net.Start("BuildMode_ReadCourse") + net.WriteData(save) + net.SendToServer() + LoadCheckpoints() + + Course_ID = id + end + + concommand.Add("Beatrun_LoadCourse", function (ply, cmd, args, argstr) + local id = args[1] or "Unnamed" + + LoadCourse(id) + end) + + function LoadCourseRaw(data) + if not data then + print("LOAD NOTHING??!!") + + return + end + + net.Start("BuildMode_ReadCourse") + net.WriteData(data) + net.SendToServer() + LoadCheckpoints() + + Course_ID = id + end + + concommand.Add("Beatrun_PrintCourse", function (ply, cmd, args, argstr) + local dir = "beatrun/courses/" .. game.GetMap() .. "/*.txt" + local files = file.Find(dir, "DATA", "datedesc") + + PrintTable(files) + end) + net.Receive("BuildMode_Sync", function () + local x = net.ReadFloat() + local y = net.ReadFloat() + local z = net.ReadFloat() + local ang = net.ReadFloat() + local name = net.ReadString() + local id = net.ReadString() + + Course_StartPos:SetUnpacked(x, y, z) + + Course_StartAng = ang + Course_Name = name + Course_ID = id or Course_ID + end) + + buildmodeinputs = { + [KEY_R] = function () + if not dragging then + BuildModeAngle:Set(angle_zero) + + return + end + + axislock = axislock + 1 + + if axislock > 3 then + axislock = 0 + end + end, + [KEY_X] = function () + local mult = input.IsKeyDown(KEY_LCONTROL) and 0.06666666666666667 or 1 + + BuildModeAngle:RotateAroundAxis(Vector(1, 0, 0), 15 * mult) + LocalPlayer():EmitSound("buttonrollover.wav") + end, + [KEY_C] = function () + local mult = input.IsKeyDown(KEY_LCONTROL) and 0.06666666666666667 or 1 + + BuildModeAngle:RotateAroundAxis(Vector(1, 0, 0), -15 * mult) + LocalPlayer():EmitSound("buttonrollover.wav") + end, + [KEY_V] = function () + local mult = input.IsKeyDown(KEY_LCONTROL) and 0.06666666666666667 or 1 + + BuildModeAngle:RotateAroundAxis(Vector(0, 1, 0), 15 * mult) + LocalPlayer():EmitSound("buttonrollover.wav") + end, + [KEY_B] = function () + local mult = input.IsKeyDown(KEY_LCONTROL) and 0.06666666666666667 or 1 + + BuildModeAngle:RotateAroundAxis(Vector(0, 1, 0), -15 * mult) + LocalPlayer():EmitSound("buttonrollover.wav") + end, + [KEY_F] = function () + if CurTime() < BuildModePlaceDelay then + return + end + + local svec = util.AimVector(LocalPlayer():EyeAngles(), 133, mousex, mousey, ScrW(), ScrH()) + local start = LocalPlayer():EyePos() + + svec:Mul(100000) + + local tr = util.QuickTrace(start, svec, LocalPlayer()) + local pos = tr.HitPos + + net.Start("BuildMode_Checkpoint") + net.WriteFloat(pos.x) + net.WriteFloat(pos.y) + net.WriteFloat(pos.z) + net.SendToServer() + timer.Simple(0.1, function () + LoadCheckpoints() + end) + + BuildModePlaceDelay = CurTime() + 0.05 + end, + [KEY_S] = function () + if camcontrol then + return + end + + local svec = util.AimVector(LocalPlayer():EyeAngles(), 133, mousex, mousey, ScrW(), ScrH()) + local start = LocalPlayer():EyePos() + + svec:Mul(100000) + + local tr = util.QuickTrace(start, svec, LocalPlayer()) + local pos = tr.HitPos + local ang = LocalPlayer():EyeAngles().y + + Course_StartPos:Set(pos) + net.Start("BuildMode_SetSpawn") + net.WriteFloat(pos.x) + net.WriteFloat(pos.y) + net.WriteFloat(pos.z) + net.WriteFloat(ang) + net.SendToServer() + Course_StartPos:Set(pos) + + Course_StartAng = ang + end, + [KEY_D] = function (ignorecombo) + if (input.IsKeyDown(KEY_LSHIFT) or ignorecombo) and not camcontrol then + local props = {} + local ents = {} + + for k, v in pairs(buildmode_selected) do + if buildmode_ents[k:GetClass()] then + table.insert(ents, k) + else + table.insert(props, k) + end + end + + net.Start("BuildMode_Duplicate") + net.WriteTable(props) + net.WriteTable(ents) + net.SendToServer() + + dragging = false + + buildmodeinputs[KEY_G]() + end + end, + [KEY_DELETE] = function () + if not dragging then + local props = {} + + for k, v in pairs(buildmode_selected) do + table.insert(props, k) + + buildmode_selected[k] = nil + end + + net.Start("BuildMode_Delete") + net.WriteTable(props) + net.SendToServer() + end + end, + [KEY_BACKSPACE] = function () + if not dragging then + local props = {} + + for k, v in pairs(buildmode_selected) do + table.insert(props, k) + + buildmode_selected[k] = nil + end + + net.Start("BuildMode_Delete") + net.WriteTable(props) + net.SendToServer() + end + end, + [KEY_T] = function () + if not dragging then + local props = {} + + for k, v in pairs(buildmode_selected) do + if not propmatsblacklist[buildmode_props_index[k:GetModel()]] then + table.insert(props, k) + end + end + + if #props > 0 then + net.Start("BuildMode_Highlight") + net.WriteTable(props) + net.SendToServer() + end + end + end, + [KEY_G] = function () + if BuildModeIndex ~= 0 then + return + end + + BuildModeAngle:Set(angle_zero) + + dragging = not dragging + + if not dragging then + dragging = true + + dragoffset:Set(vector_origin) + buildmodeinputsmouse[MOUSE_RIGHT]() + else + local f = nil + + for k, v in pairs(buildmode_selected) do + f = k + + break + end + + if IsValid(f) then + cam.Start3D() + + local w2s = f:GetPos():ToScreen() + + input.SetCursorPos(w2s.x, w2s.y) + cam.End3D() + end + end + end, + [KEY_ENTER] = function () + if table.Count(buildmode_selected) == 0 then + return + end + + local save = {} + local startpos = nil + + for k, v in pairs(buildmode_selected) do + startpos = startpos or k:GetPos() + + if not buildmode_props_index[k:GetModel()] then + print("ignoring", k:GetModel()) + else + table.insert(save, { + model = buildmode_props_index[k:GetModel()], + pos = k:GetPos() - startpos, + ang = k:GetAngles() + }) + end + end + + local jsonsave = util.TableToJSON(save) + + file.CreateDir("beatrun/savedbuilds") + file.Write("beatrun/savedbuilds/save.txt", util.Compress(jsonsave)) + end, + [KEY_PAD_PLUS] = function () + local save = file.Read("beatrun/savedbuilds/save.txt", "DATA") + + net.Start("BuildMode_ReadSave") + net.WriteData(save) + net.SendToServer() + end + } + buildmodeinputsmouse = { + [MOUSE_LEFT] = function () + if isstring(BuildModeIndex) then + local noplace = false + + if entplacefunc_cl[BuildModeIndex] then + noplace = entplacefunc_cl[BuildModeIndex]() + end + + if not noplace then + net.Start("BuildMode_Place") + net.WriteUInt(65535, 16) + net.WriteString(BuildModeIndex) + net.WriteFloat(BuildModePos.x) + net.WriteFloat(BuildModePos.y) + net.WriteFloat(BuildModePos.z) + net.WriteAngle(BuildModeAngle) + net.SendToServer() + LocalPlayer():EmitSound("buttonclick.wav") + + BuildModePlaceDelay = CurTime() + 0.05 + end + elseif BuildModeIndex > 0 then + if CurTime() < BuildModePlaceDelay then + return + end + + net.Start("BuildMode_Place") + net.WriteUInt(BuildModeIndex, 16) + net.WriteFloat(BuildModePos.x) + net.WriteFloat(BuildModePos.y) + net.WriteFloat(BuildModePos.z) + net.WriteAngle(BuildModeAngle) + net.SendToServer() + LocalPlayer():EmitSound("buttonclick.wav") + + BuildModePlaceDelay = CurTime() + 0.05 + end + + if dragging then + local selected = {} + dragging = false + + if table.Count(buildmode_selected) > 0 then + for k, v in pairs(buildmode_selected) do + if IsValid(k) then + selected[k] = { + pos = k:GetRenderOrigin(), + ang = k:GetRenderAngles() + } + end + + k.dragorigpos = k:GetPos() + k.dragorigang = k:GetAngles() + end + + net.Start("BuildMode_Drag") + net.WriteTable(selected) + net.SendToServer() + end + + axislock = 0 + + LocalPlayer():EmitSound("buttonclick.wav") + + return + end + + if BuildModeIndex == 0 then + local svec = util.AimVector(LocalPlayer():EyeAngles(), 133, mousex, mousey, ScrW(), ScrH()) + local start = LocalPlayer():EyePos() + + svec:Mul(100000) + + local tr = util.QuickTrace(start, svec, LocalPlayer()) + + if not input.IsKeyDown(KEY_LSHIFT) then + table.Empty(buildmode_selected) + end + + if IsValid(tr.Entity) and tr.Entity:GetClass() == "prop_physics" then + buildmode_selected[tr.Entity] = not buildmode_selected[tr.Entity] + + if buildmode_selected[tr.Entity] == false then + buildmode_selected[tr.Entity] = nil + end + + tr.Entity.dragorigpos = tr.Entity:GetPos() + tr.Entity.dragorigang = tr.Entity:GetAngles() + end + end + end, + [MOUSE_RIGHT] = function () + if dragging and table.Count(buildmode_selected) > 0 then + for k, v in pairs(buildmode_selected) do + if IsValid(k) then + k:SetRenderOrigin(k.dragorigpos) + k:SetRenderAngles(k.dragorigang) + end + + buildmode_selected[k] = nil + end + + dragging = false + axislock = 0 + end + end, + [MOUSE_WHEEL_DOWN] = function () + if not usedown then + local mult = input.IsKeyDown(KEY_LCONTROL) and 0.06666666666666667 or 1 + + BuildModeAngle:RotateAroundAxis(Vector(0, 0, 1), -15 * mult) + LocalPlayer():EmitSound("buttonrollover.wav") + else + BuildModeIndex = BuildModeIndex - 1 + + if BuildModeIndex < 0 then + BuildModeIndex = #buildmode_props + end + + if BuildModeIndex == 0 then + SafeRemoveEntity(GhostModel) + + return + end + + BuildModeCreateGhost() + GhostModel:SetModel(buildmode_props[BuildModeIndex] or buildmode_entmodels[BuildModeIndex]) + end + end, + [MOUSE_WHEEL_UP] = function () + if not usedown then + local mult = input.IsKeyDown(KEY_LCONTROL) and 0.06666666666666667 or 1 + + BuildModeAngle:RotateAroundAxis(Vector(0, 0, 1), 15 * mult) + LocalPlayer():EmitSound("buttonrollover.wav") + else + BuildModeIndex = BuildModeIndex + 1 + + if BuildModeIndex > #buildmode_props then + BuildModeIndex = 0 + end + + if BuildModeIndex == 0 then + SafeRemoveEntity(GhostModel) + + return + end + + BuildModeCreateGhost() + GhostModel:SetModel(buildmode_props[BuildModeIndex] or buildmode_entmodels[BuildModeIndex]) + end + end + } + + function BuildModeInput(ply, bind, pressed, code) + if bind ~= "buildmode" and not camcontrol then + return true + end + end + + hook.Add("OnEntityCreated", "BuildModeProps", function (ent) + if not ent:GetNW2Bool("BRProtected") and ent:GetClass() == "prop_physics" or buildmode_ents[ent:GetClass()] then + table.insert(buildmode_placed, ent) + end + end) + + local dragorigin = nil + + function BuildModeDrag() + if not mousedown then + dragstarty = mousey + dragstartx = mousex + elseif math.abs(dragstartx - mousex) > 5 and not dragging then + local w = mousex - dragstartx + local h = mousey - dragstarty + local x = dragstartx + local y = dragstarty + local flipx = false + local flipy = false + + if w < 0 then + w = -w + x = x - w + flipx = true + end + + if h < 0 then + h = -h + y = y - h + flipy = true + end + + surface.SetDrawColor(50, 125, 255, 80) + surface.DrawRect(x, y, w, h) + surface.SetDrawColor(125, 125, 125, 125) + surface.DrawOutlinedRect(x, y, w, h) + surface.SetDrawColor(0, 200, 0, 255) + cam.Start3D() + + for k, v in ipairs(buildmode_placed) do + if IsValid(v) and not v:GetNW2Bool("BRProtected") then + local pos = v:GetRenderOrigin() or v:GetPos() + local w2s = pos:ToScreen() + local xcheck = flipx and x < w2s.x and w2s.x < w + x or not flipx and x < w2s.x and w2s.x < mousex + local ycheck = flipy and y < w2s.y and w2s.y < h + y or not flipy and y < w2s.y and w2s.y < mousey + + if xcheck and ycheck then + buildmode_selected[v] = true + elseif not input.IsKeyDown(KEY_LSHIFT) then + buildmode_selected[v] = nil + end + end + end + + cam.End3D() + + if not dragging then + dragorigin = nil + + for k, v in pairs(buildmode_selected) do + if IsValid(k) then + k.dragorigpos = k:GetPos() + k.dragorigang = k:GetAngles() + end + end + end + end + end + + function BuildModeSelect() + if dragging then + local svec = util.AimVector(LocalPlayer():EyeAngles(), 133, mousex, mousey, ScrW(), ScrH()) + + dragoffset:Set(svec) + + if not dragorigin then + dragorigin = dragoffset + end + end + + local f = nil + + for k, v in pairs(buildmode_selected) do + f = f or k + + if not IsValid(k) then + buildmode_selected[k] = nil + elseif v then + if dragging then + local newpos = LocalPlayer():EyePos() + dragoffset * f.dragorigpos:Distance(LocalPlayer():EyePos()) - dragorigin + local offset = k.dragorigpos + newpos - f.dragorigpos - dragorigin + + if axislock > 0 then + local a = offset[axislist[axislock]] + + offset:Set(k.dragorigpos) + + offset[axislist[axislock]] = a + end + + k:SetRenderOrigin(offset) + k:SetRenderAngles(k.dragorigang + BuildModeAngle) + end + + local mins, maxs = k:GetRenderBounds() + + render.DrawWireframeBox(k:GetRenderOrigin() or k:GetPos(), k:GetAngles(), mins, maxs, color_white, true) + end + end + + if IsValid(f) and axislock > 0 then + axisdisplay1:Set(f:GetPos()) + + local num = axisdisplay1[axislist[axislock]] + axisdisplay1[axislist[axislock]] = num + 200 + + axisdisplay2:Set(f:GetPos()) + + axisdisplay2[axislist[axislock]] = num - 200 + + render.DrawLine(axisdisplay2, axisdisplay1, axiscolors[axislock]) + end + end + + function BuildModeHUDPaint() + BuildModeDrag() + + if dragging then + surface.SetDrawColor(0, 255, 0) + surface.DrawRect(0, 0, 50, 50) + end + + surface.SetFont("DebugFixed") + surface.SetTextColor(255, 255, 255) + + for k, v in pairs(Checkpoints) do + if not IsValid(v) then + LoadCheckpoints() + + break + end + + local w2s = v:GetPos():ToScreen() + local num = v:GetCPNum() + + surface.SetTextPos(w2s.x, w2s.y) + surface.DrawText(num) + end + + local startw2s = Course_StartPos:ToScreen() + + surface.SetTextPos(startw2s.x, startw2s.y) + surface.DrawText("Spawn") + end + + function BuildModeCommand(ply, ucmd) + LocalPlayer():SetFOV(120) + + if gui.IsGameUIVisible() then + return + end + + camcontrol = input.IsMouseDown(MOUSE_RIGHT) + local newx, newy = input.GetCursorPos() + mousemoved = mousex ~= newx or mousey ~= newy + mousey = newy + mousex = newx + + gui.EnableScreenClicker(not camcontrol) + + usedown = input.IsKeyDown(KEY_E) + mousedown = input.IsMouseDown(MOUSE_LEFT) + + if AEUI.HoveredPanel then + return + end + + if keytime == CurTime() then + return + end + + for k, v in pairs(buildmodeinputs) do + if input.WasKeyPressed(k) then + v() + end + end + + for k, v in pairs(buildmodeinputsmouse) do + if input.WasMousePressed(k) then + v() + end + end + + keytime = CurTime() + end + + net.Receive("BuildMode", function () + BuildMode = net.ReadBool() + + if BuildMode then + hook.Add("PostDrawTranslucentRenderables", "BuildModeGhost", BuildModeGhost) + hook.Add("PostDrawTranslucentRenderables", "BuildModeSelect", BuildModeSelect) + hook.Add("PostDrawTranslucentRenderables", "BuildModePlayerStart", BuildModePlayerStart) + hook.Add("PlayerBindPress", "BuildModeInput", BuildModeInput) + hook.Add("StartCommand", "BuildModeCommand", BuildModeCommand) + hook.Add("HUDPaint", "BuildModeHUDPaint", BuildModeHUDPaint) + LocalPlayer():DrawViewModel(false) + LocalPlayer():SetFOV(120) + hook.Run("BuildModeState", true) + else + hook.Remove("PostDrawTranslucentRenderables", "BuildModeGhost") + hook.Remove("PostDrawTranslucentRenderables", "BuildModeSelect") + hook.Remove("PostDrawTranslucentRenderables", "BuildModePlayerStart") + hook.Remove("PlayerBindPress", "BuildModeInput") + hook.Remove("StartCommand", "BuildModeCommand") + hook.Remove("HUDPaint", "BuildModeHUDPaint") + SafeRemoveEntity(GhostModel) + LocalPlayer():DrawViewModel(true) + gui.EnableScreenClicker(false) + LocalPlayer():SetFOV(0) + + CheckpointNumber = 1 + + hook.Run("BuildModeState", false) + end + end) +end diff --git a/beatrun/gamemodes/beatrun/gamemode/sh/sh_freerunsysall.lua b/beatrun/gamemodes/beatrun/gamemode/sh/sh_freerunsysall.lua new file mode 100644 index 0000000..b1a002a --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sh/sh_freerunsysall.lua @@ -0,0 +1,427 @@ +local quakejump = CreateConVar("Beatrun_QuakeJump", 1, { + FCVAR_REPLICATED, + FCVAR_ARCHIVE +}) +local sidestep = CreateConVar("Beatrun_SideStep", 1, { + FCVAR_REPLICATED, + FCVAR_ARCHIVE +}) + +local function Hardland(jt) + local ply = LocalPlayer() + ply.hardlandtime = CurTime() + 1 + + util.ScreenShake(Vector(0, 0, 0), 2, 2, 0.25, 0) + + BodyAnimCycle = 0 + + if not ply:GetDive() then + if jt then + if ply:GetMelee() == MELEE_DROPKICK then + jt = false + end + + DoJumpTurn(jt) + BodyAnim:SetSequence("jumpturnflyidle") + else + BodyAnim:SetSequence("jumpcoilend") + end + end +end + +if game.SinglePlayer() and SERVER then + util.AddNetworkString("Beatrun_HardLand") +end + +if game.SinglePlayer() and CLIENT then + net.Receive("Beatrun_HardLand", function () + Hardland(net.ReadBool()) + end) +end + +hook.Add("PlayerStepSoundTime", "MEStepTime", function (ply, step, walking) + local activewep = ply:GetActiveWeapon() + local sprint = ply:GetMEMoveLimit() < 300 + local stepmod = ply:GetStepRight() and 1 or -1 + local stepvel = 1.25 + local stepvel2 = 1 + + if BodyAnimArmCopy then + stepvel2 = 0 + end + + stepvel = stepvel - math.abs(ply:GetMEMoveLimit() / 100 - 1) * 0.33 + local stepmod2 = 1 + local stepmod3 = 1 + + if IsValid(activewep) and activewep:GetClass() ~= "runnerhands" then + stepmod2 = 0.25 + + if not ply:IsSprinting() then + stepmod3 = 0.25 + end + end + + if not ply:Crouching() and not ply:KeyDown(IN_WALK) then + if game.SinglePlayer() then + local intensity = ply:GetInfoNum("Beatrun_ViewbobIntensity", 20) / 20 + intensity = sprint and intensity * 0.5 or intensity * 0.25 + + ply:ViewPunch(Angle(0.45 * stepmod2 * stepvel2, 0, 0.5 * stepmod * stepvel * stepmod3) * intensity) + elseif CLIENT and IsFirstTimePredicted() then + local intensity = ply:GetInfoNum("Beatrun_ViewbobIntensity", 20) / 20 + intensity = sprint and intensity * 0.25 or intensity * 0.1 + + ply:CLViewPunch(Angle(0.45 * stepmod2 * stepvel2, 0, 0.5 * stepmod * stepvel * stepmod3) * intensity) + end + end + + local steptime = math.Clamp(750 / (ply:GetVelocity() * Vector(1, 1, 0)):Length() * 100, 200, 400) + + if ply:Crouching() then + steptime = steptime * 2 + end + + if ply:InOverdrive() then + steptime = steptime * 0.8 + end + + ply:SetStepRelease(CurTime() + steptime * 0.25 * 0.001) + + return steptime +end) +hook.Add("PlayerFootstep", "MEStepSound", function (ply, pos, foot, sound, volume, filter, skipcheck) + ply:SetStepRight(not ply:GetStepRight()) + + if (ply:GetSliding() or CurTime() < ply:GetSafetyRollTime() - 0.5) and not skipcheck then + return true + end + + if ply:GetMEMoveLimit() < 155 and ply:KeyDown(IN_FORWARD) and not ply.FootstepLand and not IsValid(ply:GetBalanceEntity()) then + return true + end + + local mat = sound:sub(0, -6) + local newsound = FOOTSTEPS_LUT[mat] + + if mat == "player/footsteps/ladder" then + return + end + + newsound = newsound or "Concrete" + ply.LastStepMat = newsound + + if game.SinglePlayer() then + ply:SetNW2String("LastStepMat", newsound) + end + + ply.FootstepReleaseLand = true + + if CLIENT or game.SinglePlayer() then + ply:EmitSound("Footsteps." .. newsound) + ply:EmitSound("Cloth.MovementRun") + + if math.random() > 0.9 then + ParkourEvent("step") + end + end + + ply.LastFootstepSound = mat + + if ply:WaterLevel() > 0 then + ply:EmitSound("Footsteps.Water") + end + + if ply:InOverdrive() and ply:GetVelocity():Length() > 300 then + ply:EmitSound("Footsteps.Spark") + end + + if (CLIENT_IFTP() or game.SinglePlayer()) and ply.FootstepLand then + local landsound = FOOTSTEPS_LAND_LUT[mat] or "Concrete" + + ply:EmitSound("Land." .. landsound) + + ply.FootstepLand = false + end + + hook.Run("PlayerFootstepME", ply, pos, foot, sound, volume, filter) + + return true +end) +hook.Add("OnPlayerHitGround", "MELandSound", function (ply, water, floater, speed) + local vel = ply:GetVelocity() + vel.z = 0 + ply.FootstepLand = true + ply.LastLandTime = CurTime() + + ply:ViewPunch(Angle(3, 0, 1.5) * speed * 0.0025) + + if SERVER and vel:Length() < 100 then + ply:PlayStepSound(1) + end + + ParkourEvent("land", ply) + + if ply:GetMelee() == MELEE_DROPKICK and ply:GetMeleeTime() < CurTime() and vel:Length() < 300 then + if CLIENT_IFTP() then + Hardland(false) + elseif SERVER and game.SinglePlayer() then + net.Start("Beatrun_HardLand") + net.WriteBool(false) + net.Send(ply) + end + end + + if not ply:InOverdrive() and speed > 500 and speed < 750 and not ply:GetJumpTurn() and (ply:GetSafetyRollKeyTime() <= CurTime() or ply:GetCrouchJump()) then + ply:ViewPunch(Angle(10, -2, 5)) + ply:SetMESprintDelay(CurTime() + 0.5) + ply:SetMEMoveLimit(50) + + local jt = false + local eyedir = ply:EyeAngles() + eyedir.x = 0 + eyedir = eyedir:Forward() + local vel = ply:GetVelocity() + vel.z = 0 + + if ply:GetCrouchJumpTime() < CurTime() and vel:GetNormalized():Dot(eyedir) < -0.75 then + jt = true + + ply:SetJumpTurn(true) + end + + if CLIENT_IFTP() then + Hardland(jt) + elseif SERVER and game.SinglePlayer() then + net.Start("Beatrun_HardLand") + net.WriteBool(jt) + net.Send(ply) + end + end + + if SERVER and speed >= 500 and ply:GetJumpTurn() then + local info = DamageInfo() + local dmg = ply:Health() * 0.1 + + if ply:Health() - dmg > 0 then + info:SetDamage(dmg) + info:SetDamageType(DMG_FALL) + info:SetAttacker(game.GetWorld()) + info:SetInflictor(game.GetWorld()) + ply:TakeDamageInfo(info) + end + end +end) +hook.Add("SetupMove", "MESetupMove", function (ply, mv, cmd) + local activewep = ply:GetActiveWeapon() + local usingrh = IsValid(activewep) and activewep:GetClass() == "runnerhands" + local ismoving = (mv:KeyDown(IN_FORWARD) or not ply:OnGround() or ply:Crouching()) and not mv:KeyDown(IN_BACK) and ply:Alive() and (mv:GetVelocity():Length() > 50 or ply:GetMantle() ~= 0 or ply:Crouching()) + + if (CLIENT or game.SinglePlayer()) and CurTime() > (ply:GetStepRelease() or 0) and ply.FootstepReleaseLand then + local newsound = FOOTSTEPS_RELEASE_LUT[ply.LastFootstepSound] or "Concrete" + + if ply:WaterLevel() > 0 then + ply:EmitSound("Release.Water") + end + + ply:EmitSound("Release." .. newsound) + + ply.FootstepReleaseLand = false + end + + if not ply:OnGround() and ply:GetClimbing() == 0 and mv:GetVelocity():Length() > 50 then + ply.FootstepLand = true + end + + if ply:GetRunSpeed() ~= 325 * ply:GetOverdriveMult() then + ply:SetRunSpeed(325 * ply:GetOverdriveMult()) + end + + if not ply:GetMEMoveLimit() then + ply:SetMEMoveLimit(150) + ply:SetMESprintDelay(0) + ply:SetMEAng(0) + end + + if ply:KeyDown(IN_WALK) then + mv:SetForwardSpeed(mv:GetForwardSpeed() * 0.0065) + mv:SetSideSpeed(mv:GetSideSpeed() * 0.0065) + ply:SetMEMoveLimit(150) + ply:SetMESprintDelay(0) + ply:SetMEAng(0) + mv:SetButtons(bit.band(mv:GetButtons(), bit.bnot(IN_JUMP))) + end + + local ang = mv:GetAngles() + ang[1] = 0 + ang[3] = 0 + local MEAng = math.Truncate(ang:Forward().x, 2) + local MEAngDiff = math.abs((MEAng - ply:GetMEAng()) * 100) + local weaponspeed = 150 + local activewep = ply:GetActiveWeapon() + + if IsValid(activewep) and activewep:GetClass() ~= "runnerhands" then + weaponspeed = 250 + end + + if (ismoving or ply:GetMantle() ~= 0) and ply:GetMESprintDelay() < CurTime() and (cmd:KeyDown(IN_SPEED) or ply:GetMantle() ~= 0 or not ply:OnGround() or (not ply:OnGround() or ply:GetMantle() ~= 0) and mv:GetVelocity().z > -450) then + local mult = 0.6 + math.abs(ply:GetMEMoveLimit() / 300 - 1) + + if not ply:InOverdrive() and ply:GetMEMoveLimit() > 225 then + mult = mult * 0.35 + end + + if ply:GetMEMoveLimit() < 160 then + mult = mult * ply:GetMEMoveLimit() / 1000 + end + + ply:SetMEMoveLimit(math.Clamp(ply:GetMEMoveLimit() + mult * ply:GetOverdriveMult() * 2, 0, 325 * ply:GetOverdriveMult())) + elseif not ismoving and (not ply:Crouching() or ply:GetCrouchJump()) or CurTime() < ply:GetMESprintDelay() and ply:OnGround() then + ply:SetMEMoveLimit(math.Clamp(ply:GetMEMoveLimit() - 40, weaponspeed, 325 * ply:GetOverdriveMult())) + end + + if MEAngDiff > 1.25 and ply:GetWallrun() == 0 then + local slow = MEAngDiff * 0.75 + + ply:SetMEMoveLimit(math.max(ply:GetMEMoveLimit() - slow, 160)) + end + + if ply:OnGround() then + local stepheight = mv:GetOrigin().z - (ply.LastOrigin or vector_origin).z + + if stepheight > 1.5 then + ply:SetMEMoveLimit(math.Approach(ply:GetMEMoveLimit(), 250, FrameTime() * 100)) + elseif stepheight < -0.8 then + ply:SetMEMoveLimit(math.Approach(ply:GetMEMoveLimit(), 400, FrameTime() * 100)) + end + end + + ply.LastOrigin = mv:GetOrigin() + + if ply:GetSliding() then + ply:SetMEMoveLimit(150) + ply:SetMaxSpeed(200) + end + + mv:SetMaxClientSpeed(ply:GetMEMoveLimit()) + ply:SetMEAng(MEAng) + + if sidestep:GetBool() and usingrh and activewep.GetSideStep and not activewep:GetSideStep() and CurTime() > ply:GetSlidingDelay() - 0.2 and ply:GetClimbing() == 0 and ply:OnGround() and not ply:Crouching() and not cmd:KeyDown(IN_FORWARD) and not cmd:KeyDown(IN_JUMP) and cmd:KeyDown(IN_ATTACK2) then + if mv:KeyDown(IN_MOVELEFT) then + activewep:SendWeaponAnim(ACT_TURNLEFT45) + activewep:SetSideStep(true) + mv:SetVelocity(cmd:GetViewAngles():Right() * -600) + ply:ViewPunch(Angle(-3, 0, -4.5)) + ParkourEvent("sidestepleft", ply) + + activewep.SideStepDir = ang:Forward() + + if game.SinglePlayer() then + ply:PlayStepSound(1) + end + elseif mv:KeyDown(IN_MOVERIGHT) then + activewep:SendWeaponAnim(ACT_TURNRIGHT45) + activewep:SetSideStep(true) + mv:SetVelocity(cmd:GetViewAngles():Right() * 600) + ply:ViewPunch(Angle(-3, 0, 4.5)) + ParkourEvent("sidestepright", ply) + + activewep.SideStepDir = ang:Forward() + + if game.SinglePlayer() then + ply:PlayStepSound(1) + end + end + elseif usingrh and activewep.GetSideStep and activewep:GetSideStep() then + local forwarddelta = activewep.SideStepDir:Dot(ang:Forward()) + + if forwarddelta > 0.35 then + ply:SetMEMoveLimit(250) + end + + if forwarddelta < 0.65 then + forwarddelta = 1 + else + forwarddelta = forwarddelta * 0.025 + end + + mv:SetForwardSpeed(mv:GetForwardSpeed() * forwarddelta) + mv:SetSideSpeed(mv:GetSideSpeed() * math.abs(forwarddelta - 1)) + + if mv:KeyPressed(IN_JUMP) and not quakejump:GetBool() and activewep:GetWasOnGround() and not ply:GetJumpTurn() and ply:GetViewModel():GetCycle() < 0.25 then + local vel = mv:GetVelocity() + + vel:Mul(0.75) + + vel.z = -300 + + mv:SetVelocity(vel) + activewep:SetWasOnGround(false) + end + end +end) + +if CLIENT then + local jumpseq = { + ACT_VM_HAULBACK, + ACT_VM_SWINGHARD + } + + hook.Add("CreateMove", "MECreateMove", function (cmd) + local ply = LocalPlayer() + local usingrh = ply:UsingRH() + local hardland = CurTime() < (ply.hardlandtime or 0) + + if hardland and not ply:InOverdrive() then + cmd:RemoveKey(IN_ATTACK2) + cmd:SetForwardMove(cmd:GetForwardMove() * 0.01) + cmd:SetSideMove(cmd:GetSideMove() * 0.01) + end + + if (ply:InOverdrive() or usingrh and ply:GetMoveType() == MOVETYPE_WALK and not hardland and ply:OnGround()) and not cmd:KeyDown(IN_SPEED) and not ply:GetSliding() and not IsValid(ply:GetBalanceEntity()) then + cmd:SetButtons(cmd:GetButtons() + IN_SPEED) + end + end) + hook.Add("GetMotionBlurValues", "MEBlur", function (h, v, f, r) + local ply = LocalPlayer() + local vel = LocalPlayer():GetVelocity() + + if not ply.blurspeed then + ply.blurspeed = 0 + end + + if inmantle then + vel = vector_origin + end + + if vel:Length() > 300 then + ply.blurspeed = Lerp(0.001, ply.blurspeed, 0.1) + elseif ply:GetMantle() == 0 then + ply.blurspeed = math.Approach(ply.blurspeed, 0, 0.005) + end + + return h, v, ply.blurspeed, r + end) +end + +MMY = 0 +MMX = 0 + +hook.Add("InputMouseApply", "MouseMovement", function (cmd, x, y) + MMY = y + MMX = x + local ply = LocalPlayer() + local activewep = ply:GetActiveWeapon() + local usingrh = ply:UsingRH(activewep) + + if not LocalPlayer():OnGround() or usingrh and activewep.GetSideStep and activewep:GetSideStep() then + MMX = 0 + end +end) + +if CLIENT then + net.Receive("DoorBashAnim", function () + ArmInterrupt("doorbash") + LocalPlayer():CLViewPunch(Angle(1.5, -0.75, 0)) + end) +end diff --git a/beatrun/gamemodes/beatrun/gamemode/shared.lua b/beatrun/gamemodes/beatrun/gamemode/shared.lua new file mode 100644 index 0000000..ecc8b85 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/shared.lua @@ -0,0 +1,14 @@ +STAR = "★" +REC = "⚫" +VERSIONGLOBAL = "v1.Zero" +DeriveGamemode( "sandbox" ) +GM.Name = "Beatrun" +GM.Author = "datae" +GM.Email = "datae@dontemailme.com" +GM.Website = "www.mirrorsedge.com" +include( 'player_class/player_beatrun.lua' ) + +for k,v in ipairs(file.Find("beatrun/gamemode/sh/*.lua", "LUA")) do + AddCSLuaFile("sh/"..v) + include("sh/"..v) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/Disarm.lua b/beatrun/gamemodes/beatrun/gamemode/sv/Disarm.lua new file mode 100644 index 0000000..192a9f1 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/Disarm.lua @@ -0,0 +1,30 @@ +util.AddNetworkString("DisarmStart") +local cvardisarm = CreateConVar("Beatrun_Disarm", 1, FCVAR_ARCHIVE, "Whether 'using' NPCs triggers a disarm", 0, 1) + +local function Disarm_Init(ply, victim) + victim:NextThink(CurTime()+100) + victim.InDisarm = true + victim:DropWeapon() + + net.Start("DisarmStart") + net.WriteEntity(victim) + net.Send(ply) + + timer.Simple(1.35, function() if IsValid(victim) then victim:TakeDamage(victim:Health()) end end) +end + +local function Disarm(ply, ent) + if !cvardisarm:GetBool() then return end + if ent:IsNPC() and !ent.InDisarm then + if ply:KeyPressed(IN_USE) then + Disarm_Init(ply, ent) + end + end +end +hook.Add("PlayerUse", "Disarm", Disarm) + +hook.Add("CreateEntityRagdoll", "Disarm_Ragdoll", function(ent, rag) + if ent.InDisarm then + rag:Remove() + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/DoorBash.lua b/beatrun/gamemodes/beatrun/gamemode/sv/DoorBash.lua new file mode 100644 index 0000000..2d3a9bd --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/DoorBash.lua @@ -0,0 +1,35 @@ +local doors = +{ +["func_door_rotating"] = true, +["prop_door_rotating"] = true +} +util.AddNetworkString("DoorBashAnim") +hook.Add("PlayerUse", "DoorBash", function(ply, ent) + if doors[ent:GetClass()] then + if ply:GetVelocity():Length() < 100 or ply:Crouching() then return end + if ent.bashdelay and ent.bashdelay > CurTime() then return end + if ent:GetInternalVariable("m_bLocked") then return end + local speed = ent:GetInternalVariable("speed") + if !ent.oldspeed then + ent.oldspeed = speed + ent.bashdelay = 0 + end + + net.Start("DoorBashAnim") + net.Send(ply) + + ent:SetSaveValue("speed", ent.oldspeed*4) + ent:Use(ply) + ent.bashdelay = CurTime()+1 + ent:SetCycle(1) + ent:Fire("Lock") + timer.Simple(1, function() + if IsValid(ent) then + ent:SetSaveValue("speed", ent.oldspeed) + ent:Fire("Unlock") + end + end) + ent:EmitSound("Door.Barge") + return false + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/KarmaBGone.lua b/beatrun/gamemodes/beatrun/gamemode/sv/KarmaBGone.lua new file mode 100644 index 0000000..60c0ab8 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/KarmaBGone.lua @@ -0,0 +1,32 @@ +--Kicks people net spamming so the server doesn't eat shit +--Just a pasta of net.Incoming with an added check +if game.SinglePlayer() then return end + +local maxmsgcount = 100 +local netIncoming_old = net.Receive +local netIncoming_detour = function(length, ply) + local tickcount = engine.TickCount() + if tickcount > (ply.NetDelay or 0) then + ply.NetDelayCount = 0 + ply.NetDelay = tickcount+ 10 + end + ply.NetDelayCount = ply.NetDelayCount + 1 + + if ply.NetDelayCount > maxmsgcount then + ply:Kick("Client sent too much data") + return + end + + local i = net.ReadHeader() + local strName = util.NetworkIDToString( i ) + + if ( !strName ) then return end + + local func = net.Receivers[ strName:lower() ] + if ( !func ) then return end + + length = length - 16 + func( length, ply ) +end + +net.Incoming = netIncoming_detour \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/MapScript.lua b/beatrun/gamemodes/beatrun/gamemode/sv/MapScript.lua new file mode 100644 index 0000000..f76b610 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/MapScript.lua @@ -0,0 +1,16 @@ +function BRProtectedEntity(class, pos, ang) + local a = ents.Create(class) + a:SetPos(pos) + a:SetAngles(ang) + a:Spawn() + a:SetNW2Bool("BRProtected", true) + + return a +end + +if file.Exists("beatrun/gamemode/Maps/"..game.GetMap().."_cl.lua", "LUA") then + AddCSLuaFile("beatrun/gamemode/Maps/"..game.GetMap().."_cl.lua") +end +if file.Exists("beatrun/gamemode/Maps/"..game.GetMap()..".lua", "LUA") then + include("beatrun/gamemode/Maps/"..game.GetMap()..".lua") +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/NPCBehavior.lua b/beatrun/gamemodes/beatrun/gamemode/sv/NPCBehavior.lua new file mode 100644 index 0000000..58fee0f --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/NPCBehavior.lua @@ -0,0 +1,41 @@ +Beatrun_NPCs = Beatrun_NPCs or {} +local npctbl = Beatrun_NPCs +hook.Add("OnEntityCreated", "NPCTracker", function(ent) + if IsValid(ent) and ent:IsNPC() then + table.insert(Beatrun_NPCs, ent) + ent.OldProficiency = ent:GetCurrentWeaponProficiency() + ent.NextProficiency = 0 + end +end) + +hook.Add("EntityRemoved", "NPCTracker", function(ent) + for k, npc in ipairs(npctbl) do + if !IsValid(npc) then + table.remove(npctbl, k) + end + end +end) + +local updaterate = 0.2 +local updatetime = 0 +hook.Add("Tick", "NPCBehavior", function() + local CT = CurTime() + if updatetime > CT then return end + for k, npc in ipairs(npctbl) do + if !IsValid(npc) then + continue + end + local enemy = npc:GetEnemy() + if !IsValid(enemy) or !enemy:IsPlayer() then + continue + end + + if enemy:GetJumpTurn() or enemy:GetSliding() or enemy:GetWallrun() > 0 or enemy:GetVelocity():Length() > 300 then + npc:SetCurrentWeaponProficiency( WEAPON_PROFICIENCY_POOR ) + npc.NextProficiency = CT + 1 + elseif CT > npc.NextProficiency then + npc:SetCurrentWeaponProficiency( npc.OldProficiency or WEAPON_PROFICIENCY_GOOD ) + end + end + updatetime = CT + updaterate +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/PacketLossNet.lua b/beatrun/gamemodes/beatrun/gamemode/sv/PacketLossNet.lua new file mode 100644 index 0000000..fd88b93 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/PacketLossNet.lua @@ -0,0 +1,7 @@ +local updatetime = 0 +hook.Add("PlayerPostThink", "PacketLossNet", function(ply) + if CurTime() > updatetime then + ply:SetNW2Int("PLoss",ply:PacketLoss()) + updatetime = CurTime()+4 + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/Replay.lua b/beatrun/gamemodes/beatrun/gamemode/sv/Replay.lua new file mode 100644 index 0000000..7462dd0 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/Replay.lua @@ -0,0 +1,33 @@ +util.AddNetworkString("ReplayRequest") +util.AddNetworkString("ReplayTutorialPos") + +net.Receive("ReplayRequest", function(len,ply) + local stopped = net.ReadBool() + if !stopped and !ply.InReplay and ((Course_Name != "") or TUTORIALMODE) then + ply.InReplay = true + ply:ResetParkourState() + ply:Spawn() + ply:SetNW2Int("CPNum", -1) + ply:SetLocalVelocity(vector_origin) + ply:SetLaggedMovementValue( 0 ) + timer.Simple(0.1, function() ply:SetLaggedMovementValue( 1 ) end) + if !TUTORIALMODE then + ply:SetPos(Course_StartPos) + else + ply:SetPos(net.ReadVector()) + end + net.Start("ReplayRequest") + net.Send(ply) + elseif stopped then + ply.InReplay = false + end + + hook.Run("PostReplayRequest", ply, stopped) +end) + +net.Receive("ReplayTutorialPos", function(len, ply) + if !TUTORIALMODE then return end + local pos = net.ReadVector() + ply:SetPos(pos or ply:GetPos()) + ply:SetLocalVelocity(vector_origin) +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/Whitescale.lua b/beatrun/gamemodes/beatrun/gamemode/sv/Whitescale.lua new file mode 100644 index 0000000..13be00c --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/Whitescale.lua @@ -0,0 +1,41 @@ +util.AddNetworkString("ToggleWhitescale") +local skypaint +local skypaintdata = { +Vector(0, 0.34, 0.93), +Vector(0.36, 0.76, 1), +Vector(0.25, 0.1, 0), +Vector(1, 1, 1), +0.44, +0.66, +0.79, +0.5, +7.44 +} +function WhitescaleOn() + if BlockWhitescaleSkypaint then return end + if !IsValid(skypaint) then + skypaint = ents.FindByClass("env_skypaint")[1] + end + + if IsValid(skypaint) then + skypaint:SetTopColor(skypaintdata[1]) + skypaint:SetBottomColor(skypaintdata[2]) + skypaint:SetSunColor(skypaintdata[3]) + skypaint:SetDuskColor(skypaintdata[4]) + skypaint:SetFadeBias(skypaintdata[5]) + skypaint:SetHDRScale(skypaintdata[6]) + skypaint:SetDuskScale(skypaintdata[7]) + skypaint:SetDuskIntensity(skypaintdata[8]) + skypaint:SetSunSize(skypaintdata[9]) + skypaint:SetDrawStars(false) + end +end + +net.Receive("ToggleWhitescale", function(len, ply) + local toggle = net.ReadBool() + if toggle then + WhitescaleOn() + else + + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/blind.lua b/beatrun/gamemodes/beatrun/gamemode/sv/blind.lua new file mode 100644 index 0000000..83292b7 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/blind.lua @@ -0,0 +1,76 @@ +util.AddNetworkString("BlindPlayers") +util.AddNetworkString("BlindNPCKilled") + +local function Echo() + return false +end + +blinded = false +concommand.Add("toggleblindness", function(ply) + if IsValid(ply) and !ply:IsSuperAdmin() then return end + blinded = !blinded + net.Start("BlindPlayers") + net.WriteBool(blinded) + net.Broadcast() + + if blinded then + for k,v in pairs(ents.FindByClass("env_soundscape")) do + v:Remove() + end + hook.Add("EntityEmitSound","Echo",Echo) + else + hook.Remove("EntityEmitSound","Echo") + end +end) + +local red = Color(255,90,90) +local green = Color(90,255,90) +concommand.Add("blindplayer", function(ply, cmd, args) + if IsValid(ply) and !ply:IsSuperAdmin() then return end + local blinded = tobool(args[2]) + local blindedstr = (blinded and "is now blind.\n") or "is no longer blind.\n" + local blindedcol = (blinded and red) or green + local plysearch = args[1] + if !plysearch then + MsgC(red, "syntax: blindplayer (player name) (0/1)\n") + return + end + + local mply = nil + local mname = "" + local mcount = 0 + for k,v in ipairs(player.GetAll()) do + local name = v:Nick() + local smatch = string.match(name, plysearch) + if smatch then + local slen = smatch:len() + if slen > mcount then + mply = v + mname = name + mcount = slen + end + end + end + + if IsValid(mply) then + MsgC(blindedcol, mname, " ", blindedstr) + else + MsgC(red, "Player not found: ",plysearch) + return + end + net.Start("BlindPlayers") + net.WriteBool(blinded) + net.Send(mply) +end) + +hook.Add("OnNPCKilled", "BlindNPCKilled", function(npc,attacker,inflictor) + if blinded and attacker:IsPlayer() then + net.Start("BlindNPCKilled") + net.Send(attacker) + end +end) + +hook.Add("InitPostEntity", "WtfTFA", function() + hook.Remove("EntityEmitSound", "zzz_TFA_EntityEmitSound") + hook.Remove("InitPostEntity", "WtfTFA") +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/spawn.lua b/beatrun/gamemodes/beatrun/gamemode/sv/spawn.lua new file mode 100644 index 0000000..ffc8a3c --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/spawn.lua @@ -0,0 +1,6 @@ +DEFINE_BASECLASS( "gamemode_base" ) +function GM:PlayerSpawn(ply, transition) + player_manager.SetPlayerClass( ply, "player_beatrun" ) + + BaseClass.PlayerSpawn( self, ply, transition ) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/sv_hitsoundsme.lua b/beatrun/gamemodes/beatrun/gamemode/sv/sv_hitsoundsme.lua new file mode 100644 index 0000000..98a16a5 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/sv_hitsoundsme.lua @@ -0,0 +1,16 @@ +util.AddNetworkString("DeathStopSound") + +hook.Add("EntityTakeDamage", "MEHitSounds", function( ply, dmginfo ) + if !ply:IsPlayer() then return end + if ( dmginfo:IsBulletDamage() ) then + --[[Block damage if they're going very fast]] + if ply:GetVelocity():Length() > 400 then return true end + ply:EmitSound("mirrorsedge/Flesh_0"..tostring(math.random(1,9))..".wav") + ply:ViewPunch(Angle(math.Rand(-10,-5),0,math.Rand(0,5))) + elseif ( dmginfo:IsFallDamage() and ply:Health()-dmginfo:GetDamage()<=0 ) and !ply:HasGodMode() and !blinded then + net.Start("DeathStopSound") + net.Send(ply) + timer.Simple(0.01,function() if IsValid(ply) then ply:EmitSound("mirrorsedge/DeathFall"..tostring(math.random(1,4))..".wav") end end) + ply:ScreenFade( SCREENFADE.OUT, Color( 0, 0, 0, 255 ), 0.05, 10 ) + end +end) \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/gamemode/sv/zLadderDebug.lua b/beatrun/gamemodes/beatrun/gamemode/sv/zLadderDebug.lua new file mode 100644 index 0000000..0561dc6 --- /dev/null +++ b/beatrun/gamemodes/beatrun/gamemode/sv/zLadderDebug.lua @@ -0,0 +1,9 @@ +function LadderSpawnDebug() + local p=Entity(1):GetEyeTrace() + a=ents.Create('br_ladder') + a:SetAngles(p.HitNormal:Angle()) + a:SetPos(p.HitPos+p.HitNormal*10) + a:Spawn() + sk=util.QuickTrace(p.HitPos,Vector(0,0,100000)).HitPos-p.HitNormal*10 + a:LadderHeightExact(util.QuickTrace(sk, Vector(0,0,-100000)).HitPos:Distance(a:GetPos())-62) +end \ No newline at end of file diff --git a/beatrun/gamemodes/beatrun/icon24.png b/beatrun/gamemodes/beatrun/icon24.png new file mode 100644 index 0000000..1828562 Binary files /dev/null and b/beatrun/gamemodes/beatrun/icon24.png differ diff --git a/beatrun/gamemodes/beatrun/logo.png b/beatrun/gamemodes/beatrun/logo.png new file mode 100644 index 0000000..b47e15e Binary files /dev/null and b/beatrun/gamemodes/beatrun/logo.png differ diff --git a/vmaniprework/lua/autorun/client/cl_vmanip.lua b/vmaniprework/lua/autorun/client/cl_vmanip.lua new file mode 100644 index 0000000..218c8c8 --- /dev/null +++ b/vmaniprework/lua/autorun/client/cl_vmanip.lua @@ -0,0 +1,691 @@ +--[[N++ Protip: View > Collapse Level 1 +More detail on stuff in lua/vmanip/vmanip_baseanims.lua + +Please keep in mind that you do not fire events *through vmanip*. Think of it as a fully +clientside animation system. So instead, you request to play an anim, and if the request +went through (true return value), you do your thing + +You probably don't need to snoop around this file, but feel free +]] +VManip = {} +VMLegs = {} +local curtime = 0 + +--Non linear lerping +local function LerpC(t, a, b, powa) + return a + (b - a) * math.pow(t, powa) +end + +local properang = Angle(-79.750, 0, -90) + +local leftarmbones = {"ValveBiped.Bip01_L_UpperArm", "ValveBiped.Bip01_L_Forearm", "ValveBiped.Bip01_L_Hand", "ValveBiped.Bip01_L_Wrist", "ValveBiped.Bip01_L_Ulna", "ValveBiped.Bip01_L_Finger4", "ValveBiped.Bip01_L_Finger41", "ValveBiped.Bip01_L_Finger42", "ValveBiped.Bip01_L_Finger3", "ValveBiped.Bip01_L_Finger31", "ValveBiped.Bip01_L_Finger32", "ValveBiped.Bip01_L_Finger2", "ValveBiped.Bip01_L_Finger21", "ValveBiped.Bip01_L_Finger22", "ValveBiped.Bip01_L_Finger1", "ValveBiped.Bip01_L_Finger11", "ValveBiped.Bip01_L_Finger12", "ValveBiped.Bip01_L_Finger0", "ValveBiped.Bip01_L_Finger01", "ValveBiped.Bip01_L_Finger02"} + +local playermodelbonesupper = {"ValveBiped.Bip01_L_Forearm", "ValveBiped.Bip01_L_UpperArm", "ValveBiped.Bip01_L_Clavicle", "ValveBiped.Bip01_L_Hand", "ValveBiped.Bip01_Spine4", "ValveBiped.Bip01_Neck1", "ValveBiped.Bip01_Head1", "ValveBiped.Bip01_L_Finger4", "ValveBiped.Bip01_L_Finger41", "ValveBiped.Bip01_L_Finger42", "ValveBiped.Bip01_L_Finger3", "ValveBiped.Bip01_L_Finger31", "ValveBiped.Bip01_L_Finger32", "ValveBiped.Bip01_L_Finger2", "ValveBiped.Bip01_L_Finger21", "ValveBiped.Bip01_L_Finger22", "ValveBiped.Bip01_L_Finger1", "ValveBiped.Bip01_L_Finger11", "ValveBiped.Bip01_L_Finger12", "ValveBiped.Bip01_L_Finger0", "ValveBiped.Bip01_L_Finger01", "ValveBiped.Bip01_L_Finger02", "ValveBiped.Bip01_R_Forearm", "ValveBiped.Bip01_R_UpperArm", "ValveBiped.Bip01_R_Clavicle", "ValveBiped.Bip01_R_Hand", "ValveBiped.Bip01_R_Finger4", "ValveBiped.Bip01_R_Finger41", "ValveBiped.Bip01_R_Finger42", "ValveBiped.Bip01_R_Finger3", "ValveBiped.Bip01_R_Finger31", "ValveBiped.Bip01_R_Finger32", "ValveBiped.Bip01_R_Finger2", "ValveBiped.Bip01_R_Finger21", "ValveBiped.Bip01_R_Finger22", "ValveBiped.Bip01_R_Finger1", "ValveBiped.Bip01_R_Finger11", "ValveBiped.Bip01_R_Finger12", "ValveBiped.Bip01_R_Finger0", "ValveBiped.Bip01_R_Finger01"} + +local tableintensity = {1, 1, 1} + +VManip.Reset = function() + VManip.Anims = {} + VManip.VMGesture = nil + VManip.AssurePos = false + VManip.LockToPly = false + VManip.LockZ = 0 + VManip.VMCam = nil + VManip.Cam_Ang = properang + VManip.Cam_AngInt = nil + VManip.StartCycle = 0 + VManip.Cycle = 0 + VManip.CurGesture = nil + VManip.CurGestureData = nil + VManip.GestureMatrix = nil + VManip.Lerp_Peak = nil + VManip.Lerp_Speed_In = nil + VManip.Lerp_Speed_Out = nil + VManip.Lerp_Curve = nil + VManip.Duration = 0 + VManip.HoldTime = nil + VManip.HoldQuit = false + VManip.PreventQuit = false + VManip.QueuedAnim = nil + VManip.Segmented = false + VManip.SegmentFinished = false + VManip.CurSegment = nil + VManip.LastSegment = false + VManip.SegmentCount = 0 + VManip.CurSegmentSequence = nil + VManip.GesturePastHold = false + VManip.GestureOnHold = false + VManip.Attachment = nil +end + +VManip.Remove = function() + if VManip:IsActive() then + hook.Run("VManipPreRemove", VManip:GetCurrentAnim()) + end + + if IsValid(VManip.VMGesture) then + VManip.VMGesture:Remove() + end + + if IsValid(VManip.VMCam) then + VManip.VMCam:Remove() + end + + VManip.VMGesture = nil + VManip.AssurePos = false + VManip.LockToPly = false + VManip.LockZ = 0 + VManip.VMCam = nil + VManip.Cam_Ang = properang + VManip.Cam_AngInt = nil + VManip.Cycle = 0 + VManip.StartCycle = 0 + VManip.Attachment = nil + VManip.CurGesture = nil + VManip.CurGestureData = nil + VManip.GestureMatrix = nil + VManip.Lerp_Peak = nil + VManip.Lerp_Speed_In = nil + VManip.Lerp_Speed_Out = nil + VManip.Duration = 0 + VManip.HoldTime = nil + VManip.HoldQuit = false + VManip.PreventQuit = false + VManip.QueuedAnim = nil + VManip.Segmented = false + VManip.SegmentFinished = false + VManip.CurSegment = nil + VManip.LastSegment = false + VManip.SegmentCount = 0 + VManip.CurSegmentSequence = nil + VManip.GesturePastHold = false + VManip.GestureOnHold = false + hook.Run("VManipRemove") +end + +VManip:Reset() + +VManip.RegisterAnim = function(self, name, tbl) + self.Anims[name] = tbl +end + +VManip.GetAnim = function(self, name) return self.Anims[name] end +VManip.IsActive = function(self) return IsValid(self.VMGesture) end +VManip.GetVMGesture = function(self) return self.VMGesture end +VManip.GetCurrentAnim = function(self) return self.CurGesture end +VManip.GetCurrentSegment = function(self) return self.CurSegment end +VManip.GetCycle = function(self) return self.Cycle end + +VManip.SetCycle = function(self, newcycle) + self.Cycle = newcycle +end + +VManip.IsSegmented = function(self) return self.Segmented end +VManip.GetSegmentCount = function(self) return self.SegmentCount end + +local function PlayVMPSound(ent, sound, anim) + if VManip:GetCurrentAnim() == anim and ent:Alive() then + ent:EmitSound(sound) + end +end + +local function PlaySoundsInTable(tbl, animname) + local ply = LocalPlayer() + + for k, v in pairs(tbl) do + timer.Simple(v, function() + PlayVMPSound(ply, k, animname) + end) + end +end + +VManip.PlaySegment = function(self, sequence, lastsegment, soundtable) + if self:IsActive() and self:IsSegmented() and self.SegmentFinished and not self.LastSegment then + if self:GetVMGesture():LookupSequence(sequence) ~= -1 then + if hook.Run("VManipPrePlaySegment", self:GetCurrentAnim(), sequence, lastsegment) == false then return end + self:GetVMGesture():ResetSequence(sequence) + VManip.CurSegment = sequence + self:SetCycle(0) + VManip.SegmentFinished = false + self.SegmentCount = self.SegmentCount + 1 + + if lastsegment then + self.LastSegment = true + VManip.Lerp_Peak = curtime + VManip.CurGestureData["lerp_peak"] + end + + if soundtable then + PlaySoundsInTable(soundtable, self:GetCurrentAnim()) + end + + hook.Run("VManipPlaySegment", self:GetCurrentAnim(), sequence, lastsegment) + + return true + end + end + + return false +end + +VManip.IsPreventQuit = function(self) return self.PreventQuit end + +VManip.QuitHolding = function(self, animtostop) + if self:IsActive() then + if hook.Run("VManipPreHoldQuit", self:GetCurrentAnim(), animtostop) == false then return end + + if (not animtostop and not VManip:IsPreventQuit()) or self:GetCurrentAnim() == animtostop then + self.HoldQuit = true + + if self:IsSegmented() then + self.LastSegment = true + end + + hook.Run("VManipHoldQuit", self:GetCurrentAnim(), animtostop) + end + + if self.QueuedAnim == animtostop then + self.QueuedAnim = nil + end + end +end + +--For event related animations that you want to make sure will play no matter what +VManip.QueueAnim = function(self, animtoqueue) + if self:GetAnim(animtoqueue) then + self.QueuedAnim = animtoqueue + end +end + +VMLegs.Reset = function() + VMLegs.Anims = {} + VMLegs.LegParent = nil + VMLegs.LegModel = nil + VMLegs.Cycle = 0 + VMLegs.StartCycle = 0 + VMLegs.SeqID = nil + VMLegs.CurLegs = nil +end + +VMLegs.Remove = function() + if IsValid(VMLegs.LegParent) then + VMLegs.LegParent:Remove() + end + + if IsValid(VMLegs.LegModel) then + VMLegs.LegModel:Remove() + end + + VMLegs.LegParent = nil + VMLegs.LegModel = nil + VMLegs.Cycle = 0 + VMLegs.StartCycle = 0 + VMLegs.SeqID = nil + VMLegs.CurLegs = nil +end + +VMLegs:Reset() + +VMLegs.RegisterAnim = function(self, name, tbl) + self.Anims[name] = tbl +end + +VMLegs.GetAnim = function(self, name) return self.Anims[name] end +VMLegs.IsActive = function(self) return IsValid(self.LegParent) end +VMLegs.GetCurrentAnim = function(self) return self.CurLegs end + +VManip.PlayAnim = function(self, name) + local ply = LocalPlayer() + if ply:GetViewEntity() ~= ply and not self:IsActive() then return end + + --doesnt always work + if IsValid(ply:GetActiveWeapon()) then + if ply:GetActiveWeapon():GetHoldType() == "duel" then return false end + else + return false + end + + if ply:InVehicle() or not ply:Alive() then return false end + if self:IsActive() then return false end + local vm = ply:GetViewModel() + local bypass = hook.Run("VManipPreActCheck", name, vm) + + if not bypass then + if type(ply:GetActiveWeapon().GetStatus) == "function" then + if ply:GetActiveWeapon():GetStatus() == 5 then return false end + end + + if vm:GetSequenceActivity(vm:GetSequence()) == ACT_VM_RELOAD then return false end + end + + local animtoplay = self:GetAnim(name) + + if not animtoplay then + print("Invalid anim", name) + + return false + end + + if hook.Run("VManipPrePlayAnim", name) == false then return false end + curtime = CurTime() + self.Remove() + self.GesturePastHold = false + self.GestureOnHold = false + self.CurGestureData = animtoplay + self.CurGesture = name + self.Lerp_Peak = curtime + animtoplay["lerp_peak"] + vmatrixpeakinfo = animtoplay["lerp_peak"] + self.Lerp_Speed_In = animtoplay["lerp_speed_in"] or 1 + self.Lerp_Speed_Out = animtoplay["lerp_speed_out"] or 1 + self.Loop = animtoplay["loop"] + VManip_modelname = animtoplay["model"] + vmanipholdtime = animtoplay["holdtime"] + self.VMGesture = ClientsideModel("models/" .. VManip_modelname, RENDERGROUP_BOTH) + self.VMCam = ClientsideModel("models/" .. VManip_modelname, RENDERGROUP_BOTH) --Saves me the headache of attachment shit + self.Cam_AngInt = animtoplay["cam_angint"] or tableintensity + self.SeqID = self.VMGesture:LookupSequence(name) + + if animtoplay["assurepos"] then + self.VMGesture:SetPos(ply:EyePos()) + VManip.AssurePos = true + elseif not animtoplay["locktoply"] then + self.VMGesture:SetPos(vm:GetPos()) + end + + if animtoplay["locktoply"] then + self.LockToPly = true + local eyepos = ply:EyePos() + self.VMGesture:SetAngles(ply:EyeAngles()) + self.VMGesture:SetPos(eyepos) + self.LockZ = eyepos.z + else + self.VMGesture:SetAngles(vm:GetAngles()) + self.VMGesture:SetParent(vm) + end + + self.Cam_Ang = animtoplay["cam_ang"] or properang + self.VMCam:SetPos(vector_origin) + self.VMCam:SetAngles(angle_zero) + self.VMGesture:ResetSequenceInfo() + self.VMGesture:SetPlaybackRate(1) + self.VMGesture:ResetSequence(self.SeqID) + self.VMCam:ResetSequenceInfo() + self.VMCam:SetPlaybackRate(1) + self.VMCam:ResetSequence(self.SeqID) + self.VMatrixlerp = 1 + self.Speed = animtoplay["speed"] or 1 + self.Lerp_Curve = animtoplay["lerp_curve"] or 1 + self.StartCycle = animtoplay["startcycle"] or 0 + self.Segmented = animtoplay["segmented"] or false + self.HoldTime = animtoplay["holdtime"] or nil + self.HoldTimeData = self.HoldTime + self.PreventQuit = animtoplay["preventquit"] or false + + if self.HoldTime then + self.HoldTime = curtime + self.HoldTime + end + + self.Cycle = self.StartCycle + self.VMGesture:SetNoDraw(true) + self.VMCam:SetNoDraw(true) + self.Duration = self.VMGesture:SequenceDuration(self.SeqID) + + if animtoplay["sounds"] and animtoplay["sounds"] ~= {} then + PlaySoundsInTable(animtoplay["sounds"], self.CurGesture) + end + + hook.Run("VManipPostPlayAnim", name) + + return true +end + +VMLegs.PlayAnim = function(self, name) + if self:IsActive() then return false end + local animtoplay = self:GetAnim(name) + + if not animtoplay then + print("Invalid anim", name) + + return false + end + + local ply = LocalPlayer() + self.Cycle = 0 + self.CurLegs = name + self.Speed = animtoplay["speed"] + self.FBoost = animtoplay["forwardboost"] + self.UBoost = animtoplay["upwardboost"] + self.UBoostCache = Vector(0, 0, self.UBoost) + local model = animtoplay["model"] + local vm = ply:GetViewModel() + local vmang = vm:GetAngles() + local vmpos = vm:GetPos() + self.LegParent = ClientsideModel("models/" .. model, RENDERGROUP_BOTH) + self.LegParent:SetPos(vmpos) + self.LegParent:SetParent(vm) + local legang = vm:GetAngles() + legang = Angle(0, legang.y, 0) + VMLegs.LegParent:SetAngles(legang) + self.LegModel = ClientsideModel(string.Replace(ply:GetModel(), "models/models/", "models/"), RENDERGROUP_TRANSLUCENT) + self.LegModel:SetPos(vmpos) + self.LegModel:SetAngles(vmang) + local plyhands = ply:GetHands() + + if IsValid(plyhands) then + self.LegModel.GetPlayerColor = plyhands.GetPlayerColor --yes, this is how you do player color. Fucking lol + end + + self.LegModel:SetParent(self.LegParent) + self.LegModel:AddEffects(EF_BONEMERGE) + + for i = 0, self.LegModel:GetNumBodyGroups() do + local bodyg = ply:GetBodygroup(i) + self.LegModel:SetBodygroup(i, bodyg) + end + + for k, v in pairs(playermodelbonesupper) do + local plybone = self.LegModel:LookupBone(v) + + if plybone ~= nil then + self.LegModel:ManipulateBoneScale(plybone, Vector(0, 0, 0)) + end + end + + self.SeqID = self.LegParent:LookupSequence(name) + self.LegParent:ResetSequenceInfo() + self.LegParent:SetPlaybackRate(1) + self.LegParent:ResetSequence(self.SeqID) +end + +--#########################-- +local posparentcache +local curtimecheck = 0 --prevents the hook from ever running twice in the same frame + +hook.Add("PostDrawViewModel", "VManip", function(vm, ply, weapon) + if VManip:IsActive() then + curtime = CurTime() + if curtime == curtimecheck and not gui.IsGameUIVisible() then return end + curtimecheck = CurTime() + + --Some SWEPs have RIDICULOUS offsets + if VManip.AssurePos then + if posparentcache ~= weapon then + posparentcache = weapon + VManip.VMGesture:SetParent(nil) + VManip.VMGesture:SetPos(EyePos()) + VManip.VMGesture:SetAngles(vm:GetAngles()) + VManip.VMGesture:SetParent(vm) + end + end + + --A more cruel version of AssurePos + if VManip.LockToPly then + local eyeang = ply:EyeAngles() + local eyepos = EyePos() + local vmang = vm:GetAngles() + local finang = eyeang - vmang + finang.y = 0 --fucks up on 180 + local newang = eyeang + (finang * 0.25) + VManip.VMGesture:SetAngles(newang) + VManip.VMGesture:SetPos(eyepos) + end + + --fun fact, this only runs on respawn for an obvious reason + if not ply:Alive() then + VManip:Remove() + + return + end + + --VManip.VMGesture:FrameAdvance(FrameTime()*VManip.Speed) --shit the bed, don't use this + if VManip.Loop then + if VManip.Cycle >= 1 then + VManip.Lerp_Peak = curtime + VManip.CurGestureData["lerp_peak"] + VManip.Cycle = 0 + end + + if VManip.HoldQuit then + VManip.Loop = false + end + end + + if not VManip.GestureOnHold then + VManip.Cycle = VManip.Cycle + FrameTime() * VManip.Speed + end + + VManip.VMGesture:SetCycle(VManip.Cycle) + VManip.VMCam:SetCycle(VManip.Cycle) + + if VManip.HoldTime then + if curtime >= VManip.HoldTime and not VManip.GestureOnHold and not VManip.GesturePastHold and not VManip.HoldQuit then + -- local seqdur=VManip.VMGesture:SequenceDuration() + -- VManip.Cycle=(VManip.HoldTimeData)/(seqdur) ply:ChatPrint(seqdur) + -- VManip.VMGesture:SetCycle(VManip.Cycle) + VManip.GestureOnHold = true + elseif VManip.HoldQuit and VManip.GestureOnHold then + VManip.GestureOnHold = false + VManip.GesturePastHold = true + VManip.Lerp_Peak = curtime + VManip.CurGestureData["lerp_peak"] - VManip.CurGestureData["holdtime"] + end + end + + if (curtime < VManip.Lerp_Peak or (VManip:IsSegmented() and not VManip.LastSegment)) and (not VManip.GestureOnHold or VManip.GesturePastHold) then + VManip.VMatrixlerp = math.Clamp(VManip.VMatrixlerp - (FrameTime() * 7) * VManip.Lerp_Speed_In, 0, 1) + elseif not VManip.Loop and (not VManip.GestureOnHold or VManip.GesturePastHold) then + if not VManip:IsSegmented() or VManip.LastSegment then + VManip.VMatrixlerp = math.Clamp(VManip.VMatrixlerp + (FrameTime() * 7) * VManip.Lerp_Speed_Out, 0, 1) + end + end + + local rigpick2 = leftarmbones + local rigpick = leftarmbones + VManip.VMGesture:SetupBones() + VManip.VMGesture:DrawModel() + + --[[The actual manipulation part below]] + for k, v in pairs(rigpick) do + if v == "ValveBiped.Bip01_L_Ulna" then + local lb = VManip.VMGesture:LookupBone("ValveBiped.Bip01_L_Forearm") + + if lb then + VManip.GestureMatrix = VManip.VMGesture:GetBoneMatrix(lb) + end + else + local lb = VManip.VMGesture:LookupBone(rigpick2[k]) + + if lb then + VManip.GestureMatrix = VManip.VMGesture:GetBoneMatrix(lb) + end + end + + local VMBone = vm:LookupBone(v) + + if VMBone ~= nil then + local VMBoneMatrix = vm:GetBoneMatrix(VMBone) + + if VMBoneMatrix then + local VMBoneMatrixCache = VMBoneMatrix:ToTable() + local VMGestureMatrixCache = VManip.GestureMatrix:ToTable() + + for k, v in pairs(VMGestureMatrixCache) do + for l, b in pairs(v) do + VMGestureMatrixCache[k][l] = LerpC(VManip.VMatrixlerp, b, VMBoneMatrixCache[k][l], VManip.Lerp_Curve) + end + end + + if type(ply:GetActiveWeapon().GetStatus) == "function" then + if ply:GetActiveWeapon():GetStatus() ~= 5 then + vm:SetBoneMatrix(VMBone, Matrix(VMGestureMatrixCache)) + end + else + vm:SetBoneMatrix(VMBone, Matrix(VMGestureMatrixCache)) + end + end + end + end + + if VManip.Cycle >= 1 and not VManip.Loop then + if VManip:IsSegmented() and not VManip.SegmentFinished then + VManip.SegmentFinished = true + hook.Run("VManipSegmentFinish", VManip:GetCurrentAnim(), VManip:GetCurrentSegment(), VManip.LastSegment, VManip:GetSegmentCount()) + elseif VManip:IsSegmented() and VManip.LastSegment then + if VManip.VMatrixlerp >= 1 then + VManip:Remove() + end + elseif not VManip:IsSegmented() then + if VManip.CurGestureData["loop"] then + if VManip.VMatrixlerp >= 1 then + VManip:Remove() + end + else + VManip.Remove() + + return + end + end + end + elseif VManip.QueuedAnim then + if VManip:PlayAnim(VManip.QueuedAnim) then + VManip.QueuedAnim = nil + end + end +end) + +local anglef = Angle(0, 1, 0) + +--Very basic stuff, you see +hook.Add("PostDrawViewModel", "VMLegs", function(vm, ply, weapon) + if VMLegs:IsActive() then + -- if ply:GetViewEntity() != ply then + -- VMLegs.LegModel:SetNoDraw(true) + -- else + -- VMLegs.LegModel:SetNoDraw(false) + -- end + local legang = vm:GetAngles() + legang = Angle(0, legang.y, 0) + VMLegs.LegParent:SetAngles(legang) + VMLegs.LegParent:SetPos(vm:GetPos() + (legang:Forward() * VMLegs.FBoost) + VMLegs.UBoostCache) + VMLegs.Cycle = VMLegs.Cycle + FrameTime() * VMLegs.Speed + VMLegs.LegParent:SetCycle(VMLegs.Cycle) + + if VMLegs.Cycle >= 1 then + VMLegs.Remove() + + return + end + end +end) + +concommand.Add("VManip_List", function(ply) + PrintTable(VManip.Anims) +end) + +concommand.Add("VManip_ListSimple", function(ply) + for k, v in pairs(VManip.Anims) do + print(k, " | ", v["model"]) + end +end) + +net.Receive("VManip_SimplePlay", function(len) + local anim = net.ReadString() + VManip:PlayAnim(anim) +end) + +--[[Maybe merge these two in one message, using enums]] +net.Receive("VManip_StopHold", function(len) + local anim = net.ReadString() + + if anim == "" then + VManip:QuitHolding() + else + VManip:QuitHolding(anim) + end +end) + +--CalcView attachments need to be retrieved outside of CalcView +hook.Add("NeedsDepthPass", "VManip_RubatPLZ", function() + --Just gonna slide this in there, yea. + if VManip.QueuedAnim then + local ply = LocalPlayer() + + if ply:GetViewEntity() ~= ply or ply:ShouldDrawLocalPlayer() then + VManip.QueuedAnim = nil + end + end + + --Good. + if not VManip:IsActive() then return end + + if not LocalPlayer():Alive() then + VManip:Remove() + + return + end + + local allatt = VManip.VMCam:GetAttachments() + if #allatt == 0 then return end + local lookup = allatt[1]["id"] + local att = VManip.VMCam:GetAttachment(lookup) + VManip.Attachment = att +end) + +hook.Add("CalcView", "VManip_Cam", function(ply, origin, angles, fov) + if not VManip:IsActive() or not VManip.Attachment then return end + if ply:GetViewEntity() ~= ply or ply:ShouldDrawLocalPlayer() then return end + local view = {} + local camang = VManip.Attachment.Ang - VManip.Cam_Ang + view.angles = angles + Angle(camang.x * VManip.Cam_AngInt[1], camang.y * VManip.Cam_AngInt[2], camang.z * VManip.Cam_AngInt[3]) + + return view +end) + +--ply:ChatPrint(tostring(angles).." | "..tostring(view.angles)) +--prevent reload hook +hook.Add("StartCommand", "VManip_PreventReload", function(ply, ucmd) + if VManip:IsActive() then + ucmd:RemoveKey(8192) + end +end) + +--prevent reload on tfa hook +hook.Add("TFA_PreReload", "VManip_PreventTFAReload", function(wepom, keyreleased) + if VManip:IsActive() then return "no" end +end) + +--Time to load everythin' +local function VManip_FindAndImport() + local path = "vmanip/anims/" + local anims = file.Find(path .. "*.lua", "lcl") + + for k, v in pairs(anims) do + include(path .. v) + end + + print("VManip loaded with " .. table.Count(VManip.Anims) .. " animations") +end + +hook.Add("InitPostEntity", "VManip_ImportAnims", function() + VManip_FindAndImport() + hook.Remove("InitPostEntity", "VManip_ImportAnims") +end) + +hook.Add("VManipPreActCheck", "VManipArcCWFix", function(name, vm) + local ply = LocalPlayer() + local activewep = ply:GetActiveWeapon() + + if activewep.ArcCW then + if activewep:ShouldDrawCrosshair() or vm:GetCycle() > 0.99 then return true end --crossh check is pretty rudimentary + end +end) + +--vm getcycle is fucked for some reason except on some anims, makes me wonder +hook.Add("VManipPrePlayAnim", "VManipArcCWReload", function() + local ply = LocalPlayer() + local activewep = ply:GetActiveWeapon() + + if activewep.ArcCW then + if activewep:GetNWBool("reloading") then return false end + end +end) + +concommand.Add("VManip_FindAndImport", VManip_FindAndImport) +RunConsoleCommand("VManip_FindAndImport") --Runs it again if this file is refreshed \ No newline at end of file diff --git a/vmaniprework/lua/autorun/server/sv_vmanip.lua b/vmaniprework/lua/autorun/server/sv_vmanip.lua new file mode 100644 index 0000000..0abc8bb --- /dev/null +++ b/vmaniprework/lua/autorun/server/sv_vmanip.lua @@ -0,0 +1,18 @@ +util.AddNetworkString("VManip_SimplePlay") +util.AddNetworkString("VManip_StopHold") + +--VManip_SimplePlay: WriteString of anim to play on client (not guaranteed to play) +--VManip_StopHold: WriteString of anim to stop holding on client + +local function VManip_FindAndImport() + +local path="vmanip/anims/" +local anims=file.Find(path.."*.lua","lsv") + +for k,v in pairs(anims) do + AddCSLuaFile(path..v) +end + +end + +VManip_FindAndImport() \ No newline at end of file diff --git a/vmaniprework/lua/vmanip/anims/vmanip_baseanims.lua b/vmaniprework/lua/vmanip/anims/vmanip_baseanims.lua new file mode 100644 index 0000000..d3017b7 --- /dev/null +++ b/vmaniprework/lua/vmanip/anims/vmanip_baseanims.lua @@ -0,0 +1,104 @@ +AddCSLuaFile() + +--[[ IN BOTH CASES: NAME SHOULD BE THE ACTUAL SEQUENCE NAME +You don't have to put every value, but some like model are obviously needed + +Hands +"model" - path to model +"lerp_peak" - time when the hand should transition back to the weapon +"lerp_speed_in" - speed at which the hand transitions into the anim +"lerp_speed_out" - speed at which the hand transitions out of the anim +"lerp_curve" - power of the curve +"speed" - playback speed +"startcycle" - time to start the anim at +"cam_ang" - angle offset for the camera +"cam_angint" - intensity multiplier of the camera +"sounds" - table of sounds, keys represent the path and their value the time it plays at. do not use past holdtime lmao +"loop" - loop the anim instead of stopping +"segmented" - when anim is over, freezes it and waits for SegmentPlay(sequence,lastanim). Repeat if lastanim is false +^Note: lerp peak and related values are used for the "last segment" instead. + +"holdtime" - the time when the anim should be paused +"preventquit" - ONLY accept QuitHolding request if the argument is our anim. Use very cautiously +"assurepos" - for important anims, makes sure the position isn't offset by sweps. Use locktoply it's better +"locktoply" - for when assurepos isn't enough. + + +Legs +"model" - path to model +"speed" - playback speed +"forwardboost" - forward offset +"upboost" - vertical offset (in actual hammer units) + +]] + +VManip:RegisterAnim("use", +{ +["model"]="c_vmanipinteract.mdl", +["lerp_peak"]=0.4, +["lerp_speed_in"]=1, +["lerp_speed_out"]=0.8, +["lerp_curve"]=2.5, +["speed"]=1, +["startcycle"]=0.1, +["sounds"]={}, +["loop"]=false +} +) + + +VManip:RegisterAnim("vault", +{ +["model"]="c_vmanipvault.mdl", +["lerp_peak"]=0.4, +["lerp_speed_in"]=1, +["lerp_speed_out"]=0.5, +["lerp_curve"]=1, +["speed"]=1 +} +) + +VManip:RegisterAnim("handslide", +{ +["model"]="c_vmanipvault.mdl", +["lerp_peak"]=0.2, +["lerp_speed_in"]=1, +["lerp_speed_out"]=0.8, +["lerp_curve"]=2, +["speed"]=1.5, +["holdtime"]=0.25, +} +) + +VManip:RegisterAnim("adrenalinestim", +{ +["model"]="old/c_vmanip.mdl", +["lerp_peak"]=1.1, +["lerp_speed_in"]=1, +["speed"]=0.7, +["sounds"]={}, +["loop"]=false +} +) + +VManip:RegisterAnim("thrownade", +{ +["model"]="c_vmanipgrenade.mdl", +["lerp_peak"]=0.85, +["lerp_speed_in"]=1.2, +["lerp_speed_out"]=1.2, +["lerp_curve"]=1, +["speed"]=1, +["holdtime"]=0.4, +} +) + +--################################### + +VMLegs:RegisterAnim("test", --lmao, im not recompiling to change THAT shit +{ +["model"]="c_vmaniplegs.mdl", +["speed"]=1.5, +["forwardboost"]=4, +["upwardboost"]=0 +}) \ No newline at end of file diff --git a/vmaniprework/models/c_vmanip.dx80.vtx b/vmaniprework/models/c_vmanip.dx80.vtx new file mode 100644 index 0000000..642c2f1 Binary files /dev/null and b/vmaniprework/models/c_vmanip.dx80.vtx differ diff --git a/vmaniprework/models/c_vmanip.dx90.vtx b/vmaniprework/models/c_vmanip.dx90.vtx new file mode 100644 index 0000000..a6d210a Binary files /dev/null and b/vmaniprework/models/c_vmanip.dx90.vtx differ diff --git a/vmaniprework/models/c_vmanip.mdl b/vmaniprework/models/c_vmanip.mdl new file mode 100644 index 0000000..3fa8993 Binary files /dev/null and b/vmaniprework/models/c_vmanip.mdl differ diff --git a/vmaniprework/models/c_vmanip.sw.vtx b/vmaniprework/models/c_vmanip.sw.vtx new file mode 100644 index 0000000..e9834a4 Binary files /dev/null and b/vmaniprework/models/c_vmanip.sw.vtx differ diff --git a/vmaniprework/models/c_vmanip.vvd b/vmaniprework/models/c_vmanip.vvd new file mode 100644 index 0000000..d1ca9fa Binary files /dev/null and b/vmaniprework/models/c_vmanip.vvd differ diff --git a/vmaniprework/models/c_vmanipgrenade.dx80.vtx b/vmaniprework/models/c_vmanipgrenade.dx80.vtx new file mode 100644 index 0000000..ce14ef9 Binary files /dev/null and b/vmaniprework/models/c_vmanipgrenade.dx80.vtx differ diff --git a/vmaniprework/models/c_vmanipgrenade.dx90.vtx b/vmaniprework/models/c_vmanipgrenade.dx90.vtx new file mode 100644 index 0000000..383edb1 Binary files /dev/null and b/vmaniprework/models/c_vmanipgrenade.dx90.vtx differ diff --git a/vmaniprework/models/c_vmanipgrenade.mdl b/vmaniprework/models/c_vmanipgrenade.mdl new file mode 100644 index 0000000..88501f0 Binary files /dev/null and b/vmaniprework/models/c_vmanipgrenade.mdl differ diff --git a/vmaniprework/models/c_vmanipgrenade.sw.vtx b/vmaniprework/models/c_vmanipgrenade.sw.vtx new file mode 100644 index 0000000..1e714c6 Binary files /dev/null and b/vmaniprework/models/c_vmanipgrenade.sw.vtx differ diff --git a/vmaniprework/models/c_vmanipgrenade.vvd b/vmaniprework/models/c_vmanipgrenade.vvd new file mode 100644 index 0000000..388ff58 Binary files /dev/null and b/vmaniprework/models/c_vmanipgrenade.vvd differ diff --git a/vmaniprework/models/c_vmanipinteract.dx80.vtx b/vmaniprework/models/c_vmanipinteract.dx80.vtx new file mode 100644 index 0000000..70f93ea Binary files /dev/null and b/vmaniprework/models/c_vmanipinteract.dx80.vtx differ diff --git a/vmaniprework/models/c_vmanipinteract.dx90.vtx b/vmaniprework/models/c_vmanipinteract.dx90.vtx new file mode 100644 index 0000000..0f786c8 Binary files /dev/null and b/vmaniprework/models/c_vmanipinteract.dx90.vtx differ diff --git a/vmaniprework/models/c_vmanipinteract.mdl b/vmaniprework/models/c_vmanipinteract.mdl new file mode 100644 index 0000000..d7cc2a0 Binary files /dev/null and b/vmaniprework/models/c_vmanipinteract.mdl differ diff --git a/vmaniprework/models/c_vmanipinteract.sw.vtx b/vmaniprework/models/c_vmanipinteract.sw.vtx new file mode 100644 index 0000000..3eaee94 Binary files /dev/null and b/vmaniprework/models/c_vmanipinteract.sw.vtx differ diff --git a/vmaniprework/models/c_vmanipinteract.vvd b/vmaniprework/models/c_vmanipinteract.vvd new file mode 100644 index 0000000..ef22095 Binary files /dev/null and b/vmaniprework/models/c_vmanipinteract.vvd differ diff --git a/vmaniprework/models/c_vmaniplegs.dx80.vtx b/vmaniprework/models/c_vmaniplegs.dx80.vtx new file mode 100644 index 0000000..8379004 Binary files /dev/null and b/vmaniprework/models/c_vmaniplegs.dx80.vtx differ diff --git a/vmaniprework/models/c_vmaniplegs.dx90.vtx b/vmaniprework/models/c_vmaniplegs.dx90.vtx new file mode 100644 index 0000000..3879413 Binary files /dev/null and b/vmaniprework/models/c_vmaniplegs.dx90.vtx differ diff --git a/vmaniprework/models/c_vmaniplegs.mdl b/vmaniprework/models/c_vmaniplegs.mdl new file mode 100644 index 0000000..b00593f Binary files /dev/null and b/vmaniprework/models/c_vmaniplegs.mdl differ diff --git a/vmaniprework/models/c_vmaniplegs.sw.vtx b/vmaniprework/models/c_vmaniplegs.sw.vtx new file mode 100644 index 0000000..07ce928 Binary files /dev/null and b/vmaniprework/models/c_vmaniplegs.sw.vtx differ diff --git a/vmaniprework/models/c_vmaniplegs.vvd b/vmaniprework/models/c_vmaniplegs.vvd new file mode 100644 index 0000000..ae54626 Binary files /dev/null and b/vmaniprework/models/c_vmaniplegs.vvd differ diff --git a/vmaniprework/models/c_vmanipvault.dx80.vtx b/vmaniprework/models/c_vmanipvault.dx80.vtx new file mode 100644 index 0000000..aed072b Binary files /dev/null and b/vmaniprework/models/c_vmanipvault.dx80.vtx differ diff --git a/vmaniprework/models/c_vmanipvault.dx90.vtx b/vmaniprework/models/c_vmanipvault.dx90.vtx new file mode 100644 index 0000000..aceb43f Binary files /dev/null and b/vmaniprework/models/c_vmanipvault.dx90.vtx differ diff --git a/vmaniprework/models/c_vmanipvault.mdl b/vmaniprework/models/c_vmanipvault.mdl new file mode 100644 index 0000000..43ca63a Binary files /dev/null and b/vmaniprework/models/c_vmanipvault.mdl differ diff --git a/vmaniprework/models/c_vmanipvault.sw.vtx b/vmaniprework/models/c_vmanipvault.sw.vtx new file mode 100644 index 0000000..99a28c3 Binary files /dev/null and b/vmaniprework/models/c_vmanipvault.sw.vtx differ diff --git a/vmaniprework/models/c_vmanipvault.vvd b/vmaniprework/models/c_vmanipvault.vvd new file mode 100644 index 0000000..2aba5f2 Binary files /dev/null and b/vmaniprework/models/c_vmanipvault.vvd differ diff --git a/vmaniprework/models/old/c_vmanip.dx80.vtx b/vmaniprework/models/old/c_vmanip.dx80.vtx new file mode 100644 index 0000000..d5759b6 Binary files /dev/null and b/vmaniprework/models/old/c_vmanip.dx80.vtx differ diff --git a/vmaniprework/models/old/c_vmanip.dx90.vtx b/vmaniprework/models/old/c_vmanip.dx90.vtx new file mode 100644 index 0000000..8fc514d Binary files /dev/null and b/vmaniprework/models/old/c_vmanip.dx90.vtx differ diff --git a/vmaniprework/models/old/c_vmanip.mdl b/vmaniprework/models/old/c_vmanip.mdl new file mode 100644 index 0000000..9948f97 Binary files /dev/null and b/vmaniprework/models/old/c_vmanip.mdl differ diff --git a/vmaniprework/models/old/c_vmanip.sw.vtx b/vmaniprework/models/old/c_vmanip.sw.vtx new file mode 100644 index 0000000..c3fb6af Binary files /dev/null and b/vmaniprework/models/old/c_vmanip.sw.vtx differ diff --git a/vmaniprework/models/old/c_vmanip.vvd b/vmaniprework/models/old/c_vmanip.vvd new file mode 100644 index 0000000..ad1e167 Binary files /dev/null and b/vmaniprework/models/old/c_vmanip.vvd differ