Quake 3, как много в этом звуке…


За последние 16 лет, с момента выхода первой версии, q3 изменился не сильно. Не поймите неправильно — игра менялась. Развились и канули в лету турнирные моды (Привет, osp, cmpa — мы вас помним!), родился quake live в браузере, перебрался в steam. Чемпионатов стало меньше, игроков на серверах — тоже.

Но бесшабашная динамика осталась практически неизменной. В современной инкарнации, Quake Live — всё та же старая-добрая игра, вобравшая в себя все лучшие наработки за прошедшие годы.

Чего стоит только сервер minqlx, написанный на python, с поддержкой плагинов и кросс-серверной статистикой на qlstats.net, и огромный marketplace в стиме с дополнительными режимами игры, картами, звуками.

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

Инструкция актуальна для Ubuntu Server от 14.04 и выше. (в других дистрах установка minqlx может быть усложнена отсутствием python35 из коробки).

Начнём с тривиальных вещей — поставим полезный софт, откроем порты на firewall. Команды вводятся от имени root.

apt-get install -y wget fail2ban htop firewalld mc

adduser ql

firewall-cmd --permanent --zone=public --add-port=27960-27965/tcp &&
firewall-cmd --permanent --zone=public --add-port=27960-27965/udp &&
firewall-cmd --reload

порты udp использует сервер игры, tcp — сервер статистики qlstats

Установим дополнительный софт и зависимости

apt-get install -y libc6:i386 libstdc++6:i386 software-properties-common supervisor build-essential redis-server git
wget http://download.zeromq.org/zeromq-4.1.4.tar.gz; tar -xvzf zeromq-4.1.4.tar.gz; rm zeromq-4.1.4.tar.gz; cd zeromq*; ./configure --without-libsodium; make install; cd ..; rm -r zeromq*; easy_install pyzmq

Очередь за установкой собственно сервера Quake Live через Стим

mkdir /home/steam; cd /home/steam; wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz; tar -xvzf steamcmd_linux.tar.gz; rm steamcmd_linux.tar.gz
/home/steam/steamcmd.sh +login anonymous +force_install_dir /home/ql/ +app_update 349090 +quit 

После недолгого ожидания, сервер загружен в директорию ql и готов к работе. Но самое интересное только начинается — для полноценной работы понадобится установить и настроить minqlx. Список команд сервера доступен на GitHub.

cd /home/ql
wget -O - https://api.github.com/repos/MinoMino/minqlx/releases | grep browser_download_url | head -n 1 | cut -d '"' -f 4 | xargs wget &&
find -name \minqlx*.tar.gz -exec tar xvzf '{}' \; &&
find -name \minqlx*.tar.gz -exec rm '{}' \;

Настроим автообновление сервера, иначе через некоторое время клиенты не смогут к нему присоединиться:

tee /home/quakeupdate.sh <<-'EOF'
echo "updating quake live [$(date)]"
/usr/bin/supervisorctl stop all
/home/steam/steamcmd.sh +login anonymous +force_install_dir /home/ql/ +app_update 349090 +quit
/usr/bin/supervisorctl start all
EOF

chmod +x /home/quakeupdate.sh &&
echo -e "\n0 6 * * * root sh /home/quakeupdate.sh > /var/log/quakeupdate.log 2&>1;chown -R ql:ql /home/ql" >> /etc/crontab

После установки сервера — логично поставить плагины. Не буду описывать их все, остановлюсь на тех, что качаются отдельно и не входят в стандартную поставку:

branding — изменение надписей, которые показываются при подключении к серверу.
q3resolver — сопоставление старых названий карт из q3 с новыми названиями, работает только для dm и ctf карт, но можно вписать дополнительные, или задать свои шорткаты.
ratinglimiter — позволит ограничить вход на сервер игрокам с рейтингом ниже или выше заданного; для использования в конфиге должен быть включен модуль balance.
changemap — меняет карту на заданную в конфиге, когда на сервере никого нет.
pingspec — вежливо просит покинуть сервер (kick) игроков с пингом выше заданного значения.
clanspinner — свистелка для анимации клантега, просто чтобы показать, что это возможно :)
autorestart — перегружает сервер в заданное время, когда на нём нет игроков.
custom_vote — накладывает ограничения на определённые режимы голосования в игре.

