Inicio › Documentación › Exports · origen_phone

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.


Exports del servidor

Identidad

GetPhoneNumber(source) → string|nil

El 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.

lua
local number = exports['origen_phone']:GetPhoneNumber(source)
Parámetro Tipo Descripción
source number ID de servidor del jugador

GetSourceByNumber(number) → number|nil

El jugador que lleva ese número, si está conectado.

lua
local src = exports['origen_phone']:GetSourceByNumber('551234')
Parámetro Tipo Descripción
number string Número de teléfono

HasPhoneOpen(source) → boolean

Indica si el jugador tiene un teléfono encendido en este momento.

lua
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.

lua
local numbers = exports['origen_phone']:GetNumbersByCitizenId(citizenid)
Parámetro Tipo Descripción
citizenid string Identificador del personaje

GetDisplayName(number, viewer) → string

Cómo aparece un número en un teléfono concreto: el nombre guardado en sus contactos o el número con formato.

lua
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) → string

Da formato a un número con el formato del servidor (Config.PhoneNumber.Format).

lua
local formatted = exports['origen_phone']:FormatNumber('551234') -- '55-1234'

Mensajes y correo

SendMessage(data) → number|false

Enví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.

lua
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|nil

La dirección de correo del jugador, o nil si todavía no ha creado un buzón.

lua
local address = exports['origen_phone']:GetEmailAddress(source)

GetEmailByNumber(number) → string|nil

La dirección de correo vinculada a un número de teléfono.

lua
local address = exports['origen_phone']:GetEmailByNumber('551234')

SendMail(data) → table

Envía un correo. A diferencia de un mensaje, el remitente puede ser cualquier dirección aunque no pertenezca a un teléfono.

lua
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) → boolean

Notificación a un número. Siempre se guarda, aunque el jugador esté desconectado o el teléfono apagado.

lua
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) → number

Notificació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).

lua
exports['origen_phone']:NotifySource(source, {
    app = 'services',
    title = 'Dispatch',
    content = '10-13 in Vinewood',
})

NotifyJob(job, data) → number

Notificación a todos los jugadores conectados con ese trabajo. Devuelve a cuántos jugadores ha llegado.

lua
exports['origen_phone']:NotifyJob('police', {
    app = 'services',
    title = 'Dispatch',
    content = 'Alarm at the port',
})

NotifyGang(gang, data) → number

Notificación a todos los jugadores conectados de esa banda. Devuelve a cuántos jugadores ha llegado.

lua
exports['origen_phone']:NotifyGang('ballas', {
    app = 'darkchat',
    title = 'Meeting',
    content = 'Usual place',
})

NotifyAll(data) → number

Notificación a todos los jugadores conectados que lleven un teléfono. Devuelve a cuántos jugadores ha llegado.

lua
exports['origen_phone']:NotifyAll({
    app = 'news',
    title = 'City Hall',
    content = 'Power cut downtown',
})

ClearNotifications(number, app) → boolean

Elimina las notificaciones de una app en un teléfono. Sin app, elimina todas.

lua
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) → boolean

Rellena 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.

lua
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) → boolean

Añ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.

lua
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) → boolean

Elimina una app externa sin esperar a que se detenga su recurso.

lua
exports['origen_phone']:UnregisterApp('myworkshop')

Acceso a las apps

CanUseApp(source, appId) → boolean

Indica si el jugador puede usar esa app en este momento.

lua
if exports['origen_phone']:CanUseApp(source, 'bank') then
    -- ...
end

GetAppRule(appId) → table|nil

La regla establecida en una app: { mode, list }.

lua
local rule = exports['origen_phone']:GetAppRule('bank')

SetAppRule(appId, mode, list) → boolean

Cambia 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.

lua
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) → boolean

Añade un contacto al teléfono de alguien. No se duplica si ya existe.

lua
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|nil

Guarda una imagen ya subida en la galería de un teléfono. Devuelve el id de la foto.

