Inicio › Documentación › Personalización · origen_phone

Personalización · origen_phone

text
custom/
├── shared/
│   └── custom.lua
├── client/
│   └── notifications.lua
├── server/
│   ├── money.lua
│   └── permissions.lua
└── bridge/
    ├── banking/server.lua
    ├── business/server.lua
    ├── dispatch/server.lua
    ├── framework/client.lua
    ├── framework/server.lua
    ├── fuel/client.lua
    ├── garage/server.lua
    ├── housing/server.lua
    ├── inventory/client.lua
    ├── inventory/server.lua
    ├── notify/client.lua
    ├── uploader/server.lua
    ├── vehiclekeys/client.lua
    ├── voice/client.lua
    ├── voice/server.lua
    └── weather/server.lua

Todo lo que hay en custom/ figura en escrow_ignore, así que sigue abierto cuando el recurso se cifra, y está separado del núcleo, por lo que las actualizaciones del teléfono no lo sobrescriben. Los ficheros de proveedor de bridge/ también son abiertos: puedes leerlos o copiar uno como punto de partida.

Todo hook Custom devuelve nil por defecto, lo que significa «haz lo normal». Devuelve cualquier otra cosa y tu código toma el control.


custom/client/notifications.lua

Custom.ShowNotification(data) → boolean|nil

Cómo se ve una notificación mientras el teléfono está guardado. Por defecto, el teléfono asoma desde la parte inferior de la pantalla. Con el teléfono abierto, las notificaciones siempre se muestran dentro de él.

Parámetro Tipo Descripción
data table { app, title, content, avatar, thumbnail }
Retorno Comportamiento
nil El teléfono asoma como de costumbre
true Ya la has mostrado tú; el teléfono no hace nada

Usar origen_notify en lugar del teléfono:

lua
function Custom.ShowNotification(data)
    exports.origen_notify:ShowNotification(data.content, 'info', 5000)
    return true
end

Solo las llamadas y los mensajes usan el teléfono; el resto, tu notify:

lua
function Custom.ShowNotification(data)
    if data.app == 'phone' or data.app == 'messages' then
        return nil
    end
 
    exports.origen_notify:ShowNotification(data.content, 'info', 5000)
    return true
end

El hook se ejecuta dentro de pcall. Si falla, se imprime el error y el teléfono muestra la notificación como de costumbre.


custom/server/money.lua

Todo cobro y pago que hace el teléfono pasa por aquí: anuncios, tarifas de taxi, facturas, transferencias, suscripciones de citas, recuperación de línea. Por defecto, el teléfono usa el puente de Banking.

Custom.Charge(source, amount, reason, account) → boolean|nil, string|nil

Parámetro Tipo Descripción
source number ID de servidor del jugador
amount number Siempre positivo
reason string Ya traducido al idioma del jugador
account string|nil Cuenta que eligió el jugador, si la app se lo permite
Retorno Comportamiento
nil Cobra mediante el puente de banca
true Cobrado, continúa
false, 'reason' Fallo; el texto se muestra al jugador

Cobrar en efectivo en lugar de banco (Qbox):

lua
function Custom.Charge(source, amount, reason)
    local player = exports.qbx_core:GetPlayer(source)
    if not player then return false, 'Player not found' end
 
    if player.Functions.RemoveMoney('cash', amount, reason) then
        return true
    end
 
    return false, 'You do not have enough cash'
end

Anuncios gratis para reporteros:

lua
function Custom.Charge(source, amount, reason)
    local job = Framework.GetJob(source)
    if reason:find('Ad') and job and job.name == 'reporter' then
        return true
    end
 
    return nil
end

Custom.Deposit(source, amount, reason) → boolean|nil, string|nil

Paga a un jugador: ganancias de conductores y repartidores, ventas del marketplace y reembolsos. Mismas reglas de retorno que Custom.Charge.

Parámetro Tipo Descripción
source number ID de servidor del jugador
amount number Cantidad a pagar
reason string Ya traducido al idioma del jugador

custom/server/permissions.lua

Custom.CanUseApp(source, appId) → boolean|nil

Tu propio veto sobre una app, para condiciones que no encajan en una regla del panel. Se ejecuta después de las reglas del panel y solo puede quitar acceso, nunca concederlo.

Parámetro Tipo Descripción
source number ID de servidor del jugador
appId string 'bank', 'darkchat', 'blackmarket'...
Retorno Comportamiento
nil Lo que diga el panel
false Denegado, pase lo que pase
lua
function Custom.CanUseApp(source, appId)
    if appId == 'bank' and MyResource.IsJailed(source) then
        return false
    end
 
    return nil
end

Esto se ejecuta cada vez que se abre un teléfono, una vez por app (más de treinta veces seguidas). No consultes la base de datos aquí: guarda en memoria lo que necesites.


custom/bridge

Cada categoría tiene una plantilla con las funciones exactas que necesita. Rellénala y pon la categoría en 'custom' en config/bridge.lua:

lua
BridgeConfig.Banking = 'custom'

Cada plantilla se registra con Bridge.Register(category, 'custom', { ... }) y solo se usa cuando su categoría está en 'custom'.


custom/bridge/framework

Servidor

lua
Bridge.Register('Framework', 'custom', {
    RegisterUsableItem = function(name, cb) end,
    GetPlayer = function(source) return nil end,
    Identifier = function(player) return nil end,
    Name = function(player) return nil end,
    Job = function(player) return nil end,
    Gang = function(player) return nil end,
})
Método Devuelve Descripción
RegisterUsableItem(name, cb) Registra el objeto teléfono como utilizable. cb(source, item)
GetPlayer(source) table|nil El objeto de jugador de tu framework
Identifier(player) string|nil Identificador estable del personaje (propietario del teléfono)
Name(player) string|nil 'Firstname Lastname'
Job(player) table|nil { name, label, type, grade, gradeLabel, onduty }
Gang(player) table|nil { name, label, grade, gradeLabel, isBoss }

