A ideia que organiza tudo
O hardware é de verdade, então o sistema também precisa ser. Gabinete, placa-mãe, processador, cooler, memória, vídeo, disco e fonte são itens físicos, e a bancada só deixa ligar o que um PC de verdade ligaria. As fases seguintes da rede — invasão, mineração, sistemas de trabalho — vão perguntar "quanto este PC aguenta?", e um hacker de placa topo não pode ser a mesma pessoa que o de computador de escritório.
O OrionOS é a outra metade. Passou no POST e achou disco, a bancada vira um monitor e o sistema roda dentro dele, num iframe da NUI. Área de trabalho, janelas, Core Office (Word, Excel, PowerPoint e PDF), terminal, e-mail, e para cada organização o app Servidor de contas.
A tela não decide nada. Onde a peça encaixa, se a senha confere, se a conta pode criar outra conta — tudo chega pronto do servidor. A tela repete algumas regras só para responder na hora, com a mesma mensagem, e o servidor confere de novo sempre.
Os arquivos
- server/hardware.lua — as regras puras do hardware. Não toca em banco nem inventário: dá para conferir lendo e testar fora do jogo.
- server/main.lua — a bancada: montar, desmontar, overclock, ligar. É quem abre a sessão do sistema.
- server/os.lua — o sistema ligado ao jogo: disco, instalação, senha do PC de casa, porta das contas.
- server/diretorio.lua — o servidor de contas de cada organização.
- web/os/ — o OrionOS.
jogo.jsé a ponte; fora do jogo ele se desliga e o sistema roda com dados de exemplo, para desenhar no navegador.
O boot de cada placa-mãe
Cada placa liga do jeito do fabricante dela. A tela do POST, a BIOS, as teclas e — o que realmente muda o conserto — o jeito de avisar que algo deu errado. O perfil mora em shared/bios.lua, e a placa aponta para ele pelo campo bios na ficha técnica.
| Placa | Fabricante · BIOS | Avisa por | Teclas |
|---|---|---|---|
H610M | Gigabit · Awarde, BIOS de texto | bipe — memória: longos repetidos; vídeo: um longo e dois curtos | DEL / F12 |
A520M | ASRook · American Megatrons, BIOS de texto | bipe — memória: três curtos; vídeo: um longo e oito curtos | F2 / F11 |
B550 | MSY Click BIOS, UEFI | LEDs CPU, DRAM, VGA, BOOT | DEL / F11 |
B650M | Gigabit Aurus, UEFI | LEDs | DEL / F12 |
X670E | Gigabit Aurus Master, UEFI | display de Q-Code | DEL / F12 |
Z790 | ASOS ROC Maximus, UEFI | display de Q-Code | DEL / F7 |
O Q-Code não vem com legenda, como na placa de verdade: 00 processador, 55 memória, d6 vídeo, A2 sem de onde dar boot, AA entregou ao sistema. Quem só conhece bipe fica perdido numa placa sem alto-falante — e é de propósito: trocar de placa muda o jeito de consertar.
Passou no POST, o monitor mostra o boot da placa em tela cheia antes do OrionOS: a BIOS de texto rola as linhas, a UEFI mostra só o logo e as teclas.
.tela .ln começava com opacity: 0, e a animação surgir só define o quadro inicial. Animação sem quadro final termina no valor do próprio elemento — que era zero. A tela da BIOS existia desde a primeira versão da bancada e ninguém nunca a viu. Agora é animation: surgir .2s both: invisível durante o atraso, visível no fim.
Dê bios e modelo na ficha da placa em shared/pecas.lua. Sem isso ela cai no perfil genérico, e o teste de hardware reclama.
O Setup e o menu de boot
Enquanto a tela do POST está de pé, a tecla do fabricante abre o Setup e a outra abre o menu de boot — dá para clicar na linha das teclas, no rodapé da tela, em vez de acertar a tecla. Cada fabricante tem a sua cara, e por baixo é o mesmo modelo de páginas e itens (web/bios.js, conferido por server/bios.lua):
- Awarde — o menu azul em duas colunas, destaque vermelho, cada entrada abre uma tela.
- American Megatrons — faixa azul, abas no topo, corpo cinza e a ajuda do item à direita.
- UEFI — gráfica, na cor da marca: a MSY com o menu de lado, a Aurus e a ROC com abas, cartões de processador, memória e armazenamento, e um monitor de hardware na coluna da direita.
O que se muda ali muda o teste seguinte, porque salvar reinicia o computador: o servidor apaga o último POST, desliga a sessão do sistema e a tela aperta o botão de novo.
A bancada não repete a tela do POST — ela mostra a conta do consumo aberta, watt por watt (processador, vídeo, placa-mãe, memória, discos, ventoinhas), e a ficha da placa: versão da BIOS, as duas teclas, como ela avisa defeito, e o que está gravado no Setup dela (velocidade da memória e se o perfil está ligado, curva das ventoinhas, de qual disco ela dá boot, se tem senha). A tela do fabricante aparece onde ela existe de verdade: no monitor.
| Item | O que faz de verdade |
|---|---|
| Ordem de boot | de qual disco o sistema sobe. O menu de boot (F12, F11, F7…) escolhe só desta vez, sem gravar |
| Perfil de memória XMP, DOCP, A-XMP ou EXPO, conforme a placa | desligado, a memória roda na velocidade da norma — DDR4 2133, DDR5 4800 — e o processador rende cerca de 8% menos. O POST avisa |
| Overclock | o mesmo número da bancada. Passar do que o silício aguenta é tela azul no boot seguinte |
| Curva das ventoinhas | silencioso esquenta 12%, turbo esfria 10% |
| Senha do supervisor | pedida para entrar no Setup. Hash bcrypt, como as contas; três erros travam a placa até religar |
Tudo isso fica preso ao número de série da placa-mãe. Trocar a placa volta tudo ao padrão de fábrica, como numa placa nova — e a placa antiga leva a senha embora.
É o jumper da placa: com o gabinete aberto e o kit de ferramentas na mão, o botão Limpar CMOS da bancada zera a configuração, a senha e o overclock. Custa abrir o gabinete ao lado dele — e é a única saída. Enquanto a senha existir, o controle de overclock da bancada fica travado, porque overclock se mexe no Setup.
Só quando a tela chegou a ficar de pé: PC que liga, PC sem disco e até a tela azul do overclock — que é justamente onde se precisa dele para desfazer o exagero. Proteção térmica e placa sem imagem não dão tempo.
Os números de série
Cada PC tem a sua chave, e cada disco tem o seu número. A chave (PC-XXXXX-XXXXX-XXXXX) nasce com o gabinete e aparece na bancada e na moldura do monitor. O id numérico continua existindo como endereço interno; a chave é o que o dono vê, anota e denuncia quando roubam.
O que decide onde moram os arquivos é o disco (DK-XXXXXXXX). Os arquivos são do disco, não do PC: tirar o SSD de um gabinete e montar em outro leva tudo junto. É o que faz roubar um disco valer alguma coisa.
Disco sem linha em rp_computer_discos nunca teve sistema, e o OrionOS abre o instalador. No PC de organização a instalação é automática, "gerenciada pelo TI", com o nome do lugar. No PC pessoal a pessoa escolhe o nome do computador, o próprio nome e uma senha opcional. Instalar formata: o que sobrou de um sistema apagado vai embora.
Os PCs que já existiam no banco antes da chave ganharam uma na primeira subida, junto com a organização calculada pelo lugar.
Do botão à área de trabalho
O computador é que fica ligado, e não a sessão de quem está na frente dele. Sair de perto fecha a tela, mas não desliga nada: voltar cai na mesma área de trabalho, com a mesma conta logada e as mesmas janelas abertas — como o PC do plantão, que ninguém desloga. Quem quiser fechar de verdade aperta o botão de energia; o restart do servidor é a queda de energia que apaga a cidade inteira.
PC deixado logado é PC aberto para quem sentar depois. Prontuário na tela, e-mail aberto, o app do servidor na mão de quem chegou — o cuidado de sair da conta passa a valer alguma coisa. Um PC tem um teclado: enquanto alguém está usando, ninguém mais senta.
Usar e abrir são coisas diferentes: "Ligar o computador" leva direto para a tela dele, ligado ou não. "Abrir o gabinete" mostra a bancada mesmo com o PC ligado — é onde se troca peça, se limpa o CMOS e onde o botão passa a dizer Voltar ao sistema.
Sair da tela não desliga o computador. O botão ao lado do LED devolve o jogo — grava o que faltou e vai embora, com o PC ligado atrás. É o botão do monitor, não o do gabinete.
Desligam de verdade: o Desligar do OrionOS, o botão Desligar o computador na bancada, abrir o gabinete para mexer nas peças, limpar o CMOS, salvar no Setup (que reinicia) — e, no gabinete que é item, guardá-lo no bolso ou na mochila: saiu da tomada. No chão ou no porta-malas, ele continua ligado. O Reiniciar do sistema refaz o POST inteiro, com a tela de boot da placa.
- POST. A bancada liga o PC. Se passou e achou disco, o servidor grava a sessão do sistema, que sobe do primeiro disco vivo (M.2 antes de SATA).
- Um PC, um usuário. A partir daí o PC fica preso a quem ligou: ninguém mais liga, abre o gabinete ou tira o disco enquanto ele usa. Um teclado, uma pessoa.
- A tela troca. Depois das linhas da BIOS, a bancada some e aparece o monitor com o
iframe. - Iniciar. O sistema pergunta ao servidor o que é este PC: chave, organização, o hardware medido no POST, o disco. O tempo de boot vem da velocidade do disco — HD uns 6 segundos, NVMe pouco mais de 1.
- Instalador ou disco. Disco em branco abre a instalação; disco com sistema desce e cai na tela de entrada.
Ele fica na página da bancada, fora do iframe. Desligar por ali pede ao sistema para gravar o que faltou e fecha; se o sistema travou, fecha à força depois de alguns segundos. Uma tela de sistema que só fecha pelo próprio sistema prende o jogador no dia em que o JavaScript quebrar.
O disco na rede
Evento confiável grande trava o canal inteiro do FiveM, e a documentação não dá um número. Então o disco nunca atravessa a rede de uma vez:
- Desce em blocos de
Config.Os.blococaracteres. O servidor corta em fronteira de caractere UTF-8 — um "ã" partido ao meio chega na tela como lixo. - Sobe só o que mudou. A tela guarda o que já foi gravado e manda a diferença:
no(cria ou atualiza),anexar(o resto de um conteúdo grande) eapagar. Renomear manda os dados do arquivo sem o conteúdo. - O corte do lado da tela não parte emoji. Em JavaScript um emoji são dois caracteres; cortar entre eles gera um texto inválido que o JSON do Lua estraga.
- Grava sozinho um segundo depois de cada mudança, e grava o que faltou ao desligar.
Que o sistema está instalado, que alguém entrou (ou que é a instalação acabando de subir), e que o disco ainda está no gabinete. Se alguém tirou o disco enquanto o dono usava, a próxima gravação é recusada e o sistema trava na tela: "O disco do sistema foi removido".
As contas das organizações
Cada organização tem um servidor tipo Active Directory: grupos, contas e auditoria. O computador da organização não tem conta própria — quem senta nele entra com DOMINIO\usuario e a senha do servidor, e a mesma conta vale em qualquer PC daquela organização.
- A senha só existe como hash bcrypt, feito pelo próprio FXServer. Nem o banco nem a tela sabem a senha de ninguém. Cinco erros seguidos travam a conta.
- A tela guarda um espelho sem senha. A mudança do administrador roda no espelho primeiro — resposta na hora —, vai ao servidor, é conferida de novo e o diretório de verdade volta para todos os PCs da organização. Conta desativada cai da sessão onde estiver; app negado fecha.
- O administrador passa por cima da política do PC. O Terminal travado no hospital continua travado para enfermagem e recepção, e abre para quem administra o servidor.
- Senha temporária obriga a criar uma nova antes de entrar.
A primeira conta
Servidor recém-criado não tem conta nenhuma, e alguém precisa ser o primeiro administrador. A tela de entrada mostra "Criar a primeira conta do servidor" só para:
- o chefe do emprego da organização (grade
boss, ou a maior grade do emprego); - quem está em
Config.Os.fundadores, pelo identifier — vale para sempre; - quem recebeu
/pcfundarda staff — vale até sair do servidor.
Depois da primeira conta, conta nova só nasce pelo app Servidor.
Pelo mesmo motivo do painel: uma tela que oferece criar o primeiro administrador entrega a organização a quem chegar primeiro no computador.
O que se ajusta na config
| Chave | Para quê |
|---|---|
Config.Orgs | as organizações: emprego do ESX, domínio, servidor, faixa de IP, as áreas do mapa e os grupos com que o servidor nasce. A chave (ems, policia…) é a mesma do perfil do OrionOS |
Config.Os.bloco | quantos caracteres atravessam a rede por pedido (8000) |
Config.Os.discoMax / arquivoMax | teto do disco (4 MB de texto) e de um arquivo (768 KB) |
Config.Os.tentativas | senhas erradas até a conta travar (5) |
Config.Os.fundadores | identifiers que podem criar a primeira conta em qualquer organização |
Config.Serie.pc | prefixo da chave do computador |
O PC do mapa pertence à organização cuja área o contém no momento em que ele é criado. Mexer numa área depois não troca o dono de um computador que já existe — é a coluna rp_computers.org. PC fora de qualquer área, e gabinete de jogador, é pessoal.
Tabelas
| Tabela | O que guarda |
|---|---|
rp_computers | cada gabinete: o que está montado, a chave (serial), a organização e o lugar dos PCs do mapa |
rp_computer_pecas | a ficha secreta de cada peça pelo nº de série: defeito, silício, desgaste |
rp_computer_discos | disco com sistema: nome do PC, usuário e o hash da senha do dono |
rp_computer_arquivos | cada arquivo e pasta, por disco — a lixeira é pai = 'lixeira' |
rp_computer_contas | as contas das organizações, com hash bcrypt |
rp_computer_grupos | grupos, se administram o servidor, e os apps negados |
rp_computer_auditoria | quem entrou, errou senha, criou ou desativou conta |
Todas nascem sozinhas quando o resource sobe.
Comandos
| Comando | Para quê |
|---|---|
/pcfundar <org|todas> [id] | deixa alguém criar a primeira conta de administrador sem ser o chefe do emprego. Exige ACE; vale até a pessoa sair |
/pcmodelo | mire num prop e descubra o nome dele, para pôr na lista de computadores do mapa |
Armadilhas que custaram caro
nil no fim da lista de parâmetros
A primeira instalação no jogo travou em "Copiando arquivos do sistema…". O PC da organização não tem senha de disco, esse nil era o último parâmetro e sumiu da tabela Lua: o banco recebeu três valores para quatro ? — "erro de sintaxe perto de '?)'". Agora o vazio vai como '' (ou -1 para número) e o SQL devolve o NULL com NULLIF(?, ''). A mesma coisa esperava por arquivo sem lixeira e por PC do mapa fora de área.
NULLIF(?, '') dentro de aspas simples do Lua
A string da query termina no primeiro ' e o arquivo nem carrega. Query com aspa simples dentro vai em aspas duplas ou em [[ ]].
O instalador é uma camada por cima das outras telas. A falha mostrava a mensagem por baixo dele, e o jogador ficava olhando uma barra parada. Falhar agora remove a camada primeiro.
O menu de boot da ASUS de verdade é F8. Dentro do FiveM, F8 abre o console do jogo mesmo com a NUI em foco: a placa ROC usa F7. Vale para qualquer tecla que a tela queira tomar para si.
refresh
O OrionOS são dezenas de arquivos em files{}, com curinga. Página ou script novo só chega ao cliente depois de refresh e ensure rp_computer — e quem estava conectado pode continuar com a cópia velha até reconectar.
O que ainda falta
- Testar dentro do jogo. A instalação do PC do hospital já rodou; o resto foi testado fora do jogo, com o Lua de verdade para as contas, o Setup e a bancada, e um servidor falso para o sistema. Falta ver no jogo o Setup de cada placa, o menu de boot, o Limpar CMOS e o computador que continua ligado depois que a pessoa sai.
- Conferir os empregos
mayor(Prefeitura) ebanker(Maze Bank), e medir no jogo as áreas da LSPD, da Prefeitura e do Maze Bank. - E-mail entre jogadores. Hoje as mensagens são de exemplo, na memória da tela.
- Imprimir vira papel. O sistema já avisa quando imprime; falta o
rp_inventoryreceber e criar o item com o documento. - Queda de servidor vinda do servidor. O console do TI e os sete incidentes existem, mas só na tela. No jogo, a queda deveria vir de evento, sabotagem ou invasão.