Свой сервер

Цветное название сервера Killing Floor: ServerColor и ServerColorMut

В браузере серверов Killing Floor название сервера и карты можно раскрасить в любые цвета. Статья собрана по теме «Server Color (Цветное название сервера)» с форума killingfloor.ru (w.a.l, дополнения Flame, 2013), а раздел о русском тексте в сообщениях сервера - по теме «ServerAdsSE на выделенном сервере» (2011).

ServerColor

Мутатор состоит из трёх частей:

  • ServerColor.exe - программа, в которой набирается название и расставляются цвета;
  • ServerColor.ini - настройки;
  • ServerColor.u - сам пакет.

Порядок действий:

  1. Запустите ServerColor.exe и наберите название сервера. Цветовой код можно ставить хоть перед каждой буквой: цвет действует на текст, который идёт после кода.
  2. В ServerColor.ini всего две строки. В ServerName= вставьте название, скопированное из программы, а в MapColor= - любой код цвета из той же программы. Это цвет названия карты.
  3. Подключите пакет как серверный актор: в KillingFloor.ini, в секции [Engine.GameEngine], добавьте строку
ServerActors=ServerColor.ServerColor

Цветовые коды относятся к движку Unreal и работают в любой игре на нём. Их можно вставлять и в другие строки, которые показывает браузер серверов. Например, у автора цветным был AdminEmail= в KillingFloor.ini, а в ServerPerks он раскрасил строку в информации о сервере:

ServerState.ServerInfo.Length = l+1;
ServerState.ServerInfo[l].Key = "Veterancy Handler";
ServerState.ServerInfo[l].Value = "@шш[W.A.L]Perks";

Здесь @шш - цветовой код, набранный в ServerColor.exe; в обычном редакторе он выглядит как набор случайных символов.

Вариант «UT2004 Server Color»

В более ранней теме «colored HostName» на форуме killingfloor.ru (2010) был перевод гайда с форума Tripwire для сборки «UT2004 Server Color», где порядок действий немного другой (Terrorist495):

  1. Запустите ServerColor.exe, нажмите кнопку Global в правом верхнем углу и введите имя сервера в текстовом поле ниже.
  2. Выберите цвет на цветовой шкале в самом верху, затем цвет, который будет выставлен в имя сервера, и нажмите кнопку выбора справа от диаграммы цвета. Продолжайте вставлять цвета и нажимать Test - внизу появится предварительный просмотр, - пока не добьётесь нужного результата.
  3. Нажмите кнопку сохранения, а затем UFile в правом верхнем углу. В папку ServerColor сохранятся три файла: ServerColor.u, ServerColor.ucl и ServerColor.ini. Положите все три в папку System сервера.
  4. В секцию [Engine.GameEngine] файла KillingFloor.ini добавьте строку ниже (автор вставил её прямо над ServerPackages=Core) и перезапустите сервер:
ServerActors=ServerColor.ServerColorActor

По словам участников, в «Избранном» название тоже отображается в цвете (almazhead), с отображением в Steam у kok-s тоже всё оказалось в порядке, а на GameTracker вместо цветов видны «кракозябры» (GreeN).

Как устроен цветовой код

Если нужного цвета нет в ServerColor.exe, код можно собрать вручную (пояснение Flame): сначала идёт символ с кодом 1B, затем три байта цвета R, G и B. Например, 1B 6D 3E D3 - это цвет с R=6D, G=3E, B=D3. Символы удобно подбирать в любом HEX-редакторе. Тот же приём для названий и описаний мутаторов разобран в статье Создание мутаторов.

ServerColorMut: волна, время и монстры в названии

Встречались серверы, у которых в названии видны время игры, номер волны и число монстров. По просьбе участников Flame написал мутатор ServerColorMut.ServerColorMut: он раскрашивает название сервера и карты и дописывает эту информацию. Переменные задаются в ServerColorMut.ini:

ПеременнаяЧто задаёт
ServerNameЦвет и текст названия сервера
MapColorЦвет названия карты
WaveColorЦвет номера волны (если цвет не задан, номер волны не выводится)
WavePrefixПрефикс перед номером волны, например Wave=
TimeColorЦвет времени с начала игры (если не задан, время не выводится)
TimePrefixПрефикс перед временем, например Time=
MonsterColorЦвет числа оставшихся монстров (если не задан, не выводится)
MonsterPrefixПрефикс перед числом монстров, например M=
NotStartedColorЦвет надписи до начала игры (если не задан, не выводится)
NotStartedPrefixНадпись до начала карты, например Waiting Players

Если ServerName в ini пустой, выводится обычное ServerName из KillingFloor.ini белым цветом. Информация в браузере обновляется примерно раз в 10 секунд. Сам автор называл реализацию черновой: нюансы предлагалось править в классе ServerColorInfo.

Исходный код (три класса):

