Início › Documentação › Personalização · origen_phone

Personalização · 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

Tudo o que está em custom/ consta de escrow_ignore, pelo que continua aberto quando o recurso é encriptado, e está separado do núcleo, por isso as atualizações do telemóvel não o substituem. Os ficheiros de fornecedor em bridge/ também são abertos: podes lê-los ou copiar um como ponto de partida.

Todos os hooks Custom devolvem nil por omissão, o que significa «faz o habitual». Devolve qualquer outra coisa e o teu código assume o controlo.


custom/client/notifications.lua

Custom.ShowNotification(data) → boolean|nil

Como se vê uma notificação enquanto o telemóvel está guardado. Por omissão, o telemóvel espreita a partir da parte inferior do ecrã. Com o telemóvel aberto, as notificações mostram-se sempre dentro dele.

Parâmetro Tipo Descrição
data table { app, title, content, avatar, thumbnail }
Retorno Comportamento
nil O telemóvel espreita como de costume
true Já a mostraste tu; o telemóvel não faz nada

Usar origen_notify em vez do telemóvel:

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

Apenas as chamadas e as mensagens usam o telemóvel; o resto, o teu 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

O hook corre dentro de pcall. Se falhar, o erro é impresso e o telemóvel mostra a notificação como de costume.


custom/server/money.lua

Todas as cobranças e pagamentos que o telemóvel faz passam por aqui: anúncios, tarifas de táxi, faturas, transferências, subscrições de encontros, recuperação de linha. Por omissão, o telemóvel usa a ponte de Banking.

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

Parâmetro Tipo Descrição
source number ID de servidor do jogador
amount number Sempre positivo
reason string Já traduzido para o idioma do jogador
account string|nil Conta escolhida pelo jogador, se a app lho permitir
Retorno Comportamento
nil Cobra através da ponte bancária
true Cobrado, continua
false, 'reason' Falhou; o texto é mostrado ao jogador

Cobrar em dinheiro em vez 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

Anúncios grátis para repórteres:

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 um jogador: ganhos de condutores e estafetas, vendas do marketplace e reembolsos. Mesmas regras de retorno que Custom.Charge.

Parâmetro Tipo Descrição
source number ID de servidor do jogador
amount number Quantia a pagar
reason string Já traduzido para o idioma do jogador

custom/server/permissions.lua

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

O teu próprio veto sobre uma app, para condições que não cabem numa regra do painel. Corre depois das regras do painel e só pode retirar acesso, nunca conceder.

Parâmetro Tipo Descrição
source number ID de servidor do jogador
appId string 'bank', 'darkchat', 'blackmarket'...
Retorno Comportamento
nil O que o painel disser
false Negado, aconteça o que acontecer
lua
function Custom.CanUseApp(source, appId)
    if appId == 'bank' and MyResource.IsJailed(source) then
        return false
    end
 
    return nil
end

Isto corre sempre que um telemóvel é aberto, uma vez por app (mais de trinta vezes seguidas). Não consultes a base de dados aqui: guarda em memória o que precisares.


custom/bridge

Cada categoria tem um modelo com as funções exatas de que precisa. Preenche-o e define a categoria como 'custom' em config/bridge.lua:

lua
BridgeConfig.Banking = 'custom'

Cada modelo regista-se com Bridge.Register(category, 'custom', { ... }) e só é usado quando a sua categoria está definida como '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 Devolve Descrição
RegisterUsableItem(name, cb) Regista o item telemóvel como utilizável. cb(source, item)
GetPlayer(source) table|nil O objeto de jogador da tua framework
Identifier(player) string|nil Identificador estável da personagem (dono do telemóvel)
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 Devolve Descrição
PlayerLoadedEvent string|nil Evento de cliente que a tua framework dispara quando a personagem está carregada
IsDead() boolean Morto ou inconsciente: não se pode usar o telemóvel
IsCuffed() boolean Algemado: não se pode usar o telemóvel

