Skip to content

Phone (núcleo) ​

Núcleo do celular: a tela, os aparelhos, a loja, os apps básicos e o banco de dados. Sozinho, ele não abre nenhum aparelho. Quem libera cada aparelho é o módulo dele.

Precisa de: oxmysql e o framework krs ou vRP. A escolha é automática: com o resource krs no servidor, usa krs; sem ele, usa vRP. A bridge do phone só traz esses dois.

O que depende do quê ​

ResourceO que trazPrecisa de
phoneTela, loja, aparelhos e apps básicosoxmysql, krs ou vRP
phone_smartphoneCelular: ligações, mensagens, redes sociais, jogosphone
phone_tabletTablet e painel da staffphone
phone_watchRelógiophone, phone_smartphone
kayfyMúsica e o app Kayfyox_lib, krs_helper, API de música. O phone é opcional

Sem um módulo, o aparelho dele sai da loja, o atalho de teclado não é criado e os apps dele não aparecem.

Toda a configuração dos módulos fica em phone/shared-side/config.lua, exceto o painel da staff.

Instalação ​

1. Banco de dados. Importe phone/sql/install.sql uma vez. Este passo é obrigatório: o phone não cria essas tabelas sozinho. As views phone_* que leem o framework são criadas ao iniciar.

2. server.cfg:

cfg
set midia_api "https://midia.SEUNOME.workers.dev"
set midia_host "midia.SEUNOME.workers.dev"
set midia_key "SUA_CHAVE"

ensure oxmysql
ensure phone
ensure phone_smartphone
ensure phone_tablet
ensure phone_watch
ensure kayfy

Tire a linha de quem você não usa. O framework sobe antes. Veja a ordem de instalação.

3. Itens. Cada aparelho é um item e o item precisa existir no inventário do servidor. Veja a lista em Aparelhos.

FrameworkComo o item vira aparelho
krsAutomático, com o resource inventory ligado
vRPChame exports.phone:UseItem(source, nomeDoItem) ao usar o item. O nome do item no vRP fica na tabela Items de bridge/server.lua

Fotos, vídeos e áudios ​

O envio de mídia usa um serviço externo. Sem as três convars, o resto do celular funciona, mas nada de mídia é enviado.

ConvarO que é
midia_apiEndereço da API de envio
midia_keyChave da API. Use set, nunca setr
midia_hostHost dos arquivos, sem https://. Link de outro host é recusado

A pasta midia-worker publica esse serviço na sua conta Cloudflare, no plano gratuito do R2. Ela não é um resource: rode em qualquer PC com Windows e Node.js LTS.

  1. Ative o R2 no painel da Cloudflare.
  2. Rode instalar.bat e autorize no navegador.
  3. Copie as três linhas de COLE_NO_SERVER_CFG.txt para o server.cfg, antes do ensure phone.
  4. Reinicie o servidor.

Rodar instalar.bat de novo gera uma chave nova e invalida a antiga. O serviço aceita foto e áudio de até 5 MB e vídeo de até 25 MB.

Outro serviço serve se responder a GET <midia_api>/presigned-url?type=image|video|audio, com a chave no header Authorization, e devolver { data: { presignedUrl } }.

Cada personagem envia por dia até 50 fotos, 10 vídeos e 30 áudios, com 2 segundos entre um envio e outro.

Comandos e teclas ​

ComandoTeclaO que fazPrecisa de
/celularF1Abre o celularphone_smartphone
/tabletF5Abre o tabletphone_tablet
/relogioF3Abre o relógiophone_watch
/celulardobrarsem teclaAbre ou fecha o celular dobrável
/celularatenderYAtende a ligação
/celularrecusarNRecusa a ligação
/celularsonecaYAdia o alarme
/celularpararalarmeNPara o alarme

Segure Alt com o aparelho aberto para mover a câmera do jogo. Morto, caído ou algemado, o jogador não abre o aparelho.

Aparelhos ​

ItemModeloPreço na lojaDetalhe
cellphonenormal725Dado no primeiro acesso
cellphone_s26s261450
cellphone_airair1800
cellphone_foldfold5000 diamantesDobrável
cellphone_fold_tallfold_tall5000 diamantesDobrável
cellphone_fold_maxfold_max6000 diamantesDobrável
cellphone_flipflip1200Dobrável com tela externa
cellphone_boomerboomer150Teclado físico: mensagens, contatos, chamadas, cobrinha, alarmes e ajustes. À prova d'água
tablettablet900Veja Phone Tablet
watchwatch1100À prova d'água
watch_galaxwatch_galax950À prova d'água
watch_amberwatch_amber1400À prova d'água

