Início › Documentação › Exports · origen_phone
Todos os exports estão registados sob o nome do recurso origen_phone.
Todos os exports do servidor validam os dados de entrada e devolvem algo verificável (um booleano, um id, uma tabela com ok) em vez de falharem em silêncio. Um recurso mal escrito não consegue estragar o telemóvel de ninguém.
Identidade
GetPhoneNumber(source) → string|nilO número do telemóvel que o jogador tem ligado, se levar algum. O inventário é verificado de novo, pois o telemóvel pode ter sido retirado entretanto.
local number = exports['origen_phone']:GetPhoneNumber(source)| Parâmetro | Tipo | Descrição |
|---|---|---|
source |
number |
ID de servidor do jogador |
GetSourceByNumber(number) → number|nilO jogador que leva esse número, se estiver online.
local src = exports['origen_phone']:GetSourceByNumber('551234')| Parâmetro | Tipo | Descrição |
|---|---|---|
number |
string |
Número de telemóvel |
HasPhoneOpen(source) → booleanIndica se o jogador tem um telemóvel ligado neste momento.
local online = exports['origen_phone']:HasPhoneOpen(source)| Parâmetro | Tipo | Descrição |
|---|---|---|
source |
number |
ID de servidor do jogador |
GetNumbersByCitizenId(citizenid) → string[]Todos os números pertencentes a uma personagem, esteja online ou não. Útil para escrever a alguém que não está a jogar.
local numbers = exports['origen_phone']:GetNumbersByCitizenId(citizenid)| Parâmetro | Tipo | Descrição |
|---|---|---|
citizenid |
string |
Identificador da personagem |
GetDisplayName(number, viewer) → stringComo um número aparece num determinado telemóvel: o nome guardado nos contactos ou o número formatado.
local name = exports['origen_phone']:GetDisplayName('551234', '601111')| Parâmetro | Tipo | Descrição |
|---|---|---|
number |
string |
Número a resolver |
viewer |
string|nil |
Número cujos contactos são usados. Sem ele, devolve o número formatado |
FormatNumber(number) → stringFormata um número com o formato do servidor (Config.PhoneNumber.Format).
local formatted = exports['origen_phone']:FormatNumber('551234') -- '55-1234'Mensagens e correio
SendMessage(data) → number|falseEnvia uma mensagem de texto para um número. from pode ser um número real ou um remetente inventado como '900100', para que um banco ou uma oficina possam escrever; se não pertencer a nenhum telemóvel, a mensagem chega como número desconhecido.
exports['origen_phone']:SendMessage({
to = number,
from = '5550100',
message = 'Hello',
})| Campo | Tipo | Descrição |
|---|---|---|
to |
string |
Número do destinatário |
from |
string|nil |
Remetente. Por omissão, Config.Messages.SystemNumber |
message |
string |
Texto da mensagem |
attachments |
table|nil |
Anexos |
GetEmailAddress(source) → string|nilO endereço de email do jogador, ou nil se ainda não tiver criado uma caixa de correio.
local address = exports['origen_phone']:GetEmailAddress(source)GetEmailByNumber(number) → string|nilO endereço de email associado a um número de telemóvel.
local address = exports['origen_phone']:GetEmailByNumber('551234')SendMail(data) → tableEnvia um email. Ao contrário de uma mensagem, o remetente pode ser qualquer endereço, mesmo que não pertença a um telemóvel.
exports['origen_phone']:SendMail({
sender = 'dealership@ogn.net',
senderName = 'Premium Deluxe',
to = exports['origen_phone']:GetEmailAddress(source),
subject = 'Your invoice',
body = 'Thank you for your purchase.',
})| Campo | Tipo | Descrição |
|---|---|---|
to |
string |
Endereço do destinatário |
sender |
string |
Endereço do remetente |
senderName |
string |
Nome do remetente apresentado |
subject |
string |
Assunto |
body |
string |
Corpo |
attachments |
table|nil |
Anexos (ligações) |
Devolve { ok, delivered, unknown, error }.
Notificações
A tabela data partilhada pelos exports de notificações:
| Campo | Tipo | Descrição |
|---|---|---|
app |
string |
App sob a qual a notificação é agrupada. Por omissão, 'settings' |
title |
string |
Título |
content |
string |
Texto do corpo |
avatar |
string|nil |
URL do avatar |
thumbnail |
string|nil |
URL da miniatura |
data |
table|nil |
Dados adicionais |
silent |
boolean|nil |
Não reproduzir som |
actions |
table|nil |
Botões de ação |
SendNotification(data) → booleanNotificação para um número. É sempre guardada, mesmo que o jogador esteja offline ou o telemóvel desligado.
exports['origen_phone']:SendNotification({
to = number,
app = 'bank',
title = 'Bank',
content = 'Payment received',
})| Campo | Tipo | Descrição |
|---|---|---|
to |
string |
Número do destinatário |
NotifySource(source, data) → numberNotificação para um jogador em vez de um número. Chega a todos os telemóveis que ele leve; se não levar nenhum, fica guardada no telemóvel em nome dele. Devolve a quantos telemóveis chegou (0 significa que o jogador não tem telemóvel).
exports['origen_phone']:NotifySource(source, {
app = 'services',
title = 'Dispatch',
content = '10-13 in Vinewood',
})NotifyJob(job, data) → numberNotificação para todos os jogadores online com esse trabalho. Devolve a quantos jogadores chegou.
exports['origen_phone']:NotifyJob('police', {
app = 'services',
title = 'Dispatch',
content = 'Alarm at the port',
})NotifyGang(gang, data) → numberNotificação para todos os jogadores online dessa gangue. Devolve a quantos jogadores chegou.
exports['origen_phone']:NotifyGang('ballas', {
app = 'darkchat',
title = 'Meeting',
content = 'Usual place',
})NotifyAll(data) → numberNotificação para todos os jogadores online que levem um telemóvel. Devolve a quantos jogadores chegou.
exports['origen_phone']:NotifyAll({
app = 'news',
title = 'City Hall',
content = 'Power cut downtown',
})ClearNotifications(number, app) → booleanApaga as notificações de uma app num telemóvel. Sem app, apaga todas.
exports['origen_phone']:ClearNotifications(number, 'delivery')| Parâmetro | Tipo | Descrição |
|---|---|---|
number |
string |
Número de telemóvel |
app |
string|nil |
Id da app |
Widgets e apps
SetWidgetData(target, widget, data) → booleanPreenche um widget cuja origem é 'fuera' (caixa de um negócio, frequência de rádio, turno de trabalho). Os dados são mantidos durante cinco minutos; depois disso o widget volta a ficar sem dados. Passa nil como data para os limpar.
exports['origen_phone']:SetWidgetData(source, 'negocio', {
name = 'Bennys Motorworks',
caja = 12400,
empleados = 3,
stock = 62,
})| Parâmetro | Tipo | Descrição |
|---|---|---|
target |
number|string |
Source do jogador ou número de telemóvel |
widget |
string |
'negocio', 'radio', 'trabajo'... |
data |
table|nil |
Dados do widget |
RegisterApp(data) → booleanAdiciona uma app a partir de outro recurso. Aparece no ecrã inicial e abre a sua página em ecrã inteiro. Entra no catálogo como qualquer outra app, pelo que o painel de administração e SetAppRule a podem restringir. É removida automaticamente quando o seu recurso pára.
exports['origen_phone']:RegisterApp({
id = 'myworkshop',
name = 'My Workshop',
icon = 'lucide:wrench',
url = 'nui://my_workshop/ui/index.html',
slot = 30,
})| Campo | Tipo | Descrição |
|---|---|---|
id |
string |
Letras minúsculas, números e sublinhados. Não pode já existir |
name |
string |
Nome apresentado (máx. 40 caracteres) |
icon |
string|nil |
Ícone do Iconify. Por omissão, 'lucide:app-window' |
url |
string |
Tem de ser nui://<resource>/... ou https://... |
slot |
number|nil |
Posição no ecrã inicial |
default |
boolean|nil |
Instalada por omissão. Por omissão, true |
UnregisterApp(id) → booleanRemove uma app externa sem esperar que o seu recurso pare.
exports['origen_phone']:UnregisterApp('myworkshop')Acesso às apps
CanUseApp(source, appId) → booleanIndica se o jogador pode usar essa app neste momento.
if exports['origen_phone']:CanUseApp(source, 'bank') then
-- ...
endGetAppRule(appId) → table|nilA regra definida numa app: { mode, list }.
local rule = exports['origen_phone']:GetAppRule('bank')SetAppRule(appId, mode, list) → booleanAltera quem tem uma app. Guarda exatamente o que o painel de administração guarda, por isso a alteração é visível aí e pode ser desfeita à mão. As alterações chegam de imediato aos telemóveis abertos.
exports['origen_phone']:SetAppRule('bank', 'menos', {
{ kind = 'negocio', id = 'prisoner' },
})
exports['origen_phone']:SetAppRule('bank', 'todos')| Parâmetro | Tipo | Descrição |
|---|---|---|
appId |
string |
Id da app |
mode |
string |
'todos' (toda a gente), 'nadie' (ninguém), 'solo' (só a lista), 'menos' (todos exceto a lista) |
list |
table[]|nil |
Entradas, só usadas por solo e menos |
| Entrada | Corresponde a |
|---|---|
{ kind = 'civiles' } |
Jogadores sem trabalho e sem gangue |
{ kind = 'bandas' } |
Qualquer pessoa numa gangue |
{ kind = 'negocios' } |
Qualquer pessoa com um trabalho |
{ kind = 'banda', id = 'ballas' } |
Uma gangue específica |
{ kind = 'negocio', id = 'mechanic' } |
Um trabalho específico |
Contactos e conteúdo
AddContact(data) → booleanAdiciona um contacto ao telemóvel de alguém. Não é duplicado se já existir.
exports['origen_phone']:AddContact({
owner = number,
number = '5550100',
name = 'Mechanic',
})| Campo | Tipo | Descrição |
|---|---|---|
owner |
string |
Número de telemóvel que recebe o contacto |
number |
string |
Número do contacto |
name |
string |
Nome do contacto |
avatar |
string|nil |
URL do avatar |
AddPhoto(data) → number|nilGuarda uma imagem já carregada na galeria de um telemóvel. Devolve o id da foto.
exports['origen_phone']:AddPhoto({ owner = number, url = 'https://...' })| Campo | Tipo | Descrição |
|---|---|---|
owner |
string |
Número de telemóvel |
url |
string |
URL da imagem |
isVideo |
boolean|nil |
Marca-a como vídeo |
PublishNews(data) → number|nilPublica um artigo na app de Notícias. Devolve o id do artigo.
exports['origen_phone']:PublishNews({
title = 'Headline',
content = 'What happened',
})| Campo | Tipo | Descrição |
|---|---|---|
title |
string |
Título |
content |
string |
Corpo |
author |
string|nil |
Autor |
image |
string|nil |
URL da imagem |
category |
string|nil |
Categoria |
pinned |
boolean|nil |
Fixar o artigo |
PublishAd(number, data) → number|nil, string|nilPublica um anúncio no quadro de classificados em nome de alguém. Devolve o id do anúncio, ou nil e um erro.
exports['origen_phone']:PublishAd(number, {
title = 'Car for sale',
body = 'Low mileage',
price = 40000,
})| Campo | Tipo | Descrição |
|---|---|---|
title |
string |
Título |
body |
string |
Corpo |
price |
number|nil |
Preço |
category |
string|nil |
Uma de Config.Ads.Categories |
AddNote(number, title, content) → number|nilDeixa uma nota no telemóvel de alguém. Devolve o id da nota.
exports['origen_phone']:AddNote(number, 'Reminder', 'Visit the garage')AddCalendarEvent(number, data) → number|nilAdiciona um evento ao calendário de alguém. Devolve o id do evento.
exports['origen_phone']:AddCalendarEvent(number, {
title = 'Court',
date = '2026-09-04',
})| Campo | Tipo | Descrição |
|---|---|---|
title |
string |
Título |
note |
string|nil |
Nota |
date |
string |
Data (YYYY-MM-DD) |
time |
string|nil |
Hora |
CreateDarkRoom(number, name, burn) → string|nilCria uma sala de DarkChat e devolve o seu código. O proprietário já tem de ter um alias de DarkChat; caso contrário devolve nil.
local code = exports['origen_phone']:CreateDarkRoom(number, 'Harbour crew', 60)| Parâmetro | Tipo | Descrição |
|---|---|---|
number |
string |
Proprietário da sala |
name |
string |
Nome da sala |
burn |
number|nil |
Minutos até as mensagens se autodestruírem. 0 nunca |
Faturas e multas
Pagas a partir do telemóvel através do bridge de Banking.
CreateInvoice(data) → number|nil, string|nilEmite uma fatura. O jogador paga-a ou recusa-a na app de Faturas.
exports['origen_phone']:CreateInvoice({
to = number,
amount = 500,
reason = 'Repair',
issuer = 'Mechanic',
issuerAccount = 'mechanic',
})| Campo | Tipo | Descrição |
|---|---|---|
to |
number|string |
Source ou número de telemóvel do destinatário. Com o número, pode ser emitida a um jogador offline |
amount |
number |
Montante positivo |
reason |
string |
Motivo |
issuer |
string |
Nome do emissor |
issuerAccount |
string|nil |
Conta que recebe o dinheiro. Sem ela, o jogador é cobrado e o dinheiro não vai para lado nenhum |
reference |
any |
O teu próprio id, devolvido quando a fatura é paga |
dueAt |
number|nil |
Segundos a partir de agora até ao vencimento |
CreateFine(data) → number|nil, string|nilComo uma fatura, mas não pode ser recusada. O dinheiro vai para issuerAccount ou, se for omitido, para Config.FineAccount. Os mesmos campos que CreateInvoice.
exports['origen_phone']:CreateFine({
to = number,
amount = 250,
reason = 'Speeding',
issuer = 'LSPD',
})GetBills(number, kind, status) → table[]Faturas de um telemóvel.
local bills = exports['origen_phone']:GetBills(number, 'fine', 'pending')| Parâmetro | Tipo | Descrição |
|---|---|---|
number |
string |
Número de telemóvel |
kind |
string|nil |
'invoice', 'fine' ou nil para ambas |
status |
string|nil |
'pending', 'paid', 'refused' ou 'cancelled' |
GetPendingBills(number, kind) → number, numberQuantas faturas estão pendentes e o montante total em dívida.
local count, total = exports['origen_phone']:GetPendingBills(number)CancelBill(id) → booleanRetira uma fatura. Só funciona enquanto estiver pendente.
exports['origen_phone']:CancelBill(billId)Chamadas e dispositivo
IsInCall(number) → booleanIndica se esse número está numa chamada neste momento.
local busy = exports['origen_phone']:IsInCall(number)GetDeviceState(number) → table|nilO que o servidor sabe sobre um telemóvel.
local state = exports['origen_phone']:GetDeviceState(number)
-- { airplane, dnd, battery, charging, signal }SetBattery(number, level) → booleanDefine o nível de bateria de um telemóvel (de 0 a 100).
exports['origen_phone']:SetBattery(number, 100)SetCharging(number, charging) → booleanMarca um telemóvel como a carregar ou não.
exports['origen_phone']:SetCharging(number, true)Entregas
CreateSupplyDelivery(data) → number|nil, string|nilCria um trabalho de entrega de abastecimento na app Mandao. Quando o estafeta confirma a chegada, o telemóvel chama DeliverOrder(businessId, orderId) no bridge de Business, que coloca a mercadoria onde deve ficar. O estafeta nunca transporta a mercadoria.
local id, err = exports['origen_phone']:CreateSupplyDelivery({
businessId = 'burgershot',
orderId = 42,
label = 'Burger Shot',
coords = { x = -1193.0, y = -892.0, z = 14.0 },
items = { { name = 'bread', count = 20 } },
})| Campo | Tipo | Descrição |
|---|---|---|
businessId |
string |
Negócio que recebe a encomenda |
orderId |
any |
Id da encomenda devolvido a DeliverOrder |
label |
string |
Etiqueta do destino |
coords |
table |
Destino { x, y, z }. Tem de ser uma tabela simples, não um vector3 |
items |
table |
Mercadoria, guardada tal como é mostrada ao estafeta |
requester |
any |
Quem a pediu |
note |
string|nil |
Nota para o estafeta |
A mercadoria é recolhida no depósito mais próximo de Config.Delivery.Depots.
Devolve nil, 'err_delivery_off' quando Config.Delivery.HandleBusinessOrders está desativado, e nil, 'err_delivery_no_couriers' quando nenhum estafeta está de serviço. Em ambos os casos, o negócio deve entregar a encomenda por conta própria.
SupplyActive(id) → booleanIndica se uma entrega de abastecimento ainda está ativa (pending, taken, picked ou arrived). Uma entrega expirada ou cancelada nunca chegará.
local alive = exports['origen_phone']:SupplyActive(deliveryId)IsCourierOnDuty(number) → booleanIndica se um número está registado como estafeta e de serviço.
local onDuty = exports['origen_phone']:IsCourierOnDuty(number)GetCurrentDelivery(number, asCourier) → table|nilA entrega que alguém está a tratar, se existir.
local delivery = exports['origen_phone']:GetCurrentDelivery(number, true)| Parâmetro | Tipo | Descrição |
|---|---|---|
number |
string |
Número de telemóvel |
asCourier |
boolean |
true procura-a como estafeta, false como cliente |
Veículos e propriedades
Normalizados a partir dos bridges ativos de Garage e Housing, para que quem os chama não precise de saber que recurso está por trás.
GetVehicles(citizenid) → table[]local vehicles = exports['origen_phone']:GetVehicles(citizenid)
-- { { plate, model, garage, state, fuel, engine, body, depotPrice } }GetProperties(citizenid) → table[]As propriedades da personagem: as que possui e aquelas de que tem chave.
local houses = exports['origen_phone']:GetProperties(citizenid)
-- { { id, name, mine, price, kind, keys, where } }UsePhoneItem(data, slot)Abre o telemóvel a partir de um item do ox_inventory. Lê o número dos metadados do slot, por isso, com dois telemóveis, abre-se o que foi usado.
-- ox_inventory/data/items.lua
client = { export = 'origen_phone.UsePhoneItem' },UsePhone(item)Igual a UsePhoneItem, para inventários que passam o item inteiro em vez do slot.
exports['origen_phone']:UsePhone(item)Open()Abre o primeiro telemóvel que o jogador leva.
exports['origen_phone']:Open()Close()Fecha o telemóvel.
exports['origen_phone']:Close()IsOpen() → booleanIndica se o telemóvel está aberto.
local open = exports['origen_phone']:IsOpen()GetNumber() → string|nilO número do telemóvel em uso.
local number = exports['origen_phone']:GetNumber()IsInCall() → booleanIndica se o jogador local está numa chamada.
local busy = exports['origen_phone']:IsInCall()ShowNotification(data) → booleanMostra um cartão de notificação do telemóvel sem o guardar: não conta como não lido e não abre nenhuma app. Respeita Custom.ShowNotification.
exports['origen_phone']:ShowNotification({
app = 'services',
title = 'Dispatch',
content = 'Alert in Vinewood',
})| Campo | Tipo | Descrição |
|---|---|---|
app |
string |
Ícone da app. Por omissão, 'settings' |
title |
string |
Título |
content |
string |
Corpo |
avatar |
string|nil |
URL do avatar |
thumbnail |
string|nil |
URL da miniatura |
silent |
boolean|nil |
Não reproduzir som |
ShowServerNotification(data) → booleanReplica no telemóvel uma notificação do servidor (ao estilo de origen_notify), quando Config.ServerNotifications.Enabled está ativado e o jogador leva um telemóvel. Devolve true quando o telemóvel assume a notificação.
local handled = exports['origen_phone']:ShowServerNotification({
title = 'Bank',
description = 'You received $40',
type = 'success',
})| Campo | Tipo | Descrição |
|---|---|---|
description |
string |
Texto (text e content também são aceites) |
title |
string|nil |
Título. Por omissão, o título do servidor |
type |
string|nil |
Tipo de notificação, filtrado por Config.ServerNotifications.Types |
app |
string|nil |
Ícone. Por omissão, o ícone do servidor |
openManagement()Abre o painel de administração. Usado por origen_admin; a permissão é verificada no servidor.
exports['origen_phone']:openManagement()