doorsEvolutionInc
Controle de acesso para FiveM

Olhe para a porta. Grave. Já está trancada.

doors é o sistema de portas do Nivora Framework. O admin cadastra a porta olhando para ela, dentro do jogo, sem abrir arquivo e sem restart. O jogador ganha uma tranca desenhada no próprio cenário, no lugar do “Pressione E” no rodapé.

Todo vídeo e toda captura desta página foram gravados em jogo, no servidor.

Gravado em jogo Saguão da delegacia · dez portas no raio 0:00
LSPDAcesso policial TrancadaE
  • 0restarts para uma porta nova começar a valer
  • 12toques de R para gravar um corredor de doze celas
  • 24 mde perímetro revelado ao segurar I
  • 100+portas já mapeadas na carga inicial
01No jogo

Dois minutos de jogo: do /porta ao prédio inteiro mapeado.

Uma delegacia sem nenhuma porta cadastrada. Em 2 min 14 s, sete portas são gravadas, testadas e usadas, sem sair do jogo. Escolha um capítulo ou assista do começo.

Gravado em jogo O editor liga 2:14
  • 7portas gravadas no vídeo, da #210 à #216
  • 2portas duplas detectadas e vinculadas sozinhas
  • 0arquivos abertos, restarts ou saídas do jogo

    Os painéis de polícia, status e minimapa que aparecem na tela são de outros recursos do mesmo servidor. Do doors são os núcleos de tranca, o cartão da porta, o painel Perímetro, a barra de mira, o painel de gravação e os avisos “Portas”.

    02O problema

    Toda porta cadastrada à mão é uma porta esperando para quebrar.

    Coordenada copiada com a porta aberta, número repetido, par digitado errado de um dos lados. A linha fica perfeita no arquivo e a porta nunca tranca. O doors tira essas decisões da mão de quem cadastra.

    Do jeito de sempre

    1. Abrir o Lua e procurar um número livre na tabela.
    2. Copiar a coordenada no jogo. Se a porta estava aberta, ela nunca vai trancar.
    3. Porta dupla: digitar o par nos dois lados, sem errar o número.
    4. Reiniciar o recurso para descobrir se funcionou.
    5. Não funcionou: remover, cadastrar de novo e perder número, nome e par.

    Com o doors

    1. /porta, olhe para a folha, aperte R. O número sai sozinho e nunca se repete.
    2. O editor fecha a porta antes de ler a posição. A coordenada sai certa.
    3. A folha gêmea ao lado é detectada, gravada e vinculada junto.
    4. A porta vale no mesmo instante. O E já gira a tranca para testar.
    5. Porta que não encaixou avisa na tela e se conserta com um botão, sem perder nada.
    03O que o jogador vê

    Uma tranca que existe no mundo, não no rodapé.

    Cada porta ganha um núcleo de tranca ancorado no lugar onde ela está, com um cartão ao lado: o grupo, o nome da porta, o estado e a tecla.

    Gravado em jogo Porta dupla · um E, duas folhas 0:00

    O núcleo dá meia volta. A porta gêmea gira junto.

    No vídeo, a porta #210 e o par #211 destrancam com um toque. O giro só acontece quando o servidor confirma; até lá a tecla apaga, para ninguém achar que o E não pegou.

    Trancada

    Hexágono vermelho, anel de fio contínuo, cadeado fechado.

    Destrancada

    Anel tracejado girando devagar. A lingueta levanta de verdade.

    Sem credencial

    Hexágono cinza com corte diagonal, e a tecla some do cartão.

    Sua vezA NUI do recurso, rodando aqui

    E
    Clique em uma porta para chegar perto

    Arraste a tela para o lado para ver o resto.

    Você é
    04Modo perímetro

    Segure I e o cenário mostra a camada de acesso.

    Um núcleo para cada porta num raio de 24 m, no lugar real dela. É a visão de quem tem credencial: quem não carrega nenhum grupo de porta não tem camada para revelar.

    Gravado em jogo Corredor · sete portas no raio 0:00

    O que acontece neste trecho

    Raio-x de verdade

    Porta atrás de parede aparece esmaecida e tracejada. A leitura vem de um teste de linha de visão real, não de distância.

    Marcador na moldura

    Porta no raio mas fora do enquadramento vira um marcador na borda da tela, na direção em que ela está.

    Painel do perímetro

    Bairro, contagem por estado e as credenciais que o jogador carrega, na faixa da tela que o chat e a HUD deixam livre.

    Nunca some

    De costas para a porta, o aviso desce para uma pílula no rodapé em vez de desaparecer. Teste no palco acima.

    05O editor · /porta

    Um corredor de doze celas são doze toques de R.

    A porta na mira acende: verde se ainda não está no banco, azul se já foi gravada. R grava com o mesmo perfil da última vez.

    Gravado em jogo Duas salas, três portas, dois toques 0:00

    Doze segundos, sem abrir painel nenhum

    Sua vezGrave o bloco de celas

    LSPD · BLOCO DE CELAS
    12 celas gravadas. Nenhum arquivo aberto, nenhum restart.
    PORTAS

    Porta nova
    Qpainel Rgravar Vpar DELremover BACKSPACEsair
    perfil do R LSPD Polícia · trancada · 1.5 m

    Arraste a tela para o lado para ver o resto.

    128portas no banco
    #220próximo número
    0restarts
    • QPainelGrupo, alcance, estado inicial, nome e par.
    • RGravar diretoCom o mesmo perfil da última porta.
    • VVincular parLiga duas folhas como porta dupla, ou desfaz.
    • DELRemoverDois toques, para não apagar no reflexo.
    • ETestarA tranca continua valendo dentro do editor.
    • BACKSPACESairEntrar num veículo também desliga o modo.
    06O painel

    Quatro decisões. O resto o editor resolve sozinho.

    O painel pede só o que é escolha de quem administra: quem abre, de que distância, como a porta nasce e que nome ela tem.

    Gravado em jogo A primeira porta da delegacia 0:00

    Da mira ao “já está valendo” em 19 segundos

    Sua vezO painel, funcionando

    Gravar porta-587.51 -416.08 35.15 · modelo -1498371782
    nova
    porta nova
    GrupoPolícia · LSPD
    Alcancemetros até responder
    Estado inicial
    Porta duplahá outra folha do mesmo modelo a 2.09 m
    Nomeopcional
    PORTAS

    Enter escolhe o grupo · Enter de novo grava · Esc sai

    Os grupos e a contagem ao lado de cada um são os do banco de portas deste servidor.

    • A coordenada

      A porta é fechada pelo door system antes de a posição ser lida. Coordenada tirada de porta escancarada é o erro clássico de quem cadastra à mão.

    • A porta dupla

      Outra folha do mesmo modelo ao lado, até 2,6 m e no mesmo nível: as duas acendem juntas, são gravadas e ligadas uma na outra.

    • O número

      Sai sozinho e nunca se repete, nem depois de remover uma porta. Hoje o banco tem 128 portas e a próxima será a #220.

    • A porta repetida

      Gravar de novo uma porta que já existe edita aquela porta, em vez de criar uma segunda tranca no mesmo objeto.

    • A conferência

      Toda porta gravada é medida ao entrar na mira: o recurso pergunta ao jogo se a entrada casou com uma folha de verdade e diz na tela quando não casou.

    07Diagnóstico

    A porta que “está bugada” se denuncia sozinha.

    Porta com coordenada errada aparece na tela, entra na contagem e nunca tranca. Era o defeito que custava meia hora e terminava em cadastrar tudo de novo.

    • O aviso chega antes da reclamação

      O cartão da mira diz que a porta não encaixou no momento em que o admin olha para ela.

    • O conserto está no mesmo lugar

      Reassentar a porta nesta folha: o editor fecha a folha, lê a posição certa e troca só a coordenada.

    • Nada se perde

      Número, nome, grupo e par ficam onde estavam.

    • Par que a detecção não pega

      Portão partido no meio, folhas de modelos diferentes: V em uma, V na outra, e elas giram juntas.

    #57 LSPD Polícia trancada
    467.36, -1014.40, 26.48 · modelo -692649124 · alcance 1.5 m

    Esta porta está no banco, mas o jogo não casou ela com nenhuma folha aqui: ela nunca vai trancar. Abra o painel com Q para reassentar.

    Qpainel Raplicar perfil Vvincular par DELremover BACKSPACEsair
    Editar porta #57467.36, -1014.40, 26.48 · modelo -692649124
    editar

    O jogo não encontrou nenhuma folha de porta nesta coordenada. É por isso que ela nunca tranca.

    08Segurança

    A tela escolhe. Quem decide é o servidor.

    Nada do que a NUI manda define permissão, e a página nunca manda coordenada. Se pudesse mandar, um erro na tela viraria porta no meio do mar.

    Permissão conferida a cada gravação

    O editor abre para o grupo Admin até o nível 3 por padrão, configurável. O servidor confere de novo em toda gravação, não só na abertura.

    Posição e modelo ficam no cliente

    Capturados pela mira e congelados enquanto o painel está aberto. A página só escolhe grupo, alcance, estado e nome.

    Grupo que não existe é recusado

    O grupo da porta precisa existir em Groups.lua. No start, o banco é varrido e o console avisa sobre grupo que sumiu.

    Arquivo quebrado não é sobrescrito

    JSON inválido: o recurso avisa no console, sobe com zero portas e não grava nada por cima, para o arquivo poder ser consertado.

    Girar a chave não toca o disco

    O arquivo guarda como a porta nasce. O E mexe só no statebag: nenhuma escrita em disco a cada tranca.

    Acesso certo para os dois tipos de grupo

    Grupo direto e grupo guarda-chuva são conferidos cada um do seu jeito. Porta de grupo com Parent abre para quem deve.

    09Desempenho

    Cem portas no mapa, catorze na tela, zero trabalho à toa.

    O laço de quadro só projeta o que sobrou de um passe lento. O que custa caro acontece poucas vezes por segundo, ou só quando algo muda.

    Onde
    Antes
    Agora
    Leitura das portas
    O statebag inteiro era lido e desserializado a cada quadro.
    O índice vive em Lua e só é remontado quando o statebag muda.
    Uma chave girada
    Todo jogador do servidor reaplicava o estado de 100+ portas.
    Cada cliente aplica só a porta que mudou.
    O aperto do E
    A chamada ao servidor congelava o laço de tick até a resposta.
    Disparo sem espera: o laço nunca fica preso ao servidor.
    Porta nova
    Só era registrada no boot: aparecia na tela e não trancava.
    Registrada, solta ou reposicionada a cada mudança, na hora.

    14 núcleos

    É o teto de marcadores na tela. O raio de 24 m pode pegar 25 portas; só as que cabem são projetadas.

    250–500 ms

    O passe lento monta a lista de candidatas. O passe de quadro só desenha.

    Raycast assíncrono

    Os raios saem num ciclo de 220 ms e são colhidos no seguinte. Custo por quadro: zero.

    NUI que não repagina

    Posição por transform, texto escrito só quando muda, nó clonado de <template>.

    O quadro viaja como texto, não como tabela

    12,442,613,74,27,0;18,0,0,131,5,-96
    • número da porta
    • x, y em milésimos da tela
    • distância em décimos de metro
    • estado em bits
    • ângulo fora da tela

    Duas portas em 34 caracteres. A #12 está a 7,4 m, na tela, trancada, com credencial e em foco. A #18 está a 13,1 m, trancada, atrás de parede e fora do enquadramento, a 96° à esquerda. Montar isso por concatenação custa muito menos que serializar uma tabela por porta a cada quadro.

    10Identidade

    Cada organização tem cor e sigla. Até a que você criou ontem.

    O título do cartão nunca é “Porta 73”. É o nome que alguém deu à porta, ou a frase do grupo. E grupo novo não cai num genérico: a sigla e a cor saem do próprio nome, sempre as mesmas em qualquer cliente.

    LSPDPolícia · Acesso policial EMERGEmergência · Acesso de emergência EMSParamédico · Ala hospitalar MECMecânico · Área da oficina ARRArriba Aviação · Área da Arriba ASLAsilo · Ala do asilo ADMAdministração · Acesso administrativo

    É a mesma conta que o recurso faz. Nenhuma linha de config para a porta nascer legível.

    BENBennys
    BEN Acesso Bennys Trancada E
    11Telas reais

    Sem montagem: é assim que aparece para quem joga.

    Seis quadros tirados da gravação. Clique para ampliar.

    1 : 1A interface no pixel do jogo

    Painel Gravar porta com a lista de grupos, alcance, estado inicial e porta dupla
    O painel de gravaçãoLista de grupos com a contagem de portas de cada um, alcance em presets, estado inicial e a folha gêmea já detectada.
    Barra de mira: Porta nova, ainda não está no banco, livre
    A barra de miraCoordenada, modelo e distância da gêmea. As teclas dizem o que fazem nesta porta.
    Núcleo verde e cartão LSPD, Acesso policial, destrancada, E
    O cartão da portaSem nome próprio, o título é a frase do grupo. Nunca “Porta 212”.
    Aviso Portas: Porta 210 gravada com o par 211. Já está valendo.
    O aviso“Já está valendo” é literal: a porta responde no mesmo segundo.
    12Ficha técnica

    Sem build, sem banco de dados, sem surpresa.

    Base
    vRP · Nivora FrameworkLua 5.4, grupos lidos de Groups.lua
    Interface
    HTML, CSS e JS purosSem passo de build: editar e reiniciar o recurso é o ciclo inteiro
    Portas
    data/doors.jsonEscrito em jogo. Um arquivo, fácil de versionar e de copiar entre servidores
    Comandos
    /porta /portas portas_exportarEditor, perímetro fixo e exportação para Lua pelo console
    Teclas
    E tranca · I perímetroEscolhidas entre as que nenhum outro recurso do servidor mapeia; o jogador pode trocar o perímetro nas configurações do FiveM
    Config
    Aparência, teclas e ajuste finoRaio, limite de marcadores, filtro de câmera, cor e frase de cada grupo, quem abre o editor
    Primeiro boot
    Carga inicial com 100+ portasCopiada uma única vez para o arquivo; depois quem manda é o que foi gravado em jogo
    Convivência
    Não disputa foco nem telaSó o painel do editor pede foco de NUI. A HUD sai da frente enquanto ele está aberto
    doors/
    ├─ shared/config.lua      teclas, raio, cor de cada grupo
    ├─ client/core.lua        índice, door system, foco, interação
    ├─ client/perimeter.lua   o modo de visibilidade
    ├─ client/editor.lua      o /porta: mira, captura, painel
    ├─ server/database.lua    carregar, gravar, publicar
    ├─ server/core.lua        permissão e credenciais
    ├─ server/editor.lua      validação e gravação
    ├─ server/seed.lua        a carga inicial
    ├─ data/doors.json        o banco de portas
    └─ web/                   a NUI, vanilla
    doors · EvolutionInc

    Pare de cadastrar porta. Comece a olhar para ela.

    Um sistema de portas que o admin configura em jogo, que o jogador lê de longe e que não cobra do servidor por existir. Fale com a equipe EvolutionInc no Discord para colocar o doors no seu servidor.