Profiles
Обзор
Profiles даёт каждому игроку несколько независимых персонажей на одном аккаунте. Переключение профиля меняет инвентарь игрока, эндер-сундук, опыт, здоровье и сытость, а также его факты TypeWriter, поэтому прогресс квестов, открытия и счётчики у каждого персонажа свои. Другие расширения BTC, например BTC Sky, прикрепляют свои данные к активному профилю.
Профили создаются и выбираются из меню, которое вы проектируете в веб-панели. Сервер может заставить игроков выбрать профиль, прежде чем они смогут двигаться, строить, сражаться или писать в чат. Данные хранятся в базе данных, когда включён мост MySQL, что делает профили доступными на каждом сервере сети, а в остальных случаях — в файлах.
Система привязана к игровому режиму сервера (mysql.game-mode.current): у игрока в каждом игровом режиме свой отдельный список профилей.
Возможности
- Отдельные персонажи — инвентарь, броня, вторая рука, эндер-сундук, уровень, опыт, здоровье, сытость и насыщение для каждого профиля.
- Отдельное состояние истории — факты TypeWriter сохраняются при переключении и восстанавливаются для профиля.
- Меню профилей — GUI с одним слотом на профиль и шаблонами для активных, неактивных, свободных и заблокированных слотов.
- Принудительный выбор — пока профиль не активен, игрок не может двигаться, взаимодействовать, ломать, ставить, выбрасывать, сражаться или писать в чат.
- Соло и кооператив — профиль создаётся как соло или кооперативный (общий остров BTC Sky), а игровой режим без кооператива пропускает этот вопрос.
- Ограничения — максимум по умолчанию и более высокие лимиты по правам.
- Защита от переключения — перезарядка между переключениями и событие, которое могут отменить другие расширения.
- Записи — действия для открытия меню, создания, переключения, переименования, удаления и сохранения, факты о состоянии профиля и события.
- Между серверами — профили и их данные разделяются через мост MySQL.
- Плейсхолдеры — название, идентификатор, число, лимиты и подробности по каждому профилю для меню и HUD.
Установка
- Установите расширение GUI, которое рисует меню. Расширение Basic объявлено как зависимость.
- Рекомендуется: установите расширение MySQL и включите его (
mysql.enabled: true). Без него профили хранятся в файлах и не разделяются между серверами. - Поместите JAR-файл Profiles в
plugins/Typewriter/extensions/и перезапустите сервер. - Отредактируйте раздел
profilesвplugins/Typewriter/mysql/config.yml, см. Конфигурация. Profiles читает свои настройки из файла конфигурации расширения MySQL, даже если вы не используете базу данных. - Создайте записи меню, описанные в разделе Начало работы.
Начало работы
Настройте выбор профиля, который должны пройти новые игроки:
- В веб-панели TypeWriter откройте страницу и добавьте запись Profile Menu Config.
/profileоткрывает первую найденную и ничего не делает, если её нет. - Задайте
inventoryTitle,inventoryRowsиguiType. Постройте раскладку вlayoutPoolи задайтеmainLayoutId. См. руководства по GUI. - Разместите предметы с
buttonPrefixprofile_button:иbuttonTypePROFILE_SLOTтам, где должны появляться профили. Каждый маркер показывает один профиль, считываемый слева направо, затем сверху вниз. Слоты ниже лимита игрока, в которых нет профиля, показываютcreateProfileTemplate, а слоты за пределами лимита показываютmaxProfilesTemplate. - Задайте
defaultMaxProfilesи при необходимостиpermissionLimits. - Создайте две страницы GUI, используемые для создания, как записи Open GUI с идентификаторами
profile_create_chooser(выбор Solo или Coop) и, для игровых режимов без кооператива,profile_create_solo. Кнопка на этих страницах выполняетprofile create soloилиprofile create coop, а для режимов только соло — простоprofile create. - В
plugins/Typewriter/mysql/config.ymlпроверьтеprofiles.force-profile-selection(по умолчаниюtrue) иprofiles.coop-supported. - Опубликуйте, зайдите на сервер и выберите или создайте профиль.
Используйте Switch Profile Action или Open Profile Menu Action от NPC и предметов. Реагируйте на переключения, выполненные действием переключения или введёнными командами, с помощью Profile Switched Event.
Используйте факты Profile Count Fact и Is Profile Active Fact в критериях. Например, показывайте кнопку «создать профиль», только пока Can Create Profile Fact равен 1.
Как это работает
При переключении расширение проверяет перезарядку, затем запускает отменяемое событие перед переключением, чтобы игровой режим мог отказать (например, во время войны или мини-игры). Затем оно фиксирует текущее состояние игрока, записывает его в хранилище, очищает факты TypeWriter и инвентарь игрока и восстанавливает данные целевого профиля. Состояние активного профиля также сохраняется, когда игрок выходит.
Что сохраняется, зависит от конфигурации: инвентарь и эндер-сундук (save-inventory, save-ender-chest) и статистика Minecraft (save-statistics, по умолчанию выключено из-за большого размера). Уровень, опыт, здоровье, сытость и факты TypeWriter сохраняются всегда.
Поскольку факты подменяются, всё, что хранится в факте, принадлежит профилю. Данные других расширений следуют их собственному profile-mode в конфигурации MySQL: данные per-profile хранятся отдельно для каждого профиля, данные shared общие для всех профилей.
Конфигурация
У Profiles нет собственного файла конфигурации. Его настройки находятся в разделе profiles файла plugins/Typewriter/mysql/config.yml, создаваемого расширением MySQL.
| Ключ | Значение по умолчанию в поставляемом файле | Значение |
|---|---|---|
profiles.enabled | true | Включает систему профилей. |
profiles.max-profiles | 2 | Максимум профилей на игрока, когда записи Profile Menu Config не существует. defaultMaxProfiles записи заменяет его. |
profiles.default-profile-name | Principal | Название автоматического профиля. |
profiles.save-statistics | true | Сохранять статистику Minecraft для каждого профиля. Занимает много места. |
profiles.save-inventory | true | Подменять инвентарь для каждого профиля. |
profiles.save-ender-chest | true | Подменять эндер-сундук для каждого профиля. |
profiles.require-permission | false | Требовать typewriter.profiles.create для создания профиля. |
profiles.auto-create-default | true | Создавать профиль по умолчанию при первом входе. Работает только когда coop-supported равен false. |
profiles.force-profile-selection | true | Блокировать игрока, пока профиль не активен. |
profiles.switch-cooldown-seconds | 60 | Минимальная задержка между двумя переключениями игрока. 0 отключает её. |
profiles.coop-supported | true | Есть ли в этом игровом режиме кооперативные профили. Когда false, вопрос Solo или Coop пропускается, и каждый профиль соло. |
profiles.creation-menu-entry-id | пусто | Идентификатор страницы GUI, открываемой для создания профиля. Пусто означает profile_create_chooser, если кооператив поддерживается, и profile_create_solo в остальных случаях. |
Значения выше — из поставляемого файла. Встроенные значения по умолчанию, когда ключа нет, отличаются (max-profiles 5, save-statistics true, auto-create-default false), поэтому сохраняйте ключи в вашем файле.
Хранилище. При mysql.enabled: true и profiles.enabled: true профили хранятся в таблице typewriter_profiles. В остальных случаях они хранятся как ассеты в profiles/<game mode>/<player uuid>.json. Профили, сохранённые в старом артефакте Profile Storage Artifact, автоматически копируются в новое хранилище при запуске.
Меню
Запись Profile Menu Config описывает меню. Клик по профилю переключает на него, Shift + левый клик удаляет его (сначала открывается экран подтверждения, если deleteConfirmation не отключён), а клик по свободному слоту открывает страницу создания. При создании профиля имя запрашивается в наковальне. {profile_name}, {profile_id}, {created_date}, {last_used}, {level}, {exp}, {health}, {food}, {profile_count} и {max_profiles} можно использовать в заголовках, названиях и описаниях.
Предметы-кнопки с buttonPrefix profile_button: поддерживают PROFILE_SLOT (один профиль) и маркеры INFO и CLOSE, которые выполняют profile info и gui:close.
Слоты могут выполнять profile open, profile select <id>, profile create solo|coop и profile delete <id> от имени кликнувшего игрока.
Тексты меню по умолчанию, сообщения и сообщение о перезарядке на французском. Измените их в записи меню.
Команды
Все команды требуют profiles.use. Псевдонимы: /profil, /profiles.
| Команда | Описание |
|---|---|
/profile | Открыть меню профилей. |
/profile menu | Открыть меню профилей. |
/profile select <id> | Переключиться на профиль. |
/profile create solo или coop | Создать и активировать профиль; имя запрашивается в наковальне. Без режима — только для игровых режимов без кооператива. |
/profile delete <id> [confirm] | Удалить неактивный профиль. Если deleteConfirmation включён, сначала открывается экран подтверждения, кроме случая с confirm. |
/profile admin list <player> | Перечислить профили игрока в сети (требует profiles.admin). |
/profile admin create <player> <name> | Создать соло-профиль для игрока. |
/profile admin delete <player> <id> | Удалить профиль игрока. |
/profile admin switch <player> <id> | Переключить игрока на профиль. |
/profile admin rename <player> <id> <name> | Переименовать профиль. |
/profile headless list, select <id>, create <name> | Управлять своими профилями без меню (требует profiles.headless). |
Слушатель меню обрабатывает /profile, введённую игроком, раньше дерева команд: он поддерживает select, create, delete и открытие меню, а остальные игнорирует. Поэтому /profile admin ... и /profile headless ... надёжно работают из консоли или через псевдонимы /profil и /profiles.
Права
| Право | По умолчанию | Что даёт |
|---|---|---|
profiles.use | Все | Команды /profile. |
profiles.admin | Операторы | /profile admin. |
profiles.headless | Никто | /profile headless, для клиентов без экрана, например тестовых ботов. |
profiles.switch.bypasscooldown | Никто | Переключение без перезарядки. |
typewriter.profiles.create | Никто | Создание профилей, когда profiles.require-permission равен true. |
Права из permissionLimits | Вы выбираете | Повышают лимит профилей. Побеждает наибольший лимит. |
Плейсхолдеры
Теги MiniPlaceholders для текста MiniMessage. Ссылка — это позиция в списке (цифры, начиная с 0) или идентификатор профиля.
| Плейсхолдер | Возвращает |
|---|---|
<profile_active_id>, <profile_active_name> | Идентификатор и название активного профиля. |
<profile_active> | 1, когда профиль активен. Со ссылкой <profile_active:0> сообщает, является ли этот профиль активным. |
<profile_count> | Число профилей. |
<profile_max> | Максимальное число профилей для игрока. |
<profile_can_create> | 1, когда игрок может создать ещё один профиль. |
<profile_remaining> | Число ещё доступных профилей. |
<profile_friend_count> | Число друзей, 0 без расширения Friend. |
<profile_enabled> | 1, когда система включена. |
<profile_name:ref>, <profile_id:ref> | Название и идентификатор профиля. |
<profile_created:ref>, <profile_last_used:ref> | Даты в формате dd/MM/yyyy HH:mm. |
<profile_created_timestamp:ref>, <profile_last_used_timestamp:ref> | Миллисекунды с начала эпохи. |
<profile_level:ref>, <profile_exp:ref> | Уровень и прогресс опыта в процентах. |
<profile_health:ref>, <profile_food:ref> | Сохранённое здоровье и уровень сытости. |
Записи
Записей: 20, сгенерированы из исходного кода расширения.
Действия6
- Create Profile ActionCreates a new profile for the player
- Delete Profile ActionDeletes a specific profile
- Open Profile Menu ActionOpens the profile selection menu for the player
- Rename Profile ActionRenames a specific profile
- Save Profile ActionSaves the current profile state
- Switch Profile ActionSwitches the player to a specific profile
События5
- Profile Created EventTriggered when a player creates a new profile
- Profile Deleted EventTriggered when a player deletes a profile
- Profile Loaded EventTriggered when a player's profile is loaded on join
- Profile Saved EventTriggered when a player's profile is saved
- Profile Switched EventTriggered when a player switches profiles
Факты7
- Can Create Profile FactReturns 1 if player can create more profiles, 0 otherwise
- Has Active Profile FactReturns 1 if player has an active profile, 0 otherwise
- Is Profile Active FactReturns 1 if the specified profile is active, 0 otherwise
- Max Profiles FactReturns the maximum number of profiles allowed per player
- Profile Coop Enabled FactReturns 1 if the active profile was created as a coop profile
- Profile Count FactReturns the number of profiles a player has
- Profiles Enabled FactReturns 1 if the profile system is enabled, 0 otherwise
Артефакты1
- Profile Storage ArtifactStores player profiles with separate inventories and data
Манифесты1
- Profile Menu ConfigConfiguration for the profile selection menu
Устранение неполадок
/profile ничего не делает. Нет записи Profile Menu Config. Создайте и опубликуйте её.
Новые игроки замирают и не могут писать в чат. profiles.force-profile-selection равен true, и ни один профиль не активен. После входа игрока отправляют на страницу создания; убедитесь, что запись GUI profile_create_chooser (или profile_create_solo, или ваша creation-menu-entry-id) существует. Задайте опции значение false, чтобы отключить блокировку.
«Choisissez d'abord Solo ou Coop dans le menu des profils.» Игрок попробовал выполнить команду при принудительном выборе. Пока профиль не активен, разрешены только /profile ... и команда страницы создания.
«Vous devez attendre N s avant de changer à nouveau de profil.» Идёт перезарядка переключения. Уменьшите profiles.switch-cooldown-seconds или выдайте profiles.switch.bypasscooldown.
Профиль по умолчанию не создаётся при первом входе. auto-create-default работает только когда coop-supported равен false. При кооперативе игрок должен выбрать Solo или Coop, а в логе написано «No implicit profile was created; disable the setting.»
Профили различаются между серверами. Расширение MySQL должно быть включено (mysql.enabled: true) на каждом сервере с одной и той же базой данных и игровым режимом. Без него профили находятся в локальных файлах. Если MySQL включён, но источник данных отсутствует, в логе написано «MySQL enabled for profiles but DataSource not found. Falling back to JSON.»
Игроки теряют предметы после переключения. Проверьте save-inventory и save-ender-chest. Когда они равны false, инвентарь не подменяется и не очищается, поэтому предметы общие для профилей.
Переключение отклоняется с сообщением. Другое расширение отменило его через событие перед переключением, например во время боя или мини-игры. Сообщение приходит из этого расширения.