Accueil › Documentation › Personnalisation · origen_inventory

Personnalisation · origen_inventory

origen_inventory propose trois moyens de personnalisation :

  1. Hooks : écoutent les événements de l’inventaire et modifient les données ou annulent des actions.
  2. Objets personnalisés : enregistre, modifie et supprime des objets en cours d’exécution (ils sont stockés dans origen_customitems).
  3. Points du monde : enregistre des points interactifs personnalisés sur la carte.
text
config/
├── hooks.lua          -- Hook examples (server + client)
modules/
├── customItems.lua    -- AddCustomItem / EditCustomItem / RemoveCustomItem implementation
client/functions/
├── f_hooks.lua        -- registerHook / removeHooks (client-side)
└── f_worldpoint.lua   -- World point exports

Hooks

Les hooks permettent à d’autres ressources de s’abonner aux événements de l’inventaire et, soit de consulter les données, soit de les modifier ou d’annuler l’action. Le client et le serveur exposent le même nom d’export : registerHook.

registerHook(event, callback, options?) → string (id)

Enregistre un callback pour le hook indiqué.

lua
local hookId = exports.origen_inventory:registerHook('createItem', function(payload)
    -- payload is hook-specific
    return payload.metadata
end)
Paramètre Type Description
event string Nom du hook à écouter.
callback function Appelé avec les données du hook.
options table Configuration facultative du hook.

removeHooks(id) → void

Supprime un hook enregistré précédemment à partir de son id.

lua
exports.origen_inventory:removeHooks(hookId)

Hooks serveur

createItem

Déclenché lorsqu’un objet est en cours de création (par exemple lors de l’initialisation des métadonnées). Renvoie la table metadata (éventuellement modifiée) pour appliquer les changements.

Données reçues

Champ Type Description
item table Définition de l’objet en cours de création.
metadata table Table de métadonnées modifiable.

Exemple : attribuer un id de sac unique lors de la création d’un paperbag :

lua
exports.origen_inventory:registerHook('createItem', function(payload)
    local metadata = payload.metadata
    local item = payload.item
 
    if item.name == 'paperbag' and not metadata.bagId then
        metadata.bagId = math.random(1000, 9999)
    end
 
    return metadata -- you MUST return the metadata table
end)

Si tu enregistres le hook createItem et que tu oublies de renvoyer la table de métadonnées, l’objet sera créé avec des métadonnées vides.


Hooks client

worldpoint-interact-in

Déclenché lorsque le joueur entre dans le rayon d’interaction d’un point du monde.

Données reçues

Champ Type Description
type string Type de point (stash, shop, crafting, drop, personnalisé).
id string Id unique du point.
location vector3 Coordonnées du point.
label string Libellé affiché.

worldpoint-interact-out

Déclenché lorsque le joueur quitte le rayon d’interaction d’un point du monde. Reçoit les mêmes données que le précédent.

worldpoint-area-nearby

Déclenché lorsque le joueur entre dans la zone plus large (zoneDistance) autour d’un stash ou d’un autre point disposant d’une zone configurée. Sert à charger à la demande des interfaces coûteuses.

Exemple : journaliser chaque entrée dans un stash :

lua
exports.origen_inventory:registerHook('worldpoint-interact-in', function(payload)
    if payload.type ~= 'stash' then return end
    print(('Player entered stash %s at %s'):format(payload.id, payload.label))
end)

Objets personnalisés

Les objets personnalisés sont stockés dans la table origen_customitems et rechargés au démarrage de la ressource. Les trois opérations s’exécutent côté serveur.

AddCustomItem(data) → boolean

Ajoute un nouvel objet personnalisé. Renvoie false si l’objet existe déjà.

