Pular para o conteúdo

Instalação

Dez minutos, e a maior parte do tempo é a esperar que o servidor inicie. Não há ficheiro SQL para importar nem um segundo programa para executar — as tabelas constroem-se sozinhas na primeira vez que o resource inicia.

Cada passo abaixo termina com como saber que funcionou, para que nunca avance na dúvida.


O que precisaPorquê
oxmysql, em execuçãoTudo o que o telemóvel memoriza vive na sua base de dados
ESX, QBCore, QBox ou fmLibDetetado automaticamente; não precisa de dizer qual é
Um servidor FiveM dos últimos dois anosA parte web do telemóvel usa o Node integrado do próprio servidor

Mais nada. Sem npm, sem passo de build, sem servidor web.


Coloque mic_phone nos seus resources — dentro de uma pasta entre parênteses retos fica mais organizado:

resources/[mic]/mic_phone/

Mantenha a pasta com o nome mic_phone. Nada quebra se a renomear, mas o endereço web do telemóvel é construído a partir do nome da pasta, pelo que tudo o que estiver escrito sobre ele também mudaria.


No server.cfg, abaixo do oxmysql e abaixo da sua framework:

ensure oxmysql
ensure es_extended # or qb-core / qbx_core
ensure mic_phone

Funcionou quando a consola disser, ao iniciar:

[mic_phone] web: door B listening on http://0.0.0.0:30125 · door A at /mic_phone/web/ on the game port

Se vir uma linha vermelha sobre uma framework, inicie o mic_phone depois da sua framework — quase sempre é esse o motivo.


O primeiro arranque lê sql/schema.sql e cria tudo o que faltar. Verá uma sequência de linhas CREATE TABLE IF NOT EXISTS mic_phone_… a passar. É só isso.

Funcionou quando essas linhas aparecerem uma vez e nunca mais nos arranques seguintes.


Por padrão, o telemóvel precisa de um item de inventário chamado phone:

-- shared/config.lua
Config.Open = {
RequireItem = true,
Item = 'phone',
...
}

A maioria dos servidores ESX e QB já tem esse item. Utilizadores de ox_inventory: adicionem-no à vossa lista de itens se ainda lá não estiver. Está apenas a testar? Defina RequireItem = false e salte este passo completamente.

Funcionou quando entrar no servidor, tiver o item consigo e F1 abrir o telemóvel. /phone faz o mesmo, e T desdobra-o para tablet enquanto está aberto.


Copie o exemplo e preencha o que desejar:

shared/server_config.example.lua → shared/server_config.lua

Este ficheiro é carregado apenas como script de servidor, pelo que nada nele chega alguma vez a um jogador. Duas coisas vivem lá:

Fotos, vídeos e notas de voz. Coloque um token de media do Fivemanage em ServerConfig.Media.Token (ou na convar FIVEMANAGE_MEDIA_API_KEY) e o telemóvel carrega os ficheiros sozinho, guardando apenas o link resultante. Um webhook do Discord funciona como alternativa.

Sem nenhum dos dois definido, FallbackToDataUrl guarda o ficheiro dentro da sua base de dados. Isso serve para um teste, mas é pesado em produção — alguns segundos de voz representam dezenas de kilobytes em cada linha afetada. Defina um token ou desative essa opção e deixe os envios falharem de forma visível.

Webhooks do Discord. Um URL por tipo de evento, ou Default para apanhar tudo. O único que vale a pena configurar mesmo que ignore o resto é Server: é o único que o avisa sobre o servidor em vez de um jogador — o endereço mudou, um certificado não foi renovado.


O telemóvel funciona. Tudo abaixo é opcional.


Os jogadores podem levar o telemóvel da sua personagem no seu próprio aparelho. Já vem ativado: Definições › Dispositivos vinculados no telemóvel dentro do jogo mostra um código QR, eles leem-no e digitam os seis dígitos apresentados de volta no jogo. Esse dispositivo passa então a agir como essa personagem.

