Skip to content

Создание и настройка меню

Создание меню в PlayerProfile — это творческий процесс. Вы можете контролировать каждый аспект отображения, чтобы создать уникальный профиль для игроков вашего сервера. Все файлы меню находятся в папке plugins/PlayerProfile/menus/.

Основы: title-states, layout и icons

Каждый файл меню состоит из ключевых частей: настройки заголовка (title и title-states), layout (макет) и icons (иконки).

  1. title & title-states: Задает стандартное название меню и позволяет динамически изменять его на основе условий (например, одно название для владельца, другое для админа).
  2. layout: Это визуальное представление вашего меню. Вы "рисуете" инвентарь, используя символы. Каждый символ — это ссылка на иконку.
  3. icons: Здесь вы описываете, чем является каждый символ из layout: какой предмет, какое название, какие действия он выполняет.

Пример меню с динамическим заголовком:

yaml
# menus/default.yml
title: 'Профиль игрока %owner%'

# Опционально: Динамические заголовки на основе условий
title-states:
  owner_title:
    conditions:
      - 'is_owner'
    title: '&aВаш профиль'
  admin_title:
    conditions:
      - 'is_viewer'
      - 'has permission: playerprofile.admin'
    title: '&cАдмин-режим: %owner%'

rows: 3
layout:
  - '######### '
  - '#p#h#c#l#b'
  - '#########'

icons:
  '#': # Описание символа '#'
    material: BLACK_STAINED_GLASS_PANE
    display: ' '
  'p': # Описание символа 'p'
    type: STATUS
    # ... и так далее

Описание иконки (icons)

Каждый символ в секции icons может иметь множество параметров.

Основные параметры предмета

ПараметрТипОписание
materialстрокаМатериал предмета из Minecraft (например, DIAMOND_SWORD).
item-adderстрока(Интеграция) ID предмета из ItemsAdder (например, my_items:cool_sword). Заменяет material.
nexoстрока(Интеграция) ID предмета из Nexo. Заменяет material.
craft-engineстрока(Интеграция) ID предмета из CraftEngine (например namespace:id). Заменяет material.
item-modelстрокаУстанавливает модель компонента (1.20.5+ / 1.21) по ключу (например, custom:cool_sword).
displayстрокаНазвание предмета. Поддерживает цветовые коды & и плейсхолдеры.
loreсписок строкОписание предмета. Каждая строка — новый элемент списка.
custom-model-dataчислоУстанавливает CustomModelData для предмета.
glowtrue/falseЕсли true, предмет будет светиться (эффект зачарования).
unbreakabletrue/falseЕсли true, предмет будет неразрушимым.
textureстрокаURL или Base64-текстура для головы игрока. Используется, только если materialPLAYER_HEAD.

Кастомные шрифты и иконки

Плагин поддерживает отображение кастомных изображений в шрифте (в названиях, лоре и заголовках). Для CraftEngine используйте теги <image:namespace:id> или :namespace:id:. Для Nexo/ItemsAdder — их стандартные плейсхолдеры (типа :glyph_name:).

Функциональные параметры

ПараметрТипОписание
typeстрокаКлючевой параметр! Определяет тип слота. Например, HELMET автоматически покажет шлем игрока, а STATUS — его статус. Подробнее о типах...
actionsсписок строкСписок действий, которые выполнятся при клике на предмет. Подробнее о действиях...
permissionстрокаПраво, которое должен иметь игрок, чтобы видеть этот предмет. Если права нет, слот будет пустым.
action-executorстрокаКто может выполнить действие: OWNER (только владелец профиля), VIEWER (только тот, кто смотрит), BOTH (оба). По умолчанию BOTH.

Состояния и Условия (states & conditions)

Это самая мощная функция плагина. Она позволяет одному символу (icons) выглядеть и вести себя по-разному в зависимости от условий.

Представьте иконку 's'. Вы можете сделать так, чтобы:

  • Если профиль смотрит владелец, 's' будет выглядеть как "Настройки".
  • Если профиль смотрит администратор, 's' будет выглядеть как "Админ-инструменты".
  • Во всех остальных случаях слот 's' будет пустым.

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

Внутри описания иконки вы создаете секцию states. Внутри states вы перечисляете несколько состояний (state1, state2 и т.д.). Каждое состояние — это, по сути, полноценное описание предмета со своим material, display и actions.

Плагин проверяет состояния по порядку (сверху вниз). Первое состояние, у которого выполняются все conditions (условия), будет отображено.

Если у состояния нет условий, оно сработает всегда (если до него не дошло дело).

Список доступных условий (conditions)

УсловиеОписание
is_ownertrue, если тот, кто смотрит профиль, является его владельцем.
is_viewertrue, если тот, кто смотрит, не является владельцем.
has permission: <право>true, если у смотрящего есть указанное право (например, playerprofile.admin).
lacks permission: <право>true, если у смотрящего нет указанного права.
placeholder '...' ... '...'(PAPI) Сравнивает значение плейсхолдера. Плейсхолдеры парсятся от имени владельца профиля.

Операторы для плейсхолдеров:

  • equals или == (равно)
  • notequals или != (не равно)
  • contains (содержит текст)
  • is_greater_than или > (больше чем, для чисел)
  • is_less_than или < (меньше чем)
  • is_greater_or_equal или >= (больше или равно)
  • is_less_or_equal или <= (меньше или равно)

Полный пример иконки с состояниями

Давайте создадим иконку s (настройки), которая будет разной для владельца, админа и обычного игрока.

yaml
# ...внутри icons:
's':
  type: DEFAULT # Тип по умолчанию
  states:
    # --- Состояние 1: для владельца профиля ---
    state1:
      conditions: # Условие:
        - 'is_owner'
      material: COMPARATOR
      display: '&a⚙ Настройки профиля'
      lore:
        - '&7Нажмите, чтобы изменить'
        - '&7настройки вашего профиля.'
      actions:
        - 'player: profile-settings' # Откроет другое меню (пример)

    # --- Состояние 2: для админа, который смотрит чужой профиль ---
    state2:
      conditions: # Условия (должны выполниться оба):
        - 'is_viewer'
        - 'has permission: playerprofile.admin'
      material: REDSTONE
      display: '&c⚙ Админ-инструменты'
      lore:
        - '&7Управление профилем игрока %owner%.'
      actions:
        - 'player: profile-admin %owner%' # Откроет админ-меню (пример)

    # --- Состояние 3: Пустой слот для всех остальных ---
    # У этого состояния нет условий, поэтому оно сработает,
    # если state1 и state2 не подошли.
    state3:
      material: AIR

Важно!

Порядок состояний имеет значение! Всегда размещайте более конкретные условия (например, для админа) выше, чем более общие.