lua
exports.origen_inventory:AddCustomItem({
    name = 'origen_compass',
    label = 'Compass',
    weight = 200,
    type = 'item',
    image = 'origen_compass.png',
    description = 'Always points to the next adventure.',
    rarity = 'rare',
    stack = false,
    close = true,
    decay = nil,
    server = nil,
    client = nil,
    buttons = {},
})
Champ Type Description
name string Clé unique de l’objet. Si elle est vide, elle est générée à partir de label.
label string Libellé affiché.
weight number Poids de l’objet.
type string Type d’objet (item, weapon, etc.).
image string Nom du fichier image (il doit exister dans le dossier d’images de ton inventaire).
description string Description de l’objet.
rarity string Libellé de rareté (facultatif).
stack boolean Indique si l’objet est empilable. La valeur par défaut est true.
close boolean Ferme l’inventaire à l’utilisation. La valeur par défaut est true.
decay number Durée de détérioration (facultatif).
server string|table Définition du callback serveur (facultatif).
client string|table Définition du callback client (facultatif).
buttons table Boutons du menu contextuel (facultatif).
consume / uses number Nombre d’utilisations avant que l’objet soit consommé.

L’objet est ajouté au dictionnaire en mémoire et synchronisé automatiquement avec tous les clients.


EditCustomItem(data) → boolean, error?

Modifie un objet personnalisé existant. Le champ name est obligatoire et doit correspondre à un objet existant.

lua
exports.origen_inventory:EditCustomItem({
    name = 'origen_compass',
    label = 'Magic Compass',
    weight = 150,
})

Renvoie false accompagné d’une chaîne d’erreur lorsque :


RemoveCustomItem(name) → boolean

Supprime un objet de la base de données et de l’inventaire de tous les joueurs. Déclenche un événement interne de synchronisation pour que les clients abandonnent leurs références en cache.

lua
exports.origen_inventory:RemoveCustomItem('origen_compass')

Cette action est destructive. L’objet est retiré de tous les inventaires actifs et de la table origen_customitems.


Points du monde

Les points du monde affichent des lieux interactifs sur la carte et y réagissent. Ils font fonctionner les stashes, les boutiques, les tables de crafting, les drops et tout point personnalisé que tu enregistres.

CreateWorldPoint(pointId, pointData, pointType) → void (client)

Enregistre un seul point en cours d’exécution.

lua
exports.origen_inventory:CreateWorldPoint('my_lab_table', {
    label = 'Underground Lab',
    location = vector3(2541.92, 4684.31, 34.05),
    -- marker = { type = 27, size = vector3(0.3, 0.3, 0.3), color = vector4(255, 0, 0, 150) },
    -- sprite = { enabled = true, icon = 'lucide:flask-conical' },
}, 'crafting')

RemoveWorldPoint(pointId) → void (client)

Supprime un point à partir de son id.

SetWorldPointEnabled(pointId, enabled) → void (client)

Active ou désactive un point existant sans le supprimer.

CreateBatchPoints(pointsData, pointType) → void (client)

Enregistre plusieurs points en une seule fois.

lua
exports.origen_inventory:CreateBatchPoints({
    ['stash_1'] = { label = 'Stash 1', location = vector3(...) },
    ['stash_2'] = { label = 'Stash 2', location = vector3(...) },
}, 'stash')

ClearPoints(pointType) → void (client)

Supprime tous les points d’un type.

RefreshAllPoints(pointType) → void (client)

Recharge tous les points d’un type. Utile après avoir modifié les permissions de métier du joueur.

GetPoints(pointType) → table (client)

Renvoie la liste des points d’un type.

GetPointCount(pointType) → number (client)

Renvoie le nombre de points enregistrés d’un type.

HasPoint(pointId) → boolean (client)

Renvoie true si un point avec cet id existe.

RegisterPointType(pointType, config) → void (client)

Enregistre un type de point entièrement nouveau, avec son propre sprite, son propre marqueur et ses propres hooks. Utilise-le quand tu veux ajouter une nouvelle catégorie à côté de stash, shop, crafting et drop.

LoadPointType(pointType) → void (client)

Recharge la configuration d’un type de point.

GetWorldPointManager() → table (client)

Renvoie l’objet gestionnaire de points sous-jacent. Réservé à un usage avancé.


Passerelle SQL

Le helper SQL situé dans bridge/sql.lua fournit des fonctions indépendantes du framework que tous les sous-systèmes internes utilisent. En général, tu n’as pas à l’utiliser directement, mais son code source n’est pas obfusqué (il est hors du périmètre de escrow_ignore) et tes propres scripts peuvent l’encapsuler.