{"id":193237,"date":"2025-08-18T16:30:52","date_gmt":"2025-08-18T14:30:52","guid":{"rendered":"https:\/\/fivemx.com\/?p=193237"},"modified":"2026-07-03T04:10:26","modified_gmt":"2026-07-03T02:10:26","slug":"ajuste-del-peso-del-inventario","status":"publish","type":"post","link":"https:\/\/fivemx.com\/es\/ajuste-del-peso-del-inventario\/","title":{"rendered":"Ajuste de inventario y peso: de items.lua a metadatos"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>TL;DR<\/strong>: This guide gives you production\u2011ready weight\/slot presets, item budget tables, copy\u2011pasteable <code data-no-translation=\"\">items.lua<\/code> definitions (ESX\/QBCore\/ox_inventory), and safe migration playbooks between popular inventories. Use it to eliminate over\u2011encumbrance drama, stop item bloat, and keep your economy coherent.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Why inventory tuning matters<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A stable RP economy depends on scarcity, friction, and meaningful choices. Inventory rules (slots, weight, stack limits, metadata like durability\/serials) are the levers that make those choices real. If everyone can carry everything, prices collapse and loops break. Tune inventory first, then iterate your prices, payouts, and sinks. For broader economics, see our pillar: <strong><a href=\"https:\/\/fivemx.com\/balanced-gta-rp-economy\/\">Designing a Balanced GTA RP Economy: Prices, Sinks, Progression<\/a><\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Models: Slots vs. Weight vs. Hybrid<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Slots-only<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simple cognitive model; each item = 1 slot or defined by size classes.<\/li>\n\n\n\n<li>Weak at differentiating heavy vs. light stacks; exploits via many tiny high-value items.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Weight-only<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Each item has a weight (usually grams). Players have <code data-no-translation=\"\">maxWeight<\/code> per container. Strong realism; needs thoughtful defaults.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Hybrid<\/strong> (recommended)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Global weight cap <strong>and<\/strong> slot cap. Prevents both micro\u2011item and mega\u2011item exploits. Works best for RP.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Tip<\/strong>: Keep numbers human\u2011readable. If you model in grams, use whole numbers (e.g., <code data-no-translation=\"\">water = 500g<\/code>) and round player caps (e.g., <code data-no-translation=\"\">maxWeight = 120,000<\/code>).<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Default Presets (copy &amp; adapt)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Below are <strong>battle\u2011tested starting points<\/strong>. Adjust \u00b110\u201320% after a week of in\u2011city telemetry.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Player Inventory (on\u2011person)<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Server Scale<\/th><th>Model<\/th><th>Max Weight (g)<\/th><th>Slots<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>New\/Small (\u226440 pop)<\/td><td>Hybrid<\/td><td>80,000<\/td><td>30<\/td><td>Faster onboarding; fewer early pain points.<\/td><\/tr><tr><td>Mid (40\u2013150)<\/td><td>Hybrid<\/td><td>120,000<\/td><td>35<\/td><td>Balanced for general RP; good for diverse jobs.<\/td><\/tr><tr><td>High\u2011Pop (150+)<\/td><td>Hybrid<\/td><td>150,000<\/td><td>32<\/td><td>Tighten slots to curb hoarding; keep weight fair.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Vehicles (common defaults)<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Container<\/th><th>Max Weight (g)<\/th><th>Slots<\/th><th>Rationale<\/th><\/tr><\/thead><tbody><tr><td>Glovebox<\/td><td>10,000<\/td><td>5<\/td><td>Small stash, encourages planning.<\/td><\/tr><tr><td>Sedans Trunk<\/td><td>80,000<\/td><td>20<\/td><td>Baseline.<\/td><\/tr><tr><td>SUV\/Van Trunk<\/td><td>120,000<\/td><td>25<\/td><td>Utility vehicles become meaningful.<\/td><\/tr><tr><td>Truck (utility)<\/td><td>180,000<\/td><td>28<\/td><td>Logistics gameplay.<\/td><\/tr><tr><td>Motorcycle Storage<\/td><td>8,000<\/td><td>3<\/td><td>Minimal pocketing.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Stashes &amp; Special Containers<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Type<\/th><th>Max Weight (g)<\/th><th>Slots<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td>House Stash (Tier 1\/2\/3)<\/td><td>120k \/ 180k \/ 240k<\/td><td>40 \/ 60 \/ 80<\/td><td>Incentivizes housing upgrades.<\/td><\/tr><tr><td>Job Locker<\/td><td>80,000<\/td><td>20<\/td><td>Prevent carryover exploits.<\/td><\/tr><tr><td>Evidence Locker<\/td><td>240,000<\/td><td>120<\/td><td>Admin\/LEO convenience; audit logging required.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Item Weight Budgets (by class)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use this to assign consistent weights. Think <strong>relative friction<\/strong> not realism.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Class<\/th><th>Examples<\/th><th>Suggested Weight (g)<\/th><\/tr><\/thead><tbody><tr><td>Very Light<\/td><td>Lockpick blade, USB, SIM<\/td><td>5\u201350<\/td><\/tr><tr><td>Light<\/td><td>Pistol ammo (10), bandage, snack<\/td><td>100\u2013250<\/td><\/tr><tr><td>Medium<\/td><td>Water bottle, burger, repair kit<\/td><td>400\u2013800<\/td><\/tr><tr><td>Heavy<\/td><td>Rifle ammo box (30), oxy tank, material crate<\/td><td>1,500\u20134,000<\/td><\/tr><tr><td>Very Heavy<\/td><td>Weapon crate, money bag (marked)<\/td><td>6,000\u201312,000<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Ammo<\/strong>: Budget <strong>per unit<\/strong> for pooled stacks (e.g., <code data-no-translation=\"\">9mm = 15g<\/code> each \u2192 30 rounds \u2248 450g) or represent as boxes (e.g., <code data-no-translation=\"\">9mm box (30) = 500g<\/code>).<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Stack Sizes &amp; Slot Strategy<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Commodities<\/strong> (food, meds): stack 5\u201320 to reduce tedium.<\/li>\n\n\n\n<li><strong>Ammo<\/strong>: stack 30\u201360 for pistols; 60\u2013120 for rifles when boxed.<\/li>\n\n\n\n<li><strong>Crafting Mats<\/strong>: stack 100\u2013250; keep weight meaningful.<\/li>\n\n\n\n<li><strong>Weapons<\/strong>: <code data-no-translation=\"\">stack = 1<\/code>, unique metadata (serial, durability).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Metadata Patterns (durability, serials, attachments, quality)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Design metadata like a small schema. Keep fields minimal, typed, and validated.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Canonical Metadata Schema (recommendation)<\/h3>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n \"serial\": \"string\", \/\/ weapon unique id\n \"owner\": \"citizenid|identifier\",\n \"durability\": 0.0, \/\/ 0.0\u20131.0; decay per use\/time\n \"quality\": 100, \/\/ 0\u2013100; repairable threshold 25\n \"ammo\": 0, \/\/ integer; weapon mags\n \"tint\": 0, \/\/ integer (game tint index)\n \"attachments\": [\"flashlight\", \"scope\"],\n \"expiry\": 0, \/\/ unix timestamp; perishable items\n \"notes\": \"\" \/\/ small text; avoid bloat\n}\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Durability &amp; Decay<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Weapons<\/strong>: decay 0.5\u20131.5% per magazine; jam chance &lt;5% below 20% quality.<\/li>\n\n\n\n<li><strong>Tools<\/strong> (lockpicks, drill): consume % on use; break at 0.<\/li>\n\n\n\n<li><strong>Perishables<\/strong>: <code data-no-translation=\"\">expiry<\/code> check at use; stale penalty or block.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Security &amp; Performance<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Validate metadata server\u2011side; never trust client writes.<\/li>\n\n\n\n<li>Cap metadata size (e.g., &lt;512 bytes). Large blobs hurt save\/load and network payloads.<\/li>\n\n\n\n<li>Use enumerations for attachments and tints.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Code: <code data-no-translation=\"\">items.lua<\/code> \/ item definitions by framework<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">ESX (es_extended) example<\/h3>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- esx items.lua (example) \u2014 weight in grams; negative weight means not counted in legacy modes\n['water'] = { label = 'Water Bottle', weight = 500, stack = true, close = true, description = 'Stay hydrated.' },\n['bandage'] = { label = 'Bandage', weight = 150, stack = true, close = true },\n['lockpick'] = { label = 'Lockpick', weight = 50, stack = true, close = true },\n['pistol_ammo'] = { label = 'Pistol Ammo (30)', weight = 450, stack = true, close = true, description = '9mm, box of 30.' },\n['weapon_pistol'] = { label = 'Pistol', weight = 1500, stack = false, close = true, degrade = 0.01, unique = true },\n<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">For ESX variants that still use <strong>limit<\/strong> instead of <strong>weight<\/strong>, set <code data-no-translation=\"\">limit = -1<\/code> (unlimited) and switch economy balance via weight globally.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">QBCore (<code data-no-translation=\"\">shared\/items.lua<\/code>) example<\/h3>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- qb-core shared\/items.lua\n['water'] = { name = 'water', label = 'Water Bottle', weight = 500, type = 'item', image = 'water.png', unique = false, useable = true, shouldClose = true, description = 'Stay hydrated.',\n combinable = nil },\n['bandage'] = { name = 'bandage', label = 'Bandage', weight = 150, type = 'item', image = 'bandage.png', unique = false, useable = true, shouldClose = true },\n['lockpick'] = { name = 'lockpick', label = 'Lockpick', weight = 50, type = 'item', image = 'lockpick.png', unique = false, useable = true, shouldClose = true },\n['pistol_ammo'] = { name = 'pistol_ammo', label = 'Pistol Ammo (30)', weight = 450, type = 'item', image = 'pistol_ammo.png', unique = false, useable = true, shouldClose = true },\n['weapon_pistol'] = { name = 'weapon_pistol', label = 'Pistol', weight = 1500, type = 'weapon', image = 'weapon_pistol.png', unique = true, useable = false, shouldClose = true,\n info = { serial = '', durability = 1.0, ammo = 12, attachments = {} } },\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ox_inventory (<code data-no-translation=\"\">data\/items.lua<\/code>) example<\/h3>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">return {\n water = {\n label = 'Water Bottle',\n weight = 500,\n stack = true,\n client = { status = { thirst = 25000 }, anim = { dict = 'mp_player_intdrink', clip = 'loop_bottle' } },\n },\n bandage = { label = 'Bandage', weight = 150, stack = true },\n lockpick = { label = 'Lockpick', weight = 50, stack = true },\n pistol_ammo = { label = 'Pistol Ammo (30)', weight = 450, stack = true },\n weapon_pistol = {\n label = 'Pistol', weight = 1500, stack = false, allowArmed = true,\n consume = 0, -- handled by durability system\n ammo = { type = 'AMMO_PISTOL', count = 12 },\n metadata = { serial = true, durability = true, attachments = true },\n },\n}\n<\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>ox_inventory<\/strong> supports rich <code data-no-translation=\"\">client\/server<\/code> behaviors in item definitions\u2014prefer built\u2011ins over ad\u2011hoc scripts to standardize behavior.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Hybrid Enforcement Examples<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">QBCore container config (example)<\/h3>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- qb-inventory\/server\/config.lua (illustrative)\nConfig.PlayerMaxWeight = 120000\nConfig.PlayerMaxSlots = 35\nConfig.Vehicle = {\n glovebox = { weight = 10000, slots = 5 },\n trunk = function(class)\n if class == 'sedan' then return 80000, 20 end\n if class == 'suv' or class == 'van' then return 120000, 25 end\n if class == 'truck' then return 180000, 28 end\n return 60000, 18\n end\n}\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ox_inventory stash setup (example)<\/h3>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- ox_inventory\/server\/custom\/stashes.lua\nlib.addstash('house_tier1', 40, 120000)\nlib.addstash('house_tier2', 60, 180000)\nlib.addstash('house_tier3', 80, 240000)\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Migration Playbooks (safe &amp; reversible)<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Principles<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Snapshot DB first. 2) Migrate items\/metadata with idempotent scripts. 3) Run side\u2011by\u2011side in a staging server. 4) Provide rollback SQL.<\/li>\n<\/ol>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">A) <code data-no-translation=\"\">qb-inventory<\/code> \u2192 <code data-no-translation=\"\">ox_inventory<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Map fields<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code data-no-translation=\"\">QB items.lua<\/code> \u2192 <code data-no-translation=\"\">ox data\/items.lua<\/code> (<code data-no-translation=\"\">name<\/code>, <code data-no-translation=\"\">label<\/code>, <code data-no-translation=\"\">weight<\/code>, <code data-no-translation=\"\">stack\/unique<\/code>, <code data-no-translation=\"\">client\/server behaviors<\/code>).<\/li>\n\n\n\n<li><code data-no-translation=\"\">player inventory<\/code> table: convert <code data-no-translation=\"\">info<\/code> JSON \u2192 <code data-no-translation=\"\">metadata<\/code> (serial, durability, ammo).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Pseudocode (Lua\/SQL mix)<\/strong><\/p>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- 1) Export QB items to a Lua table\/JSON\n-- 2) Generate ox items.lua entries\n-- 3) Transform inventories\nfor item in qb_inventory_rows do\n local meta = json.decode(item.info or '{}')\n local metadata = {\n serial = meta.serial,\n durability = meta.durability or 1.0,\n ammo = meta.ammo or 0,\n attachments = meta.attachments or {},\n }\n insert_into_ox_inventory(item.name, item.amount, metadata)\nend\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>SQL example (PostgreSQL\/MySQL style)<\/strong><\/p>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">-- Backup\nCREATE TABLE backup_playeritems AS SELECT * FROM playeritems;\n\n-- Transform example for a single item family\nUPDATE playeritems\nSET metadata = JSON_OBJECT(\n 'serial', JSON_EXTRACT(info, '$.serial'),\n 'durability', COALESCE(JSON_EXTRACT(info, '$.durability'), 1.0),\n 'ammo', COALESCE(JSON_EXTRACT(info, '$.ammo'), 0),\n 'attachments', COALESCE(JSON_EXTRACT(info, '$.attachments'), JSON_ARRAY())\n)\nWHERE name IN ('weapon_pistol','weapon_pistol_mk2');\n<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Gotchas<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Unique items<\/strong>: enforce <code data-no-translation=\"\">stack = false<\/code>; ensure duplicates don\u2019t merge.<\/li>\n\n\n\n<li><strong>Ammo systems<\/strong>: reconcile boxed vs. loose ammo conventions.<\/li>\n\n\n\n<li><strong>Images\/icons<\/strong>: re\u2011path item images to match ox\u2019s naming.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">B) ESX (limit\u2011based) \u2192 weight model<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Set global <code data-no-translation=\"\">useWeight = true<\/code> in config (varies by fork).<\/li>\n\n\n\n<li>Replace per\u2011item <code data-no-translation=\"\">limit<\/code> with <code data-no-translation=\"\">weight<\/code> (g). For items formerly <code data-no-translation=\"\">limit = -1<\/code>, assign realistic weights.<\/li>\n\n\n\n<li>Migrate stash\/vehicle caps accordingly.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Scripted pass<\/strong><\/p>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">for name, item in pairs(Items) do\n if item.limit and not item.weight then\n item.weight = estimateWeightFromClass(name)\n item.limit = nil\n end\nend\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">C) <code data-no-translation=\"\">qs-inventory<\/code> \/ <code data-no-translation=\"\">lj-inventory<\/code> \u2192 QBCore\/ox<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Field mapping is similar to QB: <code data-no-translation=\"\">info<\/code> \u2192 <code data-no-translation=\"\">metadata<\/code>.<\/li>\n\n\n\n<li>Watch for custom keys (<code data-no-translation=\"\">quality<\/code>, <code data-no-translation=\"\">image<\/code>, <code data-no-translation=\"\">createdAt<\/code>). Normalize to the canonical schema.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Balancing Workflow (1\u2011week sprint)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Day 0<\/strong>: Implement presets; migrate items to budget table.<\/li>\n\n\n\n<li><strong>Day 1\u20132<\/strong>: Capture telemetry: average carry weight, slots used, item distribution by job.<\/li>\n\n\n\n<li><strong>Day 3<\/strong>: Tighten outliers (+5\u201310% weight on top 5 hoarded items).<\/li>\n\n\n\n<li><strong>Day 4\u20135<\/strong>: Vehicle roles: buff utility trunks; nerf glovebox abuse.<\/li>\n\n\n\n<li><strong>Day 6<\/strong>: Perishables: add <code data-no-translation=\"\">expiry<\/code> for high\u2011margin consumables.<\/li>\n\n\n\n<li><strong>Day 7<\/strong>: Publish patch notes; set a two\u2011week review.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Minimum Telemetry<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code data-no-translation=\"\">% time encumbered<\/code>, <code data-no-translation=\"\">avg slots used<\/code>, top 20 items by count and by total weight, stash utilization percentiles.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">QA Checklist (ship\u2011ready)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>All items have <code data-no-translation=\"\">weight<\/code>, <code data-no-translation=\"\">stack<\/code>, and clear labels.<\/li>\n\n\n\n<li>Weapons are <code data-no-translation=\"\">unique<\/code>\/non\u2011stack and include <code data-no-translation=\"\">serial<\/code>, <code data-no-translation=\"\">durability<\/code>.<\/li>\n\n\n\n<li>Containers enforce <strong>both<\/strong> weight and slots (where supported).<\/li>\n\n\n\n<li>Vehicle classes map to sensible capacities.<\/li>\n\n\n\n<li>Stashes tiered with progression.<\/li>\n\n\n\n<li>Migrations backed up; rollback tested.<\/li>\n\n\n\n<li>Metadata size bounded; validated server\u2011side.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Downloadable Templates (inline)<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Weight Budget CSV (copy to Google Sheets)<\/h3>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">name,label,class,weight_g,stack,stack_size\nwater,Water Bottle,consumable,500,true,10\nbandage,Bandage,medical,150,true,5\nlockpick,Lockpick,tool,50,true,10\npistol_ammo,Pistol Ammo (30),ammo,450,true,5\nweapon_pistol,Pistol,weapon,1500,false,1\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Vehicle Capacity Table (CSV)<\/h3>\n\n\n\n<pre data-no-translation=\"\" class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">container,weight_g,slots\nGlovebox,10000,5\nSedan Trunk,80000,20\nSUV\/Van Trunk,120000,25\nTruck Trunk,180000,28\nMotorcycle,8000,3\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Common Pitfalls &amp; Fixes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Players always encumbered<\/strong> \u2192 Reduce top\u20113 ubiquitous item weights by 15%; increase player cap by 10%.<\/li>\n\n\n\n<li><strong>Endless hoarding of micro\u2011items<\/strong> \u2192 Introduce slot cap; set minimum item weight (e.g., 25g).<\/li>\n\n\n\n<li><strong>Economy inflation via stockpiling<\/strong> \u2192 Add perishables <code data-no-translation=\"\">expiry<\/code>, crafting input weight friction, or stash fees.<\/li>\n\n\n\n<li><strong>DB bloat<\/strong> \u2192 Prune metadata keys; avoid large <code data-no-translation=\"\">notes<\/code> fields.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">Next steps<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Roll out the hybrid presets above, then iterate with telemetry.<\/li>\n\n\n\n<li>Align inventory friction with payouts and prices\u2014see <strong><a href=\"https:\/\/fivemx.com\/balanced-gta-rp-economy\/\">our economy post<\/a><\/strong> for sinks and progression models that pair well with these settings.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Have questions about a specific framework fork or a custom inventory? Drop the details and I\u2019ll tailor the exact configs.<\/em><\/p>\n\n\n<!-- fivemx-seo-funnel:start -->\n<div class=\"fivemx-content-links\">\n<h2>Related FiveMX resources<\/h2>\n<p>Use these FiveMX sections to compare related products, categories, and setup guidance before choosing a resource.<\/p>\n<ul>\n<li><a href=\"https:\/\/fivemx.com\/fivem-inventory-scripts\/\">FiveM Inventory Scripts<\/a><\/li>\n<li><a href=\"https:\/\/fivemx.com\/qbcore-scripts\/\">QBCore Scripts<\/a><\/li>\n<li><a href=\"https:\/\/fivemx.com\/esx-scripts\/\">ESX Scripts<\/a><\/li>\n<li><a href=\"https:\/\/fivemx.com\/qbox-scripts\/\">QBOX Scripts<\/a><\/li>\n<\/ul>\n<\/div>\n<!-- fivemx-seo-funnel:end -->","protected":false},"excerpt":{"rendered":"<p>TL;DR: This guide gives you production\u2011ready weight\/slot presets, item budget tables, copy\u2011pasteable items.lua definitions (ESX\/QBCore\/ox_inventory), and safe migration playbooks between popular inventories. Use it to eliminate over\u2011encumbrance drama, stop item bloat, and keep your economy coherent. Why inventory tuning matters A stable RP economy depends on scarcity, friction, and meaningful choices. Inventory rules (slots, weight, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":193238,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2887],"tags":[3001],"class_list":["post-193237","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gta-rp-city-operations-economy","tag-fivem-script"],"_links":{"self":[{"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/posts\/193237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/comments?post=193237"}],"version-history":[{"count":1,"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/posts\/193237\/revisions"}],"predecessor-version":[{"id":208020,"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/posts\/193237\/revisions\/208020"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/media\/193238"}],"wp:attachment":[{"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/media?parent=193237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/categories?post=193237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fivemx.com\/es\/wp-json\/wp\/v2\/tags?post=193237"}],"curies":[{"name":"gracias","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}