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.
- 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
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.
- 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”.
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
- Abrir o Lua e procurar um número livre na tabela.
- Copiar a coordenada no jogo. Se a porta estava aberta, ela nunca vai trancar.
- Porta dupla: digitar o par nos dois lados, sem errar o número.
- Reiniciar o recurso para descobrir se funcionou.
- Não funcionou: remover, cadastrar de novo e perder número, nome e par.
Com o doors
/porta, olhe para a folha, aperte R. O número sai sozinho e nunca se repete.- O editor fecha a porta antes de ler a posição. A coordenada sai certa.
- A folha gêmea ao lado é detectada, gravada e vinculada junto.
- A porta vale no mesmo instante. O E já gira a tranca para testar.
- Porta que não encaixou avisa na tela e se conserta com um botão, sem perder nada.
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.
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
Arraste a tela para o lado para ver o resto.
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.
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.
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.
Doze segundos, sem abrir painel nenhum
Sua vezGrave o bloco de celas
Arraste a tela para o lado para ver o resto.
- 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.
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.
Da mira ao “já está valendo” em 19 segundos
Sua vezO painel, funcionando
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.
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.
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.
O jogo não encontrou nenhuma folha de porta nesta coordenada. É por isso que ela nunca tranca.
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.
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.
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
- 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.
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.
É a mesma conta que o recurso faz. Nenhuma linha de config para a porta nascer legível.
Sem montagem: é assim que aparece para quem joga.
Seis quadros tirados da gravação. Clique para ampliar.
1 : 1A interface no pixel do jogo




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/portasportas_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
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.