O aparelho fica no nome do personagem. Só o item na mochila não basta: sem o registro, o jogador vê "Este aparelho não está no seu nome". O registro nasce na compra, no aparelho inicial ou ao usar o item.

Número, contatos, mensagens e fotos pertencem ao personagem, não ao aparelho. Em Ajustes, o jogador escolhe qual celular é o principal, desde que esteja com ele.

Loja ​

A loja fica em Shop.Locations, com blip no mapa. O pagamento é em dinheiro ou no banco. Aparelhos com Gems = true são pagos só em diamantes, nunca quebram e são à prova d'água.

Na loja o jogador também troca a tela quebrada, por 15% do preço, e compra a proteção contra água, por 20%.

Tela quebrada ​

A tela tem 3 níveis de dano. Queda, atropelamento, explosão e ragdoll podem subir um nível. Entrar na água com o celular aberto pode levar direto ao nível 3, se ele não for à prova d'água. Desligue tudo com Damage.Enabled = false.

Apps ​

Instalação: Fixo não pode ser removido, Padrão já vem no personagem novo, Loja é instalado pelo app Loja.

Tela: o app só aparece no aparelho indicado.

IDNomeMóduloTelaInstalaçãoO que faz
bankBancophoneCelular e tabletPadrãoSaldo, extrato, transferência, faturas, taxas e multas
browserNavegadorphoneCelular e tabletLojaAbre os sites liberados em Browser
calculatorCalculadoraphoneCelular e tabletPadrãoCalculadora
cameraCâmeraphoneCelular e tabletFixoFotos e vídeos para a galeria
clockRelógiophoneCelular e tabletFixoHorário, alarmes, cronômetro e timer
garageGaragemphoneCelular e tabletPadrãoLista os veículos e localiza os que estão fora
mailE-mailphoneCelular e tabletPadrãoConta @krs.br criada para cada personagem
mapMapasphoneCelular e tabletPadrãoPins salvos, rota no GPS e localização ao vivo
notesNotasphoneCelular e tabletPadrãoAté 300 notas, com fixar
photosFotosphoneCelular e tabletFixoGaleria com álbuns, até 500 arquivos
settingsAjustesphoneCelular e tabletFixoTema, papel de parede, tela de bloqueio e código
storeLojaphoneCelular e tabletFixoInstala e remove apps
phoneTelefonephone_smartphoneCelularFixoLigações, recentes e teclado
messagesMensagensphone_smartphoneCelularFixoConversas e grupos com foto, áudio e localização
contactsContatosphone_smartphoneCelularFixoContatos, favoritos e bloqueio
calendarCalendáriophone_smartphoneCelularPadrãoCompromissos com lembrete
housesCasaphone_smartphoneCelularPadrãoCasas e apartamentos do personagem
servicesServiçosphone_smartphoneCelularPadrãoChamados para polícia, hospital, mecânica e empresas
weatherTempophone_smartphoneCelularPadrãoTempo agora e próximas horas
newsNotíciasphone_smartphoneCelularPadrãoManchetes da cidade, com alerta de urgência
recorderGravadorphone_smartphoneCelularPadrãoMemos de voz de até 5 minutos
ringtonesToquesphone_smartphoneCelularPadrãoToque e aviso, inclusive próprios
birdyBirdyphone_smartphoneCelularLojaPosts curtos e assuntos do momento
instapicInstapicphone_smartphoneCelularLojaFotos, seguidores e stories
trendyTrendyphone_smartphoneCelularLojaVídeos curtos
flashFlashphone_smartphoneCelularLojaFotos que somem depois de vistas
matchMatchphone_smartphoneCelularLojaPerfis, curtidas e match
darkchatDarkChatphone_smartphoneCelularLojaSalas anônimas
pagesPáginasphone_smartphoneCelularLojaAnúncios de negócios e serviços
healthSaúdephone_smartphoneCelularLojaPassos, distância, minutos ativos e sinais vitais
cryptoCriptophone_smartphoneCelularLojaCompra e venda de cripto e ações com o saldo do banco
radioRádiophone_smartphoneCelularLojaFrequências de rádio, com o item radio
spotfinderOnde É?phone_smartphoneCelularLojaJogo de adivinhar onde a foto foi tirada
cobrinhaCobrinhaphone_smartphoneCelularLojaJogo com placar
blocosBlocosphone_smartphoneCelularLojaJogo com placar
vooVoophone_smartphoneCelularLojaJogo com placar
tijolosTijolosphone_smartphoneCelularLojaJogo com placar
stackTorrephone_smartphoneCelularLojaJogo com placar
memoriaMemóriaphone_smartphoneCelularLojaJogo com placar
campoCampo Minadophone_smartphoneCelularLojaJogo com placar
adminAdminphone_smartphoneCelularAutomático para o grupo AdminPainel de moderação do celular
staffAdministraçãophone_tabletTabletFixo, com permissãoPainel da staff
watchRelógiophone_watchCelularLojaAjustes e dados do relógio no celular
kayfyKayfykayfyCelular e tabletPadrãoMúsica

