Accueil › Documentation › 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.
| 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.
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.
-- ── 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' },
},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.
Les trois items utilisables ci-dessus l’incluent déjà :
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.
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.
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)
endLe 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.
Ajoute les entrées suivantes à qb-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.' },Exécute le SQL suivant sur ta base de données (ou colle-le dans HeidiSQL / phpMyAdmin) :
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.
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) :
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