mirror of
https://github.com/JonnyBro/beatrun.git
synced 2024-12-27 20:43:02 +05:00
Merge branch 'JonnyBro-main' into upstream
This commit is contained in:
commit
415c307011
53 changed files with 934 additions and 466 deletions
29
LICENSE
29
LICENSE
|
@ -1,24 +1,13 @@
|
|||
This is free and unencumbered software released into the public domain.
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
Version 2, December 2004
|
||||
|
||||
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.
|
||||
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
|
||||
|
||||
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.
|
||||
Everyone is permitted to copy and distribute verbatim or modified
|
||||
copies of this license document, and changing it is allowed as long
|
||||
as the name is changed.
|
||||
|
||||
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.
|
||||
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
For more information, please refer to <https://unlicense.org>
|
||||
0. You just DO WHAT THE FUCK YOU WANT TO.
|
||||
|
|
175
README.md
175
README.md
|
@ -1,110 +1,125 @@
|
|||
# Beatrun | Community edition
|
||||
# Beatrun | Community Edition
|
||||
|
||||
[![forthebadge](https://forthebadge.com/images/featured/featured-powered-by-electricity.svg)](https://forthebadge.com)
|
||||
[![forthebadge](https://forthebadge.com/images/badges/powered-by-black-magic.svg)](https://forthebadge.com)
|
||||
[![Powered by Electricity](https://forthebadge.com/images/featured/featured-powered-by-electricity.svg)](https://forthebadge.com)
|
||||
[![Powered by Black Magic](https://forthebadge.com/images/badges/powered-by-black-magic.svg)](https://forthebadge.com)
|
||||
|
||||
[Click to join our Discord!](https://discord.gg/93Psubbgsg)
|
||||
[**Join our Discord Community!**](https://discord.gg/93Psubbgsg)
|
||||
|
||||
* [Русский](./README.ru.md)
|
||||
> *[Русский | Russian](./README.ru.md)*
|
||||
|
||||
**PLEASE READ EVERYTHING BEFORE ASKING QUESTIONS!**
|
||||
---
|
||||
|
||||
Infamous parkour addon for Garry's Mod. Fully open sourced and maintained by the community (me 😞).
|
||||
## 🚨 Important Notice
|
||||
|
||||
> [!IMPORTANT]
|
||||
> This repository doesn't contain any malicious modules. However, we have some modules for additional functionality:
|
||||
>
|
||||
> * Discord Rich Presence.
|
||||
> * Steam Presence.
|
||||
>
|
||||
> **They are completely optional and can be removed at any time.**\
|
||||
> You can find all modules **[here](https://github.com/JonnyBro/beatrun/tree/main/lua/bin)**.\
|
||||
> Check **[Credits](#credits)** section for their source code.
|
||||
### Please read this README thoroughly before asking questions
|
||||
|
||||
## Automatic Installation (Recommended | Windows 10/11)
|
||||
### The **only official source** for this fork is this GitHub repository. Workshop versions are outdated and unsupported
|
||||
|
||||
---
|
||||
|
||||
## About
|
||||
|
||||
Beatrun is an **infamous parkour addon for Garry's Mod**, now fully open-sourced and maintained by the community.
|
||||
It includes various improvements, new features, and enhanced functionality.
|
||||
|
||||
> [!WARNING]
|
||||
> Windows 7 and old versions of Windows 10 are not supported.\
|
||||
> Please update.
|
||||
> **This repository contains no malicious modules.** However, optional modules such as Discord Rich Presence and Steam Presence are available for additional features.
|
||||
> These are **completely optional** and can be removed at any time.
|
||||
>
|
||||
> - Modules are located **[here](https://github.com/JonnyBro/beatrun/tree/main/lua/bin)**.
|
||||
> - Refer to the **[Credits](#credits)** section for their source code.
|
||||
|
||||
---
|
||||
|
||||
## Installation
|
||||
|
||||
### 🔧 Automatic Installation (Recommended for Windows 10/11)
|
||||
|
||||
Run the command below in Powershell (run as admin if your Steam or game located in a C: drive).
|
||||
> [!NOTE]
|
||||
> Win + R > `powershell` > *Enter*
|
||||
> Windows 7 and old versions of Windows 10 are not supported. Please update your OS.
|
||||
|
||||
Run the following command in PowerShell (Run as Administrator if Steam and/or the game is installed on the system (C:) drive):
|
||||
|
||||
```powershell
|
||||
irm https://beatrun.jonnybro.ru/install | iex
|
||||
```
|
||||
|
||||
* Start the game.
|
||||
* Select the `Beatrun` gamemode in right lower corner.
|
||||
|
||||
## Manual Installation
|
||||
|
||||
1. **[Download this repository](https://github.com/JonnyBro/beatrun/archive/refs/heads/master.zip)**.
|
||||
1. **Delete the `beatrun` folder in *your_game_folder/garrysmod/addons* if you have one.**
|
||||
1. Extract the `beatrun-main/beatrun` folder to *your_game_folder/garrysmod/addons*.
|
||||
1. If you want to have Discord and Steam Presence:
|
||||
* Extract the `beatrun-main/lua` folder to *your_game_folder/garrysmod*.
|
||||
1. Start the game.
|
||||
1. Select the `Beatrun` gamemode in right lower corner.
|
||||
2. Select the `Beatrun` gamemode in the bottom-right corner.
|
||||
|
||||
### 🛠️ Manual Installation
|
||||
|
||||
1. **[Download this repository](https://github.com/JonnyBro/beatrun/archive/refs/heads/master.zip).**
|
||||
2. Delete the `beatrun` folder in `your_game_folder/garrysmod/addons`, if it exists.
|
||||
3. Extract `beatrun-main/beatrun` into `your_game_folder/garrysmod/addons`.
|
||||
4. (Optional) For Discord and Steam Presence, extract `beatrun-main/lua` to `your_game_folder/garrysmod`.
|
||||
5. Start the game.
|
||||
6. Select the `Beatrun` gamemode in the bottom-right corner.
|
||||
|
||||
---
|
||||
|
||||
## Features and Updates
|
||||
|
||||
### New Features
|
||||
|
||||
- **Custom Courses Database** hosted by Jonny_Bro: **[Access Here](https://courses.jonnybro.ru)** (free and **[open source](https://git.jonnybro.ru/jonny_bro/beatrun-courses-server)**).
|
||||
- **New Gamemode:** Deathmatch.
|
||||
- "Proper" Kick Glitch similar to the **[original game](https://www.youtube.com/watch?v=zK5y3NBUStc)**.
|
||||
- In-game configuration menu in the Tools menu under **Beatrun**. All settings can be modified here.
|
||||
- Localization support in **7 languages**.
|
||||
- Enhanced Build Mode: spawn props from the Spawn Menu, and they will save in your course.
|
||||
- Various new abilities:
|
||||
- **Roll after ziplines:** Press `+duck` (CTRL by default).
|
||||
- **Dismount ladders:** Press `+duck` (CTRL by default).
|
||||
- **Remove ziplines created with Zipline Gun:** Press `+attack2` (RMB by default).
|
||||
- **Next checkpoint arrow** for easier navigation.
|
||||
- New server and client configuration variables:
|
||||
- Server:
|
||||
- `Beatrun_AllowOverdriveInMultiplayer`: Allows Overdrive in multiplayer.
|
||||
- `Beatrun_AllowPropSpawn`: Lets players spawn props and weapons without admin rights.
|
||||
- `Beatrun_HealthRegen`: Toggles health regeneration.
|
||||
- Client:
|
||||
- `Beatrun_HUDTextColor`, `Beatrun_HUDCornerColor`, `Beatrun_HUDFloatingXPColor`: Customize HUD colors.
|
||||
- `Beatrun_DisableGrapple`: Toggle the grapple ability.
|
||||
- `Beatrun_OldKickGlitch`: Switch between old and new Kick Glitch.
|
||||
- `Beatrun_QuickturnHandsOnly`: Restrict QuickTurn to the Runner Hands weapon.
|
||||
- Other improvements:
|
||||
- Small camera punch effect when diving.
|
||||
- SteamID no longer displayed on screen.
|
||||
|
||||
### Fixes
|
||||
|
||||
- Fixed playermodels showing as `ERROR` in first person.
|
||||
- Improved leaderboard sorting in gamemodes.
|
||||
- Fixed crashes and issues with Data Theft gamemode.
|
||||
- Enabled jumping while walking.
|
||||
- Grapples now follow moving entities and are visible to other players.
|
||||
|
||||
---
|
||||
|
||||
## Animations
|
||||
|
||||
Animations installer was removed, now you can switch between animations in Tools menu in Beatrun category.
|
||||
The animations installer has been removed. You can now switch animations directly in the **Tools menu** under the Beatrun category.
|
||||
|
||||
## What's new
|
||||
---
|
||||
|
||||
> [!IMPORTANT]
|
||||
> There are many undocumented changes and fixes in this version, you better look at the commits for more specific changes.
|
||||
## Known Issues
|
||||
|
||||
* Jonny_Bro is hosting **[custom courses database](https://courses.jonnybro.ru)**, which is also **free** to use and **[open sourced](https://git.jonnybro.ru/jonny_bro/beatrun-courses-server-docker)**!
|
||||
* New gamemode - **Deathmatch** (it's way more fun than Data Theft I promise).
|
||||
* "Proper" Kick Glitch just like in **[original game](https://www.youtube.com/watch?v=zK5y3NBUStc)**.
|
||||
* In-game configuration menu - you can find it in the Tools menu, in the **Beatrun** category.\
|
||||
**All** of the Beatrun settings can be changed in the configuration menu!
|
||||
* Discord and Steam Presence.
|
||||
* Localization support.\
|
||||
Available in 7 languages!
|
||||
* Build Mode Tweaks.\
|
||||
You can now spawn any prop from Spawn Menu and they will save in your course.
|
||||
* Ability to roll after ziplines with CTRL (thanks c4nk <3).
|
||||
* Ability to get off of ladders - Press CTRL.
|
||||
* Ability to remove ziplines that created with *Zipline Gun* - Press RMB.
|
||||
* Arrow that shows the next checkpoint.
|
||||
* Server ConVar to allow Overdrive usage in multiplayer - `Beatrun_AllowOverdriveInMultiplayer`.
|
||||
* Server ConVar to allow players to spawn props and weapons without admin rights - `Beatrun_AllowPropSpawn`.
|
||||
* Server ConVar to toggle the health regeneration - `Beatrun_HealthRegen`.
|
||||
* Client ConVars to change HUD colors - `Beatrun_HUDTextColor`, `Beatrun_HUDCornerColor`, `Beatrun_HUDFloatingXPColor`.
|
||||
* Client ConVar to toggle the grapple ability - `Beatrun_DisableGrapple`.
|
||||
* Client ConVar to toggle between old and new Kick Glitch - `Beatrun_OldKickGlitch`.
|
||||
* Client ConVar to allow QuickTurn with any weapon or only with *Runner Hands* - `Beatrun_QuickturnHandsOnly`.
|
||||
* Small camera punch when diving.
|
||||
* SteamID is no longer shown on screen.
|
||||
- See the full list of issues **[here](https://github.com/JonnyBro/beatrun/issues)**.
|
||||
|
||||
## Fixes
|
||||
---
|
||||
|
||||
* Some playermodels show up as ERROR in first person.
|
||||
* Leaderboard sorting in gamemodes.
|
||||
* Grapple usage in courses and gamemodes.
|
||||
* Crash in Data Theft when touching Data Bank.
|
||||
* PvP damage not going through in gamemodes other than Data Theft.
|
||||
* Allowed jumping while walking.
|
||||
* You can now roll under things using safety roll.
|
||||
* Now grapple moves with the entity it was attached to and other players can see the rope.
|
||||
## Related Projects
|
||||
|
||||
## Known issues
|
||||
- **[Beatrun Reanimated Project](https://github.com/JonnyBro/beatrun-anims)**
|
||||
|
||||
* [Issues](https://github.com/JonnyBro/beatrun/issues).
|
||||
|
||||
## Related projects
|
||||
|
||||
* [Beatrun Reanimated Project](https://github.com/JonnyBro/beatrun-anims).
|
||||
---
|
||||
|
||||
## Credits
|
||||
|
||||
* [All contributors](https://github.com/JonnyBro/beatrun/graphs/contributors) - <3.
|
||||
* [EarthyKiller127/datae](https://www.youtube.com/channel/UCiFqPwGo4x0J65xafIaECDQ) - Original creator of Beatrun.
|
||||
* [relaxtakenotes](https://github.com/relaxtakenotes) - Made all of this possible.
|
||||
* [MTB](https://www.youtube.com/@MTB396) - Beatrun Reanimated Project.
|
||||
* [Fluffy Servers](https://github.com/fluffy-servers/gmod-discord-rpc) - Discord Rich Presence.
|
||||
* [YuRaNnNzZZ](https://github.com/YuRaNnNzZZ/gmcl_steamrichpresencer) - Steam Presence (TFA Base creator!).
|
||||
- **[All contributors](https://github.com/JonnyBro/beatrun/graphs/contributors)** ❤️
|
||||
- [EarthyKiller127/datae](https://www.youtube.com/channel/UCiFqPwGo4x0J65xafIaECDQ) - Original creator of Beatrun.
|
||||
- [relaxtakenotes](https://github.com/relaxtakenotes) - Made this project possible.
|
||||
- [MTB](https://www.youtube.com/@MTB396) - Beatrun Reanimated Project.
|
||||
- [Fluffy Servers](https://github.com/fluffy-servers/gmod-discord-rpc) - Discord Rich Presence.
|
||||
- [YuRaNnNzZZ](https://github.com/YuRaNnNzZZ/gmcl_steamrichpresencer) - Steam Presence (TFA Base creator).
|
||||
|
|
173
README.ru.md
173
README.ru.md
|
@ -1,110 +1,127 @@
|
|||
# Beatrun | Community edition
|
||||
# Beatrun | Community Edition
|
||||
|
||||
[![forthebadge](https://forthebadge.com/images/featured/featured-powered-by-electricity.svg)](https://forthebadge.com)
|
||||
[![forthebadge](https://forthebadge.com/images/badges/powered-by-black-magic.svg)](https://forthebadge.com)
|
||||
[![Powered by Electricity](https://forthebadge.com/images/featured/featured-powered-by-electricity.svg)](https://forthebadge.com)
|
||||
[![Powered by Black Magic](https://forthebadge.com/images/badges/powered-by-black-magic.svg)](https://forthebadge.com)
|
||||
|
||||
[Нажмите чтобы присоедениться к нашему Discord серверу!](https://discord.gg/93Psubbgsg)
|
||||
[**Присоединяйтесь к нашему сообществу в Discord!**](https://discord.gg/93Psubbgsg)
|
||||
|
||||
* [English](./README.md)
|
||||
> *[English | Английский](./README.md)*
|
||||
|
||||
**ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ВЕСЬ ДОКУМЕНТ ПЕРЕД ТЕМ КАК ЗАДАВАТЬ ВОПРОСЫ!**
|
||||
---
|
||||
|
||||
Печально известный паркур аддон для Garry's Mod. Теперь, с полностью открытым исходным кодом и поддерживаемый сообществом (мной 😞).
|
||||
## 🚨 Важное уведомление
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Данный репозиторий не содержит вредоносных модулей. Однако, мы имеем несколько модулей для дополнительного функционала:
|
||||
>
|
||||
> * Модуль для показа статуса в Discord.
|
||||
> * Модуль для показа статуса в Steam.
|
||||
>
|
||||
> **Они не обязательны и могут быть удалены в любой момент.**\
|
||||
> Список всех модуйлей находится **[здесь](https://github.com/JonnyBro/beatrun/tree/main/lua/bin)**.\
|
||||
> Проверьте **[Благодарности](#благодарности)** чтобы найти их исходный код.
|
||||
### Пожалуйста, прочитайте этот README полностью перед тем, как задавать вопросы
|
||||
|
||||
## Автоматическая установка (Рекомендуется | Windows 10/11)
|
||||
### **Единственный официальный источник** этого форка — этот репозиторий на GitHub. Версии в Workshop устарели и не поддерживаются
|
||||
|
||||
---
|
||||
|
||||
## О проекте
|
||||
|
||||
Beatrun — это **знаменитый паркур-аддон для Garry's Mod**, теперь с полностью открытым исходным кодом и поддерживаемый сообществом.
|
||||
Включает различные улучшения, новые функции и расширенную функциональность.
|
||||
|
||||
> [!WARNING]
|
||||
> Windows 7 и старые сборки Windows 10 не поддерживаются.
|
||||
> Обновитесь, пожалуйста.
|
||||
> **В этом репозитории нет вредоносных модулей.** Однако доступны опциональные модули, такие как показ статусов в Discord и Steam, для дополнительного функционала.
|
||||
> Эти модули **абсолютно опциональны** и могут быть удалены в любое время.
|
||||
>
|
||||
> - Модули находятся **[здесь](https://github.com/JonnyBro/beatrun/tree/main/lua/bin)**.
|
||||
> - Ознакомьтесь с разделом **[Благодарности](#благодарности)** для их исходного кода.
|
||||
|
||||
---
|
||||
|
||||
## Установка
|
||||
|
||||
### 🔧 Автоматическая установка (Рекомендуется для Windows 10/11)
|
||||
|
||||
Запустите команду ниже в Powershell (запустите от администратора если Steam или игра расположены на диске C:).
|
||||
> [!NOTE]
|
||||
> Win + R > `powershell` > *Enter*
|
||||
> Windows 7 и старые версии Windows 10 не поддерживаются. Обновите свою ОС.
|
||||
|
||||
Запустите данную команду в PowerShell (Запустите от админа если Steam и/или игра установлены на системный (C:) диск):
|
||||
|
||||
```powershell
|
||||
irm https://beatrun.jonnybro.ru/install | iex
|
||||
```
|
||||
|
||||
* Запустить игру.
|
||||
* Выбрать режим `Beatrun` в правом нижнем углу.
|
||||
1. Запустите игру.
|
||||
2. Выберите режим `Beatrun` в правом нижнем углу.
|
||||
|
||||
## Ручная установка
|
||||
### 🛠️ Ручная установка
|
||||
|
||||
1. **[Скачать репозиторий](https://github.com/JonnyBro/beatrun/archive/refs/heads/master.zip)**.
|
||||
1. **Удалить папку `beatrun` в *путь_к_игре/garrysmod/addons*, если у вас такова имеется.**
|
||||
1. Извлечь папку `beatrun-main/beatrun` в *путь_к_игре/garrysmod/addons*.
|
||||
1. Если вы хотите показ статуса в Discord и Steam:
|
||||
* Извлечь папку `beatrun-main/lua` в *путь_к_игре/garrysmod*.
|
||||
1. Запустить игру.
|
||||
1. Выбрать режим `Beatrun` в правом нижнем углу.
|
||||
2. Удалите папку `beatrun` в `путь_к_игре/garrysmod/addons`, если она существует.
|
||||
3. Извлеките `beatrun-main/beatrun` в `путь_к_игре/garrysmod/addons`.
|
||||
4. *(Опционально)* Для показа статусов в Discord и Steam извлеките `beatrun-main/lua` в `путь_к_игре/garrysmod`.
|
||||
5. Запустите игру.
|
||||
6. Выберите режим `Beatrun` в правом нижнем углу.
|
||||
|
||||
---
|
||||
|
||||
## Особенности и обновления
|
||||
|
||||
### Новые возможности
|
||||
|
||||
- **База курсов** от Jonny_Bro: **[Доступна здесь](https://courses.jonnybro.ru)** (бесплатна и имеет **[открытый исходный код](https://git.jonnybro.ru/jonny_bro/beatrun-courses-server)**).
|
||||
- **Новый режим:** Deathmatch.
|
||||
- Полностью исправленный Kick Glitch, как в **[оригинальной игре](https://www.youtube.com/watch?v=zK5y3NBUStc)**.
|
||||
- Меню настроек в игре в категории **Beatrun** в меню Инструментов.
|
||||
Здесь можно настроить **все** параметры Beatrun.
|
||||
- Поддержка локализации на **7 языках**.
|
||||
- Улучшенный режим строительства курсов:
|
||||
Пропы из меню спавна сохраняются в вашем курсе.
|
||||
- Новые способности:
|
||||
- **Перекат после зиплайнов:** Нажмите `CTRL`.
|
||||
- **Слезание с лестниц:** Нажмите `CTRL`.
|
||||
- **Удаление зиплайнов:** Нажмите ПКМ (`RMB`).
|
||||
- **Указатель следующего чекпоинта** для облегчения навигации.
|
||||
- Новые серверные и клиентские переменные:
|
||||
- Серверные:
|
||||
- `Beatrun_AllowOverdriveInMultiplayer` — разрешает Overdrive в мультиплеере.
|
||||
- `Beatrun_AllowPropSpawn` — разрешает спавн пропов и оружия без прав администратора.
|
||||
- `Beatrun_HealthRegen` — переключает регенерацию здоровья.
|
||||
- Клиентские:
|
||||
- `Beatrun_HUDTextColor`, `Beatrun_HUDCornerColor`, `Beatrun_HUDFloatingXPColor` — настройка цветов интерфейса.
|
||||
- `Beatrun_DisableGrapple` — включение/выключение крюка-кошки.
|
||||
- `Beatrun_OldKickGlitch` — переключение между старым и новым Kick Glitch.
|
||||
- `Beatrun_QuickturnHandsOnly` — ограничение QuickTurn только для оружия Runner Hands.
|
||||
- Прочие улучшения:
|
||||
- Лёгкий толчок камеры при нырянии.
|
||||
- SteamID больше не отображается на экране.
|
||||
|
||||
### Исправления
|
||||
|
||||
- Исправлено отображение моделей игроков как `ERROR` от первого лица.
|
||||
- Улучшена сортировка таблиц лидеров в режимах.
|
||||
- Исправлены краши и баги в режиме Data Theft.
|
||||
- Включены прыжки при ходьбе.
|
||||
- Крюк-кошка теперь следует за перемещаемыми объектами и видна другим игрокам.
|
||||
|
||||
---
|
||||
|
||||
## Анимации
|
||||
|
||||
Установщик анимаций был удалён, теперь анимации можно переключить в меню Инструментов в категории Beatrun.
|
||||
Установщик анимаций удалён. Теперь их можно переключать в **меню Инструментов** в категории Beatrun.
|
||||
|
||||
## Отличия от оригинала
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Множество изменений не задокументированы, проверьте коммиты для полного списка изменений.
|
||||
|
||||
* Jonny_Bro поддерживает свою **[базу курсов](https://courses.jonnybro.ru)**, которая так же **бесплатна** для использования и имеет **[открытый исходный код](https://git.jonnybro.ru/jonny_bro/beatrun-courses-server-docker)**!
|
||||
* Новый режим - **Deathmatch** (намного интереснее Data Theft, честно).
|
||||
* Оригинальный Kick Glitch как в **[оригинальной игре](https://www.youtube.com/watch?v=zK5y3NBUStc)**.
|
||||
* Внутриигровое меню настроек - оно находится в меню Инструментов в категории **Beatrun**.\
|
||||
Там можно найти **все** настройки Beatrun!
|
||||
* Показ статуса в Discord и Steam.
|
||||
* Поддержка локализации.\
|
||||
Доступно на 7 языках!
|
||||
* Изменения в режиме строительства курсов.\
|
||||
Любой проп из меню спавна теперь сохраняется в курсе.
|
||||
* Возможность переката на кнопку приседания (CTRL) после зиплайнов (спасибо c4nk <3).
|
||||
* Возможность спрыгивать с лестниц на кнопку приседания (CTRL).
|
||||
* Возможность удалять зиплайны, созданные *Zipline Gun* по нажатию на второстепенный огонь (ПКМ).
|
||||
* Стрелка, указывающая на следующий чекпоинт.
|
||||
* Серверная переменная которая разрешает использование Overdrive в мультиплеере - `Beatrun_AllowOverdriveInMultiplayer`.
|
||||
* Серверная переменная которая разрешает создание оружия и объектов из меню спавна без прав администратора - `Beatrun_AllowPropSpawn`.
|
||||
* Серверная переменная которая переключает регенерацию здоровья - `Beatrun_HealthRegen`.
|
||||
* Клиентские переменные для изменения цвета интерфейса - `Beatrun_HUDTextColor`, `Beatrun_HUDCornerColor`, `Beatrun_HUDFloatingXPColor`.
|
||||
* Клиентская переменная которая переключает использование крюка-кошки - `Beatrun_DisableGrapple`.
|
||||
* Клиентская переменная которая переключает использование старого и нового Kick Glitch - `Beatrun_OldKickGlitch`.
|
||||
* Клиентская переменная которая переключает быстрый разворот с оружием или только с *Runner Hands* - `Beatrun_QuickturnHandsOnly`.
|
||||
* Небольшой толчок камеры при нырянии.
|
||||
* SteamID больше не видно на экране.
|
||||
|
||||
## Исправления
|
||||
|
||||
* Некоторые модельки игрока отображались как ERROR от первого лица.
|
||||
* Сортировка таблиц лидеров в режимах.
|
||||
* Использование крюка-кошки в режимах и курсах.
|
||||
* Краш игры в режиме Data Theft при использовании Data Bank.
|
||||
* Урон между игроками проходил только в Data Theft.
|
||||
* Разрешены прыжки при ходьбе.
|
||||
* Возможность переката **под** объектами.
|
||||
* Крюк-кошка теперь следует за объектом к которому она присоединена, так же её видят другие игроки.
|
||||
---
|
||||
|
||||
## Известные проблемы
|
||||
|
||||
* [Проблемы](https://github.com/JonnyBro/beatrun/issues).
|
||||
- Полный список доступен **[здесь](https://github.com/JonnyBro/beatrun/issues)**.
|
||||
|
||||
---
|
||||
|
||||
## Связанные проекты
|
||||
|
||||
* [Проект Beatrun Reanimated](https://github.com/JonnyBro/beatrun-anims).
|
||||
- **[Beatrun Reanimated Project](https://github.com/JonnyBro/beatrun-anims)**
|
||||
|
||||
---
|
||||
|
||||
## Благодарности
|
||||
|
||||
* [Все участники](https://github.com/JonnyBro/beatrun/graphs/contributors) - <3.
|
||||
* [EarthyKiller127/datae](https://www.youtube.com/channel/UCiFqPwGo4x0J65xafIaECDQ) - Создатель оригинального Beatrun.
|
||||
* [relaxtakenotes](https://github.com/relaxtakenotes) - Без него этот проект не существовал бы.
|
||||
* [MTB](https://www.youtube.com/@MTB396) - Проект Beatrun Reanimated.
|
||||
* [Fluffy Servers](https://github.com/fluffy-servers/gmod-discord-rpc) - Модуль показа статусов в Discord.
|
||||
* [YuRaNnNzZZ](https://github.com/YuRaNnNzZZ/gmcl_steamrichpresencer) - Модуль показа статусов в Steam (создатель TFA Base!).
|
||||
- **[Все участники](https://github.com/JonnyBro/beatrun/graphs/contributors)** ❤️
|
||||
- [EarthyKiller127/datae](https://www.youtube.com/channel/UCiFqPwGo4x0J65xafIaECDQ) — создатель оригинального Beatrun.
|
||||
- [relaxtakenotes](https://github.com/relaxtakenotes) — этот проект стал возможен благодаря ему.
|
||||
- [MTB](https://www.youtube.com/@MTB396) — проект Beatrun Reanimated.
|
||||
- [Fluffy Servers](https://github.com/fluffy-servers/gmod-discord-rpc) — модуль показа статусов в Discord.
|
||||
- [YuRaNnNzZZ](https://github.com/YuRaNnNzZZ/gmcl_steamrichpresencer) — модуль показа статусов в Steam (создатель TFA Base).
|
||||
|
|
BIN
beatrun/gamemodes/beatrun/content/models/meclimbanim.dx80.vtx
Normal file
BIN
beatrun/gamemodes/beatrun/content/models/meclimbanim.dx80.vtx
Normal file
Binary file not shown.
BIN
beatrun/gamemodes/beatrun/content/models/meclimbanim.dx90.vtx
Normal file
BIN
beatrun/gamemodes/beatrun/content/models/meclimbanim.dx90.vtx
Normal file
Binary file not shown.
BIN
beatrun/gamemodes/beatrun/content/models/meclimbanim.mdl
Normal file
BIN
beatrun/gamemodes/beatrun/content/models/meclimbanim.mdl
Normal file
Binary file not shown.
BIN
beatrun/gamemodes/beatrun/content/models/meclimbanim.sw.vtx
Normal file
BIN
beatrun/gamemodes/beatrun/content/models/meclimbanim.sw.vtx
Normal file
Binary file not shown.
BIN
beatrun/gamemodes/beatrun/content/models/meclimbanim.vvd
Normal file
BIN
beatrun/gamemodes/beatrun/content/models/meclimbanim.vvd
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -50,7 +50,7 @@ beatrun.hud.lvl=Lvl: %s
|
|||
beatrun.hud.infector=Infector
|
||||
|
||||
# Menu_Course
|
||||
beatrun.coursemenu.trials=Courses - %s
|
||||
beatrun.coursemenu.trials=Courses - Folder: %s
|
||||
beatrun.coursemenu.buildmode=Toggle Build Mode
|
||||
beatrun.coursemenu.freeplay=Return to Freeplay
|
||||
|
||||
|
@ -272,6 +272,8 @@ beatrun.infection.end=The game has ended!\nSurvivors: %s\nRestarting in 15s
|
|||
# Server ConVars
|
||||
beatrun.randommwloadouts=Random MW Base Loadouts
|
||||
beatrun.randommwloadoutsdesc=Toggles random MW Base loadouts in Deathmatch and DataTheft
|
||||
beatrun.randoarc9loadouts=Random ARC9 MW Loadouts
|
||||
beatrun.randoarc9loadoutsdesc=Toggles random ARC9 MW 2019 loadouts in Deathmatch and DataTheft
|
||||
|
||||
# Button hints thingy
|
||||
beatrun.buttonhints.hold=(Hold)
|
||||
|
|
|
@ -41,6 +41,7 @@ beatrun.convars.disablegrapple=Wyłącz zdolność używania tyrolki
|
|||
beatrun.convars.puristmode=Tryb purystyczny to opcja po stronie klienta, która poważnie ogranicza zdolność do strafe'owania w powietrzu, tak jak w grach z serii ME.\n0 = Brak ograniczeń\n1 = Zmniejszona prędkość ruchu w powietrzu.
|
||||
beatrun.convars.quickturnground=Umożliwia szybki obrót za pomocą ataku drugorzędnego na ziemi
|
||||
beatrun.convars.quickturnhandsonly=Umożliwia szybki obrót tylko w trybie "Rąk biegacza"
|
||||
beatrun.convars.showspeedometer=Przełącz widoczność prędkościomierza
|
||||
|
||||
# HUD
|
||||
beatrun.hud.course=Bieg: %s
|
||||
|
@ -53,7 +54,7 @@ beatrun.coursemenu.trials=Biegi - %s
|
|||
beatrun.coursemenu.buildmode=Przełącz tryb budowania
|
||||
beatrun.coursemenu.freeplay=Wróć do rozgrywki swobodnej
|
||||
|
||||
# CoursesDatabase
|
||||
# Courses Database
|
||||
beatrun.coursesdatabase.cantuploadfreeplay=Nie można przesyłać biegów w trybie rozgrywki swobodnej
|
||||
beatrun.coursesdatabase.upload1=Próbujesz przesłać kurs o nazwie %s na mapie %s.
|
||||
beatrun.coursesdatabase.upload2=Użyj Beatrun_Confirm, aby kontynuować lub Beatrun_Cancel, aby anulować.
|
||||
|
@ -62,6 +63,7 @@ beatrun.coursesdatabase.update1=Próbujesz zaktualizować bieg oznaczony kodem %
|
|||
# Tools Menu
|
||||
beatrun.toolsmenu.client=Klient
|
||||
beatrun.toolsmenu.server=Serwer
|
||||
beatrun.toolsmenu.extra=Ekstra
|
||||
|
||||
# Tools Menu Courses Section
|
||||
beatrun.toolsmenu.courses.name=Biegi
|
||||
|
@ -106,8 +108,14 @@ beatrun.toolsmenu.hud.nametagsdesc=Włącz/Wyłącz wyświetlanie identyfikator
|
|||
beatrun.toolsmenu.hud.hudxp=Wyświetl PD na interfejsie
|
||||
beatrun.toolsmenu.hud.hudxpdesc=Pokaż całkowitą liczbę PD w pobliżu swojego nicku
|
||||
|
||||
beatrun.toolsmenu.hud.keystrokes=Show Keystrokes
|
||||
beatrun.toolsmenu.hud.keystrokesdesc=Shows keys that you press
|
||||
beatrun.toolsmenu.hud.showspeedometer=Pokaż prędkościomierz
|
||||
beatrun.toolsmenu.hud.showspeedometerdesc=Pokazuje prędkościomierz na interfejsie
|
||||
|
||||
beatrun.toolsmenu.hud.showSpeedometer=Pokaż prędkościomierz
|
||||
beatrun.toolsmenu.hud.showSpeedometerDesc=Pokazuje prędkościomierz na interfejsie (ukrycie interfejsu nie wpływa na to ustawienie)
|
||||
|
||||
beatrun.toolsmenu.hud.keystrokes=Pokaż naciśnięte klawisze
|
||||
beatrun.toolsmenu.hud.keystrokesdesc=Pokazuje na interfejsie klawisze, które wciskasz podczas gry
|
||||
|
||||
beatrun.toolsmenu.hud.hidden=Ukryj interfejs
|
||||
beatrun.toolsmenu.hud.hiddendesc=0 - Pokazany\n1 - Tylko poza rozgrywką swobodną\n2 - Ukryty
|
||||
|
@ -124,7 +132,7 @@ beatrun.toolsmenu.camera.name=Kołysanie kamery w ruchu
|
|||
beatrun.toolsmenu.camera.desc=Ustawienia kołysania kamery w ruchu
|
||||
|
||||
beatrun.toolsmenu.camera.stabilization=Stabilizacja kołysania kamery w ruchu
|
||||
beatrun.toolsmenu.camera.stabilizationdesc=Włącz, aby zmniejszyć chorobę lokomocyjną za pomocą utrzymywania stabilności kamery w ruchu
|
||||
beatrun.toolsmenu.camera.stabilizationdesc=Włącz, aby zmniejszyć efekt powodujący chorobę lokomocyjną za pomocą utrzymywania stabilności kamery w ruchu
|
||||
beatrun.toolsmenu.camera.intensity=Intensywność kołysania kamery w ruchu
|
||||
beatrun.toolsmenu.camera.fov=Pole widzenia
|
||||
beatrun.toolsmenu.camera.fovdesc=Zmienia pole widzenia
|
||||
|
|
|
@ -50,7 +50,7 @@ beatrun.hud.lvl=Лвл: %s
|
|||
beatrun.hud.infector=Заражённый
|
||||
|
||||
# Menu_Course
|
||||
beatrun.coursemenu.trials=Курсы - %s
|
||||
beatrun.coursemenu.trials=Курсы - Папка: %s
|
||||
beatrun.coursemenu.buildmode=Режим строительства
|
||||
beatrun.coursemenu.freeplay=Свободная игра
|
||||
|
||||
|
@ -269,6 +269,8 @@ beatrun.infection.end=Игра окончена!\nВыжившие: %s\nПере
|
|||
# Server ConVars
|
||||
beatrun.randommwloadouts=Случайные наборы оружия MW Base
|
||||
beatrun.randommwloadoutsdesc=Переключает случайные наборы оружия MW Base в Deathmatch и DataTheft
|
||||
beatrun.randoarc9loadouts=Случайные наборы оружия ARC9 MW
|
||||
beatrun.randoarc9loadoutsdesc=Переключает случайные наборы оружия ARC9 MW 2019 в Deathmatch и DataTheft
|
||||
|
||||
# Button Hints
|
||||
beatrun.buttonhints.hold=(держать)
|
||||
|
|
|
@ -50,7 +50,7 @@ beatrun.hud.lvl=Лвл: %s
|
|||
beatrun.hud.infector=Заражений
|
||||
|
||||
# Menu_Course
|
||||
beatrun.coursemenu.trials=Курси - %s
|
||||
beatrun.coursemenu.trials=Курси - Папка: %s
|
||||
beatrun.coursemenu.buildmode=Режим будівництва
|
||||
beatrun.coursemenu.freeplay=Вільна гра
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ function ENT:StartTouch(ent)
|
|||
end
|
||||
|
||||
function ENT:Touch(ent)
|
||||
if ent:IsPlayer() then
|
||||
if ent:IsPlayer() and GetGlobalBool("GM_INFECTION") then
|
||||
if CurTime() > ent.MemeTime then
|
||||
if not ent.MemeMessage then
|
||||
ent:ChatPrint("Are you having fun standing still in a parkour game? Let's spice things up a bit!")
|
||||
|
|
|
@ -64,7 +64,7 @@ function ENT:BRCollisionFunc(ent)
|
|||
|
||||
local dmginfo = DamageInfo()
|
||||
dmginfo:SetAttacker(self)
|
||||
dmginfo:SetDamage(1000)
|
||||
dmginfo:SetDamage(math.huge)
|
||||
dmginfo:SetDamageType(DMG_DISSOLVE)
|
||||
ent:TakeDamageInfo(dmginfo)
|
||||
ent:EmitSound("bigspark" .. math.random(1, 2) .. ".wav")
|
||||
|
|
|
@ -44,7 +44,7 @@ function ENT:StartTouch(ent)
|
|||
ent:SetNW2Int("CPNum", ent:GetNW2Int("CPNum", 1) + 1)
|
||||
|
||||
if ent:GetNW2Int("CPNum", 1) > table.Count(Checkpoints) then
|
||||
-- ReplayStop(ent)
|
||||
ReplayStop(ent, false)
|
||||
FinishCourse(ent)
|
||||
else
|
||||
ent.CPSavePos = ent:GetPos()
|
||||
|
|
|
@ -99,8 +99,6 @@ function SWEP:Deploy()
|
|||
self:SetWasOnGround(false)
|
||||
self:SetBlockAnims(false)
|
||||
self:SetPunch(1)
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
function SWEP:Initialize()
|
||||
|
@ -223,14 +221,16 @@ function SWEP:Think()
|
|||
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)
|
||||
if insidestep and GetConVar("Beatrun_QuakeJump"):GetBool() then
|
||||
if (!GetConVar("Beatrun_QuakeJump_Timing"):GetBool() and viewmodel:GetCycle() <= 0.1) or ply:GetNWBool("Beatrun_ExtraQuakeJumpTiming") then
|
||||
if SERVER then
|
||||
ply:EmitSound("quakejump.mp3", 100, 100, 0.2)
|
||||
end
|
||||
|
||||
ply.QuakeJumping = true
|
||||
|
||||
self:SetQuakeJumping(true)
|
||||
end
|
||||
|
||||
ply.QuakeJumping = true
|
||||
|
||||
self:SetQuakeJumping(true)
|
||||
end
|
||||
|
||||
if not ismoving and not ply:Crouching() then
|
||||
|
|
|
@ -23,6 +23,9 @@ end
|
|||
local addons = 0
|
||||
|
||||
local incompatible = {
|
||||
["2155366756"] = true, -- VManip (Base)
|
||||
["2364206712"] = true, -- [VManip] Vaulting
|
||||
["2416989205"] = true, -- [VManip] Quick Slide
|
||||
["1581533176"] = true, -- The Aperture [Reupload]
|
||||
["2675972006"] = true, -- Custom Loadout
|
||||
["378401390"] = true, -- Quake/Half-Life View bobbing
|
||||
|
@ -49,9 +52,10 @@ local incompatible = {
|
|||
["2824714462"] = true, -- [TFA] Screen Shake
|
||||
["3037375111"] = true, -- Quick Slide With Legs
|
||||
["748422181"] = true, -- FOV Changer
|
||||
["2930331275"] = true, -- Realistic Fragmentation System
|
||||
["2919970981"] = true, -- Realistic Fragmentation System [OLD]
|
||||
["112806637"] = true, -- Gmod Legs 3
|
||||
["678037029"] = true -- Enhanced Camera
|
||||
["678037029"] = true, -- Enhanced Camera
|
||||
["2497150824"] = true -- Smooth Camera
|
||||
}
|
||||
|
||||
local warnpanel = {
|
||||
|
|
|
@ -448,6 +448,7 @@ hook.Add("Think", "BodyAnimThink", function()
|
|||
if not IsValid(BodyAnim) then return end
|
||||
|
||||
local ply = LocalPlayer()
|
||||
SlowmoMultiplier = ply:GetLaggedMovementValue()
|
||||
|
||||
if not ply:Alive() and not deathanim then
|
||||
RemoveBodyAnim()
|
||||
|
@ -455,7 +456,7 @@ hook.Add("Think", "BodyAnimThink", function()
|
|||
return
|
||||
end
|
||||
|
||||
BodyAnimCycle = BodyAnimCycle + FrameTime() / BodyAnim:SequenceDuration() * BodyAnimSpeed
|
||||
BodyAnimCycle = BodyAnimCycle + FrameTime() / BodyAnim:SequenceDuration() * BodyAnimSpeed * SlowmoMultiplier
|
||||
|
||||
if not customcycle then
|
||||
BodyAnim:SetCycle(BodyAnimCycle)
|
||||
|
|
|
@ -51,7 +51,7 @@ hook.Add("RenderScreenspaceEffects", "BeatrunNoclipBW", function()
|
|||
end
|
||||
|
||||
if noclipping then
|
||||
color = math.Approach(color, 0.5, RealFrameTime())
|
||||
--color = math.Approach(color, 0.5, RealFrameTime())
|
||||
elseif inp then
|
||||
color = math.Approach(color, 1, RealFrameTime() * 2)
|
||||
end
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
local OldAnims = CreateClientConVar("Beatrun_OldAnims", "0", true, false, "")
|
||||
|
||||
local animtable = {
|
||||
lockang = false,
|
||||
allowmove = true,
|
||||
|
@ -10,11 +8,17 @@ local animtable = {
|
|||
BodyLimitX = 90,
|
||||
AnimString = "jumpslow",
|
||||
CamIgnoreAng = true,
|
||||
animmodelstring = "new_climbanim",
|
||||
animmodelstring = "climbanim",
|
||||
BodyLimitY = 180,
|
||||
usefullbody = 2
|
||||
}
|
||||
|
||||
changedanimset = false
|
||||
|
||||
if UseOldAnims:GetBool() then
|
||||
animtable.animmodelstring = "meclimbanim"
|
||||
end
|
||||
|
||||
fbanims = {
|
||||
ladderexittoplefthand = true,
|
||||
runfwdstart = true,
|
||||
|
@ -1342,11 +1346,51 @@ hook.Add("CalcViewModelView", "lol", function(wep, vm, oldpos, oldang, pos, ang)
|
|||
end)
|
||||
|
||||
local function JumpAnim(event, ply)
|
||||
if !animsetchange then animsetchange = false end
|
||||
--print("-------------")
|
||||
--print("JumpAnim called -- " .. engine.TickCount())
|
||||
if animsetchange != UseOldAnims:GetBool() then
|
||||
--print("---- BodyAnim removed -- " .. engine.TickCount())
|
||||
RemoveBodyAnim()
|
||||
end
|
||||
if animsetchange != UseOldAnims:GetBool() then
|
||||
if UseOldAnims:GetBool() then
|
||||
animtable.animmodelstring = "meclimbanim"
|
||||
else
|
||||
animtable.animmodelstring = "climbanim"
|
||||
end
|
||||
StartBodyAnim(animtable)
|
||||
--print("---- BodyAnim recreated -- " .. engine.TickCount())
|
||||
|
||||
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)
|
||||
end
|
||||
if events[event] then
|
||||
--print("-- JumpAnim in event -- " .. engine.TickCount())
|
||||
local wasjumpanim = fbanims[BodyAnimString] and IsValid(BodyAnim)
|
||||
|
||||
if changedanimset then
|
||||
wasjumpanim = false
|
||||
end
|
||||
|
||||
if not wasjumpanim then
|
||||
RemoveBodyAnim()
|
||||
--print("---- BodyAnim removed -- " .. engine.TickCount())
|
||||
--RemoveBodyAnim()
|
||||
end
|
||||
|
||||
if event == "jump" or event == "jumpfar" or event:Left(11) == "jumpwallrun" and ply:GetWallrunDir():Dot(ply:EyeAngles():Forward()) < 0.75 then
|
||||
|
@ -1377,6 +1421,7 @@ local function JumpAnim(event, ply)
|
|||
CheckAnims()
|
||||
|
||||
StartBodyAnim(animtable)
|
||||
--print("---- BodyAnim recreated -- " .. engine.TickCount())
|
||||
|
||||
if not IsValid(BodyAnim) then return end
|
||||
|
||||
|
@ -1399,39 +1444,9 @@ local function JumpAnim(event, ply)
|
|||
BodyAnim:ResetSequence(BodyAnim:LookupSequence(BodyAnimString))
|
||||
end
|
||||
end
|
||||
animsetchange = UseOldAnims:GetBool()
|
||||
end
|
||||
|
||||
function CheckAnims()
|
||||
RemoveBodyAnim()
|
||||
|
||||
if OldAnims:GetBool() then
|
||||
animtable.animmodelstring = "old_climbanim"
|
||||
else
|
||||
animtable.animmodelstring = "new_climbanim"
|
||||
end
|
||||
|
||||
StartBodyAnim(animtable)
|
||||
|
||||
if not IsValid(BodyAnim) then return end
|
||||
|
||||
CreateBodyAnimArmCopy()
|
||||
|
||||
if not LocalPlayer():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
|
||||
end
|
||||
|
||||
cvars.AddChangeCallback("Beatrun_OldAnims", function(cvar, vOld, vNew)
|
||||
CheckAnims()
|
||||
end)
|
||||
|
||||
hook.Add("PlayerInitialSpawn", "CheckAnims", CheckAnims)
|
||||
hook.Add("OnParkour", "JumpAnim", JumpAnim)
|
||||
|
||||
function ArmInterrupt(anim)
|
||||
|
@ -1825,4 +1840,4 @@ local function JumpThink()
|
|||
end
|
||||
end
|
||||
|
||||
hook.Add("Think", "JumpThink", JumpThink)
|
||||
hook.Add("Think", "JumpThink", JumpThink)
|
|
@ -6,24 +6,34 @@ local color_black = Color(0, 0, 0)
|
|||
local color_black_t = Color(0, 0, 0, 100)
|
||||
local size = 35
|
||||
|
||||
local function GetFormattedKey(bind)
|
||||
local keyBind = input.LookupBinding(bind)
|
||||
|
||||
if keyBind == "MOUSE1" then keyBind = "LMB"
|
||||
elseif keyBind == "MOUSE2" then keyBind = "RMB"
|
||||
elseif keyBind == "MOUSE3" then keyBind = "MMB" end
|
||||
|
||||
if keyBind then
|
||||
return string.upper(keyBind)
|
||||
else
|
||||
return "?"
|
||||
end
|
||||
end
|
||||
|
||||
local function ShowKeyStrokes()
|
||||
if showKeystrokes:GetBool() and GetConVar("Beatrun_HUDHidden"):GetInt() == 0 then
|
||||
local forward = string.upper(input.LookupBinding("+forward"))
|
||||
local back = string.upper(input.LookupBinding("+back"))
|
||||
local moveleft = string.upper(input.LookupBinding("+moveleft"))
|
||||
local moveright = string.upper(input.LookupBinding("+moveright"))
|
||||
local use = string.upper(input.LookupBinding("+use"))
|
||||
local reload = string.upper(input.LookupBinding("+reload"))
|
||||
local jump = string.upper(input.LookupBinding("+jump"))
|
||||
local speed = string.upper(input.LookupBinding("+speed"))
|
||||
local duck = string.upper(input.LookupBinding("+duck"))
|
||||
local attack = string.upper(input.LookupBinding("+attack"))
|
||||
local attack2 = string.upper(input.LookupBinding("+attack2"))
|
||||
local forward = GetFormattedKey("+forward")
|
||||
local back = GetFormattedKey("+back")
|
||||
local moveleft = GetFormattedKey("+moveleft")
|
||||
local moveright = GetFormattedKey("+moveright")
|
||||
local use = GetFormattedKey("+use")
|
||||
local reload = GetFormattedKey("+reload")
|
||||
local jump = GetFormattedKey("+jump")
|
||||
local speed = GetFormattedKey("+speed")
|
||||
local duck = GetFormattedKey("+duck")
|
||||
local attack = GetFormattedKey("+attack")
|
||||
local attack2 = GetFormattedKey("+attack2")
|
||||
|
||||
if attack == "MOUSE1" then attack = "LMB" end
|
||||
if attack2 == "MOUSE2" then attack2 = "RMB" end
|
||||
|
||||
-- Key W
|
||||
if LocalPlayer():KeyDown(IN_FORWARD) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(size, 0, size, size)
|
||||
|
@ -34,7 +44,6 @@ local function ShowKeyStrokes()
|
|||
draw.SimpleText(forward, "BeatrunHUD", size + 10, size - 30, color_white)
|
||||
end
|
||||
|
||||
-- Key E
|
||||
if LocalPlayer():KeyDown(IN_USE) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(size * 2, 0, size, size)
|
||||
|
@ -45,7 +54,6 @@ local function ShowKeyStrokes()
|
|||
draw.SimpleText(use, "BeatrunHUD", size + 48, size - 30, color_white)
|
||||
end
|
||||
|
||||
-- Key R
|
||||
if LocalPlayer():KeyDown(IN_RELOAD) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(size * 3, 0, size, size)
|
||||
|
@ -56,7 +64,6 @@ local function ShowKeyStrokes()
|
|||
draw.SimpleText(reload, "BeatrunHUD", size * 3 + 12, size - 30, color_white)
|
||||
end
|
||||
|
||||
-- Key A
|
||||
if LocalPlayer():KeyDown(IN_MOVELEFT) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(0, size, size, size)
|
||||
|
@ -67,7 +74,6 @@ local function ShowKeyStrokes()
|
|||
draw.SimpleText(moveleft, "BeatrunHUD", size - 23, size + 8, color_white)
|
||||
end
|
||||
|
||||
-- Key S
|
||||
if LocalPlayer():KeyDown(IN_BACK) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(size, size, size, size)
|
||||
|
@ -78,7 +84,6 @@ local function ShowKeyStrokes()
|
|||
draw.SimpleText(back, "BeatrunHUD", size + 12, size + 8, color_white)
|
||||
end
|
||||
|
||||
-- Key D
|
||||
if LocalPlayer():KeyDown(IN_MOVERIGHT) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(size * 2, size, size, size)
|
||||
|
@ -89,7 +94,6 @@ local function ShowKeyStrokes()
|
|||
draw.SimpleText(moveright, "BeatrunHUD", size + 48, size + 8, color_white)
|
||||
end
|
||||
|
||||
-- Space
|
||||
if LocalPlayer():KeyDown(IN_JUMP) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(0, size * 2, size * 3, size)
|
||||
|
@ -100,7 +104,6 @@ local function ShowKeyStrokes()
|
|||
draw.SimpleText(jump, "BeatrunHUD", 28, size * 2 + 8, color_white)
|
||||
end
|
||||
|
||||
-- Shift
|
||||
if LocalPlayer():KeyDown(IN_SPEED) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(0, size * 3, size * 3, size)
|
||||
|
@ -111,7 +114,6 @@ local function ShowKeyStrokes()
|
|||
draw.SimpleText(speed, "BeatrunHUD", 28, size * 3 + 8, color_white)
|
||||
end
|
||||
|
||||
-- Ctrl
|
||||
if LocalPlayer():KeyDown(IN_DUCK) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(0, size * 4, size * 3, size)
|
||||
|
@ -122,7 +124,6 @@ local function ShowKeyStrokes()
|
|||
draw.SimpleText(duck, "BeatrunHUD", 32, size * 4 + 8, color_white)
|
||||
end
|
||||
|
||||
-- Left Mouse
|
||||
if LocalPlayer():KeyDown(IN_ATTACK) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(size * 3, size, size * 2, size)
|
||||
|
@ -133,7 +134,6 @@ local function ShowKeyStrokes()
|
|||
draw.SimpleText(attack, "BeatrunHUD", size + 87, size + 8, color_white)
|
||||
end
|
||||
|
||||
-- Right Mouse
|
||||
if LocalPlayer():KeyDown(IN_ATTACK2) then
|
||||
surface.SetDrawColor(color_white_t)
|
||||
surface.DrawRect(size * 3, size * 2, size * 2, size)
|
||||
|
@ -146,4 +146,4 @@ local function ShowKeyStrokes()
|
|||
end
|
||||
end
|
||||
|
||||
hook.Add("HUDPaint", "KeyStrokes", ShowKeyStrokes)
|
||||
hook.Add("HUDPaint", "KeyStrokes", ShowKeyStrokes)
|
||||
|
|
|
@ -25,7 +25,7 @@ local function buildmodebutton()
|
|||
LocalPlayer():ConCommand("buildmode")
|
||||
end
|
||||
|
||||
AEUI:Text(coursepanel, language.GetPhrase("beatrun.coursemenu.trials"):format(game.GetMap()), "AEUIVeryLarge", 20, 30)
|
||||
AEUI:Text(coursepanel, language.GetPhrase("beatrun.coursemenu.trials"):format(string.Replace(game.GetMap(), " ", "-")), "AEUIVeryLarge", 20, 30)
|
||||
|
||||
local buildmodebutton = AEUI:AddButton(coursepanel, "#beatrun.coursemenu.buildmode", buildmodebutton, "AEUILarge", coursepanel.w - 400, coursepanel.h - 50)
|
||||
buildmodebutton.greyed = sacheck
|
||||
|
@ -55,7 +55,7 @@ function OpenCourseMenu()
|
|||
AEUI:AddPanel(coursepanel)
|
||||
AEUI:AddPanel(courselist)
|
||||
|
||||
local dir = "beatrun/courses/" .. game.GetMap() .. "/"
|
||||
local dir = "beatrun/courses/" .. string.Replace(game.GetMap(), " ", "-") .. "/"
|
||||
local dirsearch = dir .. "*.txt"
|
||||
local files = file.Find(dirsearch, "DATA", "datedesc")
|
||||
|
||||
|
|
69
beatrun/gamemodes/beatrun/gamemode/cl/PostprocessEffects.lua
Normal file
69
beatrun/gamemodes/beatrun/gamemode/cl/PostprocessEffects.lua
Normal file
|
@ -0,0 +1,69 @@
|
|||
local function MyNeedsDepthPass()
|
||||
return true
|
||||
end
|
||||
|
||||
doffocus = CreateClientConVar("doftest_focus", 0, true, false, "", 0, 1)
|
||||
doffocus2 = CreateClientConVar("doftest_focus2", 0, true, false, "", 0, 1)
|
||||
local postprocessenable = CreateClientConVar("Beatrun_PostprocessEffects", 0, true, false, "Enables silly ahh post-processing effects. EXPERIMENTAL.", 0, 1)
|
||||
|
||||
-- Add hook so that the _rt_ResolvedFullFrameDepth texture is updated
|
||||
hook.Add( "NeedsDepthPass", "MyNeedsDepthPass", MyNeedsDepthPass )
|
||||
|
||||
local blur_mat = Material('pp/bokehblur')
|
||||
local BOKEN_FOCUS = 0
|
||||
local BOKEN_FORCE = 0
|
||||
|
||||
cyclestate = false
|
||||
|
||||
hook.Add("RenderScreenspaceEffects", "funnybrdof", function()
|
||||
if !postprocessenable:GetBool() then return end
|
||||
local ply = LocalPlayer()
|
||||
|
||||
render.UpdateScreenEffectTexture(1)
|
||||
|
||||
local trace = {}
|
||||
if not ply:ShouldDrawLocalPlayer() then
|
||||
eye = ply:EyePos()
|
||||
langles = ply:EyeAngles()
|
||||
|
||||
if ply:InVehicle() then
|
||||
langles = ply:GetVehicle():GetAngles() + langles
|
||||
end
|
||||
else
|
||||
eye = EyePos()
|
||||
langles = EyeAngles()
|
||||
ignoreEnts = true
|
||||
end
|
||||
trace.start = ply:EyePos()
|
||||
trace.endpos = langles:Forward() * 300 + eye
|
||||
trace.filter = function(ent)
|
||||
return true
|
||||
end
|
||||
|
||||
local tr = util.TraceLine(trace)
|
||||
local dist = tr.HitPos:Distance(ply:GetPos())
|
||||
|
||||
if ply:GetSliding() or ply:GetClimbing() != 0 or ply:GetWallrun() == 1 or IsValid(ply:GetLadder()) then
|
||||
BOKEN_FORCE = math.Clamp(BOKEN_FORCE + 0.03 * (FrameTime() * 66), 0,1)
|
||||
else
|
||||
BOKEN_FORCE = math.Clamp(BOKEN_FORCE - 0.03 * (FrameTime() * 66), 0,1)
|
||||
end
|
||||
|
||||
blur_mat:SetTexture("$BASETEXTURE", render.GetScreenEffectTexture(1))
|
||||
blur_mat:SetTexture("$DEPTHTEXTURE", render.GetResolvedFullFrameDepth())
|
||||
|
||||
blur_mat:SetFloat("$size", BOKEN_FORCE * 8)
|
||||
blur_mat:SetFloat("$focus", 0)
|
||||
blur_mat:SetFloat("$focusradius", 2 - 0.25 * 2)
|
||||
|
||||
--blur_mat:SetFloat("$size", BOKEN_FORCE * 3)
|
||||
--blur_mat:SetFloat("$focus", 0)
|
||||
--blur_mat:SetFloat("$focusradius", 2 - 0.5 * 3)
|
||||
--print(BOKEN_FOCUS)
|
||||
|
||||
--render.SetMaterial(fbtexture)
|
||||
--render.DrawScreenQuadEx(0,0,960,540)
|
||||
render.SetMaterial(blur_mat)
|
||||
render.DrawScreenQuad()
|
||||
--render.DrawTextureToScreenRect(render.GetResolvedFullFrameDepth(),960,0,960,540)
|
||||
end)
|
|
@ -233,7 +233,7 @@ hook.Add("PopulateToolMenu", "Beatrun_ToolMenu", function()
|
|||
panel:ClearControls()
|
||||
panel:SetName("#beatrun.toolsmenu.gameplay.desc")
|
||||
|
||||
panel:CheckBox("#beatrun.toolsmenu.gameplay.oldanims", "Beatrun_OldAnims")
|
||||
panel:CheckBox("#beatrun.toolsmenu.gameplay.oldanims", "Beatrun_UseOldAnims")
|
||||
panel:ControlHelp("#beatrun.toolsmenu.gameplay.oldanimsdesc")
|
||||
|
||||
panel:CheckBox("#beatrun.toolsmenu.gameplay.quickturnground", "Beatrun_QuickturnGround")
|
||||
|
@ -353,6 +353,9 @@ hook.Add("PopulateToolMenu", "Beatrun_ToolMenu", function()
|
|||
panel:CheckBox("#beatrun.randommwloadouts", "Beatrun_RandomMWLoadouts")
|
||||
panel:ControlHelp("#beatrun.randommwloadoutsdesc")
|
||||
|
||||
panel:CheckBox("#beatrun.randoarc9loadouts", "Beatrun_RandomARC9Loadouts")
|
||||
panel:ControlHelp("#beatrun.randoarc9loadoutsdesc")
|
||||
|
||||
local DatatheftButton = vgui.Create("DButton", panel)
|
||||
DatatheftButton:SetText("#beatrun.toolsmenu.gamemodes.datatheft")
|
||||
DatatheftButton:SetSize(0, 20)
|
||||
|
@ -418,6 +421,28 @@ hook.Add("PopulateToolMenu", "Beatrun_ToolMenu", function()
|
|||
-- panel:AddItem(LoadoutMenuButton)
|
||||
end)
|
||||
|
||||
spawnmenu.AddToolMenuOption("Beatrun", "Server", "beatrun_serverfun", "Fun", "", "", function(panel)
|
||||
local funoptions = vgui.Create("DForm")
|
||||
local experimentals = vgui.Create("DForm")
|
||||
panel:ClearControls()
|
||||
panel:SetName("Fun/Experimental Settings")
|
||||
|
||||
panel:Help("Some settings that may not be very practical, are very hacky or are just for fun.")
|
||||
panel:ControlHelp("Note: For checkboxes, ticked is ON and unticked/empty box is OFF.")
|
||||
|
||||
panel:AddItem(funoptions)
|
||||
panel:AddItem(experimentals)
|
||||
|
||||
funoptions:SetName("The Fun Options™")
|
||||
|
||||
funoptions:CheckBox("Cruelty Parkour (?)", "Beatrun_CrueltyParkour")
|
||||
funoptions:ControlHelp("\"Funny\" optional feature that blocks some parkour moves and changes some moves\' behavior with a different weapon out.")
|
||||
|
||||
experimentals:SetName("Experimental Things™")
|
||||
experimentals:CheckBox("\"Slippy Wallruns\"", "Beatrun_Experimentals_SlippyWallrun")
|
||||
experimentals:ControlHelp("You randomly drop from wallruns with a different weapon out. Requires Cruelty Parkour to be ON.")
|
||||
end)
|
||||
|
||||
spawnmenu.AddToolMenuOption("Beatrun", "Extra", "beatrun_extra", "#beatrun.toolsmenu.extra.name", "", "", function(panel)
|
||||
panel:ClearControls()
|
||||
panel:SetName("#beatrun.toolsmenu.extra.desc")
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
--include("preexecute/client.lua")
|
||||
include("shared.lua")
|
||||
|
||||
for _, v in ipairs(file.Find("gamemodes/beatrun/gamemode/cl/*.lua", "GAME")) do
|
||||
|
|
|
@ -6,6 +6,10 @@ for _, v in ipairs(file.Find("gamemodes/beatrun/gamemode/cl/*.lua", "GAME")) do
|
|||
AddCSLuaFile("cl/" .. v)
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
include("preexecute/server.lua")
|
||||
end
|
||||
|
||||
for _, v in ipairs(file.Find("gamemodes/beatrun/gamemode/sh/*.lua", "GAME")) do
|
||||
AddCSLuaFile("sh/" .. v)
|
||||
include("sh/" .. v)
|
||||
|
|
|
@ -11,6 +11,10 @@ if CLIENT then
|
|||
local lframeswepclass = lframeswepclass or ""
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
util.AddNetworkString("Beatrun_ClientFOVChange")
|
||||
end
|
||||
|
||||
local PLAYER = {}
|
||||
|
||||
PLAYER.DuckSpeed = 0.01 -- How fast to go from not ducking, to ducking
|
||||
|
@ -21,6 +25,8 @@ PLAYER.TauntCam = TauntCamera()
|
|||
PLAYER.WalkSpeed = 200
|
||||
PLAYER.RunSpeed = 400
|
||||
|
||||
local FOVModifierBlock = false -- trust me this is important -losttrackpad
|
||||
|
||||
function PLAYER:SetupDataTables()
|
||||
BaseClass.SetupDataTables(self)
|
||||
self.Player:NetworkVar("Float", 0, "MEMoveLimit")
|
||||
|
@ -124,26 +130,7 @@ end
|
|||
|
||||
function PLAYER:Loadout()
|
||||
if GetGlobalBool("GM_DATATHEFT") or GetGlobalBool("GM_DEATHMATCH") then
|
||||
if GetConVar("Beatrun_RandomMWLoadouts"):GetBool() then
|
||||
for i = 0, 1 do
|
||||
local randomSWEP = getRandomMGBaseWeapon()
|
||||
local w = self.Player:Give(randomSWEP.ClassName)
|
||||
|
||||
timer.Simple(1, function()
|
||||
if w:GetPrimaryAmmoType() ~= -1 then self.Player:GiveAmmo(10000, w:GetPrimaryAmmoType(), true) end
|
||||
if w:GetSecondaryAmmoType() ~= -1 then self.Player:GiveAmmo(5, w:GetSecondaryAmmoType(), true) end
|
||||
end)
|
||||
end
|
||||
else
|
||||
for _, v in ipairs(BEATRUN_GAMEMODES_LOADOUTS[math.random(#BEATRUN_GAMEMODES_LOADOUTS)]) do
|
||||
local w = self.Player:Give(v)
|
||||
|
||||
timer.Simple(1, function()
|
||||
if w:GetPrimaryAmmoType() ~= -1 then self.Player:GiveAmmo(10000, w:GetPrimaryAmmoType(), true) end
|
||||
if w:GetSecondaryAmmoType() ~= -1 then self.Player:GiveAmmo(5, w:GetSecondaryAmmoType(), true) end
|
||||
end)
|
||||
end
|
||||
end
|
||||
Beatrun_GiveGMWeapon(self.Player)
|
||||
else
|
||||
self.Player:RemoveAllAmmo()
|
||||
end
|
||||
|
@ -223,8 +210,8 @@ function PLAYER:Spawn()
|
|||
ply:SetPos(Course_StartPos)
|
||||
end)
|
||||
|
||||
-- ReplayStop(ply)
|
||||
-- ReplayStart(ply)
|
||||
ReplayStop(ply, true)
|
||||
ReplayStart(ply)
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -369,9 +356,34 @@ end
|
|||
|
||||
function PLAYER:CalcView(view)
|
||||
local mult = (self.Player:InOverdrive() and 1.1) or 1
|
||||
local fov = GetConVar("Beatrun_FOV"):GetInt()
|
||||
local fixfovmult = 1
|
||||
|
||||
view.fov = fov * mult
|
||||
if CLIENT then
|
||||
-- VERY hacky and dirty code and I apologize in advance
|
||||
local fov = GetConVar("Beatrun_FOV"):GetInt()
|
||||
|
||||
if IsValid(LocalPlayer():GetActiveWeapon()) then
|
||||
if lframeswepclass ~= LocalPlayer():GetActiveWeapon():GetClass() then
|
||||
-- SP clientside weapon swap detection
|
||||
FOVModifierBlock = true
|
||||
|
||||
timer.Simple(1, function()
|
||||
FOVModifierBlock = false
|
||||
end)
|
||||
end
|
||||
|
||||
if not FOVModifierBlock and not LocalPlayer():GetActiveWeapon().ARC9 then
|
||||
fixfovmult = view.fov / fov
|
||||
else
|
||||
fixfovmult = 1
|
||||
end
|
||||
|
||||
view.fov = fov * mult * fixfovmult
|
||||
lframeswepclass = LocalPlayer():GetActiveWeapon():GetClass()
|
||||
else
|
||||
view.fov = fov * mult
|
||||
end
|
||||
end
|
||||
|
||||
if self.TauntCam:CalcView(view, self.Player, self.Player:IsPlayingTaunt()) then return true end
|
||||
end
|
||||
|
@ -531,11 +543,38 @@ end)
|
|||
hook.Add("PlayerSwitchWeapon", "BeatrunSwitchARC9FOVFix", function(ply)
|
||||
-- This ENTIRE hook is for dealing with ARC9's stupid FOV reset
|
||||
-- behavior after switching away from an ARC9 SWEP.
|
||||
ply:SetFOV(ply:GetInfoNum("Beatrun_FOV", 100))
|
||||
|
||||
ply:SetFOV(ply:GetInfoNum("Beatrun_FOV", 120))
|
||||
timer.Simple(0, function()
|
||||
ply:SetFOV(ply:GetInfoNum("Beatrun_FOV", 100))
|
||||
end)
|
||||
end)
|
||||
|
||||
player_manager.RegisterClass("player_beatrun", PLAYER, "player_default")
|
||||
hook.Add("InitPostEntity", "FOVChangeFix", function()
|
||||
-- FOV change fix, don't tinker with this unless you know what you're doing...
|
||||
cvars.AddChangeCallback("Beatrun_FOV", function(convar, oldval, newval)
|
||||
if CLIENT and game.SinglePlayer() then
|
||||
LocalPlayer():SetFOV(newval)
|
||||
elseif CLIENT then
|
||||
FOVModifierBlock = true
|
||||
|
||||
timer.Simple(0.16, function()
|
||||
FOVModifierBlock = false
|
||||
|
||||
if not FOVModifierBlock then
|
||||
net.Start("Beatrun_ClientFOVChange")
|
||||
net.WriteInt(newval, 16)
|
||||
net.SendToServer()
|
||||
FOVModifierBlock = true
|
||||
end
|
||||
end)
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
if SERVER then
|
||||
net.Receive("Beatrun_ClientFOVChange", function(len, ply)
|
||||
ply:SetFOV(net.ReadInt(16))
|
||||
end)
|
||||
end
|
||||
|
||||
player_manager.RegisterClass("player_beatrun", PLAYER, "player_default")
|
0
beatrun/gamemodes/beatrun/gamemode/preexecute/client.lua
Normal file
0
beatrun/gamemodes/beatrun/gamemode/preexecute/client.lua
Normal file
1
beatrun/gamemodes/beatrun/gamemode/preexecute/server.lua
Normal file
1
beatrun/gamemodes/beatrun/gamemode/preexecute/server.lua
Normal file
|
@ -0,0 +1 @@
|
|||
-- This file does nothing for now.
|
5
beatrun/gamemodes/beatrun/gamemode/preexecute/shared.lua
Normal file
5
beatrun/gamemodes/beatrun/gamemode/preexecute/shared.lua
Normal file
|
@ -0,0 +1,5 @@
|
|||
CrueltyParkour = CreateConVar("Beatrun_CrueltyParkour", 0, {FCVAR_ARCHIVE, FCVAR_REPLICATED}, "Also known as \"Cruelty Mode\".\nDisables some Beatrun parkour abilities using anything but the Beatrun hands when enabled.", 0, 1)
|
||||
|
||||
SlippyWallrun = CreateConVar("Beatrun_Experimentals_SlippyWallrun", 0, {FCVAR_ARCHIVE, FCVAR_REPLICATED}, "Makes your wallrun slippy. Only usable with Cruelty Parkour on.", 0, 1)
|
||||
|
||||
UseOldAnims = CreateConVar("Beatrun_UseOldAnims", 0, {FCVAR_ARCHIVE, FCVAR_REPLICATED}, "Use Mirror's Edge animations instead of the reanimated ones.", 0, 1)
|
|
@ -1,6 +1,9 @@
|
|||
local vmatrixmeta = FindMetaTable("VMatrix")
|
||||
local playermeta = FindMetaTable("Player")
|
||||
|
||||
CreateConVar("Beatrun_RandomMWLoadouts", 0, {FCVAR_REPLICATED, FCVAR_ARCHIVE})
|
||||
CreateConVar("Beatrun_RandomARC9Loadouts", 0, {FCVAR_REPLICATED, FCVAR_ARCHIVE})
|
||||
|
||||
BEATRUN_GAMEMODES_LOADOUTS = {
|
||||
{"weapon_357", "weapon_ar2"}
|
||||
}
|
||||
|
@ -86,4 +89,61 @@ function playermeta:notUsingRH(wep)
|
|||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Beatrun_GiveAmmo(weapon, ply)
|
||||
if weapon:GetPrimaryAmmoType() ~= -1 then ply:GiveAmmo(10000, weapon:GetPrimaryAmmoType(), true) end
|
||||
if weapon:GetSecondaryAmmoType() ~= -1 then ply:GiveAmmo(5, weapon:GetSecondaryAmmoType(), true) end
|
||||
end
|
||||
|
||||
function Beatrun_getRandomMWBaseSWEP()
|
||||
local allWep = weapons.GetList()
|
||||
local wepIndex = math.random(#allWep)
|
||||
local wep = allWep[wepIndex]
|
||||
|
||||
if wep.Base == "mg_base" and not wep.AdminOnly then
|
||||
return wep
|
||||
else
|
||||
return Beatrun_getRandomMWBaseSWEP()
|
||||
end
|
||||
end
|
||||
|
||||
function Beatrun_getRandomARC9SWEP()
|
||||
local allWep = weapons.GetList()
|
||||
local wepIndex = math.random(#allWep)
|
||||
local wep = allWep[wepIndex]
|
||||
|
||||
if wep.Base == "arc9_cod2019_base" and not wep.AdminOnly then
|
||||
return wep
|
||||
else
|
||||
return Beatrun_getRandomARC9SWEP()
|
||||
end
|
||||
end
|
||||
|
||||
function Beatrun_GiveGMWeapon(ply)
|
||||
if GetConVar("Beatrun_RandomMWLoadouts"):GetBool() and not GetConVar("Beatrun_RandomARC9Loadouts"):GetBool() then
|
||||
for i = 0, 1 do
|
||||
local swep = Beatrun_getRandomMWBaseSWEP()
|
||||
local w = ply:Give(swep.ClassName)
|
||||
|
||||
timer.Simple(1, function()
|
||||
Beatrun_GiveAmmo(w, ply)
|
||||
end)
|
||||
end
|
||||
elseif GetConVar("Beatrun_RandomARC9Loadouts"):GetBool() and not GetConVar("Beatrun_RandomMWLoadouts"):GetBool() then
|
||||
for i = 0, 1 do
|
||||
-- We don't need ammo because ARC9 got the infinite ammo option!
|
||||
|
||||
local swep = Beatrun_getRandomARC9SWEP()
|
||||
ply:Give(swep.ClassName)
|
||||
end
|
||||
elseif not GetConVar("Beatrun_RandomARC9Loadouts"):GetBool() and not GetConVar("Beatrun_RandomMWLoadouts"):GetBool() then
|
||||
for _, b in ipairs(BEATRUN_GAMEMODES_LOADOUTS[math.random(#BEATRUN_GAMEMODES_LOADOUTS)]) do
|
||||
local w = v:Give(b)
|
||||
|
||||
timer.Simple(1, function()
|
||||
Beatrun_GiveAmmo(w, ply)
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -576,7 +576,7 @@ if SERVER then
|
|||
end
|
||||
|
||||
function Beatrun_ReadCourseLocal(id)
|
||||
local dir = "beatrun/courses/" .. game.GetMap() .. "/"
|
||||
local dir = "beatrun/courses/" .. string.Replace(game.GetMap(), " ", "-") .. "/"
|
||||
local save = file.Read(dir .. id .. ".txt", "DATA")
|
||||
|
||||
if not save then
|
||||
|
@ -943,7 +943,7 @@ if CLIENT then
|
|||
local save = CourseData(name)
|
||||
local jsonsave = util.TableToJSON(save)
|
||||
local id = util.CRC(jsonsave)
|
||||
local dir = "beatrun/courses/" .. game.GetMap() .. "/"
|
||||
local dir = "beatrun/courses/" .. string.Replace(game.GetMap(), " ", "-") .. "/"
|
||||
|
||||
if compress == nil then compress = true end
|
||||
|
||||
|
@ -1011,7 +1011,7 @@ if CLIENT then
|
|||
|
||||
--[[
|
||||
concommand.Add("Beatrun_PrintCourse", function(ply, cmd, args, argstr)
|
||||
local dir = "beatrun/courses/" .. game.GetMap() .. "/"
|
||||
local dir = "beatrun/courses/" .. string.Replace(game.GetMap(), " ", "-") .. "/"
|
||||
local save = file.Read(dir .. args[1] .. ".txt", "DATA")
|
||||
|
||||
if not save then
|
||||
|
|
|
@ -134,7 +134,7 @@ if CLIENT then
|
|||
|
||||
LocalPlayer():EmitSound("A_TT_Finish_Positive.wav")
|
||||
SaveCheckpointTime()
|
||||
-- SaveReplayData()
|
||||
SaveReplayData()
|
||||
else
|
||||
timetext = "+" .. string.FormattedTime(math.abs(timestr), "%02i:%02i:%02i")
|
||||
timecolor = color_negative
|
||||
|
@ -144,6 +144,9 @@ if CLIENT then
|
|||
|
||||
net.Start("Checkpoint_Finish")
|
||||
net.WriteFloat(totaltime)
|
||||
if !LocalPlayer().InReplay then
|
||||
notification.AddLegacy("Replay saved as ".."beatrun/replays/" .. game.GetMap() .. "/"..Course_Name .. os.date("%H-%M-%S_%d-%m-%Y", os.time()) .. ".txt", 0, 3)
|
||||
end
|
||||
net.SendToServer()
|
||||
|
||||
timealpha = 1000
|
||||
|
@ -169,7 +172,7 @@ local finishcolor = Color(45, 45, 175, 100)
|
|||
|
||||
function FinishCourse(ply)
|
||||
ply:ScreenFade(SCREENFADE.IN, finishcolor, 0, 4)
|
||||
-- ply:SetLaggedMovementValue(0.1)
|
||||
ply:SetLaggedMovementValue(0.1)
|
||||
ply:DrawViewModel(false)
|
||||
|
||||
net.Start("Checkpoint_Finish")
|
||||
|
@ -178,7 +181,7 @@ function FinishCourse(ply)
|
|||
ply:SetNW2Int("CPNum", -1)
|
||||
|
||||
timer.Simple(4, function()
|
||||
-- ply:SetLaggedMovementValue(1)
|
||||
ply:SetLaggedMovementValue(1)
|
||||
ply:DrawViewModel(true)
|
||||
end)
|
||||
end
|
||||
|
@ -305,13 +308,42 @@ function CourseHUD()
|
|||
end
|
||||
end
|
||||
|
||||
if incourse and pbtimes then
|
||||
if incourse and !ply.InReplay then
|
||||
local text = string.FormattedTime(totaltime, "%02i:%02i:%02i")
|
||||
local w, _ = surface.GetTextSize(text)
|
||||
surface.SetFont("BeatrunHUD")
|
||||
surface.SetTextColor(text_color)
|
||||
surface.SetTextPos(ScrW() * 0.87 - w + vpx, ScrH() * 0.075 + vpz)
|
||||
surface.DrawText(text)
|
||||
end
|
||||
|
||||
if incourse and pbtimes and !ply.InReplay then
|
||||
local text = string.FormattedTime(pbtotal, "%02i:%02i:%02i")
|
||||
local w, h = surface.GetTextSize(text)
|
||||
|
||||
pbcolor = text_color
|
||||
pbcolor.r = text_color.r * 0.6
|
||||
pbcolor.g = text_color.g * 0.6
|
||||
pbcolor.b = text_color.b * 0.6
|
||||
|
||||
surface.SetFont("BeatrunHUD")
|
||||
surface.SetTextPos(ScrW() * 0.85 - w * 0.5 + vpx, ScrH() * 0.075 + h + vpz)
|
||||
surface.SetTextColor(255, 255, 255, 125)
|
||||
surface.SetTextPos(ScrW() * 0.87 - w + vpx, ScrH() * 0.075 + h + vpz)
|
||||
surface.SetTextColor(pbcolor)
|
||||
surface.DrawText(text)
|
||||
end
|
||||
|
||||
if incourse and ply.InReplay then
|
||||
local text = string.FormattedTime(tickcount * engine.TickInterval(), "%02i:%02i:%02i") .. " / " .. string.FormattedTime(#ply.ReplayTicks * engine.TickInterval(), "%02i:%02i:%02i")
|
||||
local w, _ = surface.GetTextSize(text)
|
||||
surface.SetFont("BeatrunHUD")
|
||||
surface.SetTextColor(text_color)
|
||||
surface.SetTextPos(ScrW() * 0.87 - w + vpx, ScrH() * 0.075 + vpz)
|
||||
surface.DrawText(text)
|
||||
|
||||
local text = "REPLAY MODE - MAY BE INACCURATE"
|
||||
local w, h = surface.GetTextSize(text)
|
||||
surface.SetTextColor(text_color)
|
||||
surface.SetTextPos(ScrW() * 0.87 - w + vpx, ScrH() * 0.075 + vpz + h)
|
||||
surface.DrawText(text)
|
||||
end
|
||||
|
||||
|
@ -354,23 +386,19 @@ function LoadCheckpointTime()
|
|||
return times or nil
|
||||
end
|
||||
|
||||
-- function SaveReplayData()
|
||||
-- local replay = util.Compress(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", 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 SaveReplayData()
|
||||
local replay = util.Compress(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", 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
|
||||
|
|
|
@ -784,4 +784,10 @@ hook.Add("SetupMove", "Climbing", function(ply, mv, cmd)
|
|||
if ply:GetClimbing() ~= 0 then
|
||||
ClimbingThink(ply, mv, cmd)
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Add("PlayerSwitchWeapon", "NoSwitchForClimbers", function(ply)
|
||||
if ply:GetClimbing() != 0 then
|
||||
return true
|
||||
end
|
||||
end)
|
|
@ -6,8 +6,95 @@ else
|
|||
end)
|
||||
end
|
||||
|
||||
local momentumshield = CreateConVar("Beatrun_MomentumShield", 0, {FCVAR_REPLICATED, FCVAR_ARCHIVE})
|
||||
|
||||
if SERVER then
|
||||
local healthRegen = CreateConVar("Beatrun_HealthRegen", 1, {FCVAR_REPLICATED, FCVAR_ARCHIVE})
|
||||
|
||||
hook.Add("PlayerPostThink", "HealthRegen", function(ply)
|
||||
if not healthRegen:GetBool() then return end
|
||||
|
||||
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)
|
||||
|
||||
for _,v in ipairs(player.GetAll()) do
|
||||
v:SetNWFloat("MomentumShieldPer", 0)
|
||||
end
|
||||
|
||||
hook.Add("Move", "MomentumShieldRegen", function(ply, mv)
|
||||
-- I use the move hook because I need momentum data...blame Garry
|
||||
--if !momentumshield:GetBool() then return end
|
||||
|
||||
local shieldpercent = ply:GetNWFloat("MomentumShieldPer", 0)
|
||||
|
||||
if !ply.shielddecaytime then
|
||||
ply.shielddecaytime = 0
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if ply:GetVelocity():Length2D() > (GetConVar("Beatrun_SpeedLimit"):GetInt() * 0.8181818181818182) then
|
||||
ply:SetNWFloat("MomentumShieldPer", math.Approach(shieldpercent, 300, FrameTime() * 30))
|
||||
ply.shielddecaytime = CurTime() + 3
|
||||
elseif ply.shielddecaytime < CurTime() then
|
||||
ply:SetNWFloat("MomentumShieldPer", math.Approach(shieldpercent, 0, FrameTime() * 250))
|
||||
end
|
||||
|
||||
--print(shieldpercent)
|
||||
end)
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
local lastmomshield = -1
|
||||
local shieldlerptime = 0.16
|
||||
local start, oldshield, newshield = 0, -1, -1
|
||||
local hudscale = ScrH() / 1080
|
||||
hook.Add("HUDPaint", "MomentumShieldHUD", function()
|
||||
local ply = LocalPlayer()
|
||||
|
||||
if !IsValid(ply) then return end
|
||||
|
||||
local shieldpercent = ply:GetNWFloat("MomentumShieldPer", 0)
|
||||
|
||||
if oldshield == -1 and newshield == -1 then
|
||||
oldshield = shieldpercent
|
||||
newshield = shieldpercent
|
||||
end
|
||||
|
||||
local shieldsmooth = Lerp((CurTime() - start) / shieldlerptime, oldshield, newshield)
|
||||
|
||||
if newshield != shieldpercent then
|
||||
if shieldsmooth != shieldpercent then
|
||||
newshield = shieldsmooth
|
||||
end
|
||||
oldshield = newshield
|
||||
start = CurTime()
|
||||
newshield = shieldpercent
|
||||
end
|
||||
|
||||
surface.SetDrawColor(255,255,255)
|
||||
surface.DrawRect(ScrW() * 0.5 - 75,ScrH() * 0.6,150 * (math.max(0, shieldsmooth) / 300) * hudscale, 3 * hudscale)
|
||||
end)
|
||||
end
|
||||
|
||||
hook.Add("ScalePlayerDamage", "MissedMe", function(ply, hitgroup, dmginfo)
|
||||
if IsValid(dmginfo:GetAttacker()) and dmginfo:GetAttacker():IsPlayer() then return end
|
||||
if IsValid(dmginfo:GetAttacker()) and dmginfo:GetAttacker():IsPlayer() or momentumshield:GetBool() then return end
|
||||
|
||||
local vel = ply:GetVelocity()
|
||||
local vel_len = vel:Length()
|
||||
|
@ -16,13 +103,27 @@ hook.Add("ScalePlayerDamage", "MissedMe", function(ply, hitgroup, dmginfo)
|
|||
end)
|
||||
|
||||
hook.Add("EntityTakeDamage", "MissedMe", function(victim, dmginfo)
|
||||
if not victim:IsPlayer() then return end
|
||||
if not victim:IsPlayer() or momentumshield:GetBool() 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("EntityTakeDamage", "ShieldProtectPlayer", function(ent, dmg)
|
||||
if !ent:IsPlayer() or !momentumshield:GetBool() then return end
|
||||
shieldper = ent:GetNWFloat("MomentumShieldPer", 0)
|
||||
local dmgamount = dmg:GetDamage()
|
||||
|
||||
if shieldper > 0 and (shieldper - dmgamount) > 0 then
|
||||
ent:SetNWFloat("MomentumShieldPer", math.Clamp(shieldper - dmgamount, 0, 300))
|
||||
dmg:ScaleDamage(0)
|
||||
elseif shieldper > 0 then
|
||||
ent:SetNWFloat("MomentumShieldPer", math.Clamp(shieldper - dmgamount, 0, 300))
|
||||
dmg:SetDamage(shieldper - dmgamount)
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Add("PlayerShouldTakeDamage", "DBNO", function(ply, attacker)
|
||||
if not IsValid(attacker) then return end
|
||||
|
||||
|
@ -57,47 +158,28 @@ if CLIENT then
|
|||
local radial = Material("radial.png")
|
||||
local dmgalpha = 0
|
||||
|
||||
hook.Add("HUDPaint", "NTScreenEffects", function()
|
||||
local ply = LocalPlayer()
|
||||
hook.Add("PreDrawHUD", "NTScreenEffects", function()
|
||||
-- Draw the overlay this way or we (sort of) break other HUDs.
|
||||
cam.Start2D()
|
||||
local ply = LocalPlayer()
|
||||
|
||||
if not ply:Alive() then return end
|
||||
if not ply:Alive() then
|
||||
cam.End2D()
|
||||
return
|
||||
end
|
||||
|
||||
local w = ScrW()
|
||||
local h = ScrH()
|
||||
local w = ScrW()
|
||||
local h = ScrH()
|
||||
|
||||
dmgalpha = math.min(300 * math.abs(ply:Health() / ply:GetMaxHealth() - 1), 255)
|
||||
curhealth = math.Clamp(ply:Health(), 0, ply:GetMaxHealth())
|
||||
dmgalpha = math.min(300 * math.abs(curhealth / 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)
|
||||
surface.SetMaterial(radial)
|
||||
surface.SetDrawColor(0, 0, 0, dmgalpha * 0.58)
|
||||
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.09))
|
||||
surface.DrawTexturedRect(0, 0, w, h)
|
||||
cam.End2D()
|
||||
end)
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
local healthRegen = CreateConVar("Beatrun_HealthRegen", 1, {FCVAR_REPLICATED, FCVAR_ARCHIVE})
|
||||
|
||||
hook.Add("PlayerPostThink", "HealthRegen", function(ply)
|
||||
if not healthRegen:GetBool() then return end
|
||||
|
||||
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
|
|
@ -22,26 +22,7 @@ if SERVER then
|
|||
v:Spawn()
|
||||
end
|
||||
|
||||
if GetConVar("Beatrun_RandomMWLoadouts"):GetBool() then
|
||||
for i = 0, 1 do
|
||||
local randomSWEP = getRandomMGBaseWeapon()
|
||||
local w = v:Give(randomSWEP.ClassName)
|
||||
|
||||
timer.Simple(1, function()
|
||||
if w:GetPrimaryAmmoType() ~= -1 then v:GiveAmmo(10000, w:GetPrimaryAmmoType(), true) end
|
||||
if w:GetSecondaryAmmoType() ~= -1 then v:GiveAmmo(5, w:GetSecondaryAmmoType(), true) end
|
||||
end)
|
||||
end
|
||||
else
|
||||
for _, b in ipairs(BEATRUN_GAMEMODES_LOADOUTS[math.random(#BEATRUN_GAMEMODES_LOADOUTS)]) do
|
||||
local w = v:Give(b)
|
||||
|
||||
timer.Simple(1, function()
|
||||
if w:GetPrimaryAmmoType() ~= -1 then v:GiveAmmo(10000, w:GetPrimaryAmmoType(), true) end
|
||||
if w:GetSecondaryAmmoType() ~= -1 then v:GiveAmmo(5, w:GetSecondaryAmmoType(), true) end
|
||||
end)
|
||||
end
|
||||
end
|
||||
Beatrun_GiveGMWeapon(v)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -2,20 +2,6 @@ if SERVER then
|
|||
util.AddNetworkString("Deathmatch_Start")
|
||||
util.AddNetworkString("Deathmatch_Sync")
|
||||
|
||||
CreateConVar("Beatrun_RandomMWLoadouts", 0, {FCVAR_REPLICATED, FCVAR_ARCHIVE})
|
||||
|
||||
function getRandomMGBaseWeapon()
|
||||
local allWep = weapons.GetList()
|
||||
local wepIndex = math.random(#allWep)
|
||||
local wep = allWep[wepIndex]
|
||||
|
||||
if wep.Base == "mg_base" and not wep.AdminOnly then
|
||||
return wep
|
||||
else
|
||||
return getRandomMGBaseWeapon()
|
||||
end
|
||||
end
|
||||
|
||||
function Beatrun_StartDeathmatch()
|
||||
if GetGlobalBool("GM_DEATHMATCH") then return end
|
||||
if Course_Name ~= "" then return end
|
||||
|
@ -31,26 +17,7 @@ if SERVER then
|
|||
v:Spawn()
|
||||
end
|
||||
|
||||
if GetConVar("Beatrun_RandomMWLoadouts"):GetBool() then
|
||||
for i = 0, 1 do
|
||||
local randomSWEP = getRandomMGBaseWeapon()
|
||||
local w = v:Give(randomSWEP.ClassName)
|
||||
|
||||
timer.Simple(1, function()
|
||||
if w:GetPrimaryAmmoType() ~= -1 then v:GiveAmmo(10000, w:GetPrimaryAmmoType(), true) end
|
||||
if w:GetSecondaryAmmoType() ~= -1 then v:GiveAmmo(5, w:GetSecondaryAmmoType(), true) end
|
||||
end)
|
||||
end
|
||||
else
|
||||
for _, b in ipairs(BEATRUN_GAMEMODES_LOADOUTS[math.random(#BEATRUN_GAMEMODES_LOADOUTS)]) do
|
||||
local w = v:Give(b)
|
||||
|
||||
timer.Simple(1, function()
|
||||
if w:GetPrimaryAmmoType() ~= -1 then v:GiveAmmo(10000, w:GetPrimaryAmmoType(), true) end
|
||||
if w:GetSecondaryAmmoType() ~= -1 then v:GiveAmmo(5, w:GetSecondaryAmmoType(), true) end
|
||||
end)
|
||||
end
|
||||
end
|
||||
Beatrun_GiveGMWeapon(v)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
local quakejump = CreateConVar("Beatrun_QuakeJump", 1, {FCVAR_REPLICATED, FCVAR_ARCHIVE})
|
||||
local sidestep = CreateConVar("Beatrun_SideStep", 1, {FCVAR_REPLICATED, FCVAR_ARCHIVE})
|
||||
local speed_limit = CreateConVar("Beatrun_SpeedLimit", 325, {FCVAR_REPLICATED, FCVAR_ARCHIVE})
|
||||
beatrunquakejumptiming = CreateConVar("Beatrun_QuakeJump_Timing", 0, {FCVAR_REPLICATED, FCVAR_ARCHIVE}, "Quakejump extra timing window in engine ticks (default 66).")
|
||||
-- This NEEDS to be accessible from runnerhands' code.
|
||||
|
||||
local function Hardland(jt)
|
||||
local ply = LocalPlayer()
|
||||
|
@ -308,6 +310,14 @@ hook.Add("SetupMove", "MESetupMove", function(ply, mv, cmd)
|
|||
activewep:SetSideStep(true)
|
||||
|
||||
mv:SetVelocity(cmd:GetViewAngles():Right() * -(speed_limit:GetInt() * 1.8))
|
||||
if beatrunquakejumptiming:GetInt() != 0 then
|
||||
ply:SetNWBool("Beatrun_ExtraQuakeJumpTiming", true)
|
||||
ply:SetFriction(ply:GetFriction() * 0.01)
|
||||
timer.Simple((engine.TickInterval() * beatrunquakejumptiming:GetInt()), function()
|
||||
ply:SetFriction(ply:GetFriction() / 0.01)
|
||||
ply:SetNWBool("Beatrun_ExtraQuakeJumpTiming", false)
|
||||
end)
|
||||
end
|
||||
|
||||
ply:ViewPunch(Angle(-3, 0, -4.5))
|
||||
|
||||
|
@ -323,6 +333,14 @@ hook.Add("SetupMove", "MESetupMove", function(ply, mv, cmd)
|
|||
activewep:SetSideStep(true)
|
||||
|
||||
mv:SetVelocity(cmd:GetViewAngles():Right() * (speed_limit:GetInt() * 1.8))
|
||||
if beatrunquakejumptiming:GetInt() != 0 then
|
||||
ply:SetNWBool("Beatrun_ExtraQuakeJumpTiming", true)
|
||||
ply:SetFriction(ply:GetFriction() * 0.01)
|
||||
timer.Simple((engine.TickInterval() * beatrunquakejumptiming:GetInt()), function()
|
||||
ply:SetFriction(ply:GetFriction() / 0.01)
|
||||
ply:SetNWBool("Beatrun_ExtraQuakeJumpTiming", false)
|
||||
end)
|
||||
end
|
||||
|
||||
ply:ViewPunch(Angle(-3, 0, 4.5))
|
||||
|
||||
|
@ -423,4 +441,15 @@ if CLIENT then
|
|||
ArmInterrupt("doorbash")
|
||||
LocalPlayer():CLViewPunch(Angle(1.5, -0.75, 0))
|
||||
end)
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
concommand.Add(
|
||||
"Beatrun_ResetFriction",
|
||||
function()
|
||||
for _, ply in ipairs(player.GetAll()) do
|
||||
ply:SetFriction(1)
|
||||
end
|
||||
end
|
||||
)
|
||||
end
|
|
@ -17,7 +17,10 @@ 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
|
||||
if math.abs(math.AngleDifference(cmd:GetViewAngles().y, ladderang.y - 180)) > 30 then
|
||||
print("kill me already")
|
||||
return false
|
||||
end
|
||||
|
||||
local zlevel = mv:GetOrigin().z
|
||||
local newpos = ladder:GetPos() + ladderang:Forward() * 19
|
||||
|
@ -83,6 +86,18 @@ local function LadderThink(ply, mv, cmd, ladder)
|
|||
|
||||
cmd:ClearMovement()
|
||||
|
||||
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 ply:GetLadderEntering() then
|
||||
local lerprate = 2
|
||||
|
||||
|
@ -103,7 +118,7 @@ local function LadderThink(ply, mv, cmd, ladder)
|
|||
return
|
||||
end
|
||||
|
||||
if mv:KeyDown(IN_FORWARD) and ply:GetLadderDelay() < CurTime() and ply:GetLadderHeight() < ladder:GetLadderHeight() then
|
||||
if mv:KeyDown(IN_FORWARD) and ply:GetLadderDelay() < CurTime() and ply:GetLadderHeight() < ladder:GetLadderHeight() and (fraction or 1) <= 0.35 then
|
||||
local pos = mv:GetOrigin()
|
||||
|
||||
ply:SetLadderDelay(CurTime() + 0.35)
|
||||
|
@ -245,6 +260,43 @@ local function LadderThink(ply, mv, cmd, ladder)
|
|||
return
|
||||
end
|
||||
|
||||
if mv:KeyDown(IN_JUMP) and mv:KeyDown(IN_FORWARD) and !((fraction or 1) <= 0.35) then
|
||||
local ladderangf = ladder:GetAngles():Forward()
|
||||
local newpos = mv:GetOrigin()
|
||||
local facing = {
|
||||
pos = math.Round(ladderangf.x) == 1 and "x" or math.Round(ladderangf.x) == -1 and "x" or math.Round(ladderangf.y) == 1 and "y" or math.Round(ladderangf.y) == -1 and "y",
|
||||
num = math.Round(ladderangf.x) == 1 and 40 or math.Round(ladderangf.x) == -1 and -40 or math.Round(ladderangf.y) == 1 and 40 or math.Round(ladderangf.y) == -1 and -40,
|
||||
}
|
||||
|
||||
local forward = ply:EyeAngles()
|
||||
forward.p = 0
|
||||
forward = forward:Forward()
|
||||
|
||||
newpos[facing.pos] = mv:GetOrigin()[facing.pos] + facing.num
|
||||
|
||||
vel = vector_origin
|
||||
vel = vel + forward * (6 / 0.06858125)
|
||||
--print("--")
|
||||
--print(vel)
|
||||
vel.z = 300
|
||||
mv:SetOrigin(newpos)
|
||||
mv:SetVelocity(vel)
|
||||
print(CurTime())
|
||||
|
||||
if CLIENT and IsFirstTimePredicted() then
|
||||
BodyAnim:SetSequence("jumpfast")
|
||||
elseif game.SinglePlayer() then
|
||||
ply:SendLua("BodyAnim:SetSequence('jumpfast')")
|
||||
end
|
||||
|
||||
ply:SetMoveType(MOVETYPE_WALK)
|
||||
ply:SetLadder(nil)
|
||||
|
||||
--mv:SetVelocity(vector_origin + forward * (6 / 0.06858125))
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
mv:SetVelocity(vector_origin)
|
||||
mv:SetButtons(0)
|
||||
end
|
||||
|
@ -310,4 +362,15 @@ function CreateLadder(pos, angy, mul)
|
|||
|
||||
return ladder
|
||||
end
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
preladderwep = ""
|
||||
hook.Add("HUDPaint", "NoGunsOnLadders", function()
|
||||
if !LocalPlayer():Alive() then return end
|
||||
if LocalPlayer():GetActiveWeapon():GetClass() != "runnerhands" and IsValid(LocalPlayer():GetLadder()) then -- :troll:
|
||||
preladderwep = LocalPlayer():GetActiveWeapon():GetClass()
|
||||
input.SelectWeapon(LocalPlayer():GetWeapon("runnerhands"))
|
||||
end
|
||||
end)
|
||||
end
|
|
@ -279,6 +279,9 @@ hook.Add("SetupMove", "Melee", function(ply, mv, cmd)
|
|||
mv:SetVelocity(vel)
|
||||
elseif kickglitch:GetBool() and not old_kickglitch:GetBool() then
|
||||
if SERVER then
|
||||
local oldfriction = ply:GetFriction()
|
||||
ply:SetFriction(0)
|
||||
|
||||
local platform = ents.Create("prop_physics")
|
||||
|
||||
local pos = ply:GetPos()
|
||||
|
@ -293,7 +296,12 @@ hook.Add("SetupMove", "Melee", function(ply, mv, cmd)
|
|||
local phys = platform:GetPhysicsObject()
|
||||
phys:EnableMotion(false)
|
||||
|
||||
timer.Simple(0.3, function() SafeRemoveEntity(platform) end)
|
||||
ply:SetNWBool("KickglitchWindowActive", true)
|
||||
timer.Simple(0.3, function()
|
||||
ply:SetNWBool("KickglitchWindowActive", false)
|
||||
ply:SetFriction(oldfriction)
|
||||
SafeRemoveEntity(platform)
|
||||
end)
|
||||
end
|
||||
|
||||
ParkourEvent("jumpslow", ply)
|
||||
|
@ -312,4 +320,30 @@ hook.Add("SetupMove", "Melee", function(ply, mv, cmd)
|
|||
if ply:GetMeleeTime() ~= 0 then
|
||||
MeleeThink(ply, mv, cmd)
|
||||
end
|
||||
end)
|
||||
end)
|
||||
|
||||
hook.Add("Move", "KickglitchApply", function(ply,mv,cmd)
|
||||
if mv:KeyPressed(IN_JUMP) and ply:GetNWBool("KickglitchWindowActive", false) and !GetConVar("Beatrun_OldKickGlitch"):GetBool() then
|
||||
if !ply:Alive() then
|
||||
else
|
||||
local forward = ply:EyeAngles()
|
||||
forward.p = 0
|
||||
forward = forward:Forward()
|
||||
local speedboost = forward * (4 / 0.06858125)
|
||||
--print(speedboost)
|
||||
|
||||
--print("--")
|
||||
|
||||
--print(mv:GetVelocity())
|
||||
local vel = mv:GetVelocity()
|
||||
vel = vel + speedboost
|
||||
--print("--")
|
||||
--print(vel)
|
||||
vel.z = 300
|
||||
mv:SetVelocity(vel)
|
||||
end
|
||||
ply:SetNWBool("KickglitchWindowActive", false)
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Remove("SetupMove", "ProperKickglitch")
|
|
@ -94,10 +94,10 @@ net.Receive("RollAnimSP", function()
|
|||
roll.BodyAnimSpeed = 1.15
|
||||
end
|
||||
|
||||
if GetConVar("Beatrun_OldAnims"):GetBool() then
|
||||
roll.animmodelstring = "old_climbanim"
|
||||
if UseOldAnims:GetBool() then
|
||||
roll.animmodelstring = "meclimbanim"
|
||||
else
|
||||
roll.animmodelstring = "new_climbanim"
|
||||
roll.animmodelstring = "climbanim"
|
||||
end
|
||||
|
||||
CacheBodyAnim()
|
||||
|
@ -138,10 +138,10 @@ hook.Add("SetupMove", "EvadeRoll", function(ply, mv, cmd)
|
|||
end
|
||||
|
||||
if CLIENT and IsFirstTimePredicted() then
|
||||
if GetConVar("Beatrun_OldAnims"):GetBool() then
|
||||
roll.animmodelstring = "old_climbanim"
|
||||
if UseOldAnims:GetBool() then
|
||||
roll.animmodelstring = "meclimbanim"
|
||||
else
|
||||
roll.animmodelstring = "new_climbanim"
|
||||
roll.animmodelstring = "climbanim"
|
||||
end
|
||||
|
||||
CacheBodyAnim()
|
||||
|
@ -214,12 +214,11 @@ hook.Add("OnPlayerHitGround", "SafetyRoll", function(ply, water, floater, speed)
|
|||
end
|
||||
|
||||
if CLIENT and IsFirstTimePredicted() then
|
||||
if GetConVar("Beatrun_OldAnims"):GetBool() then
|
||||
roll.animmodelstring = "old_climbanim"
|
||||
if UseOldAnims:GetBool() then
|
||||
roll.animmodelstring = "meclimbanim"
|
||||
else
|
||||
roll.animmodelstring = "new_climbanim"
|
||||
roll.animmodelstring = "climbanim"
|
||||
end
|
||||
|
||||
CacheBodyAnim()
|
||||
RemoveBodyAnim()
|
||||
StartBodyAnim(roll)
|
||||
|
@ -250,7 +249,7 @@ if SERVER then
|
|||
if speed < 800 and CurTime() < ply:GetSafetyRollKeyTime() and not ply:GetCrouchJump() and not ply:Crouching() then
|
||||
return 0
|
||||
else
|
||||
return 1000
|
||||
return math.huge
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -246,6 +246,7 @@ end
|
|||
|
||||
hook.Add("SetupMove", "qslide", function(ply, mv, cmd)
|
||||
if not ply:Alive() then return end
|
||||
if ply:GetSafetyRollKeyTime() > CurTime() then return end
|
||||
|
||||
if not ply.OldDuckSpeed then
|
||||
ply.OldDuckSpeed = ply:GetDuckSpeed()
|
||||
|
|
|
@ -20,39 +20,42 @@ local function SwingbarCheck(ply, mv, cmd)
|
|||
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)
|
||||
if CrueltyParkour:GetBool() and !ply:UsingRH() then
|
||||
else
|
||||
ply:SetSBOffsetSpeed(0)
|
||||
end
|
||||
local swingbar = trout.Entity
|
||||
local dot = cmd:GetViewAngles():Forward():Dot(swingbar:GetAngles():Forward())
|
||||
local dir = dot > 0 and true or false
|
||||
|
||||
if CLIENT and IsFirstTimePredicted() or game.SinglePlayer() then
|
||||
ply:EmitSound("Handsteps.ConcreteHard")
|
||||
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
|
||||
end
|
||||
|
@ -137,7 +140,7 @@ local function SwingbarThink(ply, mv, cmd)
|
|||
|
||||
offset = ply:GetSBOffset()
|
||||
|
||||
if mv:KeyPressed(IN_JUMP) or mv:KeyDown(IN_JUMP) and offset > 90 then
|
||||
if mv:KeyPressed(IN_JUMP) or mv:KeyDown(IN_JUMP) and offset > 90 or (CrueltyParkour:GetBool() and !ply:UsingRH()) then
|
||||
ParkourEvent("swingjump", ply)
|
||||
|
||||
if mv:KeyPressed(IN_JUMP) and offset > 90 then
|
||||
|
|
|
@ -774,4 +774,12 @@ hook.Add("SetupMove", "BeatrunVaulting", function(ply, mv, cmd)
|
|||
mv:SetButtons(0)
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
hook.Add("PlayerSwitchWeapon", "NoWeaponWhileMantling", function(ply)
|
||||
if ply:GetMantle() == 5 then
|
||||
-- You are still mantling at this state, don't pull an SMG
|
||||
-- out of your back pocket
|
||||
return true
|
||||
end
|
||||
end)
|
|
@ -78,6 +78,10 @@ local function WallrunningThink(ply, mv, cmd)
|
|||
mv:SetButtons(mv:GetButtons() - IN_DUCK)
|
||||
end
|
||||
|
||||
if math.Round(math.Rand(0, 1.1), 1) > 1 and SlippyWallrun:GetBool() and !ply:UsingRH() then
|
||||
timer.Simple(math.Rand(0, (ply:GetWallrunTime() - CurTime())), function() ply:SetWallrunTime(0) end)
|
||||
end
|
||||
|
||||
local wrtimeremains = CurTime() < ply:GetWallrunTime()
|
||||
|
||||
if PuristWallrun:GetBool() then
|
||||
|
@ -522,12 +526,15 @@ end
|
|||
local vecdir = Vector(1000, 1000, 1000)
|
||||
|
||||
hook.Add("SetupMove", "Wallrunning", function(ply, mv, cmd)
|
||||
if ply:GetWallrun() == nil or not ply:Alive() then
|
||||
if ply:GetWallrun() == nil or not ply:Alive() or (CrueltyParkour:GetBool() and !ply:UsingRH() and !SlippyWallrun:GetBool()) 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 and ply:WaterLevel() < 1 then
|
||||
WallrunningCheck(ply, mv, cmd)
|
||||
if (CrueltyParkour:GetBool() and !ply:UsingRH() and !SlippyWallrun:GetBool()) then
|
||||
else
|
||||
WallrunningCheck(ply, mv, cmd)
|
||||
end
|
||||
end
|
||||
|
||||
if ply:GetWallrun() ~= 0 then
|
||||
|
|
|
@ -138,7 +138,7 @@ local function ZiplineThink(ply, mv, cmd, zipline)
|
|||
dir:Mul(-1)
|
||||
end
|
||||
|
||||
if fraction >= 1 or cmd:KeyDown(IN_DUCK) then
|
||||
if fraction >= 1 or cmd:KeyDown(IN_DUCK) or (CrueltyParkour:GetBool() and !ply:UsingRH()) then
|
||||
ply:SetZipline(nil)
|
||||
ply:SetMoveType(MOVETYPE_WALK)
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
VERSION_GLOBAL = "1.0.14"
|
||||
VERSION_GLOBAL = "1.0.22"
|
||||
VERSION_LATEST = ""
|
||||
VERSION_CHECKED = false
|
||||
|
||||
|
@ -11,6 +11,8 @@ GM.Website = "github.com/JonnyBro/beatrun"
|
|||
|
||||
include("player_class/player_beatrun.lua")
|
||||
|
||||
include("preexecute/shared.lua")
|
||||
|
||||
for _, v in ipairs(file.Find("gamemodes/beatrun/gamemode/sh/*.lua", "GAME", "nameasc")) do
|
||||
AddCSLuaFile("sh/" .. v)
|
||||
include("sh/" .. v)
|
||||
|
|
1
repocontent/WindowsGitInstallGuide.md
Normal file
1
repocontent/WindowsGitInstallGuide.md
Normal file
|
@ -0,0 +1 @@
|
|||
This guide is currently a work in progress. Check back later. Use [Method 1](../README.md#method-1-repository-download-and-extract-easy) for now.
|
|
@ -1 +1 @@
|
|||
1.0.14
|
||||
1.0.22
|
Loading…
Reference in a new issue