# Half-Life в Linux на базі рушія Xash3D/FWGS Half-Life - чудова гра свого часу, яка досі має чимало шанувальників та високий онлайн. Вона стандартно працює в Linux через Steam, утім варто знати й про таку альтернативу рушія з відкритим кодом, як [Xash3D/FWGS](https://github.com/FWGS/xash3d-fwgs). ## Встановлення Для встановлення, знадобиться підтримка архітектури i386: ``` dpkg --add-architecture i386 apt update apt install build-essential gcc-multilib g++-multilib python3 libsdl2-dev:i386 libfontconfig-dev:i386 libfreetype6-dev:i386 export PKG_CONFIG_PATH=/usr/lib/i386-linux-gnu/pkgconfig ``` * приклад для Debian, для інших дистрибутивів - дивіться [README](https://github.com/FWGS/xash3d-fwgs#build-instructions) Після цього клонуємо репозиторій та збираємо бінарний пакет: ``` git clone https://github.com/FWGS/xash3d-fwgs.git cd xash3d-fwgs git submodule update --init --recursive ./waf configure -T release ./waf build ``` Коли рушій буде скомпільовано, його можна перенести у потрібну теку: ``` ./waf install --destdir=/path/to/game/directory ``` ### ARM Рушій Xash3D/FWGS підтримує різні платформи: для ігрового клієнта на смартфоні чи сервера на базі Raspberry Pi. Для такої конфігурації, потрібно зібрати декілька додаткових бібліотек з репозиторію `hlsdk-portable`: ``` bash git clone https://github.com/FWGS/hlsdk-portable.git cd hlsdk-portable ./waf configure -T release ./waf ``` Потім скопіювати наступні файли до теки `valve`: 1. `hlsdk-portable/build/cl_dll/client_armv7hf.so` > `valve/cl_dlls/client_armv7hf.so` 2. `hlsdk-portable/build/dlls/hl_armv7hf.so` > `valve/dlls/hl_armv7hf.so` ### Ігрові набори Наступним кроком, потрібно придбати ігрові асети (до якої і досі виходять оновлення). Купити гру можна безпосередньо у [Steam](https://store.steampowered.com/app/70/HalfLife/). Зробити це найкраще у свята, коли бувають розпродажі, знижки іноді сягають 90% вартості, тому можна купити повний набір Half-Life, включно з другою версією (про запуск якої в Linux поговоримо окремо). Після завантаження гри до профілю Steam, переходимо з меню до теки з файлами гри та копіюємо їх до `valve` встановленого рушія Xash3D/FWGS. Якщо при запуску буде помилка: ``` bash Host_InitError: Can't initialize cl_dlls/client.so: vgui.so: cannot open shared object file: No such file or directory ``` копіюємо файл `vgui.so` безпосередньо у кореневу теку, де встановлено Xash3D (тобто рівнем вище `valve`) ## Запуск гри Запускається гра виконанням бінарного файлу `xash3d`: ``` chmod +x xash3d xash3d -dev ``` * опція `-dev` потрібна тільки для відображення консолі (`~`) як пункту головного меню * для більш детального дебагу, вказуємо рівень, наприклад `-dev 2` Якщо все зроблено правильно, з'явиться лаунчер рушія з відповідним меню, де можна грати в одиночну гру або в мережі з друзями. ## Майстер сервер Майстер сервер використовується для пошуку ігрових серверів, відповідно усі сервери, що ви бачитимете в мультиплеєрі, відправляють свій статус майстер серверу, а той - клієнтові при виборі підключень. За замовченням, рушій використовує власний майстер `mentality.rip:27010`. Змінити його можна командою в терміналі `clearmasters` / `addmaster IP:port` а перевірити - командою `listmasters`. Також на етапі збірки, змінити можна у вихідному коді, наприклад, як це зроблено [тут](https://github.com/FWGS/xash3d-fwgs/commit/05d9cf895e180f25e6e0cbe33e3f02cd222de3b0). Якщо планується запуск власного майстер сервера, наразі існує два рішення з відкритим кодом: * [pymaster](https://github.com/YGGverse/pymaster/tree/v2) - не офіційна редакція закинутого майстер сервера на python * [xash3d-master](https://git.mentality.rip/numas13/xash3d-master) - після релізу редакції pymaster, розробник опублікував офіційну версію на Rust ### xash3d-master Коротка інструкція для збірки з репозиторію: ``` bash git clone https://github.com/FWGS/xash3d-master.git && cd xash3d-master cargo build --release sudo install target/release/xash3d-master /usr/local/bin/xash3d-master ``` * для встановлення пакетного менеджера cargo, дивіться інструкції [rustup](https://rustup.rs/). Типовий сервіс systemd виглядатиме так: ``` /etc/systemd/system/xash3d-master.service [Unit] After=network.target [Service] Type=simple User=xash3d-master Group=xash3d-master ExecStart=/usr/local/bin/xash3d-master --ip xx:xx:xx:xx StandardOutput=file:///home/xash3d-master/debug.log StandardError=file:///home/xash3d-master/error.log # Restart=on-failure [Install] WantedBy=multi-user.target ``` * даний приклад передбачає створення окремого користувача `useradd -m xash3d-master` * стандартний порт у цьому випадку - `27010`, не забуваємо його відкрити у фаєрволі! ## Ігровий сервер Для запуску ігрового серверу, використовується аналогічна збірка Xash3D та файлами з грою, запуск відбувається приблизно так: ``` xash3d -dedicated -port 27015 -ip xx:xx:xx:xx +maxplayers 8 +map crossfire ``` При цьому не забуваємо відкрити порт: ``` ufw allow 27015 ``` Налаштування серверу зберігаються у наступних файлах, по яким треба пройтись окремо * `valve/server.cfg` * `valve/skill.cfg` * `valve/listip.cfg` * `valve/banned.cfg` Щоб сервер став доступним у списку обраного майстра, потрібно також вказати: ``` sv_lan 0 public 1 ``` ### FastDL FastDL - це спосіб швидкої передачі ігрових файлів клієнтові. Звичайно організується на базі веб каталогу за допомогою Nginx. Структура файлів, що передається, має відповідати стандартному їх розташуванню у `valve`, наприклад: * `/maps` * `/models` * `/sound` * `/materials` після чого, у файлі `server.cfg` вказується шлях до цільових файлів (де `/fastdl/half-life/` - довільний шлях, якщо корінь зайнятий): ``` sv_downloadurl "http://xx.xx.xx.xx/fastdl/half-life/" sv_allowdownload 1 ``` ### RESGen [RESGen](https://github.com/kriswema/resgen) - найпростіший спосіб згенерувати файли залежностей для ігрової мапи. Наприклад, особливі моделі гравців, для подальшої передачі їх через FastDL. Для генерації текстового файлу необхідно вказати цільову мапу на сервері: ``` Linux.64-bit /valve/maps/crossfire.bsp ``` після чого буде згенеровано приблизно такий файл: ``` // crossfire.res - created with RESGen v2.0.3. // RESGen is made by Jeroen "ShadowLord" Bogers, // with serveral improvements and additions by Zero3Cool. // For more info go to http://resgen.hltools.com // .res entries (9): halflife.wad sound/ambience/jetflyby1.wav sound/ambience/siren.wav sound/debris/beamstart11.wav sound/weapons/electro5.wav sound/weapons/mortarhit.wav sound/weapons/sbarrel1.wav sprites/muzzleflash1.spr sprites/steam1.spr models/player/... // тут додаємо кастомну модель гравця ``` Отриманий файл розміщуємо у теці `/valve/maps` поряд з однойменною мапою. Таким чином (після перезапуску серверу), нові гравці, що підключились, зможуть бачити відповідні моделі замість стандартних. Моделі будуть завантажуватись усім учасникам гри до локальної теки `/valve/downloaded/models/player/` ### Боти Щоб гравцям не було самотньо в очікуванні, можна додати ботів, які наприклад будуть зникати із появою онлайну. Рішень насправді існує багато, але найбільш простий спосіб - це [Bot Number 10](http://hpb-bot.bots-united.com/downloads.html). Є офіційна [бінарна збірка для Linux](http://hpb-bot.bots-united.com/releases/bot10_linux.tgz), утім, якщо потрібно модифікувати бота, можна зібрати власну версію з початкового коду, яка є частиною [Portable Half-Life SDK](https://github.com/FWGS/hlsdk-portable/tree/bot10): ``` git clone --recursive https://github.com/FWGS/hlsdk-portable.git git checkout bot10 cmake -B build -S . cmake --build build ``` Існує також альтернативна [збірка YGGverse](https://github.com/YGGverse/hlsdk-portable/tree/bot10-yggverse), яка дозволяє запускати зконфігурованих ботів а не просто рандомних, як це зроблено в оригіналі. ## Висновки В цілому, хоч в Steam більший онлайн, Xash3D - має свою спільноту і можливості для розробки. Гра стабільно працює на стареньких PC, а для запуску власного серверу, згодиться мінімальний тариф VPS (в середньому завантаженість CPU складає 15%). Якщо тема є цікавою, можливо окремо буде описано спосіб запуску Half-Life 2 на базі рушія Source, наприклад однієї з його версій у [відкритому доступі](https://github.com/nillerusr/source-engine). ## Дивіться також * [Створення графіті для Half-Life в редакторі GIMP](https://devzone.org.ua/post/stvorennia-grafiti-dlia-half-life-v-gimp) ## Посилання * [Придбати файли гри Half-Life в Steam](https://store.steampowered.com/app/70/HalfLife/) * [Офіційна сторінка рушія Xash3D / FWGS](https://github.com/FWGS/xash3d-fwgs) * [Опис параметрів конфігурації сервера](https://www.svencoop.com/manual/server-config.html) * [Серверні запити](https://developer.valvesoftware.com/wiki/Server_queries) * [Команди майстер сервера](https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol) * [Каталог скінів](https://gamebanana.com/mods/cats/7734) * [PHP 8 / Composer бібліотека для веб-розробників](https://github.com/YGGverse/hl-php) * [Веб рушій на Symfony для організації серверу аналітики](https://github.com/YGGverse/hlstate)