66c870385f9a7fe729d1d458657124168ff39f02

proximaclient.json — API для плагинов и модов

Также доступно на: English

Файл proximaclient.json позволяет автору плагина или мода расширить приложение ProximaClient под свой проект без участия нашей команды:

  • settings — добавляет плагину собственный экран настроек (иконка-шестерёнка на карточке плагина → модалка с полями). Пользователь редактирует конфиг через UI, не открывая .yml/.toml вручную.
  • content — добавляет в автодополнение серверной консоли ваши команды, предметы, эффекты и т.д. (по мере ввода команды пользователь видит подсказки).

Оба блока опциональны — можно поставлять только настройки, только контент, или оба. Формат версионируется полем schemaVersion (текущая версия — 1). Это developer-facing документ; примеры даны для Minecraft.

Если ещё не знаете, как пользователи ставят плагины — см. Как установить плагины на сервер.

Где лежит файл

Приложение ищет манифест в двух местах, в таком порядке приоритета:

  1. В корне вашего .jar — файл proximaclient.json рядом с plugin.yml / paper-plugin.yml / mods.toml / fabric.mod.json.
  2. На CDN ProximaMP (fallback, если в jar файла нет) — по имени плагина/мода.
MyPlugin.jar
├── proximaclient.json   ← здесь, в корне архива
├── plugin.yml
└── ...классы...

Структура jar-архива с proximaclient.json в корне

CDN-фолбек (на стороне ProximaMP)

Если в jar файла нет, приложение пробует взять манифест с нашего CDN по имени плагина. Туда схемы кладёт команда ProximaMP — например, готовые настройки для популярных плагинов, которые сами не поставляют proximaclient.json. Прямого доступа к CDN у авторов плагинов нет: основной путь для вас — файл в jar.

Кеш на стороне приложения — 5 минут. Нужен CDN-фолбек для вашего плагина (например, нельзя менять jar)? Напишите команде ProximaMP — добавим на нашей стороне.

Приоритет: если файл есть и в jar, и на CDN — берётся версия из jar. CDN используется только когда в jar файла нет.

Верхний уровень файла

{
  "schemaVersion": 1,        // версия формата файла (число, по умолчанию 1)
  "settings": { ... },       // опционально — экран настроек
  "content":  { ... }        // опционально — данные для автодополнения консоли
}
ПолеТипОбяз.Описание
schemaVersionnumber (целое > 0)нетВерсия формата. Если не указана — подставляется 1.
settingsobjectнетСхема экрана настроек.
contentobjectнетДельта игровых данных для консоли.

Лишние ключи запрещены. Любой неизвестный ключ на любом уровне → весь файл считается невалидным и игнорируется (строгая валидация).

Блок settings — экран настроек

Добавляет плагину иконку-шестерёнку и модалку настроек. Пользователь меняет значения — приложение записывает их в указанный конфиг-файл.

Модалка настроек плагина с вкладками

Поля верхнего уровня settings

ПолеТипОбяз.Описание
categoryIdstringдаКатегория плагина (см. список ниже). Значение вне списка → блок settings отбрасывается.
configPathstringдаПуть к редактируемому конфигу относительно папки сервера (например plugins/MyPlugin/config.yml). Без переносов строк; ≤ 255 символов.
description{ru, en}даКраткое описание для шапки модалки.
fieldsмассивдаПоля формы. До 300 штук.
groupsмассивнетГруппировка полей по вкладкам. До 50 штук.

Допустимые categoryId (ровно эти 6 значений):

categoryIdНазначение
administrationАдминистрирование, управление
securityБезопасность, доступы, пароли
performanceПроизводительность, оптимизация
gameplayИгровой процесс, механики
communicationЧат, сообщения, уведомления
otherПрочее

Поле формы (fields[])

{
  "key": "max-homes",          // обязателен — идентификатор поля
  "path": "homes.max",         // опц. — путь в конфиге (по умолчанию = key)
  "type": "number",            // обязателен — тип контрола
  "required": false,           // опц. — обязательное ли поле
  "label": { "ru": "Макс. домов", "en": "Max homes" },        // обязателен
  "description": { "ru": "Лимит домов на игрока", "en": "Homes per player" }  // опц.
}
АтрибутТипОбяз.Описание
keystring (1–64)даУникальный идентификатор поля внутри схемы.
pathstring (1–128)нетПуть к значению в конфиге (точечная нотация, например homes.max). По умолчанию = key.
typestringдаТип поля — один из 6 (см. ниже).
requiredbooleanнетПомечает поле обязательным. По умолчанию false.
label{ru, en}даПодпись поля в UI.
description{ru, en}нетПоясняющий текст под полем.
optionsмассивдля enumВарианты выбора.
withGeneratorbooleanдля passwordКнопка «сгенерировать пароль».

