# Configuration > Configuration reference for ML Clothing System Category: INVENTORY · Source: https://miciomods.it/docs/ml-inventory-configuration · Last updated: 2026-07-28 # Configuration ML Clothing has two config files, both left out of escrow so they can be edited: - `shared/config.lua` holds the clothing, bag, armor plate, wear, and anti-exploit settings. - `shared/invadmin_config.lua` holds the settings for the bundled inventory admin panel. Every value below is shown with its default and explained. ## General **shared/config.lua** ```lua Config.Debug = false -- Enable debug prints in console Config.Language = 'en' -- Language: 'en' | 'it' | 'de' | 'es' | 'fr' ``` - `Config.Debug`: when `true`, prints diagnostic lines through `DebugPrint`. Keep it `false` in production. - `Config.Language`: the active locale. Locale files present in the build are `en`, `it`, `de`, `es`, `fr`, and `pt-BR`. If the chosen language has no file, the resource falls back to English. ## Notifications Each entry toggles one player notification. Set to `false` to suppress that message. **shared/config.lua** ```lua Config.Notifications = { inventory_full_dropped = true, -- Notify when items are dropped because inventory is full not_enough_space = true, -- Notify when there's not enough space to equip inventory_full_add_failed = true, -- Notify when item couldn't be added to inventory outfit_updated = true, -- Notify when outfit is changed clothing_slot_occupied = true, -- Notify when trying to equip a slot that's already taken no_carrier_equipped = true, -- Notify when trying to insert a plate without a carrier carrier_full = true, -- Notify when plate carrier is full plate_inserted = true, -- Notify when an armor plate is inserted plate_swapped = true, -- Notify when a plate is swapped for a better one plate_not_better = true, -- Notify when the new plate isn't better than current bag_item_blocked = true, -- Notify when an item is blocked from entering the bag } ``` - `inventory_full_dropped`: item dropped on the ground because the inventory is full. - `not_enough_space`: not enough room to equip the item. - `inventory_full_add_failed`: item could not be added back to the inventory. - `outfit_updated`: outfit changed successfully. - `clothing_slot_occupied`: the target clothing slot is reserved or already taken. - `no_carrier_equipped`: a plate was used without a plate carrier equipped. - `carrier_full`: the plate carrier has no free plate slot. - `plate_inserted`: a plate was inserted. - `plate_swapped`: a plate was swapped for a stronger one. - `plate_not_better`: the inserted plate is weaker than what is already in the carrier. - `bag_item_blocked`: an item was blocked from entering a bag by the bag blacklist. ## Bag and bag effect **shared/config.lua** ```lua Config.BagEffect = true -- If true, equipped bags affect player movement speed based on weight Config.Bag = { DefaultWeight = 5000, -- Default bag carry capacity (grams) when no specific bag size matches DefaultCols = 3, -- Default bag inventory columns DefaultRows = 3, -- Default bag inventory rows SpeedTable = { { 0, 1.00 }, { 5, 0.97 }, { 10, 0.93 }, { 15, 0.88 }, { 18, 0.82 }, { 27, 0.75 }, { 36, 0.65 }, { 40, 0.55 }, }, } ``` - `Config.BagEffect`: when `true`, a worn bag slows the player based on the total weight it carries. - `Config.Bag.DefaultWeight`: bag capacity in grams used when the worn bag drawable has no entry in `Config.BagSizes`. - `Config.Bag.DefaultCols` / `DefaultRows`: default bag grid used with the default weight. - `Config.Bag.SpeedTable`: pairs of `{ weight_kg, speed_multiplier }`. The player speed multiplier is interpolated linearly from bag weight in kilograms. `0 kg` gives full speed (`1.00`); `40 kg` gives `0.55`. ## Bag sizes **shared/config.lua** ```lua Config.BagSizes = { female = { [111] = { weight = 10000, cols = 4, rows = 4 }, -- ... [125] = { weight = 15000, cols = 6, rows = 4 }, -- ... }, male = { [111] = { weight = 15000, cols = 6, rows = 4 }, -- ... }, } ``` - `Config.BagSizes`: maps the worn bag drawable index, per gender, to a stash size. Each entry sets `weight` (grams), `cols`, and `rows`. When a bag is equipped, the drawable index of the ped's bag component decides which entry applies. Drawables with no entry fall back to `Config.Bag.DefaultWeight` and the default grid. The file ships with a large default table for both `male` and `female`; edit, add, or remove indices to match your bag models. ## Progress **shared/config.lua** ```lua Config.Progress = { OpenDuration = 2500, -- Duration (ms) of the progress bar when opening a bag } ``` - `Config.Progress.OpenDuration`: length in milliseconds of the progress bar shown when a player opens a bag stash. ## Armor plates **shared/config.lua** ```lua Config.SyncPlatesEveryHit = true -- Sync plate health to database on every damage event Config.UseBrokenPlates = true -- If true, destroyed plates drop as broken plate items Config.BrokenPlateItem = 'brokenplate' -- Item name for broken/used armor plates Config.HeavyDrawables = { male = { 12, 13, 15, 18 }, -- Male drawable indices with heavy armor visuals female = { 22, 23, 25, 28 }, -- Female drawable indices with heavy armor visuals } Config.Plates = { ['heavyplate'] = 50, -- Heavy armor plate: 50% armor ['lightplate'] = 25, -- Light armor plate: 25% armor ['brokenplate'] = 0, -- Broken plate: no armor (can be repaired) } ``` - `Config.SyncPlatesEveryHit`: when `true`, plate health is written back to plate metadata on every damage event, so plate wear survives a disconnect at the cost of more frequent writes. - `Config.UseBrokenPlates`: when `true`, a plate that reaches zero health becomes the broken plate item. - `Config.BrokenPlateItem`: the item name used for a destroyed plate. Must be a registered item. - `Config.HeavyDrawables`: per-gender ped drawable indices that count as heavy armor visuals and affect movement. - `Config.Plates`: maps each plate item name to its armor value (0 to 100). `heavyplate` gives 50, `lightplate` gives 25, `brokenplate` gives 0. The armor value a carrier grants is the sum of its plate health, capped at 100. ## Clothing items **shared/config.lua** ```lua Config.ClothingItems = { hat = { slot = 11, type = 'prop', componentId = 0 }, undershirt = { slot = 12, type = 'component', componentId = 8 }, jacket = { slot = 13, type = 'component', componentId = 11 }, bodyarmor = { slot = 14, type = 'component', componentId = 9 }, gloves = { slot = 15, type = 'component', componentId = 3 }, pants = { slot = 16, type = 'component', componentId = 4 }, shoes = { slot = 17, type = 'component', componentId = 6 }, mask = { slot = 18, type = 'component', componentId = 1 }, glasses = { slot = 19, type = 'prop', componentId = 1 }, earrings = { slot = 20, type = 'prop', componentId = 2 }, chain = { slot = 21, type = 'component', componentId = 7 }, bracelet = { slot = 22, type = 'prop', componentId = 7 }, watch = { slot = 23, type = 'prop', componentId = 6 }, bag = { slot = 24, type = 'component', componentId = 5 }, decals = { slot = 25, type = 'component', componentId = 10 }, } ``` - `Config.ClothingItems`: the master map from item name to inventory slot and ped component. Each entry has: - `slot`: the inventory slot the item locks into. Must be unique per item. The values run 11 to 25. - `type`: `'component'` for a ped component or `'prop'` for a ped prop. - `componentId`: the GTA component or prop index the item drives. - From this table the resource builds `Config.ClothesSlotID` (the sorted list of reserved slots), `Config.ValidSlotsPerItem`, and `Config.ComponentMapping`. Those three are derived automatically; do not edit them by hand. > **WARNING:** Slot 14 is the plate carrier > > `bodyarmor` uses slot 14 and drives the plate carrier. Do not remap it or add the wear system to it. It has its own plate durability system. ## Default clothing **shared/config.lua** ```lua Config.DefaultClothing = { male = { mask = { draw = 0, text = 0 }, hat = { draw = -1, text = -1 }, -- ... pants = { draw = 21, text = 0 }, shoes = { draw = 34, text = 0 }, -- ... }, female = { -- ... pants = { draw = 15, text = 0 }, shoes = { draw = 35, text = 0 }, -- ... }, } ``` - `Config.DefaultClothing`: the drawable and texture applied to each clothing slot when an item is removed, per gender. A value of `-1` clears the component or prop (nothing worn). These are the fallback naked-state values so removing a jacket does not leave a gap. ## Anti-exploit **shared/config.lua** ```lua Config.AntiExploit = { PlateSwapCooldown = 2000, -- Cooldown (ms) between plate swap actions ValidatePlateHealth = true, -- Server validates plate health on every action MaxHeavyPlates = 2, -- Max heavy plates a player can carry MaxLightPlates = 1, -- Max light plates a player can carry PreventArmorDupe = true, -- Prevent armor duplication exploits } ``` - `PlateSwapCooldown`: minimum milliseconds between plate swap actions per player. - `ValidatePlateHealth`: when `true`, the server re-checks plate health on every plate action instead of trusting the client. - `MaxHeavyPlates`: maximum heavy plates a player may carry. - `MaxLightPlates`: maximum light plates a player may carry. - `PreventArmorDupe`: when `true`, blocks the known armor duplication paths. ## Stash prefixes **shared/config.lua** ```lua Config.Stash = { PlateCarrierPrefix = 'platecarrier_', -- Prefix for plate carrier stash IDs BagPrefix = 'playerbag_', -- Prefix for bag stash IDs } ``` - `Config.Stash.PlateCarrierPrefix`: internal ID prefix for plate carrier stashes. - `Config.Stash.BagPrefix`: internal ID prefix for bag stashes. These are used to build unique stash identifiers; leave them unless they collide with another resource. ## Bag blacklist **shared/config.lua** ```lua Config.BagBlacklist = { enabled = true, -- Master toggle (false = disables the whole filter) denyBagInsideBag = true, -- Prevents nesting bags inside other bags (recommended: true) items = { -- 'gold', -- 'weapon_rpg', }, prefixes = { 'blueprint_', -- 'ammo_', }, } ``` - `enabled`: master switch for the bag content filter. `false` disables the whole feature. - `denyBagInsideBag`: when `true`, blocks nesting a bag inside another bag. - `items`: exact item names blocked from entering a bag. - `prefixes`: any item whose name starts with one of these strings is blocked. The default ships with `blueprint_`. - The filter runs on the inventory swap hook: a matching incoming item has the swap refused. The player notice is toggled by `Config.Notifications.bag_item_blocked`. ## Wear and decay **shared/config.lua** ```lua Config.WearDecay = { Enabled = true, -- Master switch for the wear system Time = '60m', -- Default time a piece lasts while worn: '45s', '30m', '2h', '1d' (plain number = minutes) OnDepleted = 'break', -- at 0 durability: stays worn but broken (0 protection via ml_clothingBroken) Notify = true, -- notify the player when a piece breaks Repairable = false, -- no repair item: equip a fresh piece to restore protection RepairItem = 'repair_kit', RepairCount = 1, RepairAmount = 100, Items = { ['antirad_mask'] = { time = '30m', male = { { component = 1, drawable = 244, texture = 0 }, -- ... }, }, ['antirad_suit'] = { time = '60m', unisex = { { component = 11, drawable = 660, texture = 0 }, { component = 11, drawable = 731, texture = 0 }, }, }, }, } ``` - `Enabled`: master switch for the wear system. When on, configured drawables lose durability while worn. - `Time`: how long a piece lasts while worn before it breaks. Accepts a number with a unit suffix (`'45s'`, `'30m'`, `'2h'`, `'1d'`) or a plain number, read as minutes. Entries without their own `time` use this default. The tick rate and drain per tick are derived internally. - `OnDepleted`: behavior at zero durability. `'break'` keeps the piece worn but broken, giving no protection, and flags it in the `ml_clothingBroken` statebag. - `Notify`: notify the player when a piece breaks. - `Repairable`: when `false`, worn gear cannot be repaired with an item; the player equips a fresh piece to restore protection. - `RepairItem` / `RepairCount` / `RepairAmount`: the default repair item, quantity consumed, and durability restored, used by entries that do not set their own. - `Items`: the drawables managed by the wear system. An entry matches by drawable (component, drawable, texture) per gender (`male`, `female`, or `unisex`) or by item name, and may set its own `time`. Each entry may override the default repair with `repairItem`, `repairCount`, and `repairAmount`. Setting `repairItem = false` makes a piece non-repairable. The shipped entries target radiation gas masks and antirad suits. Do not add `bodyarmor` here; it has its own plate durability. See `_INSTALL/WEAR_DECAY.txt` for the full setup notes. Configs from older builds that still set `TickSeconds` and `drainPerTick` keep working; `time` wins when both are present. ## Admin panel The bundled inventory admin panel is configured in a separate file. **shared/invadmin_config.lua** ```lua Config.AdminAce = nil Config.Command = 'invadmin' Config.OpenKey = nil Config.DefaultTheme = 'default' Config.ClothingCatalogUrl = 'http://127.0.0.1:3960/api/catalog' ``` - `Config.AdminAce`: an ACE permission that grants admin access to the panel. When set, a player holding this ACE passes the admin check. When `nil`, access falls back to `Bridge.HasPermission`. - `Config.Command`: the chat command that opens the admin panel. Default `invadmin`. - `Config.OpenKey`: an optional key binding to open the panel. When set to a non-empty string, a keybind command is registered. When `nil`, no keybind is created and the panel opens by command only. - `Config.DefaultTheme`: the panel theme sent to the UI on open. Default `'default'`. - `Config.ClothingCatalogUrl`: the HTTP endpoint the clothing tab reads its drawable catalog from. The default points to a local service; a hosted catalog URL will be published and can be set here. The clothing tab also uses `ml_autocapture` (free resource) for item image capture; without it the capture button reports that the resource is not running. **shared/invadmin_config.lua** ```lua Config.RateLimit = { list = 500, get = 400, save = 1500, delete = 1500, upload = 1500, playerList = 500, playerGet = 400, playerGive = 800, playerRemove = 800, stashList = 500, stashGet = 400, stashSave = 1500, stashDelete = 1500, } ``` - `Config.RateLimit`: per-action cooldowns in milliseconds for the admin panel callbacks. Each key maps to one server action (item list, get, save, delete, image upload, player list and give/remove, stash list, get, save, delete). Raising a value throttles that action more; lowering it allows faster repeat use. **shared/invadmin_config.lua** ```lua Config.Editor = { DefaultGrid = { width = 1, height = 1 }, MaxGrid = 5, DefaultWeight = 0, DefaultStack = true, DefaultClose = true, NamePrefix = 'custom_', Rarities = { 'common', 'uncommon', 'rare', 'epic', 'legendary', }, ConsumableTypes = { 'food', 'drink', 'alcohol', 'medical', 'other', }, MaxImageBytes = 524288, } ``` - `DefaultGrid`: default item grid size for a new item created in the editor. - `MaxGrid`: maximum grid width or height allowed in the editor. - `DefaultWeight`: default weight for a new item. - `DefaultStack`: whether new items are stackable by default. - `DefaultClose`: whether new items close the inventory on use by default. - `NamePrefix`: prefix applied to item names created in the editor. Default `custom_`. - `Rarities`: the rarity options offered in the editor. - `ConsumableTypes`: the consumable type options offered in the editor. - `MaxImageBytes`: maximum size in bytes for an item image upload. Default `524288` (512 KB). ## Server ConVars These convars go in your `server.cfg` (or a separate `ox.cfg` you `exec` from it). They are read once at resource start, so any change requires a restart of the resource (or the server). A complete, commented file with every convar and its default ships at `setup/server.cfg.example`. > **WARNING:** set vs setr > > Use `setr` for any convar the interface reads, and `set` for server-only values (webhooks, loot tables, ACE-style checks). `setr` replicates the value to game clients; `set` keeps it on the server only. If a client-facing convar is set with plain `set`, the client never receives the value and silently falls back to its built-in default - the setting will appear to do nothing, with no error anywhere. Every convar below already shows the correct prefix: copy it exactly as written. **Framework and player** - `inventory:framework`: Overrides framework detection. Leave unset to let ml_bridge auto-detect it. Accepts `esx`, `qb`, `qbx`, `ox`, `nd`, `standalone`. Default: `'esx'`. - `inventory:weight`: Maximum weight a player can carry, in grams. Default: `30000`. - `inventory:slots`: Flat slot count, ignored if `inventory:gridrows` is greater than 0. Default: `50`. - `inventory:gridcols`: Columns of the player inventory grid. Default: `8`. (exclusive to this build) - `inventory:gridrows`: Rows of the player inventory grid. When greater than 0, the total slot count becomes (gridcols × gridrows + 15); the extra 15 slots are reserved for clothing. Default: `4`. (exclusive to this build) - `inventory:secondarygridcols`: Columns of the grid used by secondary inventories (trunk, stash, glovebox). Default: `6`. (exclusive to this build) - `inventory:police`: Jobs with police privileges (steal command, evidence locker, etc). JSON array of strings. Default: `'["police","sheriff"]'`. - `inventory:accounts`: Currency accounts used by the framework; the first entry is the primary account. JSON array of strings. Default: `'["money"]'`. ```cfg setr inventory:framework '' setr inventory:weight 30000 setr inventory:slots 50 setr inventory:gridcols 8 setr inventory:gridrows 4 setr inventory:secondarygridcols 6 setr inventory:police '["police","sheriff"]' set inventory:accounts '["money","black_money"]' ``` **Drop inventory** - `inventory:dropcols`: Columns of the drop grid (the "bag on the ground"). Default: `6`. (exclusive to this build) - `inventory:droprows`: Rows of the drop grid. When greater than 0, it overrides `inventory:dropslots` with (dropcols × droprows). Default: `4`. (exclusive to this build) - `inventory:dropslots`: Total drop slots, used only when `inventory:droprows` is 0. Default matches the player slot count. - `inventory:dropweight`: Maximum total weight of a drop, in grams. Default matches the player weight. - `inventory:dropmodel`: Prop model spawned as the bag on the ground. Default: `'prop_med_bag_01b'`. - `inventory:dropprops`: Spawns a visible prop for every drop. This has a server and client cost; leave at 0 unless the visual is needed. Default: `0`. ```cfg setr inventory:dropcols 6 setr inventory:droprows 4 setr inventory:dropslots 50 setr inventory:dropweight 30000 setr inventory:dropmodel 'prop_med_bag_01b' setr inventory:dropprops 0 ``` **Weapons** - `inventory:weaponanims`: Plays holster/unholster animations when equipping a weapon. Default: `1`. - `inventory:weaponnotify`: Shows an "Equipped X" notification when a weapon is drawn. Default: `1`. - `inventory:weaponmismatch`: Anti-cheat check: kicks the player if the client reports a weapon the server does not know about. Default: `1`. - `inventory:autoreload`: Reloads automatically when the magazine is empty. Default: `0`. - `inventory:aimedfiring`: Restricts firing to while aiming. Default: `0`. - `inventory:ignoreweapons`: Weapons excluded from the mismatch check, for weapons added by other resources. JSON array of weapon names or numeric hashes. Default: `'[]'`. - `inventory:suppresspickups`: Suppresses the native GTA world pickups (money and weapons spawned by the game). Default: `1`. - `inventory:disableweapons`: Disables weapons entirely, for melee-only servers. Default: `0`. ```cfg setr inventory:weaponanims 1 setr inventory:weaponnotify 1 setr inventory:weaponmismatch 1 setr inventory:autoreload 0 setr inventory:aimedfiring 0 setr inventory:ignoreweapons '[]' setr inventory:suppresspickups 1 setr inventory:disableweapons 0 ``` **Interface and keybinds** - `inventory:showStockBadge`: Shows a "STOCK" (stackable) or "UNIQUE" (non-stack) badge on the item tooltip, plus a compact ∞ chip in the bottom-right corner of the slot. Helps decide at a glance, while looting, whether to take the whole stack or a single item. Default: `0`. (exclusive to this build) - `inventory:slotrules_debug`: Debug logging for reserved slot rules (slot 1 = firearm, slot 2 = melee). Prints the reason for every rejection to the console. Leave at 0 in production. Default: `0`. (exclusive to this build) - `inventory:keys`: Default keybinds: [inventory, secondary inventory, hotbar wheel]. JSON array of 3 key names. Default: `'["F2","K","TAB"]'`. - `inventory:enablekeys`: Control IDs left active while the inventory is open (e.g. 249 = Y chat). JSON array of control IDs. Default: `'[249]'`. - `inventory:imagepath`: Base path used for item images. Override it to serve images from an external CDN. Default: `'nui://ox_inventory/web/images'`. - `inventory:validhosts`: External hosts authorized for item images loaded via URL. Any other domain is rejected. Server-side only. JSON object. Default: `'{"r2.fivemanage.com":true,"i.fmfile.com":true}'`. - `inventory:screenblur`: Blurs the world behind the UI while the inventory is open. Default: `1`. - `inventory:itemnotify`: Shows a "You picked up X" notification when an item is collected. Default: `1`. - `inventory:disablesetupnotification`: Hides the first-run inventory setup notification. Default: `0`. - `inventory:enablestealcommand`: Enables `/steal` for the police job, to take items from a cuffed player. Default: `1`. - `inventory:target`: Uses ox_target for stash/shop/crafting interactions instead of 3D markers. Default: `0`. - `inventory:giveplayerlist`: Shows a clickable player list for giving items instead of 3D targeting. Default: `0`. ```cfg setr inventory:showStockBadge 1 setr inventory:slotrules_debug 0 setr inventory:keys '["F2","K","TAB"]' setr inventory:enablekeys '[249]' setr inventory:imagepath 'nui://ox_inventory/web/images' set inventory:validhosts '{"r2.fivemanage.com":true,"i.fmfile.com":true}' setr inventory:screenblur 1 setr inventory:itemnotify 1 setr inventory:disablesetupnotification 0 setr inventory:enablestealcommand 1 setr inventory:target 0 setr inventory:giveplayerlist 0 ``` **Theme and customization** - `ox_inventory:defaultTheme`: Default primary accent color, hex. Players can override it from the UI. Default: `'#00d4aa'`. (exclusive to this build) - `ox_inventory:rarityStyle`: How rarity is displayed in the grid: `'fill-container'` (fills the slot) or `'border'`. Default: `'fill-container'`. (exclusive to this build) - `ox_inventory:buttonTheme`: Colors action buttons with the theme's primary color. Default: `'true'`. (exclusive to this build) - `ox_inventory:clothingPanelVisible`: Shows the clothing panel next to the main inventory. Default: `'true'`. (exclusive to this build) - `ox_inventory:virtualPed`: Shows the 3D ped preview next to the inventory. Default: `'true'`. (exclusive to this build) - `ox_inventory:enableThemePicker`: Shows the theme color picker inside the inventory. Disable it to force everyone onto `ox_inventory:defaultTheme`. Default: `'true'`. (exclusive to this build) - `inventory:customRarities`: Adds custom rarities on top of the 8 built-in ones (common, uncommon, rare, epic, legendary, special, illegal, police). Also add a `rarity_` key to `locales/*.json` for translation. JSON object: `{ "key": { r, g, b, alpha?, glowSize?, glowAlpha? } }`. (exclusive to this build) - `inventory:customCategories`: Adds custom categories on top of the 9 built-in ones (all, food, medical, weapons, materials, tools, currency, equipment, misc). Also add a `cat_` key to `locales/*.json`. JSON object: `{ "key": { "name": "...", "icon": "" } }`. (exclusive to this build) ```cfg setr ox_inventory:defaultTheme '#00d4aa' setr ox_inventory:rarityStyle 'fill-container' setr ox_inventory:buttonTheme 'true' setr ox_inventory:clothingPanelVisible 'true' setr ox_inventory:virtualPed 'true' setr ox_inventory:enableThemePicker 'true' setr inventory:customRarities '{}' setr inventory:customCategories '{}' ``` **Markers** - `inventory:shopmarker`: Marker used for shops. JSON object: `type` (integer), `colour` [r,g,b], `scale` [x,y,z]. - `inventory:evidencemarker`: Marker used for the police evidence locker. - `inventory:craftingmarker`: Marker used for crafting benches. - `inventory:dropmarker`: Marker used for ground drops. ```cfg setr inventory:shopmarker '{"type":29,"colour":[30,150,30],"scale":[0.5,0.5,0.5]}' setr inventory:evidencemarker '{"type":2,"colour":[30,30,150],"scale":[0.3,0.2,0.15]}' setr inventory:craftingmarker '{"type":2,"colour":[150,150,30],"scale":[0.3,0.2,0.15]}' setr inventory:dropmarker '{"type":2,"colour":[150,30,30],"scale":[0.3,0.2,0.15]}' ``` **Loot tables** - `inventory:randomloot`: Enables random loot generation in dumpsters and non-owned vehicles. Default: `1`. - `inventory:networkdumpsters`: Synchronizes dumpster contents across all players. Uses more bandwidth. Default: `0`. - `inventory:randomprices`: Randomizes shop prices on every restart. Default: `0`. - `inventory:vehicleloot`: Vehicle loot table. Array of `[itemName, min, max, chance?]`. - `inventory:dumpsterloot`: Dumpster loot table. ```cfg set inventory:randomloot 1 setr inventory:networkdumpsters 0 set inventory:randomprices 0 set inventory:vehicleloot '[["sprunk",1,1],["water",1,1],["garbage",1,2,50],["money",1,50],["money",200,400,5],["bandage",1,1]]' set inventory:dumpsterloot '[["mustard",1,1],["garbage",1,3],["money",1,10],["burger",1,1]]' ``` **Logging and security** - `inventory:loglevel`: Log level. 0 = off, 1 = purchases and transfers, 2 = every item movement. Default: `1`. - `inventory:loghookrejection`: Also logs actions rejected by hooks, useful for finding why a player cannot move an item. Server-side only. Default: `1`. - `inventory:webhook`: Discord webhook for general logs (transfers, shop purchases, etc). Default: `''`. - `inventory:evidencegrade`: Minimum job grade required to access the evidence locker. Default: `2`. - `inventory:trimplate`: Trims whitespace from vehicle plates before lookups. Default: `1`. ```cfg set inventory:loglevel 1 set inventory:loghookrejection 1 set inventory:webhook '' set inventory:evidencegrade 2 set inventory:trimplate 1 ``` **Stashes, database and misc** - `inventory:clearstashes`: Deletes stashes inactive for longer than N, expressed as a MySQL interval. Default: `'6 MONTH'`. - `inventory:bulkstashsave`: Saves stashes in bulk with a single query on restart, instead of one query per stash. Default: `1`. - `inventory:cleartime`: Time, in minutes, after which orphaned/invisible items are dropped. Default: `5`. - `inventory:versioncheck`: Checks the resource version on startup and warns if it is not an official release. Default: `'true'`. ```cfg set inventory:clearstashes '6 MONTH' set inventory:bulkstashsave 1 set inventory:cleartime 5 set inventory:versioncheck 'true' ```