devzone.org.ua/post/half-life-v-linux-na-bazi-rushiia-xash3dfwgs.md
2025-11-01 14:28:20 +02:00

224 lines
No EOL
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)