Friend
Обзор
Friend даёт каждому игроку список друзей. Игроки отправляют запрос, другой игрок принимает или отклоняет его, а принятые друзья видят статус друг друга в сети и могут телепортироваться друг к другу. Всё доступно через команды /friend, через действия и факты TypeWriter и через меню, которое вы проектируете сами в веб-панели.
Дружба хранится по UUID игрока, поэтому переживает смену ника. Список находится в единственном Friend Artifact. Когда установлен мост MySQL с включённым Redis, запросы, дружба и присутствие в сети разделяются между всеми серверами сети, а /friend tp может переместить игрока на сервер, где находится его друг.
Меню — это меню GUI: вы строите его раскладку в веб-панели и помечаете некоторые предметы как кнопки Friend. Головы друзей размещаются самим расширением.
Возможности
- Запросы в друзья — отправляйте, принимайте, отклоняйте запросы и удаляйте друзей командой, записью-действием или кликом в меню.
- Переключатель запросов — каждый игрок может отключить входящие запросы командой
/friend toggle. - Меню друзей — одна запись содержит все экраны (друзья, запросы, вкладки) с головами игроков, пагинацией и заполнителем пустых слотов.
- Телепортация к другу — на том же сервере или через прокси на сервер друга в сети.
- Статус в сети — локальные игроки и, при наличии Redis, игроки на других серверах той же группы.
- Крючки для сюжета — факт «является ли этот игрок другом» и факт «сколько друзей в сети».
- Плейсхолдеры — количества, списки, имена по индексу и сервер друга, которые можно использовать в любом тексте MiniMessage.
- Инструменты администратора — просматривайте списки и принудительно связывайте или разрывайте дружбу кого угодно командой
/friend admin.
Установка
- Установите расширение GUI, которое рисует меню.
- По желанию, для нескольких серверов: установите расширение MySQL и включите Redis (или Valkey) в его конфигурации, с одним и тем же
redis.group-idна каждом сервере. См. Поведение между серверами. - Поместите JAR-файл Friend в
plugins/Typewriter/extensions/и перезапустите сервер. - Создайте запись Friend Artifact на static-странице и опубликуйте её. Без неё ничего не сохраняется.
Права friend.use и friend.tp по умолчанию выдаются всем, а friend.admin — операторам.
Начало работы
Постройте меню друзей, открываемое командой /friend:
- В веб-панели TypeWriter откройте страницу static и добавьте Friend Artifact. Оставьте
artifactIdравнымfriend_data. - Откройте страницу и добавьте запись Friend Menu. Команда
/friendоткрывает первое найденное Friend Menu, поэтому обычно нужно только одно. - Задайте
inventoryTitle,inventoryRowsиguiType, затем постройте раскладку вlayoutPoolи укажите вmainLayoutIdкорневую раскладку. О раскладках и рамках см. руководства по GUI. - Разместите оформление и кнопки. У предмета выберите значение Friend в
buttonType, напримерFRIEND_STATUSдля счётчика,FRIEND_SETTINGS_TOGGLE_REQUESTSдля переключателя запросов илиNAV_CLOSE, чтобы закрыть меню. - Объявите экраны: добавьте по одному элементу в
viewsна каждый экран, затем перечислите идентификаторы, показывающие друзей, вfriendListViewIds, а идентификаторы, показывающие входящие запросы, вrequestListViewIds. - Задайте, где появляются головы игроков, с помощью
contentX,contentY,contentColumnsиcontentRows. - Опубликуйте, затем выполните в игре
/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
- Accept Friend RequestAccept a friend request
- Friend MenuFriend Menu
- Remove FriendRemove a friend
- Send Friend RequestSend a friend request
- Teleport to FriendTeleport to a friend
Факты2
- Is FriendCheck if player is Friend
- Online Friends CountNumber of online friends
Артефакты1
- Friend ArtifactFriend Data Artifact
Устранение неполадок
Друзья пропадают после перезапуска. Не опубликован ни один 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 — автоматически связывает участников кооперативного острова как друзей.