How Integrations Work#
Nothing in the core of Yacht Creator knows which framework, inventory or wardrobe you run. Every one of them sits behind a small, unencrypted bridge file, and the resource picks the bridge by checking which resource is already started.
Layer | Supported | Without it |
|---|---|---|
Framework | es_extended · qb-core · qbx_core | Required — the resource stops with an error. |
Target | ox_target · qb-target | Set Config.UseTarget = false and every spot shows a key prompt instead. |
Inventory | qs-inventory · ox_inventory · qb-inventory · ps-inventory · core_inventory · codem-inventory · origen_inventory · tgiann-inventory · Chezza inventory | Stashes and storage furniture do not open. |
Wardrobe | qs-appearance · illenium-appearance · fivem-appearance · qb-clothing · codem-appearance · ak47_clothing · raid_clothes · rcore_clothes · rcore_clothing · origen_clothing · sleek-clothestore · tgiann-clothing · p_appearance | ESX: a built-in outfit menu saved in esx_datastore. QBCore: the qb-clothing outfit menu. |
3D sound | mx-surround · qs-3dsound · xsound | No radio. The console reports that no sound resource is started. |
Weather sync | Renewed-Weathersync · qb-weathersync · cd_easytime · vSync · av_weather | The shop still forces clear weather; another sync script may fight it. |
Text UI · progress · HUD | qs-textui · qs-interface | ox_lib text UI and progress circle; only the minimap is hidden in menus. |
Phone | qs-smartphone-pro | No Yacht app; everything stays in /yachtMenu. |
Database | oxmysql | Required. |
Detection only sees resources that are already started. If a layer is not picked up, the first thing to check is that it is ensured before qs-yacht in server.cfg.
Overriding Detection#
Each layer looks through a list of resource names in config/main.lua and takes the first one that is running. If you run two inventories at once, or yours has been renamed, set the value by hand right after the detection line:
-- config/main.lua
Config.Inventory = DependencyCheck(inventories) or 'default'
Config.Inventory = 'ox_inventory' -- pinned by hand
Config.Wardrobe = DependencyCheck(wardrobes) or 'default'
Config.Wardrobe = 'illenium-appearance'A renamed resource can also be added to the list itself — the key is the resource name, the value is the bridge it should use:
local inventories = {
['my-renamed-inventory'] = 'ox_inventory',
-- ...
}Inventories and Stashes#
Every stash is opened through the inventory bridge in client/custom/inventory/. Stash IDs are stable, so you can look them up in your inventory's own tables:
Stash | ID | Size |
|---|---|---|
The yacht's main stash |
|
|
A storage piece of furniture |
| The |
With ox_inventory, a stash is registered on the server the first time it is opened, so no extra setup is needed.
Sound and the Radio#
The radio plays from three points of the yacht — the deck, the bridge and the cabin — so it sounds right wherever the player stands. With qs-3dsound or mx-surround, the fall-off of each point is set by Config.Panners; with xsound, one source plays from the deck with a 110 m range.

Notifications#
Messages are shown by Yacht Creator's own interface. To send them through another system, edit the Notification function in custom/client.lua — commented examples for qs-interface and ox_lib are already there:
-- custom/client.lua
function Notification(msg, type) -- type: 'info' | 'error' | 'success'
lib.notify({ title = 'Yacht', description = msg, type = type })
endThe same file holds ProgressBar, ToggleHud, ShowTextUI and DrawText3D, so your own HUD or text UI is wired in the same place.
Weather While Previewing#
The shop pauses your weather script and freezes a clear sky at Config.ShopTime (23:00, to show the lights) while the player looks at a yacht, then hands control back. The events it sends live in client/custom/weather/weather.lua — add your own script's pause event there if it is not on the list.
Adding a Backend#
Supporting an inventory or wardrobe that is not on the list takes one file and one line:
Copy the closest bridge
Duplicate a file in
client/custom/inventory/orclient/custom/wardrobe/and rename it after your resource. Each file is guarded so it only runs when it is the chosen backend.Change the calls inside
An inventory bridge defines two functions, a wardrobe bridge defines one:
lua if Config.Inventory ~= 'my-inventory' then return end function ToggleInventoryClothing(state) end function openStash(customData, uniq) local data = customData or Config.DefaultStashData uniq = uniq or ('yacht_' .. CurrentYachtId) exports['my-inventory']:OpenStash(uniq, data.slots, data.maxweight) end -- client/custom/wardrobe/my-clothing.lua if Config.Wardrobe ~= 'my-clothing' then return end function openWardrobe() exports['my-clothing']:OpenOutfits() endRegister it for detection
Add
['my-inventory'] = 'my-inventory'to theinventories(orwardrobes) list in config/main.lua and restart.
Frameworks extend the same way: custom/esx/ and custom/qb/ each hold a client and a server file with the money, identifier, character name and yacht_inside functions the script calls.
Languages#
Forty-one 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 file to add your own. Price formatting follows Config.Intl.