Recursos opcionais de cada app ​

AppUsaSem ele
BancoResource bankSaldo e transferência funcionam. Extrato, faturas, taxas e multas ficam vazios
GaragemResource garagesTodo veículo aparece como guardado e não dá para localizar
CasaResource kay_housingA lista fica vazia
TempoResource time_system"Clima indisponível no momento."
RádioItem radio, pma-voice e os eventos radio:Connect e radio:Disconnect"Você precisa de um rádio."

Permissão ​

Config.Permissions restringe um app por ID. Por padrão, só staff tem regra, para o grupo Admin.

lua
Permissions = {
	staff = "Admin",
	darkchat = { "Policia","Paramedico" },
	news = "export:meu_resource:PodeLerNoticias"
}

Uma lista libera quem cumprir qualquer item. export:resource:nome chama a export com o passaporte e aceita somente true.

Grupos do vRP ficam em GroupMap, no bridge/server.lua. A posição na lista é o cargo: 1 é o mais alto.

Configuração ​

Tudo fica em shared-side/config.lua, aberto para edição.

Geral ​

OpçãoPadrãoO que muda
Interaction"target"Como usar a loja e o orelhão. "target" usa o resource target; "E" usa a tecla E
DefaultDevice"normal"Aparelho dado ao personagem no primeiro acesso, com o item. nil começa sem nenhum
RealBrandstruetrue mostra os nomes comerciais reais em alguns apps. false usa os nomes da tabela de apps acima
Brands6 appsPar de nomes de cada app para RealBrands
Command, Key"celular", "f1"Comando e tecla do celular
AnswerKey, DeclineKey"Y", "N"Teclas de atender e recusar. Também adiam e param o alarme
Items12 itensItem de cada aparelho
ModelsModelo 3D de cada aparelho
Permissionsstaff = "Admin"Quem pode usar cada app
Apps.Core9 appsApps fixos
Apps.Defaults14 appsApps do personagem novo
Apps.Store20 appsApps da Loja
QuotasLimite por minuto de cada ação. O que não está na lista não tem limite

Loja ​

OpçãoPadrãoO que muda
Shop.Locations1 pontoLocais da loja. A compra só vale a até 4 m e no routing bucket 0
Shop.Blipícone 459, cor 3Blip de cada loja. false tira o blip
Shop.MigrateUntil"2026-10-31"Até essa data, o personagem sem registro fica dono dos aparelhos que já carrega
Shop.Devices12 aparelhosModelos à venda

Campos de cada aparelho em Shop.Devices:

CampoO que faz
ModelModelo, igual ao de Items
PricePreço
GemsPaga em diamantes. Nunca quebra e é à prova d'água
WaterproofJá vem à prova d'água
RepairPreço fixo da troca de tela, no lugar de Damage.Repair
Tablet, WatchMarca o tipo do aparelho

Dano ​

OpçãoPadrãoO que muda
Damage.Enabledtruefalse: a tela nunca quebra
Damage.Cooldown120Segundos entre um dano e outro
Damage.Repair0.15Troca de tela, em fração do preço
Damage.Waterproof0.2Proteção contra água, em fração do preço
Damage.Chances.FallHigh0.35Queda de 8 m ou mais
Damage.Chances.Fall0.12Queda de 4 m ou mais
Damage.Chances.Ragdoll0.10Personagem caído
Damage.Chances.Vehicle0.30Atropelamento ou batida
Damage.Chances.Explosion0.40Explosão a até 6 m
Damage.Chances.Water0.50Na água com o celular aberto
OpçãoPadrãoO que muda
Browser.Home3 links de exemploAtalhos da tela inicial, com Name e Url
Browser.Allowed{ "*.*" }Domínios liberados. Cada um libera também os subdomínios

Troque os dois antes de abrir o servidor. O valor "*.*" não libera nenhum site: liste os domínios.

lua
Browser = {
	Home = { { Name = "Site", Url = "https://meuservidor.com.br" } },
	Allowed = { "meuservidor.com.br" }
}

Modelo na mão ​

OpçãoPadrãoO que muda
PropColor0Variação de cor do celular
PropOffset, PropRotation0, -0.005, 0 e 0, 0, 180Posição do celular na mão
ScreenDistance6.0Distância máxima para desenhar a tela no modelo 3D
ScreenStates, ScreensEstados e medidas da tela. Só mude ao trocar o modelo 3D

