Accueil › Documentation › Objets · origen_ilegalv2

Objets · origen_ilegalv2

origen_ilegalv2 nécessite l’enregistrement de 18 items uniques dans ton inventaire pour que la ressource fonctionne correctement. Copie le bloc correspondant à ton système d’inventaire et colle-le dans le fichier approprié.

empty_weed_bag est partagé entre le labo de meth et celui de coke. Enregistre-le une seule fois.

Les items graffiti_spray et graffiti_eraser ne sont nécessaires que lorsque Config.Graffiti.Enable = true.


Carte des items par labo

Item Labo Rôle Utilisable
ephedrine Meth Ingrédient de cuisson Non
acetone Meth Ingrédient de cuisson Non
empty_weed_bag Meth / Coke Ingrédient d’ensachage (partagé) Non
methbags Meth Produit final Vente de drogue
coca_leaf Coke Ingrédient de transformation Non
coke Coke Intermédiaire (sortie de make_powder, entrée de cut_coke) Non
bakingsoda Coke Ingrédient de coupe Non
loosecoke Coke Intermédiaire (sortie de cut_coke, entrée de bag_coke) Non
cokebaggy Coke Produit final Vente de drogue
wetcannabis Weed Résultat de la récolte · ingrédient de séchage Non
drycannabis Weed Résultat du séchage · ingrédient de broyage Non
weedgrinder Weed Outil obligatoire — non consommé Non
grindedweed Weed Résultat du broyage · ingrédient d’ensachage Non
bluntwrap Weed Ingrédient d’ensachage Non
blunt Weed Produit final Vente de drogue
ilegal_cad Gang Identifiant du panneau de gang — non consommé à l’utilisation Oui
graffiti_spray Graffiti Bombe de peinture — consommée à la pose d’un tag Oui
graffiti_eraser Graffiti Chiffon de nettoyage — consommé à l’effacement d’un graffiti Oui

Les items marqués Oui ouvrent un menu ou lancent une action lorsque le joueur les utilise. Sur ox_inventory, ils nécessitent le câblage supplémentaire décrit dans Items utilisables sur ox_inventory.

Les items marqués Vente de drogue ne deviennent utilisables que lorsqu’ils figurent dans Config.DrugSales.DrugList.


ox_inventory

Ajoute les entrées suivantes à ox_inventory/data/items.lua :

Sur ox_inventory, l’icône doit être déclarée dans la table client sous la forme client = { image = '...' }. Un champ image de premier niveau est ignoré par l’inventaire et l’item se rabattra sur <item_name>.png.

luaox_inventory/data/items.lua
-- ── METH LAB ──────────────────────────────────────────────────────────────────
 
['ephedrine'] = {
    label       = 'Ephedrine',
    weight      = 100,
    stack       = true,
    close       = true,
    description = 'Chemical precursor for methamphetamine production.',
    client      = { image = 'ephedrine.png' },
},
 
['acetone'] = {
    label       = 'Acetone',
    weight      = 200,
    stack       = true,
    close       = true,
    description = 'Chemical solvent. Required for the cooking process.',
    client      = { image = 'acetone.png' },
},
 
['empty_weed_bag'] = {
    label       = 'Empty Bag',
    weight      = 10,
    stack       = true,
    close       = true,
    description = 'Empty plastic bag. Used for packaging products.',
    client      = { image = 'empty_weed_bag.png' },
},
 
['methbags'] = {
    label       = 'Meth Bags',
    weight      = 150,
    stack       = true,
    close       = true,
    description = 'Crystallized methamphetamine ready for distribution.',
    client      = { image = 'methbags.png' },
},
 
-- ── COKE LAB ──────────────────────────────────────────────────────────────────
 
['coca_leaf'] = {
    label       = 'Coca Leaf',
    weight      = 50,
    stack       = true,
    close       = true,
    description = 'Raw coca leaf. Primary raw material for processing.',
    client      = { image = 'coca_leaf.png' },
},
 
['coke'] = {
    label       = 'Base Powder',
    weight      = 80,
    stack       = true,
    close       = true,
    description = 'Unprocessed cocaine powder. Intermediate product.',
    client      = { image = 'coke.png' },
},
 
['bakingsoda'] = {
    label       = 'Baking Soda',
    weight      = 50,
    stack       = true,
    close       = true,
    description = 'Sodium bicarbonate. Cutting agent for cocaine.',
    client      = { image = 'bakingsoda.png' },
},
 
['loosecoke'] = {
    label       = 'Cut Cocaine',
    weight      = 80,
    stack       = true,
    close       = true,
    description = 'Cut cocaine ready for bagging.',
    client      = { image = 'loosecoke.png' },
},
 
