Запуск в локальной сети выделенного сервера Urban Terror на Debian


urbanterrorСледующей свободной и бесплатной игрой, привлекшей мое внимание, стала Urban Terror. Немного об этой игре. Итак, как написано на одном из игровых сайтов в Интернете, Urban Terror (Городской Террор) — качественный мультиплеерный трехмерный шутер от первого лица под Linux. Игру Urban Terror многие сравнивают с Counter Strike и это неслучайно. Игровой процесс, тактика и атмосфера действительно очень похожи на Counter Strike. В игре представлено семь игровых режимов, широкий выбор оружия и снаряжения.

Urban Terror это полностью мультиплеерная игра. Для того, чтобы подключиться к какому-либо серверу, достаточно нажать в меню Play Online и выбрать из списка доступных серверов любой понравившийся. Вы также можете отсортировать сервера по доступности или, например, сделать выборку по режимам игры.

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

Urban Terror распространяется бесплатно, но лицензия запрещает модификацию и продажу игры. Движок игры ioQuakeEngine (ioQuake) распространяется бесплатно.

Игра доступна под Linux, Windows и Mac Os.

Оглавление

Установка выделенного сервера

Предполагается, что операционная система для сервера (Debian) уже установлена и, таким образом, останавливаться на этом не будем.

Создаем нового пользователя, от имени которого будет работать сервер игры (пусть это будет пользователь ut):

# adduser ut

Добавляем пользователя в группу sudo:

# usermod -a -G sudo ut

Устанавливать будем последнюю на момент написания статьи версию 4.2.017 («весит» архив около 1,7 Гб). Заходим под нашим пользователем, качаем в домашний каталог пакет с игрой и распаковываем его (пакет можно взять на официальном сайте):

$ wget http://www.formulaworld.net/uploads/urt/UrbanTerror42_full017.zip
$ unzip UrbanTerror42_full017.zip

Хотелось бы отметить, что данный пакет не требует установки и после его распаковки мы получаем готовые к использованию выделенные серверы и клиенты для Linux, Windows и, судя по описанию разработчиков, Mac (сам для Mac не пробовал, ввиду отсутствия такового).

В результате получаем в домашней папке каталог UrbanTerror42 и, для упрощения обращения к находящимся в нем файлам, переименовываем его:

$ mv UrbanTerror42/ urbanterror/

Настройка сервера

Настройки сервера довольно неплохо описаны на официальном сайте игры и в комментариях в файле server_example.cfg. Остановлюсь только на основных моментах.

В каталоге ~/urbanterror/q3ut4/ расположен файл server_example.cfg, который мы копируем в server.cfg и, который будет основным конфигурационным файлом нашего выделенного сервера Urban Terror.

Аналогично поступаем с файлом mapcycle_example.txt и переименовываем его в mapcycle.txt. Этот файл отвечает за ротацию карт в игре, т.е. в нем указано какие и в каком порядке будут сменяться карты.

На официальном сайте описаны возможные режимы игры, вот они:

  1. Bomb & Defuse (Bomb — gametype 8) Бомба и разминирование. Красная команда выполняет роль атакующей и в течение отведенного времени пытается заложить бомбу в одном из двух стратегически важных местах, обозначенных на карте пульсирующим значком. Синяя команда защищает это место и, либо пытается убить всю команду красных, либо обезвредить заложенную бомбу. После того, как бомба заложена, отсчет времени раунда останавливается и таймер бомбы начинает обратный отсчет до детонации. Заложенная бомба либо взрывается, либо будет обезврежена защищающейся командой.
  2. Capture & Hold (C&H — gametype 6) Захват и удержание. На карте расположены многочисленные флаги или точки для захвата. Когда вы захватываете точки, их цвет изменяется на цвет вашей команды (красный или синий). Каждую минуту ваша команда получает очки за каждый флаг цвета вашей команды. Ваша цель заключается в удержании, как можно большего количества флагов определенное время. Если вас убьют, вы  возрождаетесь после небольшой задержки.
  3. Capture the Flag (CTF — gametype 7) Захват флага. У каждой команды есть своя база, на которой находится ее флаг. Цель команды —  захватить флаг на базе противника и принести его на свою базу. Вы не должны дать врагу сделать то же самое. Если вы были убиты, через некоторое время вернетесь в игру.
  4. Free for All (FFA — gametype 0) Каждый сам за себя. В этом динамическом режиме игры каждый игрок играет сам за себя. После истечения времени раунда победителем становится игрок с наибольшим количеством убитых врагов. Если вы были убиты, вы возродитесь после небольшой задержки в случайном месте карты.
  5. Follow the Leader (FTL — gametype 5) Следование за лидером. В начале каждого раунда сервер выбирает одного человека в вашей команде в качестве лидера. Лидер обозначается красной или синей каской. У вашей команды также есть флаг. Ваша цель —  получить как можно больше очков. Однако, только лидер может получать очки от прикосновения к вражескому флагу. Раунд заканчивается, когда лидер касается вражеского флага или одна из команд будет убита. Если вы были убиты, вы не возрождаетесь до конца раунда.
  6. Team Deathmatch (TDM — gametype 3) Командный десматч. Ваша цель заключается в получениии очков для вашей команды за уничтожение членов противоположной команды. После истечения времени раунда или достижения установленного количества фрагов раунд завершается и командой-победителем становится команда, уничтожившая большее количество врагов. Если вы были убиты, вы возрождаетесь в случайном месте карты после небольшой задержки.
  7. Team Survivor (TS — gametype 4) Командное выживание. Ваша цель уничтожить команду противника. Раунд заканчивается, когда все члены одной команды погибают, а команде, у которой остались выжившие игроки, начисляется очко. Если вы были убиты, вы не можете возродится до следующего раунда.