Bridge ​

ArquivoO que ajustar
bridge/server.luaGrupos e itens do vRP e o webhook do canal Phone, usado só no vRP
bridge/client.luaAvisos na tela e chamadas do target. Para outro target, troque as chamadas em PhoneTarget

Diferenças no vRP ​

RecursoNo vRP
DiamantesA bridge não paga em diamantes: a loja responde "Diamantes insuficientes.". Esses aparelhos entram pelo item, com UseItem
CasaA view phone_houses volta vazia, então o app fica sem casas
BanimentoVeja Phone Tablet

Para programadores ​

Exports do cliente:

lua
exports.phone:IsOpen(tipo)                 -- tipo: "phone", "tablet", "watch" ou nil
exports.phone:ToggleOpen(estado, tipo)
exports.phone:ToggleDisabled(estado)       -- true impede abrir e fecha o aparelho
exports.phone:OpenApp(id, tipo)
exports.phone:CloseApp(id)
exports.phone:CreateCall({ number = 123456 })
exports.phone:Notify({ App = "bank", Title = "Banco", Text = "Pagamento recebido." })
exports.phone:SendNotification({ app = "bank", title = "Banco", content = "Pagamento recebido." })
exports.phone:Activity(payload)            -- payload.Id obrigatório

Exports do servidor:

lua
exports.phone:UseItem(source, item)
exports.phone:Notify(source, { App = "bank", Title = "Banco", Text = "Texto" })
exports.phone:NotifyCharId(passaporte, { App = "bank", Title = "Banco", Text = "Texto" })
exports.phone:Pins(passaporte)
exports.phone:PinSave(passaporte, dados)
exports.phone:PinDelete(passaporte, id)
exports.phone:CanUseApp(passaporte, id)
exports.phone:SetAppPermission(id, permissao)
exports.phone:RegisterApp(id)              -- coloca o id no catálogo de apps da administração

A notificação enviada pelo servidor fica salva por 7 dias. App tem até 24 caracteres, Title até 60 e Text até 200.

Os exports do phone_smartphone e o StaffCan do phone_tablet também respondem em exports.phone, com o módulo ligado.

App próprio ​

No cliente do seu resource:

lua
local ok, erro = exports.phone:AddCustomApp({
	identifier = "meuapp",
	name = "Meu App",
	icon = "web/icone.png",
	ui = "meu_resource/web/index.html",
	color = "#3b82f6",
	description = "O que o app faz.",
	category = "Utilidades",
	only = "both",
	permissions = { "storage","notify" },
	onOpen = function() end,
	onClose = function() end
})
CampoRegra
identifierAté 32 caracteres, letras, números e _. Não pode repetir um ID da tabela de apps
nameAté 24 caracteres
icon<svg, http(s)://, nui:// ou caminho dentro do seu resource
onlyphone, tablet ou both
defaultApptrue impede a remoção
permissionsSó storage e notify

O app sai sozinho quando o resource para. Use exports.phone:RemoveCustomApp(id) para tirar antes e exports.phone:SendCustomAppMessage(id, mensagem) para falar com a tela. Mensagens da tela chegam no evento de cliente phone:customApp:<id>.

Eventos ​

EventoLadoQuando
phone:ToggledClienteAparelho abriu ou fechou: estado, modelo
phone:ActivityClienteBotão de uma atividade: id, acao
krs:security:FlaggedServidorJogador estourou a cota de uma ação 3 vezes em 5 minutos: source, passaporte, motivo

Problemas comuns ​

MensagemCausa
Você precisa de um Celular.O jogador está sem o item de nenhum aparelho
Este aparelho não está no seu nome. Compre o seu numa loja de celulares.O personagem carrega o item, mas não tem o registro
O relógio precisa de um celular no seu nome para funcionar.Relógio sem celular registrado
Calma, muitas ações seguidas.A ação passou do limite de Quotas
App indisponível.App desativado na administração ou sem permissão
O envio de mídia não está configurado no servidor.Falta midia_api ou midia_key, ou o servidor não reiniciou
Não foi possível preparar o envio.A midia_key não confere. O console mostra o serviço de mídia recusou a URL de envio
Mídia inválida.O midia_host é diferente do endereço dos arquivos
... não está na lista de sites liberados do celular.O domínio não está em Browser.Allowed
[phone] Framework = "krs", mas o resource krs não foi encontrado.O resource krs existe, mas não pôde ser lido
[phone] bank não tem a export X; usando o padrão.O resource opcional está ligado, mas sem a export. Vale para bank, garages e kay_housing