| crates | ||
| docs | ||
| Cargo.toml | ||
| example-manifest.yaml | ||
| LICENSE | ||
| README.md | ||
| rustfmt.toml | ||
В данном репозитории описана структура YAML файла, который содержит всё нужное для развёртки сборки для Minecraft. Главная особенность данного решения и главное преимущество - лёгкая автоматизация и управляемость.
Данный проект в первую очередь создан для серверов с огромными сборками и решает очень насущную проблему - дистрибуция сборок и контроль их версий. Можно сказать это перенос логики Git и пакетных менеджеров на сборки для игры Minecraft. Также это решает проблему отсутствия стандарта распространения этих самых сборок.
В чём проблема дистрибуции сборок, что есть сейчас?
Главная проблема - отсутствие идемпотентности и сильная зависимость от человеческого фактора: Все этот архив могут распаковать по разному, отчего могут случится проблемы, запаковать сборку могут по разному: например добавить ненужные клиенту (то есть только для сервера) моды или наоборот: нужные только клиенту моды расположить на сервере, это потребляет лишние ресурсы компьютера клиента и самого сервера.
Да, есть решение: каждый лаунчер каждого отдельного сервера по своему решает этот вопрос. Но тут уже другая проблема: зависимость от того как этот лаунчер написали, также мелкие сервера с довольно большими сборками не могут себе позволить такое веселье, хоть и лаунчер достаточно простое решение, но гораздо удобнее, практичнее писать небольшие файлики (или генерировать их с помощью утилит) где описана сама сборка и отдавать этот файлик иным людям.
Здесь мы подходим ещё к одной проблеме данной дистрибуции: версионирование. Когда выходит новая версия сборки, приходится виндово её скачивать, распаковывать, удалять прошлую и проводить прочие ритуалы с файловой системой компьютера. К тому же хранить все версии сборок неудобно и занимает много места.
То есть решается довольно таки популярная проблема, связанная со сборками Minecraft.
Какие решения?
Данный проект как раз таки это и решает. YAML выбран здесь неспроста:
- Он читаем и пронятен большинству людей.
- Он Git-friendly. Git очень хорошо работает именно с текстовыми форматами и очень плохо с бинарными - такова его архитектура. Также не надо забывать о том, что Git смотрит на изменения построчно, под что синтаксис YAML хорошо адаптирован. Так легче делиться своими сборками.
Также, just for fun, здесь будет писан сетевой протокол, который в большинстве случаев работать не будет, потому что основные сурсы тут - ресурсы Modrith и Curseforge, но если вы какие-то моды селфхостите, то этот протокол хорошо под них оптимизирован, он работает поверх HTTP/2, и по сути создан для того, распакоывать сжатые файлы, что качаются, на лету. В целом, это надо продумать.
В этом репозитории представлена эталонная реализация такой штуки на Rust - это библиотека, которую вы мужете подключить в качестве крейта к своим проектам.
Реализация
Для того, чтобы не засирать в лишний раз систему +100500 модами и прочим мусором существует директория %KCACHE%, обычно это на
Linux ~/.local/share/kcache, там будут находится все ресусрсы, что были скачаны с данными именованиями {HASH}-{NAME}-{VERSION}.jar.
В инстансах всё будет ссылкой на то, что находится в папке ~/.local/share/kcache.
Пример манифеста
То же самое доступно и здесь: тык
# Информация о модпаке
meta:
name: Hysteria # название модпака
type: pack # | source
version: # версия, можно брать из системы контроля версий
from-vsc: git
fallback: 1.0.0
# version: 1.0 <- или указать вручную
description: Modpack for Hysteria minecraft server # произвольное описание
manifest-version: 1.0.0 # версия манифеста
# Источники modrinth и curseforge уже предустановлены, следует указывать, если вы их хотите заменить и прочее
source:
modrinth:
type: modrinth
# url: <- если используется другой url для связи с Modrith, например свой север или прокси
curseforge:
type: curseforge
# url: <- если используется другой url для связи с Curseforge, например свой север или прокси
custom:
type: unimod
url: unimod.hysteria-server.space # или ./source.yaml
another-modpack:
type: unimod-modpack
url: mods.hysteria-server.space # или ./another.yaml
# Наследование, если вы делаете свой модпак на базе уже существующего
inherit:
- another-modpack
configuration:
minecraft:
version: 1.12.2
modloader:
type: forge
version: latest # <- по умолчанию latest
servers:
- name: Hysteria
address: hysteria-server.space
mods:
optifine:
source: modrinth
# side: client <- Modrith уже содержит информацию о том куда надо его устанавливать, но это можно переопределить
# version: latest
custom:
url: ./mod.jar # <- некоторые моды можно только собрать, пока распространить можно
resourcepacks:
fainthful: modrinth # если остальная информация неважна, то можно и так указывать, просто источник
# А можно и источник не указывать выше (то есть не писать мод), будет всё собрано из источников на том в каком порядке они указаны, по умолчанию у Modrith приоритет, так как он обладает большей полнотой информации
# Что в итоге установить
result:
mods:
- optifine
- etc...
resourcepacks:
- fainthful
- etc...
shaderpack:
- photon
- etc...
configs:
- path: "config/pufferfish.yml"
source: "inline"
content: |
optimized-tick-loops: true
max-entity-collisions: 4
- path: "config/industrialcraft/main.ini"
source: "remote"
url: "https://raw.githubusercontent.com/hysteria/configs/main/ic2.ini"
- path: "kubejs"
source: "remote"
url: "https://raw.githubusercontent.com/hysteria/kubejs-config"
Лицензия
Для удобства создания своих решений на базе этого, здесь применяется пермиссивная лицензия MIT.