ox_inventory मार्गदर्शिका: 2026 में जाने वाला FiveM इन्वेंटरी
Master ox_inventory अपने FiveM सर्वर पर। इंस्टॉल करें, आइटम्स कॉन्फ़िगर करें, एक्सपोर्ट्स हुक करें और QBCore, ESX या standalone फ्रेमवर्क्स के साथ इंटीग्रेट करें।
Agency Scripts
Agency Scripts के संस्थापक और प्रमुख डेवलपर
ox_inventory क्या है?
ox_inventory एक आधुनिक, उच्च प्रदर्शन वाला इन्वेंटरी सिस्टम है जो FiveM के लिए गंभीर रोलप्ले सर्वरों के लिए मानक विकल्प बन गया है। Overextended टीम द्वारा निर्मित, यह पुराने इन्वेंटरी समाधानों को एक तेज़, अधिक लचीला, और विस्तार में आसान सिस्टम से बदलता है। इसमें एक चिकना React-आधारित UI, अंतर्निहित हथियार प्रबंधन, क्राफ्टिंग समर्थन, दुकानें, स्टैश, और एक शक्तिशाली API है जिसका उपयोग स्क्रिप्ट डेवलपर्स कस्टम आइटम इंटरैक्शन बनाने के लिए कर सकते हैं। चाहे आप नया सर्वर बना रहे हों या किसी अन्य इन्वेंटरी से माइग्रेट कर रहे हों, ox_inventory को गहराई से समझना आपको एक बेहतर FiveM डेवलपर बनाएगा।
इंस्टॉलेशन और कॉन्फ़िगरेशन
ox_inventory के लिए आवश्यक है ox_lib एक निर्भरता के रूप में और ESX और QBCore दोनों फ्रेमवर्क के साथ काम करता है, साथ ही standalone सेटअप के साथ भी। स्थापना में संसाधन डाउनलोड करना, SQL स्कीमा को आपके डेटाबेस में आयात करना, और फ्रेमवर्क ब्रिज को कॉन्फ़िगर करना शामिल है। कॉन्फ़िगरेशन फ़ाइल सब कुछ नियंत्रित करती है, जैसे इन्वेंटरी वजन सीमाएँ से लेकर आइटम क्षय टाइमर तक।
-- Configuration snippet from ox_inventory
return {
playerslots = 50,
playerweight = 30000,
playerweaponslots = 5,
decay = true,
decayInterval = 60,
trunkslots = 50,
trunkweight = 60000,
gloveboxslots = 5,
gloveboxweight = 5000,
}
कस्टम आइटम पंजीकरण
ox_inventory में आइटम परिभाषित होते हैं data/items.lua फ़ाइल। प्रत्येक आइटम को एक अद्वितीय नाम, एक लेबल, एक वजन, और वैकल्पिक रूप से स्टैक आकार, क्षय दर, विवरण, और क्लाइंट-साइड या सर्वर-साइड इवेंट हैंडलर की आवश्यकता होती है। पूर्ण आइटम परिभाषा स्कीमा को समझना आपको ऐसे आइटम बनाने देता है जो आपकी स्क्रिप्ट्स की आवश्यकताओं के अनुसार काम करते हैं।
-- data/items.lua
return {
['water_bottle'] = {
label = 'Water Bottle',
weight = 500,
stack = true,
close = true,
description = 'A refreshing bottle of water',
client = {
image = 'water_bottle.png',
}
},
['lockpick'] = {
label = 'Lockpick',
weight = 200,
stack = true,
close = true,
degrade = 300,
description = 'Used to pick locks. Breaks after use.',
},
['driver_license'] = {
label = 'Driver License',
weight = 0,
stack = false,
consume = 0,
description = 'Issued by the DMV',
client = {
image = 'driver_license.png',
}
},
}
ox_inventory सर्वर API का उपयोग
सर्वर-साइड एक्सपोर्ट ox_inventory का सबसे अधिक उपयोग किया जाने वाला हिस्सा हैं, जो आपको आइटम जोड़ने, हटाने, इन्वेंट्री सामग्री जांचने, और मेटाडेटा को नियंत्रित करने की अनुमति देते हैं। धोखेबाजों द्वारा शोषण को रोकने के लिए आइटम नियंत्रण के लिए हमेशा सर्वर-साइड API का उपयोग करें।
-- Server-side: Adding items to a player
RegisterNetEvent('myresource:giveReward', function(itemName, count)
local src = source
local success = exports.ox_inventory:AddItem(src, itemName, count)
if success then
TriggerClientEvent('ox_lib:notify', src, {
title = 'Item Received',
description = count .. 'x ' .. itemName,
type = 'success'
})
else
TriggerClientEvent('ox_lib:notify', src, {
title = 'Inventory Full',
description = 'Could not add item to inventory',
type = 'error'
})
end
end)
-- Server-side: Check if player has required items
local function HasRequiredItems(src, requirements)
for _, req in ipairs(requirements) do
local count = exports.ox_inventory:GetItemCount(src, req.name)
if count < req.amount then
return false, req.name, req.amount - count
end
end
return true
end
-- Server-side: Remove multiple items in a transaction
local function ConsumeRecipeItems(src, recipe)
for _, ingredient in ipairs(recipe.ingredients) do
local removed = exports.ox_inventory:RemoveItem(
src, ingredient.name, ingredient.amount
)
if not removed then
print(('[ERROR] Failed to remove %s from player %d'):format(
ingredient.name, src
))
return false
end
end
return true
end
Item Metadata के साथ काम करना
आइटम मेटाडेटा ox_inventory की सबसे शक्तिशाली विशेषताओं में से एक है। यह आपको व्यक्तिगत आइटम उदाहरणों से मनमाना डेटा संलग्न करने की अनुमति देता है, जिससे हथियारों पर अद्वितीय सीरियल नंबर, भोजन पर समाप्ति तिथियाँ, ID कार्ड पर खिलाड़ी नाम, और किसी भी आइटम पर कस्टम गुण संभव होते हैं।
-- Server: Create a driver license with metadata
RegisterNetEvent('myresource:issueLicense', function(targetId, licenseType)
local src = source
local metadata = {
type = licenseType,
issued = os.date('%Y-%m-%d'),
issuedBy = GetPlayerName(src),
holder = GetPlayerName(targetId),
expires = os.date('%Y-%m-%d', os.time() + 30 * 86400),
}
exports.ox_inventory:AddItem(targetId, 'driver_license', 1, metadata)
end)
-- Client: Reading metadata when using an item
exports('driver_license', function(data, slot)
local item = exports.ox_inventory:GetSlot(slot)
if not item or not item.metadata then return end
local meta = item.metadata
lib.notify({
title = 'Driver License',
description = ('Holder: %s\nType: %s\nExpires: %s'):format(
meta.holder or 'Unknown',
meta.type or 'Standard',
meta.expires or 'N/A'
),
type = 'inform'
})
end)
कस्टम शॉप्स बनाना
ox_inventory में एक अंतर्निहित दुकान प्रणाली शामिल है जिसे आप कस्टम आइटम कैटलॉग, मूल्य निर्धारण, नौकरी प्रतिबंधों, और स्थानों के साथ कॉन्फ़िगर कर सकते हैं। दुकानें data/shops.lua और इसे ped विक्रेताओं, blip स्थानों से जोड़ा जा सकता है, या प्रोग्रामेटिक रूप से ट्रिगर किया जा सकता है।
-- data/shops.lua
return {
['hardware_store'] = {
name = 'Hardware Store',
inventory = {
{ name = 'lockpick', price = 150, count = 10 },
{ name = 'screwdriver', price = 80, count = 20 },
{ name = 'radio', price = 250, count = 5 },
{ name = 'repairkit', price = 1000, count = 5 },
},
locations = {
vec3(45.6, -1749.3, 29.6),
vec3(2747.8, 3472.9, 55.7),
},
targets = {
ped = 's_m_y_hardware_01',
scenario = 'WORLD_HUMAN_STAND_IMPATIENT',
distance = 2.5,
},
},
}
स्टैश सिस्टम और कस्टम कंटेनर
स्टैश स्थायी भंडारण कंटेनर हैं जिन्हें खिलाड़ी विशिष्ट स्थानों पर एक्सेस कर सकते हैं। ox_inventory व्यक्तिगत स्टैश का समर्थन करता है जो खिलाड़ी पहचानकर्ता से जुड़े होते हैं, साझा स्टैश जो किसी के द्वारा एक्सेस किए जा सकते हैं, और नौकरी-प्रतिबंधित स्टैश जैसे पुलिस सबूत कक्ष और अस्पताल भंडारण के लिए।
-- Server: Register a custom stash for a property
local function CreatePropertyStash(propertyId, owner)
local stashId = ('property_%s'):format(propertyId)
exports.ox_inventory:RegisterStash(
stashId,
('Property #%s Storage'):format(propertyId),
100, -- slots
200000, -- max weight
owner -- owner identifier (or false for shared)
)
return stashId
end
-- Client: Open a stash when interacting with a storage point
RegisterNetEvent('myresource:openPropertyStorage', function(propertyId)
local stashId = ('property_%s'):format(propertyId)
exports.ox_inventory:openInventory('stash', stashId)
end)
ox_inventory एकीकरण के लिए सर्वश्रेष्ठ प्रथाएँ
- हमेशा सर्वर-साइड सत्यापन करें। क्लाइंट-साइड इन्वेंटरी जांचों पर कभी भरोसा न करें। सर्वर एक्सपोर्ट्स जैसे
GetItemCountऔरRemoveItemसभी महत्वपूर्ण गेम लॉजिक के लिए। - मेटाडेटा का संयमित उपयोग करें। जबकि मेटाडेटा शक्तिशाली है, प्रत्येक आइटम पर अत्यधिक डेटा संग्रहीत करने से डेटाबेस का आकार और नेटवर्क ट्रैफ़िक बढ़ता है। केवल वही स्टोर करें जिसकी आपको वास्तव में आवश्यकता है।
- पूर्ण इन्वेंटरी को सहजता से संभालें। हमेशा की वापसी मान की जांच करें
AddItemऔर जब खिलाड़ी की इन्वेंटरी पूरी हो तो स्पष्ट प्रतिक्रिया प्रदान करें। - वास्तविकता के लिए आइटम डिग्रेड का उपयोग करें। degrade गुण प्राकृतिक आइटम सिंक बनाता है जो आपकी अर्थव्यवस्था को संतुलित रखता है। नाशवान वस्तुओं और उपकरणों के लिए उपयुक्त क्षय समय सेट करें।
- बिल्ट-इन क्राफ्टिंग सिस्टम का लाभ उठाएं। अपनी खुद की क्राफ्टिंग लॉजिक बनाने के बजाय, ox_inventory क्राफ्टिंग बेंच का उपयोग करें जो जांच, हटाना, और निर्माण स्वचालित रूप से संभालते हैं।
- आइटम छवियों को सुसंगत रखें। सभी आइटम छवियों को रखें
web/images/मेल खाते के साथ मेल खाते वाले फ़ाइल नामों के साथ। सबसे साफ दिखने के लिए 100x100 PNG फ़ाइलें पारदर्शी पृष्ठभूमि के साथ उपयोग करें।