How Integrations Work#
MLO Creator needs very little from the rest of your server. Your framework is only asked one question — is this player an admin? — and your appearance script only one job: put clothes back on after a build. Everything else it needs ships inside the [mlocreator] folder. Detection happens at start, and the console prints what it picked.
Layer | Supported | Without it |
|---|---|---|
Framework |
| Standalone, admins by ACE |
Appearance |
| Players may be left on a default ped after a build |
Database |
| Required |
Textures |
| Every built interior shows missing textures |
Collision server | Quasar's hosted server (default) or your own | The Collision Cutter and doorway detection cannot work |
Door locks | Any script that uses the game's door system | Doors still work with the lock state set in the editor |
Every map you build is an ordinary FiveM resource. Other scripts — targets, inventories, housing, jobs — see your interiors exactly as they see any MLO you bought.
Frameworks and the Admin Rule#
The framework is detected from the resources that are running. If you renamed yours, add its name on the left of this list:
-- config/main.lua
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
}Each framework has one bridge folder, custom/<framework>/, with a client and a server file. The function that matters is playerIsAdmin: every tool, every save and every build asks it first. Change it to whatever your staff system uses:
-- custom/esx/server.lua
function framework:playerIsAdmin(source)
local player = self:getPlayerFromId(source)
if not player then return false end
return player.getGroup() == 'admin' or player.getGroup() == 'superadmin'
endTo support another framework, copy the closest folder (for example custom/standalone), rename it, fill in its functions and add its resource name to the list above.
Appearance Scripts#
A live build reloads the game's streaming, and that reload also resets the player's ped. The first running appearance script from this list is used to put each player's clothes back:
-- config/main.lua
local appearances = {
['qs-appearance'] = 'qs-appearance',
['illenium-appearance'] = 'illenium-appearance',
['fivem-appearance'] = 'fivem-appearance',
['esx_skin'] = 'esx_skin',
['qb-clothing'] = 'qb-clothing',
['qb-clothes'] = 'qb-clothes',
}The actual reload happens in reloadSkin inside custom/<framework>/client.lua. For a clothing script not on the list, add a branch there that triggers its own reload event.
The Collision Server#
GTA's own collision and building meshes are not readable from a script. The Collision Cutter, the doorway detection in the MLO Creator and the "pick a building from the world" reference all fetch them from a collision server. Quasar hosts one and the script points at it by default, so there is nothing to set up. Its fields are in Settings → Collision viewer:
Field | Default | Meaning |
|---|---|---|
Collision server |
| Where the vanilla collision meshes are fetched from. |
Server key | empty | The key that server asks for, if any. |
Public address | empty | The address clients use, when it differs from the one above. |
Request timeout | 20000 ms | How long a request is waited for. |
Your game server must be able to reach that address over HTTPS. If a firewall blocks outgoing requests, the cutter's start screen shows "No collision server".
Door Lock Scripts#
Doors placed with the MLO Editor are registered with the game's own door system when the map starts, so any door lock script that works with AddDoorToSystem doors can lock and unlock them. Each door's model — and its door hash — is named after the editor project, numbered in the order the doors were created:
-- an editor project called "Benny's workshop"
benny_s_workshop_door01
benny_s_workshop_door02
benny_s_workshop_door03_l -- a double door: one entry per leaf
benny_s_workshop_door03_rThe editor's door card has a button to copy the exact hash. The lock state, speed, trigger distance and hold-open set in the editor are applied on start; a lock script can override them at any time.
The Furniture Catalogue#
The catalogue used by the MLO Editor and the YMAP Creator is the one file you will want to edit: config/catalog.lua. It ships with about 500 props in 40 categories, under five top tabs (Kitchen, Bathroom, Bedroom, Living, Garden). Add your own add-on props the same way:
-- config/catalog.lua
Config.Catalog['my_sofas'] = {
label = 'My sofas',
img = Config.CatalogImagePath .. 'decorate/categories/rooms/living/sofa.svg',
navigation = 4, -- the top tab: 4 = Living
items = {
[1] = {
object = 'my_sofa_01', -- the model name, streamed by your own resource
label = 'Leather sofa',
img = 'nui://my-props/images/my_sofa_01.png',
description = 'Three seats, dark leather.',
},
},
}Any model can also be placed by name with Custom model (Editor) or Any model (YMAP Creator), without touching the catalogue.
Fences#
The YMAP Creator's fence tool reads its families from config/fences.lua. A family only names its models; panel length, direction and height are read from the model itself, so add-on fences work as soon as their .ytyp is streamed.
-- config/fences.lua
{
id = 'chainlink_tall',
label = 'Chain-link · 2.5 m',
panels = { 'prop_fnclink_02a', 'prop_fnclink_02g' }, -- straight pieces, any order
gates = { 'prop_fnclink_02gate5',
{ 'prop_fnclink_02gate6_l', 'prop_fnclink_02gate6_r' } }, -- a pair = double gate
-- post = 'model_name', -- optional corner post
},A family whose models are all missing on a client is simply hidden there.
Languages#
MLO Creator ships in 41 languages, from English and Spanish to Japanese, Arabic and Hindi. Pick one in Settings → General; it applies to every admin at once. To add or correct a language, copy locales/en.json to a new file, translate the values and select it.