['cokebaggy'] = {
    label       = 'Cocaine Baggy',
    weight      = 100,
    stack       = true,
    close       = true,
    description = 'Bagged cocaine ready for distribution.',
    client      = { image = 'cokebaggy.png' },
},
 
-- ── WEED LAB ──────────────────────────────────────────────────────────────────
 
['wetcannabis'] = {
    label       = 'Wet Cannabis',
    weight      = 100,
    stack       = true,
    close       = true,
    description = 'Freshly harvested cannabis flower. Must be dried.',
    client      = { image = 'wetcannabis.png' },
},
 
['drycannabis'] = {
    label       = 'Dry Cannabis',
    weight      = 60,
    stack       = true,
    close       = true,
    description = 'Dried cannabis ready for grinding.',
    client      = { image = 'drycannabis.png' },
},
 
['weedgrinder'] = {
    label       = 'Grinder',
    weight      = 200,
    stack       = false,
    close       = true,
    description = 'Herb grinder. Not consumed on use.',
    client      = { image = 'weedgrinder.png' },
},
 
['grindedweed'] = {
    label       = 'Ground Cannabis',
    weight      = 40,
    stack       = true,
    close       = true,
    description = 'Ground cannabis ready for bagging.',
    client      = { image = 'grindedweed.png' },
},
 
['bluntwrap'] = {
    label       = 'Blunt Wrap',
    weight      = 10,
    stack       = true,
    close       = true,
    description = 'Rolling paper for blunts.',
    client      = { image = 'bluntwrap.png' },
},
 
['blunt'] = {
    label       = 'Blunt',
    weight      = 30,
    stack       = true,
    close       = true,
    description = 'Rolled blunt ready for sale.',
    client      = { image = 'blunt.png' },
},
 
-- ── GANG CAD ──────────────────────────────────────────────────────────────────
 
['ilegal_cad'] = {
    label       = 'Gang CAD',
    weight      = 0,
    stack       = true,
    close       = false,
    consume     = 0,
    description = 'Gang panel access credential. Not consumed on use.',
    client      = { image = 'ilegal_cad.png' },
    server      = { export = 'origen_ilegalv2.ilegal_cad' },
},
 
-- ── GRAFFITI ──────────────────────────────────────────────────────────────────
 
['graffiti_spray'] = {
    label       = 'Spray Can',
    weight      = 300,
    stack       = true,
    close       = true,
    consume     = 0,
    description = 'Aerosol spray can. Used to tag gang graffiti. Consumed on placement.',
    client      = { image = 'graffiti_spray.png' },
    server      = { export = 'origen_ilegalv2.graffiti_spray' },
},
 
['graffiti_eraser'] = {
    label       = 'Cleaning Rag',
    weight      = 100,
    stack       = true,
    close       = true,
    consume     = 0,
    description = 'Solvent-soaked rag. Used to clean graffiti tags. Consumed on use.',
    client      = { image = 'graffiti_eraser.png' },
    server      = { export = 'origen_ilegalv2.graffiti_eraser' },
},

Items utilisables sur ox_inventory

ox_inventory ne lit pas le registre du framework utilisé par QBCore.Functions.CreateUseableItem ou ESX.RegisterUsableItem lorsqu’un item déclare son propre handler. Pour que les items utilisables de cette ressource fonctionnent nativement sur ox_inventory, deux éléments sont nécessaires.

1. Déclare l’export sur l’item

Les trois items utilisables ci-dessus l’incluent déjà :

lua
consume = 0,
server  = { export = 'origen_ilegalv2.<item_name>' },

consume = 0 est obligatoire. En déclarant server.export, ox_inventory définit automatiquement consume = 1, ce qui supprime l’item de l’inventaire du joueur à chaque utilisation. Cela retirerait le CAD de gang (un identifiant permanent) et consommerait les items de graffiti deux fois, car la ressource les retire déjà elle-même après une action réussie.

Utilise le nombre 0, pas false ni nil. En Lua, 0 est vrai ; c’est donc la seule valeur qui à la fois empêche la consommation automatique et déclenche quand même le handler de l’item.

2. Ajoute le fichier de bridge des exports