За настройку режима игры отвечает значение параметра g_gametype в разделе «GENERAL GAMEPLAY SETTINGS» файла server.cfg.

Организация запуска сервера

Запускать наш сервер будем демоном. Для этого ставим пакет daemon:

$sudo apt-get install daemon

С правами администратора создаем в каталоге /etc/init.d файл ut_ded следующего содержания:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          ut_ded
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example initscript for an UrbanTerror server
# Description:       Starts a dedicated UrbanTerror server and allows 
# it to be started/stopped/restarted with init.d
### END INIT INFO

# Author: Poul Sander <openarena@poulander.com>
#
# Please remove the "Author" lines above and replace them
# with your own name if you copy and modify this script.

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="UrbanTerror dedicated server"
NAME="ut_ded"

#The following line should be the server arguments:
SERVER_ARGS="+set fs_game q3ut4 +set net_port 27962 +set com_hunkmegs 128 +exec server.cfg"

# 1==LAN, 2==Internet
DEDICATED_ARG="+set dedicated 1"

DAEMON_ARGS="$DEDICATED_ARG $SERVER_ARGS"

# The executable to use:
DAEMON=/home/ut/urbanterror/Quake3-UrT-Ded.i386

SCRIPTNAME=/etc/init.d/$NAME

#The game will be executed as this user. NEVER execute as root
USERNAME=ut

#USERNAME must have write access to the HOMEDIR
#Note that it is not enough to pass +set fs_homepath /path/to/ to a writeable location.
HOMEDIR=/home/$USERNAME

# Exit if the package is not installed
#[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    daemon --name="$NAME" --user=$USERNAME --running && return 1 
    daemon --name="$NAME" --respawn --user=$USERNAME --output=/home/ut/utded.out --env=HOME=$HOMEDIR  $DAEMON $DAEMON_ARGS > /dev/null
    # We do not check if it has been succesfully started as there are not other startup processed that can depend on OpenArena
}

#
# Function that stops the daemon/service
#
do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    daemon --name=$NAME --user=$USERNAME --running ] || return 1
    daemon --name=$NAME --user=$USERNAME --stop
    # Wait for children to finish too if this is a daemon that forks
    # and if the daemon is only ever run from this initscript.
    # If the above conditions are not satisfied then add some other code
    # that waits for the process to drop all resources that could be
    # needed by services started subsequently.  A last resort is to
    # sleep for some time.
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
    #
    # If the daemon can reload its configuration without
    # restarting (for example, when it is sent a SIGHUP),
    # then implement that here.
    #
    return 0
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  #reload|force-reload)
    #
    # If do_reload() is not implemented then leave this commented out
    # and leave 'force-reload' as an alias for 'restart'.
    #
    #log_daemon_msg "Reloading $DESC" "$NAME"
    #do_reload
    #log_end_msg $?
    #;;
  restart|force-reload)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
    do_start
    case "$?" in
        0) log_end_msg 0 ;;
        1) log_end_msg 1 ;; # Old process is still running
        *) log_end_msg 1 ;; # Failed to start
    esac
    ;;
      *)
        # Failed to stop
    log_end_msg 1
    ;;
    esac
    ;;
  *)
    #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
    echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
    exit 3
    ;;
