Appearance & Tattoo Scripts
On this page8
Config.AppearanceSystem = 'auto'
Config.TattooSystem = 'auto'Appearance scripts
| System | Support | Auto order | Used for | Notes |
|---|---|---|---|---|
| GTA natives | Supported | always | clothing, face coverage, the scan itself | The core. Works with any script or none. |
| illenium-appearance | Supported | 1 | face editor, save, outfit-change notices, saved appearance, tattoos | Checked before esx_skin / skinchanger, which it provides. Use v5.7.0 or newer. |
| 17mov Character System | Supported | 2 | illenium API names through its Skin module | |
| rcore_clothing | Supported | 3 | outfit-change notices, saved appearance | Editor stub. |
| qs-appearance | Supported | 4 | illenium-style exports | Editor stub. |
| tgiann-clothing | Supported | 5 | saved appearance | Its wear / unwear calls fire no event; our 1.5 s re-read covers it. |
| crm-appearance | Stub | 6 | ||
| fivem-appearance | Supported | 7 | illenium-style API | Unmaintained since 2023; the save event differs per fork. |
| qb-clothing | Supported | 8 | outfit-change notices, saved appearance | No face-only editor. No tattoos. |
| esx_skin / skinchanger | Supported | 9 | restricted face menu, outfit-change notices, saved appearance | Flat 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
| Source | Support | Auto order | Reads |
|---|---|---|---|
| rcore_tattoos | Supported | T1 | tattoos saved on the server |
| illenium JSON | Supported | T2 | saved tattoos, grouped by zone |
| natives | Supported | T3 (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:
| Zone | Visible when |
|---|---|
| hands | no gloves |
| forearms | short sleeves or less |
| upper arms | sleeveless or shirtless |
| torso, back | shirtless only |
| neck, face | not covered by a mask or high collar |
| legs | shorts or a skirt |
Turn a zone off entirely in Config.Tattoos.Zones. See
Face Coverage, Clothing & Tattoos.
Overlays you do not want counted
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 script | Face editor for the implant |
|---|---|
| illenium-appearance | full face editor |
| 17mov | through its Skin module |
| qs-appearance, rcore_clothing, crm-appearance | editor stub |
| fivem-appearance | illenium-style API |
| qb-clothing | none |
| esx_skin / skinchanger | restricted face menu |
| none | none |
With no usable editor, Config.Implant.NoEditorPolicy decides: 'skip' (new
identity and name, face unchanged) or 'block' (the clinic refuses).
Non-freemode peds
Players on a ped-menu or addon model are handled by Config.NonFreemode, not by the
appearance bridge:
| Policy | Behaviour |
|---|---|
'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.