mirror of
https://github.com/BeamMP/Docs.git
synced 2026-07-21 22:30:55 +00:00
More work!!!
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
::: warning "Этот сайт находится в стадии разработки!"
|
||||
|
||||
```
|
||||
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
|
||||
```
|
||||
@@ -0,0 +1,45 @@
|
||||
::: warning "Этот сайт находится в стадии разработки!"
|
||||
|
||||
```
|
||||
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
@@ -0,0 +1,384 @@
|
||||
::: warning "Этот сайт находится в стадии разработки!"
|
||||
|
||||
```
|
||||
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(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 в виде строки
|
||||
|
||||
```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, сообщение)
|
||||
|
||||
Отправляет сообщение по сети указанному пользователю. Используйте -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
|
||||
```
|
||||
|
||||
#### exit()
|
||||
|
||||
Закроет сервер
|
||||
|
||||
```lua
|
||||
function onInit()
|
||||
print("Server Ready. But who needs a server which is running")
|
||||
exit() -- Stops the server
|
||||
end
|
||||
```
|
||||
|
||||
#### CreateThread(functionName, callInterval)
|
||||
|
||||
Функция будет выполняться в выделенном потоке, и она будет запускать 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(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(миллисек) - УСТАРЕЛО
|
||||
|
||||
Приостановит выполнение на указанное время (предупреждение: это приведет к приостановке всего сервера, если вы не создали поток)
|
||||
|
||||
```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()
|
||||
|
||||
Вернет таблицу идентификаторов с именами
|
||||
|
||||
```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()`
|
||||
|
||||
> Обратите внимание, что они не будут сохранены в файле конфигурации.
|
||||
|
||||
Идентификатор конфигурации | Имя | Примет только
|
||||
--- | --- | ---
|
||||
`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. (Хотя последний из вышеупомянутых не реализован, мы будем действовать так, как будто он реализован). Каждый из трех типов идентификаторов имеет свое собственное происхождение и сильные/слабые стороны при использовании их для идентификации игрока.
|
||||
|
||||
ТИП ИДЕНТИФИКАТОРА | ПЛЮСЫ | МИНУСЫ | ФУНКЦИЯ ДЛЯ ПОЛУЧЕНИЯ
|
||||
--- | --- | --- | :-:
|
||||
имя | легко получить, просто | не безопасно | GetPlayerName()
|
||||
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. В качестве альтернативы вы можете вручную пройти по строке и извлечь необходимую информацию.
|
||||
@@ -0,0 +1,75 @@
|
||||
# Начало работы
|
||||
|
||||
Чтобы начать разработку для BeamMP вам понадобится как минимум:
|
||||
|
||||
- BeamNG.drive, установленный локально
|
||||
- BeamMP, установленный локально; как минимум лаунчер, дополнительно также сервер
|
||||
- Git, установленный локально, и учетная запись GitHub.com
|
||||
- Редактор кода, например VSCode или notepad++
|
||||
|
||||
---
|
||||
|
||||
# Разница между модом, лаунчером и сервером
|
||||
|
||||
BeamMP разделен на три основные части:
|
||||
|
||||
- Мод загружается BeamNG, как и любой другой мод транспортного средства или пользовательского интерфейса для игры. Его основная функция — установить локальное соединение с лаунчером и отобразить элементы многопользовательского пользовательского интерфейса. Он в основном написан на Lua, с некоторым количеством JavaScript, HTML и CSS для элементов пользовательского интерфейса. Его репозиторий — [https://github.com/BeamMP/BeamMP](https://github.com/BeamMP/BeamMP)
|
||||
- Основная функция лаунчера — установить постоянное соединение с модом, а при необходимости — и с выбранным сервером, а также обрабатывать вход пользователя с помощью бэкенда BeamMP. Он написан на C++, предварительно скомпилирован BeamMP и его можно найти по адресу [https://github.com/BeamMP/BeamMP-Launcher](https://github.com/BeamMP/BeamMP-Launcher)
|
||||
- Сервер устанавливает соединения между одним или несколькими лаунчерами, а также «пульсирует» бэкенд BeamMP, предоставляя такую информацию, как IP, порт, версия, количество игроков и т. д. Кроме того, он управляет и запускает серверные плагины Lua. Он написан на C++, предварительно скомпилирован BeamMP для нескольких различных архитектур ОС и ЦП и может быть найден по адресу [https://github.com/BeamMP/BeamMP-Server](https://github.com/BeamMP/BeamMP-Server)
|
||||
|
||||
---
|
||||
|
||||
# Настройка среды разработки для работы над модом
|
||||
|
||||
## Использование распакованной папки для BeamNG
|
||||
|
||||
Для эффективной работы с модами в BeamNG рекомендуется использовать `unpacked` папку, а не упаковывать zip-архивы после каждого изменения.
|
||||
|
||||
Откройте папку пользователя BeamNG, перейдя в `%appdata%/Local/BeamNG.drive/0.xx/mods`, где `xx` — последняя версия BeamNG. Создайте папку с именем `unpacked` внутри папки `mods`.
|
||||
|
||||
Дополнительную информацию о папке пользователя можно найти по адресу [https://documentation.beamng.com/support/userfolder/](https://documentation.beamng.com/support/userfolder/)
|
||||
|
||||
## Включение режима разработчика в лаунчере BeamMP
|
||||
|
||||
Чтобы предотвратить удаление вашего локального клона git автоматическим обновлением, необходимо отключить его с помощью `--no-download`. Если вы также не хотите, чтобы лаунчер запускал BeamNG, и хотели бы видеть отладочные распечатки, то рекомендуется использовать `--dev`.
|
||||
|
||||
Аргумент | Примечание
|
||||
:-- | :--
|
||||
`--help` или `-h` | Выведет следующий список аргументов
|
||||
`--port <port>` или `-p` | Измените порт прослушивания по умолчанию на `<port>`. Это также должно быть настроено в игре
|
||||
`--verbose` или `-v` | Подробный режим, выводит отладочные сообщения
|
||||
`--no-download` | Пропустить загрузку и установку мода BeamMP Lua
|
||||
`--no-update` | Пропустить применение обновлений лаунчера (необходимо выполнить обновление вручную)
|
||||
`--no-launch` | Пропустить запуск игры (игру необходимо запустить вручную)
|
||||
`--dev` | Режим разработчика, то же самое, что и --verbose --no-download --no-launch --no-update
|
||||
`--game <args...>` или `-- <args...>` | Передает аргументы в игру
|
||||
|
||||
## Клонирование репозитория BeamMP в распакованную папку
|
||||
|
||||
Хотя вы можете вручную скопировать файлы модов BeamMP из нашего репозитория github, настоятельно рекомендуется использовать систему управления исходным кодом, например git. Сначала создайте форк [https://github.com/BeamMP/BeamMP](https://github.com/BeamMP/BeamMP)
|
||||
|
||||
Наиболее эффективным было бы клонировать репозиторий непосредственно в `unpacked` папку.
|
||||
|
||||
Для `git` запустите `git clone https://github.com/yourName/BeamMP` из PowerShell или окна CMD, запущенного из `unpacked` папки. Находясь в папке userfolder, убедитесь, что в `mods` не осталось папки `multiplayer` и что теперь есть `unpacked/beammp`.
|
||||
|
||||
Теперь попробуйте режим разработчика. Запустите лаунчер BeamMP, запустите BeamNG вручную, после входа в игру убедитесь, что BeamMP — единственный активный мод. Вы должны иметь возможность использовать BeamMP как обычно.
|
||||
|
||||
Используя редактор кода, вы теперь можете добавлять или изменять код непосредственно в `unpacked` папке. Затем вы можете попробовать изменения, перезагрузив Lua в игре, нажав `Ctrl+L` (и `F5` если вы внесли изменения в пользовательский интерфейс).
|
||||
|
||||
Как только вы будете довольны своими изменениями, вы можете зафиксировать их через git. Посетите [веб-сайт Git-SCM](https://git-scm.com/doc) для получения руководств и документации по использованию Git. Как только ваши изменения будут зафиксированы и отправлены (в ваш форк), вы можете сделать запрос на извлечение.
|
||||
|
||||
Если у вас возникнут какие-либо проблемы, смело задавайте их на канале #scripting в нашем [Discord](https://discord.gg/beammp).
|
||||
|
||||
---
|
||||
|
||||
# Настройка локального сервера
|
||||
|
||||
При работе с BeamMP может быть полезно использовать локальный сервер. Вы можете следовать общей [установке сервера](../../server/create-a-server.md) , пропуская первые два шага для чисто локальных подключений.
|
||||
|
||||
Установите сервер как закрытый в `serverConfig.toml`, используя любую строку в качестве `AuthKey`.
|
||||
|
||||
---
|
||||
|
||||
# Правила Внесения Вклада
|
||||
|
||||
Подробную информацию о формате кода, формате сообщения о коммите, общих рекомендациях по разработке и т. д. см. в файле `CONTRIBUTING.md` в каждом репозитории. Этот файл содержит более подробную информацию о том, как внести свой вклад. Файл `README.md` в каждом репозитории обычно также содержит шаги сборки (для скомпилированных проектов).
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
title: Руководства
|
||||
description: Этот набор страниц содержит некоторые основные руководства по BeamMP.
|
||||
status: новый
|
||||
---
|
||||
|
||||
::: warning "Этот сайт находится в стадии разработки!"
|
||||
|
||||
```
|
||||
Над этим сайтом ведется активная работа.
|
||||
|
||||
Чувствуете, что можете помочь? Пожалуйста, сделайте это, нажав на страницу с карандашом справа!
|
||||
|
||||
Это можно сделать на любой странице.
|
||||
```
|
||||
|
||||
# Руководства по Разработке BeamMP
|
||||
|
||||
Эта страница будет представлять собой введение и предисловие к созданию клиентского и серверного контента.
|
||||
|
||||
Эту страницу еще нужно доработать.
|
||||
@@ -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")
|
||||
```
|
||||
Reference in New Issue
Block a user