class ServerColorMut extends Mutator config(ServerColorMut);
var config string ServerName;
var config string MapColor;
var config string WaveColor;
var config string WavePrefix;
var config string TimeColor;
var config string TimePrefix;
var config string MonsterColor;
var config string MonsterPrefix;
var config string NotStartedColor;
var config string NotStartedPrefix;
var ServerColorActor SCA;
function PostBeginPlay()
{
 SCA = Spawn(class'ServerColorActor');
}
class ServerColorActor extends Info;
var GameRules GRules;
function PostBeginPlay()
{
 GRules = Spawn(class'ServerColorInfo');
 if(Level.Game.GameRulesModifiers == none)
 Level.Game.GameRulesModifiers = GRules;
 else
 Level.Game.GameRulesModifiers.AddGameRules(GRules);
 super(Actor).PostBeginPlay();
}
class ServerColorInfo extends GameRules;
function GetServerDetails(out GameInfo.ServerResponseLine ServerState)
{
 local string sTemp;
 local int waveNum;
 local int monsterNum;
 local int elapsedTime;
 local KFGameReplicationInfo KFGRI;
 KFGRI=KFGameReplicationInfo(Level.GRI);
 waveNum=KFGRI.WaveNumber + 1;
 elapsedTime=KFGRI.ElapsedTime;
 monsterNum=KFGRI.MaxMonsters;
 // Название сервера: если в ini задано, берём цветное оттуда
 if(class'ServerColorMut'.default.ServerName != "")
 ServerState.ServerName = class'ServerColorMut'.default.ServerName;
 else // иначе белым цветом ServerName из KillingFloor.ini
 ServerState.ServerName = Level.Game.GameReplicationInfo.ServerName;
 // Если задан цвет карты, красим название карты
 if(class'ServerColorMut'.default.MapColor != "")
 {
 sTemp = ServerState.MapName;
 if(Left(sTemp, 1) != "")
 {
 sTemp = class'ServerColorMut'.default.MapColor $ sTemp;
 ServerState.MapName = sTemp;
 }
 }
 // Номер волны: цвет + префикс + значение
 if(class'ServerColorMut'.default.WaveColor != "")
 {
 sTemp = class'ServerColorMut'.default.WaveColor$class'ServerColorMut'.default.WavePrefix$waveNum;
 if (Level.Game.GetStateName() == 'MatchInProgress')
 ServerState.ServerName @=sTemp;
 }
 // Время с начала карты
 if(class'ServerColorMut'.default.TimeColor != "")
 {
 sTemp = " " $ class'ServerColorMut'.default.TimeColor$class'ServerColorMut'.default.TimePrefix$GetTimeString(elapsedTime);
 if (Level.Game.GetStateName() == 'MatchInProgress')
 ServerState.ServerName @=sTemp;
 }
 // Число оставшихся монстров
 if(class'ServerColorMut'.default.MonsterColor != "")
 {
 sTemp = " "$class'ServerColorMut'.default.MonsterColor$class'ServerColorMut'.default.MonsterPrefix$monsterNum;
 if (Level.Game.GetStateName() == 'MatchInProgress')
 ServerState.ServerName @=sTemp;
 }
 // Надпись, пока игра не началась
 if (class'ServerColorMut'.default.NotStartedColor != "")
 {
 sTemp = " "$class'ServerColorMut'.default.NotStartedColor$class'ServerColorMut'.default.NotStartedPrefix;
 if(Level.Game.GetStateName() != 'MatchInProgress')
 ServerState.ServerName @=sTemp;
 }
}
function string GetTimeString(int seconds)
{
 local int cMinutes,cSeconds;
 local string result;
 cMinutes=seconds / 60;
 cSeconds=seconds % 60;
 if(cMinutes<10)
 result$="0";
 result$=string(cMinutes);
 result$=":";
 if(cSeconds<10)
 result$="0";
 result$=string(cSeconds);
 return result;
}

Как добавить мутатор на сервер, описано в статье Как добавить мутатор на сервер.

Русский текст в сообщениях сервера (ServerAdsSE)

Мутатор ServerAdsSE выводит игрокам сообщения, например правила сервера. Если писать их в KillingFloor.ini по-русски, в игре вместо букв появляются «иероглифы». Решение из темы «ServerAdsSE на выделенном сервере» (LLIePLLIeHb):

  1. Сохраните KillingFloor.ini в кодировке Unicode (UCS-2).
  2. Поставьте файлу атрибут «только чтение». Без него сервер при запуске снова пересохраняет ini в ANSI, и русский текст ломается.
  3. Когда нужно добавить мутатор или карту, снимите атрибут, запустите сервер, чтобы он сам прописал изменения в ini, затем снова пересохраните файл в Unicode и верните «только чтение».

Изменения через WebAdmin при этом применяются, но после перезапуска сервера пропадают, потому что ini защищён от записи.

Цвет сообщений по центру экрана в ServerAdsSE задаёт строка вида cAdminMsgColor=(B=0,G=0,R=255,A=127).

Установка ServerAdsSE

По теме «Server Ads KF (Авто-сообщения в чате игры)» (kok-s). ServerAdsSE - чат-бот: выводит сообщения сервера в чат и админ-сообщения по центру экрана, настраивается и через веб-админку.

  1. Папки ServerAdsSE и web переместите в корневую папку сервера, ServerAdsSE.u - в System.
  2. В KillingFloor.ini, секция [Engine.GameEngine], добавьте ServerActors=ServerAdsSE.ServerAdsSE.
  3. В секции [UWeb.WebServer] добавьте строки ниже. Индекс [2] ставится, если строки Applications и ApplicationPaths уже есть.
Applications[2]=ServerAdsSE.WebAdmin
ApplicationPaths[2]=/ServerAdsSE
  1. Добавьте в KillingFloor.ini секцию с сообщениями:
[ServerAdsSE.ServerAdsSE]
bEnabled=True
fDelay=20.000000
sLines[0]=This is the first message!
sLines[1]=And this is the second message!
sLines[2]=#This is an Admin Message in the center of the Screen!
iAdType=0
iGroupSize=1
bWrapAround=True
iAdminMsgDuration=5
cAdminMsgColor=(B=0,G=255,R=0)

Замечания автора: больше 24 сообщений вывести не получилось; админ-сообщения пишутся с символом # в начале; для русских букв KillingFloor.ini нужно сохранить в кодировке UCS-2 Little Endian (w.a.l добавляет, что UTF-8 работать не будет). Цветовые коды из ServerColor.exe (см. выше), по словам w.a.l, работают и в обычных сообщениях ServerAdsSE, но не в админ-сообщениях.