[PAID][ESX/QB] vms_tattooshop - ADVANCED TATTOO SHOPS, MANAGEMENT BY PLAYERS & MANAGEMENT BY NPCS

[ESX & QB-Core Compatibility] 20€ + TAX
[OPEN SOURCE] 33€ + TAX

[SHOWCASE] vms_tattooshop


Possibility to add your own custom tattoos.

By default, we made 11 add-on face tattoos because there are few in GTA.

If you want to make new add-on tattoos, no problem it is very easy and in addition, we wrote a detailed step-by-step documentation on how to make such!

ADD-ON TATTOOS - docs.vames-store.com


Features:

Compatibility with ESX and QB-Core
Compatibility with esx_skin / qb-clothing / fivem-appearance / illenium-appearance
Pretty UI design.
Tattoo Artist job to be set in config, many players can have their own tattoo studio, but this does not exclude the possibility of setting another tattoo studio for NPCs.
Price separately for each tattoos.
Advanced tattoo includes the ability to configure how many tattooshops are be companies of the players and how many by NPCs at one time!
Script easy to configure.
Camera switching between tattoo.
Compatibility with Onesync & OneSync Infinity.
0.00ms resmon outside the interiors.
0.03ms resmon in the course of using the tattoo menu.
Ability to set custom tattoos names in config. (The default is made to detect the language of your game.)
Ability to set TextUI (my free TextUI here)
Full JS, Lua translation.
Full support.

Config.lua:

Config = {}
Config.DistanceView = 8 -- Distance the marker will be visible
Config.DistanceAccess = 1.1 -- The distance in which it will be possible to take a seat by pressing the E key


-- █▀ █▀▄ ▄▀▄ █▄ ▄█ ██▀ █   █ ▄▀▄ █▀▄ █▄▀
-- █▀ █▀▄ █▀█ █ ▀ █ █▄▄ ▀▄▀▄▀ ▀▄▀ █▀▄ █ █

Config.Core = "ESX" -- "ESX" or "QB-Core"
Config.CoreDefine = ""
-- @Config.CoreDefine - If you are using old ESX which is defined by the esx:getSharedObject trigger, enter it here but if you are using ESX Legacy or QB-Core, leave the "" and the script will complete the export itself to define the core
Config.CoreExport = function()
	return exports['es_extended']:getSharedObject()
	-- return exports['qb-core']:GetCoreObject()
end

Config.PlayerLoaded = 'esx:playerLoaded' -- its a trigger to load players tattoos
	-- ESX: "esx:playerLoaded"
	-- QBCore: "QBCore:Client:OnPlayerLoaded"

Config.PlayerLogout = 'esx:onPlayerLogout' -- its a trigger to unload players tattoos
	-- ESX: "esx:onPlayerLogout"
	-- QBCore: "QBCore:Client:OnPlayerUnload"

Config.JobUpdated = 'esx:setJob' -- its a trigger to check players job
	-- ESX: "esx:setJob"
	-- QBCore: "QBCore:Client:OnJobUpdate"


-- @ Config.SkinManager for ESX = "" -- you don't need to fill anything if you use "esx_skin" / "fivem-appearance" / "illenium-appearance" for ESX
-- @ Config.SkinManager for QB-Core = "qb-clothing" / "fivem-appearance" / "illenium-appearance"
Config.SkinManager = ""

Config.LiesAnims = {
    frontAnimDict = "amb@world_human_sunbathe@male@front@base",
    frontAnim = "base",
    backAnimDict = "switch@trevor@annoys_sunbathers",
    backAnim = "trev_annoys_sunbathers_loop_girl",
}

Config.StartingCam = {vec(.0, -.2, 0.4), vec(.0, -.205, -0.6)}

Config.Notification = function(message, time, type)
    if type == "success" then
        exports["vms_notify"]:Notification("TATTOO SHOP", message, time, "#27FF09", "fa-solid fa-pen-nib")
		-- ESX.ShowNotification(message)
		-- QBCore.Functions.Notify(message, "success", 5000)
    elseif type == "error" then
        exports["vms_notify"]:Notification("TATTOO SHOP", message, time, "#FF0909", "fa-solid fa-pen-nib")
		-- ESX.ShowNotification(message)
		-- QBCore.Functions.Notify(message, "error", 5000)
    end
end

Config.TextUI_Enabled = false
Config.TextUI_Open = function(msg)
    exports["interact"]:Open("E", msg) -- Here you can use your TextUI or use my free one - https://github.com/vames-dev/interact
end
Config.TextUI_Close = function()
    exports["interact"]:Close() -- Here you can use your TextUI or use my free one - https://github.com/vames-dev/interact
end

Config.Blip = {
    ["Sprite"] = 75,
    ["Scale"] = 0.75,
    ["Color"] = 1,
    ["Display"] = 4
}

