A minecraft modpack configuration declaration and transfer protocol
Find a file
2026-07-03 16:43:38 +03:00
crates init: crates 2026-07-01 21:17:42 +03:00
docs init: crates 2026-07-01 21:17:42 +03:00
Cargo.toml docs: add example 2026-07-03 16:41:56 +03:00
example-manifest.yaml docs: add example 2026-07-03 16:41:56 +03:00
LICENSE init: crates 2026-07-01 21:17:42 +03:00
README.md docs: README refmt 2026-07-03 16:43:38 +03:00
rustfmt.toml init: crates 2026-07-01 21:17:42 +03:00

Unimod Protocol Logo

Unimod Proto

License .Rust

В данном репозитории описана структура 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.