Мутаторы и UnrealScript

Force Game Start Mutator - Принудительный старт игры

Мутатор автоматически стартует игру (не дожидаясь пока все нажмут "готов") через определённый интервал времени.

Экран выбора персонажа Killing Floor Сетка выбора персонажа в Killing Floor.

Интервал настраивается в файле ForceGameStartMut.ini

(параметр waitingInterval в секундах)

Добавлять в виде ForceGameStartMut.ForceGameStartMut

class ForceGameStartMut extends Mutator config(ForceGameStartMut);

var config int waitingInterval;
var int startWaiting;
var bool firstPlayerArrived;

function PostBeginPlay()
{
    startWaiting = Level.TimeSeconds;
    firstPlayerArrived = false;
    SetTimer(5.0, true);
}

function Timer()
{
    local int playersN;

    // Проверяем состояние игры. Если мы не находимся в ожидании старта, то выходим.
    if (!Level.Game.bWaitingToStartMatch)
        return;

    // Проверим, не появились ли игроки. При появлении одного игрока таймер сбрасывается.
    playersN = PlayersNumber();

    if (playersN == 0)
        return;

    if (playersN > 0 && !firstPlayerArrived)
    {
        firstPlayerArrived = true;
        startWaiting = Level.TimeSeconds;
        return;
    }

    // Ждём, пока не пройдёт waitingInterval секунд после появления первого игрока.
    if (Level.TimeSeconds - startWaiting < waitingInterval)
        return;

    // Начинаем игру
    Level.Game.StartMatch();
}

function int PlayersNumber()
{
    local int N;
    local Controller C;

    N = 0;
    for (C = Level.ControllerList; C != None; C = C.nextController)
    {
        if (C.IsA('PlayerController') && C.PlayerReplicationInfo.PlayerID > 0 && C.PlayerReplicationInfo.bWaitingPlayer)
            N++;
    }
    return N;
}

defaultproperties
{
    waitingInterval=60
    bAddToServerPackages=True
    GroupName="ForceGameStartMut"
    FriendlyName="ForceGameStartMut"
    Description="Forces game start if some players are not ready for a long period of time"
}

Автор: Flame

Скомпилированная версия: https://yadi.sk/d/giSP0sgucjCuF

Переписанная версия: отсчёт после первого «готов»

В теме «Принудительный старт игры» на форуме killingfloor.ru Flame позже переписал мутатор. Главное изменение: обратный отсчёт начинается только тогда, когда хотя бы один игрок нажал «готов». Настройка одна - TimeToWait (время в секундах): если хоть один игрок готов и прошло TimeToWait секунд, игра начинается. По умолчанию 180. Добавлять так же: ForceGameStartMut.ForceGameStartMut.

class ForceGameStartMut extends Mutator config(ForceGameStartMut);
var config int TimeToWait;
var float StartWaiting;
var bool bStartCountDown;
function PostBeginPlay()
{
 SetTimer(1.0,true);
 SaveConfig();
}
function Timer()
{
 local bool bWeHaveReadyPlayers;
 //Если игра началась - отключаем таймер
 if(!Level.Game.bWaitingToStartMatch)
 SetTimer(0.0,false);
 //Получим количество готовых к игре игроков
 bWeHaveReadyPlayers=WeHaveReadyPlayers();
 if(!bWeHaveReadyPlayers)
 return;
 //Хотя бы один игрок готов играть? Запускаем обратный отсчёт
 if(bWeHaveReadyPlayers && !bStartCountDown)
 {
 bStartCountDown=true;
 StartWaiting=Level.TimeSeconds;
 return;
 }
 if(Level.TimeSeconds-StartWaiting>=TimeToWait)
 Level.Game.StartMatch();
}
function bool WeHaveReadyPlayers()
{
 local Controller C;
 for(C=Level.ControllerList;C!=None;C=C.nextController)
 {
 if (
 C.IsA('PlayerController')
 && C.PlayerReplicationInfo.PlayerID>0
 && C.PlayerReplicationInfo.bReadyToPlay
 )
 {
 return true;
 }
 }
 return false;
}
defaultproperties
{
 TimeToWait=180
 GroupName="ForceGameStartMut"
 FriendlyName="ForceGameStartMut"
 Description="Forces game start if some players are still not ready for a time period"
}