!!! предупреждение "Этот сайт находится в стадии разработки!"

```
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. В качестве альтернативы вы можете вручную пройти по строке и извлечь необходимую информацию.