Config.Tattooshops = {
    {
        business = false, -- If you want the player to be a tattoo shop employee set true
        ownerJob = "", -- If business is on true, here you must specify the work that has in this salon to manage
        pedModel = nil, -- If business is on false you can add a ped who will take care of the customer (only stands, for attractiveness and realism). If you set nil, the peda will not be.
        pedHeadingToChair = 197.46, -- Heading a player who will lie on his stomach
		pedHeadingToChairBack = 22.31, -- Heading a player who will be lying on his back
        position = vector3(1323.27, -1652.07, 51.28), -- Blip coordinates
        tattooPedSpawnPos = vector4(1327.66, -1654.03, 51.28, 42.35), -- If you have set pedModel here are the coords in which the ped spawns and goes to the player
        takeSitMarker = {
            FreeColor = {235, 235, 235, 125}, -- RGBA color, if the seat is free
            BusyColor = {128, 0, 31, 110}, -- RGBA color, if the seat is busy
        },
        Chairs = {
            [1] = {
                position = vector3(1320.64, -1653.94, 51.28), -- Marker coordinate to take a seat
                tattooerPos = vector4(1321.84, -1654.83, 51.28, 143.44), -- Coordinates of the ped or employee in which he will stand to tattoo the customer
                chair_coord = vector4(1321.13, -1655.12, 51.9, 22.31), -- Seat coordinates
                busy = false, -- DO NOT CHANGE IT
            },
        }
    },
}

Config.ClothesOff = {
	-- ESX Clothes:
	["male"] = {
		sex 	 = 0,
    	arms     = 15,
    	tshirt_1 = 15, 	tshirt_2 = 0,
    	torso_1  = 91, 	torso_2  = 0,
    	pants_1  = 14, 	pants_2  = 0,
    	shoes_1  = 34, 	shoes_2  = 0,
	},
	["female"] = {
		sex 	 = 1,
    	arms     = 15,
    	tshirt_1 = 34, 	tshirt_2 = 0,
    	torso_1  = 101, torso_2  = 1,
    	pants_1  = 16, 	pants_2  = 0,
    	shoes_1  = 0, 	shoes_2  = 0,
	},
	-- QBCore Clothes:
	-- ["male"] = {
		-- outfitData = {
			-- ['t-shirt'] = {item = 15, texture = 0},
			-- ['torso2'] = {item = 91, texture = 0},
			-- ['arms'] = {item = 19, texture = 0},
			-- ['pants'] = {item = 14, texture = 0},
			-- ['shoes'] = {item = 1, texture = 0},
			-- ['hat'] = {item = -1, texture = -1},
			-- ['glass'] = {item = 0, texture = 0},
			-- ['mask'] = {item = 0, texture = 0}
		-- }
	-- },
	-- ["female"] = {
		-- outfitData ={
			-- ['t-shirt'] = {item = 34, texture = 0},
			-- ['torso2'] = {item = 101, texture = 1},
			-- ['arms'] = {item = 0, texture = 0},
			-- ['pants'] = {item = 16, texture = 0},
			-- ['shoes'] = {item = 1, texture = 0},
			-- ['hat'] = {item = -1, texture = -1},
			-- ['glass'] = {item = 0, texture = 0},
			-- ['mask'] = {item = 0, texture = 0}
		-- }
	-- }
}

Config.Lang = "EN"
Config.Translate = {
    ["EN"] = {
        ["tattoo_blip"] = "Tattoo Shop",
        ["take_a_sit"] = "Lie down", -- if textui is disabled then you will use ESX.ShowHelpNotification, set this: "Press ~INPUT_CONTEXT~ to take a sit"
        ["get_up"] = "Press ~INPUT_VEH_DUCK~ to get up",
        ["open_tattooshop"] = "Take care of the customer", -- if textui is disabled then you will use ESX.ShowHelpNotification, set this: "Press ~INPUT_CONTEXT~ to open menu"
        ["paid"] = "You paid %s$ for tattoo.",
        ["nomoney"] = "You don't have enough money.",
        ["started_tattooing"] = "The tattoo artist started tattooing you.",
		["removing_tattooing"] = "Tattoo has been removed from your skin.",
    },
    ["PL"] = {
        ["tattoo_blip"] = "Salon tatuaży",
        ["take_a_sit"] = "Połóż się", -- if textui is disabled then you will use ESX.ShowHelpNotification, set this:      "Press ~INPUT_CONTEXT~ to take a sit"
        ["get_up"] = "Naciśnij ~INPUT_VEH_DUCK~ aby wstać",
        ["open_tattooshop"] = "Klient", -- if textui is disabled then you will use ESX.ShowHelpNotification, set this:      "Press ~INPUT_CONTEXT~ to open menu"
        ["paid"] = "Zapłacono %s$ za tatuaż.",
        ["nomoney"] = "Nie posiadasz wystarczająco pieniędzy.",
		["started_tattooing"] = "Tatuażysta wytatuował Ci nowy wzór.",
		["removing_tattooing"] = "Tatuażysta usunął tatuaż z Twojej skóry.",
    },
}

