mirror of
https://codeberg.org/postscriptum/devzone.org.ua.git
synced 2026-02-19 22:12:39 +00:00
224 lines
No EOL
13 KiB
Markdown
224 lines
No EOL
13 KiB
Markdown
# 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) |