lua
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|nil

Publica un artículo en la app de Noticias. Devuelve el id del artículo.

lua
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|nil

Publica un anuncio en el tablón de clasificados a nombre de alguien. Devuelve el id del anuncio, o nil y un error.

lua
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|nil

Deja una nota en el teléfono de alguien. Devuelve el id de la nota.

lua
exports['origen_phone']:AddNote(number, 'Reminder', 'Visit the garage')

AddCalendarEvent(number, data) → number|nil

Añade un evento al calendario de alguien. Devuelve el id del evento.

lua
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|nil

Crea una sala de DarkChat y devuelve su código. El propietario debe tener ya un alias de DarkChat; de lo contrario devuelve nil.

lua
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|nil

Emite una factura. El jugador la paga o la rechaza desde la app de Facturas.

lua
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|nil

Como una factura, pero no se puede rechazar. El dinero va a issuerAccount o, si se omite, a Config.FineAccount. Mismos campos que CreateInvoice.

lua
exports['origen_phone']:CreateFine({
    to = number,
    amount = 250,
    reason = 'Speeding',
    issuer = 'LSPD',
})

GetBills(number, kind, status) → table[]

Facturas de un teléfono.

lua
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, number

Cuántas facturas están pendientes y el importe total adeudado.

lua
local count, total = exports['origen_phone']:GetPendingBills(number)

CancelBill(id) → boolean

Retira una factura. Solo funciona mientras siga pendiente.

lua
exports['origen_phone']:CancelBill(billId)

Llamadas y dispositivo

IsInCall(number) → boolean

Indica si ese número está en una llamada en este momento.

lua
local busy = exports['origen_phone']:IsInCall(number)

GetDeviceState(number) → table|nil

Lo que el servidor sabe de un teléfono.

lua
local state = exports['origen_phone']:GetDeviceState(number)
-- { airplane, dnd, battery, charging, signal }

SetBattery(number, level) → boolean

Establece el nivel de batería de un teléfono (de 0 a 100).

lua
exports['origen_phone']:SetBattery(number, 100)

SetCharging(number, charging) → boolean

Marca un teléfono como en carga o no.

lua
exports['origen_phone']:SetCharging(number, true)

Entregas

CreateSupplyDelivery(data) → number|nil, string|nil

Crea 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.

lua
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) → boolean

Indica si una entrega de suministros sigue viva (pending, taken, picked o arrived). Una entrega caducada o cancelada nunca llegará.

lua
local alive = exports['origen_phone']:SupplyActive(deliveryId)

IsCourierOnDuty(number) → boolean

Indica si un número está registrado como repartidor y de servicio.

lua
local onDuty = exports['origen_phone']:IsCourierOnDuty(number)

GetCurrentDelivery(number, asCourier) → table|nil

La entrega que alguien está gestionando, si la hay.

lua
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[]

lua
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.

lua
local houses = exports['origen_phone']:GetProperties(citizenid)
-- { { id, name, mine, price, kind, keys, where } }

Exports del cliente

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.

lua
-- 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.

lua
exports['origen_phone']:UsePhone(item)

Open()

Abre el primer teléfono que lleva el jugador.

lua
exports['origen_phone']:Open()

Close()

Cierra el teléfono.

lua
exports['origen_phone']:Close()

IsOpen() → boolean

Indica si el teléfono está abierto.

lua
local open = exports['origen_phone']:IsOpen()

GetNumber() → string|nil

El número del teléfono en uso.

lua
local number = exports['origen_phone']:GetNumber()

IsInCall() → boolean

Indica si el jugador local está en una llamada.

lua
local busy = exports['origen_phone']:IsInCall()

ShowNotification(data) → boolean

Muestra una tarjeta de notificación del teléfono sin guardarla: no cuenta como no leída y no abre ninguna app. Respeta Custom.ShowNotification.

lua
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) → boolean

Replica 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.

lua
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.

lua
exports['origen_phone']:openManagement()