Accueil › Documentation › Personnalisation · origen_phone

Personnalisation · 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

Tout ce qui se trouve dans custom/ figure dans escrow_ignore : il reste donc ouvert quand la ressource est chiffrée, et il est séparé du cœur, si bien que les mises à jour du téléphone ne l’écrasent pas. Les fichiers de fournisseur de bridge/ sont eux aussi ouverts : tu peux les lire ou en copier un comme point de départ.

Chaque hook Custom renvoie nil par défaut, ce qui signifie « fais le comportement habituel ». Renvoie autre chose et ton code prend la main.


custom/client/notifications.lua

Custom.ShowNotification(data) → boolean|nil

Aspect d’une notification quand le téléphone est rangé. Par défaut, le téléphone surgit du bas de l’écran. Quand le téléphone est ouvert, les notifications s’affichent toujours à l’intérieur.

Paramètre Type Description
data table { app, title, content, avatar, thumbnail }
Retour Comportement
nil Le téléphone surgit comme d’habitude
true Tu l’as déjà affichée ; le téléphone ne fait rien

Utiliser origen_notify au lieu du téléphone :

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

Seuls les appels et les messages utilisent le téléphone, le reste passe par ton 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

Le hook s’exécute dans un pcall. S’il échoue, l’erreur est affichée et le téléphone montre la notification comme d’habitude.


custom/server/money.lua

Tous les débits et paiements du téléphone passent par ici : annonces, courses de taxi, factures, virements, abonnements de rencontres, récupération de ligne. Par défaut, le téléphone utilise la passerelle Banking.

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

Paramètre Type Description
source number ID serveur du joueur
amount number Toujours positif
reason string Déjà traduit dans la langue du joueur
account string|nil Compte choisi par le joueur, si l’app le lui permet
Retour Comportement
nil Débite via la passerelle bancaire
true Débité, continue
false, 'reason' Échec ; le texte est affiché au joueur

Débiter le liquide plutôt que la banque (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

Annonces gratuites pour les reporters :

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

Paie un joueur : gains des chauffeurs et des livreurs, ventes du marketplace et remboursements. Mêmes règles de retour que Custom.Charge.

Paramètre Type Description
source number ID serveur du joueur
amount number Montant à verser
reason string Déjà traduit dans la langue du joueur

custom/server/permissions.lua

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

Ton propre veto sur une app, pour les conditions qui ne rentrent pas dans une règle du panneau. S’exécute après les règles du panneau et ne peut que retirer l’accès, jamais l’accorder.

Paramètre Type Description
source number ID serveur du joueur
appId string 'bank', 'darkchat', 'blackmarket'...
Retour Comportement
nil Ce que dit le panneau
false Refusé, quoi qu’il arrive
lua
function Custom.CanUseApp(source, appId)
    if appId == 'bank' and MyResource.IsJailed(source) then
        return false
    end
 
    return nil
end

Ceci s’exécute à chaque ouverture d’un téléphone, une fois par app (plus de trente fois d’affilée). N’interroge pas la base de données ici : garde en mémoire ce dont tu as besoin.


custom/bridge

Chaque catégorie dispose d’un modèle avec les fonctions exactes dont elle a besoin. Remplis-le et mets la catégorie sur 'custom' dans config/bridge.lua :

lua
BridgeConfig.Banking = 'custom'

Chaque modèle s’enregistre avec Bridge.Register(category, 'custom', { ... }) et n’est utilisé que lorsque sa catégorie est sur 'custom'.


custom/bridge/framework

Serveur

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éthode Renvoie Description
RegisterUsableItem(name, cb) Enregistre l’objet téléphone comme utilisable. cb(source, item)
GetPlayer(source) table|nil L’objet joueur de ton framework
Identifier(player) string|nil Identifiant stable du personnage (propriétaire du téléphone)
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 }

Client

lua
Bridge.Register('Framework', 'custom', {
    PlayerLoadedEvent = nil,
    IsDead = function() return false end,
    IsCuffed = function() return false end,
})
Champ Renvoie Description
PlayerLoadedEvent string|nil Événement client que ton framework déclenche une fois le personnage chargé
IsDead() boolean Mort ou à terre : le téléphone est inutilisable
IsCuffed() boolean Menotté : le téléphone est inutilisable