git clone https://github.com/MinoMino/minqlx-plugins.git && cd ./minqlx-plugins &&
wget https://raw.githubusercontent.com/tjone270/Quake-Live/master/minqlx-plugins/branding.py &&
wget https://raw.githubusercontent.com/tjone270/Quake-Live/master/minqlx-plugins/q3resolver.py &&
wget https://raw.githubusercontent.com/tjone270/Quake-Live/master/minqlx-plugins/ratinglimiter.py &&
wget https://raw.githubusercontent.com/tjone270/Quake-Live/master/minqlx-plugins/changemap.py &&
wget https://raw.githubusercontent.com/tjone270/Quake-Live/master/minqlx-plugins/archive/beta/pingspec.py &&
wget https://raw.githubusercontent.com/tjone270/Quake-Live/master/minqlx-plugins/archive/beta/clanspinner.py &&
wget https://raw.githubusercontent.com/tjone270/Quake-Live/master/minqlx-plugins/autorestart.py &&
wget https://raw.githubusercontent.com/tjone270/Quake-Live/master/minqlx-plugins/custom_votes.py

Дело за малым — создаём файл для запуска сервера

tee /home/ql/start-server.sh <<-'EOF'
#!/bin/bash
gameport=`expr $1 + 27960`
rconport=`expr $1 + 28960`
servernum=`expr $1 + 1`
rm /home/ql/$gameport/baseq3/server.cfg
cp /home/ql/baseq3/server-$servernum.cfg /home/ql/$gameport/baseq3/server.cfg
exec /home/ql/run_server_x64_minqlx.sh +set net_strict 1 +set net_port $gameport +set sv_hostname "My best server #$servernum" +set fs_homepath /home/ql/$gameport +set zmq_rcon_enable 1 +set zmq_rcon_password "rconpassword" +set zmq_rcon_port $rconport +set zmq_stats_enable 1 +set zmq_stats_password "statpassword" +set zmq_stats_port $gameport
EOF

Обратите внимание, конфиг сервера должен находиться в директории ./baseq3/

Имя конфига — server-1.cfg для сервера на порту 27960, server-2.cfg для сервера на порту 27961 и т.д. Количество запущенных серверов регулируется через supervisor, об этом ниже.

Сперва нужно подготовить файл access.txt и вписать в него 17-значный стим-id (тот, что в урл при переходе на ваш профиль в стим) с указанием предоставить админ-доступ.

Делается это очень просто:

echo -e "\n12345678910111213|admin" >> /home/ql/baseq3/access-my.txt

В этом же файле можно прогнать неугодных (чтобы забанить игрока — нужно написать id|ban), или поощрить достойных (id|mod — модератор).

В данном случае, все сервера будут использовать один список доступа, но можно сделать и разные, по аналогии с конфигами.

Файлы можно подключать прямо во время игры:

g_accessFile "filename"
reload_access

но в этом случае ql будет их искать в директории /home/ql/номерпорта/baseq3

Чтобы сервер работал — нужен конфиг:

tee /home/ql/baseq3/server-1.cfg <<-'EOF'

set sv_tags "Location,duel,elo".
set sv_mapPoolFile "mappool_duel.txt"
set g_gametype "duel"
set g_accessFile "access-myaccess.txt"
set sv_maxClients "10"
set g_password ""
set sv_privateClients "2"
set sv_privatePassword "mypass".
set com_hunkMegs "60"

set sv_floodprotect "10"
set g_floodprot_maxcount "10"
set g_floodprot_decay "1000"

set g_voteFlags "29800"
set g_allowVote "1".
set g_voteDelay "0".
set g_voteLimit "0"
set g_allowVoteMidGame "1"
set g_allowSpecVote "0".
set g_inactivity "120"  // Kick players who are inactive for x amount of seconds.
set g_alltalk "1"
set sv_serverType "2".
set sv_master "1"
set sv_fps "40"
set sv_idleExit "120"
set sv_pure "0"
set serverstartup "map bloodrun duel"

// minqlx configuration

set qlx_owner "12345678910111213"
set qlx_plugins "plugin_manager, essentials, motd, permission, ban, silence, clan, names, log, workshop, balance, branding, changemap, pingspec, clanspinner, autorestart, custom_votes"
set qlx_balanceUrl "qlstats.net"
set qlx_balanceApi "elo"  // "elo_b" - для 4fun серверов, скрывает реальный рейтинг
set qlx_protectedPerm "3"
set qlx_defaultMapToChangeTo "bloodrun"
set qlx_defaultMapFactoryToChangeTo "duel"
set qlx_pingSpecSecondsBetweenChecks "30"
set qlx_pingSpecMaxPing "120"
set qlx_rulesetLocked "1"
set qlx_disablePlayerRemoval "0"
set qlx_disableCvarVoting "1"
set qlx_cvarVotePermissionRequired "3"

