How Integrations Work#
Motels Creator looks at which resources are running when it starts and picks the matching bridge for each layer — the first one found wins. There is nothing to configure if you run a supported resource; just start it before qs-motels-creator.
Layer | Supported | Without it |
|---|---|---|
Framework | es_extended · qb-core · qbx_core | The resource does not run. |
Inventory | qs-inventory · ox_inventory · qb-inventory · origen_inventory · codem-inventory | A built-in stash window, saved in |
Clothing | qs-appearance · illenium-appearance · fivem-appearance · qb-clothing · codem-appearance · ak47_clothing · raid_clothes · rcore_clothing · sleek-clothestore · esx_skin | The wardrobe has nothing to open. |
Target | ox_target · qb-target (with | Markers and 3D prompts. |
Text UI | qs-textui | Built-in 3D text and ox_lib text UI. |
Progress & HUD | qs-interface | ox_lib progress circle; only the minimap is hidden. |
3D sound | mx-surround · qs-3dsound · xsound | No music. |
Weather sync | qb-weathersync · cd_easytime · vSync · av_weather | Rain may show inside interiors. |
Raid minigame | ps-ui | A timed ram instead. |
Every hook lives in an editable file. Framework bridges are in
custom/esx/andcustom/qb/, client hooks incustom/client.luaandclient/custom/main.lua, server hooks inserver/custom/.
Inventories and Stashes#
A room stash is named motelId_roomIndex_stashIndex — for example 3_12_1 — and opened in your inventory's own window.
Inventory | How the stash is created |
|---|---|
ox_inventory · origen_inventory | Every room stash is registered when the server starts, labelled Motel – No. room – Stash No. n. |
qs-inventory | Registered when first opened. |
qb-inventory · codem-inventory | Opened through the inventory's stash event. |
None (standalone) | The built-in window, stored in the database. No metadata keys or personal stashes. |
With Config.wipeStashOnLeave the stash is emptied when a rental ends, through a small adapter per inventory in server/custom/inventory/adapters/ — qs, ox, qb, origen, codem and standalone ship ready.
Notifications, Text and Progress#
Messages appear in the motel's own notification style by default. To send them to your notify resource instead, edit Notification in custom/client.lua — ready-made qs-interface and ox_lib versions are already in the file, commented out:
-- custom/client.lua
function Notification(msg, type) -- type: 'info' | 'error' | 'success'
lib.notify({ title = 'Motels', description = msg, type = type })
endThe same file holds ProgressBar, ShowTextUI / HideTextUI, the 3D text functions and ToggleHud, which hides the minimap (and qs-interface's HUD) inside rooms — add your own HUD there. Messages a motel sends to a player — rent warnings, staff messages, salaries — go through SendPlayerMessage in server/custom/main.lua, the place to route them to a phone or mail app.
Clothing and Wardrobes#
The room wardrobe calls your clothing script's outfit menu; the detected system is Config.Wardrobe. With esx_skin a simple menu lets players save, change and delete outfits. To call a different menu, edit OpenWardrobe in client/custom/main.lua.
Music#
Tracks are played from the resource itself, not from the internet. Drop .mp3 or .ogg files into music/ and list them:
-- config/main.lua
Config.MusicTracks = {
{ label = 'Beyond the Hills', file = 'beyond_the_hills.mp3' },
{ label = 'Silent Motion', file = 'silent_motion.mp3' },
{ label = 'Parallel Hearts', file = 'parallel_hearts.mp3' },
}Playback goes through mx-surround, qs-3dsound or xsound — whichever is running — via Play3DSound in custom/client.lua, which accepts a track's number or its file name.
Discord Logs#
Webhook URLs are pasted into the Webhooks table at the top of server/custom/main.lua. An empty string turns that log off.
-- server/custom/main.lua
Webhooks = {
['Stash'] = 'https://discord.com/api/webhooks/...', -- items stored in / taken from a room stash
-- ... one entry per event
}Each embed names the player, their Steam and Rockstar license, the motel and the room. The Stash log is written for the built-in (standalone) stash; with a third-party inventory, use that inventory's own logs.
Phone Apps#
A phone can list motels, show free rooms, quote a price and rent a room, and staff can answer requests — all through server callbacks that run the same checks as the reception. The callbacks are listed on Commands and Exports.
Overriding Detection#
Renamed your core or inventory? Add its resource name to the matching table in config/main.lua, pointing at the bridge it behaves like:
-- config/main.lua
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',
-- ...
}Clothing works the same way through the wardrobes table.
Adding a Bridge#
Copy the closest framework bridge
Duplicate
custom/esx/orcustom/qb/ascustom/<name>/and rewrite the calls inside — money, items, identifiers, names, jobs, admin check. The full list of functions is typed intypes.lua.Register it for detection
Add
['your-core'] = '<name>'to theframeworkstable. The folder name and the value must match.Add a stash-wipe adapter (inventories)
For a new inventory, create
server/custom/inventory/adapters/<name>.lua— it is loaded automatically:lua -- server/custom/inventory/adapters/myinv.lua local function wipe(stashId, ctx) -- ctx: { personal, tenantIdentifier, tenantSrc, motelId, roomIndex } if ctx.personal and ctx.tenantIdentifier then return exports.my_inventory:ClearStash(stashId, ctx.tenantIdentifier) end exports.my_inventory:ClearStash(stashId) end MotelStashWipe.register('myinv', { wipe = wipe }) -- same value as in the inventories table
Languages#
24 translations ship in locales/: ar bg ca cs da de en es fa fr he hi hu it ja ko nl no pl pt ru sv tr zh. Set Config.Locale, or setr qs:locale "es" in server.cfg to switch every Quasar resource at once. To add a language, copy locales/en.json to locales/<code>.json and translate the values; any key you miss falls back to English with a console warning naming it.



