How Integrations Work#
Everything that depends on another resource lives in a small, unencrypted bridge file under client/custom/ or server/custom/. On start, Motorhome looks at which resources are running and switches on the matching bridge; every other bridge stays silent.
Layer | Supported | Without it |
|---|---|---|
Framework |
| Required — ownership, money and items come from it. |
Inventory |
| Stashes and storage furniture do not open. |
Wardrobe |
| The default wardrobe: the qb-clothing outfit menu on QBCore, an ESX menu of saved outfits on ESX. |
Phone |
| No charging spot and no break-in alert on the owner's phone. |
Target |
| Off by default: floating |
Text UI |
| Plain 3D text from the game. |
HUD |
| Only the radar is hidden while decorating. |
Weather sync |
| Nothing to pause. |
Quests |
| No quests. |
Screenshots |
| Furniture thumbnails are pasted as URLs. |
Database |
| Required. |
Detection only sees resources that are already started. If something you run is not picked up, move its
ensureline aboveensure qs-motorhome.
Overriding Detection#
Each layer is a small table in config/main.lua that maps a resource name to the bridge it should use. A renamed resource, or one that behaves like a supported one, is a single extra line:
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb', -- add this line on Qbox if it is not detected
['my-core'] = 'qb', -- a renamed qb-core
}
local inventories = {
['ox_inventory'] = 'ox_inventory',
['my-inventory'] = 'qs-inventory', -- a fork that behaves like qs-inventory
}The same pattern applies to wardrobes and phones. Run only one resource per layer — with two inventories running, either may be picked.
Target#
Set Config.UseTarget = true to replace the [E] prompts with target options: the motorhome door, the exit and doorbell, the stash and its vault code, the wardrobe, storage furniture, junk and the cleaning robot.
Config.UseTarget = true
Config.TargetDistance = 5.0
Config.TargetWidth = 5.0
Config.TargetLength = 5.0
Config.ZoneDebug = false -- draws the zones while you tune themPolice Dispatch#
When a break-in sets off the alarm, client/custom/dispatch/default.lua shows every player with the Config.ReqJobPolice job a notification with the street name and a flashing blip that fades out. To send it to your dispatch script instead, replace the body of that handler:
RegisterNetEvent('motorhome:client:notifyCops')
AddEventHandler('motorhome:client:notifyCops', function(coords)
-- call your dispatch export here, for example:
-- exports['ps-dispatch']:CustomAlert({ coords = coords, message = 'Motorhome break-in' })
end)Phone#
With Quasar Smartphone or Smartphone PRO running, two things switch on:
Charge in
/vanLocationcreates a phone charging spot inside the motorhome.When a break-in sets off the alarm, the owner gets a phone notification.
Weather, Time and the HUD#
Interiors hold their own clock and clear weather, so weather sync is paused on the way in and resumed on the way out. client/custom/weather/weather.lua sends the pause events for qb-weathersync, cd_easytime and vSync; add a line there for any other sync script.
While decorating or using the furniture creator, the radar and qs-interface are hidden through ToggleHud in config/main.lua. Add your own HUD's hide export to that function:
function ToggleHud(bool)
DisplayRadar(bool)
if GetResourceState('qs-interface') == 'started' then
exports['qs-interface']:ToggleHud(bool)
end
-- exports['my-hud']:SetVisible(bool)
endAdvanced Inventory Quests#
With qs-inventory running, every player receives seven motorhome quests when they load in. Titles, descriptions, rewards and required levels are in server/custom/missions.lua.
Quest | Completed by | Reward |
|---|---|---|
Home Styling | Buying 10 pieces of furniture | 200 |
Housewarming | Letting a visitor in | 150 |
Trust Issues | Giving a key | 175 |
Welcome Aboard | Receiving a key | 150 |
Storage Setup | Placing a stash or wardrobe | 250 |
Power Up | Charging a Smartphone PRO inside | 150 |
Breaking In | Lockpicking a motorhome | 175 |
FiveGuard#
The decoration editor flies a free camera, which anticheats read as noclip. If you run FiveGuard, put its resource name in Config.FiveGuard and the player is given a temporary freecam and noclip bypass only while the editor is open.
Config.FiveGuard = 'fiveguard' -- your FiveGuard resource name, or falseAdding a Backend#
Supporting something that is not on the list takes one file and one line:
Copy the closest bridge
Duplicate the file that behaves most like yours — for example
client/custom/inventory/qs-inventory.lua— and give it your resource's name.Change the guard and the calls
Every bridge starts with a guard such as
if Config.Inventory ~= 'qs-inventory' then return end. Set it to your name, then replace the exports inside —OpenStashfor an inventory,openWardrobefor a wardrobe.Register it for detection
Add your resource to the matching table in
config/main.lua, and restart.
Framework bridges work the same way: client/custom/framework/ and server/custom/framework/ hold the ESX and QBCore versions of each function — money, items, ownership, the police count and where the motorhome_inside column lives.
Languages#
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. Set one convar to change the language of every Quasar resource at once:
setr qs:locale "es"Prices in the interface follow Config.Intl — set the locale and currency there to show 1.250 € instead of $1,250.



