Skip to the content
Docs

Appearance & Tattoo Scripts

On this page8
lua
Config.AppearanceSystem = 'auto'
Config.TattooSystem     = 'auto'

Appearance scripts

SystemSupportAuto orderUsed forNotes
GTA nativesSupportedalwaysclothing, face coverage, the scan itselfThe core. Works with any script or none.
illenium-appearanceSupported1face editor, save, outfit-change notices, saved appearance, tattoosChecked before esx_skin / skinchanger, which it provides. Use v5.7.0 or newer.
17mov Character SystemSupported2illenium API names through its Skin module
rcore_clothingSupported3outfit-change notices, saved appearanceEditor stub.
qs-appearanceSupported4illenium-style exportsEditor stub.
tgiann-clothingSupported5saved appearanceIts wear / unwear calls fire no event; our 1.5 s re-read covers it.
crm-appearanceStub6
fivem-appearanceSupported7illenium-style APIUnmaintained since 2023; the save event differs per fork.
qb-clothingSupported8outfit-change notices, saved appearanceNo face-only editor. No tattoos.
esx_skin / skinchangerSupported9restricted face menu, outfit-change notices, saved appearanceFlat users.skin keys.

illenium-appearance

The most complete integration: face editor for the implant, save hooks, outfit-change notices, a server-side read of the stored appearance, and tattoos.

Pin v5.7.0 or newer. Because illenium provides the esx_skin and skinchanger names, 'auto' checks it first — otherwise an illenium server would resolve to esx_skin and lose the face editor.

17mov Character System

Its Skin module replaces the appearance scripts unless Skin.Enabled = false.

qs-appearance

We use its illenium-style exports, and we never call its own OpenSurgeonShop — that has its own price and its own flow, which would bypass Config.Implant.Price, the cooldown and the identity reset entirely.

tgiann-clothing

Its Wear and UnWear calls fire no event we can listen to. That is fine: every player's own look is re-read every 1.5 seconds (Config.Performance.SelfPollMs), so the change is noticed anyway. The only cost is up to 1.5 seconds of delay before an outfit change is reflected.

fivem-appearance

Unmaintained since 2023 and widely forked. The save event name differs between forks, so the instant outfit-change notice may not fire on yours; the 1.5-second re-read still catches the change. Everything else works.

qb-clothing

Works for outfit-change notices and the saved appearance. It has no face-only editor, so the implant clinic falls back to Config.Implant.NoEditorPolicy — 'skip' by default: new identity, new name, same face.

esx_skin / skinchanger

A restricted face menu is opened for the implant. Keys are the flat users.skin shape.

Tattoo sources

SourceSupportAuto orderReads
rcore_tattoosSupportedT1tattoos saved on the server
illenium JSONSupportedT2saved tattoos, grouped by zone
nativesSupportedT3 (fallback)the tattoos GTA shows on the ped

rcore_tattoos and illenium tattoos can coexist on the same ped; the bridge reads whichever one is selected, and the natives fallback still runs underneath.

What the tattoo cue actually uses

Tattoos only count while their body zone is visible right now:

ZoneVisible when
handsno gloves
forearmsshort sleeves or less
upper armssleeveless or shirtless
torso, backshirtless only
neck, facenot covered by a mask or high collar
legsshorts or a skirt

Turn a zone off entirely in Config.Tattoos.Zones. See Face Coverage, Clothing & Tattoos.

Overlays you do not want counted

lua
Config.Tattoos.IgnoreHairFades = true
Config.Tattoos.BlockOverlays = {
    -- { collection = 'mpbeach_overlays', overlay = 'FM_Hair_Fuzz' },
}

Hair shops add fade "tattoos" that nobody would describe as a tattoo. They are ignored by default. Add any other overlay your server uses as a badge or decal.

Outfit-change notices

Where the appearance script tells us an outfit was saved, the script picks up the new look at once — useful because a changed outfit is exactly what breaks other people's memory of them.

Where it does not, the 1.5-second re-read picks the change up anyway; it is just up to 1.5 seconds later. Nothing is shown to the player either way.

The face editor and the implant

Appearance scriptFace editor for the implant
illenium-appearancefull face editor
17movthrough its Skin module
qs-appearance, rcore_clothing, crm-appearanceeditor stub
fivem-appearanceillenium-style API
qb-clothingnone
esx_skin / skinchangerrestricted face menu
nonenone

With no usable editor, Config.Implant.NoEditorPolicy decides: 'skip' (new identity and name, face unchanged) or 'block' (the clinic refuses).

See Face Implant & Clinics.

Non-freemode peds

Players on a ped-menu or addon model are handled by Config.NonFreemode, not by the appearance bridge:

PolicyBehaviour
'model' (default)The model itself is the face; all 12 clothing parts count; no tattoos.
'unrecognizable'Only the voice counts — maximum 40 %, so nothing is ever saved.
'always'Like 'model', but masks and hats never hide the face.

Per-model overrides: Config.NonFreemode.Overrides['a_c_chop'] = 'unrecognizable'.

Custom

Set Config.AppearanceSystem = 'custom' (or Config.TattooSystem = 'custom') and fill the branch in bridge/appearance_client.lua / bridge/appearance_server.lua.

See Writing a Custom Adapter.