Создание модов

Avorion может быть модифицирован путем изменения существующих или добавления новых скриптов в игру.

На данный момент в игре используются 3 различных типа скриптов. Это сценарии сущностей, сценарии генератора секторов и сценарий запуска сервера.
Эти скрипты загружаются игрой и предоставляют функции, которые будут выполняться игрой, все во время игры. Этот интерфейс варьируется от типа к типу сценария.

В игре уже запущено много скриптов. Есть скрипты, выполняющие генерацию новых секторов, а также скрипты, работающие в сущностях. Каждая станция, которую вы найдете, и их взаимодействие реализуются с помощью скриптов.

**Отказ от ответственности: для того, чтобы мод работал, вы должны иметь базовое понимание программирования и языка программирования lua.**

## Общий интерфейс

### Скриптовые функции

Скрипты должны иметь определенные методы, в зависимости от типа скрипта. Когда загружается скрипт, скрипт будет выполняться.
После этого игра попытается вызвать определенные функции, определенные в скрипте. Точное имя и аргументы функций зависят от типа скрипта.

Общий интерфейс для функции сценария выглядит примерно так:

```
function generate(context, playerIndex, seed, x, y)
    -- do some stuff here
end

```

Функции сценария, которые не используются сценарием (особенно те, которые будут вызываться каждым кадром обновления), не должны быть определены в сценарии для повышения производительности.
Выполнение пустой функции происходит медленнее, чем ее вызов.

### API Функции

Игра предлагает API различных функций, которые могут вызываться из скриптов. Эти функции либо привязаны к объекту, либо могут вызываться без определенного объекта.

Функции, связанные с объектом, следуют шаблону именования, в котором первым идет имя типа объекта, за которым следует символ подчеркивания, а затем имя функции.

Примером такой функции может быть:

```
Entity\_SetPosition(context, entityIndex, x, y, z)

```

Эта функция называется "SetPosition" и связана с типом объекта "Entity".

### Аргумент контекста

**Контекст** переменной - это переменная, которая соединяет экземпляр сценария lua с фактическим сценарием, выполняемым на виртуальной машине lua игры. Когда игра вызывает функцию скрипта, она всегда предоставляет **контекст** переменной. Эта переменная должна быть присвоена почти каждому вызову API игрового API.

Эта переменная не должна изменяться, так как это приведет к выполнению вызовов API в неправильном контексте, что может очень легко привести к сбою игры и потере данных.

Единственное, что нужно сделать с этой переменной, это впоследствии передать ее в каждый вызов API игры, вызываемый скриптом.

## Обратный вызов

Скрипты могут регистрировать обработчики обратного вызова для различных обратных вызовов. Эти обработчики будут выполняться всякий раз, когда происходит определенное событие.

Чтобы зарегистрировать обработчик обратного вызова, используйте функции. Регистрация обратного вызова будет выглядеть примерно так:

```
Server\_RegisterCallback(context, "onPlayerLogOff", "handlePlayerLogoff")

function handlePlayerLogoff(context, player)
    writeConsole("A player has logged out.")
end

```

В этом примере функция "handlePlayerLogOff" регистрируется на сервере в качестве обработчика обратного вызова для события "onPlayerLogOff". Поэтому, всякий раз, когда игрок выходит с сервера, эта функция будет выполняться.

Для полной документации на вызовы, увидеть "ScriptingCallbacks" ScriptingCallbacks.html в папке Documentation/ в папке установки Avorion.