Cómo funcionan las integraciones#
Nada dentro de Weapon Skin Creator sabe qué framework, inventario o target usas. Cada uno está detrás de un pequeño archivo puente sin cifrar, y el correcto se elige al iniciar según lo que ya está en ejecución.
Capa | Compatibles | Sin ella |
|---|---|---|
Framework | es_extended · qb-core · qbx_core | Standalone: los jugadores se identifican por su licencia y no se cobra nada. |
Inventario | ox_inventory · qs-inventory | Las skins pertenecen al tipo de arma, no a un arma concreta. |
Target | ox_target · qtarget · qb-target | Las tiendas, el banco de trabajo y las cajas de suministros usan un aviso en pantalla y una tecla. |
Avisos | qs-textui | Text UI de ox_lib y texto 3D nativo. |
Progreso y HUD | qs-interface | Círculo de progreso de ox_lib; en el estudio solo se oculta el radar. |
Apariencia | qs-appearance · illenium-appearance · fivem-appearance · esx_skin | Solo se usa para restaurar el ped de cada jugador tras una actualización de armas addon en vivo. |
Base de datos | oxmysql | Obligatoria. |
Cada integración opcional se desactiva en silencio. Un recurso que falta hace que su función se retire en lugar de dar error. Las tiendas no tienen trabajo del framework ni cuenta de sociedad — su dinero está en su propia caja — así que no hay ninguna integración bancaria que configurar.
Frameworks#
Cada framework tiene un puente en custom/<framework>/server.lua y client.lua. Decide quién es un jugador, cómo se mueve el dinero y quién es admin.
Framework | Identificador del jugador | Admin | Dinero |
|---|---|---|---|
ESX | identifier | Grupo en | Cuentas por nombre: money, bank, black_money… |
QBCore / Qbox | citizenid | permiso god o admin, o el ace del comando | money se paga como cash; bank, crypto… |
Standalone | license | El ace del comando | Gratis — no se cobra nada. |
Para fijar un framework, o para dar soporte a una copia renombrada, edita la lista de detección en config/config.lua. La consola confirma la elección al iniciar con Successfully loaded the framework.
-- config/config.lua
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
['my_core'] = 'esx', -- a renamed copy of ESX
}
-- Or skip detection entirely:
-- Config.Framework = 'esx'Otro framework es una carpeta nueva, custom/<name>/, con un puente de servidor y otro de cliente copiados del más parecido. El puente de cliente debe llamar a SetFrameworkReady() cuando el personaje se haya cargado, y el puente de servidor a OnPlayerLoaded(source).
Inventarios y números de serie#
El inventario le dice al script el número de serie del arma que llevas en la mano, para que una skin pueda pertenecer a un arma exacta en lugar de a cada copia de ella.
Inventario | Número de serie leído de |
|---|---|
ox_inventory | Campo del arma: |
qs-inventory | Campo del arma: |
Settings → Skin inventory → Equipped per elige entre Automatic (por arma allí donde el inventario pueda distinguirlas), Per weapon type y Per weapon item.
Añadir un inventario#
Copia el adaptador standalone
Copia
client/custom/inventory/standalone.luaa un archivo con el nombre de tu inventario, y cambia su primera línea para que solo se ejecute con ese inventario.Devuelve el número de serie
GetHeldWeaponSerial(cfg)devuelve el número de serie del arma que llevas en la mano — 32 caracteres como máximo — onil.ToggleInventoryClothing(state)se llama cuando el estudio se abre y se cierra, y debe existir aunque no haga nada.lua -- client/custom/inventory/my-inventory.lua if Config.InventoryResource ~= 'my-inventory' then return end function GetHeldWeaponSerial(cfg) local weapon = exports['my-inventory']:GetCurrentWeapon() return weapon and weapon.serial or nil end function ToggleInventoryClothing(state) endRegístralo para la detección
Añade el nombre del recurso a la lista
inventoriesenconfig/config.luay reinicia.
Targets y avisos#
Settings → Interaction → Use a target resource lleva cada interacción a ox_target, qtarget o qb-target: Skin studio, Skin shop y Management en el NPC, Management en el punto de gestión, Invite a customer en el banco de trabajo y Collect the delivery en una caja de suministros.
Sin target, las mismas acciones son avisos dibujados junto a cada punto — a través de qs-textui cuando está en ejecución, con texto 3D nativo si no — que se responden con las teclas de Settings → Interaction: E para el estudio y G para la tienda de skins por defecto.
Notificaciones y el HUD#
Las notificaciones son los propios avisos del script, con el estilo del estudio. Todo lo visible que toca otro recurso está en custom/client.lua, sin cifrar: Notification, DrawText3D, ProgressBar y ToggleHud. Para enviar los avisos a tu propio recurso de notificaciones, cambia una función:
-- custom/client.lua
function Notification(msg, type) -- type: 'info' | 'error' | 'success'
if GetResourceState('qs-interface') == 'started' then
return exports['qs-interface']:AddNotify(msg, type, 5000)
end
SendReactMessage('notification', { msg = msg, type = type })
endEl HUD del juego se oculta en el estudio, en las sesiones de pintor, en el panel de administración y en el menú de gestión (Settings → Studio → Hide the HUD). Con qs-interface en ejecución, su HUD también se oculta.
Logs de Discord#
Todo lo que hacen los jugadores y admins se puede publicar en Discord como un embed. Cada categoría tiene su propia URL en server/webhooks.lua; una vacía simplemente no se envía.
Canal | Qué se registra |
|---|---|
| Skins creadas y retocadas, skins del catálogo compradas, ranuras de inventario compradas. |
| Sesiones de pintor iniciadas y skins aplicadas por un pintor. |
| Skins pendientes de revisión, aprobadas y rechazadas. |
| Tiendas, el catálogo, la configuración, las armas addon, el pool, skins quitadas o entregadas en la pestaña Players, y el personal, el dinero, los niveles, las mejoras y los pedidos de suministros de cada tienda. |
| Concesiones y revocaciones de la tienda. |
| Regalos e intercambios entre jugadores. |
-- server/webhooks.lua
_G['webhook'] = {
purchase = 'https://discord.com/api/webhooks/...',
artist = '',
moderation = '',
admin = 'https://discord.com/api/webhooks/...',
tebex = '',
trade = '',
}
_G['fivemanage'] = {
webhook = '', -- a Fivemanage token, to show skin thumbnails in the embeds
}Cada embed nombra al jugador con su id de servidor, identificador, Discord y licencia — y su IP si Settings → General → IP in Discord logs está activado.
Tebex#
Vende skins del catálogo y ranuras de inventario extra en tu tienda de Tebex, entregadas en el juego — incluso a jugadores que están desconectados cuando pagan.
Añade el secreto
En el panel de Tebex, Game Servers → copia la Secret key del servidor y ponla en
server.cfg:bash set sv_tebexSecret "your_secret_key"Actívalo
/weaponskincreator→ Settings → Tebex → Tebex. El nombre de la convar también es un ajuste, por si el tuyo es distinto.Asigna los paquetes
En
custom/config.lua, por nombre de paquete exactamente como lo tiene Tebex — las mayúsculas y los espacios importan:lua Config.Tebex.Packages = { ['Dragon AK (Weapon Skin)'] = { kind = 'skin', catalogId = 1 }, -- a copy of catalog item #1 ['+5 Skin Slots'] = { kind = 'slots', amount = 5 }, -- five extra inventory slots }Una skin del catálogo también se puede vincular sin editar archivos: escribe el nombre del paquete en su campo Tebex package.
Entrega
O bien el jugador canjea su id de transacción en el inventario de skins (Redeem a purchase) o con
/weaponskin_tebex tbx-…, o bien Tebex ejecuta un comando del servidor de juego al comprar:bash weaponskin_tebex_grant {id} {transaction}Deja Require online desactivado en Tebex: un jugador que está desconectado recibe la concesión en su siguiente inicio de sesión.
Cada transacción se comprueba con Tebex y solo se puede usar una vez. weaponskin_tebex_revoke <transaction> revoca una concesión. Una concesión que no puede entregarse — un inventario lleno, un artículo agotado — espera en lugar de perderse.
Una moneda personalizada#
Las cuentas con las que pueden pagar los jugadores son Config.MoneyTypes en config/config.lua. Cada nombre se pasa directamente al puente del framework — getAccountMoney, removeAccountMoney y addAccountMoney en custom/<framework>/server.lua — así que una cuenta que tu framework ya tiene es una sola línea:
Config.MoneyTypes = {
{ name = 'money', label = 'Cash' },
{ name = 'bank', label = 'Bank' },
{ name = 'black_money', label = 'Dirty money' },
}Una moneda que tu framework no conoce — un objeto, una moneda VIP — necesita una rama para su nombre en esas tres funciones. Solo las cuentas de la lista se ofrecen al pagar y en Settings → Prices; las comprobaciones de inicio avisan si la cuenta predeterminada no está en la lista.
La comisión del pintor se paga en la Commission account (Settings → Shops), y la nómina siempre paga en
bank.
Enlaces de imágenes#
Los jugadores pegan enlaces de imágenes en la pestaña Link del estudio. Solo se guarda la dirección: cada pantalla que muestra el diseño carga la imagen directamente desde el host, así que el host debe permitir que otras páginas lean sus imágenes — imgur, Discord y Fivemanage lo permiten. Un enlace se prueba al pegarlo y se rechaza ahí, con una explicación, en lugar de al pagar.
Ajuste (Images) | Predeterminado |
|---|---|
Allow image links | Activado. Desactivado oculta la pestaña Link. |
Allow any host | Activado. Desactivado acepta solo los hosts de |
Block private networks | Activado. Rechaza localhost, la LAN y las direcciones de metadatos de la nube. |
-- custom/config.lua — used when "Allow any host" is off; subdomains match
Config.Images.AllowedHosts = {
'i.imgur.com', 'imgur.com', 'cdn.discordapp.com', 'media.discordapp.net',
'r2.fivemanage.com', 'api.fivemanage.com', 'i.ibb.co', 'raw.githubusercontent.com',
'media4.giphy.com',
}Tus propias fuentes y arte de galería#
Ambos están en custom/. Coloca el archivo en su carpeta, añade una fila y reinicia el recurso:
-- custom/config.lua
-- custom/fonts/MyFont.ttf (.ttf, .otf or .woff2)
Config.FontsCustom = {
{ family = 'My Font', source = 'custom', file = 'MyFont.ttf', weights = { 400 }, category = 'display' },
}
-- custom/gallery/my_logo.svg (.svg or .png, transparent and square)
Config.GalleryCustom = {
{ id = 'my_logo', category = 'symbols', file = 'my_logo.svg', tintable = true, tags = { 'logo' } },
}Las categorías de fuentes son script, gothic, serif, display y clean. Las categorías de la galería son tribal, floral, animals, skulls, geometric, symbols, oldschool, minimal y ornaments. tintable permite a los jugadores cambiar el color del diseño, y solo funciona con un SVG dibujado con currentColor.
Idiomas#
Se incluyen 41 traducciones completas en locales/: árabe, bengalí, búlgaro, catalán, chino, croata, checo, danés, neerlandés, inglés, estonio, finlandés, francés, alemán, griego, hebreo, hindi, húngaro, indonesio, italiano, japonés, coreano, letón, lituano, malayo, noruego, persa, polaco, portugués, rumano, ruso, eslovaco, esloveno, español, suajili, sueco, tailandés, turco, ucraniano, urdu y vietnamita.
Elige uno en Settings → General → Language — cambia para todos los jugadores a la vez — o establece el idioma predeterminado para todos los recursos de Quasar con setr qs:locale "es". Un texto que falte en una traducción recurre al inglés. Para cambiar un texto, edita locales/<code>.json y guarda una copia antes de actualizar.



