Using Your Shells in a Housing Script#
Every saved shell is a model called qs_shells_<id>, so any housing script that can spawn a shell model can use it. What changes between scripts is the shape of their config entry — and that is what the Export Code box in the shell manager writes for you.
Select the shell
/shellcreator, then click the shell in the list.Pick your housing script
Under Export Code, choose the format. The entry is generated with the model name, the shell's label and the entrance measured from its spawn point.
Copy and paste it
Copy Code puts it on your clipboard. Paste it into that script's list of shells or interiors, fill in anything marked
-- Change me, and restart the housing script.

Formats included#
Format | Key | What it writes |
|---|---|---|
QS Housing (Shell) |
| The model and a stash. |
QS Housing (IPL) |
| Exit coords, the interior's coords and a stash. |
RTX Housing (Shell / IPL) |
| Label, model, tags and exit; management, wardrobe, storage, cooking, sink, shower and cleaning points left as |
PS Housing (Shell / IPL) |
| Label, door offset (or door position) and heading, and a stash. |
VMS Housing (Shell) |
| Label, model, rooms and the door offset with heading. |
ESX Property (Shell / IPL) |
| Label, value, type and position; wardrobe and storage left as |
Default |
| Just the spawn and entrance coordinates, for any other script. |
Shell or IPL? A Shell format lets the housing script spawn qs_shells_<id> wherever it likes and measures the door as an offset from that object — the usual choice, and the one that lets several houses share one shell. An IPL format uses the shell where Shell Creator itself placed it, with absolute coordinates, like a fixed interior.
Adding Your Own Export Format#
Every format is a text template in Config.Exports (config/main.lua). Add an entry and it appears in the manager's list after a restart:
Config.Exports['my_housing-shell'] = {
label = 'My Housing (Shell)',
export = [[{
name = '{LABEL}',
model = '{MODEL}',
door = vector4({EXIT_OFFSET_X}, {EXIT_OFFSET_Y}, {EXIT_OFFSET_Z}, {EXIT_HEADING}),
}]]
}These placeholders are replaced when the code is generated:
Placeholder | Becomes |
|---|---|
| The model name, e.g. |
| The shell's name. |
| The spawn point relative to the shell, as |
| The same offset, one number each. |
| The spawn point in world coordinates, as |
| The same world position, one number each. |
| The direction the spawn point faces. |
| Where the shell itself stands in the world, as |
A shell saved without a spawn point fills every coordinate with 0.0 — in practice that cannot happen, because the builder refuses to save one.
Frameworks and Admin Rules#
The framework is only used for two questions — is this player an admin, and what is their identifier — answered by a small, unencrypted bridge per framework:
Framework | Admin when | Stored as creator |
|---|---|---|
ESX | Group | The ESX identifier |
QBCore / Qbox | Permission | The citizen id |
Standalone | The | The Rockstar license |
To use your own rule — a dedicated ace, a Discord role, a list of builders — change playerIsAdmin in custom/<framework>/server.lua:
-- custom/qb/server.lua
function framework:playerIsAdmin(source)
return IsPlayerAceAllowed(source, 'shellcreator.builder')
end# server.cfg
add_ace group.builder shellcreator.builder allow
add_principal identifier.license:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx group.builderIf your core is renamed, Shell Creator falls back to standalone. Point Config.Framework in config/main.lua at 'esx', 'qb' or 'standalone' by hand, and change the exports['es_extended'] / exports['qb-core'] line in that bridge to your resource's name.
Text UI, Progress Bars and the HUD#
All of it lives in custom/client.lua, unencrypted, and picks what is running:
Feature | Uses | Otherwise |
|---|---|---|
Notifications | Shell Creator's own toasts, drawn in its interface | — |
Text UI and 3D text |
| ox_lib text UI and GTA's native text |
Progress bar |
| ox_lib progress circle |
Hiding the HUD |
| The minimap only |
For any other HUD, add its hide and show calls inside ToggleHud(bool). It runs when the manager or the builder opens and when they close:
function ToggleHud(bool)
DisplayRadar(bool)
if GetResourceState('my-hud') == 'started' then
exports['my-hud']:SetVisible(bool)
end
endFor phones, radial menus or inventories that should not open while someone builds, use the exports and state bags in Commands and Exports.
Weather and Time#
While the builder is open, the weather is held at clear skies and noon so the build always looks the same and the cover photo is lit. The sync of these scripts is paused for the builder and resumed afterwards:
Renewed-Weathersyncqb-weathersynccd_easytimevSyncav_weather
For another weather script, add its pause and resume events to FreezeWeather in client/custom/weather/weather.lua.
Languages#
25 translations ship in locales/: Arabic (ar), Bulgarian (bg), Czech (cs), Danish (da), German (de), Greek (el), English (en), Spanish (es), Persian (fa), French (fr), Hindi (hi), Hungarian (hu), Italian (it), Japanese (ja), Korean (ko), Dutch (nl), Norwegian (no), Polish (pl), Portuguese (pt), Russian (ru), Slovenian (sl), Swedish (sv), Thai (th), Turkish (tr) and Simplified Chinese (zh-CN). Set Config.Locale to the code.
To add a language, copy locales/en.json to locales/<code>.json, translate the values (keep the keys and the {{placeholders}}), and set Config.Locale to that code. Any key you leave out falls back to English, with a console warning naming it.



