Документация по Server API

Раздел в процессе написания и будет часто обновляться.

Важно: Server API предназначен в первую очередь для разработчиков серверных плагинов и пользовательских интеграций. Официальных плагинов для работы с этим API нет.

Введение

Описание

Server API позволяет получить опубликованную модель по её ID в формате JSON.
Этот JSON можно использовать на стороне сервера для создания собственной интеграции: спавна модели, добавления хитбоксов, воспроизведения звуков и запуска анимаций.

ID модели является временным и действует только в течение 5 минут с момента публикации. После истечения этого времени ID удаляется с сервиса и больше не может быть использован для получения модели.

Как это работает

Общий принцип работы
Публикация модели

После экспорта в режим Minecraft Server модель публикуется на стороне сервиса и становится доступной по уникальному ID.
Пользователю показывается сообщение об успешной публикации, ID модели и quick command для примера интеграции.

Получение ID модели

Основной идентификатор модели — это числовой ID, например 241235.
Именно этот ID нужно передать в Server API для получения JSON-описания модели.

Важно: полученный ID живёт только 5 минут. Если плагин или сервер не успел запросить данные модели за это время, модель необходимо опубликовать заново и получить новый ID.

Quick command вида /bde spawn 241235 — это лишь пример того, как серверный плагин может использовать ID модели. Логика выполнения этой команды полностью зависит от реализации плагина.

API Endpoint

Запрос модели по ID

Для получения данных модели выполните GET-запрос по следующему адресу:

GET https://block-display.com/server-api/?id=MODEL_ID

Пример:

GET https://block-display.com/server-api/?id=241235

Параметр tag является необязательным.
Он позволяет задать пользовательский тег, который будет подставлен в данные модели.
Если параметр не указан, используется значение bde.

Пример запроса с пользовательским тегом:

GET https://block-display.com/server-api/?id=241235&tag=my_model_1

ID, передаваемый в запросе, действителен только в течение 5 минут после публикации модели.

В случае успеха API возвращает JSON с полем content, внутри которого содержатся данные модели.

Структура ответа

Основные поля ответа
Основные поля

content.version — версия формата данных.
content.type — тип экспортированного содержимого.
content.passengers — визуальные части модели.
content.datapack.anim_keyframes — ключевые кадры анимаций.
content.datapack.sound_keyframes — ключевые кадры звуков.
content.hitbox — данные для создания хитбоксов.

Точная интерпретация этих полей зависит от вашей серверной реализации. API не навязывает конкретный способ обработки данных.

Части модели: passengers

Визуальная часть модели

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

{
  "passengers": [
    "{id:\"minecraft:block_display\",block_state:{Name:\"minecraft:oak_log\",Properties:{axis:\"x\"}},transformation:[1f,0f,0f,0.5625f,0f,1f,0f,0f,0f,0f,1f,0.25f,0f,0f,0f,1f],Tags:[\"bde_0\"]}"
  ]
}

Анимации: anim_keyframes

Ключевые кадры анимаций

Поле content.datapack.anim_keyframes содержит набор анимаций и их ключевых кадров.
Внутри каждого кадра находится список команд, которые должны быть применены к соответствующим сущностям модели.

{
  "anim_keyframes": {
    "default": {
      "0": [
        "data merge entity @e[type=block_display,tag=bde_0,distance=..1,limit=1,sort=nearest] {transformation:[1f,0f,0f,0.5625f,0f,1f,0f,0f,0f,0f,1f,0.25f,0f,0f,0f,1f],interpolation_duration:0}"
      ]
    }
  }
}

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

Звуки: sound_keyframes

Ключевые кадры звуков

Поле content.datapack.sound_keyframes содержит звуковые события, распределённые по кадрам.
Обычно внутри кадра хранится список команд воспроизведения звука.

{
  "sound_keyframes": {
    "default": {
      "3": [
        "playsound ambient.basalt_deltas.additions block @a ~ ~ ~ 1 1.125"
      ]
    }
  }
}

Хитбоксы: hitbox

Дополнительные сущности для взаимодействия

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

{
  "hitbox": [
    "summon block_display ~1.4375 ~-0.3125 ~1.5 {Passengers:[{id:\"minecraft:shulker\",NoGravity:1b,Silent:1b,NoAI:1b,Invulnerable:1b,AttachFace:0b,active_effects:[{id:\"minecraft:invisibility\",amplifier:0,duration:-1,show_particles:0b}],attributes:[{id:\"minecraft:scale\",base:3}]}],Tags:[\"bde\",\"bde_hitbox\"]}"
  ]
}

Что не входит в API

Ограничения текущего формата

Функции проекта не входят в ответ Server API, даже если они были созданы внутри проекта.

Server API передаёт только данные, необходимые для пользовательской серверной реализации: части модели, анимации, звуки и хитбоксы.

Реализация на стороне плагина

Свобода интеграции

Разработчик плагина свободен в том, как использовать данные из API.
Вы можете:

- самостоятельно создавать модель по данным из passengers;
- использовать anim_keyframes для собственной системы анимаций;
- подключать sound_keyframes к проигрыванию звуков;
- создавать отдельные сущности хитбоксов из hitbox.

Пример ответа

Пример JSON-ответа API
{
  "content": {
    "version": "26.1",
    "type": "full",
    "passengers": [
      "{id:\"minecraft:block_display\",block_state:{Name:\"minecraft:oak_log\",Properties:{axis:\"x\"}},transformation:[1f,0f,0f,0.5625f,0f,1f,0f,0f,0f,0f,1f,0.25f,0f,0f,0f,1f],Tags:[\"bde_0\"]}"
    ],
    "datapack": {
      "anim_keyframes": {
        "default": {
          "0": [
            "data merge entity @e[type=block_display,tag=bde_0,distance=..1,limit=1,sort=nearest] {transformation:[1f,0f,0f,0.5625f,0f,1f,0f,0f,0f,0f,1f,0.25f,0f,0f,0f,1f],interpolation_duration:0}"
          ],
          "1": [
            "data merge entity @e[type=block_display,tag=bde_0,distance=..1,limit=1,sort=nearest] {transformation:[1f,0f,0f,0.504375f,0f,1f,0f,0f,0f,0f,1f,0.358125f,0f,0f,0f,1f],interpolation_duration:2,start_interpolation:0}"
          ]
        }
      },
      "sound_keyframes": {
        "default": {
          "3": [
            "playsound ambient.basalt_deltas.additions block @a ~ ~ ~ 1 1.125"
          ]
        }
      }
    },
    "hitbox": [
      "summon block_display ~1.4375 ~-0.3125 ~1.5 {Passengers:[{id:\"minecraft:shulker\",NoGravity:1b,Silent:1b,NoAI:1b,Invulnerable:1b,AttachFace:0b,active_effects:[{id:\"minecraft:invisibility\",amplifier:0,duration:-1,show_particles:0b}],attributes:[{id:\"minecraft:scale\",base:3}]}],Tags:[\"bde\",\"bde_hitbox\"]}"
    ]
  }
}
Sign up to create and share content. Sign up