Christmas Patriarch

Создание мутатора. Функции и настройки

Для достаточно хорошего понимания нижеследующего текста, важно иметь хотя бы начальные знания об ООП и языке UnrealScript в частности.

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

Основные функции

PostBeginPlay

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

function PostBeginPlay()
{
    // Здесь обработка инициализации
}

Tick

Ещё одна стандартная функция актёра. Вызывается через определенный цикл игрового времени. При частоте кадров в 60 fps, он будет вызываться 60 раз в секунду (или один раз в ~16 миллисекунд). Эта функция часто используется другими актёрами, позволяя им постоянно, покадрово выполнять задачи (обновление переменных и т.д.). Аргумент delta указывает, сколько секунд потребовалось последнему циклу для выполнения задачи (например, при 2 fps значение аргумента должно быть ~0.5, так как ему потребуется полсекунды, чтобы сделать кадр.

function Tick(float Delta)
{
    // Здесь обновление логики мутатора
}

Timer

Ещё одна важная функция актёров, вызываемая сценарием (скриптом). Объявление функции SetTimer() будет планировать вызов на указанную задержку, которая может быть опционально повторена через некоторый промежуток времени.

function PostBeginPlay()
{
    SetTimer(0.5, False); // Через 0.5 с, без повтора (False)
}

function Timer()
{
    // Здесь обработка связанных с таймером вещей
}

Специфические функции

ModifyPlayer

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

function ModifyPlayer(Pawn Other)
{
    Other.GiveWeapon("KFMOD.SCARMK17AssaultRifle");
    Super.ModifyPlayer(Other);
}

Mutate

Эта функция полезна как в отладке, так и практическом применении. Она вызывается, когда игрок вводит в консоли mutator <строка аргумента>. В многопользовательской игре он будет вызыватся независимо от того, запускается ли мутатор на клиентской машине или нет. Как и с функцией выше, вы должны отправить этот вызов другим мутаторам в цепи (вызов суперкласса имплементации этой функции обработает это для вас).

function Mutate(string MutateString, PlayerController Sender)
{
    if (Caps(MutateString) == "HYPER")
        Sender.Pawn.Health = 999;
    Super.Mutate(MutateString, Sender);
}

CheckReplacement

Функция вызывается всякий раз когда появляется актёр (это относится только к тем, чей атрибут bGameRelevant установлен на значение false - эта функция не вызывается для клиенто-сторонних актёров, такие как локальные эффекты). Функция позволяет изменить/заменить актёра. Это полезно когда нужно внести изменения в актёр после его появления, чтобы не пришлось беспокоится об изменениях позже. Если вы не являететсь опытным пользователем, всегда делайте возврат с вызовом суперкласса имплементации этой функции.

function bool CheckReplacement(Actor Other, out byte bSuperRelevant)
{
    if (KFMonster(Other) != None)
        KFMonster(Other).Health = 1;
    return Super.CheckReplacement(Other, bSuperRelevant);
}

Добавление настроек мутатора

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

FillPlayInfo

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

static function FillPlayInfo(PlayInfo PlayInfo)
{
    Super.FillPlayInfo(PlayInfo);
    PlayInfo.AddSetting(
        default.RulesGroup,
        "variableName",
        "settingDescription",
        0,
        0,
        "settingType");
}

Как вы можете увидеть выше, чтобы добавить параметр в игру, вы должны вызвать PlayInfo.AddSetting() и передать настройки в качестве аргументов. Свойство variableName должно совпадать с именем нужной для обозначения переменной. Свойство settingDescription позволяет дать краткое описание, которое непосредственно отображается рядом с полем ввода. Свойство settingType описывает настройки, которые могут быть выведены на экран в виде текста (строка или числовые данные), логической проверки (истина/ложь), строки выбора (выпадающее окно-список).
При использовании типа “Текст” можно указать длину строки и/или диапазона принимаемых значений в качестве дополнительного аргумента после settingType.
Несколько примеров:

PlayInfo.AddSetting(default.RulesGroup, "bEnabled", "Enabled?", 0, 0, "check");
PlayInfo.AddSetting(default.RulesGroup, "HealthMax", "Maximum Health", 0, 0, "text");
PlayInfo.AddSetting(
    default.RulesGroup,
    "HealthMax",
    "Maximum Health",
    0,
    0,
    "text",
    "3;100:200"); // до 3 символов, диапазон 100–200

При использовании selectType необходимо указать принадлежность аргумента к settingType в следующем формате:“Значение1;Текст1;Значение2;Текст2”.
Пример:

PlayInfo.AddSetting(
    default.RulesGroup,
    "StartWep",
    "Starting weapon",
    0,
    0,
    "select",
    "0;Deagle;1;Bullpup;2;LAR"); // выпадающий список оружия

GetDescriptionText

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

static function string GetDescriptionText(string SettingName)
{
    switch (SettingName)
    {
        case "ExampleVar":
            return "This is the 'long' description for the setting.";
    }
    return Super.GetDescriptionText(SettingName);
}

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

Автор: Kiyo