> ## Documentation Index
> Fetch the complete documentation index at: https://nexohub.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Плагины, которые собирают собственные ассеты

> BetterHUD, ModelEngine, BetterModel и им подобные, и как запускать разные HUD и модели на разных серверах.

BetterHUD, MythicHUD, ModelEngine, BetterModel и похожие плагины собирают собственные
ассеты и передают их Nexo. В сети это создаёт проблему: если лобби использует один HUD,
а PvP-сервер — другой, каждый сервер собирает только свою половину ассетов, и в итоге
вы получаете два разных пака и повторную загрузку при каждом переходе игрока.

NexoHub решает это за вас. Устанавливайте плагины на каждый сервер именно так, как вам
нужно.

## Что вам нужно сделать

**Проверьте две настройки в конфигах ваших других плагинов.** Это единственное, что всё
ещё может это сломать, и они разобраны [ниже](#two-settings-to-check).

**Оставьте собственный конфиг каждого плагина на своём месте.** Разные серверы могут
запускать разные HUD и хранить разные модели. Это живёт в `config.yml` плагина, который
никогда не является общим.

**Не копируйте сгенерированный вывод наверх на прокси.** Папки вроде
`plugins/Nexo/pack/external_packs/BetterHud/` пересобираются плагином при каждой
загрузке. NexoHub собирает их автоматически, а устаревшая копия в `nexo-data/` только
вызывает путаницу.

**Установите `packs.mixed_content: true`, если ваши серверы запускают разные HUD или
модели,** чтобы ассеты каждого из них доходили до остальных. См.
[ниже](#servers-running-different-huds-or-models).

Это всё. Файлы плагинов не копируются между бэкендами, так что каждый сервер хранит
только то, что вы на него установили. Вы всё ещё можете положить файл централизованно в
`_shared/_plugins/`, и он победит. См. [управление файлами](/ru/guides/managing-files).

## Две настройки, которые нужно проверить

Обе — это плагин, обфусцирующий собственный пак. Их отключение не стоит вам никакой
защиты, потому что Nexo в любом случае обфусцирует объединённый пак после.

<Warning>
  Установите **`pack.use-obfuscation: false`** в конфиге BetterModel. Эта настройка
  поставляется **включённой**, так что каждая установка начинается в конфигурации, которая
  ломается, и вам нужно её изменить.
</Warning>

Когда она выключена, BetterModel называет каждую часть по её модели и кости, и два
бэкенда с разными моделями собирают паки, которые согласуются друг с другом. Когда она
включена, имена зависят от того, сколько частей этот сервер загрузил первым, так что
торс волшебника на одном сервере оказывается молотом рыцаря на другом.

<Warning>
  Оставьте **`resourcepack-obfuscation: false`** в конфиге BetterHUD. Это значение по
  умолчанию, так что это имеет значение только если кто-то её включил.
</Warning>

Когда она выключена, BetterHUD называет сгенерированные файлы по HUD, к которому они
относятся. Когда включена — называет их `a`, `b`, `c` в порядке загрузки, так что первый
HUD вашего лобби и первый HUD вашего PvP-сервера оба называются `a`, и один
перезаписывает другой.

О каждой из них сообщается, но в разных местах. Бэкенд предупреждает о BetterModel при
загрузке:

```
[NexoHubBridge] BetterModel's pack.use-obfuscation is on, so it names model parts by this
server's load order and backends holding different models disagree about what each name
means.
[NexoHubBridge] Set it in plugins/BetterModel/config.yml:  pack: { use-obfuscation: false }.
Nexo obfuscates the merged pack anyway, so this costs no protection.
```

Это предупреждение — ваше единственное уведомление о BetterModel, потому что он передаёт
свою папку напрямую Nexo, а не пишет в `external_packs/`, так что на прокси ничто её не
сравнивает. Если вы не можете выключить эту настройку, установите
`support.bettermodel: true` на этом бэкенде, чтобы вместо этого делиться его исходными
файлами.

Конфликт BetterHUD ловится на прокси, который сообщает вам об этом, а не отправляет
сломанный пак:

```
[nexohub] Contributions lobby/betterhud and pvp/betterhud both define
assets/betterhud/font/a.json with different content. Nexo merges these into one
pack, so one will silently win.
```

Та же проверка применяется к любому плагину. Если вы это видите, либо выключите
собственную обфускацию этого плагина, либо исключите папку через `contribute_exclude`.
`collision` — одно из [событий вебхука](/ru/reference/proxy-config#notifications), так
что вам не нужно вычитывать это из консоли.

Вторая формулировка называет два *плагина*, а не два бэкенда. Она означает, что один
плагин затирает файл другого, и никакая настройка NexoHub это не исправит. Запускайте
только один из них или спросите их авторов, какой должен владеть этим файлом.

## Серверы с разными HUD или моделями

Некоторые из этих плагинов нумеруют вещи по тому, что их собственный сервер случайно
загрузил, так что одно и то же число означает разное на каждом бэкенде. NexoHub вместо
этого хранит эти числа на прокси и раздаёт всем одинаковые.

| Плагин | Нумерация на каждом сервере | Что делает NexoHub |
| - | - | - |
| BetterHUD | идентификаторы `case` шейдеров и упакованные `ascent` шрифтов | хранит нумерацию на хабе |
| ModelEngine | `custom_model_data` на `leather_horse_armor` | хранит нумерацию на хабе |
| BetterModel | нет, начиная с 3.4.0, при выключенной обфускации | предупреждает при загрузке, если она включена |
| MythicHUD | нет | не трогает |
| Animotions | нет | не трогает |
| Overdrive | не измерялось | не трогает |
| Tooltips | не измерялось | не трогает |

<Warning>
  Ассеты BetterHUD и ModelEngine доходят до других бэкендов только как вклады
  (contributions), так что для запуска разных HUD на разных серверах нужно
  `packs.mixed_content: true` на прокси. При значении по умолчанию `SERVER` каждый бэкенд
  получает пак, содержащий только его собственные.
</Warning>

Бэкенд сообщает при запуске, что именно он делает, называя только установленные на нём
плагины:

```
[NexoHubBridge] Keeping BetterHud, ModelEngine numbered the way the network numbers it, so
every backend builds one shared pack. This server holds only its own files.
[NexoHubBridge] Leaving BetterModel to name its own output, which comes out the same on
every backend, so this server holds only what you installed and still agrees with the rest.
```

BetterModel с всё ещё включённой собственной обфускацией не получает эту вторую строку.
Вместо этого сообщается, что он собирает собственный отдельный пак — что он и делает.

Если вы запускаете версию, которая ведёт себя иначе, бэкенд сообщает об этом при запуске
и называет настройку [`generators`](/ru/reference/proxy-config#settings), которая
возвращает старое поведение — её вы задаёте на прокси для одного бэкенда, группы или
всех сразу. Большинству сетей она никогда не нужна.

## Что видят ваши игроки

Только то, что запускает данный сервер. Если на pvp стоит HUD дайвинга, а в лобби —
приветственный HUD, именно это игроки и видят на каждом из них. BetterHUD сервера хранит
только те HUD, которые вы туда установили, так что `/hud add` не предлагает ничего из
того, что запускает другой сервер, а модель существует только на том сервере, куда вы её
положили. Ассеты каждого сервера при этом остаются в одном общем паке, который все они
раздают.

<Note>
  Это не связано с собственной настройкой Nexo `Pack.obfuscation`, которая выполняется
  позже над готовым паком и которую безопасно оставить включённой.
</Note>

## Как это перемещается

Каждый бэкенд публикует то, что сгенерировали его плагины, а хаб это хранит. Обратно это
приходит как папка непосредственно в `plugins/Nexo/pack/external_packs/` с именем
`_hub-<plugin>-<id>`, и Nexo включает её в пак.

BetterHUD и BetterModel собирают этот вывод как папку или как один `.zip`, в зависимости
от их собственной настройки `pack-type`, и в обоих случаях он публикуется. Вам не нужно
её менять: NexoHub читает `build-folder-location` каждого плагина, чтобы узнать точное
имя, которое тот пишет — так же он понимает, что ваш собственный пак в этой папке трогать
не надо. Tooltips и Overdrive читаются так же, из `copy-resource-pack.path` и
`resourcepack.nexo_integration.output_path`, если это копирование включено.

`packs.mixed_content` определяет, доходит ли это до других бэкендов.

| Настройка | Из чего собирает каждый бэкенд |
| - | - |
| `SERVER` (по умолчанию) | из собственного вывода. Бэкенды, генерирующие одно и то же, всё равно делят один пак |
| `NETWORK` | из вывода всех бэкендов, объединённого. Нужно, когда серверы запускают разные HUD или модели |
| `OFF` | из собственного вывода, и хаб его никогда не видит |

Когда вы впервые добавляете сервер, он публикует свои ассеты, а остальные подхватывают
их при следующей перезагрузке, в течение нескольких секунд. После этого ничего не
пересылается заново, пока сгенерированное содержимое не изменится, так что обычный
перезапуск ничего не стоит.

## Любой другой плагин

Плагины выше NexoHub знает по имени. Любой другой плагин, которому можно указать, куда
распаковывать свой пак, тоже работает: укажите ему папку в
`plugins/Nexo/pack/external_packs/`, имя которой начинается с `generated-`.

```yaml theme={null}
# plugins/SomePlugin/config.yml, ключ называется так, как его назвал автор плагина
output: plugins/Nexo/pack/external_packs/generated-someplugin
```

Такая папка обрабатывается как вывод BetterHUD. Она публикуется при
`packs.mixed_content`, бэкенд убирает свою копию, как только хаб возвращает те же файлы,
и она уходит из сети, когда плагин перестаёт её писать. Две вещи остаются на вас, потому
что NexoHub не видит, что делает этот плагин:

* Плагин должен записывать папку при каждом запуске. Если он пишет её только один раз,
  после первого перезапуска она пропадёт.
* Ничто не согласует его идентификаторы между серверами. Если два бэкенда публикуют одну
  и ту же папку с разным содержимым, прокси сообщает о коллизии и называет её.

Префикс задаётся [настройкой](/ru/reference/proxy-config#settings) `generated_prefixes`.
Это список, регистр не учитывается, а `[]` отключает эту возможность.

## Удаление пака

Остановите плагин, который его генерирует. HUD, который вы удалили из конфига BetterHUD,
или плагин, который вы деинсталлировали, исчезает из сетевого пака после следующей
перезагрузки этого бэкенда.

Удаление папки вручную само по себе не помогает. Плагин запишет её снова при следующем
запуске, и бэкенд снова её опубликует.

Пак, который вы положили сами, работает наоборот, потому что ничто его не регенерирует:
удалите его из `_shared/pack/external_packs/` на прокси, и он исчезнет со всех бэкендов
при следующей отправке. См. [управление файлами](/ru/guides/managing-files).

Пак, который вы положили напрямую на один бэкенд, наоборот, никогда не публикуется,
поскольку никакой плагин там не заявляет, что записал его. Бэкенд однажды сообщает об
этом, называя файл, так что пустой вывод `/nexohub contributions` никогда не остаётся
без объяснения.

`/nexohub contributions` на прокси показывает, что хаб сейчас хранит, по бэкендам:

```
[NexoHub] 3 contribution(s), from 2 backend(s):
  lobby
      betterhud  412 KiB  5e6f7a8b
      bettermodel  1204 KiB  c1d2e3f4
  pvp
      betterhud  388 KiB  9a0b1c2d
```

`/nexohub contributions drop <server> [name]` удаляет один вручную и отправляет
изменения. Это нужно для бэкенда, который не может отозвать свой вклад сам: выведенного
из эксплуатации, работающего на старом мосте или с `contribute: false`.

## Отключение

Если вы предпочитаете, чтобы каждый сервер держал свои ассеты полностью при себе, а хаб
никогда их не видел:

```yaml theme={null}
# proxy: plugins/nexohub/config.yml
packs:
  collect_generated: false
```

Или исключите одну папку на отдельном бэкенде:

```yaml theme={null}
# backend: plugins/NexoHubBridge/config.yml
sync:
  contribute_exclude:
    - eventpack
```

## Проверка, что всё сработало

`/nexohub status` показывает все бэкенды на одном паке. В логах бэкендов вы увидите, как
каждый сервер публикует то, что создал, и пропускает остальное:

```
[NexoHubBridge] Published betterhud (412 KiB) for the rest of the network.
[NexoHubBridge] Hub already holds pack 5e6f7a8b, skipping upload.
```

<Note>
  Сеть, обновляющаяся с версии, которая делилась исходными файлами этих плагинов,
  сохраняет присланные ей копии. NexoHub удаляет только внутри `plugins/Nexo/`, поэтому он
  называет их при загрузке, а не удаляет. Если оставить их, ничего не сломается; удалите
  их один раз на каждом бэкенде.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.