Типы полей (type)

typeКонтрол в UIДоп. атрибуты
stringТекстовое поле
passwordПоле пароля (скрытый ввод)withGenerator: true → кнопка генерации
numberЧисловое поле
booleanПереключатель (тоггл)
enumВыпадающий списокoptionsобязателен, ≥ 1 элемента
string-arrayРедактор списка строк

Опция enum (options[]):

{
  "value": "strict",                                  // что сохранится в конфиг (1–128 симв.)
  "label": { "ru": "Строгий", "en": "Strict" }        // что показать в списке
}

Значения value внутри одного поля должны быть уникальны.

Группы / вкладки (groups[])

Опционально. Разбивает поля на вкладки внутри модалки. Поля, не попавшие ни в одну группу, уходят во вкладку «Общее». Если groups не задан — поля рисуются плоским списком.

{
  "id": "general",                                    // обязателен, уникален (1–64)
  "icon": "settings",                                 // опц. — имя иконки
  "label": { "ru": "Общее", "en": "General" },        // обязателен
  "description": { "ru": "Базовые опции", "en": "Basics" },  // опц.
  "fieldKeys": ["max-homes", "mode"]                  // обязателен — key полей этой вкладки
}

Каждый fieldKeys[i] должен ссылаться на существующий key из fields. До 300 ключей на группу.

Блок content — данные для консоли

Добавляет в автодополнение серверной консоли команды и игровые объекты вашего плагина. Это плоская дельта поверх встроенных данных игры: можно добавлять новое и убирать существующее.

Автодополнение консоли с командой плагина

Состав блока content

ПолеТипОписание
addedCommandsмассив CommandTemplateНовые команды. До 200.
removedCommandsмассив stringИмена команд, которые убрать из подсказок. До 200.
addedItems / removedItemsмассивРеестр предметов.
addedEffects / removedEffectsмассивРеестр эффектов.
addedEnchantments / removedEnchantmentsмассивРеестр зачарований.
addedMobs / removedMobsмассивРеестр мобов/сущностей.
addedBiomes / removedBiomesмассивРеестр биомов.
addedAttributes / removedAttributesмассивРеестр атрибутов.
addedSounds / removedSoundsмассивРеестр звуков.
addedParticles / removedParticlesмассивРеестр частиц.
addedStructures / removedStructuresмассивРеестр структур.
addedDimensions / removedDimensionsмассивРеестр измерений.

added* принимают массив объектов GameItem, removed* — массив строк-идентификаторов.

Шаблон команды (CommandTemplate)

{
  "name": "sethome",                                   // обязателен — имя команды (без слэша)
  "description": { "ru": "Установить дом", "en": "Set home" },  // опц.
  "usage": { "ru": "<имя>", "en": "<name>" },          // опц. — подсказка свободного хвоста
  "slots": []                                          // обязателен — позиционные аргументы
}
АтрибутТипОбяз.Описание
namestring (1–64)даИмя команды без слэша. Допустимы A–Z a–z 0–9 _ : -. Подкоманды — через enum + followedBy, а не пробелом в имени.
description{ru, en}нетОписание команды в подсказке.
usage{ru, en}нетХинт по «свободному хвосту» (координаты, JSON, текст). Показывается, когда слоты кончились, но команда ждёт ввод.
slotsмассив CommandSlotдаПозиционные аргументы по порядку. До 64. Пустой массив = команда без аргументов.

Слоты (slots[]) — поддерживаемые kind

Каждый слот описывает один позиционный аргумент. Всего 12 видов (kind):

kindЧто подсказываетОткуда берутся значения
enumФиксированный списокИнлайн, из самого слота (values)
playerИмя игрокаИгроки онлайн (+ селекторы @a @e @p @s @r @n)
itemsПредметРеестр addedItems (+ встроенные)
effectЭффектРеестр addedEffects
enchantmentЗачарованиеРеестр addedEnchantments
mobМоб / сущностьРеестр addedMobs
biomeБиомРеестр addedBiomes
attributeАтрибутРеестр addedAttributes
soundЗвукРеестр addedSounds
particleЧастицаРеестр addedParticles
structureСтруктураРеестр addedStructures
dimensionИзмерениеРеестр addedDimensions