Cliente

lua
Bridge.Register('Framework', 'custom', {
    PlayerLoadedEvent = nil,
    IsDead = function() return false end,
    IsCuffed = function() return false end,
})
Campo Devuelve Descripción
PlayerLoadedEvent string|nil Evento de cliente que lanza tu framework cuando el personaje está cargado
IsDead() boolean Muerto o abatido: no se puede usar el teléfono
IsCuffed() boolean Esposado: no se puede usar el teléfono

custom/bridge/inventory

Servidor

Método Devuelve Descripción
Items(source, name) table[]|nil { { slot, metadata } } de ese objeto. nil cuando el inventario aún no se ha cargado
SetMetadata(source, slot, meta) Escribe metadata en el objeto de ese slot
All(source) table[] Todos los objetos: { name, label, count, slot, metadata }
Remove(source, name, count) boolean Quita objetos
Add(target, name, count, meta) boolean Añade objetos al source de un jugador o al id de un stash
CanCarry(source, name, count) boolean Si el jugador puede cargar los objetos

Cliente

Método Devuelve Descripción
Items() table[]|nil Los objetos del jugador local, cada uno con name y metadata

custom/bridge/banking/server.lua

Método Devuelve Descripción
Accounts(citizenid) table[] { { id, name, type, balance } }
Charge(source, amount, reason) boolean, string|nil Éxito, y el error que se muestra al jugador
Deposit(source, amount, reason) boolean Paga al jugador
Transactions(accountId) table[] { { id, amount (negative = outgoing), description, type, createdAt (ms) } }
AddToSociety(account, amount, reason) boolean Ingresa una factura pagada en la cuenta de la sociedad o del negocio que la emitió
lua
Bridge.Register('Banking', 'custom', {
    Charge = function(source, amount, reason)
        return exports.my_bank:RemoveMoney(source, amount, reason) == true
    end,
    -- ...
})

custom/bridge/business/server.lua

Todos los métodos son opcionales: omite los que tu recurso de negocios no soporte.

Método Devuelve Descripción
BusinessesOf(citizenid) table[] { { id, name, label, type, onDuty } } negocios en los que trabaja este personaje
JobList() table[] { { name, label } } nombres de trabajos de negocio, para el panel de administración
DeliverOrder(businessId, orderId) boolean Entrega un pedido de suministros. false cuando el pedido ya no existe
AddIncome(businessId, amount, kind, source, meta) boolean Añade ingresos a la caja del negocio
AddExpense(businessId, amount, kind, source, meta) Registra un gasto

custom/bridge/dispatch/server.lua

Método Devuelve Descripción
SendAlert(alert) boolean alert: { coords (vector3), title, message, job, source, number }. number es nil si es anónimo
CentralPlayers(job) number[]|nil Sources que atienden la central de ese trabajo. nil cuenta en su lugar a los jugadores de servicio

custom/bridge/garage/server.lua

Método Devuelve Descripción
List(citizenid) table[] { { plate, model, garage, state, fuel, engine, body, depotPrice } }. state: 0 fuera, 1 guardado, 2 incautado. engine y body van de 0 a 100
Find(citizenid, plate) table|nil { plate, model, mods (vehicle properties JSON), label, garage, stored (boolean) }
Locate(garage) table|nil { label, coords = { x, y } }
TakeOut(plate) boolean Marca el vehículo como fuera del garaje (aparcacoches)

custom/bridge/housing/server.lua

Método Devuelve Descripción
List(citizenid) table[] { { id, name, mine (boolean), price, kind, keys (count), where = { x, y, z } } }
Get(id, citizenid) table|nil Misma forma que cada entrada de List
HasKey(citizenid, id) boolean Si el personaje tiene una llave de esa propiedad

custom/bridge/uploader/server.lua

Método Devuelve Descripción
Upload(name, base64) string|nil url, string|nil error Sube un fichero. name incluye la extensión
Capture(source, options) string|nil url, string|nil error Captura la pantalla del jugador. options: { maxWidth, maxHeight }

custom/bridge/voice

Servidor

Método Devuelve Descripción
SetCall(source, channel) Mete al jugador en un canal de llamada. 0 sale de todas las llamadas
GetCall(source) number Canal de llamada actual, 0 si no está en ninguno

Cliente

Método Devuelve Descripción
SetCallVolume(volume) Volumen de la llamada, de 5 a 100
RestoreCallEffect(serverId) Restaura el efecto de voz de llamada para ese jugador

custom/bridge/weather/server.lua

Método Devuelve Descripción
Get() table|nil { weather (GTA weather type, e.g. 'CLEAR'), remaining (ms, optional), blackout, hour, minute }

custom/bridge/notify/client.lua

lua
Bridge.Register('Notify', 'custom', {
    Send = function(message, kind)
        lib.notify({ description = message, type = kind == 'info' and 'inform' or kind })
    end,
})
Parámetro Tipo Descripción
message string Texto de la notificación
kind string 'info', 'success', 'error' o 'warning'

custom/bridge/vehiclekeys/client.lua

lua
Bridge.Register('VehicleKeys', 'custom', {
    GiveKeys = function(vehicle, plate)
    end,
})

Lo llama el aparcacoches cuando entrega un vehículo. vehicle es el handle de entidad.


custom/bridge/fuel/client.lua

lua
Bridge.Register('Fuel', 'custom', {
    SetFuel = function(vehicle, level)
        SetVehicleFuelLevel(vehicle, level + 0.0)
    end,
})

Lo llama el aparcacoches para restaurar el nivel de combustible guardado (de 0 a 100).