esac

Данный файл необходимо откорректировать под свои нужды или оставить как есть в случае, если не изменялись приведенные в этой статье имя пользователя, под которым будет работать сервер (ut), путь к каталогу с файлами (/home/ut/urbanterror/) и порт, который будет слушать сервер (27962). По-умолчанию сервер UT слушает порт 27960, однако, если по каким-либо причинам этот порт уже занят (например, на этом же компьютере работает другой игровой сервер), порт можно сменить отредактировав следующую строку файла ut_ded:

SERVER_ARGS="+set fs_game q3ut4 +set net_port 27962 +set com_hunkmegs 128 +exec server.cfg"

Добавляем его в автозапуск:

$ sudo update-rc.d ut_ded defaults 19

Перегружаемся и проверяем старт нашего сервера:

ut@gameserver:~$ ps aux |grep ut
ut        1426  0.0  0.0   2192   544 ?        S    11:11   0:00 daemon --name=ut_ded --respawn --user=ut --output=/home/ut/utded.out --env=HOME=/home/ut /home/ut/urbanterror/Quake3-UrT-Ded.i386 +set dedicated 1 +set fs_game q3ut4 +set net_port 27962 +set com_hunkmegs 128 +exec server.cfg
ut        1427  5.2 12.7 172096 92064 ?        S    11:11   0:01 /home/ut/urbanterror/Quake3-UrT-Ded.i386 +set dedicated 1 +set fs_game q3ut4 +set net_port 27962 +set com_hunkmegs 128 +exec server.cfg
root      1725  1.0  0.4   9136  2956 ?        Ss   11:11   0:00 sshd: ut [priv]  
ut        1727  0.0  0.2   9136  1660 ?        S    11:11   0:00 sshd: ut@pts/0   
ut        1728  1.3  0.3   7000  2580 pts/0    Ss   11:11   0:00 -bash
ut        1739  0.0  0.1   5912  1096 pts/0    R+   11:11   0:00 ps aux
ut        1740  0.0  0.1   5144   796 pts/0    S+   11:11   0:00 grep ut

Если вывод команды похож на этот — значит сервер запустился.

Управление демоном ut_ded осуществляется следующим образом:

  • запуск
$ sudo /etc/init.d/ut_ded start
  • останов
$ sudo /etc/init.d/ut_ded stop
  • перезагрузка
$ sudo /etc/init.d/ut_ded restart

Работающий демон ведет лог, который расположен в домашнем каталоге и называется utded.out. Если вдруг при перезагрузке демона будет выведено сообщение о сбое, вводим команду перезапуска повторно и демон перезапустится.

Для игры необходимо подключиться клиентом на IP-адрес и порт сервера.

Клиенты

Как уже упоминалось выше, в каталоге с игрой находятся как файлы для запуска сервера, так и клиенты для Linux, Windows и Mac. Клиенты для Linux — это Quake3-UrT.i386 и Quake3-UrT.x86_64 (для 32 и 64 разрядных систем, соответственно), для Windows — Quake3-UrT.exe и Quake3-UrT-no-SSE2.exe (для процессоров, не поддерживающих SSE2 инструкции — процессоры ниже, чем Athlon, Pentium 3 или 4, некоторые Celeron), для Mac отведен каталог Quake3-UrT.app. Исполняемые файлы, в имени которых присутствует «Ded», предназначены для запуска выделенного сервера.

Для подключения к запущенному нами серверу запускаем соответствующий вашей системе клиент, указываем имя игрока и настраиваем необходимые параметры. Как я понял из существующих в клиенте меню, подключение к серверу в локальной сети возможно только с помощью параметров Favorite (play online — Source: Favorites — Create Favorite), однако, у меня сервер находился не всегда и как-то неуверенно. Поэтому рекомендую запускать клиент с использованием следующей опции к исполняемому файлу: +connect 192.168.0.182:27962. Запуск с использованием этой опции можно оформить в виде исполняемого файла:

  • для Linux исполняемым файлом start.sh (не забываем дать файлу права на исполнение: chmod +x start.sh):
#!/bin/bash
/home/ut/urbanterror/Quake3-UrT.i386 +connect 192.168.0.182:27962
  • для Windows пакетным bat-файлом. Создаем файл, например, start.bat следующего содержания (в каталоге с исполняемым файлом клиента):
