Friend
Visão geral
O Friend dá a cada jogador uma lista de amigos. Os jogadores enviam um pedido, o outro jogador o aceita ou recusa, e os amigos aceitos podem ver o status online um do outro e se teletransportar até o outro. Tudo está disponível por comandos /friend, por ações e facts do TypeWriter e por um menu que você mesmo desenha no painel web.
Uma amizade é armazenada pelo UUID do jogador, então sobrevive a uma mudança de nome. A lista fica em um único Friend Artifact. Quando a ponte MySQL está instalada com o Redis ativado, pedidos, amizades e presença online são compartilhados entre todos os servidores de uma rede, e /friend tp pode levar um jogador ao servidor onde o amigo dele está.
O menu é um menu GUI: você monta o layout no painel web e marca alguns itens como botões do Friend. As cabeças dos amigos em si são colocadas pela extensão.
Recursos
- Pedidos de amizade — envie, aceite, recuse e remova amigos por comando, entry de ação ou clique no menu.
- Chave de pedidos — cada jogador pode desativar os pedidos recebidos com
/friend toggle. - Menu de amigos — uma entry guarda todas as telas (amigos, pedidos, abas) com cabeças de jogadores, paginação e um preenchimento para slots vazios.
- Teletransporte até um amigo — no mesmo servidor, ou pelo proxy até o servidor do amigo em uma rede.
- Status online — jogadores locais e, com o Redis, jogadores em outros servidores do mesmo grupo.
- Ganchos de história — um fact para "este jogador é amigo" e outro para "quantos amigos estão online".
- Placeholders — contagens, listas, nomes indexados e o servidor de um amigo, utilizáveis em qualquer texto MiniMessage.
- Ferramentas de admin — liste, inspecione e force a ligação ou o desfazimento de amizades de qualquer pessoa com
/friend admin.
Instalação
- Instale a extensão GUI, que desenha o menu.
- Opcional, para vários servidores: instale a extensão MySQL e ative o Redis (ou Valkey) na configuração dela, com o mesmo
redis.group-idem todos os servidores. Veja Comportamento entre servidores. - Coloque o JAR do Friend em
plugins/Typewriter/extensions/e reinicie o servidor. - Crie uma entry Friend Artifact em uma page static e publique. Sem ela, nada é salvo.
As permissões friend.use e friend.tp são concedidas a todos por padrão, e friend.admin aos operadores.
Primeiros passos
Monte um menu de amigos aberto por /friend:
- No painel web do TypeWriter, abra uma page static e adicione um Friend Artifact. Mantenha
artifactIdcomofriend_data. - Abra uma page e adicione uma entry Friend Menu. O comando
/friendabre o primeiro Friend Menu encontrado, então normalmente você só precisa de um. - Defina
inventoryTitle,inventoryRowseguiType, depois monte o layout emlayoutPoole apontemainLayoutIdpara o layout raiz. Veja os guias do GUI para layouts e frames. - Coloque sua decoração e botões. Em um item, escolha um valor Friend em
buttonType, por exemploFRIEND_STATUSpara um contador,FRIEND_SETTINGS_TOGGLE_REQUESTSpara a chave de pedidos ouNAV_CLOSEpara fechar o menu. - Declare as telas: adicione uma entrada a
viewspor tela e depois liste os ids que mostram amigos emfriendListViewIdse os ids que mostram pedidos recebidos emrequestListViewIds. - Defina onde as cabeças dos jogadores aparecem com
contentX,contentY,contentColumnsecontentRows. - Publique e depois execute
/friendno jogo.
Para abrir o menu a partir de uma quest, de um NPC ou de um item, ligue a entry Friend Menu nos triggers de outra entry, ou execute-a como uma ação.
Use o fact Is Friend com targetName definido como o nome de um jogador e depois use o fact em um criteria (o valor 1 significa que são amigos). Use Online Friends Count para recompensas que escalam com uma lista de amigos ativa.
Como funciona
Os dados de cada jogador são carregados quando esse jogador está online no servidor e salvos no artifact em segundo plano. Toda alteração também é publicada no barramento de mensagens sociais, de modo que o servidor que mantém o outro jogador a aplica também.
Menus
A entry Friend Menu é um menu GUI com três partes específicas do Friend.
Cabeças de jogadores. Em uma tela declarada em friendListViewIds, cada amigo é uma cabeça de jogador, com os amigos online primeiro. O clique esquerdo teletransporta até o amigo, o clique direito remove o amigo. Em uma tela declarada em requestListViewIds, o clique esquerdo aceita o pedido e o clique direito o recusa. As cabeças preenchem uma grade a partir de contentX e contentY, de contentColumns por contentRows slots. As células livres mostram emptySlotItem.
Botões. Um item cujo buttonType é um dos valores abaixo é substituído na renderização:
buttonType | O que o jogador vê ou faz |
|---|---|
FRIEND_STATUS | Contagens de amigos online, offline e total. |
FRIEND_LIST | Número total de amigos, ou "no friends" quando a lista está vazia. |
FRIEND_REQUESTS | Número de pedidos pendentes. Um clique abre a view requests quando há pelo menos um. |
FRIEND_SETTINGS_TOGGLE_REQUESTS | Clique para ativar ou desativar os pedidos recebidos. |
FRIEND_ONLINE_HEADER, FRIEND_OFFLINE_HEADER | Cabeçalhos de seção decorativos. |
PAGE_NAV | Seta de página. O clique esquerdo avança, o clique direito volta, o nome mostra o contador de páginas. Oculto quando uma página basta. |
NAV_BACK, NAV_CLOSE | Volta ao menu anterior, fecha o menu. |
FRIEND_ADD, FRIEND_REMOVE, FRIEND_ACCEPT, FRIEND_DECLINE, FRIEND_TP, FRIEND_MSG, FRIEND_PLAYER_SLOT | Itens de exibição com nome e lore fixos, sem ação própria. |
Os outros valores oferecidos pelo editor (NAV_PREV, NAV_NEXT, PENDING_REQUESTS, FRIEND_SLOT, REQUEST_ACCEPT, REQUEST_DECLINE) são mantidos como você os configurou.
Comandos de slot. Um item pode executar comandos que começam com 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>. Eles são executados como o jogador que clicou, sem necessidade de %player%.
Os textos embutidos do menu (título padrão "Amis", nomes de botões e lore das cabeças) estão em francês. Substitua-os pelos nomes e lore de itens que você definir no layout e por inventoryTitle. As mensagens de chat enviadas pelos comandos estão em inglês.
Comportamento entre servidores
O Friend funciona em um único servidor sem nenhum outro plugin. Em uma rede, instale o MySQL e ative o Redis ou Valkey; depois dê a todo servidor da rede o mesmo redis.group-id e um redis.server-name diferente. Sem um group-id, o barramento de mensagens sociais fica em silêncio e cada servidor só vê as próprias alterações.
Com a ponte conectada:
- pedidos, novas amizades, remoções e a chave de pedidos são enviados aos outros servidores;
- um amigo conta como online quando o Redis sabe em qual servidor ele está;
/friend tpem um amigo que está em outro servidor pede ao proxy que conecte você a esse servidor (o proxy deve entender o canalbtc:bridge). Você chega ao servidor, não à posição do amigo.
Os artifacts seguem o armazenamento ativo: quando mysql.enabled é true na configuração do MySQL, o Friend Artifact é armazenado no banco de dados compartilhado, então todo servidor lê a mesma lista de amigos.
Comandos
Todos os comandos exigem friend.use. Aliases: /friends, /f, /amis. O comando sem argumentos abre o primeiro Friend Menu e não imprime nada quando não existe nenhum.
| Comando | Descrição |
|---|---|
/friend | Abre o menu de amigos. |
/friend add <player> | Envia um pedido de amizade. |
/friend accept <player> | Aceita um pedido pendente. |
/friend decline <player> | Recusa um pedido pendente. |
/friend remove <player> | Remove um amigo. |
/friend list | Imprime seus amigos no chat com o status online. |
/friend toggle | Ativa ou desativa os pedidos de amizade recebidos. |
/friend tp <player> | Teletransporta até um amigo (exige também friend.tp). |
/friend admin list <player> | Lista os amigos de um jogador online (exige friend.admin). |
/friend admin requests <player> | Lista os pedidos pendentes de um jogador online. |
/friend admin add <player> <player> | Torna dois jogadores online amigos, sem a etapa de pedido. |
/friend admin remove <player> <friend> | Remove um amigo da lista de um jogador online. |
Permissões
| Permissão | Padrão | Concede |
|---|---|---|
friend.use | Todos | Todos os comandos /friend. Os cliques no menu executam as mesmas ações sem verificá-la. |
friend.tp | Todos | /friend tp. O clique na cabeça no menu executa o teletransporte diretamente e não verifica esta permissão. |
friend.admin | Operadores | Os comandos /friend admin. |
Placeholders
São tags do MiniPlaceholders, escritas em texto MiniMessage como <friend_count>. Os booleanos retornam 1 ou 0.
| Placeholder | Retorna |
|---|---|
<friend_count> | Número de amigos do jogador. |
<friend_online_count> | Número de amigos online neste servidor. |
<friend_online_network_count> | Número de amigos conhecidos como online em qualquer servidor do grupo. |
<friend_requests_count> | Número de pedidos pendentes. |
<friend_requests_enabled> | 1 quando os pedidos recebidos são permitidos. |
<friend_list> | Nomes dos amigos separados por vírgula. |
<friend_online_list> | Nomes dos amigos online neste servidor. |
<friend_name:index> | Nome do amigo nessa posição, começando em 0. |
<friend_online_name:index> | Nome do amigo online nessa posição, começando em 0. |
<friend_is_friend:name> | 1 quando o jogador indicado é um amigo. |
<friend_server:name> | Servidor onde o jogador indicado está online, vazio quando desconhecido. |
Entries
8 entradas, geradas a partir do código-fonte da extensão.
Ações5
- 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
Fatos2
- Is FriendCheck if player is Friend
- Online Friends CountNumber of online friends
Artefatos1
- Friend ArtifactFriend Data Artifact
Solução de problemas
Os amigos desaparecem após um reinício. Nenhum Friend Artifact está publicado, então os dados só existem na memória. Adicione o artifact em uma page static e publique.
/friend não faz nada. O comando abre a primeira entry Friend Menu e fica em silêncio quando não há nenhuma. Crie e publique um Friend Menu. Os subcomandos como /friend list funcionam sem um menu.
O pedido foi enviado, mas o outro jogador nunca o recebe. O destinatário deve estar online em um servidor da rede quando o pedido é enviado. Pedidos para jogadores offline não são mantidos, e o remetente ainda é informado de que o pedido foi enviado. Com vários servidores, verifique se redis.group-id tem o mesmo valor em todos, caso contrário os pedidos não cruzam servidores.
A lista de amigos está vazia em um segundo servidor. Cada servidor precisa do mesmo redis.group-id, de um redis.server-name único, e mysql.enabled deve ser true para que o artifact seja compartilhado pelo banco de dados. Verifique nos logs da extensão MySQL se há erros de conexão com o Redis.
A grade de cabeças está vazia ou mostra apenas itens de preenchimento. A tela atual não está listada em friendListViewIds nem em requestListViewIds. Quando o menu declara views, apenas os ids listados ali exibem cabeças. Sem views, defina view como friends ou requests.
Teletransportar até um amigo não faz nada em outro servidor. O proxy deve tratar o canal btc:bridge e a presença no Redis deve estar funcionando. Sem conexão de rede, /friend tp só funciona se o amigo estiver no mesmo servidor.
Extensões relacionadas
- MySQL — mensageria Redis, presença e armazenamento compartilhado para amigos entre servidores.
- GUI — layouts, views e botões usados pelo menu de amigos.
- Party e Guild — os outros sistemas sociais construídos sobre o mesmo barramento de mensagens.
- BTC Sky — liga automaticamente os membros de ilhas cooperativas como amigos.