Перейти к основному содержимому

Friend

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

Приватныеv0.1.0Социальное
ТребуетсяTypeWriter0.9.0-beta-177 (BTC build)GUI (TypeWriter extension)MySQL (TypeWriter extension)необязательноRedis or Valkeyнеобязательно

Создано для сети BornToCraft. Это расширение описано для справки и не распространяется.

Обзор​

Friend даёт каждому игроку список друзей. Игроки отправляют запрос, другой игрок принимает или отклоняет его, а принятые друзья видят статус друг друга в сети и могут телепортироваться друг к другу. Всё доступно через команды /friend, через действия и факты TypeWriter и через меню, которое вы проектируете сами в веб-панели.

Дружба хранится по UUID игрока, поэтому переживает смену ника. Список находится в единственном Friend Artifact. Когда установлен мост MySQL с включённым Redis, запросы, дружба и присутствие в сети разделяются между всеми серверами сети, а /friend tp может переместить игрока на сервер, где находится его друг.

Меню — это меню GUI: вы строите его раскладку в веб-панели и помечаете некоторые предметы как кнопки Friend. Головы друзей размещаются самим расширением.

Возможности​

  • Запросы в друзья — отправляйте, принимайте, отклоняйте запросы и удаляйте друзей командой, записью-действием или кликом в меню.
  • Переключатель запросов — каждый игрок может отключить входящие запросы командой /friend toggle.
  • Меню друзей — одна запись содержит все экраны (друзья, запросы, вкладки) с головами игроков, пагинацией и заполнителем пустых слотов.
  • Телепортация к другу — на том же сервере или через прокси на сервер друга в сети.
  • Статус в сети — локальные игроки и, при наличии Redis, игроки на других серверах той же группы.
  • Крючки для сюжета — факт «является ли этот игрок другом» и факт «сколько друзей в сети».
  • Плейсхолдеры — количества, списки, имена по индексу и сервер друга, которые можно использовать в любом тексте MiniMessage.
  • Инструменты администратора — просматривайте списки и принудительно связывайте или разрывайте дружбу кого угодно командой /friend admin.

Установка​

  1. Установите расширение GUI, которое рисует меню.
  2. По желанию, для нескольких серверов: установите расширение MySQL и включите Redis (или Valkey) в его конфигурации, с одним и тем же redis.group-id на каждом сервере. См. Поведение между серверами.
  3. Поместите JAR-файл Friend в plugins/Typewriter/extensions/ и перезапустите сервер.
  4. Создайте запись Friend Artifact на static-странице и опубликуйте её. Без неё ничего не сохраняется.

Права friend.use и friend.tp по умолчанию выдаются всем, а friend.admin — операторам.

Начало работы​

Постройте меню друзей, открываемое командой /friend:

  1. В веб-панели TypeWriter откройте страницу static и добавьте Friend Artifact. Оставьте artifactId равным friend_data.
  2. Откройте страницу и добавьте запись Friend Menu. Команда /friend открывает первое найденное Friend Menu, поэтому обычно нужно только одно.
  3. Задайте inventoryTitle, inventoryRows и guiType, затем постройте раскладку в layoutPool и укажите в mainLayoutId корневую раскладку. О раскладках и рамках см. руководства по GUI.
  4. Разместите оформление и кнопки. У предмета выберите значение Friend в buttonType, например FRIEND_STATUS для счётчика, FRIEND_SETTINGS_TOGGLE_REQUESTS для переключателя запросов или NAV_CLOSE, чтобы закрыть меню.
  5. Объявите экраны: добавьте по одному элементу в views на каждый экран, затем перечислите идентификаторы, показывающие друзей, в friendListViewIds, а идентификаторы, показывающие входящие запросы, в requestListViewIds.
  6. Задайте, где появляются головы игроков, с помощью contentX, contentY, contentColumns и contentRows.
  7. Опубликуйте, затем выполните в игре /friend.

Чтобы открывать меню из квеста, от NPC или предмета, свяжите запись Friend Menu в triggers другой записи или запустите её как действие.

