Documentação

Documentação do Core Skin (3 in 1)

Barbearia, estúdio de tatuagem e loja de roupas num único resource FiveM. 1615 tatuagens, todos os componentes e props de roupa, a cabeça e a pele por inteiro, espalhados por 36 lojas. Uma interface, uma câmera, um fluxo de compra, e uma coisa só para instalar em ESX, QBCore, vRP ou standalone.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

Instalação

  1. Coloque o resource

    Baixe o script pela sua conta Tebex, copie a pasta para o seu diretório de resources e adicione ensure avenida_core_skin na config do servidor, depois de ensure oxmysql. Mantenha o nome da pasta do jeito que vem, é ele que dá nome ao resource.

  2. Rode o SQL, a seção [A] inteira

    A seção [A] tem todas as tabelas do resource, incluindo o registro de roupas pagas. As seções [B], [C] e [D] são condicionais e o arquivo diz quando cada uma se aplica. A [D] é a dos itens de inventário, só necessária se você ligar Config.Clothes.GiveAsItems, e é a que todo mundo esquece.

  3. Escolha seus módulos

    Abra config/config.lua e ajuste Config.Modules. Um módulo em false não custa nada: sem blip, sem ponto de interação, sem thread, e a config dele simplesmente nunca é lida. Aproveite para conferir Config.Locale.

  4. Dê as permissões de admin

    Adicione add_ace group.admin avenida_skin.admin allow e add_ace group.admin avenida_skin.vip allow. A primeira abre o editor de catálogo no jogo, a segunda libera o que você colocar atrás da lista VIP.

  5. Verifique as integrações

    Coloque Config.Debug = true, reinicie e leia o console: uma linha por categoria de bridge nomeia o alvo escolhido. Volte para false quando as linhas baterem com o seu servidor, e lembre que ele só controla os logs, o editor tem a própria flag.

02

Configuração

Rodar só as lojas que você precisa

Os três módulos são independentes. Um servidor que já tem uma loja de roupas que curte fica com a barbearia e o estúdio de tatuagem, e nada do módulo desligado roda.

lua
-- config/config.lua
Config.Modules = {
    Barber  = true,
    Tattoo  = true,
    Clothes = false,   -- no blip, no point, no thread
}

Config.Locale = 'en'

Config.Framework = 'auto'   -- 'qbcore' | 'esx' | 'vrp' | 'standalone' | 'custom'
Config.Notif     = 'auto'
Config.Interact  = 'auto'
Config.Clothing  = 'auto'
03

Exports

Client

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

    A hairbase que está no ped. O pacote roda as três lojas em um único slot de decoração, então é o único lugar de onde ler isso, seja qual for a última loja que o jogador visitou.

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

    As tatuagens que estão no ped agora. Como a barbearia, a tinta e o guarda-roupa dividem aqui um registro só, você recebe uma lista só em vez de ter que consultar três resources.

Server

  • GetBagStorage
    exports['avenida_skin']:GetBagStorage(sex, drawable) --> { weight, slots } | nil

    Quanto vale um drawable de mochila em peso e slots, lido da configuração do guarda-roupa. Retorna nil para um drawable que não está declarado como bolsa.

04

Receitas

Precificar uma seção de roupas de três jeitos diferentes

Cada loja declara as próprias seções, e cada seção declara o próprio modo de preço. Uma taxa fixa para a seção inteira, um multiplicador que encarece os drawables seguintes, ou uma tabela quando só algumas peças merecem preço próprio.

lua
-- config/clothes_shops.lua
categories = {
    tops = {
        enabled = true,
        price   = { mode = 'fixed', base = 300 },
    },
    pants = {
        enabled = true,
        -- price = base + index * mult
        price   = { mode = 'multiplier', base = 100, mult = 2 },
    },
    mask = {
        enabled = true,
        price   = { mode = 'table', map = { [12] = 900, [45] = 1500 } },
    },
}

Deixar as coleções antigas baratas e as raras caras

Uma taxa fixa cobre os 1615 desenhos, e um multiplicador por coleção de DLC faz o resto, então você nunca precifica um catálogo na unha. A remoção a laser mantém a própria taxa e nunca é multiplicada.

