Pular para o conteúdo principal

Friend

Listas de amigos, solicitações e teleporte até amigos, com menu GUI e sincronização entre servidores opcional.

Privadasv0.1.0Social
RequerTypeWriter0.9.0-beta-177 (BTC build)GUI (TypeWriter extension)MySQL (TypeWriter extension)opcionalRedis or Valkeyopcional

Criada para a rede BornToCraft. Esta extensão é documentada como referência e não é distribuída.

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​

  1. Instale a extensão GUI, que desenha o menu.
  2. 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-id em todos os servidores. Veja Comportamento entre servidores.
  3. Coloque o JAR do Friend em plugins/Typewriter/extensions/ e reinicie o servidor.
  4. 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:

  1. No painel web do TypeWriter, abra uma page static e adicione um Friend Artifact. Mantenha artifactId como friend_data.
  2. Abra uma page e adicione uma entry Friend Menu. O comando /friend abre o primeiro Friend Menu encontrado, então normalmente você só precisa de um.
  3. Defina inventoryTitle, inventoryRows e guiType, depois monte o layout em layoutPool e aponte mainLayoutId para o layout raiz. Veja os guias do GUI para layouts e frames.
  4. Coloque sua decoração e botões. Em um item, escolha um valor Friend em buttonType, por exemplo FRIEND_STATUS para um contador, FRIEND_SETTINGS_TOGGLE_REQUESTS para a chave de pedidos ou NAV_CLOSE para fechar o menu.
  5. Declare as telas: adicione uma entrada a views por tela e depois liste os ids que mostram amigos em friendListViewIds e os ids que mostram pedidos recebidos em requestListViewIds.
  6. Defina onde as cabeças dos jogadores aparecem com contentX, contentY, contentColumns e contentRows.
  7. Publique e depois execute /friend no 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.

Condicione diálogos à amizade

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.

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:

buttonTypeO que o jogador vê ou faz
FRIEND_STATUSContagens de amigos online, offline e total.
FRIEND_LISTNúmero total de amigos, ou "no friends" quando a lista está vazia.
FRIEND_REQUESTSNúmero de pedidos pendentes. Um clique abre a view requests quando há pelo menos um.
FRIEND_SETTINGS_TOGGLE_REQUESTSClique para ativar ou desativar os pedidos recebidos.
FRIEND_ONLINE_HEADER, FRIEND_OFFLINE_HEADERCabeçalhos de seção decorativos.
PAGE_NAVSeta 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_CLOSEVolta ao menu anterior, fecha o menu.
FRIEND_ADD, FRIEND_REMOVE, FRIEND_ACCEPT, FRIEND_DECLINE, FRIEND_TP, FRIEND_MSG, FRIEND_PLAYER_SLOTItens 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%.

Idioma

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 tp em um amigo que está em outro servidor pede ao proxy que conecte você a esse servidor (o proxy deve entender o canal btc: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.

ComandoDescrição
/friendAbre 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 listImprime seus amigos no chat com o status online.
/friend toggleAtiva 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ãoPadrãoConcede
friend.useTodosTodos os comandos /friend. Os cliques no menu executam as mesmas ações sem verificá-la.
friend.tpTodos/friend tp. O clique na cabeça no menu executa o teletransporte diretamente e não verifica esta permissão.
friend.adminOperadoresOs comandos /friend admin.

Placeholders​

São tags do MiniPlaceholders, escritas em texto MiniMessage como <friend_count>. Os booleanos retornam 1 ou 0.

PlaceholderRetorna
<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
Fatos2
Artefatos1

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.