Простые слоты записываются как { "kind": "player" }, { "kind": "items" } и т.д. Слот enum — особый (см. ниже).

enum-слот, EnumValue и подкоманды (followedBy)

{
  "kind": "enum",
  "values": [
    { "value": "add",    "followedBy": [ { "kind": "player" } ] },
    { "value": "remove", "followedBy": [ { "kind": "player" } ] },
    { "value": "list" }
  ]
}
АтрибутТипОбяз.Описание
valuestring (1–64)даЗначение, которое отправится на сервер как есть.
label{ru, en}нетОтображаемое имя варианта.
description{ru, en}нетПояснение варианта.
followedByмассив CommandSlotнетСлоты, добавляемые после этого значения, если выбрано именно оно. Так делаются подкоманды. Рекурсивно. До 64.

Подкоманды через followedBy: команда whitelist — это шаблон с name: "whitelist" и одним enum-слотом [add, remove, on, off, list], где у add/remove есть followedBy: [{ "kind": "player" }], а у on/off/list — нет. До 256 значений в одном enum.

Подкоманды followedBy в действии — whitelist add <игрок>

Игровой объект (GameItem)

Элемент любого added*-реестра:

{
  "id": "myplugin:magic_wand",                          // обязателен
  "name": { "ru": "Волшебная палочка", "en": "Magic Wand" }  // обязателен
}
АтрибутТипОбяз.Описание
idstring (1–128)даИдентификатор, отправляемый на сервер как есть. Формат: namespace:path или просто path.
name{ru, en}даЧеловекочитаемое имя в подсказке.

Реестр динамически расширяется: добавили предмет через addedItems — он сразу доступен в items-слотах команд.

Ограничения и валидация

Файл — недоверенный ввод, поэтому проверяется строго. При любой ошибке валидации файл (или соответствующий блок) полностью игнорируется — приложение продолжит работать без вашей схемы.

Что приведёт к отклонению:

  • Лишние/неизвестные ключи на любом уровне.
  • Превышение лимитов: ≤ 200 команд, ≤ 200 removedCommands, ≤ 2000 элементов на реестр, ≤ 256 значений в enum, ≤ 64 слота, ≤ 300 полей, ≤ 50 групп. Локализованные строки {ru, en} — ≤ 200 символов.
  • Недопустимое имя команды / id (имена команд — только A–Z a–z 0–9 _ : -).
  • categoryId вне списка — блок settings отбрасывается.
  • Размер файла > 512 КБ — не читается из jar.
  • Битый JSON.

Совет: если схема «не подхватывается», проверьте файл строгим JSON-валидатором, сверьте categoryId со списком и убедитесь, что нет лишних полей.

Полный пример proximaclient.json

{
  "schemaVersion": 1,
  "settings": {
    "categoryId": "gameplay",
    "configPath": "plugins/Homes/config.yml",
    "description": { "ru": "Настройки системы домов", "en": "Homes settings" },
    "fields": [
      { "key": "max-homes", "path": "homes.max", "type": "number",
        "label": { "ru": "Макс. домов", "en": "Max homes" } },
      { "key": "cooldown", "path": "homes.cooldown-seconds", "type": "number",
        "label": { "ru": "Кулдаун (сек)", "en": "Cooldown (s)" } },
      { "key": "cross-world", "type": "boolean",
        "label": { "ru": "Телепорт между мирами", "en": "Cross-world teleport" } }
    ]
  },
  "content": {
    "addedCommands": [
      { "name": "home", "slots": [],
        "description": { "ru": "Телепорт домой", "en": "Teleport home" } },
      { "name": "sethome", "slots": [],
        "usage": { "ru": "<имя дома>", "en": "<home name>" } },
      { "name": "delhome", "slots": [],
        "usage": { "ru": "<имя дома>", "en": "<home name>" } }
    ]
  }
}

Вопросы по интеграции

Версия формата — schemaVersion: 1. Вопросы по интеграции — к команде ProximaMP через Telegram. Сам ProximaClient — на странице /client.

proximaclient.json — API для плагинов и модов