lua
-- config/tattoo.lua
Config.Tattoo.Prices = {
    flat  = 1000,
    reset = 3000,   -- laser removal, per tattoo removed
}

Config.Tattoo.CollectionMultipliers = {
    multiplayer_overlays = 0.80,   -- base game, cheaper
    mpHipster_overlays   = 0.85,
    -- anything not listed stays at 1.0
}

Ajustar o ângulo de câmera das cenas de barbearia e tatuagem

A câmera gira em torno da cabeça, então os mesmos valores de altura servem em pé ou sentado. A iluminação e a profundidade de campo são o que faz o personagem virar o assunto da cena, e não um ped num cômodo escuro.

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

Config.UI = {
    Tutorial          = true,
    Timecycle         = 'casino_brightroom',
    TimecycleFadeMs   = 400,
    DofStrength       = 0.1,
}

Esconder o seu HUD enquanto uma loja está aberta

O resource dispara um evento de client ao abrir e fechar um menu, para os três módulos. Escute esse evento em vez de ficar checando num loop, é o mesmo sinal que o tratamento interno de HUD usa.

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

Perguntas

Compro o pacote ou os três resources separados?

O pacote se você quer os três: custa menos e é uma coisa só para instalar e atualizar. Os resources separados se você só precisa de um ou dois, ou se você já tem uma loja de roupas que curte. O que nunca dá é rodar o pacote e os separados ao mesmo tempo: cada um colocaria o próprio blip e escreveria a própria cópia do mesmo personagem. O resource detecta a sobreposição e avisa no console no start.

Só quero a barbearia e o estúdio de tatuagem

Coloque Config.Clothes = false em Config.Modules. Um módulo desligado não registra nada: sem blip, sem ponto de interação, sem thread, e a config dele simplesmente nunca é lida. Você também pode comprar os dois resources separados, a diferença é de preço, não do que roda.

O pacote mantém a aparência atual dos meus jogadores?

Mantém. Ele lê e escreve o mesmo formato de personagem que os resources separados e passa pelo mesmo bridge de aparência, então qb-clothing, illenium-appearance, fivem-appearance, esx_skin ou a tabela do próprio resource continuam funcionando. Os personagens que já existem são inicializados com o que estão vestindo, inclusive para o registro de propriedade das roupas.

Quais frameworks ele realmente suporta?

QBCore, ESX e vRP, mais um modo standalone que não precisa de framework nenhum e um caminho custom em bridges/framework.lua para qualquer outro caso. A detecção roda no start e testa o export real. Qbox e ox_core não têm caminho dedicado: eles passam pelo caminho standalone ou custom, não por um alvo testado.

Funciona com a stack ox?

Funciona, onde importa: ox_lib para as notificações, ox_target para o prompt de interação, ox_inventory para as roupas em itens e os containers de mochila, e o oxmysql como única dependência de verdade. Fora ele, nada disso é obrigatório.

O que o vRP me custa?

O vRP salva componentes de roupa e props, e nada mais. Ele não tem campo para overlays de cabeça, traços do rosto, cor de cabelo, cor de olhos nem decorações de ped, então no vRP o personagem inteiro fica na tabela do próprio resource. O vRP continua recebendo a parte de roupas, atualizada depois de cada mudança. vRP 2 e vRP 0.5 não são suportados, e o resource avisa no console.

Um jogador diz que perdeu roupas que tinha

Confira o Config.Clothes.RequireOwnership. O registro inicializa um personagem com o que ele já está vestindo na primeira vez que o vê, então ligar isso não tira o guarda-roupa de ninguém. O que ele recusa é uma escrita para uma peça sem compra por trás, que é justamente o que um client adulterado manda.

Quanto custa quando não tem ninguém na loja?

0.00ms. Os pontos de interação compartilham uma thread que passa a rodar de segundo em segundo quando não tem ninguém por perto, os blips são criados uma vez, e toda thread de sessão morre na saída. Um módulo desligado não custa nada, já que nenhuma linha dele roda.

Carrinho
Spirit RP
Discord