custom/bridge/inventory

Serveur

Méthode Renvoie Description
Items(source, name) table[]|nil { { slot, metadata } } pour cet objet. nil quand l’inventaire n’est pas encore chargé
SetMetadata(source, slot, meta) Écrit des metadata sur l’objet de ce slot
All(source) table[] Tous les objets : { name, label, count, slot, metadata }
Remove(source, name, count) boolean Retire des objets
Add(target, name, count, meta) boolean Ajoute des objets au source d’un joueur ou à l’id d’un stash
CanCarry(source, name, count) boolean Indique si le joueur peut porter les objets

Client

Méthode Renvoie Description
Items() table[]|nil Les objets du joueur local, chacun avec name et metadata

custom/bridge/banking/server.lua

Méthode Renvoie Description
Accounts(citizenid) table[] { { id, name, type, balance } }
Charge(source, amount, reason) boolean, string|nil Succès, et l’erreur affichée au joueur
Deposit(source, amount, reason) boolean Paie le joueur
Transactions(accountId) table[] { { id, amount (negative = outgoing), description, type, createdAt (ms) } }
AddToSociety(account, amount, reason) boolean Verse une facture payée sur le compte de la société ou de l’entreprise qui l’a émise
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

Toutes les méthodes sont facultatives : omets celles que ta ressource d’entreprises ne gère pas.

Méthode Renvoie Description
BusinessesOf(citizenid) table[] { { id, name, label, type, onDuty } } entreprises pour lesquelles ce personnage travaille
JobList() table[] { { name, label } } noms de métiers d’entreprise, pour le panneau d’administration
DeliverOrder(businessId, orderId) boolean Livre une commande d’approvisionnement. false quand la commande n’existe plus
AddIncome(businessId, amount, kind, source, meta) boolean Ajoute un revenu à la caisse de l’entreprise
AddExpense(businessId, amount, kind, source, meta) Enregistre une dépense

custom/bridge/dispatch/server.lua

Méthode Renvoie Description
SendAlert(alert) boolean alert : { coords (vector3), title, message, job, source, number }. number vaut nil si l’alerte est anonyme
CentralPlayers(job) number[]|nil Sources qui répondent à la centrale de ce métier. nil compte à la place les joueurs en service

custom/bridge/garage/server.lua

Méthode Renvoie Description
List(citizenid) table[] { { plate, model, garage, state, fuel, engine, body, depotPrice } }. state : 0 sorti, 1 rangé, 2 en fourrière. engine et body vont de 0 à 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 Marque le véhicule comme sorti du garage (voiturier)

custom/bridge/housing/server.lua

Méthode Renvoie Description
List(citizenid) table[] { { id, name, mine (boolean), price, kind, keys (count), where = { x, y, z } } }
Get(id, citizenid) table|nil Même forme que chaque entrée de List
HasKey(citizenid, id) boolean Indique si le personnage a une clé de cette propriété

custom/bridge/uploader/server.lua

Méthode Renvoie Description
Upload(name, base64) string|nil url, string|nil error Téléverse un fichier. name inclut l’extension
Capture(source, options) string|nil url, string|nil error Capture l’écran du joueur. options : { maxWidth, maxHeight }

custom/bridge/voice

Serveur

Méthode Renvoie Description
SetCall(source, channel) Place le joueur dans un canal d’appel. 0 quitte tous les appels
GetCall(source) number Canal d’appel actuel, 0 s’il n’est dans aucun

Client

Méthode Renvoie Description
SetCallVolume(volume) Volume de l’appel, de 5 à 100
RestoreCallEffect(serverId) Restaure l’effet de voix d’appel pour ce joueur

custom/bridge/weather/server.lua

Méthode Renvoie Description
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,
})
Paramètre Type Description
message string Texte de la notification
kind string 'info', 'success', 'error' ou 'warning'

custom/bridge/vehiclekeys/client.lua

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

Appelé par le voiturier lorsqu’il livre un véhicule. vehicle est le handle d’entité.


custom/bridge/fuel/client.lua

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

Appelé par le voiturier pour restaurer le niveau de carburant enregistré (de 0 à 100).