howto-db/data/pages/yggdrasil/games/half_life_on_xash3d.txt
2024-02-10 12:53:55 +00:00

407 lines
24 KiB
Plaintext
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 на базе Xash3D ======
Недавно появился [[yggdrasil:sites_and_services:other_network_services#half-life|внутрисетевой сервер Half-Life]] на базе движка Xash3D FWGS.
Стало интересно разобраться в особенностях IPv6 / Yggdrasil и создать этот материал для тех, кто захочет поднять внутрисетевой сервер с нуля и кастомизировать его в дальнейшем.
===== Half-Life =====
Half-Life - всем известный шутер от первого лица, за 20 лет не утративший свою популярность.
Технические требования минимальны, игра работает даже на компьютерах без предустановленных видео-драйверов.
===== Xash3D FWGS =====
[[https://github.com/FWGS/xash3d-fwgs|Xash3D FWGS]] - это мульти-платформенный движок с открытым кодом для запуска файлов игры Half-Life 1, с некоторыми доработками оригинального [[https://www.moddb.com/engines/xash3d-engine|Xash3D]].
Файлы самой игры Half-Life нужно приобрести отдельно, затем скопировать в директорию valve с установленным Xash3D FWGS.
Для сборки и запуска необходимо добавить поддержку библиотек архитектуры ''i386'':
<code>
dpkg --add-architecture i386
apt update
apt install build-essential gcc-multilib g++-multilib python3 libsdl2-dev:i386 libfontconfig-dev:i386 libfreetype6-dev:i386
</code>
При возникновении ошибки запуска в последних версиях
<code>
Host_InitError: Can't initialize cl_dlls/client.so: vgui.so: cannot open shared object file: No such file or directory
</code>
нужно скопировать файл ''vgui.so'' уровнем выше директории valve
<code>
~/.steam/steam/steamapps/common/Half-Life/
</code>
===== Xash3D FWGS / YGGverse Edition =====
[[https://github.com/YGGverse/xash3d-fwgs/branches|Xash3D FWGS YGGverse Edition]] основан на ветке master от Xash3D FWGS, целью проекта является создание сборки, ориентированной на сеть Yggdrasil.
В рамках разработки осуществляются обратно-совместимые контрибуции.
==== Ветки ====
* [[https://github.com/YGGverse/xash3d-fwgs/tree/master|master]] - зеркало официальной master от Xash3D FWGS для обновлений
* [[https://github.com/YGGverse/xash3d-fwgs/tree/sv-downloadurl-ipv6|sv-downloadurl-ipv6]] - поддержка параметра sv_downloadurl_ipv6 в server.cfg, поскольку sv_downloadurl работает только с IPv4 (PR #1577)
* [[https://github.com/YGGverse/xash3d-fwgs/tree/master-hl-ygg|master-hl-ygg]] - замена mentality.rip на внутрисетевой master.hl.ygg (в паре с yggdrasil-masters удобен на случай обновления IP без повторной сборки клиентов)
* [[https://github.com/YGGverse/xash3d-fwgs/tree/yggdrasil-masters|yggdrasil-masters]] - дополнительные мастер-сервера в формате 0200::/7 (на случай отсутствия [[yggdrasil:dns:alfis|Alfis DNS]])
* [[https://github.com/YGGverse/xash3d-fwgs/tree/yggdrasil-only|yggdrasil-only]] - ветка предусматривает сборку Xash3D работающей только в рамках сети Yggdrasil, исключая запросы в клирнет (в разработке)
* [[https://github.com/YGGverse/xash3d-fwgs/tree/yggdrasil-inclusive|yggdrasil-inclusive]] - ветка расширяет совместимость master с Yggdrasil, удобна для игрового сервера, работающего в обе сети, включая клирнет
==== Сборка ====
Сборка не отличается от инструкций Xash3D FWGS, достаточно указать адрес репозитория (или использовать нужную ветку для слияния с официальным xash3d-fwgs):
<code>
git clone --recursive https://github.com/YGGverse/xash3d-fwgs.git
cd xash3d-fwgs
git checkout yggdrasil-only
./waf configure -T release
./waf build
./waf install --destdir=/path/to/game
</code>
В рамках [[https://github.com/YGGverse/xash3d-fwgs/releases|релизов]], публикуются бинарные пакеты для Linux что может быть удобным для начинающих пользователей.
===== Клиент =====
При использовании сборок [[https://github.com/YGGverse/xash3d-fwgs/tree/yggdrasil-only|yggdrasil-only]] или [[https://github.com/YGGverse/xash3d-fwgs/tree/yggdrasil-inclusive|yggdrasil-inclusive]] от Xash3D FWGS / YGGverse Edition, в списке "интернет игры" будут доступны все доступные внутрисетевые сервера Yggdrasil.
В остальных случаях, клиент будет работать с IPv6, но по-умолчанию ориентирован на сеть IPv4 и мастер сервер от FWGS - mentality.rip:27010
Можно вручную подключиться к заведомо известному узлу Yggdrasil из консоли с помощью тильды:
<code>
connect [201:5eb5:f061:678e:7565:6338:c02c:5251]:27015
</code>
С недавних пор, удалось портировать [[#pymaster]] для работы с IPv6, также имеется [[https://github.com/YGGverse/xash3d-fwgs/commit/afec7161842e928a5627d724e4fd7445fb7c3ee6|патч для xash3d-fwgs]], позволяющий принимать IPv6 адреса от мастера.
Чтобы удалить IPv4 сервера из списка, открываем консоль и пишем:
<code>
clearmasters
</code>
затем добавляем внутрисетевой мастер сервер или несколько по очереди:
<code>
addmaster [201:5eb5:f061:678e:7565:6338:c02c:5251]:27010
</code>
проверяем
<code>
listmasters
</code>
Данные настройки сохраняются после перезагрузки в файле /valve/xashcomm.lst, также можно добавить сервера вручную, по одному на строку.
//* тильда работает только в режиме игры, вызов консоли также доступен из главного меню при запуске Xash3D с флагом -dev.//
==== Лаунчер ====
Для удобного запуска клиента, можно добавить его в меню приложений:
<file - ~/.local/share/half-life.desktop>
[Desktop Entry]
Encoding=UTF-8
Name=Half-Life
Exec=/path/to/xash3d
Comment=Half-Life on Xash3D
Terminal=false
Icon=/path/to/hl.png
Type=Application
StartupNotify=false
Categories=Games
</file>
Затем активировать:
<code>
xdg-desktop-menu install ~/.local/share/half-life.desktop
</code>
Для разных сборок Xash3D, удобно использовать [[https://github.com/YGGverse/hl-customs|тематические иконки]], например для сборки Yggdrasil:
{{:yggdrasil:half_life_on_xash3d:hl-icon-ipv6.png?128|}}
{{:yggdrasil:half_life_on_xash3d:hl-icon-yggdrasil.png?128|}}
===== Сервер =====
При наличии установленного клиента с файлами игры, запуск сервера в сети Yggdrasil/IPv6 осуществляется командой:
<code>
xash3d -dedicated -port6 27015 -ip6 xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx -noip +maxplayers 8 +map crossfire
</code>
// * ''-noip'' отключает режим IPv4, если у сервера есть "белый IP" - можно разрешить подключение игроков из Clearnet: ''-ip xx.xx.xx.xx''//\\
// * * не забываем открыть порт 27015 (указать можно любой) //
Дополнительные настройки можно указать в файлах
* /valve/server.cfg - базовые настройки, такие как имя сервера (hostname)
* /valve/skill.cfg - спецификация сервера
* /valve/listip.cfg - настройки ограничения доступа
* /valve/banned.cfg
Чтобы сервер был доступен в списке мастер сервера, важно указать:
<file - server.cfg>
sv_lan 0
public 1
</file>
//* стандартный мастер сервер mentality.rip фильтрует по -game valve//
==== systemd ====
Конфигурация:
<file - /etc/systemd/system/half-life-server.service>
[Unit]
Description=Half-Life Server
After=network.target
[Service]
Type=simple
User=halflife
ExecStart=/home/halflife/xash3d -dedicated -port6 27015 -ip6 xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx -noip +maxplayers 8 +map crossfire
StandardOutput=file:/home/halflife/server-debug.log
StandardError=file:/home/halflife/server-error.log
Restart=on-failure
[Install]
WantedBy=multi-user.target
</file>
Автозапуск:
<code>
systemctl daemon-reload
systemctl enable half-life-server
systemctl start half-life-server
</code>
==== FastDL ====
FastDL - сокр. "быстрая загрузка", способ передачи дополнительных ресурсов игры клиенту сервером.
Обычно, реестр организуется средствами сервера nginx таким образом, чтобы файловая структура соответствовала структуре в директории ''valve'':
<code>
/maps
/models
/sound
/materials
</code>
В файле ''server.cfg'' указывается URL к данным директориям:
<file - server.cfg>
sv_downloadurl "http://xx.xx.xx.xx/fastdl/half-life/"
sv_allowdownload 1
</file>
где ''/fastdl/half-life/'' - путь к структуре файлов на сервере.
//* на данный момент поддержки IPv6 для ''sv_downloadurl'' [[https://github.com/FWGS/xash3d-fwgs/issues/1559|нет]]//\\
//* в рамках форка [[https://github.com/YGGverse/xash3d-fwgs/tree/sv-downloadurl-ipv6|sv-downloadurl-ipv6]] добавлена поддержка новой опции для server.cfg - sv_downloadurl_ipv6="[IPv6]:port/path" позволяющая секурно загружать модели при подключении Yggdrasil//
==== RESGen ====
Утилита используется для создания файла дополнительных зависимостей в формате ''.res'' для загрузки клиентом из сервера при инициализации карты.
Может быть полезна, если требуется отправить клиенту дополнительные модели игроков, при этом не создавая форки локаций.
Есть [[https://github.com/kriswema/resgen|исходники]] и рабочая [[https://github.com/kriswema/resgen/releases|сборка для Linux]].
**Принцип работы**
Извлекаем зависимости карты:
<code>
Linux.64-bit /valve/maps/crossfire.bsp
</code>
В этой же директории будет создан одноименный файл с расширением ''.res'', который можно открыть текстовым редактором и добавить нужную зависимость:
<file - crossfire.res>
// 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/... // добавляем в конец файла логический путь к новому файлу (на примере модели FastDL)
</file>
Файл ''.res'' должен находится в той же директории что и файл карты - ''/valve/maps''.
Перезагружаем сервер и переподключаем клиент - кастомнный скин должен быть автоматически загружен клиентом и добавлен в директорию ''/valve/downloaded/models/player/...''
===== Мастер =====
Мастер-сервер нужен для удобного поиска игровых серверов через интерфейс игры, иначе нужно каждый раз вводить адрес/порт сервера вручную.
==== pymaster ====
<WRAP round info 60%>
Официальный pymaster считается устаревшим, но силами сообщества в отдельных форках есть активность. Разработчики официальной версии обещают версию на Rust, но дата публикации не известна.
Для работы с Yggdrasil, рекомендуется [[https://github.com/YGGverse/pymaster/tree/v2|версия от YGGverse]], включающая в себя поддержку IPv6 и обновления протокола Xash3D.
</WRAP>
[[https://github.com/FWGS/pymaster|pymaster]] - это Python реализация мастер-сервера [[https://github.com/ezhangle/hlmaster|HLMaster]], в рамках проекта FWGS.
Для запуска необходимо открыть порт 27010 и выполнить команду:
<code>
pymaster.py -i :: -p 27010
</code>
//* в репозитории также есть [[https://github.com/FWGS/pymaster/blob/master/etc/systemd/system/pymaster.service|пример конфигурации systemd]] //
Чтобы pymaster начал отдавать игровые сервера клиентам, обе стороны должны быть скомпилированы или настроены на данный мастер-сервер.
В Xash3D исходники находятся в файле engine/common/netchan.h строки MASTERSERVER_ADR или в файле конфигурации /valve/xashcomm.lst\\
При использовании клиента с графическим интерфейсом, можно динамически указывать мастер сервер в консоли, командами listmasters/clearmasters/addmaster адрес:порт\\
Обновление типичных конфигураций valve - steamcomm.lst и valvecomm.lst игнорируется при запуске в оболочке Xash3D.
==== xash3d-master ====
[[https://git.mentality.rip/numas13/xash3d-master|xash3d-master]] - недавний релиз мастер сервера для Xash3D, написанного на языке Rust.
===== Боты =====
Чтобы оживить сервер и сделать ожидание игроков интереснее, в игру можно добавить ботов с помощью [[https://github.com/FWGS/xash3d-fwgs/issues/1556#issuecomment-1876014868|сторонних плагинов]].
==== Bot Number 10 ====
Самый простой способ - установка последней версии [[http://hpb-bot.bots-united.com/downloads.html|Bot Number 10]].
Загружаем архив для [[http://hpb-bot.bots-united.com/releases/bot10_linux.tgz|Linux]] и распаковываем содержимое в корневую директорию с бинарником xash3d таким образом, чтобы директория ''bot'' была рядом с ''valve''.
Поскольку плагин являет собой расширение, он не перезаписывает файлы игры, и запускать сервер необходимо указав новый путь к директории игры:
<code>
xash3d -game bot
</code>
Важно учитывать, что при запуске из нестандартной директории, сервер будет отфильтрован большинством мастер серверов, в виду фильтрации по valve.\\
Чтобы решить эту проблему, можно:
* сменить пути DLL в файле gameinfo.txt
* скопировать содержимое директории bot в valve и перезапустить сервер без флага -game bot
Также, чтобы сервер удалял ботов при подключении игроков, важно указать явно минимальное
<file - bot.cfg>
min_bots 1 # не ставить в 0, интерпретируется как false
max_bots 4
</file>
После запуска, настроенные в ''bot.cfg'' персонажи будут добавлены в игру. Плагин является частью проекта [[https://github.com/FWGS/hlsdk-portable/commits/bot10|hlsdk-portable]], при возникновении проблем, возможно потребуется собрать файл ''/valve/dlls/hl.so'' и заменить им оригинальный, хотя в случае с последней версией Steam - все работает без дополнительных действий.
=== Сборка из исходников ===
На сайте есть [[http://hpb-bot.bots-united.com/releases/bot10src.zip|архив с исходниками]], но последнюю версию можно собрать из репозитория с файлами SDK:
<code>
git clone --recursive https://github.com/FWGS/hlsdk-portable.git
git checkout bot10
cmake -B build -S .
cmake --build build
</code>
После компиляции ветки, будет доступен только файл bot.so - остальные файлы нужно собирать отдельно.\\
Если для остальных файлов не нужна особая сборка, можно переименовать bot.so в bot_i486.so и смержить с официальным архивом для Linux, пока что это работает.
==== Bot Number 10 by YGGverse ====
Открытая модификация Bot Number 10 для сервера YGGverse
**1.0.0**
* добавлена возможность установки min_bots=0 (PR #423)
* респавн ботов с конфигурации bot.conf (PR #422)
* поддержка дополнительных скинов
**сборка**
<code>
git clone --recursive https://github.com/YGGverse/hlsdk-portable.git
git checkout bot10-yggverse
cmake -B build -S .
cmake --build build
</code>
Есть [[https://github.com/YGGverse/hlsdk-portable/releases|бинарные релизы]] для более ранних систем.
===== Графити =====
В сетевой игре можно использовать графити, с помощью кнопки T. Изображение выбирается в настройках клиента, раздел "Multiplayer" - "Customize".
Чтобы создать свой логотип, изображение должно быть размером 64х64 пикселя, в палитре Grayscale и формате .BMP
Ниже рассмотрен пример обработки изображения PNG из коллекции [[https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/ipv6/128x128.png|hl-customs]] в редакторе GIMP:
1. Image → Scale Image → 64x64 / Quanlity: Linear\\
2. Layer → Transparency → Remove Alpha Channel\\
3. Colors → Components → Decompose\\
4. Colors → Invert (черный цвет считается прозрачным)\\
5. File → Export As.. → сохраняем по адресу /valve/logos/filename.bmp\\
Результат на данном примере будет иметь следующий [[https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/ipv6/valve/logos/ipv6.bmp|вид]]
Следует заметить, что создание Ч/Б графики обусловлено возможностью выбора цвета в интерфейсе игры.
{{:yggdrasil:half_life_on_xash3d:hl-ipv6-wall-graffiti.png?400|HL IPv6 Graffiti}}
===== Игровые сервера =====
==== Skunky ====
* ''%%[300:eaff:7fab:181b::e949]:7588%%'' - без ботов, только Yggdrasil
==== YGGverse ====
Имеется [[https://github.com/YGGverse/half-life-server|открытая конфигурация]] сервера, можно вносить свои предложения или использовать для организации нового сервера.
* ''%%[201:5eb5:f061:678e:7565:6338:c02c:5251]:27015%%'' - карта Crossfire с ботами
* ''%%hl.ygg:27015%%'' - короткий алиас для Alfis
* ''%%hl.ygg.at:27015%%'' - универсальный алиас для 0200::/7
* ''%%94.140.114.89:27015%%'' - алиас Clearnet
* ''%%tls://94.140.114.89:4708%%'' - ускорить пинг, актуально для всех алиасов выше
===== Мастер сервера =====
* [201:23b4:991a:634d:8359:4521:5576:15b7]:27010 - только Yggdrasil подключения
* hl.ygg:27010
* hl.ygg.at:27010
* [200:eaff:7fab:181b:dba8:1f83:1e5:d07b]:27010 - by Skunky
===== Статистика =====
* http://[201:5eb5:f061:678e:7565:6338:c02c:5251]/hl/ ([[http://hl.ygg|hl.ygg]]) - статистика по серверам Yggdrasil, с рейтингами игроков и оповещениями RSS (добавить сервер можно подключившись к мастеру в футере)
===== Ссылки =====
[[https://github.com/FWGS/xash3d-fwgs|Xash3D FWGS]] / [[https://github.com/YGGverse/xash3d-fwgs/branches|YGGverse Edition]]\\
[[https://store.steampowered.com/app/70/HalfLife/|Half-Life в Steam]]\\
[[https://www.svencoop.com/manual/server-config.html|Параметры конфигурации сервера]]\\
[[https://github.com/FWGS/pymaster|официальный pymaster]] | [[https://github.com/xdettlaff/pymaster|более чистая версия от @xdettlaff]] | [[https://github.com/YGGverse/pymaster/tree/v2|адаптация от YGGverse на базе @xdettlaff]] \\
[[https://git.mentality.rip/numas13/xash3d-master|xash3d-master на rust]] | [[http://[316:c51a:62a3:8b9::4]/YGGverse/xash3d-master|зеркало Yggdrasil]]\\
[[https://developer.valvesoftware.com/wiki/Master_Server_Query_Protocol:ru|Информация о мастер-сервере]]\\
[[https://developer.valvesoftware.com/wiki/Server_queries|Серверные запросы с множеством полезных ссылок]]\\
[[http://hpb-bot.bots-united.com/index.html|Боты, совместимые с Xash3D]] | [[https://github.com/YGGverse/hlsdk-portable/tree/bot10-yggverse|Bot Number 10 by YGGverse]]\\
[[https://github.com/YGGverse/hl-php|Библиотека PHP 8 для веб разработчиков]]\\
[[https://gamebanana.com/mods/cats/7734|Каталог скинов]] | [[https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/yggdrasil/valve/logos/yggdrasil.bmp|Графити Yggdrasil]] | [[https://raw.githubusercontent.com/YGGverse/hl-customs/main/icons/ipv6/valve/logos/ipv6.bmp|Графити IPv6]]
~~DISCUSSION~~