Installation

3 min readUpdated 2 weeks ago

Overview

ML Tattoos is a tattoo shop resource. Players browse vanilla GTA overlay tattoos and player custom-image tattoos on a 3D rotating preview, then apply or remove them. Staff manage custom tattoos, restrictions and factions from a built-in admin panel.

Quick Start

  • Download the package from https://portal.cfx.re
  • Extract it to your resources folder, keeping ml_tattoos and ml_tattoos_meta together
  • Add to server.cfg:
server.cfg
1ensure oxmysql
2ensure ox_lib
3ensure ml_bridge
4ensure ml_tattoos_meta
5ensure ml_tattoos
Load Order

ml_tattoos must start AFTER ml_bridge, ox_lib, oxmysql and ml_tattoos_meta. The meta companion must be present, or custom tattoos will not render.

Database

Tables are created automatically on first start:

  • ml_tattoos_players: Each player's applied tattoos
  • ml_tattoos_custom: Custom-image tattoo definitions (image, position, visibility, owner)
  • ml_tattoos_admins: In-panel admin whitelist
  • ml_tattoos_restrictions: Per-tattoo job/faction restrictions
  • ml_tattoos_credits: Per-player use balances (solo/faction/ytd)
  • ml_tattoos_credit_log: Audit trail of every use grant, consume, refund and revoke
  • ml_tattoos_ytd_unlocks: Which full-body packs each player has unlocked

The schema includes automatic migrations for older installs; they run safely and skip on already-healthy databases.

Item Registration

Items are only needed when you use item payment or the item-kit presets. Copy the definitions from _INSTALL/items.lua into your inventory:

ox_inventory/data/items.lua
1['tattoo_kit'] = {
2    label = 'Tattoo Kit', weight = 200, stack = true, close = true,
3    description = 'A portable tattoo kit. Use it to apply one tattoo.',
4},
5['tattoo_kit_basic']   = { label = 'Basic Tattoo Kit',   weight = 200, stack = true, close = true },
6['tattoo_kit_premium'] = { label = 'Premium Tattoo Kit', weight = 200, stack = true, close = true },
7['tattoo_kit_custom']  = { label = 'Custom Tattoo Voucher', weight = 50, stack = true, close = true },
Match your config

Register only the items you actually reference in Config.ItemPerTattoo, Config.ItemPresets and Config.UnlockableHashes. The full list lives in _INSTALL/items.lua.

Meta data must be writable

The custom-tattoo overlay pool is written into ml_tattoos_meta/data at boot, so that folder must be writable at runtime. On a read-only deploy, grant write access to it before starting the resource.

Verify

After starting, the console prints:

text
1[ml_tattoos] Resource started
2[ml_tattoos] thank you for choosing miciomods.it

Open the shop in-game through a configured shop location, a tattoo-kit item, the /opentattoo admin grant, or the openShop export. Admins open the management panel with /tattooadmin.

Maintenance

Run /reloadtattoos to reload tattoo data without restarting the resource.

  • Custom tattoos do not appear: Confirm ml_tattoos_meta is present and started, and that its data folder is writable. Restart ml_tattoos so the pool is rebuilt and the meta resource restarts.
  • UI does not open: Check the F8 console for resource errors and confirm ml_bridge and ox_lib started first.
  • Admin panel missing: The player needs the ml_bridge permission set in Config.AdminPermission (default 'admin'), or an entry in the in-panel admin whitelist.
  • Tattoos not saving: Confirm oxmysql started before ml_tattoos and that the tables were created on boot.
  • A custom image is rejected: Images must be served over HTTPS from an approved host. Re-upload to a supported image host, or enable the in-game uploader with FiveManage.
  • Tebex donations not delivering uses: Confirm ml_tebex is started, the convars are set, and each package id in Config.TebexPackages matches the identifier on your Tebex store.