// branding

set qlx_serverBrandName "MY Server #1"
set qlx_serverBrandTopField "server admin : player"
set qlx_serverBrandBottomField "Some text here"
set qlx_connectMessage "welcome to server"
set qlx_loadedMessage "Please be respectfull to each other"
set qlx_countdownMessage "Be good or be dead. GL & HF!"
set qlx_endOfGameMessage "Good Game!"

reload_access
reload_mappool
EOF

Осталось совсем немного! На всякий случай, переопределим владельца в директории /home/ql:

chown -R ql:ql /home/ql

Сервер настроен, осталось убедиться, что он будет работать всегда, когда потребуется. Не зря же мы ставили supervisor?

tee /etc/supervisor/conf.d/ql.conf <<-'EOF'
[program:quakelive]
command=/bin/bash -c "exec /home/ql/start-server.sh %(process_num)s"
user=ql
process_name=ql_%(process_num)s
numprocs=3
autorestart=true
EOF

service supervisor restart

данный конфиг запустит 3 инстанса quake live с портами 27960, 27961, 27962, и будет перезапускать их в случае зависания, а так же запускать при перезагрузке сервера. Для управления вручную используется supervisorctl start/stop/restart all/ql_1

Ну и напоследок — если хотите, чтобы статистика на вашем сервере собиралась и учитывалась — зарегистрируйте сервера на сайте qlstats.net:8084/servers.html, используя пароль из скрипта запуска start_server.sh, строка zmq_stats_password.

Чуть не забыл! Для добавления контента, отредактируйте файл /home/ql/baseq3/workshop.txt.

cat /home/ql/baseq3/workshop.txt
# specify 1 workshop item id per line, ex:
# 494372396
# 441344649

Контент вот здесь. Айди проще всего скопировать из url понравившегося дополнения. Кстати, тут есть старый добрый дефраг со всеми возможными картами ;)

Не забудьте перезапустить сервера после добавления новинок!

supervisorctl restart all

Пожалуй, на этом всё. Надеюсь, эта информация будет полезной — полноценного howto по установке серверов Quake Live на русском я не встречал, что и сподвигло на написание этой заметки.

Данные настройки позволяют серверу кроме всего прочего работать со статистикой игроков, просмотр во время игры — при помощи команды !elo. Рейтинг высчитывается автоматически, на основании всех игр на всех серверах, поставляющих статистику на qlstats.net.

До 1500 — обычные игроки, от 1600 и выше — те, кто играют почаще и получше, от 2000 — профи и киборги-убийцы, отдавшие богу квейка мозг, сердце, и большую часть свободного времени :)

Послесловие.

Некоторые технически продвинутые читатели с недоумением подумают — зачем всё это, если есть докер, и будут отчасти правы. Отчасти потому, что найденные мною образы меня не устроили. Инструкция писалась по мере настройки собственного сервера, как основа для собственного образа.

Благодарю за внимание. GL & HF!

P.S. Пожалуйста, грамматические и стилистические ошибки — присылайте в личку, обязательно исправлю. Ошибки и/или best practice по стилю написания статьи, использованию команд linux — пожалуйста, оставляйте в комментариях.
Поделиться с друзьями
-->