Ограничьте диалог дружбой

Используйте факт Is Friend с targetName, равным имени игрока, затем используйте факт в критерии (значение 1 означает, что они друзья). Используйте Online Friends Count для наград, зависящих от активного списка друзей.

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

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

Меню​

Запись Friend Menu — это меню GUI с тремя частями, специфичными для Friend.

Головы игроков. На экране, объявленном в friendListViewIds, каждый друг — это голова игрока, сначала друзья в сети. Левый клик телепортирует к другу, правый клик удаляет друга. На экране, объявленном в requestListViewIds, левый клик принимает запрос, а правый отклоняет его. Головы заполняют сетку, начинающуюся с contentX и contentY, размером contentColumns на contentRows слотов. Свободные ячейки показывают emptySlotItem.

Кнопки. Предмет, у которого buttonType равен одному из значений ниже, заменяется при отрисовке:

buttonTypeЧто игрок видит или делает
FRIEND_STATUSКоличество друзей в сети, не в сети и общее количество.
FRIEND_LISTОбщее число друзей или «нет друзей», когда список пуст.
FRIEND_REQUESTSЧисло ожидающих запросов. Клик открывает представление requests, когда есть хотя бы один запрос.
FRIEND_SETTINGS_TOGGLE_REQUESTSКлик включает или отключает входящие запросы.
FRIEND_ONLINE_HEADER, FRIEND_OFFLINE_HEADERДекоративные заголовки разделов.
PAGE_NAVСтрелка страницы. Левый клик идёт вперёд, правый клик — назад, в названии показан счётчик страниц. Скрыта, когда достаточно одной страницы.
NAV_BACK, NAV_CLOSEВернуться в предыдущее меню, закрыть меню.
FRIEND_ADD, FRIEND_REMOVE, FRIEND_ACCEPT, FRIEND_DECLINE, FRIEND_TP, FRIEND_MSG, FRIEND_PLAYER_SLOTПредметы-отображения с фиксированным названием и описанием, без собственного действия.

Остальные значения, предлагаемые редактором (NAV_PREV, NAV_NEXT, PENDING_REQUESTS, FRIEND_SLOT, REQUEST_ACCEPT, REQUEST_DECLINE), остаются такими, как вы их настроили.

Команды слотов. Предмет может выполнять команды, начинающиеся с friend : friend open [view], friend page next|prev|<number>, friend tp <name>, friend remove <name>, friend accept <name>, friend decline <name>, friend toggle, friend add <name>. Они выполняются от имени игрока, который кликнул, и %player% не нужен.

Язык

Встроенные тексты меню (заголовок по умолчанию «Amis», названия кнопок и описание голов) на французском. Переопределите их названиями и описаниями предметов, которые вы задаёте в раскладке, и inventoryTitle. Сообщения в чате, отправляемые командами, на английском.

Поведение между серверами​

Friend работает на одном сервере без каких-либо других плагинов. В сети установите MySQL и включите Redis или Valkey, затем задайте каждому серверу сети один и тот же redis.group-id и разный redis.server-name. Без group-id социальная шина сообщений молчит, и каждый сервер видит только собственные изменения.

При подключённом мосте:

  • запросы, новые дружбы, удаления и переключатель запросов отправляются на другие серверы;
  • друг считается находящимся в сети, когда Redis знает, на каком сервере он находится;
  • /friend tp к другу, находящемуся на другом сервере, просит прокси подключить вас к этому серверу (прокси должен понимать канал btc:bridge). Вы попадаете на сервер, а не в позицию друга.

Артефакты следуют активному хранилищу: когда в конфигурации MySQL mysql.enabled равен true, Friend Artifact хранится в общей базе данных, поэтому каждый сервер читает один и тот же список друзей.

Команды​

Все команды требуют friend.use. Псевдонимы: /friends, /f, /amis. Команда без аргументов открывает первое Friend Menu и ничего не выводит, если его нет.

