Следующей свободной и бесплатной игрой, привлекшей мое внимание, стала 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. Этот файл отвечает за ротацию карт в игре, т.е. в нем указано какие и в каком порядке будут сменяться карты.
На официальном сайте описаны возможные режимы игры, вот они:
- Bomb & Defuse (Bomb — gametype 8) Бомба и разминирование. Красная команда выполняет роль атакующей и в течение отведенного времени пытается заложить бомбу в одном из двух стратегически важных местах, обозначенных на карте пульсирующим значком. Синяя команда защищает это место и, либо пытается убить всю команду красных, либо обезвредить заложенную бомбу. После того, как бомба заложена, отсчет времени раунда останавливается и таймер бомбы начинает обратный отсчет до детонации. Заложенная бомба либо взрывается, либо будет обезврежена защищающейся командой.
- Capture & Hold (C&H — gametype 6) Захват и удержание. На карте расположены многочисленные флаги или точки для захвата. Когда вы захватываете точки, их цвет изменяется на цвет вашей команды (красный или синий). Каждую минуту ваша команда получает очки за каждый флаг цвета вашей команды. Ваша цель заключается в удержании, как можно большего количества флагов определенное время. Если вас убьют, вы возрождаетесь после небольшой задержки.
- Capture the Flag (CTF — gametype 7) Захват флага. У каждой команды есть своя база, на которой находится ее флаг. Цель команды — захватить флаг на базе противника и принести его на свою базу. Вы не должны дать врагу сделать то же самое. Если вы были убиты, через некоторое время вернетесь в игру.
- Free for All (FFA — gametype 0) Каждый сам за себя. В этом динамическом режиме игры каждый игрок играет сам за себя. После истечения времени раунда победителем становится игрок с наибольшим количеством убитых врагов. Если вы были убиты, вы возродитесь после небольшой задержки в случайном месте карты.
- Follow the Leader (FTL — gametype 5) Следование за лидером. В начале каждого раунда сервер выбирает одного человека в вашей команде в качестве лидера. Лидер обозначается красной или синей каской. У вашей команды также есть флаг. Ваша цель — получить как можно больше очков. Однако, только лидер может получать очки от прикосновения к вражескому флагу. Раунд заканчивается, когда лидер касается вражеского флага или одна из команд будет убита. Если вы были убиты, вы не возрождаетесь до конца раунда.
- Team Deathmatch (TDM — gametype 3) Командный десматч. Ваша цель заключается в получениии очков для вашей команды за уничтожение членов противоположной команды. После истечения времени раунда или достижения установленного количества фрагов раунд завершается и командой-победителем становится команда, уничтожившая большее количество врагов. Если вы были убиты, вы возрождаетесь в случайном месте карты после небольшой задержки.
- 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
Большое спасибо! А то долго не мог найти что-то подобное!
Пожалуйста, пользуйтесь.
А можете сказать как сделать что-бы сервер был виден всем. А не только локал.
Сделать так, чтобы сервер с UrT был доступен из вне (пробросить порт, физически предоставить белый адрес, VPN и т.д.)
А можно как-то, поподробней. Спасибо.
Я использовал UrT для игры именно в локальной сети, в связи с чем, собственно, и написал эту статью. К моему локальному серверу подключались игроки извне при помощи VPN (устанавливается VPN-соединение и после этого внешний комп является членом локальной сети и получает соответствующий адрес из этой сети — дальше все по обычной схеме, как для локального компьютера). Поподробней описать, пожалуй, не получится ввиду того, что это можно (или возможно) сделать разными способами в зависимости от конкретных условий. Также, нужно понимание работы локальных, глобальной сетей и организации их взаимодействия. Могу описать только общие принципы: для подключения ограниченной группы игроков будет вполне достаточно VPN, для общедоступного сервера необходимо организовать возможность доступа к серверу из глобальной сети — это может быть проброс портов на роутере, использовние «белого» адреса в Интерент для интерфейса сервера, если внешний адрес динамический, придется позаботиться о его доступности через доменное имя (DynDNS). Вобщем, если есть желание это сделать, придется разбираться с соответствующими технологиями и их настройкой (Google). Удачи!
Было бы хорошо сделать статью, что-бы сервер было видно в самой игре всем. Даже на своем примере.
Может быть, когда-нибудь напишу. Сейчас для меня это не совсем актуально. Я не думаю, что реализация общедоступного сервера — очень сложная задача, при наличии желания вполне реализуемо.
Буду ждать) спасибо.