Комментарии (38)


  1. Boomburum
    21.12.2016 18:04
    +6

    Вижу q3dm6 на первой фотке, в ожидании красной брони ))


    1. stas404
      21.12.2016 18:15
      +1

      В данном случае — зеленой ))


      1. Stkn
        21.12.2016 23:44
        +1

        В данном случае — зелёной, а вообще не красной, а жёлтой, если речь о дуэльной карте в quakelive


    1. artemonster
      21.12.2016 18:59

      сразу видно — не про :)


      1. Boomburum
        21.12.2016 21:57

        На про не претендовал, но насколько помню из школьных уроков информатики, в q3arena на этом месте была красная бронька )


        1. Dexciter
          21.12.2016 23:44
          +5

          смотря какой режим, в режиме дуэли тут желтая, а в режиме TDM — красная.

          а зеленая вообще есть только на campgrounds-intel — тоже q3dm6, спонсорская, синего цвета.


    1. QtRoS
      22.12.2016 00:02

      Без занудства — тоже с удовольствием узнал карту даже в такой раскраске!


  1. acmnu
    21.12.2016 19:44
    +1

    Впервые увидил, что кто-то пользуется firewalld. Обычно инструкции в интернете сводятся к тому как его выпилить.


    1. alpik
      21.12.2016 23:43

      чем он плох? не холивара ради, я начинал админить с centos7, где он включен по умолчанию, и если и видел где в туториалах что его отключают, то не вникал, зачем — удобно же.


      1. acmnu
        22.12.2016 00:01

        Да кто же его знает. Вот ты лучше скажи зачем он в принципе на сервере? Для сложного файрвола он не годится: его концепции вводят слишком много ограничений, которые будут мешаться. А для простого серверного случая комбайн с управлением по DBUS это какой-то оверкилл. Если в нем будет какая-то непонятка то дебажить придется все через тот же iptables trace, а куча паразитных цепочек нагенереных firewalld будут мешать.


        1. alpik
          22.12.2016 02:17

          Я не так давно взялся за администрирование linux, и опыта пока маловато для аргументированой дискуссии :-)
          Мне firewalld понравился простотой в настройке. И пока не было ситуации, когда от фаервола мне нужно было бы что-то сложнее, чем открыть несколько нужных портов.

          Благодарю за ответ, на будущее учту, что необходимо разобраться с iptables.


    1. Nikobraz
      22.12.2016 09:29

      Хм, сегодня только впервые с ним встретился. До прочтения вашего коммента, думал что это обертка для iptables. По-крайней мере конфиги с него подхватывает.


      1. acmnu
        22.12.2016 11:09

        Это и есть обертка по типу shorewall или ещё чего подобного. Сделана она, в принципе, с благой целью, чтоб создать нечто подобное виндовому десктопному файрволу.


  1. anthonyr
    21.12.2016 19:59

    Если кто-то хочет КПДВ в более высоком разрешении — http://sst13.de/beta.php

    К сожалению, только 1024x768.


    1. alpik
      21.12.2016 23:57
      +1

      full-hd подойдёт ?



      1. anthonyr
        22.12.2016 04:58

        По пикселю с каждой стороны кто-то украл :-)

        И броня явно не fullhd. Но спасибо, очень даже пойдет.


        1. alpik
          22.12.2016 09:10

          Точно, я и забыл про текстуры для айтемов :-)
          Да и графику нужно получше выставить для скриншотов, а то я только picmip убрал.
          Пикселя нет т.к. выделялись вручную.


  1. Alyoshka1976
    21.12.2016 21:57

    Статья, вызвавшая чувство ностальгии… Quake (первая версия) занимал 19 дискет :-)


  1. TriLka
    21.12.2016 23:49
    -6

    Квейк никогда не нравился, но пару раз играл. Он похож на первую картинку. И у меня опять возник вопрос, какой возникал и ранее. Почему в квейке кривые стены?


    1. alpik
      21.12.2016 23:50

      никогда не обращал внимания. а они разве кривые?


    1. danfe
      22.12.2016 05:04

      Если у вас квейк был похож на первую картинку, может быть, это были неправильные пчелы был неправильный квейк?

      (Кстати, в первом и втором стены не могут быть кривыми: т.н. «патчи» (patch definitions, curves), позволяющие создавать кривые поверхности, появились только в третьем. ;-)


    1. marxfreedom
      22.12.2016 09:04
      +1

      игроки увеличивают угол обзора камеры чтобы лучше видеть :)


      1. alpik
        22.12.2016 09:16

        О, точно, может это про fov?
        Большие углы так же создавали иллюзию большей скорости перемещения, в основном высокие значения ставили неопытные игроки.


        1. danfe
          22.12.2016 09:25

          На самом деле fov — штука очень индивидуальная (как и сенса, акселерация, invert mouse), и с опытом/уровнем игры коррелирует слабо. У нас в универе на дефолтных 90 градусах почти никто не играл, обычно у народа было где-то в пределах 110-130, а игроки там были очень сильные. Причем в Q1/QW у меня всегда было 120, а вот для Q2 я в итоге снизил до 108.


          1. alpik
            22.12.2016 09:36

            Сильный игрок понятие достаточно субъективное, в конфигах у про игроков fov выше 110 практически не встречается. И на серверах в режиме спектатора fov того, за кем смотришь. Большие значения встречаются намного реже, чем когда-то в компьютерных клубах.
            Я начинал со 110, через сколько-то лет перешёл на 100, на большой fov с тех пор смотрю с лёгким недоумением :)


            1. danfe
              22.12.2016 11:38
              +1

              В общем-то да, 100-110 — пожалуй, самые ходовые значения. Хотя вот любопытства ради глянул конфиги некоторых известных игроков (понятно, что у многих он менялся со временем и вообще зачастую динамический; я старался найти тех, у кого он более-менее постоянный); удивился, что у многих таки fov 90-100:

              • Q2: purry 110, damiah 90, polosatiy 110
              • QL (по квейкконам 2013-2015 и DHS 2011): rapha 103, dahang 100 (было 108), evil 92 (было 100), toxjq 103, cooller 90, cypher 90

              Вообще я с легким недоумением смотрю как на fov 120, так и 90. :-)


  1. aso
    22.12.2016 07:53

    Почему в квейке кривые стены?


    Проэкцыя?
    В смысле — проекция 3d-окружения на плоскость экрана?


  1. den_admin
    22.12.2016 08:58

    В приступе ностальгии я вспомнил, что давно-давно и школе/институте была сборка quake I и quake II на одной дискете и на двух соответственно. Там была вроде одна карта и боты.

    У себя нашел только Q2, а про Q1 в инете все ссылки дохлые.
    Может у кого-то есть в архиве? Хочу у себя сохранить, истории для :)


    1. danfe
      22.12.2016 09:18

      Цитирую: «На рутрекере же полно сборок с графомодами и текстурами на любой вкус. GTX970 нагибают только так.»


  1. sdi74
    22.12.2016 11:17

    шестая карта, любимая! )


    1. danfe
      22.12.2016 18:54

      Вот да, в Q3 играл очень мало, но эта карта (в pro-варианте) нравилась больше прочих почему-то. Я уже хотел было написать, что, мол, неудивительно, еще один шедевр Тима Виллитса, но решил для надежности погуглить, и внезапно возникли сомнения.

      Впрочем, у Тима (если-таки допустить, что он имел какое-то отношение к q3dm6) были и откровенно неудачные карты, та же DM5 (The Cistern) из первой кваки. Её погубила главным образом комната с RL за дверью, но вообще она меня и по сей день притягивает какой-то своей неуловимой «стохастичностью». Я всё лелею надежду как-нибудь переделать её для Q2 в более играбельном варианте.


  1. Alabastr
    22.12.2016 11:22

    А можно каким-либо способом опрашивать сервер для вывода хотя бы онлайна на сайт? последний раз когда пробовал — ни одна реализация не работала (кл только перешел в стим на тот момент).


    1. alpik
      22.12.2016 12:09

      На NodeJs что-то есть вот тут, не пробовал.


    1. Softer
      30.12.2016 12:07

      Пользуюсь таким модулем — вроде работает для q2 и есть поддержка q3


  1. vanburg
    22.12.2016 15:39
    +1

    Недавно баловался, хотел поднять штук пять в режиме чистого instagib (не freeze tag), очень мало серваков с этой фабрикой, но добавление себя админом не заработало.
    Потом свободное время кончилось, и ограничился созданием как обычно в виде себя в качестве временного «сервера».
    Жду выходных для второго подхода :) Попробую внимательнее изучить как у вас этот момент заработал.
    Единственное, хочу заменить supervisord на open-rc, благо сервак на генте.


    1. alpik
      22.12.2016 15:44

      чуть больше полугода назад я поднимал insta midair rocket на dm17 — вот это веселье было :)
      рокет убивает только в воздухе, стрельба под ноги подбрасывает, но не наносит демеджа.
      сервак был не очень популярный, но несколько ценителей находилось.

      а инстагиб в ql после инстагиба в warsow мне слишком медленный… :)


      1. vanburg
        22.12.2016 15:53

        Я тихо фигею от количества фабрик, которые есть в воркшопе. Надо тоже попробовать мидейр рокет. У вас есть, кстати, любимые, а то так опять выходных не хватит все перепробовать :) Такие, чтоб подинамичнее :)


        1. alpik
          22.12.2016 18:41

          куда там, несколько раз в месяц с другом дуельку сыграть — уже зачастил )
          интересно Red Rover попробовать как-нибудь, из стандартной поставки.