Config.TattooList = {
   >> Here are sorted tattoos into categories but there are a lot of them so I don't put them here
}

If you decide to purchase the script, I encourage you to join on the discord, to keep up to date with updates.

:anger: You can check my others scripts :anger:
vms_barber
vms_bank
vms_pausemenu
vms_skydiving
vms_races
vms_drivingschool
vms_boatschool
vms_flyingschool
vms_notify
vms_shops
vms_redeem
vms_garage
vms_jobcenter
vms_subway
interact

Code is accessible Yes/No
Subscription-based No
Lines (approximately) +750 lua
Requirements ESX / QBCore
Support Yes
6 Likes

This looks amazing. Probably the best looking tattooing system I have seen, in a long while. Only suggestion… progress bars with animations/prop for putting the tattoos on, when you select them. Slow the experience down and creates more emersion for those interacting with it.

Hi, thank you :blush:.
I have it planned to add exactly what you wrote but in gta there is no tattoo pen machine prop and I couldn’t find the right animation for it but in the coming days I will try to do it. :saluting_face:

compatible with rcore_tattoos ? or can add custom addon tattoos ?

Hi, it is not compatible with rcore, yes you can add custom tattoos, tutorial on how to add custom tattoo is available on our documentation

local prop_name = “v_ilev_ta_tatgun”
Jointsupp = CreateObject(GetHashKey(prop_name), x, y, z, true, true, true)
AttachEntityToEntity(Jointsupp, ped, GetPedBoneIndex(ped, 28422), -0.0, 0.03, 0, 0, -270.0, -20.0, true, true, false, true, 1, true)
TaskPlayAnim(ped, “random@shop_tattoo”, “artist_artist_finishes_up_his_tattoo”, 8.00, -8.00, -1, (2 + 16 + 32), 0.00, 0, 0, 0) --player_artist_finishes_up_his_tattoo

1 Like

Oh men, great, thank for searching a prop and animation. I will definitely use this in a future update! :heart:

:computer: UPDATE 1.0.2

[+] Added new custom tattoos (on image)
[+] Added hair overlay around the head (Category: 12)
[+] A new tattoo parlor has been coordinated

anyone know how to set this up using gabz’s tattoo parlors?

unfortunately this is not possible because gabz only made seats for sitting and not for lying down

Hey Im having diffcult time with script error: @vms_tattooshop/client/client.lua:136: attempt to call a nil value (Field "ShowHelpNotification) can you please help with this im running this on Qbcore

Hi, set Config.Core = "QBCore" in the config

Hi mate 2 questions is this compatible with illenium-appearence and how come when i do /reloadskin it deletes my tattoos until i relog?

hi, remove ClearPedDecorations native from /reloadskin command, currently not compatible with illenium-appearance

Will it be compatible with illenium in the future? I really hope so

yes i think it will be compatible

:computer: UPDATE 1.0.3

[/] Fixed an issue with ESX skinchanger tattoos not loading
[+] Added Config.CoreExport to define core by custom export name
[+] Added Config.PlayerLogout to remove all tattoos from character

:computer: UPDATE 1.0.5

[/] Supporting for illenium-appearance
[/] Changed Config.SkinMenu to Config.SkinManager
[/] Changed name of Config.Core from “QBCore” to “QB-Core”
[/] Changed name of Config.SkinManager from “qb-clothes” to “qb-clothing”

:computer: UPDATE 1.0.6

[+] Added bossMenuPos and bossMenuGrades option to Config.Tattooshops
[+] Added function Config.BossMenu - by default for esx_society and qb-management
[+] Added Config.Markers
[+] Added Config.UseTattooMachineRequired & Config.TattooMachineItem - you can require employees to have a tattoo machine to do new tattoo
[+] Added Config.UseTattooLaserRemoverRequired & Config.TattooLaserRemoverItem - you can require employees to have a tattoo laser remover to remove tattoo
[+] Added Config.UseTattooInkRequired & Config.TattooInkItem & Config.RemoveTattooInk - you can require employees to have a tattoo ink and whether the ink is to be taken away after the tattoo is done
[/] Changed from busy to taken in each file and changed trigger "...:setBusyChair" to "...:takeChair"
[+] Added forFemaleAlso option to Config.TattooList - this detects the gender of the player and tells the UI not to load tattoos that are forFemaleAlso = false when the client is female, in gta female tattoos work on a man but on a woman not every male tattoo works

:computer: UPDATE 1.0.7

[/] Improved grade checking for employees
[/] Fixed a bug with the ability to sit on an occupied seat