How to Add Custom Food Items to FiveM (ox_inventory, QBCore & ESX)
Every restaurant on an RP server wants its own menu. Not “Sandwich” and “Water” — the Burger Shot Double, the café’s iced latte, the taco truck’s special. And players can tell the difference between an item that’s a name in a list and one they actually hold up and eat.
The trouble is that a food item that feels real is three separate things wired together, and each inventory wants them wired differently. Get one field wrong and you get the worst kind of bug: the item is used up, the animation plays, no food appears in the hand, and nothing is printed anywhere.
This guide walks through the whole thing for the three setups most servers run — ox_inventory (which also covers Qbox), QBCore’s qb-smallresources, and ESX’s esx_basicneeds — including the silent failures specific to each.
What a Custom Food Item Actually Is
Three pieces:
- A prop — the 3D model the player holds. Either one of GTA’s own, or a custom one you stream.
- An item definition — the name, label, weight and image, so it can exist in an inventory.
- A use behaviour — the animation, the prop attached to a hand at the right position, how long it takes, and what it restores.
Pieces 2 and 3 are just config. Piece 1 is where custom menus get hard, because GTA’s own food props run out fast.
Step 1: Get the Prop
For generic items, the base game has you covered — prop_cs_burger_01, prop_ld_flow_bottle and prop_ecola_can are the classics, and they need no streaming at all.
For anything branded or unique, you need a custom prop, and it has to be registered — streaming the model isn’t enough. If the prop isn’t spawnable by name, no inventory in this guide can attach it. The three ways to get one are in how to make custom props in FiveM, and if you’ve installed a prop that won’t spawn, FiveM prop files explained has the checklist.
Before going further, check the prop spawns. Every step below assumes it does, and a missing prop looks identical to a wrongly configured item.
Step 2: Pick Your Names
You’ll juggle three names, so decide them up front:
- The item name — what the inventory calls it, e.g.
bs_double. Lowercase, no spaces. - The model name — the prop, e.g.
bs_double_burger. It can differ from the item name, but making them the same saves confusion later. - The label — what players see, e.g.
Burger Shot Double.
Prefix your names with something unique to your server or business. burger is almost certainly already taken by something.
Step 3: The Item Image
Every inventory shows an icon. Make a square PNG with a transparent background, named after the item:
- ox_inventory:
ox_inventory/web/images/bs_double.png - qb-inventory:
qb-inventory/html/images/bs_double.png
If you use a different inventory, it’ll have its own images folder — check its docs. A missing image doesn’t break the item, it just shows a blank square.
ox_inventory (and Qbox)
Qbox uses ox_inventory, so this section covers Qbox servers and any ESX or QBCore server that’s switched to ox. If you haven’t set ox up yet, start with our ox_inventory setup guide.
Items live in ox_inventory/data/items.lua. A custom food item with a custom prop in hand looks like this:
['bs_double'] = {
label = 'Burger Shot Double',
weight = 250,
client = {
anim = { dict = 'mp_player_inteat@burger', clip = 'mp_player_int_eat_burger', flag = 49 },
prop = {
model = 'bs_double_burger',
bone = 60309,
pos = vec3(0.02, 0.02, -0.02),
rot = vec3(0.0, 0.0, 0.0),
},
usetime = 2500,
cancel = true,
status = { hunger = 200000 },
notification = 'That hit the spot',
}
},
What the fields do:
anim— the animation dictionary and clip. Flag49plays it on the upper body, looped, while the player can still walk.prop.bone— which bone it attaches to.60309is the left palm, and it’s what ox uses if you leaveboneout.prop.posandprop.rot— the six numbers that put the burger in the hand rather than floating near it. The values above are placeholders; you’ll tune them (see below).usetime— milliseconds.2500is what ox uses for its own stock items.status—hunger = 200000is the same value ox’s stock burger uses, about a fifth of a bar. Usethirstfor drinks.
ox_inventory’s silent failures:
- Don’t add
client.exportorclient.eventto an item that also has this block. Either one makes ox hand the item off and skip its own handling — no progress bar, no animation, no prop, and nothing printed. - Anything with a
usetimegets consumed. For a reusable item — a tool, a lighter, a clipboard — addconsume = 0to the item so it survives being used. - Recent ox_lib versions refuse props larger than 2.5 m in any dimension. You get
model is too largein the console once, then the item is used with no prop at all — which looks exactly like your offsets being wrong. Scale the prop down. - Two props (a plate and a fork) go in as a list —
prop = { { ... }, { ... } }— not as twopropkeys.
QBCore (qb-smallresources)
On stock QBCore, a food item is two halves in two files, and neither does anything without the other.
Part 1 — the item, in qb-core/shared/items.lua:
bs_double = { name = 'bs_double', label = 'Burger Shot Double', weight = 250, type = 'item', image = 'bs_double.png', unique = false, useable = true, shouldClose = true, description = 'A Burger Shot Double' },
useable = true is required, or using it does nothing.
Part 2 — the behaviour, in qb-smallresources/config.lua, inside Config.Consumables.custom:
['bs_double'] = {
progress = { label = 'Eating Burger Shot Double...', time = 5000 },
animation = { animDict = 'mp_player_inteat@burger', anim = 'mp_player_int_eat_burger', flags = 49 },
prop = {
model = 'bs_double_burger',
bone = 60309,
coords = vector3(0.02, 0.02, -0.02),
rotation = vector3(0.0, 0.0, 0.0),
},
replenish = { type = 'Hunger', replenish = math.random(20, 40), isAlcohol = false, event = false, server = false },
},
Notice that the same six numbers are now called coords and rotation, the animation fields are animDict, anim and flags, and the time is under progress. Same idea, different dialect.
qb-smallresources’ silent failures:
- Put it in
Config.Consumables.custom, never in.eator.drink. Those tables hold plain numbers. A table dropped in there is read as a number and silently does nothing. - No
customtable in your config? Your qb-smallresources is too old to support per-item props. Update it first. - The prop and animation work, but the item is never used up? Stock qb-smallresources removes items through qb-inventory directly. If you run ps-, lj- or codem-inventory, that remove call is the line to check.
ESX (esx_basicneeds)
On ESX with ox_inventory, use the ox_inventory section above — it’s the better option. On ESX with the default inventory, food lives in esx_basicneeds/config.lua. Add to the Config.Items table after it’s defined:
Config.Items["bs_double"] = {
type = "food",
prop = "bs_double_burger",
status = 200000,
remove = true,
anim = { dict = 'mp_player_inteat@burger', name = 'mp_player_int_eat_burger', settings = {8.0, -8, -1, 49, 0, 0, 0, 0} },
pos = vector3(0.02, 0.02, -0.02),
rot = vector3(0.0, 0.0, 0.0),
}
esx_basicneeds registers every key of Config.Items as a usable item when it starts, so there’s no RegisterUsableItem to write. The item itself still has to exist in your database’s items table:
INSERT INTO items (name, label, weight, rare, can_remove) VALUES ('bs_double', 'Burger Shot Double', 1, 0, 1);
esx_basicneeds’ silent failures:
settingsis a raw, positional list, and the flag is the fourth number. Put it anywhere else and the clip plays with the wrong flag.typeonly knows"food"and"drink".- Don’t also write your own
ESX.RegisterUsableItemfor the same item. The second registration replaces the first, and yours won’t play the prop. - The bone is fixed. esx_basicneeds always attaches to the left hand (bone
18905) with a fixed duration, whatever you’d prefer. - Older forks ignore
posandrotand hard-code their own. If your numbers change nothing, check which esx_basicneeds you actually have.
Getting the Prop Into the Hand
This is the part nobody warns you about. The config is ten minutes. Getting a burger to sit in a hand instead of floating beside the wrist, clipping through the fingers or pointing at the sky can take an hour per item.
The six numbers are an offset and a rotation from the bone. The loop goes: change a number, restart the resource (on a dev server — never restart your inventory on live), use the item, look, repeat. A few things make it less painful:
- Start from something similar. Copy the numbers from a stock item with a similarly shaped prop, then nudge.
- Change one number at a time. Position first, rotation second.
- Check it from someone else’s view. The animation is played in third person, and first person can hide a lot.
And one trap that can waste a whole evening: rotation order. When a prop is attached, the three rotation values are applied in a particular order, and different scripts use different orders. ox_lib and qb-smallresources use one; esx_basicneeds uses another. The same six numbers come out rotated differently in each. If you copied perfect numbers from an ox server to an ESX one and the burger is now sideways, your numbers are fine — the rotation order changed.
If you write your own attach code instead of using an inventory’s, create the prop as a networked object. Non-networked props look perfect to the player testing them and are invisible to everyone standing next to them.
Troubleshooting
| What you see | What’s usually wrong |
|---|---|
| Item used up, animation plays, no prop | The prop isn’t registered, wrong field names for your inventory, or a client.export/client.event on an ox item |
model is too large in console | ox_lib’s 2.5 m prop limit — scale the prop down |
| Using the item does nothing at all | QBCore: missing useable = true, or the entry is in .eat/.drink instead of .custom |
| Prop floats beside the hand | Offsets need tuning |
| Prop is sideways after moving servers | Rotation order differs between inventories |
| Prop and animation fine, item never removed | qb-smallresources’ remove call doesn’t match your inventory |
| Other players can’t see the prop | Custom attach code created a non-networked object |
| Blank square instead of an icon | Image missing or misnamed in the images folder |
The Faster Way
Full disclosure: this is our script. Everything above is exactly the work the LMX Prop Creator was built to take off your hands.
You drop in a photo of the menu item and it builds the prop in-game. Then, in the In the hand panel, you choose your inventory first, and the preview holds the real model on your character using that inventory’s bone and rotation order — so the numbers you drag are the numbers that inventory will apply. There’s an eating pose, a drinking pose, holding poses for bowls and trays, and support for animation packs on your server, including their companion props like a fork.
When you build the pack, it writes the config for you, in the right dialect: ox_inventory (which also covers Qbox, qs-inventory and tgiann-inventory), qb-smallresources (both files), esx_basicneeds, ak47_inventory, jim-consumables and boii-consumables, with your model names, bone, pose, use time and hunger or thirst already filled in, and the silent-failure warnings from this guide written at the top of each file. It also ships a /hold runtime so a prop can be held with no inventory at all.
It won’t pick your label, weight or price, and installing the finished pack needs a full server restart like any prop resource. If you’d rather compare it against other tools first, our prop creator comparison covers them honestly.
FAQ
Can I use GTA’s built-in food props? Yes. Base-game props need no streaming — just use their model names.
Does the item name have to match the prop’s model name? Not in the configs above; the prop is named separately. Keeping them the same just makes everything easier to follow.
How do I make a drink instead of food?
Use a drinking animation such as mp_player_intdrink / loop_bottle, and restore thirst instead of hunger — thirst in ox, type = 'Thirst' in qb-smallresources, type = "drink" in esx_basicneeds.
Will this work on Qbox? Qbox uses ox_inventory, so follow the ox_inventory section.
Can I make an item that isn’t consumed, like a tool?
In ox_inventory, add consume = 0. Most food systems assume the item is used up, so a reusable item is often better handled by its own script.
Where do I find animations? Community emote menus like rpemotes and dpemotes list hundreds of animation dictionaries and clips, and there are paid animation packs with dedicated eating and drinking animations.
Custom menus are one of the cheapest ways to make a business on your server feel owned by the people running it. Get the prop spawning, write the item in your inventory’s dialect, and take the time to get it in the hand properly — that last part is what players notice.