КомандаОписание
/friendОткрыть меню друзей.
/friend add <player>Отправить запрос в друзья.
/friend accept <player>Принять ожидающий запрос.
/friend decline <player>Отклонить ожидающий запрос.
/friend remove <player>Удалить друга.
/friend listВывести ваших друзей в чат с их статусом в сети.
/friend toggleВключить или отключить входящие запросы в друзья.
/friend tp <player>Телепортироваться к другу (также требует friend.tp).
/friend admin list <player>Перечислить друзей игрока в сети (требует friend.admin).
/friend admin requests <player>Перечислить ожидающие запросы игрока в сети.
/friend admin add <player> <player>Сделать двух игроков в сети друзьями, без этапа запроса.
/friend admin remove <player> <friend>Удалить друга из списка игрока в сети.

Права​

ПравоПо умолчаниюЧто даёт
friend.useВсеВсе команды /friend. Клики в меню выполняют те же действия, не проверяя его.
friend.tpВсе/friend tp. Клик по голове в меню выполняет телепортацию напрямую и не проверяет это право.
friend.adminОператорыКоманды /friend admin.

Плейсхолдеры​

Это теги MiniPlaceholders, записываемые в тексте MiniMessage как <friend_count>. Булевы значения возвращают 1 или 0.

ПлейсхолдерВозвращает
<friend_count>Число друзей игрока.
<friend_online_count>Число друзей в сети на этом сервере.
<friend_online_network_count>Число друзей, известных как находящиеся в сети на любом сервере группы.
<friend_requests_count>Число ожидающих запросов.
<friend_requests_enabled>1, когда входящие запросы разрешены.
<friend_list>Имена друзей через запятую.
<friend_online_list>Имена друзей в сети на этом сервере.
<friend_name:index>Имя друга в этой позиции, начиная с 0.
<friend_online_name:index>Имя друга в сети в этой позиции, начиная с 0.
<friend_is_friend:name>1, когда названный игрок — друг.
<friend_server:name>Сервер, на котором названный игрок находится в сети, пусто, если неизвестно.

Записи​

Записей: 8, сгенерированы из исходного кода расширения.

Действия5
Факты2
Артефакты1

Устранение неполадок​

Друзья пропадают после перезапуска. Не опубликован ни один Friend Artifact, поэтому данные существуют только в памяти. Добавьте артефакт на static-странице и опубликуйте.

/friend ничего не делает. Команда открывает первую запись Friend Menu и молчит, если её нет. Создайте и опубликуйте Friend Menu. Подкоманды вроде /friend list работают без меню.

Запрос отправлен, но другой игрок его не получает. Получатель должен находиться в сети на одном из серверов сети в момент отправки запроса. Запросы игрокам, которых нет в сети, не сохраняются, а отправителю всё равно сообщается, что запрос отправлен. При нескольких серверах проверьте, что redis.group-id везде одинаков, иначе запросы не проходят между серверами.

Список друзей пуст на втором сервере. У каждого сервера должен быть один и тот же redis.group-id, уникальный redis.server-name, а mysql.enabled должен быть true, чтобы артефакт разделялся через базу данных. Проверьте логи расширения MySQL на ошибки подключения к Redis.

Сетка голов пуста или показывает только предметы-заполнители. Текущий экран не указан в friendListViewIds или requestListViewIds. Когда в меню объявлены views, головы показывают только перечисленные там идентификаторы. Без views задайте view равным friends или requests.

Телепортация к другу ничего не делает на другом сервере. Прокси должен обрабатывать канал btc:bridge, а присутствие через Redis должно работать. Без сетевого подключения /friend tp работает, только если друг на том же сервере.

Связанные расширения​

  • MySQL — обмен сообщениями Redis, присутствие и общее хранилище для дружбы между серверами.
  • GUI — раскладки, представления и кнопки, используемые меню друзей.
  • Party и Guild — другие социальные системы на той же шине сообщений.
  • BTC Sky — автоматически связывает участников кооперативного острова как друзей.