Documentación

Documentación de Barber shop

Una barbería puesta en escena, con una cámara que el jugador controla de verdad. El personaje entra, se sienta y el barbero se pone a trabajar mientras una cámara orbital encuadra la cabeza. Pelo, barba, overlays y todos los detalles de piel, con vista previa en directo antes de gastar un solo dólar.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

Instalación

  1. Coloca el recurso

    Descarga el script desde tu cuenta Tebex, copia la carpeta avenida_barber/ en tu directorio de recursos y añade ensure avenida_barber a la config del servidor, después de ensure oxmysql.

  2. Ejecuta el SQL

    Ejecuta la sección [A] de INSTALL.sql en tu base de datos. La sección [B] es condicional, la cabecera del archivo dice cuándo la necesitas.

  3. Revisa la config

    Abre config/config.lua. Los valores por defecto funcionan en la mayoría de servidores, y la única línea que conviene mirar es Config.Locale. Los precios, las tiendas y el comportamiento de la silla están en el archivo de al lado, config/barber.lua.

  4. Verifica las integraciones

    Pon Config.Debug = true, reinicia y lee la consola: una línea por categoría de bridge nombra el target elegido. Ponlo de nuevo en false cuando las líneas coincidan con tu servidor, porque los comandos de diagnóstico que desbloquea provocan un tirón.

  5. Date permisos de admin

    Añade add_ace group.admin avenida_barber.admin allow a la config del servidor y luego lanza /avenida_barber_check en juego para el informe completo.

02

Configuración

Forzar una integración en vez de detectarla

La detección automática cubre la mayoría de servidores, y sondea el export real en lugar del estado del recurso. En un stack a medida, fuerza el target y la detección se salta por completo.

lua
-- config/config.lua
Config.Locale    = 'en'
Config.UseOxLib  = true

Config.Framework = 'auto'   -- 'qbcore' | 'esx' | 'vrp' | 'standalone' | 'custom'
Config.Notif     = 'ox_lib' -- 'qbcore' | 'esx' | 'ox_lib' | 'okok' | 'vrp' | 'chat' | 'custom'
Config.Interact  = 'auto'   -- 'avenida' | 'ox_target' | 'qb-target' | 'standalone' | 'custom'
Config.Clothing  = 'auto'   -- 'qb' | 'illenium' | 'fivem-appearance' | 'esx_skin' | 'vrp' | 'table' | 'custom'

Config.Camera = {
    Sensitivity = 1.0,      -- rotation, zoom and height, clamped to 0.1 - 5.0
    InvertY     = false,
}
03

Exports

Client

  • GetHairbase
    exports['avenida_barber']:GetHairbase() --> { c = collection, t = nameHash } | nil

    La hair base que lleva el ped ahora mismo, o nil cuando el corte no necesita ninguna. Léela antes de llamar a ClearPedDecorations y devuélvela después, así el pelo conserva su sombreado en vez de quedarse como un gorro plano.

  • GetTattoos
    exports['avenida_barber']:GetTattoos() --> { { c, t }, ... }

    Todos los tatuajes que este recurso mantiene en el ped. La barbería comparte la única ranura de decoraciones con la tinta, así que un redibujado que se olvide de esta lista borra tatuajes que el jugador ha pagado.

  • GetSkinData
    exports['avenida_barber']:GetSkinData()

    El personaje tal y como lo guarda la barbería en memoria, con el pelo, la barba, las cejas y sus colores. Útil para guardar el look antes de que un uniforme de trabajo tome el control.

  • ApplySkin
    exports['avenida_barber']:ApplySkin(data, ped)

    Aplica una apariencia completa a un ped. Pásale el ped que quieres vestir, que puede ser un clon de vista previa en vez del jugador, para que un espejo o un selector de personaje muestren la misma cara.

  • ApplyClothing
    exports['avenida_barber']:ApplyClothing(data, ped, temporary)

    Aplica solo la parte de ropa y deja intactos la cara y el pelo. Pon temporary en true para un conjunto que no debe guardarse en la base de datos, como un uniforme de prisión o un disfraz.

04

Recetas

Ajustar la cámara y el aspecto de la escena

La cámara pivota sobre la cabeza, así que los mismos valores de altura sirven igual de pie que sentado. Una altura negativa va bajando por el cuerpo. La iluminación y la profundidad de campo son lo que hace que el personaje se lea como el sujeto del plano y no como un ped en una habitación a oscuras.

lua
-- config/config.lua
Config.Camera = {
    Sensitivity = 1.4,          -- faster drag
    InvertY     = true,
}

Config.UI = {
    Tutorial          = true,   -- first-run tour, replayable from the toolbar
    Sounds            = true,
    Blips             = true,

    Timecycle         = 'casino_brightroom',
    TimecycleStrength = 1.0,
    TimecycleFadeMs   = 400,    -- 0 makes it snap like a light switch

    DofStrength       = 0.1,    -- false drops the per-frame SetUseHiDof call
    DofPlanes         = { 0.4, 0.7, 2.2, 4.5 },
}

