Merge branch 'main' into gitlocalize-35558

This commit is contained in:
Protogen187
2026-01-06 17:37:24 +01:00
committed by GitHub
27 changed files with 3316 additions and 17 deletions

View File

@@ -0,0 +1,50 @@
---
hide:
- navigation
---
# Willkommen im BeamMP Gemeinschafts-Bereich!
![BeamMP mehrfarbig-weiß](../../assets/content/BeamMP-Multi-WhtLtr-crop.png#only-dark){width="450"} ![BeamMP mehrfarbig-schwarz](../../assets/content/BeamMP-Multi-BlkLtr-crop.png#only-light){width="450"}
## Unsere Social Media-Links
!!!failure ""
```
BeamMP Forum - [https://forum.beammp.com](https://forum.beammp.com)
```
!!!quote ""
```
X (Twitter) - [https://x.com/BeamMPOfficial](https://x.com/BeamMPOfficial)
```
!!!danger ""
```
YouTube - [https://www.youtube.com/@BeamMPOfficial](https://www.youtube.com/@BeamMPOfficial)
```
!!!warning ""
```
Patreon - [https://www.patreon.com/c/BeamMP](https://www.patreon.com/c/BeamMP)
```
!!!note ""
```
Discord - [https://discord.com/invite/beammp](https://discord.com/invite/beammp)
```
!!!info ""
```
BlueSky - [https://bsky.app/profile/beammpofficial.bsky.social](https://bsky.app/profile/beammpofficial.bsky.social)
```
## Regeln
Unsere Regeln findest du [hier](rules.md)

View File

@@ -29,21 +29,43 @@ BeamMP ist vollständig kompatibel mit Windows und Linux, an der Kompatibilität
### **2b. Linux Installation**
Derzeit musst du den Launcher selbst erstellen. Dazu benötigst du grundlegende Kenntnisse zum Erstellen einer Anwendung.
Derzeit musst du den Launcher selbst kompilieren (erstellen). Dazu benötigst du grundlegende Kenntnisse über den Prozess der Erstellung einer Anwendung (Kompilierung).
Stelle sicher, dass [`vcpkg`](https://learn.microsoft.com/en-us/vcpkg/get_started/get-started?pivots=shell-bash#1---set-up-vcpkg) sowie grundlegende Entwicklungstools installiert sind, welche oft in Paketen enthalten sind, zum Beispiel:
Stelle sicher, dass grundlegende Entwicklungstools (Build-Tools) installiert sind, die oft in folgenden Paketen enthalten sind:
- Debian: `sudo apt install build-essential`
- Fedora: `sudo dnf install cmake gcc-c++ perl-IPC-Cmd perl-FindBin perl-File-Compare perl-File-Copy`
- Fedora: `sudo dnf install cmake gcc gcc-c++ make perl perl-IPC-Cmd perl-FindBin perl-File-Compare perl-File-Copy kernel-headers kernel-devel`
- Arch: `sudo pacman -S base-devel`
- openSUSE: `zypper in -t pattern devel-basis`
- SteamOS (Arch): `sudo pacman -S base-devel linux-api-headers glibc libconfig` (Du musst auch `sudo steamos-readonly disable` ausführen, schalte es jedoch nach der Installation wieder ein)
Klone das BeamMP-Launcher-Repository mit `git` auf dein System, zum Beispiel: `git clone https://github.com/BeamMP/BeamMP-Launcher.git` [Weitere Informationen zum Klonen eines GitHub-Repos](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)
Lade das "Tag", das für die [neueste Version](https://github.com/BeamMP/BeamMP-Launcher/releases/latest) verwendet wurde. Wenn beispielsweise `v2.3.2` in der neuesten Version verwendet wird, führe `git checkout v2.3.2` aus.
Klone vcpkg, initialisiere es und füge es zur PATH-Umgebungsvariable hinzu.
Im Stammverzeichnis des Projekts, führe aus:
1.
```bash
git clone https://github.com/microsoft/vcpkg.git
```
2.
```bash
./vcpkg/bootstrap-vcpkg.sh
```
3.
```bash
export VCPKG_ROOT="$(pwd)/vcpkg"
export PATH=$VCPKG_ROOT:$PATH
```
Klone das BeamMP-Launcher-Repository mit `git` auf dein System, zum Beispiel:
`git clone https://github.com/BeamMP/BeamMP-Launcher.git`
[Weitere Informationen zum Klonen eines GitHub-Repos](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)
Wechsle zum neuesten "Tag" (Versionsstand). Lade das "Tag" herunter, das für die neueste Version verwendet wurde. Wenn beispielsweise v2.3.2 in der neuesten Version verwendet wird, führe im Repository-Ordner `git checkout v2.3.2` aus.
Führe im Stammverzeichnis des Projekts folgende Schritte aus:
1.
```cmake
@@ -61,9 +83,26 @@ cmake --build bin --parallel
!!!note ""
Wenn du -DCMAKE_BUILD_TYPE=Release nicht spezifizierst, erstellst du eine Debug-Version, die zwar eine größere Dateigröße hat, aber nicht den Fehler „Launcher kann sich nur einmal mit einem Server verbinden enthält.
Wenn du -DCMAKE_BUILD_TYPE=Release nicht spezifizierst, erstellst du eine Debug-Version, die zwar eine größere Dateigröße hat, aber nicht den Fehler „Launcher kann sich nur einmal mit einem Server verbinden" enthält.
Verschiebe die fertige Anwendung aus dem `/bin` Ordner in einen eigenen Ordner und führe sie von dort aus aus.
!!!note "Fedora Benutzer"
Wenn vcpkg während der OpenSSL-Kompilierung aufgrund von Kernel-Header-Fehlern fehlschlägt, stelle sicher, dass alle Abhängigkeiten installiert sind:
```bash
sudo dnf install kernel-headers kernel-devel gcc gcc-c++ make perl
```
Bereinige dann den vcpkg-Cache:
```bash
rm -rf $VCPKG_ROOT/buildtrees/openssl
```
Und wiederhole den cmake-Konfigurationsbefehl (Schritt 1).
Verschiebe die fertige Anwendung aus dem `/bin` Ordner in einen eigenen Ordner und führe sie von dort aus aus:
```bash
mkdir -p ~/beammp-launcher
cp bin/BeamMP-Launcher ~/beammp-launcher/
cd ~/beammp-launcher
./BeamMP-Launcher
```
Der native Linux BeamMP-Launcher wird gestartet und verwendet das native Linux BeamNG.drive
@@ -98,7 +137,7 @@ Beachte, dass hierbei davon ausgegangen wird, dass die Binärdatei des Launchers
## **3. Bekannte Probleme**
- Der native Linux BeamMP-Launcher kann sich derzeit nur einmal mit einem Server verbinden, nach dem Trennen der Verbindung muss der Launcher neu gestartet werden. Dies ist möglich, ohne das Spiel zwischendurch schließen zu müssen.
- Wenn die Schaltfläche „Multiplayer nicht angezeigt wird, stelle sicher, dass der BeamMP-Mod im „Mod Manager vorhanden und aktiviert ist, und drücke dann STRG + L.
- Wenn die Schaltfläche „Multiplayer" nicht angezeigt wird, stelle sicher, dass der BeamMP-Mod im „Mod Manager" vorhanden und aktiviert ist, und drücke dann STRG + L.
- VPNs jeglicher Art können Verbindungsprobleme verursachen.
- Wenn der Launcher Fehler meldet, lies die [FAQ](https://forum.beammp.com/c/faq/35) .

View File

@@ -1,8 +1,7 @@
# Players FAQ
## How do I link my Discord account?
Linking your Discord and BeamMP account is a new feature to BeamMP. To do this you will need send `!link` as a message to the [BeamMP Accounts](https://discordapp.com/channels/@me/1201234743568634026/) bot.
The bot will respond with a link for you to sign into your BeamMP account. Simply sign in with your BeamMP account, once done you will receive a second message saying that it has successfully linked your accounts. 🎉
Linking your Discord and BeamMP account is a new feature to BeamMP. To do this go to your [Forum Account Preferences](https://forum.beammp.com/my/preferences/account) and connect your Discord account under "Associated Accounts" (this is only visible when 2FA for the forum is disabled).
## How do I get early access?
@@ -14,7 +13,7 @@ Boosting gives you +4 Server keys in addition to EA benefits.
Please ensure you do the following to automatically receive your perks:
1. Link your Discord account on Patreon to receive the Roles and Access in the Discord server.
1. Link your Discord account on [Patreon](https://www.patreon.com/settings/apps/discord) to receive the Roles and Access in the Discord server.
2. Please ensure you use the same email address on Patreon as you do for your BeamMP account on the [Forum](https://forum.beammp.com/).
Please be patient, it can take a few hours, sometimes up to 12, for the system to sync. If you have not received your perks after 12 hours and have completed the above steps please contact BeamMP support.

View File

@@ -34,8 +34,8 @@ In order to do this, you need a basic understanding of how to build an applicati
Make sure you have basic development tools installed, often found in packages, for example:
- Debian: `sudo apt install build-essential`
- Fedora: `sudo dnf install cmake gcc-c++ perl-IPC-Cmd perl-FindBin perl-File-Compare perl-File-Copy`
- Debian/Ubuntu: `sudo apt install build-essential`
- Fedora: `sudo dnf install cmake gcc gcc-c++ make perl perl-IPC-Cmd perl-FindBin perl-File-Compare perl-File-Copy kernel-headers kernel-devel`
- Arch: `sudo pacman -S base-devel`
- openSUSE: `zypper in -t pattern devel-basis`
- SteamOS (Arch): `sudo pacman -S base-devel linux-api-headers glibc libconfig` (You also need to do `sudo steamos-readonly disable` but make sure to enable it again after installing the packages)
@@ -66,6 +66,9 @@ Clone the BeamMP-Launcher Repository to your system using `git`, for example:
Checkout the tag that was used for the [latest release](https://github.com/BeamMP/BeamMP-Launcher/releases/latest). For example, if `v2.6.4` is used in the latest release, then do `git checkout v2.6.4`
If you've used the example clone command we provided, you can use `cd BeamMP-Launcher` to go to the project's root directory.
In the root directory of the project,
1.
@@ -86,9 +89,26 @@ cmake --build bin --parallel
By not specifying `-DCMAKE_BUILD_TYPE=Release` you are building a debug version, which is larger in filesize but does not contain the launcher-can-only-connect-to-a-server-once bug
Move the finished application out of the `/bin` folder into its own folder and run it from there
!!!note "Fedora Users"
If vcpkg fails during OpenSSL compilation with kernel headers errors, ensure all dependencies are installed:
```bash
sudo dnf install kernel-headers kernel-devel gcc gcc-c++ make perl
```
Then clean the vcpkg cache:
```bash
rm -rf $VCPKG_ROOT/buildtrees/openssl
```
And retry the cmake configuration command.
The native linux BeamMP-Launcher will start and use native linux BeamNG.drive
Move the finished application out of the `/bin` folder into its own folder and run it from there:
```bash
mkdir -p ~/beammp-launcher
cp bin/BeamMP-Launcher ~/beammp-launcher/
cd ~/beammp-launcher
./BeamMP-Launcher
```
The native Linux BeamMP-Launcher will start and use native Linux BeamNG.drive
### **2c. Using beamNG.drive with Proton**

View File

@@ -47,7 +47,7 @@ The setup consists of the following steps, you should follow all of them.
* [RackGenius](https://rackgeni.us/beammp-plans)
* [Connect Hosting](https://connecthosting.net/beammp)
* [Assetto Hosting](https://assettohosting.com/en/games/beamng)
* [Zap Hosting](https://zap-hosting.com/en/beammp-server-hosting/)
* [ZAP-Hosting](https://zap-hosting.com/itsbeammp)
* [HostHavoc](https://hosthavoc.com/)
* [PedalHost](https://pedal.host/)
* [Vyper Hosting](https://vyperhosting.com/r/beammp)
@@ -55,6 +55,8 @@ The setup consists of the following steps, you should follow all of them.
* [Four Seasons Hosting](https://fourseasonshosting.com)
* [Vertuo Hosting](https://vertuohosting.com)
* [Winheberg](https://winheberg.fr/offres/gaming/beammp?lang=en)
* [Wabbanode](https://wabbanode.com/partner/beammp)
* [Iceline Hosting](https://iceline-hosting.com/games/beammp)
#### 1.1 Firewall

View File

@@ -0,0 +1,40 @@
# Как создать исключения в брандмауэре и антивирусе Защитника Windows?
!!! информация
```
Before tampering with the firewall, make sure that your network within the windows networking settings is set to private (assuming you are in a private network).
!!! danger ":material-scale-balance: DISCLAIMER:"
**Firewall / Defender exclsuions are a risk**.
By creating exclsuions, you understand the risks of allowing programs on your PC and opening up ports on your home network to the public and therefore void the right to hold BeamMP accountable for **any and all** damages that may happen to you or your household.
We take no responsibility for any content on any externally linked services or websites.
```
## 1. Исключение брандмауэра для BeamMP-Launcher.
1. Откройте `Windows Defender Firewall with advanced setting` .
2. В окне нажмите `Inbound` , чтобы открыть вкладку исключений для входящих подключений.
3. Нажмите `Create new rule` в правом верхнем углу, чтобы создать новое исключение.
4. Выберите `Program` , чтобы создать исключение для конкретной программы.
5. Введите полный путь к `BeamMP-Launcher.exe` . По умолчанию это будет `%appdata%\BeamMP-Launcher\BeamMP-Launcher.exe` без кавычек.
6. Обязательно разрешите подключение
7. Дайте исключению имя (например, «BeamMP-Launcher») и сохраните его.
8. Перезагрузите компьютер.
## 2. Исключение антивируса для BeamMP-Launcher.
1. Откройте приложение `Windows Security` .
2. Нажмите на первый пункт `virus and threat protection` .
3. Нажмите `Manage settings` в разделе «Параметры защиты от вирусов и угроз».
4. Прокрутите страницу вниз, чтобы перейти на вкладку `Exclusions` .
5. Там нажмите «Добавить исключение» и выберите `process` .
6. Введите `BeamMP-Launcher.exe` в поле и сохраните его.
7. Перезагрузите компьютер.
## Все еще сталкиваетесь с проблемами?
Откройте тему на [форуме](https://forum.beammp.com) или на нашем [сервере Discord](https://discord.gg/beammp) в канале `#support` .

View File

@@ -0,0 +1,45 @@
Как проверить наличие CGNAT?
## Проблема
Все исключения брандмауэра и правила переадресации портов настроены правильно, но никто не может подключиться к вашему домашнему серверу?
Если у вас проблемы с подключением и вы используете Hosting-Service, обратитесь к ним за помощью. Если вы хотите использовать VPS или не можете разместить сервер дома, взгляните на наш [список партнерских хостинговых услуг](../../server/create-a-server/#partnered-hosting-services-paid) (Документация по настройке сервера).
# Что такое CGNAT?
Подробное объяснение того, что такое CGNAT и почему это может стать проблемой при попытке размещения сервера дома, можно найти на [этой странице](https://en.wikipedia.org/wiki/Carrier-grade_NAT) .
# Как проверить наличие CGNAT?
## Метод 1:
Откройте командную строку, запустите `tracert -4 beammp.com` . Это выведет серию сетевых переходов. Дождитесь завершения операции (может занять до 30 переходов). Проверьте первые несколько IP-адресов после IP вашего маршрутизатора/модема/шлюза. Если после первого перехода появляется несколько IP-адресов в диапазоне `100.64.xx` - `100.127.xx` или `10.xx.xx.xx` , скорее всего, вы находитесь за CGNAT.
!!!примечание
```
The first hop will be your Router/Modem/Gateway and differs between Devices.
The official ranges for local networks are as follows: ``10.0.0.xxx`` - ``192.168.xxx.xxx`` - ```172.16.xxx.xxx``
```
## Метод 2:
Узнайте WAN IP на вашем маршрутизаторе, посмотрев его на его интерфейсе. Сравните его с IP, опубликованным, например, на https://whatsmyip.org. Если они НЕ совпадают, вы находитесь за CGNAT.
## Метод 3/Решение:
Обратитесь за помощью к своему интернет-провайдеру. В зависимости от вашего интернет-провайдера, они могут не предлагать выделенные *динамические* IP-адреса. Помните, что статический IP-адрес не является обязательным.
!!! предупреждение
```
Internet Service Providers may only offer dedicated IP addresses as a **paid option**.
Please check the prices of our partnered hosting services as they could be cheaper than this fee!
```
Пример сети, не являющейся CGNAT:
![изображение](https://github.com/user-attachments/assets/fee21a50-cbb0-4322-9c26-d9f04f88ae37)
Теги: Сервер, 10060 10061, CGNAT, Сбой подключения, Переадресация портов, Брандмауэр

View File

@@ -0,0 +1,20 @@
# Проблема
Launcher не может обновиться или показывает пустой экран? Это краткое руководство объясняет, как вручную обновить Launcher.
!!! примечание
```
You should have already used or installed BeamMP using the installer provided by [our website](https://beammp.com) before continuing.
```
# Загрузка и установка нового лаунчера
1. Загрузите последнюю версию Launcher напрямую с [GitHub](https://github.com/BeamMP/BeamMP-Launcher/releases/latest/download/BeamMP-Launcher.exe) .
2. Перейдите в каталог BeamMP-Launcher.exe. По умолчанию эта папка находится в `C:\Users\<username>\AppData\Roaming\` . Заменить<username> с именем пользователя вашего Windows. Если вы установили BeamMP в другом месте, например <code>D:\BeamMP-Launcher</code> , то поместите Launcher в соответствующую папку BeamMP-Launcher.</username>
3. Если применимо, замените существующий Launcher новым в папке BeamMP-Launcher.
4. Запустите BeamMP-Launcher как обычно, чтобы проверить его работу.
## Проблема все еще не решена?
Создайте тикет поддержки на нашем [сервере Discord](https://discord.gg/BeamMP) . Теги: Launcher, скачать,

64
docs/ru/FAQ/game-faq.md Normal file
View File

@@ -0,0 +1,64 @@
# Часто задаваемые вопросы
Список часто задаваемых вопросов.
---
## **Клиент**
---
### **Как установить BeamMP?**
Полное руководство по установке BeamMP на Windows можно найти [здесь](https://docs.beammp.com/game/getting-started/) .
---
### **Работает ли BeamMP на взломанной версии BeamNG?**
BeamMP не будет работать с пиратскими или устаревшими версиями BeamNG.drive. Команда поддержки BeamMP не предлагает поддержку по проблемам с пиратскими / устаревшими копиями.
---
### **Работает ли BeamMP на Linux?**
Клиент официально не поддерживается в Linux. Однако вы можете следовать нашему [руководству по использованию BeamMP в Linux](../game/getting-started/#2b-linux-installation)
---
### **Почему мой антивирус или Защитник Windows помечает лаунчер?**
Некоторые антивирусные программы могут помечать BeamMP как угрозу из-за его взаимодействия с сетью и другими вещами. В коде **нет вирусов** . Код для лаунчера, сервера и клиента lua можно найти на нашем [GitHub](https://github.com/BeamMP) .
---
### **У меня плохая производительность игрового процесса. Что мне делать?**
Мы прилагаем все усилия, чтобы сделать многопользовательский режим максимально стабильным. Если вы уже снизили графические настройки, а производительность все еще низкая, рассмотрите возможность игры на сервере с меньшим количеством игроков. Игра в основном зависит от CPU, когда вы играете с большим количеством людей, поэтому старые CPU (даже четырехъядерные) будут страдать, если людей больше, чем горстка. (Общее практическое правило: 1 машина на поток CPU)
---
## **Разнообразный**
---
### **Где я могу найти код?**
Весь исходный код можно найти на нашем [GitHub](https://github.com/BeamMP) . Перед внесением любых изменений помните, что код подчиняется нашим [Условиям использования](https://forum.beammp.com/t/terms-of-use-v1-0/43) и лицензиям:
Код | Лицензия
--- | :-:
Сервер | [ЛИЦЕНЗИЯ](https://github.com/BeamMP/BeamMP-Server/blob/master/LICENSE)
Пусковая установка | [ЛИЦЕНЗИЯ](https://github.com/BeamMP/BeamMP-Launcher/blob/master/LICENSE)
Клиент Луа | [ЛИЦЕНЗИЯ](https://github.com/BeamMP/BeamMP/blob/development/LICENSE)
---
### **Я нашел ошибку или эксплойт, что мне делать?**
Если проблема связана с кодом, и вы знаете, как использовать Github, откройте новую «Проблему» в соответствующем репозитории на нашем [GitHub](https://github.com/BeamMP) . Мы используем рабочий процесс, основанный на проблемах, поэтому даже если у вас уже есть исправление ошибки, рассмотрите возможность открытия новой «Проблемы», а затем откройте «Запрос на извлечение» с решениями для проблемы. Более подробную информацию о содействии можно найти [здесь](https://github.com/BeamMP/BeamMP/blob/development/CONTRIBUTING.md) .
Если у вас нет учетной записи GitHub, вы не знаете, как пользоваться GitHub, или у вас есть другие вопросы, вы можете связаться с нами следующими способами:
- Если это не что-то деликатное, вы можете создать сообщение на нашем [форуме BeamMP](https://forum.beammp.com) или сообщить об этом на нашем [официальном Discord](https://discord.gg/beammp) .
- Если информация конфиденциальная, вы можете напрямую сообщить о проблеме нашему сотруднику в [Discord](https://discord.gg/beammp) .

22
docs/ru/FAQ/player-faq.md Normal file
View File

@@ -0,0 +1,22 @@
# Часто задаваемые вопросы игроков
## Как привязать свой аккаунт Discord?
Связывание аккаунтов Discord и BeamMP — это новая функция BeamMP. Для этого вам нужно отправить `!link` в виде сообщения боту [BeamMP Accounts](https://discordapp.com/channels/@me/1201234743568634026/) . Бот ответит ссылкой для входа в ваш аккаунт BeamMP. Просто войдите в свой аккаунт BeamMP, после этого вы получите второе сообщение о том, что он успешно связал ваши аккаунты. 🎉
## Как получить ранний доступ?
Ранний доступ (включая фиолетовую метку и другие преимущества) можно получить, поддержав нас финансово на [Patreon](https://patreon.com/BeamMP) , купив уровень, сделав пожертвование или ускорив сервер Discord. Пожертвование **x** суммы в долларах США = **x** дополнительных ключей сервера, включая преимущества EA. Ускорение дает вам +4 ключа сервера в дополнение к преимуществам EA.
## Я подписался на Patreon. Как мне получить свои привилегии?
Чтобы автоматически получать бонусы, обязательно выполните следующие действия:
1. Привяжите свой аккаунт Discord к Patreon, чтобы получить роли и доступ на сервере Discord.
2. Пожалуйста, убедитесь, что вы используете тот же адрес электронной почты на Patreon, что и для вашей учетной записи BeamMP на [форуме](https://forum.beammp.com/) .
Пожалуйста, будьте терпеливы, синхронизация системы может занять несколько часов, иногда до 12. Если вы не получили свои бонусы в течение 12 часов и выполнили вышеуказанные шаги, обратитесь в службу поддержки BeamMP.
## У меня есть еще вопросы!
Если ваш вопрос или проблема связаны с Игрой или процессом, пожалуйста, обратитесь к разделу [FAQ по Играм](game-faq.md) . Если ваш вопрос или проблема связаны с запуском Сервера, пожалуйста, обратитесь к разделу [FAQ по Серверу](server-faq.md) . В противном случае, пожалуйста, посетите [форумы](https://forum.beammp.com/c/faq/35) , где сообщество может задавать вопросы и получать ответы.

View File

@@ -0,0 +1,21 @@
!!! внимание "Этот сайт находится в стадии разработки!"
```
Над этим сайтом ведется активная работа.
Чувствуете, что можете помочь? Пожалуйста, сделайте это, нажав на страницу с карандашом справа!
Это можно сделать на любой странице.
```
# Создание карты для BeamNG.drive
...
## Введение
...
## Начало работы
...

View File

@@ -0,0 +1,21 @@
!!! внимание "Этот сайт находится в стадии разработки!"
```
Над этим сайтом ведется активная работа.
Чувствуете, что можете помочь? Пожалуйста, сделайте это, нажав на страницу с карандашом справа!
Это можно сделать на любой странице.
```
# Создание пропсов для BeamNG.drive
...
## Введение
...
## Начало работы
...

View File

@@ -0,0 +1,21 @@
!!! внимание "Этот сайт находится в стадии разработки!"
```
Над этим сайтом ведется активная работа.
Чувствуете, что можете помочь? Пожалуйста, сделайте это, нажав на страницу с карандашом справа!
Это можно сделать на любой странице.
```
# Создание автомобиля для BeamNG.drive
...
## Введение
...
## Начало работы
...

View File

@@ -0,0 +1,11 @@
!!! внимание "Этот сайт находится в стадии разработки!"
```
Над этим сайтом ведется активная работа.
Чувствуете, что можете помочь? Пожалуйста, сделайте это, нажав на страницу с карандашом справа!
Это можно сделать на любой странице.
```
# Введение в разработку BeamNG.drive

View File

@@ -0,0 +1,3 @@
# imgui-windows.md
Эту страницу нужно заполнить

View File

@@ -0,0 +1,3 @@
# lua-mods.md
Эту страницу нужно заполнить

View File

@@ -0,0 +1,273 @@
# Создание UI-приложения
Для создания UI-приложения вам понадобятся некоторые знания фреймворка AngularJS, основную документацию можно найти здесь: [AngularJS docs](https://docs.angularjs.org/guide)
## Структура файла
Для работы UI-приложения необходимы четыре важных файла:
- app.js | Содержит основной код, используемый [документацией UI-приложения Javascript](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
- app.html | Код, который отображает [HTML-документы](https://developer.mozilla.org/fr/docs/Web/HTML) вашего приложения
- app.json | Содержит информацию о UI-приложении
- app.png | Файл изображения, отображаемый в селекторе приложений
### Стиль UI-приложения
Мы рекомендуем использовать тег `<style>` для стилизации вашего приложения. Файл .css тоже подойдет, но вы не сможете видеть изменения в режиме реального времени.
## Пример
Этот пример от DanielW. Отдельная ему благодарность
ui\modules\apps\ExampleApp\app.html
```html
<div style="width: 100%; height: 100%;" class="bngApp">
<link type="text/css" rel="stylesheet" href="/ui/modules/apps/ExampleApp/app.css" />
<div id="exampleAppContainer">
<span>Gear: <span>{{ gearName }}</span></span>
<div layout="row" layout-align="center center">
<md-input-container flex>
<label>Input</label>
<input ng-model="message" ng-keydown="sendMessage($event)">
</md-input-container>
<md-button md-no-ink class="md-warn" ng-disabled="!message" ng-click="sendMessage()">Send</md-button>
</div>
<span style="display: block">Messages:</span>
<!-- Scroll Area -->
<ul bng-nav-scroll style="margin: 0; padding: 0; overflow-y: auto; width: 100%; height: 100%; background-color: #37373740;">
<!-- Iterate over the messages and display them -->
<li ng-repeat="message in messages track by $index" style="display: flex; align-items: center; height: 35px;">
<span style="padding: 0 0.2em; width: 100%;">{{ message }}</span>
<!-- Button to delete the message, this calls the `deleteMessage` function in `app.js` -->
<md-button md-no-ink class="md-icon-button md-warn" ng-click="deleteMessage($index)">
<md-icon class="material-icons">delete</md-icon>
</md-button>
</li>
</ul>
</div>
</div>
```
Здесь вы можете увидеть тег `<span>` , отображающий передачу вашего транспортного средства, входные данные, используемые для отправки сообщения функции `sendMessage()` в Javascript, и повторяющийся тег `<li>` использующий <b>ng-repeat</b> для переменной `messages` , расположенной в Javascript.
ui\modules\apps\ExampleApp\app.js
```js
angular.module('beamng.apps')
.directive('exampleApp', [function() {
return {
templateUrl: '/ui/modules/apps/ExampleApp/app.html',
replace: true,
restrict: 'EA',
scope: true,
controller: ['$scope', function($scope) {
$scope.gearName = '0'
$scope.message = ''
$scope.messages = []
// Setup the streams we want. For now, we only want the engine information. You can add more, you'll just have to look around to find the different streams
let steamList = ['engineInfo']
StreamsManager.add(steamList)
$scope.$on('destroy', function() {
StreamsManager.remove(steamList)
})
// Do I even need to put this comment here explaining what this function does?
// Well, I have done it for a lot of other things when they weren't needed. I'll leave this one be...
$scope.$on('streamsUpdate', function(event, streams) {
if (!streams.engineInfo) // Early return... You probably noticed that without this useless comment though
return;
// `lua/vehicle/controller/vehicleController.lua:538` (or use console.log)
let gear = streams.engineInfo[5]
// Update the gear name in HTML if needed
if ($scope.gearName !== gear)
$scope.gearName = gear
})
$scope.sendMessage = function(event) {
if (event && event.key !== 'Enter')
return
if ($scope.message == '')
return
// Forward the message to the Lua extension to modify it
bngApi.engineLua('extensions.exampleMod.modifyMessage("' + $scope.message + '")')
$scope.message = ''
}
$scope.deleteMessage = function(idx) {
$scope.messages.splice(idx, 1)
}
// The `modifyMessage` function will call this hook with the modified data
$scope.$on('MessageReady', function(_, modifiedMessage) {
$scope.messages.push(modifiedMessage)
});
}]
}
}])
```
Обратите внимание на использование <b>$scope{/b0} . Это очень важно, поскольку вам нужно будет определить переменные и функции в {b1}$scope</b> , чтобы иметь возможность доступа к ним из <b>Html</b> внутри любого тега <b>ng-*</b> . Таким образом, в этом примере после выполнения функции `sendMessage()` из <b>Html</b> она отправит его в файл lua, расположенный в каталоге расширений мода, и выполнит функцию `modifyMessage()` внутри этого файла lua.
Пример того, как может выглядеть сторона lua:
```lua
local function modifyMessage(message)
message = message .. " [Modified!]"
guihooks.trigger('MessageReady', message)
end
```
^ Это упрощенная версия lua, просто показывающая функцию.
Основное внимание здесь уделяется использованию <b>guihooks.trigger</b> , который запускает событие AngularJS, определенное с помощью `$scope.$on()` . Как вы можете видеть в самом низу файла Javascript, событие называется MessageReady и будет выполнено функцией <b>guihooks.trigger</b> с полезной нагрузкой сообщения, а затем будет помещено в переменную `$scope.messages` для отображения тегом li с помощью <b>ng-repeat</b> в файле <b>Html.</b>
Полный файл lua находится ниже
lua\ge\extensions\exampleMod.lua
```lua
local M = {}
--[[
This is the entry point of our extension, this is what the game loads from our `modScript.lua`.
In the modScript file, you can load more extensions and put them in the same directory as this file.
In this file, we will communicate with the following:
1. Our vehicle extension. That extension tells this extension when to send it data, and we send it. Take a look at `vehicle/extensions/auto/exampleVehicleExtension.lua`
2. Input. Take a look at `core/input/actions/myActions.json`. When the bounded key is pressed, it will call `onActionKeyDown` (a function we export below)
]]
-- Game Function Hooks
--------------------------------------------
local function onExtensionLoaded()
log('D', "onExtensionLoaded", "Called")
end
local function onExtensionUnloaded()
log('D', "onExtensionUnloaded", "Called")
end
-- Custom Functions
--------------------------------------------
local function onActionKeyDown()
log('D', "onActionKeyDown", "Pressed!")
end
local function onVehicleExtensionLoaded(vehID)
log('D', "onVehicleExtensionLoaded", "Sending some data to the vehicle")
local veh = be:getObjectByID(vehID) -- If you don't have the ID, you can also use `be:getPlayerVehicle(0)` to get the current vehicle.
if not veh then return end -- The usual error checking
local data = {
["name"] = "Daniel W"
}
veh:queueLuaCommand("extensions.exampleVehicleExtension.onDataReceived('" .. jsonEncode(data) .. "')")
end
local function modifyMessage(message)
message = message .. " [Modified!]"
guihooks.trigger('MessageReady', message)
end
-- Export Interface
--------------------------------------------
M.onExtensionLoaded = onExtensionLoaded
M.onExtensionUnloaded = onExtensionUnloaded
M.onActionKeyDown = onActionKeyDown
M.onVehicleExtensionLoaded = onVehicleExtensionLoaded
M.modifyMessage = modifyMessage
--[[ Other functions could include:
- onPreRender(dtReal, dtSim, dtRaw)
- onUpdate(dtReal, dtSim, dtRaw)
- onClientPreStartMission(levelPath)
- onClientPostStartMission(levelPath)
To find all of these, search the following in `BeamNG.Drive/lua`: `extensions.hook(`
--]]
return M
```
Обратите внимание, что очень важно вернуть переменную M (модуль) с необходимыми функциями внутри! Например, без строки `M.modifyMessage = modifyMessage` функция `bngApi.engineLua('extensions.exampleMod.modifyMessage("' + $scope.message + '")')` не сможет найти функцию modifyMessage()
ui\modules\apps\ExampleApp\app.css
```css
#exampleAppContainer {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
align-content: center;
}
#exampleAppContainer > * {
margin: 0;
padding: 0;
}
```
ui\modules\apps\ExampleApp\app.json
```json
{
"domElement": "<example-app></example-app>",
"name": "Example App",
"types": [
"ui.apps.categories.debug"
],
"description": "example-app",
"css": {
"left": "0px",
"height": "auto",
"width": "270px",
"min-width": "200px",
"min-height": "90px",
"top": "0px"
},
"author": "Daniel W",
"version": "0.1",
"directive": "exampleApp"
}
```
Директива должна быть такой же, как в файле <b>Javascript.</b>
# Функции Javascript, предоставляемые BeamNG для UI-приложений
```js
bngApi.engineLua("lua_path.function()")
```
Полезно для запуска функции lua с аргументами или без них.
# Функции Lua, предоставляемые BeamNG для UI-приложений
```lua
guihooks.trigger("EventName", Payload)
```
Полезная нагрузка может быть любого типа, но лучше хранить ее в виде массива/объекта или строки, чтобы она не потерялась.
<b>ВАЖНО</b> : Иногда может случиться так, что имя события, которое вы используете, уже используется внутри чего-то другого, и это вызовет проблемы, поэтому, например, если ваше приложение называется Nickel, хорошей практикой будет называть каждое событие Angular как NKEventName вместо EventName.

43
docs/ru/contributing.md Normal file
View File

@@ -0,0 +1,43 @@
# Участие в разработке BeamMP Docs
BeamMP использует [Material for MkDocs](https://squidfunk.github.io/mkdocs-material) в качестве своей темы. Это тема для [MkDocs](https://www.mkdocs.org) . Полную документацию можно найти на их соответствующих сайтах.
## Начало работы
Чтобы внести свой вклад в эти документы, вы можете воспользоваться одним из двух подходов, изложенных ниже:
### 1. Редактировать необработанные файлы разметки
Редактирование необработанных файлов markdown — самый быстрый подход, который лучше всего подходит для быстрых правок, таких как орфография, грамматика или новые фрагменты контента. Однако этот подход требует предварительного знания markdown, поскольку вам нужно будет понимать, что даст ваш вклад.
Если вы предпочитаете именно этот подход, выполните следующие действия:
1. Нажмите «Изменить» на странице, которую вы хотите отредактировать.
2. Создайте форк проекта в своей учетной записи GitHub.
3. Внесите необходимые изменения.
4. Сохраните изменения в своем форке.
5. Подайте запрос на включение изменений в наш репозиторий [здесь](https://github.com/BeamMP/Docs).
После того, как вы создали свой pull request, один из руководителей BeamMP Mod Team рассмотрит ваш pull request и либо одобрит его, либо запросит некоторые изменения. Если изменения были запрошены и вы их выполнили, мы повторно рассмотрим ваш pull request. Затем ваши изменения будут объединены в репозиторий и автоматически развернуты в рамках нашей непрерывной интеграции.
### 2. Вносите изменения с предварительным просмотром в реальном времени
Редактирование наших документов таким способом по-прежнему будет осуществляться по тому же принципу, что и в варианте 1, однако вы сможете предварительно просмотреть свои изменения.
1. Нажмите «Изменить» на странице, которую вы хотите отредактировать.
2. Создайте форк проекта в своей учетной записи GitHub.
3. Клонируйте проект локально.
4. Настройка материалов для MkDocs в соответствии с их руководством [здесь](https://squidfunk.github.io/mkdocs-material/getting-started/).
5. Запустите `mkdocs serve` , чтобы запустить сервер документации с функцией перезагрузки в реальном времени, на который вы клонировали форк.
6. Внесите изменения, которые считаете нужными.
7. Сохраните изменения в своем форке.
8. Подайте запрос на включение изменений в наш репозиторий [здесь](https://github.com/BeamMP/Docs).
## Макет проекта
```
mkdocs.yml # The configuration file.
docs/
index.md # The documentation homepage.
... # Other markdown pages, images and other files.
```

View File

@@ -0,0 +1,24 @@
# Коды ошибок
На этой странице содержатся все коды ошибок, которые может отображать лаунчер.
---
Код | Описание | Возможное решение
--- | --- | ---
10048 | Что-то другое уже использует порт запуска | Убедитесь, что одновременно запущен только ОДИН экземпляр BeamMP-Launcher. Попробуйте перезагрузить ПК.
10038 / 10060 / 10061 | Ни один сервер не ответил по указанному IP-адресу и/или порту | Если вы являетесь владельцем сервера, проверьте правила переадресации портов и/или брандмауэра, найденные на [BeamMP-Server](https://docs.beammp.com/server/create-a-server) . Если вы не являетесь владельцем сервера, выберите другой сервер или свяжитесь с владельцем, если он вам известен.
10054 | Сброс соединения пиром | Сервер, к которому вы подключаетесь, отключился.
Не удалось найти игру, пожалуйста, запустите ее. Сообщите об этом, если проблема сохранится код 3. | Лаунчеру не удалось найти информацию об игре (каталог игры, каталог профиля, версию и т. д.) в записи реестра. | Запустите игру хотя бы один раз, чтобы создать значения реестра.
Не удалось найти игру, пожалуйста, запустите ее. Сообщите об этом, если проблема сохранится код 4. | Программа запуска не смогла прочитать информацию об игре (каталог игры, каталог профиля, версию и т. д.) в записи реестра. | Эта ошибка чаще всего появляется у пользователей с **пиратскими копиями** игры. Если вы купили игру, запустите ее хотя бы один раз, чтобы были созданы значения реестра.
Не удалось запустить игру! Лаунчер скоро закроется | Лаунчеру не удалось найти исполняемый файл игры. | Запустите игру хотя бы один раз, прежде чем снова запускать лаунчер.
Игра закрыта! Лаунчер скоро закроется | Игра была закрыта. | Это сообщение появится при закрытии игры или если игра не запустится.
Обновление лаунчера не удалось! | Лаунчеру не удалось загрузить новую версию | Проверьте подключение к Интернету и правила брандмауэра/антивируса, чтобы лаунчер не был заблокирован.
Ошибка инициализации файла регистратора | Лаунчер не имеет возможности создавать файлы | Запустите лаунчер от имени администратора.
Пожалуйста, закройте игру и попробуйте еще раз. | Игра уже открыта и лаунчер не может очистить папку `multiplayer/mods` | Закройте игру и повторите попытку.
Пожалуйста, запустите игру хотя бы один раз. | Программа запуска пыталась, но не смогла изменить каталог игры. | Запустите игру хотя бы один раз, прежде чем снова запускать лаунчер.
Основные серверы офлайн! Извините за неудобства! | Лаунчеру не удалось проверить наличие обновления | Проверьте подключение к интернету и правила брандмауэра. Если с вашей стороны проблем нет, проверьте [канал обновлений BeamMP](https://discord.com/channels/601558901657305098/697596153943949352) на нашем Discord.
Извините, произошел сбой в работе системы бэкэнда! Не волнуйтесь, скоро все заработает! | Бэкэнд BeamMP не ответил | Проверьте подключение к интернету и правила брандмауэра. Если с вашей стороны проблем нет, проверьте [канал обновлений BeamMP](https://discord.com/channels/601558901657305098/697596153943949352) на нашем Discord.
Застрял при обновлении | Лаунчер завис на этапе обновления и не переходит к следующему шагу. | Запустите лаунчер от имени администратора и проверьте правила антивируса, чтобы лаунчер не блокировался.
Если лаунчер сразу закрывается, проверьте файл `Launcher.log` в папке, куда вы установили BeamMP.

View File

@@ -0,0 +1,101 @@
# Создание многопользовательских модов
## Структура папок и основы файлов
Базовая структура папок и файлов должна выглядеть следующим образом:
```
Resources/
├─ Client/
│ └─ examplePlugin.zip/
│ ├─ scripts/
│ │ └─ modScript.lua
│ └─ lua/
│ └─ ge/
│ └─ extensions/
│ └─ examplePlugin.lua
└─ Server/
└─ examplePlugin/
├─ examplePlugin.lua
└─ further_lua/
└─ further.lua
```
Серверный lua — это необходимый минимум, если вы хотите добавлять пользовательские события, вам также понадобится как минимум клиентский lua, а также modscript.lua.
Папка Server должна содержать подпапки, по одной для каждого серверного мода. Хорошей практикой является наличие только одного основного файла lua и добавление дополнительных файлов lua в подпапки. Однако вам не обязательно это делать, сервер загрузит файлы lua в алфавитном порядке, если их несколько.
Папка Client содержит zip-файлы, которые отправляются клиенту, который затем загружает их как мод. Любые другие файлы в папке Client вызовут ошибку при запуске сервера, но за исключением этого будут игнорироваться сервером. ModScript.lua будет прочитан BeamNG и укажет игре, какой плагин загружать.
!!!example "" [Загрузите examplePlugin.zip](../../../../assets/content/ResourcesForExamplePlugin.zip)
## Серверный lua
В examplePlugin есть и другие примеры, но вот самый простой, выводящий идентификаторы игроков:
```lua
function onInit() --runs when plugin is loaded
MP.RegisterEvent("onPlayerAuth", "onPlayerAuth") --Provided by BeamMP
print("examplePlugin loaded")
end
--A player has authenticated and is requesting to join
--The player's name (string), forum role (string), guest account (bool), identifiers (table -> ip, beammp)
function onPlayerAuth(player_name, role, isGuest, identifiers)
local ip = identifiers.ip
local beammp = identifiers.beammp or "N/A"
print("onPlayerAuth: player_name: " .. player_name .. " | role: " .. role .. " | isGuest: " .. tostring(isGuest) .. " | identifiers: ip: " .. ip .. " - beammp: " .. beammp)
end
```
`onPlayerAuth` срабатывает, как только игрок хочет присоединиться, см. также [onPlayerAuth в справочнике по скриптам](../../../scripting/server/latest-server-reference/#onplayerauth)
Еще один пример использования onPlayerAuth, но он запретит гостям присоединяться к серверу, отправив клиенту ответное сообщение, которое затем будет показано игроку:
```lua
function onPlayerAuth(playerName, playerRole, isGuest, identifiers)
if isGuest then
return "No guests allowed, please use a BeamMP account"
end
end
```
Дополнительную информацию о серверных функциях, предоставляемых BeamMP, можно найти в [последнем справочнике по серверу.](../../../scripting/server/latest-server-reference.md)
## Клиентская часть lua
Это в значительной степени соответствует [расширениям BeamNG.](https://documentation.beamng.com/modding/programming/extensions/)
```lua
local M = {}
if extensions.isExtensionLoaded("examplePlugin") then
log("E", "examplePlugin", "examplePlugin loaded on client side")
return
end
return M
```
Выводит на консоль информацию о том, что examplePlugin был загружен
Более подробную информацию см. в [документации beamNG по отладочным распечаткам.](https://documentation.beamng.com/modding/programming/debugging/#a-add-a-log)
## modScript.lua
Обычно содержит только две строки
```lua
load('examplePlugin')
setExtensionUnloadMode('examplePlugin', 'manual')
```
Вы можете добавить вывод журнала, если хотите видеть в журналах, когда ваш modScript обрабатывается BeamNG.
```lua
load('examplePlugin')
setExtensionUnloadMode('examplePlugin', 'manual')
log('I', 'modScript', "examplePlugin loaded")
```

View File

@@ -0,0 +1,45 @@
!!! предупреждение "Этот сайт находится в стадии разработки!"
```
This site is being actively worked on.
Feel you could help? Please do by clicking on the page with a pencil on the right!
This can be done any page too.
```
# Справочник по модам/внутриигровым скриптам
BeamMP также позволяет вам создавать собственные плагины на стороне клиента. Мы предоставили несколько функций, которые вы можете использовать для связи с другими многопользовательскими модами и другими игроками через сервер.
# Функции
Список доступных функций для написания скриптов:
Функция | Примечания
--- | ---
`TriggerServerEvent("eventName", "data")` | Запускает событие в серверной среде lua, оба параметра являются строками.
`TriggerClientEvent("eventName", "data")` | Запускает событие в локальной среде lua, оба параметра — строки. Хорошо подходит для связи между плагинами.
`AddEventHandler("eventName", Function)` | Добавляет 2-й параметр в таблицу, который будет вызываться при получении `eventName` (локально или с сервера). `Function` получит 1 параметр — строку, содержащую данные события.
# Фрагменты кода
Например, для анализа чата используйте включенное событие `ChatMessageIncluded` следующим образом:
```lua
local function chatReceived(msg) -- Receive event with parameters
print("chat received: "..msg)
local i = string.find(s, ":") -- Find where our first ':' is, used to separate the sender and message
if i == nil then
print("error parsing message: separator could not be found!")
return -- Could not find separator, cancel function
end
print("index of separator: "..tostring(i))
local sender = string.sub(msg, 1, i-1) -- Substring our input to separate its 2 parts
local message = string.sub(msg, i+1, -1) -- Do whatever you want to with the message
print("sender: " .. sender)
print("message: ".. message)
end
AddEventHandler("ChatMessageReceived", chatReceived) -- Add our event handler to the list managed by BeamMP
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,384 @@
!!! предупреждение "Этот сайт находится в стадии разработки!"
```
This site is being actively worked on.
Feel you could help? Please do by clicking on the page with a pencil on the right!
This can be done any page too.
```
# Справочник по серверным скриптам
## Версия сервера 2.X
!!! предупреждение
```
BeamMP server version 2.X is now unsupported. This documentation is provided as a reference only.
Please update to the latest version for maintenance and support.
```
---
> Это скрипт 2.x. Обращайтесь к нему только если ваш сервер старый/устаревший (версия 2.xx). Для получения последней документации см. [здесь](https://docs.beammp.com/scripting/server/latest-server-reference) . {.is-warning}
### Примечания
Чтобы получить вывод функции в консоли сервера, вам нужно обернуть его в оператор `print()` . Например: `print(GetPlayerName(0))` вернет имя первого игрока вашего сервера.
`<PlayersServerID>` начинается с 0.
### Список доступных функций для написания скриптов
#### GetPlayerName(идентификатор_серверагроков)
Возвращает имя игрока в Discord в виде строки
```lua
function onPlayerJoin(playerID)
local name = GetPlayerName(playerID)
-- Do something
end
```
#### GetPlayerDiscordID(playersServerID)
Возвращает имя игрока в Discord в виде строки
```lua
function onPlayerJoin(playerID)
local name = GetPlayerDiscordID(playerID)
-- Do something
end
```
#### GetPlayerHWID(идентификатор_серверагроков)
Возвращает идентификатор игрока в Discord в виде строки
```lua
function onPlayerJoin(playerID)
local name = GetPlayerHWID(playerID)
-- Do something
end
```
#### GetPlayerVehicles(идентификатор_серверагроков)
Возвращает транспортные средства игрока в виде объекта/массива.
```lua
function onChatMessage(playerID, senderName, message)
local vehicleList = GetPlayerVehicles(playerID)
for vehicleID, vehicleData in pairs(vehicleList) do
-- Do something
-- Could also be used to check how many vehicles a player have
end
end
```
#### DropPlayer(идентификатор_серверагроков)
Сбрасывает соединение для определенного игрока. По сути выгоняет его
```lua
function onVehicleSpawn(playerID, vehicleID, vehicleData)
-- Do something
DropPlayer(playerID)
end
```
#### SendChatMessage(playersServerID, сообщение)
Отправляет сообщение по сети указанному пользователю. Используйте -1 для всех
```lua
function onPlayerJoin(playerID)
SendChatMessage(-1, "Someone just joined!")
end
```
#### CancelEvent() -- УСТАРЕЛО
Отменяет событие. Это может произойти скоро. Используйте `return 1` чтобы отменить событие.
#### onInit()
Если объявлено в файле lua, оно будет вызвано после того, как C++ успешно завершит загрузку текущего файла lua.
```lua
function onInit()
print("Server ready")
end
```
#### Выход()
Закрою сервер.
```lua
function onInit()
print("Server Ready. But who needs a server which is running")
exit() -- Stops the server
end
```
#### CreateThread(имя_функции, интервал_вызова)
Функция будет выполняться в выделенном потоке, и она будет запускать callInterval раз в секунду. 1 = Она будет запускаться каждую секунду.
```lua
function yourFunction()
for i = 1,10 do
SendChatMessage(-1, "Countdown: "..i)
Sleep(1000)
end
end
CreateThread("yourFunction", 30)
```
УСТАРЕВШИЙ ПРИМЕР Функция будет выполняться в выделенном потоке
```lua
function yourFunction()
for i = 1,10 do
SendChatMessage(-1, "Countdown: "..i)
Sleep(1000)
end
end
CreateThread("yourFunction", 30)
```
#### StopThread(имя_функции)
Прекратит попытки вызвать функцию потока текущего скрипта.
```lua
function yourFunction()
delayExpired = false
Sleep(10000)
delayExpired = true
end
CreateThread("yourFunction", 30)
-- Do something
if not delayExpired then
StopThread("yourFunction")
else
-- Do something
end
```
#### Сон (миллисек) - ИЗНОС
Приостановит выполнение на указанное время (предупреждение: это приведет к приостановке всего сервера, если вы не создали поток)
```lua
function countdown()
for i = 1,10 do
SendChatMessage(-1, "Countdown: "..i)
Sleep(1000)
end
end
CreateThread("countdown", 10)
```
#### ПолучитьPlayerCount()
Вернет количество подключенных игроков
```lua
function onPlayerJoin(playerID)
SendChatMessage(playerID, "You are the "..GetPlayerCount().."th player!"
end
```
#### RemoveVehicle(playerServerID, VehicleID)
Исчезнет транспортное средство.
```lua
function onVehicleSpawn(playerID, vehicleID, vehicleData)
if --[[ Vehicle data equal something it shouldn't be ]] then
RemoveVehicle(playerID, vehicleIID)
end
end
```
#### ПолучитьИгроков()
Вернет таблицу идентификаторов с именами
```lua
local function onPlayerJoin(joinedPlayerID)
local players = GetPlayers()
for playerID, playerName in pairs(players) do
if playerID == joinedPlayerID then
-- Do something
end
end
end
```
#### RegisterEvent(имя_события, имя_функции)
Зарегистрирует эту функцию для указанного события. Оба должны быть строками
```lua
function anyEvent()
-- Do something
end
RegisterEvent("onAnyEventHappen", "anyEvent")
-- Do something
TriggerLocalEvent("onAnyEventHappen")
```
#### TriggerLocalEvent(имя_события)
Будет вызывать каждую зарегистрированную функцию в той же папке плагина.
```lua
function anyEvent()
-- Do something
end
RegisterEvent("onAnyEventHappen", "anyEvent")
-- Do something
TriggerLocalEvent("onAnyEventHappen")
```
#### TriggerGlobalEvent(имя_события)
Будет вызывать каждую зарегистрированную функцию с этим именем события.
```lua
-- File A
function anyEvent()
-- Do something
end
RegisterEvent("onAnyEventHappen", "anyEvent")
```
```lua
-- File B
TriggerGlobalEvent("onAnyEventHappen")
```
#### TriggerClientEvent(playerServerID, eventName, data)
Вызовет это событие с указанными данными на указанном клиенте (-1 для широковещательной передачи)
```lua
function onPlayerJoin(playerServerID)
TriggerClientEvent(playerServerID, "anyEvent", "You just joined the server")
end
RegisterEvent("onAnyEventHappen", "anyEvent")
```
#### Установить(configID, newValue)
установит настройку конфигурации на новое указанное значение из таблицы ниже|
```lua
function onChatMessage(playerID, senderName, message)
if playerID == adminPlayer then
if message == --[[ anything ]] then
Set(3, 10)
end
end
end
```
#### Список доступных настроек конфигурации для команды `Set()`
> Обратите внимание, что они не будут сохранены в файле конфигурации.
Идентификатор конфигурации | Имя | Приму только
--- | --- | ---
`0` | Настройка отладки | правда или ложь
`1` | Частная обстановка | правда или ложь
`2` | Макс. количество автомобилей на игрока | число
`3` | Макс. количество игроков | число
`4` | Карта | нить
`5` | Имя | нить
`6` | Описание | нить
любой другой идентификатор приведет к появлению предупреждения на консоли | |
### Список доступных событий для написания сценариев
#### События по умолчанию
Пример использования события:
```lua
function onInit()
RegisterEvent("onPlayerJoin", "onPlayerJoin")
end
function onPlayerJoin(playerServerID)
-- Do something
end
```
Если вы не хотите, чтобы на вашем сервере были гости:
```lua
function onInit()
print("noGuests Ready")
RegisterEvent("onPlayerAuth","onPlayerAuth")
end
function onPlayerAuth(name, role, isGuest)
if isGuest then
return "You must be signed in to join this server!"
end
end
```
Событие | Параметры | Описание
--- | --- | ---
`onPlayerAuth` | Имя игрока, роль на форуме, гостевая учетная запись (bool) | Игрок прошел аутентификацию и запрашивает присоединение
`onPlayerConnecting` | Идентификатор игрока | Игрок загружается (до загрузки карты)
`onPlayerJoining` | Идентификатор игрока | Игрок загружает карту и скоро присоединится
`onPlayerJoin` | Идентификатор игрока | Игрок присоединился и загрузился
`onPlayerDisconnect` | Идентификатор игрока | Игрок отключился
`onChatMessage` | Идентификатор отправителя, имя и сообщение чата | Сообщение чата было отправлено. Это было бы хорошо для создания системы команд
`onVehicleSpawn` | Идентификатор игрока, идентификатор транспортного средства и данные транспортного средства | Это называется, когда кто-то создает транспортное средство.
`onVehicleEdited` | Идентификатор игрока, идентификатор транспортного средства и данные транспортного средства | Это называется, когда кто-то редактирует транспортное средство или заменяет существующее.
`onVehicleDeleted` | Идентификатор игрока и идентификатор транспортного средства | Это называется, когда кто-то удаляет принадлежащее ему транспортное средство.
#### Пользовательские события
Пользовательские события также могут быть созданы для вашего собственного использования. Это делается примерно так же, как и события по умолчанию.
Пример использования пользовательского события:
```lua
function onInit()
RegisterEvent("myCustomEvent", "myCustomEvent")
end
function myCustomEvent(playerServerID, customData)
-- Do something
end
```
Затем его можно вызвать либо со стороны клиента, либо со стороны сервера, используя соответствующие функции.
### Игроки
Когда игрок подключается к вашему серверу, ему назначается serverID, начиная с 0 и далее. serverID используются повторно; если игрок покидает сервер и снова присоединяется, ему не будет назначен новый serverID, он просто получит другой доступный. Когда сервер перезапустится, serverID будут сброшены.
#### Статические идентификаторы
У игроков в BeamMP есть 3 статических идентификатора, которые можно получить из их serverID: имя, discordID и hardwareID или HWID. (Хотя последний из вышеупомянутых не реализован, мы будем действовать так, как будто он реализован). Каждый из трех типов идентификаторов имеет свое собственное происхождение и сильные/слабые стороны при использовании их для идентификации игрока.
ТИП ИДЕНТИФИКАТОРА | ПЛЮСЫ | МИНУСЫ | ФУНКЦИЯ ДЛЯ ПОЛУЧЕНИЯ
--- | --- | --- | :-:
имя | легко получить, просто | не безопасно | ПолучитьИмяИгрока()
DiscordID | довольно безопасно | неудобно | GetPlayerDiscordID()
HWID | чрезвычайно безопасно | трудно получить | GetPlayerHWID()
### Транспортные средства
У транспортных средств в beamMP есть 3 атрибута, на которые обращает внимание сервер: serverID владельца, vehicleID транспортного средства и его данные. ServerID владельца прост, это serverID, у каждого транспортного средства также есть ID, идентификаторы транспортных средств не уникальны для транспортного средства; два транспортных средства могут иметь одинаковый ID, если они принадлежат разным владельцам. В отличие от serverID, vehicleID используются повторно, например, если у меня есть 4 транспортных средства, их идентификаторы — 0, 1, 2 и 3, если я удалю транспортное средство в vehicleID 2, у меня будут 0, 1 и 3, когда я создам новое транспортное средство, новое транспортное средство будет помещено в слот ID 2. Наконец, последний атрибут, который есть у транспортных средств, — это data, data содержит транспортное средство, название, детали и другие данные; как следует из названия. data хранится в виде необработанной строки JSON, поэтому вам понадобится библиотека JSON. В качестве альтернативы вы можете вручную пройти по строке и извлечь необходимую информацию.

View File

@@ -0,0 +1,237 @@
# Обслуживание сервера
Руководства, советы и рекомендации по настройке и обслуживанию сервера BeamMP.
## Как установить
Инструкции по установке см. в разделе [Установка сервера](create-a-server.md) .
## Файл ServerConfig
Конфигурация сервера, представляющая собой файл `ServerConfig.toml` , использует [формат TOML](https://toml.io/en/) .
*ПРИМЕЧАНИЕ* : *Старый* файл конфигурации сервера назывался `Server.cfg` , но он больше не используется, и сервер выдаст предупреждение, если он все еще присутствует. Также обратите внимание, что два формата конфигурации **несовместимы** друг с другом.
По умолчанию в конфигурации есть один раздел, называемый `[General]` , который содержит следующие значения:
Ключ | Тип значения | Описание
--- | --- | ---
AuthKey | Формат AuthKey `xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` где все x — буквенно-цифровые символы (цифры и буквы) | Используется для идентификации вашего сервера с бэкэндом. Вы должны были получить его, следуя инструкциям по установке.
Отлаживать | правда/ложь | При включении (true) будет отображаться больше сообщений в журнале и предоставляться больше информации. Включите это, если у вас возникнут проблемы. Включение этого параметра значительно увеличит размер файла журнала.
Частный | правда/ложь | Если включено (true), ваш сервер не будет отображаться в списке серверов. Любой с правильным IP и портом все равно сможет подключиться.
Описание | Любой "текст" | Отображается как описание сервера в списке серверов (если сервер публичный). Вы можете использовать специальные символы для форматирования с помощью цветов и стилей.
Имя | Любой "текст" | Отображается как имя/заголовок вашего сервера в списке серверов. Вы можете использовать специальные символы для форматирования с помощью цветов и стилей.
Карта | Допустимое местоположение на карте, например `/levels/gridmap_v2/info.json` | Карта, которую будет размещать ваш сервер. Должна быть установлена либо по умолчанию (список можно найти ниже), либо как серверный мод.
МаксКарс | Любое число ≥ 1 | Максимальное количество машин на игрока. Любые дополнительные машины, которые игрок попытается создать, будут мгновенно удалены.
Порт | 1024-65535 | Сетевой порт, на котором будет доступен сервер. Чтобы игрок мог напрямую подключиться к вашему серверу, ему понадобится ваш IP и этот порт.
Другие разделы могут и должны использоваться серверными плагинами (скоро появится API Lua), например: `[MyMod]` .
AuthKey **ДОЛЖЕН** быть установлен вами. Он будет пустым по умолчанию и должен быть заполнен вашим AuthKey с шага установки ранее. Не делитесь этим ключом ни с кем и на снимках экрана полностью размывайте его.
### Все названия ванильных карт
Вот все карты акций:
- /levels/gridmap_v2/info.json
- /levels/johnson_valley/info.json
- /levels/automation_test_track/info.json
- /levels/восточное_побережье_США/info.json
- /levels/hirochi_raceway/info.json
- /уровни/италия/info.json
- /levels/jungle_rock_island/info.json
- /уровни/промышленный/info.json
- /levels/маленький_остров/info.json
- /уровни/smallgrid/info.json
- /levels/юта/info.json
- /levels/западное_побережье_США/info.json
- /уровни/обучениеодителей/info.json
- /levels/derby/info.json
### Настройте внешний вид имени вашего сервера
Используйте эти специальные символы перед текстом, и к этому тексту в списке серверов будет применен эффект:
Ценить | Описание
:-: | ---
`^r` | Перезагрузить
`^p` | Новая строка (только описания)
`^n` | Подчеркнуть
`^l` | Смелый
`^m` | Зачеркивание
`^o` | Курсив
`^0` | Черный
`^1` | Синий
`^2` | Зеленый
`^3` | светло-голубой
`^4` | Красный
`^5` | Розовый
`^6` | Апельсин
`^7` | Серый
`^8` | Темно-серый
`^9` | Светло-фиолетовый
`^a` | Светло-зеленый
`^b` | светло-голубой
`^c` | Темно-оранжевый
`^d` | светло-розовый
`^e` | Желтый
`^f` | Белый
### Настройте теги вашего сервера
Теги могут использоваться для того, чтобы позволить людям искать определенный тип сервера. Ваш serverConfig.toml будет сгенерирован с тегом freeroam `Tags = "Freeroam"` .
Вы можете добавить несколько тегов, разделенных запятой `Tags = "Events,Offroad,lang:english"` , регистр не учитывается.
Вы можете выбрать из следующего списка:
- Возраст/Содержание:
- `Mature/18+`
- Типы игрового процесса:
- `Freeroam`
- `Roleplay`
- `Economy`
- `Traffic`
- Категории гонок:
- `Racing`
- `Racing:NASCAR`
- `Racing:Track`
- `Racing:Drag`
- `Racing:Rally`
- `Touge`
- Бездорожье и испытания:
- `Offroad`
- `Crawling`
- `Dakar`
- `Challenge`
- События разрушения:
- `Derby`
- `Arena`
- Погодные и временные условия:
- `Snow/Ice`
- `Rain`
- `Night`
- `Weather`
- Режимы игры:
- `Gamemode`
- `Gamemode:Racing`
- `Gamemode:Rally`
- `Gamemode:Drag`
- `Gamemode:Derby`
- `Gamemode:Infection`
- `Gamemode:Cops-Robbers`
- `Gamemode:Delivery`
- `Gamemode:Sumo`
- Сообщество и события:
- `Scenarios`
- `Events`
- `Leaderboard`
- Модификации:
- `Modded`
- `Mod:BeamPaint`
- `Mod:BeamJoy`
- `Mod:CEI`
- Языки:
- `Lang:English`
- `Lang:Russian`
- `Lang:French`
- `Lang:Spanish`
- `Lang:Portuguese`
- `Lang:German`
- `Lang:Polish`
- `Lang:Arabic`
- Другой:
- `Vanilla`
- `Moderated`
Если тег отсутствует в этом списке, вы можете отправить запрос на его добавление [здесь.](https://forum.beammp.com/t/introducing-server-tags/1320081)
## Файл Server.log
Этот файл будет сгенерирован при запуске сервера. Это зеркало сообщений, которые вы видите в консоли при запуске сервера. Вам следует прикреплять этот файл каждый раз, когда вам нужна поддержка от нашей службы поддержки, и он никогда не покажет ваш AuthKey, поэтому вы обычно можете отправить его без изменений.
Формат следующий (префикс $ означает «переменная», пояснение ниже):
```
[$DATE $TIME] $CONTEXT [$LOG_LEVEL] $MESSAGE
```
Где:
- `$DATE` — дата сообщения, например 21/07/2021
- `$TIME` — время сообщения, например 11:05:23
- `$CONTEXT` (виден только в режиме отладки и в основном актуален для разработчиков) — контекст сообщения, который может быть:
- `(Player ID) “Player Name”` , где ID игрока полезен для модерации
- Короткое имя, например «HeartbeatThread»
- `$LOG_LEVEL` — один из уровней важности сообщения:
- `DEBUG` : отображается только в режиме отладки, обычно является спамом и важен только для разработчиков.
- `INFO` : Общая информация
- `LUA` : Сообщение от плагина Lua
- `WARN` : Описывает то, что не должно происходить, обычно
- `ERROR` : Что-то пошло не так или произошло очень неожиданно.
- `FATAL` : Произошло что-то, что привело к отключению сервера.
- `$MESSAGE` само сообщение, обычно то, на что следует обратить внимание и что следует понять. В некоторых случаях это может быть зашифровано, но общее правило заключается в том, что пока нет видимых проблем с сервером и нет ОШИБОК, все хорошо.
## Обновление сервера
### Зачем обновлять
Всякий раз, когда выходит новое обновление, вам рекомендуется обновить свой сервер. Обычно это включает исправления ошибок, улучшения стабильности и безопасности, наряду с общими новыми функциями и т. д., которые вводятся.
Чтобы получать новости об обновлениях по мере их выхода, подпишитесь на канал «обновления» сервера Discord, ищите его на форумах или посетите/спросите на [странице релизов GitHub](https://github.com/BeamMP/BeamMP-Server/releases) .
### Как обновить
#### Если вы пользуетесь услугами хостинг-провайдера, являющегося партнером BeamMP
Если вы используете хостинг-провайдера, партнера BeamMP, инструкции ниже, скорее всего, не сработают. Мы рекомендуем дождаться более подробной информации от вашего хостинг-провайдера или связаться с ним для получения помощи.
#### Самостоятельное управление сервером
Сервер обновляется путем замены старого исполняемого файла на новый. Если вы не уверены, как это сделать, ниже приведены пошаговые инструкции для Windows и Linux.
Если вы собрали из исходников, просто пересоберите. Убедитесь, что выполнили `git submodule update --init --recursive` перед пересборкой.
#### В Windows
1. Для запуска сервера убедитесь, что у вас установлены [распространяемые компоненты Visual C++](https://aka.ms/vs/17/release/vc_redist.x64.exe) .
2. Перейдите на [BeamMP.com](https://beammp.com/) и нажмите кнопку «Загрузить сервер».
3. После загрузки вы должны увидеть один файл с именем `BeamMP-Server.exe` . Мы назовем его «новый исполняемый файл».
4. Перейдите в папку, где находится ваш текущий исполняемый файл `BeamMP-Server.exe` (обычно это та же папка, где находится ваш `ServerConfig.toml` ). Мы будем называть его «старым исполняемым файлом».
5. Замените старый исполняемый файл новым исполняемым файлом (например, скопировав или переместив новый исполняемый файл в папку).
#### На Линуксе
1. Перейдите на [BeamMP.com](https://beammp.com/) и нажмите кнопку «Загрузить сервер», вы будете перенаправлены на страницу релиза сервера на Github.
2. Загрузите правильную версию для вашего дистрибутива. Для простоты теперь он будет называться `BeamMP-Server-xxx` , где `xxx` обозначает версию для используемого вами дистрибутива.
3. После загрузки вы должны увидеть один файл с именем `BeamMP-Server-xxx` в зависимости от версии, которую вы скачали. Мы назовем его «новый исполняемый файл».
4. Перейдите в папку, где находится ваш текущий исполняемый файл `BeamMP-Server-xxx` (обычно это та же папка, где находится ваш `ServerConfig.toml` ). Мы будем называть его «старым исполняемым файлом».
5. Замените старый исполняемый файл новым исполняемым файлом (например, скопировав или переместив новый исполняемый файл в папку).
6. Откройте терминал в той папке, где вы только что заменили исполняемый файл, и выполните `sudo chmod +x BeamMP-Server-xxx` . Это позволит убедиться, что сервер может быть запущен.
### Автоматические обновления
Сервер не поддерживает автоматические обновления или уведомления об обновлениях (пока).
Однако вы можете запросить API GitHub для получения последней версии, проверив версию сервера по тегам. Вы можете получить это с помощью GET из `https://api.github.com/repos/BeamMP/BeamMP-Server/git/refs/tags` .

View File

@@ -0,0 +1,385 @@
!!! 警告 "这个网站正在建设中!"
```
这个网站正在积极建设中。
觉得你能帮上忙吗?请用铅笔在右侧点击页面!
这也可以在任何页面上完成。
```
# 服务器脚本参考
## 服务器端版本 2.X
!!! 警告
```
BeamMP 服务器版本 2.X 已不再提供支持。
本文档仅供参考。
请更新到最新版本以进行维护和支持。
```
---
> 这是 2.x 的脚本,仅当你的服务器端版本是老的/过时的(version 2.x.x) 时才能使用此方法,有关最新文档,请参见 [这里](https://docs.beammp.com/scripting/server/latest-server-reference)。 {.is-warning}
### 说明
要在服务器控制台中获得函数的输出,必须将其包装在`print()`语句中。例如:`print(GetPlayerName(0))`将返回服务器上第一个玩家的名字。
`<PlayersServerID>` 从0开始。
### 用于编写脚本的可用函数列表
#### GetPlayerName(playersServerID)
以字符串形式返回玩家的Discord名称
```lua
function onPlayerJoin(playerID)
local name = GetPlayerName(playerID)
-- Do something
end
```
#### GetPlayerDiscordID(playersServerID)
以字符串形式返回玩家的Discord名称
```lua
function onPlayerJoin(playerID)
local name = GetPlayerDiscordID(playerID)
-- Do something
end
```
#### GetPlayerHWID(playersServerID)
以字符串形式返回玩家的Discord ID
```lua
function onPlayerJoin(playerID)
local name = GetPlayerHWID(playerID)
-- Do something
end
```
#### GetPlayerVehicles(playersServerID)
返回玩家的车辆作为一个对象/数组
```lua
function onChatMessage(playerID, senderName, message)
local vehicleList = GetPlayerVehicles(playerID)
for vehicleID, vehicleData in pairs(vehicleList) do
-- Do something
-- Could also be used to check how many vehicles a player have
end
end
```
#### DropPlayer(playersServerID)
断开特定玩家的连接。“其实就是踢出玩家”
```lua
function onVehicleSpawn(playerID, vehicleID, vehicleData)
-- Do something
DropPlayer(playerID)
end
```
#### SendChatMessage(playersServerID, message)
通过网络向指定的用户发送消息。每个人都用-1
```lua
function onPlayerJoin(playerID)
SendChatMessage(-1, "Someone just joined!")
end
```
#### CancelEvent() -- DEPRECIATED
取消事件的发生。这可能很快就会发生。使用`return 1`来取消事件。
#### onInit()
如果在lua文件中声明它将在c++成功加载当前lua文件后被调用
```lua
function onInit()
print("Server ready")
end
```
#### exit()
将关闭服务器
```lua
function onInit()
print("Server Ready. But who needs a server which is running")
exit() -- Stops the server
end
```
#### CreateThread(functionName, callInterval)
将在专用线程上执行该函数它将每秒运行callInterval数次。它每秒钟都会跑一次。
```lua
function yourFunction()
for i = 1,10 do
SendChatMessage(-1, "Countdown: "..i)
Sleep(1000)
end
end
CreateThread("yourFunction", 30)
```
已弃用示例:将在专用线程上执行该函数
```lua
function yourFunction()
for i = 1,10 do
SendChatMessage(-1, "Countdown: "..i)
Sleep(1000)
end
end
CreateThread("yourFunction", 30)
```
#### StopThread(functionName)
将停止尝试调用当前脚本的线程函数
```lua
function yourFunction()
delayExpired = false
Sleep(10000)
delayExpired = true
end
CreateThread("yourFunction", 30)
-- Do something
if not delayExpired then
StopThread("yourFunction")
else
-- Do something
end
```
#### Sleep(millisecs) - DEPRECIATED
将暂停执行指定的时间(警告,如果没有创建线程,将暂停整个服务器)
```lua
function countdown()
for i = 1,10 do
SendChatMessage(-1, "Countdown: "..i)
Sleep(1000)
end
end
CreateThread("countdown", 10)
```
#### GetPlayerCount()
将返回多少玩家连接
```lua
function onPlayerJoin(playerID)
SendChatMessage(playerID, "You are the "..GetPlayerCount().."th player!"
end
```
#### RemoveVehicle(playerServerID, VehicleID)
这会导致一辆载具消失。
```lua
function onVehicleSpawn(playerID, vehicleID, vehicleData)
if --[[ Vehicle data equal something it shouldn't be ]] then
RemoveVehicle(playerID, vehicleIID)
end
end
```
#### GetPlayers()
将返回一个带有name的id表
```lua
local function onPlayerJoin(joinedPlayerID)
local players = GetPlayers()
for playerID, playerName in pairs(players) do
if playerID == joinedPlayerID then
-- Do something
end
end
end
```
#### RegisterEvent(eventName, functionName)
将该函数注册到指定的事件,都必须是字符串。
```lua
function anyEvent()
-- Do something
end
RegisterEvent("onAnyEventHappen", "anyEvent")
-- Do something
TriggerLocalEvent("onAnyEventHappen")
```
#### TriggerLocalEvent(eventName)
将调用同一插件文件夹中的每个注册函数。
```lua
function anyEvent()
-- Do something
end
RegisterEvent("onAnyEventHappen", "anyEvent")
-- Do something
TriggerLocalEvent("onAnyEventHappen")
```
#### TriggerGlobalEvent(eventName)
将使用此事件名称调用每个已注册的函数。
```lua
-- File A
function anyEvent()
-- Do something
end
RegisterEvent("onAnyEventHappen", "anyEvent")
```
```lua
-- File B
TriggerGlobalEvent("onAnyEventHappen")
```
#### TriggerClientEvent(playerServerID, eventName, data)
将使用给定的数据在指定的客户端(-1 表示广播)上触发该事件。
```lua
function onPlayerJoin(playerServerID)
TriggerClientEvent(playerServerID, "anyEvent", "You just joined the server")
end
RegisterEvent("onAnyEventHappen", "anyEvent")
```
#### Set(configID, newValue)
会将配置设置修改为下方表格中指定的新值。
```lua
function onChatMessage(playerID, senderName, message)
if playerID == adminPlayer then
if message == --[[ anything ]] then
Set(3, 10)
end
end
end
```
#### 可用于 `Set()` 命令的配置项列表
> Note that these will not save to the config file.
Config ID | 名称 | 只接受以下内容
--- | --- | ---
`0` | 调试设置 | true 或 false
`1` | 私人设置 | true 或 false
`2` | 每个玩家的最大车辆数 | 数字
`3` | 最大玩家数 | 数字
`4` | 地图 | 字符串
`5` | 名称 | 字符串
`6` | 描述 | 字符串
任何其他ID都会导致控制台警告 | |
### 用于编写脚本的可用事件列表
#### 默认事件
如何使用事件的示例:
```lua
function onInit()
RegisterEvent("onPlayerJoin", "onPlayerJoin")
end
function onPlayerJoin(playerServerID)
-- Do something
end
```
如果你不希望访客进入你的服务器:
```lua
function onInit()
print("noGuests Ready")
RegisterEvent("onPlayerAuth","onPlayerAuth")
end
function onPlayerAuth(name, role, isGuest)
if isGuest then
return "You must be signed in to join this server!"
end
end
```
事件 | 参数 | 描述
--- | --- | ---
`onPlayerAuth` | 玩家的名称、论坛角色、是否为访客账号(布尔值) | 有一名玩家已通过验证并正在请求加入。
`onPlayerConnecting` | 玩家的ID | 玩家正在加载(在加载地图之前)
`onPlayerJoining` | 玩家的ID | 玩家正在加载地图,很快就会加入
`onPlayerJoin` | 玩家的ID | 玩家已加入并加载
`onPlayerDisconnect` | 玩家的ID | 玩家退出了游戏
`onChatMessage` | 发消息的玩家的ID、昵称和聊天消息 | 发送了一条聊天消息。这对于创建命令系统非常有用
`onVehicleSpawn` | 玩家ID车辆ID和车辆数据 | 当有人刷出一辆车时输出
`onVehicleEdited` | 玩家ID车辆ID和车辆数据 | 当有人编辑车辆或替换现有车辆时,就会调用此操作
`onVehicleDeleted` | 玩家的ID和车辆ID | 当某人删除自己拥有的车辆时,就会调用此操作
#### 自定义事件
可以创建自定义事件以供自己使用。这与默认值的处理方式非常相似。
如何使用自定义事件的范例:
```lua
function onInit()
RegisterEvent("myCustomEvent", "myCustomEvent")
end
function myCustomEvent(playerServerID, customData)
-- Do something
end
```
接着可以使用各自的函数从客户端或服务器端调用该函数。
### 玩家
当玩家连接到你的服务器时,他们会被分配一个从 0 开始递增的 serverID。<br>serverID 会被重复利用;如果玩家离开后再次加入,他们不会获得新的 serverID而是会被分配一个当前可用的 serverID。<br>当服务器重新启动时serverID 会被重置。
#### 静态标识符
BeamMP 中的玩家拥有 3 个可通过其 serverID 获取的静态标识符分别是他们的名称、discordID以及硬件IDHWID<br>(尽管最后一个尚未实现,但在此处我们将假设它已实现。)<br>这三种 ID 类型各自具有不同的来源,以及在玩家识别用途上的优点和缺点。
ID 类型 | 优点 | 缺点 | 获取的函数
--- | --- | --- | :-:
name | 容易获得,直截了当 | 不安全 | GetPlayerName()
discordID | 非常安全 | 不方便 | GetPlayerDiscordID()
HWID | 超级安全 | 难获得 | GetPlayerHWID()
### 车辆
BeamMP 中的车辆有 3 个服务器会关注的属性:车辆所属者的 serverID、车辆的 vehicleID 以及车辆的数据。<br>所属者的 serverID 很简单,它就是玩家的 serverID。每辆车也有一个 vehicleID但 vehicleID 并不是车辆唯一的;来自不同玩家的两辆车可能拥有相同的 vehicleID。<br>与 serverID 不同vehicleID 会被重复使用。例如,如果我有 4 辆车,它们的 ID 分别是 0、1、2 和 3。如果我删除 vehicleID 为 2 的车辆,我就只剩下 0、1 和 3。当我生成一辆新车时这辆新车会占用 ID 2。<br>最后,车辆的第三个属性是 data。data 包含车辆名称、部件以及其他数据顾名思义。data 是以原始 JSON 字符串存储的,因此你需要使用 JSON 库来解析它,或者你也可以手动逐步解析字符串,提取所需的信息。

View File

@@ -0,0 +1,20 @@
# 错误代码
此页面包含服务器可能显示的所有错误代码。
---
错误代码 | 描述 | 可能的解决方案
--- | --- | ---
10022 | 绑定端口时出现问题 | 检查该端口是否已被其他服务占用,如果是,请更换为其他端口。
10048 | 地址已被占用 | 有另一个 BeamMP 服务器或程序正在使用该端口,请更换为其他端口。
10051 | 网络不可达 | 端口转发配置错误或类似问题,请确认所有设置均已正确配置。
10052 | 网络重置 | 当网络在建立连接过程中断开时会发生此情况。请重试连接。
10053 | 连接已中止 | 由于超时或网络错误导致,请重试连接。
10054 | 连接被对端重置。 | 有客户端已从你的服务器断开连接。
10060 | 连接超时 | 你的端口转发存在问题,请参考 [指南步骤](create-a-server.md#1-port-forwarding)。
10061 | 连接被拒绝 | 你的端口转发存在问题,请参照 [指南步骤](create-a-server.md#1-port-forwarding)。
10064 | 主机宕机 | 罕见错误,但表示主机已宕机,可能是因为主机已关闭或端口被关闭。
10065 | 无法访问主机 | 无网络或端口转发错误,请参考 [指南步骤](create-a-server.md#1-port-forwarding)。
!!! note “对于本列表中未包含的任何其他错误代码,如果你对网络/套接字有一定了解,可以参考 [https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2](https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2)。

87
docs/zh/server/manual.md Normal file
View File

@@ -0,0 +1,87 @@
# 服务器手册
# 环境
服务器受各种外部参数状态的影响:
- "Resources" 文件夹
- ENV进程环境
- 命令行参数
- ServerConfig.toml 文件
- 工作目录
## Resources 文件夹
resources 文件夹会在服务器启动时创建同时会生成“Client”和“Server”子目录。“Server”子目录可以包含多个文件夹每个文件夹至少包含一个 `.lua` 文件。位于插件顶层目录的 `.lua` 文件在修改时会被热加载。“Client”子目录仅接受 *&nbsp;`.zip` 文件,这些文件在服务器启动时加载,并假设在运行时不会发生变化。*
## ENV
### 一般设置
从服务器 v3.2.0 版本开始BeamMP 服务器支持环境变量,这些变量会 **覆盖** ServerConfig.toml 中的设置。所有位于“General”类别/部分的 ServerConfig 变量都是 PascalCase而环境变量则为 ALL_CAPS并以 `BEAMMP_` 为前缀。例如,`MaxPlayers` 设置转换为全大写为 `MAX_PLAYERS`(注意每个新单词前的 `_`),加上前缀后变为 `BEAMMP_MAX_PLAYERS`。所有“General”设置都遵循此格式。现有的 ENV 变量如下:
- `BEAMMP_DEBUG`
- `BEAMMP_PRIVATE`
- `BEAMMP_PORT`
- `BEAMMP_MAX_CARS`
- `BEAMMP_MAX_PLAYERS`
- `BEAMMP_MAP`
- `BEAMMP_NAME`
- `BEAMMP_DESCRIPTION`
- `BEAMMP_TAGS`
- `BEAMMP_RESOURCE_FOLDER`
- `BEAMMP_AUTH_KEY`
- `BEAMMP_LOG_CHAT`
任何对应于配置参数的环境变量,如果参数类型为字符串或数字,则环境变量必须为字符串,例如 `BEAMMP_NAME="Cool Server"``BEAMMP_NAME=Server1``BEAMMP_PORT=12345`。对应于布尔类型true/false、on/off的配置参数的环境变量必须为 `true``1`(都表示开启),其他任意值表示关闭。
### 服务器提供者或服务提供相关的设置
这些环境变量允许托管提供者(以及拥有更多服务器的其他用户,此处称为‘提供者’)覆盖某些特定于提供者的设置。
#### `BEAMMP_PROVIDER_PORT_ENV` (在v3.3.0版本)
当设置为非空字符串时,这会用另一个变量替换 `BEAMMP_PORT` 变量,以便从现有的 ENV 中读取该变量。例如Pterodactyl 可能会将 `SERVER_PORT` 作为 ENV 暴露。要在 BeamMP-Server 中使用它,你需要这样设置 `BEAMMP_PORT=${SERVER_PORT}`,这有点繁琐。
现在,你可以使用 `BEAMMP_PROVIDER_PORT_ENV="SERVER_PORT"`,这样 BeamMP-Server 就会从 `SERVER_PORT` ENV 变量中读取端口。
#### `BEAMMP_PROVIDER_DISABLE_CONFIG` (在v3.3.0版本)
如果设置为 `1``true`,则 `ServerConfig.toml`**不被生成**,如果存在也 **不会被读取**。服务器必须设置 `BEAMMP_AUTH_KEY` 才能正常运行。
#### `BEAMMP_PROVIDER_UPDATE_MESSAGE` (在v3.2.2版本)
当设置为非空字符串时这会替换整个更新消息默认消息为“NEW VERSION IS OUT! Please update to the new...” 等。你提供的更新消息中 **必须**包含 `{}`,服务器会将其替换为新版本号。例如,你的更新消息可以如下所示:
```sh
BEAMMP_PROVIDER_UPDATE_MESSAGE="BeamMP-Server 的新版本已发布:{}请按照此更新指南操作https://example.com/update-guide"
```
这将生成如下更新消息
```
BeamMP-Server 的新版本已发布v5.0.2请按照此更新指南操作https://example.com/update-guide
```
请务必向用户明确说明他们需要更新,并解释如何进行更新。
## 命令行参数
使用 `--help` 参数运行 BeamMP 服务器以了解更多信息。例如:`./BeamMP-Server --help`
## ServerConfig.toml
该文件会在首次启动时生成。文件内的注释是了解每个设置作用的最新方式。
## 工作目录
服务器的工作目录,而不是服务器可执行文件的位置,决定了 ServerConfig.toml、服务器日志文件和 Resources 文件夹的生成位置。
# 限制
以下限制在 BeamMP 后端中被强制执行,这会影响服务器:
- Name 的长度限制为 250 个字符
- 描述限制为 1000 个字符
- 地图名称限制为 100 个字符
- 标签限制为 100 个字符