Quake3-UrT.exe +connect 192.168.0.182:27962

Также, можно подключиться к серверу в локальной сети, используя консоль игры (вызывается нажатием клавиши ~ после загрузки игры):

/connect 192.168.0.182:27962

Добавление новых карт

Добавление новых карт осуществляется довольно просто: скачивается карта (файл в формате .pk3) и копируется в каталог ~/urbanterror/q3ut4 сервера. Для игры на этой карте клиент также должен ее иметь. Это организуется двумя способами: карта копируется в этот же каталог на клиенте либо настраивается автозагрузка карт клиентом непосредственно с сервера. С копированием карты на клиент все понятно, но это не есть удобно, поэтому рассмотрим вариант загрузки карт с нашего сервера. Итак:

1. На нашем сервере устанавливаем и настраиваем web-сервер в необходимой нам минимальной конфигурации. Его настройка описана в этой статье. Создаем каталог /home/www/UT/q3ut4, копируем туда и в каталог /home/ut/urbanterror/q3ut4 карты (файлы в формате *.pk3) и перезапускаем nginx:

$ sudo service nginx restart

Заходим в браузере на наш web-сервер и, если видим список файлов и каталогов из /home/www, значит все в порядке.

2. Web-сервер установлен и функционирует, далее, нужно внести коррективы в конфиг сервера игры, указав ему, чтобы он перенаправлял клиентов для скачивания отсутствующих файлов на наш web-сервер. Изменяем приведенные ниже значения в файле /home/ut/urbanterror/q3ut4/server.cfg следующим образом:

sets sv_dlURL            "http://192.168.0.182/UT" //Указываем адрес нашего web-сервера
set  sv_allowDownload    "1" //Разрешаем клиентам скачивать карты с нашего сервера

3. Добавляем новую карту в конфигурационный файл ротации карт. Ранее мы создали файл /home/ut/urbanterror/q3ut4/mapcycle.txt, который, как раз, и отвечает за ротацию карт на сервере. Добавляем название нашей карты в этот файл (как правило, это имя файла без .pk3) отдельной строкой в том порядке, в котором она должна загружаться сервером. Файл ротации карт указан в следующем параметре server.cfg:

set  g_mapcycle         "mapcycle.txt"   // Name of mapcycle-file, located in q3ut4 directory

Также, основной конфиг сервера server.cfg содержит параметр, указывающий с какой карты начинается игра (с дальнейшим «перебором» их сверху вних и опять сначала списка):

map  ut4_casa           // What map to start with?

Перезапускаем демон ut_ded:

$ sudo /etc/init.d/ut_ded restart

Материалы по теме

Официальный сайт игры

Дополнительные карты со скринами

Еще карты со скринами

Как стать ниндзя в Urban Terror

9 thoughts on “Запуск в локальной сети выделенного сервера Urban Terror на Debian

  1. А можете сказать как сделать что-бы сервер был виден всем. А не только локал.

    • Сделать так, чтобы сервер с UrT был доступен из вне (пробросить порт, физически предоставить белый адрес, VPN и т.д.)

    • Я использовал UrT для игры именно в локальной сети, в связи с чем, собственно, и написал эту статью. К моему локальному серверу подключались игроки извне при помощи VPN (устанавливается VPN-соединение и после этого внешний комп является членом локальной сети и получает соответствующий адрес из этой сети — дальше все по обычной схеме, как для локального компьютера). Поподробней описать, пожалуй, не получится ввиду того, что это можно (или возможно) сделать разными способами в зависимости от конкретных условий. Также, нужно понимание работы локальных, глобальной сетей и организации их взаимодействия. Могу описать только общие принципы: для подключения ограниченной группы игроков будет вполне достаточно VPN, для общедоступного сервера необходимо организовать возможность доступа к серверу из глобальной сети — это может быть проброс портов на роутере, использовние «белого» адреса в Интерент для интерфейса сервера, если внешний адрес динамический, придется позаботиться о его доступности через доменное имя (DynDNS). Вобщем, если есть желание это сделать, придется разбираться с соответствующими технологиями и их настройкой (Google). Удачи!

  2. Было бы хорошо сделать статью, что-бы сервер было видно в самой игре всем. Даже на своем примере.

    • Может быть, когда-нибудь напишу. Сейчас для меня это не совсем актуально. Я не думаю, что реализация общедоступного сервера — очень сложная задача, при наличии желания вполне реализуемо.

Оставьте комментарий