Añadir una tienda, o quitar la puesta en escena

Las tiendas viven en un archivo abierto, una entrada cada una, con su propio ped de barbero y sus propios precios. Apagar la escena de la silla conserva la cámara y el menú, y lo único que se salta es la entrada andando.

lua
-- config/barber.lua
Config.Barber.ChairScene = false   -- menu opens on the spot

Config.Barber.Shops[9] = {
    BarberPedModel = 's_m_m_hairdress_01',
    Welcome        = vec3(-1282.60, -1116.60, 6.99),
    Blip           = { sprite = 71, color = 4, scale = 0.7 },
}

Redibujar decoraciones desde tu propio script

El ped tiene una sola ranura de decoraciones para todo el servidor. Si tu script llama a ClearPedDecorations, lee antes lo que es de este recurso y devuélvelo después, o borrarás la hair base.

lua
local hairbase = exports['avenida_barber']:GetHairbase()
local tattoos  = exports['avenida_barber']:GetTattoos()

ClearPedDecorations(PlayerPedId())
-- your own decoration work here

if hairbase then
    AddPedDecorationFromHashes(PlayerPedId(), hairbase.c, hairbase.t)
end
for _, dec in ipairs(tattoos) do
    AddPedDecorationFromHashes(PlayerPedId(), dec.c, dec.t)
end

Ocultar tu HUD mientras hay una tienda abierta

El recurso dispara un evento de cliente al abrir y al cerrar un menú. Engánchate a él en vez de sondear, es la misma señal que usa la gestión interna del HUD.

lua
AddEventHandler('avenida_barber:client:uiStateChanged', function(hidden)
    if hidden then
        exports['myhud']:hide()
    else
        exports['myhud']:show()
    end
end)
05

Preguntas

¿Qué frameworks soporta realmente?

QBCore, ESX y vRP, más un modo standalone que no necesita framework alguno y una rama custom en bridges/framework.lua para cualquier otra cosa. La detección se hace al arrancar y sondea el export real. Qbox y ox_core no tienen rama dedicada: pasan por la vía standalone o custom, no por un target probado.

¿Qué me cuesta vRP?

vRP guarda componentes de ropa y props, nada más. No tiene ningún campo para overlays de cabeza, rasgos faciales, color de pelo, color de ojos ni decoraciones de ped, así que en vRP el personaje entero se guarda en la tabla propia de este recurso. La parte de ropa sí sigue llegando a vRP, y se refresca justo después de cada cambio. Consecuencia práctica: un skinshop nativo de vRP no mostrará el trabajo del barbero, porque vRP no tiene dónde guardarlo. vRP 2 y vRP 0.5 no están soportados, y el recurso lo dice en consola en vez de comportarse mal en silencio.

¿Funciona con el stack ox?

Sí, en todo lo que importa: ox_lib para las notificaciones vía Config.UseOxLib, ox_target para el prompt de interacción, ox_inventory para los items de ropa, y oxmysql como única dependencia dura. Nada de eso es obligatorio salvo oxmysql, y bridges/compat.lua aporta los fallbacks nativos cuando ox_lib está apagado. Lo que no tiene rama dedicada es ox_core como framework: en un servidor ox_core el recurso funciona en standalone, o pasa por la rama custom de bridges/framework.lua si quieres que lea los datos de tus jugadores.

¿Puedo usarlo junto a avenida_tattoo y avenida_clotheshops?

Sí, están hechos para eso. Cada uno se ocupa de su mitad de la única ranura de decoraciones del ped y vuelve a poner lo de los otros tras cada redibujado. Lo que no debes hacer es usar los recursos sueltos y el pack avenida_skin a la vez: cada uno pondría su blip y escribiría su copia del mismo personaje. El recurso detecta el solape y lo dice en consola al arrancar.

Falta un peinado en la lista

Las hair bases se filtran según el build del juego. Un estilo que tu cliente no puede renderizar no se lista nunca, y es a propósito, porque listarlo le mostraría al jugador una opción que sale rota. Lanza /avenida_barber_check para ver el build que trae realmente tu servidor.

La cabeza no sigue mi cursor

El seguimiento de la cabeza está ligado a una sesión de cámara orbital: el hilo arranca con la cámara y se detiene con ella. Además necesita foco NUI, porque lee el cursor con GetNuiCursorPosition. Si otro recurso se ha quedado con la cámara, el seguimiento se mantiene apagado a propósito.

¿Puedo añadir otro idioma?

Quince vienen ya rellenados, en la carpeta abierta locales/. Copia un archivo, traduce los valores y apunta Config.Locale a tu nuevo código. en.lua es el fallback de cualquier clave que dejes fuera, así que un archivo parcial nunca muestra una etiqueta vacía.

¿Cuánto cuesta cuando no hay nadie en la tienda?

0.00ms. Los puntos de interacción comparten un hilo que baja a un segundo cuando no hay nadie cerca, los blips se crean una vez, y cada hilo de sesión muere al salir. Entre dos cortes no se ejecuta nada.

Carrito
Spirit RP
Discord