How Integrations Work#
Restaurant Creator does not hard-code your framework, inventory or target. Each one is detected at start-up by looking for a started resource, and everything resource-specific lives in small, unencrypted bridge files under client/custom/, server/custom/ and custom/.
Layer | Supported | Without it |
|---|---|---|
Framework |
| Required. |
Inventory |
| Required — ingredients, dishes and fridges need it. The standalone fallback only prints a warning. |
Target |
| 3D text and the E key ( |
Text UI |
| ox_lib's text UI and native 3D text. |
Progress bars · HUD |
| ox_lib's progress circle; only the minimap is hidden while a menu is open. |
3D sound |
| The fryer is silent. |
Detection only sees resources that are already running, so start each of these before qs-restaurant-creator in server.cfg.
Renamed Resources#
Running a framework or inventory under another folder name? Add the name to the matching list in config/main.lua, pointing at the bridge it should use:
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
['my-core'] = 'qb', -- a renamed qb-core
}
local inventories = {
['qs-inventory'] = 'qs',
['ox_inventory'] = 'ox',
['qb-inventory'] = 'qb',
['tgiann-inventory'] = 'tgiann',
['codem-inventory'] = 'codem',
['origen_inventory'] = 'origen',
}Notifications#
By default messages are shown by the script's own interface. To route them through another system, edit Notification in custom/client.lua — ready-made examples for qs-interface and ox_lib are already there, commented out:
-- custom/client.lua
function Notification(msg, type) -- type: 'info' | 'error' | 'success'
lib.notify({ title = 'Restaurant', description = msg, type = type })
endThe same file holds the text UI, progress bar, HUD and 3D sound functions, so any of them can be swapped for your own resource.
Hunger and Thirst#
Eating a dish plays the animation and removes one item, but does not touch your status system. When a player finishes eating, the server receives restaurant:finishConsumeOutput with the item name. Handle it from any server script to add food and water:
local QBCore = exports['qb-core']:GetCoreObject()
local food = { burger = 40, cooked_pizza = 50, cooked_fries = 25 }
local drinks = { cola_drink = 35, sprunk_drink = 35, orange_drink = 35 }
RegisterNetEvent('restaurant:finishConsumeOutput', function(item)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
local meta = Player.PlayerData.metadata
if food[item] then
Player.Functions.SetMetaData('hunger', math.min(100, meta.hunger + food[item]))
elseif drinks[item] then
Player.Functions.SetMetaData('thirst', math.min(100, meta.thirst + drinks[item]))
end
TriggerClientEvent('hud:client:UpdateNeeds', src, Player.PlayerData.metadata.hunger, Player.PlayerData.metadata.thirst)
end)local food = { burger = 400000, cooked_pizza = 500000, cooked_fries = 250000 }
local drinks = { cola_drink = 350000, sprunk_drink = 350000, orange_drink = 350000 }
RegisterNetEvent('restaurant:finishConsumeOutput', function(item)
local src = source
if food[item] then
TriggerClientEvent('esx_status:add', src, 'hunger', food[item])
elseif drinks[item] then
TriggerClientEvent('esx_status:add', src, 'thirst', drinks[item])
end
end)Add your own dishes to the two tables — any multi-step recipe output or custom drink works the same way.
Discord Logs#
Paste a Discord webhook URL per category in server/webhooks.lua. Empty categories are simply not logged.
Category | What goes there |
|---|---|
| Restaurants created, edited and deleted. |
| Deposits and withdrawals. |
| Hires, firings and rank changes. |
| Ranks created, edited and deleted. |
| Kiosk orders, status changes and deliveries; supply purchases and claims. |
| Open/closed, image and cooking systems switched on or off. |
| Recipes created, edited and deleted. |
-- server/webhooks.lua
Config.ShowWebhookIP = false -- show players' IPs in log embeds
_G['webhook'] = {
creator = 'https://discord.com/api/webhooks/...',
finance = 'https://discord.com/api/webhooks/...',
workers = '',
ranks = '',
orders = '',
settings = '',
recipes = '',
}Adding an Inventory#
Supporting an inventory that is not on the list takes two files and one line:
Copy the closest bridge
Duplicate the closest pair — for example
client/custom/inventory/qb-inventory.luaandserver/custom/inventory/qb.lua— and rename them after your inventory.Replace the calls
Swap the exports inside for your inventory's: opening a stash (
OpenStash), and on the server the item list and image path.Register it
Add
['your-inventory'] = 'yourname'to theinventorieslist inconfig/main.luaand restart.
Languages and Price Format#
41 translations ship in locales/: ar, bg, bn, ca, cs, da, de, el, en, es, et, fa, fi, fr, he, hi, hr, hu, id, it, ja, ko, lt, lv, ms, nl, no, pl, pt, ro, ru, sk, sl, sv, sw, th, tr, uk, ur, vi and zh. Pick one with Config.Locale, or copy en.json to a new code to write your own.
Prices in every menu follow Config.Intl — set locales = 'es-ES' and currency = 'EUR' to show 1.250 €, for example. It only changes how numbers look, never the amounts.



