Your tattoo script
Each tattoo script lists tattoos its own way. The pack brings a ready list for each one, and installs it for you.
How the lists are installed
Type this in the server console (not in the game):
zaiders_tattoos_install- It only touches the tattoo script your server is running. A stopped one is never touched.
- It copies the list into that script, or adds the designs to the script's own list. Installing twice adds nothing twice.
- Some scripts also need one line in one of their files.
Config.EditOtherScripts = truelets the installer add it; otherwise the console tells you the exact line and where it goes. Every edited Lua file is compiled, never run, before it is saved. If the line can't be placed safely, the console prints it instead. - Every file it changes keeps its original as
<file>.zaiders_backup(made the first time, never overwritten), and the version it replaced last as<file>.zaiders_backup_last. - When it's done, the console says what's next. After a script's
fxmanifest.luachanged, typerefresh, thenensure <script>(or restart the server), and players reconnect. After other files, restart that script or the server. - A list it installed is updated when a new version of the pack brings a newer one. A list you changed (designs removed, for example) is left as it is:
zaiders_tattoos_install forcerewrites it. - Files must be plain JSON. A file with comments, a trailing comma or a BOM is reported and never overwritten.
zaiders_tattoos_install <script> <folder>when a known script runs under another folder name (for examplezaiders_tattoos_install illenium-appearance illenium-appearance-main). It's remembered.
FXServer lets a resource write into another one only with a line in server.cfg, before ensure zaiders_tattoos, and it reads it only while the server starts (restart the server after adding it). One line per script you use, with its folder name:
add_filesystem_permission zaiders_tattoos write rcore_tattoos
add_filesystem_permission zaiders_tattoos write illenium-appearance
add_filesystem_permission zaiders_tattoos write fivem-appearance
add_filesystem_permission zaiders_tattoos write vMenu
add_filesystem_permission zaiders_tattoos write qb-tattooshop
add_filesystem_permission zaiders_tattoos write esx_tattooshop
add_filesystem_permission zaiders_tattoos write bl_appearance
add_filesystem_permission zaiders_tattoos write dx_clothing(vMenu.Enhanced, xnTattoos... if yours is called that; dx_clothing only with Config.SetShopZonePrices.) Without the line nothing breaks: the console prints it, and the ready-made file goes into zaiders_tattoos/install/ for you to copy by hand. An update FXServer refused stays pending and is tried again at every start, until the line is in place.
Config.AutoInstall = true does all of this by itself when the server starts, in the scripts already started: it takes effect from the next restart. The lists come in English and Spanish: Config.ListsLanguage picks which (English by default).
By script
| Script | What to do |
|---|---|
| ZAIDERS Appearance | Nothing, while its tattoo shop is on. Its tattoo shop finds the pack by itself, with each design's name (in the pack's Config.Language) and ZAIDERS as the pack, and From packs lists only addon designs. Card pictures: in the panel, Tattoos → Images → Make the missing ones, then ensure zaiders_photos; until then each card shows the design's texture. See Catalog photos. Its sync shows every player's tattoos to the others, darker layers included. Its tattoo shop turns itself off with Config.Tattoos.enabled = false, or while one of its Config.Tattoos.owners runs (rcore_tattoos, qb-tattooshop, esx_tattooshop, xnTattoos, illenium-appearance, fivem-appearance and bl_appearance by default). Then the console says so, for example running, but its tattoo shop is off while rcore_tattoos runs: install this pack's list there: install the list in that script. Its sync keeps showing everyone's tattoos. See Tattoo shop. |
| dx_clothing | Nothing: it reads the game's own tattoo shop, which the pack brings. Don't add the designs to its config/addon_tattoos.js too, or each one shows twice. It charges per zone; with Config.SetShopZonePrices = true the installer sets every zone to Config.Price (in its config/languages/<language>.json; needs add_filesystem_permission zaiders_tattoos write dx_clothing). |
| rcore_tattoos | The installer copies zaiders_tattoos.json into its lists folder (assets/tattooLists/ unless its Config.TattooListsPath says otherwise). Then "zaiders_tattoos.json", goes inside Config.TattooLists in rcore_tattoos/config.lua. |
| illenium-appearance | The installer copies shared/zaiders_tattoos.lua. Then 'shared/zaiders_tattoos.lua', goes in its fxmanifest.lua, in shared_scripts, after 'shared/tattoos.lua'. Each design costs Config.Price when its Config.ChargePerTattoo is on. |
| fivem-appearance | The installer adds the designs to its tattoos.json, or to files/tattoos.json in the versions that keep it there. Versions without that file have no addon tattoos. |
| vMenu 3.8.8 or later, and vMenu Enhanced | The installer adds the designs to config/tattoos.json, in the format of the vMenu you run (read from the file itself, since vMenu Enhanced is often installed as vMenu). vMenu reads it in each player's game, so players reconnect to see them. Older versions of vMenu have no list for addon tattoos. |
| esx_tattooshop | The installer copies zaiders_tattoos.lua. Then 'zaiders_tattoos.lua', goes in its fxmanifest.lua (__resource.lua in older versions), in client_scripts, right after 'client/tattooList.lua'. It doesn't split tattoos by sex: each design is listed for the man and for the woman, and each character only shows its own. The list adds a ZAIDERS Tattoos category. |
| qb-tattooshop, xnTattoos | The installer adds the designs to their AllTattoos.json. They show and charge a list's price divided by 20, so the list carries Config.Price × 20. A price of 0 is charged as 100 there: use 1 for almost free. Some qb-tattooshop versions compare the ped model with a text (== 'mp_m_freemode_01'), so men get the women's tattoos: use backticks there (== `mp_m_freemode_01`), or xnTattoos. |
| bl_appearance | The block in integrations/<language>/bl_appearance/zaiders_tattoos.lua goes inside tattoosList in bl_appearance/data/tattoos.lua. The installer pastes it with Config.EditOtherScripts = true. This script shows each design by its preset name. |
esx_tattooshop saves tattoos by their place in the list
Don't reorder the list or take designs out of it later: saved tattoos would point to other designs. Once players own these designs, never remove the list or its line from the manifest: esx_tattooshop would then put none of their tattoos on. New versions of this pack only add designs at the end.
Any other script
We haven't tested other tattoo scripts, paid ones included. If yours reads the game's own tattoo shop, the designs are already there, by sex, with their names.
If it keeps its own list, integrations/<language>/generic/zaiders_tattoos.json has every design with its name, its label (the name the pack gives the game), its zone, its collection, the man's preset, the woman's preset and a price. Most tattoo scripts ask for exactly those fields: copy them into its format.
{
"name": "ZAIDERS_LA001",
"label": "Left Arm 001",
"zone": "ZONE_LEFT_ARM",
"collection": "zaiders_overlays",
"hashMale": "zaiders_left_arm_001_M",
"hashFemale": "zaiders_left_arm_001_F",
"price": 200
}A design for one sex only has an empty preset for the other.
What other players see
Whatever the script, the pack shows each player's tattoos to the others itself, also past the game's limit. See What other players see.
