Comandos#
Tattoo Creator registra unos pocos comandos en el juego y dos diagnósticos. Los del juego respetan los permisos; los diagnósticos existen para explicar lo que el script está viendo. Los tres primeros nombres son ajustes (Settings → Commands), y un comando renombrado se aplica tras un reinicio.
Comando | Quién | Descripción |
|---|---|---|
| Admins | Abre el panel de administración: estudios, moderación, jugadores y configuración. |
Comando del estudio | Admins | Desactivado por defecto. Ponle un nombre y abre el estudio en cualquier lugar, sobre tu propio personaje. |
| Artistas | Invita al jugador más cercano al puesto de tatuaje del estudio en el que estás — la alternativa apta para atajos de teclado a caminar hasta el puesto. |
| Admins | Abre el panel de ajuste de ubicación: dónde aparecen los diseños nuevos y dónde está cada punto rápido. Consulta Uso. |
| Consola · admins | Un bloque por estudio: abierto o cerrado, nivel, propietario, el puesto de tatuaje, personal de servicio, caja, nivel de precios, comisión, suministros — y una línea que indica qué le impide funcionar. |
| Cualquiera, F8 | Recorre toda la cadena que muestra los tatuajes en este cliente y termina con lo que falla, o nothing wrong on this client. |
tattoo_shop termina cada estudio con una línea que indica exactamente qué le falta:
no studio area (nothing will spawn)no tattoo spot placedno owner (nobody can open the management menu)no staff with canTattoonobody clocked in (management menu -> clock in)no management point (falls back to the NPC)no supply point (deliveries cannot be collected)
Exports de cliente#
Para abrir el estudio desde tus propios scripts y mantener los tatuajes puestos cuando tu propio código reconstruye un personaje.
El estudio
exports['qs-tattoo-creator']:OpenStudio(shopId) -- open a studio's tattoo menu for this player
local open = exports['qs-tattoo-creator']:IsStudioOpen()El servidor sigue aplicando todas las comprobaciones que haría en el NPC: el estudio debe estar abierto, el autoservicio activado y el jugador lo bastante cerca.
Los tatuajes del propio jugador
-- your script just cleared decorations or rebuilt the ped: put the tattoos back now
exports['qs-tattoo-creator']:ReapplyTattoos()
-- what this player is wearing
local tattoos = exports['qs-tattoo-creator']:GetOwnTattoos()Exports de servidor#
Cómo otro recurso lee los tatuajes, gestiona el personal y el dinero de un estudio, o lleva a cabo una sesión de tatuaje en un lugar propio. Las partes del cuerpo se llaman head, torso, left_arm, right_arm, left_leg y right_leg.
Tatuajes
-- every body part of this player, with the tattoos on it
local zones = exports['qs-tattoo-creator']:GetPlayerTattoos(source)
-- clear one body part (a hospital, a prison intake, a skin graft)
local ok = exports['qs-tattoo-creator']:WipePlayerZone(source, 'left_arm')Un borrado se aplica de inmediato para todos los que rodean al jugador.
Estudios, personal y dinero
local studios = exports['qs-tattoo-creator']:GetShops()
local staff = exports['qs-tattoo-creator']:GetShopWorkers(shopId)
local works = exports['qs-tattoo-creator']:IsShopWorker(source, shopId) -- shopId optional: any studio
local artist = exports['qs-tattoo-creator']:IsArtist(source) -- allowed to tattoo right now
-- hire straight onto a studio's staff; rankId optional, the lowest rank otherwise
local ok, err = exports['qs-tattoo-creator']:HireShopWorker(shopId, source, rankId)
local balance = exports['qs-tattoo-creator']:GetShopBalance(shopId)
-- move money in or out of a till; a negative amount withdraws, and only if the till holds it
local ok, newBalance = exports['qs-tattoo-creator']:AddShopMoney(shopId, -500, 'Health inspection fine')Cada movimiento hecho a través de AddShopMoney aparece en la pestaña Activity del estudio como un depósito o un gasto.
El catálogo
local state = exports['qs-tattoo-creator']:GetPublishState()
-- publish the catalog now. Restarts qs-tattoo-data: empty server only
exports['qs-tattoo-creator']:ForcePublish('maintenance')Llevar a cabo una sesión en tu propio lugar
Un salón de belleza, una prisión o un script de trabajo puede llevar a cabo una sesión de artista completa en una silla propia — misma invitación, misma vista en directo, misma tinta — manteniendo sus propias reglas de empleo y su propio dinero. Tu recurso decide si el artista puede trabajar allí y recibe el pago:
local result = exports['qs-tattoo-creator']:StartSession(artistSource, customerSource, {
resource = GetCurrentResourceName(), -- must be started: it receives the payment
id = stationId, -- your own id for this chair
label = 'Vanilla Unicorn Salon', -- shown to the customer in the invitation
multiplier = 1, -- price factor: 1 = the standard price list
})
if not result.ok then print(result.error) end
-- called once for each body part that is finished
exports('VenuePayout', function(id, artistSource, customerPid, total, meta)
-- the customer has already paid total. Pay the artist, keep the rest
local artistShare = math.floor(total * 0.30)
return artistShare, total - artistShare
end)
-- the session is over: free your chair
exports('VenueRelease', function(id, artistSource) end)Una sesión de local omite las comprobaciones propias del estudio — lista de personal, servicio, suministros — porque tu recurso ya ha tomado esas decisiones. Un chair opcional con coords (y prop y label opcionales) indica el punto al que se mueve al cliente cuando Move the customer está activado. Usa IsInSession(source) para rechazar una segunda sesión para alguien que ya está en una.
State bags y eventos#
Nombre | Tipo | Qué es |
|---|---|---|
| State bag del jugador | Las partes del cuerpo en las que un jugador lleva tinta. Cambia cada vez que se compra, cambia o quita un tatuaje — obsérvalo con |
| State bag del jugador | true mientras el jugador puede tatuar — en el personal con permiso para ello, y de servicio cuando se requiere. |
| Evento de cliente | Muestra una notificación con el estilo de la interfaz de tatuajes: |
| Evento de cliente local | Se dispara cada vez que el cliente recibe la configuración del servidor — al entrar y después de cada guardado. |
Sobre los errores#
Cada rechazo es una clave de locale en lugar de una frase — no_supplies, shop_closed, too_far — así que el mismo fallo se lee en el idioma de cada jugador. Las claves están bajo errors en locales/*.json, y Errores comunes explica los que es más probable que encuentres.