Crée custom/server/ox_usable_exports.lua dans la ressource. Le motif custom/server/*.lua est déjà déclaré dans fxmanifest.lua : aucune modification du manifest n’est donc nécessaire, et le dossier figure dans escrow_ignore, donc le fichier survit aux mises à jour de la ressource.

luaorigen_ilegalv2/custom/server/ox_usable_exports.lua
if GetResourceState('ox_inventory') ~= 'started' then return end
 
local bound = {}
 
local function buildItemData(item, inventory, slot)
    local slotData = slot and inventory.items and inventory.items[slot]
 
    return {
        name     = item and item.name,
        label    = item and item.label,
        slot     = slot,
        count    = slotData and slotData.count or 1,
        metadata = slotData and slotData.metadata or {},
    }
end
 
local function bindOxUsable(itemName, cb)
    if not itemName or bound[itemName] then return end
    bound[itemName] = true
 
    exports(itemName, function(event, item, inventory, slot)
        if event ~= 'usingItem' then return end
        if not inventory or not inventory.player then return end
 
        cb(inventory.id, buildItemData(item, inventory, slot))
    end)
end
 
local baseRegister = Framework and Framework.RegisterUsableItem
 
if not baseRegister then
    print('^1[origen_ilegalv2] Framework.RegisterUsableItem not available - ox_inventory exports not mounted^0')
    return
end
 
Framework.RegisterUsableItem = function(itemName, cb)
    baseRegister(itemName, cb)
    bindOxUsable(itemName, cb)
end

Le fichier enveloppe Framework.RegisterUsableItem, de sorte que chaque item que la ressource enregistre obtient automatiquement son export ox_inventory. Cela couvre aussi les drogues créées à l’exécution depuis le panneau d’administration.

L’enregistrement d’origine du framework est conservé comme solution de repli. Il n’y a pas de double exécution : ox_inventory ne se rabat sur le registre du framework que lorsque l’item ne déclare pas consume, et ces items le déclarent.

ox_inventory ne peut pas créer d’items à l’exécution. Une drogue ajoutée depuis le panneau d’administration obtient son handler d’utilisation, mais l’item lui-même doit quand même être ajouté manuellement à ox_inventory/data/items.lua, suivi d’un redémarrage de la ressource.


QBCore

Ajoute les entrées suivantes à qb-core/shared/items.lua :

luaqb-core/shared/items.lua
-- ── METH LAB ──────────────────────────────────────────────────────────────────
['ephedrine']      = { name = 'ephedrine',      label = 'Ephedrine',       weight = 100,  type = 'item', image = 'ephedrine.png',      unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Chemical precursor for methamphetamine production.' },
['acetone']        = { name = 'acetone',        label = 'Acetone',         weight = 200,  type = 'item', image = 'acetone.png',        unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Chemical solvent. Required for the cooking process.' },
['empty_weed_bag'] = { name = 'empty_weed_bag', label = 'Empty Bag',       weight = 10,   type = 'item', image = 'empty_weed_bag.png', unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Empty plastic bag. Used for packaging products.' },
['methbags']       = { name = 'methbags',       label = 'Meth Bags',       weight = 150,  type = 'item', image = 'methbags.png',       unique = false, useable = true,  shouldClose = true,  combinable = nil, description = 'Crystallized methamphetamine ready for distribution.' },
 
-- ── COKE LAB ──────────────────────────────────────────────────────────────────
['coca_leaf']      = { name = 'coca_leaf',      label = 'Coca Leaf',       weight = 50,   type = 'item', image = 'coca_leaf.png',      unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Raw coca leaf. Primary raw material for processing.' },
['coke']           = { name = 'coke',           label = 'Base Powder',     weight = 80,   type = 'item', image = 'coke.png',           unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Unprocessed cocaine powder. Intermediate product.' },
['bakingsoda']     = { name = 'bakingsoda',     label = 'Baking Soda',     weight = 50,   type = 'item', image = 'bakingsoda.png',     unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Sodium bicarbonate. Cutting agent for cocaine.' },
['loosecoke']      = { name = 'loosecoke',      label = 'Cut Cocaine',     weight = 80,   type = 'item', image = 'loosecoke.png',      unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Cut cocaine ready for bagging.' },
['cokebaggy']      = { name = 'cokebaggy',      label = 'Cocaine Baggy',   weight = 100,  type = 'item', image = 'cokebaggy.png',      unique = false, useable = true,  shouldClose = true,  combinable = nil, description = 'Bagged cocaine ready for distribution.' },
 
-- ── WEED LAB ──────────────────────────────────────────────────────────────────
['wetcannabis']    = { name = 'wetcannabis',    label = 'Wet Cannabis',    weight = 100,  type = 'item', image = 'wetcannabis.png',    unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Freshly harvested cannabis flower. Must be dried.' },
['drycannabis']    = { name = 'drycannabis',    label = 'Dry Cannabis',    weight = 60,   type = 'item', image = 'drycannabis.png',    unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Dried cannabis ready for grinding.' },
['weedgrinder']    = { name = 'weedgrinder',    label = 'Grinder',         weight = 200,  type = 'item', image = 'weedgrinder.png',    unique = true,  useable = true,  shouldClose = true,  combinable = nil, description = 'Herb grinder. Not consumed on use.' },
['grindedweed']    = { name = 'grindedweed',    label = 'Ground Cannabis', weight = 40,   type = 'item', image = 'grindedweed.png',    unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Ground cannabis ready for bagging.' },
['bluntwrap']      = { name = 'bluntwrap',      label = 'Blunt Wrap',      weight = 10,   type = 'item', image = 'bluntwrap.png',      unique = false, useable = false, shouldClose = true,  combinable = nil, description = 'Rolling paper for blunts.' },
['blunt']          = { name = 'blunt',          label = 'Blunt',           weight = 30,   type = 'item', image = 'blunt.png',          unique = false, useable = true,  shouldClose = true,  combinable = nil, description = 'Rolled blunt ready for sale.' },
 
-- ── GANG CAD ──────────────────────────────────────────────────────────────────
['ilegal_cad']     = { name = 'ilegal_cad',     label = 'Gang CAD',        weight = 0,    type = 'item', image = 'ilegal_cad.png',     unique = false, useable = true,  shouldClose = false, combinable = nil, description = 'Gang panel access credential. Not consumed on use.' },
 
-- ── GRAFFITI ──────────────────────────────────────────────────────────────────
['graffiti_spray']  = { name = 'graffiti_spray',  label = 'Spray Can',      weight = 300,  type = 'item', image = 'graffiti_spray.png',  unique = false, useable = true,  shouldClose = true,  combinable = nil, description = 'Aerosol spray can. Used to tag gang graffiti. Consumed on placement.' },
['graffiti_eraser'] = { name = 'graffiti_eraser', label = 'Cleaning Rag',   weight = 100,  type = 'item', image = 'graffiti_eraser.png', unique = false, useable = true,  shouldClose = true,  combinable = nil, description = 'Solvent-soaked rag. Used to clean graffiti tags. Consumed on use.' },

ESX

Exécute le SQL suivant sur ta base de données (ou colle-le dans HeidiSQL / phpMyAdmin) :

sqlESX — INSERT INTO items
INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES
-- METH LAB
('ephedrine',      'Ephedrine',       100,  0, 1),
('acetone',        'Acetone',         200,  0, 1),
('empty_weed_bag', 'Empty Bag',       10,   0, 1),
('methbags',       'Meth Bags',       150,  0, 1),
-- COKE LAB
('coca_leaf',      'Coca Leaf',       50,   0, 1),
('coke',           'Base Powder',     80,   0, 1),
('bakingsoda',     'Baking Soda',     50,   0, 1),
('loosecoke',      'Cut Cocaine',     80,   0, 1),
('cokebaggy',      'Cocaine Baggy',   100,  0, 1),
-- WEED LAB
('wetcannabis',    'Wet Cannabis',    100,  0, 1),
('drycannabis',    'Dry Cannabis',    60,   0, 1),
('weedgrinder',    'Grinder',         200,  1, 1),
('grindedweed',    'Ground Cannabis', 40,   0, 1),
('bluntwrap',      'Blunt Wrap',      10,   0, 1),
('blunt',          'Blunt',           30,   0, 1),
-- GANG CAD
('ilegal_cad',     'Gang CAD',        0,    0, 1),
-- GRAFFITI
('graffiti_spray',  'Spray Can',      300,  0, 1),
('graffiti_eraser', 'Cleaning Rag',   100,  0, 1);

Pour ESX, rare = 1 marque un item comme non empilable dans certaines anciennes implémentations d’UI. Seuls weedgrinder et ilegal_cad sont marqués rares/uniques dans tous les formats, car ce sont des outils et non des consommables.


Images des items

Place les fichiers image .png dans le dossier d’images de ta ressource d’inventaire :

Les noms de fichier doivent correspondre exactement au champ image (sensible à la casse sur les serveurs Linux) :

text
ephedrine.png      acetone.png        empty_weed_bag.png  methbags.png
coca_leaf.png      coke.png           bakingsoda.png      loosecoke.png
cokebaggy.png      wetcannabis.png    drycannabis.png     weedgrinder.png
grindedweed.png    bluntwrap.png      blunt.png           ilegal_cad.png
graffiti_spray.png graffiti_eraser.png