Inicio › Documentación › Exports · origen_phone
Todos los exports están registrados bajo el nombre del recurso origen_phone.
Todos los exports del servidor validan sus datos de entrada y devuelven algo comprobable (un booleano, un id, una tabla con ok) en lugar de fallar en silencio. Un recurso mal escrito no puede romper el teléfono de nadie.
Identidad
GetPhoneNumber(source) → string|nilEl número del teléfono que el jugador tiene encendido, si lleva uno. Se vuelve a comprobar el inventario, ya que el teléfono pudo haberse retirado mientras tanto.
local number = exports['origen_phone']:GetPhoneNumber(source)| Parámetro | Tipo | Descripción |
|---|---|---|
source |
number |
ID de servidor del jugador |
GetSourceByNumber(number) → number|nilEl jugador que lleva ese número, si está conectado.
local src = exports['origen_phone']:GetSourceByNumber('551234')| Parámetro | Tipo | Descripción |
|---|---|---|
number |
string |
Número de teléfono |
HasPhoneOpen(source) → booleanIndica si el jugador tiene un teléfono encendido en este momento.
local online = exports['origen_phone']:HasPhoneOpen(source)| Parámetro | Tipo | Descripción |
|---|---|---|
source |
number |
ID de servidor del jugador |
GetNumbersByCitizenId(citizenid) → string[]Todos los números que pertenecen a un personaje, esté conectado o no. Útil para escribir a alguien que no está jugando.
local numbers = exports['origen_phone']:GetNumbersByCitizenId(citizenid)| Parámetro | Tipo | Descripción |
|---|---|---|
citizenid |
string |
Identificador del personaje |
GetDisplayName(number, viewer) → stringCómo aparece un número en un teléfono concreto: el nombre guardado en sus contactos o el número con formato.
local name = exports['origen_phone']:GetDisplayName('551234', '601111')| Parámetro | Tipo | Descripción |
|---|---|---|
number |
string |
Número a resolver |
viewer |
string|nil |
Número cuyos contactos se usan. Sin él, devuelve el número con formato |
FormatNumber(number) → stringDa formato a un número con el formato del servidor (Config.PhoneNumber.Format).
local formatted = exports['origen_phone']:FormatNumber('551234') -- '55-1234'Mensajes y correo
SendMessage(data) → number|falseEnvía un mensaje de texto a un número. from puede ser un número real o un remitente inventado como '900100' para que un banco o un taller puedan escribir; si no pertenece a ningún teléfono, el mensaje llega como número desconocido.
exports['origen_phone']:SendMessage({
to = number,
from = '5550100',
message = 'Hello',
})| Campo | Tipo | Descripción |
|---|---|---|
to |
string |
Número del destinatario |
from |
string|nil |
Remitente. Por defecto Config.Messages.SystemNumber |
message |
string |
Texto del mensaje |
attachments |
table|nil |
Adjuntos |
GetEmailAddress(source) → string|nilLa dirección de correo del jugador, o nil si todavía no ha creado un buzón.
local address = exports['origen_phone']:GetEmailAddress(source)GetEmailByNumber(number) → string|nilLa dirección de correo vinculada a un número de teléfono.
local address = exports['origen_phone']:GetEmailByNumber('551234')SendMail(data) → tableEnvía un correo. A diferencia de un mensaje, el remitente puede ser cualquier dirección aunque no pertenezca a un teléfono.
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 | Descripción |
|---|---|---|
to |
string |
Dirección del destinatario |
sender |
string |
Dirección del remitente |
senderName |
string |
Nombre visible del remitente |
subject |
string |
Asunto |
body |
string |
Cuerpo |
attachments |
table|nil |
Adjuntos (enlaces) |
Devuelve { ok, delivered, unknown, error }.
Notificaciones
La tabla data que comparten los exports de notificaciones:
| Campo | Tipo | Descripción |
|---|---|---|
app |
string |
App bajo la que se agrupa la notificación. Por defecto 'settings' |
title |
string |
Título |
content |
string |
Texto del cuerpo |
avatar |
string|nil |
URL del avatar |
thumbnail |
string|nil |
URL de la miniatura |
data |
table|nil |
Datos adicionales |
silent |
boolean|nil |
No reproducir sonido |
actions |
table|nil |
Botones de acción |
SendNotification(data) → booleanNotificación a un número. Siempre se guarda, aunque el jugador esté desconectado o el teléfono apagado.
exports['origen_phone']:SendNotification({
to = number,
app = 'bank',
title = 'Bank',
content = 'Payment received',
})| Campo | Tipo | Descripción |
|---|---|---|
to |
string |
Número del destinatario |
NotifySource(source, data) → numberNotificación a un jugador en lugar de a un número. Llega a todos los teléfonos que lleve; si no lleva ninguno, se guarda en el teléfono a su nombre. Devuelve a cuántos teléfonos ha llegado (0 significa que el jugador no tiene teléfono).
exports['origen_phone']:NotifySource(source, {
app = 'services',
title = 'Dispatch',
content = '10-13 in Vinewood',
})NotifyJob(job, data) → numberNotificación a todos los jugadores conectados con ese trabajo. Devuelve a cuántos jugadores ha llegado.
exports['origen_phone']:NotifyJob('police', {
app = 'services',
title = 'Dispatch',
content = 'Alarm at the port',
})NotifyGang(gang, data) → numberNotificación a todos los jugadores conectados de esa banda. Devuelve a cuántos jugadores ha llegado.
exports['origen_phone']:NotifyGang('ballas', {
app = 'darkchat',
title = 'Meeting',
content = 'Usual place',
})NotifyAll(data) → numberNotificación a todos los jugadores conectados que lleven un teléfono. Devuelve a cuántos jugadores ha llegado.
exports['origen_phone']:NotifyAll({
app = 'news',
title = 'City Hall',
content = 'Power cut downtown',
})ClearNotifications(number, app) → booleanElimina las notificaciones de una app en un teléfono. Sin app, elimina todas.
exports['origen_phone']:ClearNotifications(number, 'delivery')| Parámetro | Tipo | Descripción |
|---|---|---|
number |
string |
Número de teléfono |
app |
string|nil |
Id de la app |
Widgets y apps
SetWidgetData(target, widget, data) → booleanRellena un widget cuyo origen es 'fuera' (caja de un negocio, frecuencia de radio, turno de trabajo). Los datos se conservan cinco minutos; pasado ese tiempo el widget vuelve a mostrarse sin datos. Pasa nil como data para borrarlos.
exports['origen_phone']:SetWidgetData(source, 'negocio', {
name = 'Bennys Motorworks',
caja = 12400,
empleados = 3,
stock = 62,
})| Parámetro | Tipo | Descripción |
|---|---|---|
target |
number|string |
Source del jugador o número de teléfono |
widget |
string |
'negocio', 'radio', 'trabajo'... |
data |
table|nil |
Datos del widget |
RegisterApp(data) → booleanAñade una app desde otro recurso. Aparece en la pantalla de inicio y abre su página a pantalla completa. Entra en el catálogo como cualquier otra app, así que el panel de administración y SetAppRule pueden restringirla. Se elimina automáticamente cuando su recurso se detiene.
exports['origen_phone']:RegisterApp({
id = 'myworkshop',
name = 'My Workshop',
icon = 'lucide:wrench',
url = 'nui://my_workshop/ui/index.html',
slot = 30,
})| Campo | Tipo | Descripción |
|---|---|---|
id |
string |
Letras minúsculas, números y guiones bajos. No debe existir ya |
name |
string |
Nombre visible (máx. 40 caracteres) |
icon |
string|nil |
Icono de Iconify. Por defecto 'lucide:app-window' |
url |
string |
Debe ser nui://<resource>/... o https://... |
slot |
number|nil |
Posición en la pantalla de inicio |
default |
boolean|nil |
Instalada por defecto. Por defecto true |
UnregisterApp(id) → booleanElimina una app externa sin esperar a que se detenga su recurso.
exports['origen_phone']:UnregisterApp('myworkshop')Acceso a las apps
CanUseApp(source, appId) → booleanIndica si el jugador puede usar esa app en este momento.
if exports['origen_phone']:CanUseApp(source, 'bank') then
-- ...
endGetAppRule(appId) → table|nilLa regla establecida en una app: { mode, list }.
local rule = exports['origen_phone']:GetAppRule('bank')SetAppRule(appId, mode, list) → booleanCambia quién tiene una app. Guarda exactamente lo que guarda el panel de administración, por lo que el cambio se ve allí y se puede deshacer a mano. Los cambios llegan de inmediato a los teléfonos abiertos.
exports['origen_phone']:SetAppRule('bank', 'menos', {
{ kind = 'negocio', id = 'prisoner' },
})
exports['origen_phone']:SetAppRule('bank', 'todos')| Parámetro | Tipo | Descripción |
|---|---|---|
appId |
string |
Id de la app |
mode |
string |
'todos' (todo el mundo), 'nadie' (nadie), 'solo' (solo la lista), 'menos' (todos salvo la lista) |
list |
table[]|nil |
Entradas, solo se usa con solo y menos |
| Entrada | Coincide con |
|---|---|
{ kind = 'civiles' } |
Jugadores sin trabajo y sin banda |
{ kind = 'bandas' } |
Cualquiera que esté en una banda |
{ kind = 'negocios' } |
Cualquiera con un trabajo |
{ kind = 'banda', id = 'ballas' } |
Una banda concreta |
{ kind = 'negocio', id = 'mechanic' } |
Un trabajo concreto |
Contactos y contenido
AddContact(data) → booleanAñade un contacto al teléfono de alguien. No se duplica si ya existe.
exports['origen_phone']:AddContact({
owner = number,
number = '5550100',
name = 'Mechanic',
})| Campo | Tipo | Descripción |
|---|---|---|
owner |
string |
Número de teléfono que recibe el contacto |
number |
string |
Número del contacto |
name |
string |
Nombre del contacto |
avatar |
string|nil |
URL del avatar |
AddPhoto(data) → number|nilGuarda una imagen ya subida en la galería de un teléfono. Devuelve el id de la foto.
exports['origen_phone']:AddPhoto({ owner = number, url = 'https://...' })| Campo | Tipo | Descripción |
|---|---|---|
owner |
string |
Número de teléfono |
url |
string |
URL de la imagen |
isVideo |
boolean|nil |
La marca como vídeo |
PublishNews(data) → number|nilPublica un artículo en la app de Noticias. Devuelve el id del artículo.
exports['origen_phone']:PublishNews({
title = 'Headline',
content = 'What happened',
})| Campo | Tipo | Descripción |
|---|---|---|
title |
string |
Título |
content |
string |
Cuerpo |
author |
string|nil |
Autor |
image |
string|nil |
URL de la imagen |
category |
string|nil |
Categoría |
pinned |
boolean|nil |
Fijar el artículo |
PublishAd(number, data) → number|nil, string|nilPublica un anuncio en el tablón de clasificados a nombre de alguien. Devuelve el id del anuncio, o nil y un error.
exports['origen_phone']:PublishAd(number, {
title = 'Car for sale',
body = 'Low mileage',
price = 40000,
})| Campo | Tipo | Descripción |
|---|---|---|
title |
string |
Título |
body |
string |
Cuerpo |
price |
number|nil |
Precio |
category |
string|nil |
Una de Config.Ads.Categories |
AddNote(number, title, content) → number|nilDeja una nota en el teléfono de alguien. Devuelve el id de la nota.
exports['origen_phone']:AddNote(number, 'Reminder', 'Visit the garage')AddCalendarEvent(number, data) → number|nilAñade un evento al calendario de alguien. Devuelve el id del evento.
exports['origen_phone']:AddCalendarEvent(number, {
title = 'Court',
date = '2026-09-04',
})| Campo | Tipo | Descripción |
|---|---|---|
title |
string |
Título |
note |
string|nil |
Nota |
date |
string |
Fecha (YYYY-MM-DD) |
time |
string|nil |
Hora |
CreateDarkRoom(number, name, burn) → string|nilCrea una sala de DarkChat y devuelve su código. El propietario debe tener ya un alias de DarkChat; de lo contrario devuelve nil.
local code = exports['origen_phone']:CreateDarkRoom(number, 'Harbour crew', 60)| Parámetro | Tipo | Descripción |
|---|---|---|
number |
string |
Propietario de la sala |
name |
string |
Nombre de la sala |
burn |
number|nil |
Minutos hasta que los mensajes se autodestruyen. 0 nunca |
Facturas y multas
Se pagan desde el teléfono a través del bridge de Banking.
CreateInvoice(data) → number|nil, string|nilEmite una factura. El jugador la paga o la rechaza desde la app de Facturas.
exports['origen_phone']:CreateInvoice({
to = number,
amount = 500,
reason = 'Repair',
issuer = 'Mechanic',
issuerAccount = 'mechanic',
})| Campo | Tipo | Descripción |
|---|---|---|
to |
number|string |
Source o número de teléfono del destinatario. Con el número, se puede emitir a un jugador desconectado |
amount |
number |
Importe positivo |
reason |
string |
Motivo |
issuer |
string |
Nombre del emisor |
issuerAccount |
string|nil |
Cuenta que recibe el dinero. Sin ella se cobra al jugador y el dinero no va a ninguna parte |
reference |
any |
Tu propio id, que se devuelve cuando se paga la factura |
dueAt |
number|nil |
Segundos desde ahora hasta el vencimiento |
CreateFine(data) → number|nil, string|nilComo una factura, pero no se puede rechazar. El dinero va a issuerAccount o, si se omite, a Config.FineAccount. Mismos campos que CreateInvoice.
exports['origen_phone']:CreateFine({
to = number,
amount = 250,
reason = 'Speeding',
issuer = 'LSPD',
})GetBills(number, kind, status) → table[]Facturas de un teléfono.
local bills = exports['origen_phone']:GetBills(number, 'fine', 'pending')| Parámetro | Tipo | Descripción |
|---|---|---|
number |
string |
Número de teléfono |
kind |
string|nil |
'invoice', 'fine' o nil para ambas |
status |
string|nil |
'pending', 'paid', 'refused' o 'cancelled' |
GetPendingBills(number, kind) → number, numberCuántas facturas están pendientes y el importe total adeudado.
local count, total = exports['origen_phone']:GetPendingBills(number)CancelBill(id) → booleanRetira una factura. Solo funciona mientras siga pendiente.
exports['origen_phone']:CancelBill(billId)Llamadas y dispositivo
IsInCall(number) → booleanIndica si ese número está en una llamada en este momento.
local busy = exports['origen_phone']:IsInCall(number)GetDeviceState(number) → table|nilLo que el servidor sabe de un teléfono.
local state = exports['origen_phone']:GetDeviceState(number)
-- { airplane, dnd, battery, charging, signal }SetBattery(number, level) → booleanEstablece el nivel de batería de un teléfono (de 0 a 100).
exports['origen_phone']:SetBattery(number, 100)SetCharging(number, charging) → booleanMarca un teléfono como en carga o no.
exports['origen_phone']:SetCharging(number, true)Entregas
CreateSupplyDelivery(data) → number|nil, string|nilCrea un trabajo de entrega de suministros en la app Mandao. Cuando el repartidor confirma la llegada, el teléfono llama a DeliverOrder(businessId, orderId) en el bridge de Business, que coloca la mercancía donde corresponde. El repartidor nunca lleva la mercancía.
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 | Descripción |
|---|---|---|
businessId |
string |
Negocio que recibe el pedido |
orderId |
any |
Id del pedido que se devuelve a DeliverOrder |
label |
string |
Etiqueta del destino |
coords |
table |
Destino { x, y, z }. Debe ser una tabla simple, no un vector3 |
items |
table |
Mercancía, guardada tal como se muestra al repartidor |
requester |
any |
Quién lo solicitó |
note |
string|nil |
Nota para el repartidor |
La mercancía se recoge en el depósito más cercano de Config.Delivery.Depots.
Devuelve nil, 'err_delivery_off' cuando Config.Delivery.HandleBusinessOrders está desactivado, y nil, 'err_delivery_no_couriers' cuando no hay ningún repartidor de servicio. En ambos casos el negocio debe entregar el pedido por su cuenta.
SupplyActive(id) → booleanIndica si una entrega de suministros sigue viva (pending, taken, picked o arrived). Una entrega caducada o cancelada nunca llegará.
local alive = exports['origen_phone']:SupplyActive(deliveryId)IsCourierOnDuty(number) → booleanIndica si un número está registrado como repartidor y de servicio.
local onDuty = exports['origen_phone']:IsCourierOnDuty(number)GetCurrentDelivery(number, asCourier) → table|nilLa entrega que alguien está gestionando, si la hay.
local delivery = exports['origen_phone']:GetCurrentDelivery(number, true)| Parámetro | Tipo | Descripción |
|---|---|---|
number |
string |
Número de teléfono |
asCourier |
boolean |
true la busca como repartidor, false como cliente |
Vehículos y propiedades
Normalizados a partir de los bridges activos de Garage y Housing, de modo que quien los llama no necesita saber qué recurso hay detrás.
GetVehicles(citizenid) → table[]local vehicles = exports['origen_phone']:GetVehicles(citizenid)
-- { { plate, model, garage, state, fuel, engine, body, depotPrice } }GetProperties(citizenid) → table[]Las propiedades del personaje: las que posee y aquellas de las que tiene llave.
local houses = exports['origen_phone']:GetProperties(citizenid)
-- { { id, name, mine, price, kind, keys, where } }UsePhoneItem(data, slot)Abre el teléfono desde un objeto de ox_inventory. Lee el número de los metadatos del slot, así que con dos teléfonos se abre el que se ha usado.
-- ox_inventory/data/items.lua
client = { export = 'origen_phone.UsePhoneItem' },UsePhone(item)Igual que UsePhoneItem, para inventarios que pasan el objeto completo en lugar del slot.
exports['origen_phone']:UsePhone(item)Open()Abre el primer teléfono que lleva el jugador.
exports['origen_phone']:Open()Close()Cierra el teléfono.
exports['origen_phone']:Close()IsOpen() → booleanIndica si el teléfono está abierto.
local open = exports['origen_phone']:IsOpen()GetNumber() → string|nilEl número del teléfono en uso.
local number = exports['origen_phone']:GetNumber()IsInCall() → booleanIndica si el jugador local está en una llamada.
local busy = exports['origen_phone']:IsInCall()ShowNotification(data) → booleanMuestra una tarjeta de notificación del teléfono sin guardarla: no cuenta como no leída y no abre ninguna app. Respeta Custom.ShowNotification.
exports['origen_phone']:ShowNotification({
app = 'services',
title = 'Dispatch',
content = 'Alert in Vinewood',
})| Campo | Tipo | Descripción |
|---|---|---|
app |
string |
Icono de la app. Por defecto 'settings' |
title |
string |
Título |
content |
string |
Cuerpo |
avatar |
string|nil |
URL del avatar |
thumbnail |
string|nil |
URL de la miniatura |
silent |
boolean|nil |
No reproducir sonido |
ShowServerNotification(data) → booleanReplica en el teléfono una notificación del servidor (estilo origen_notify), cuando Config.ServerNotifications.Enabled está activado y el jugador lleva un teléfono. Devuelve true cuando el teléfono se encarga de la notificación.
local handled = exports['origen_phone']:ShowServerNotification({
title = 'Bank',
description = 'You received $40',
type = 'success',
})| Campo | Tipo | Descripción |
|---|---|---|
description |
string |
Texto (también se aceptan text y content) |
title |
string|nil |
Título. Por defecto, el título del servidor |
type |
string|nil |
Tipo de notificación, filtrado por Config.ServerNotifications.Types |
app |
string|nil |
Icono. Por defecto, el icono del servidor |
openManagement()Abre el panel de administración. Lo usa origen_admin; el permiso se comprueba en el servidor.
exports['origen_phone']:openManagement()