Por HTTP simples, isso já lhes dá mensagens, correio, contactos, garagem, propriedades e o resto. O que um navegador não entrega a uma página insegura é a melhor parte:

HTTP simplesHTTPS
Mensagens, correio, garagem, tudo o restosimsim
Notificações com a aplicação fechadanãosim
Chamadasnãosim
O microfone, para notas de voznãosim
Instalá-lo como aplicação, com o seu próprio íconenãosim

Este resource pode obter e renovar o seu próprio certificado. Aponte um domínio para o seu servidor, abra duas portas e preencha três linhas:

-- shared/server_config.lua (server-only: this file is never sent to a client)
ServerConfig.Web = {
Url = 'https://phone.yourserver.com/',
Https = {
Enabled = true,
Names = { 'phone.yourserver.com' },
Contact = '[email protected]',
},
}
  1. Um nome. Numa VPS, isso é um registo A a apontar para o seu endereço. Não tem domínio? duckdns.org dá-lhe um gratuito num minuto.
  2. Porta 80 e porta 443 abertas na firewall. A 80 só é aberta enquanto um certificado está a ser pedido e fecha-se novamente assim que a resposta é dada.

Funcionou quando a consola disser:

https: asking for phone.yourserver.com
https: port 80 open for the challenge
https: challenge port closed
https: certificate in hand, good until 2027-01-31
https: listening on https://phone.yourserver.com/

Se a 443 estiver ocupada — alguns routers reservam-na para a sua própria página de administração — sirva noutra porta: Port = 8443, encaminhe a 8443 e escreva Url = 'https://phone.yourserver.com:8443/'. Apenas o desafio tem de passar pela 80; um certificado pertence a um nome, não a uma porta, e tudo continua a funcionar.

docs/HTTPS.md cobre as outras situações: atrás do proxy Cfx.re, atrás de um reverse proxy que já execute, ou num alojamento que não lhe disponibilize portas.


phonehttps check — pergunta ao servidor de testes da autoridade de certificação se consegue comunicar com a sua máquina. Execute isto primeiro quando não chegar nenhum certificado: separa a sua firewall deste resource.

phonehttps — mostra o estado do certificado e quando será renovado.

phoneduck — mostra o estado do domínio, caso este servidor mantenha o seu próprio nome DuckDNS apontado para si mesmo, e quando o comunicou pela última vez. phoneduck now envia o endereço atual e imprime o que o DuckDNS respondeu, o que é a forma ideal de descobrir se um token está errado sem esperar que o endereço mude.

O que vêO que é
O telemóvel não abreFalta o item phone, ou RequireItem está ativo e o jogador não tem um consigo
O QR aponta para um endereço inacessívelDefina ServerConfig.Web.Url manualmente; a deteção automática não vê além de um router que mudou a porta
Sem certificado, e o registo culpa o desafio (challenge)A porta 80 não está a chegar a esta máquina. Verifique o encaminhamento de portas e a firewall, nesta ordem
As fotos são enormes / a base de dados cresce rapidamenteSem token de media, e FallbackToDataUrl está a guardar ficheiros na base de dados
As chamadas entre dois jogadores ficam mudasA voz está em auto e não encontrou nenhum resource de voz; indique o seu em Config.Bridge.voice

  • shared/server_config.lua é seu. Nunca o partilhe nem o envie para repositórios públicos; ele guarda o seu token de media e os URLs dos seus webhooks.
  • Aponte o webhook Server para um canal que você leia. É ele que avisa se a porta principal do telemóvel deixar de funcionar, e é o único aviso que terá antes que um jogador lhe diga.
  • Desative Config.Debug se o tiver ativado: ele imprime todas as decisões da bridge na consola.
  • Segurança vale dez minutos de leitura se gerir uma cidade pública: o que este resource assume sobre as pessoas que se ligam a ele e as regras que mantém para que um cliente modificado não consiga ir além da sua própria personagem.