custom/bridge/inventory

Servidor

Método Devolve Descrição
Items(source, name) table[]|nil { { slot, metadata } } desse item. nil quando o inventário ainda não foi carregado
SetMetadata(source, slot, meta) Escreve metadata no item desse slot
All(source) table[] Todos os itens: { name, label, count, slot, metadata }
Remove(source, name, count) boolean Remove itens
Add(target, name, count, meta) boolean Adiciona itens ao source de um jogador ou ao id de um stash
CanCarry(source, name, count) boolean Se o jogador consegue transportar os itens

Cliente

Método Devolve Descrição
Items() table[]|nil Os itens do jogador local, cada um com name e metadata

custom/bridge/banking/server.lua

Método Devolve Descrição
Accounts(citizenid) table[] { { id, name, type, balance } }
Charge(source, amount, reason) boolean, string|nil Sucesso, e o erro mostrado ao jogador
Deposit(source, amount, reason) boolean Paga ao jogador
Transactions(accountId) table[] { { id, amount (negative = outgoing), description, type, createdAt (ms) } }
AddToSociety(account, amount, reason) boolean Deposita uma fatura paga na conta da sociedade ou do negócio que a emitiu
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 os métodos são opcionais: omite os que o teu recurso de negócios não suporte.

Método Devolve Descrição
BusinessesOf(citizenid) table[] { { id, name, label, type, onDuty } } negócios em que esta personagem trabalha
JobList() table[] { { name, label } } nomes de trabalhos de negócio, para o painel de administração
DeliverOrder(businessId, orderId) boolean Entrega uma encomenda de fornecimentos. false quando a encomenda já não existe
AddIncome(businessId, amount, kind, source, meta) boolean Adiciona receita à caixa do negócio
AddExpense(businessId, amount, kind, source, meta) Regista uma despesa

custom/bridge/dispatch/server.lua

Método Devolve Descrição
SendAlert(alert) boolean alert: { coords (vector3), title, message, job, source, number }. number é nil se for anónimo
CentralPlayers(job) number[]|nil Sources que atendem a central desse trabalho. nil conta antes os jogadores em serviço

custom/bridge/garage/server.lua

Método Devolve Descrição
List(citizenid) table[] { { plate, model, garage, state, fuel, engine, body, depotPrice } }. state: 0 fora, 1 guardado, 2 apreendido. engine e body vão 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 o veículo como fora da garagem (valet)

custom/bridge/housing/server.lua

Método Devolve Descrição
List(citizenid) table[] { { id, name, mine (boolean), price, kind, keys (count), where = { x, y, z } } }
Get(id, citizenid) table|nil Mesma forma que cada entrada de List
HasKey(citizenid, id) boolean Se a personagem tem uma chave dessa propriedade

custom/bridge/uploader/server.lua

Método Devolve Descrição
Upload(name, base64) string|nil url, string|nil error Carrega um ficheiro. name inclui a extensão
Capture(source, options) string|nil url, string|nil error Captura o ecrã do jogador. options: { maxWidth, maxHeight }

custom/bridge/voice

Servidor

Método Devolve Descrição
SetCall(source, channel) Coloca o jogador num canal de chamada. 0 sai de todas as chamadas
GetCall(source) number Canal de chamada atual, 0 se não estiver em nenhum

Cliente

Método Devolve Descrição
SetCallVolume(volume) Volume da chamada, de 5 a 100
RestoreCallEffect(serverId) Restaura o efeito de voz da chamada para esse jogador

custom/bridge/weather/server.lua

Método Devolve Descrição
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 Descrição
message string Texto da notificação
kind string 'info', 'success', 'error' ou 'warning'

custom/bridge/vehiclekeys/client.lua

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

Chamado pelo valet quando entrega um veículo. vehicle é o handle de entidade.


custom/bridge/fuel/client.lua

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

Chamado pelo valet para restaurar o nível de combustível guardado (de 0 a 100).