Cómo funcionan las integraciones#
Todo lo que depende de otro recurso está detrás de un pequeño archivo puente de código abierto. Interface elige el puente al arrancar, buscando el primer recurso de su lista que ya esté en ejecución.
Capa | Compatible | Sin ella |
|---|---|---|
Framework | es_extended · qb-core (Qbox a través de su capa qb-core) | Obligatorio. |
Hambre y sed | esx_status · metadatos de QBCore | Ambas se quedan en 0. |
Voz | pma-voice · saltychat | Se muestra cuándo hablas; el rango se queda en el más corto. |
Combustible | lc_fuel · qs-fuelstations | El nivel de combustible nativo del vehículo, correcto para cualquier script de combustible que lo establezca. |
Multicharacter | qs-multicharacter | El HUD arranca con el evento de jugador cargado del framework. |
Pantalla de carga | qs-loadingscreen | La pantalla de carga del juego se cierra cuando se abre la configuración inicial. |
Sonidos del cinturón | InteractSound ( | Cinturón sin sonido; la notificación sigue apareciendo. |
Capturas en los logs | screenshot-basic + un token de Fivemanage | Los logs se envían sin imagen. |
Compras VIP | Tebex, a través de |
|
La detección ocurre una sola vez, al arrancar, y solo ve los recursos que ya están en ejecución. Inicia tus recursos de voz y combustible antes de
qs-interface, o esa parte funcionará en modo independiente sin avisar.
Forzar la detección#
Cada lista es una pequeña tabla en config/config.lua, que asigna un nombre de recurso a un puente. Un framework o recurso de voz renombrado solo necesita añadir su nuevo nombre a la izquierda:
-- config/config.lua
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['my-renamed-core'] = 'qb', -- added
}
Config.Framework = DependencyCheck(frameworks) or 'standalone'
-- or skip detection and force a bridge:
Config.Fuel = 'lc_fuel'Lo mismo aplica a voiceChats, fuels y multicharacters. Este archivo se lee antes de que arranque el servidor, así que reinicia después de editarlo.
Añadir un script de combustible o de voz#
Un puente de combustible es una sola función, GetFuel(vehicle), que devuelve 0–100. La mayoría de los scripts de combustible ya escriben el nivel nativo y no necesitan nada. Para uno que guarda el combustible en otro lugar (el state bag de ox_fuel, por ejemplo), crea un archivo junto a los demás:
-- client/custom/fuel/ox_fuel.lua
if Config.Fuel ~= 'ox_fuel' then return end
function GetFuel(vehicle)
return Entity(vehicle).state.fuel or GetVehicleFuelLevel(vehicle)
endluego añade ['ox_fuel'] = 'ox_fuel' a la tabla fuels de config/config.lua y reinicia.
Un puente de voz, en client/custom/voices/, son dos funciones: IsTalking() y GetProximityDistance(), que devuelve 1.5, 3 o 6 (susurro, normal y grito) para dimensionar el anillo de voz. Copia pma.lua como punto de partida y añade el recurso a voiceChats.
Adaptar el puente del framework#
custom/esx/ y custom/qb/ contienen todo lo que Interface le pide al framework: dinero, trabajo, estado, nombres, estrés y quién es administrador del chat. No están cifrados y tienen comentarios, así que un core modificado es compatible editando la función correspondiente:
Quieres cambiar | Edita |
|---|---|
Quién cuenta como staff del chat |
|
De dónde vienen el hambre y la sed |
|
El nombre de roleplay en el chat |
|
Qué trabajos aparecen en Job Channels |
|
Dónde se guarda el estrés |
|
Qué alivia el estrés | Los eventos al final de |
De serie, el estrés se alivia con esx_status:add, esx_basicneeds:healPlayer y la muerte en ESX, y al comer, beber, tomar alcohol, reaparecer en el hospital y ser reanimado en QBCore.
Usarlo como tu barra de progreso y tus notificaciones#
Redirige las funciones de tu framework a Interface y todos los scripts del servidor usarán los estilos elegidos por el jugador. En QBCore, reemplaza QBCore.Functions.Progressbar en qb-core/client/functions.lua:
function QBCore.Functions.Progressbar(name, label, duration, useWhileDead, canCancel, disableControls, animation, prop, propTwo, onFinish, onCancel)
if prop then
prop = { model = prop.model, bone = prop.bone, pos = prop.coords, rot = prop.rotation }
end
while GetResourceState('qs-interface') ~= 'started' do Wait(500) end
local success = exports['qs-interface']:ProgressBar({
duration = duration,
label = label,
useWhileDead = useWhileDead,
canCancel = canCancel,
disable = disableControls,
anim = animation and { dict = animation.animDict, clip = animation.anim, flag = animation.flags },
prop = prop,
})
if success then
if onFinish then onFinish() end
elseif onCancel then
onCancel()
end
endLas notificaciones siguen la misma idea: apunta la función de notificación de tu framework a exports['qs-interface']:AddNotify(text, title, time, icon). Guarda una copia de los originales: las actualizaciones del framework sobrescriben estos archivos.
Estrés desde otros scripts#
Interface escucha los mismos eventos que qb-hud, así que las drogas, los robos o los gimnasios escritos para él suben y bajan el estrés sin cambios:
-- client side
TriggerServerEvent('hud:server:GainStress', math.random(2, 4))
TriggerServerEvent('hud:server:RelieveStress', 25)Sumar estrés solo funciona con Stress activado en /interfaceconfig y nunca para un trabajo de Jobs without stress; aliviarlo funciona siempre. Los valores se mantienen entre 0 y 100.
Logs de Discord#
Cada mensaje del chat, acción de administración y cambio VIP se puede publicar en Discord. Configura un webhook como respaldo y sobrescribe los canales que quieras separar:
-- server/webhooks.lua
_G['webhook'] = {
chat = 'https://discord.com/api/webhooks/...', -- fallback for everything below
chat_me = '',
chat_do = '',
chat_ooc = '',
chat_anon = '', -- logs the real sender of anonymous messages
chat_admin = '',
chat_report = '',
chat_dice = '',
chat_rps = '',
chat_message = '', -- messages typed without a command
chat_job = '', -- job channels
chat_admin_action = '', -- /chatadmin: saves, clears, announcements
chat_vip = '', -- VIP granted, removed and redeemed
}
_G['fivemanage'] = { webhook = '' } -- Fivemanage token, adds a screenshot to logs
Config.ShowWebhookIP = false -- true includes the player's IPCada log identifica al jugador con sus identificadores. Los logs se ponen en cola y se envían en orden, respetando los límites de frecuencia de Discord. Los cambios hechos en /interfaceconfig se escriben en la consola del servidor con el nombre de quien los hizo.
Vender etiquetas VIP#
Con Tebex#
Añade tu clave secreta de Tebex a server.cfg y vende un paquete por nivel. Después de comprar, el jugador escribe /redeemvip tbx-xxxx <tier>; la transacción se verifica con Tebex y solo se puede canjear una vez. Las etiquetas canjeadas son permanentes.
set sv_tebexSecret "your-secret-key"Desde tu propia tienda o bot de Discord#
Escribe la fila tú mismo y luego dile a Interface que la recargue:
INSERT INTO chat_vip_tags (license, tag_id, expires_at, granted_by)
VALUES ('license:1a2b3c...', 'elite', DATE_ADD(UTC_TIMESTAMP(), INTERVAL 30 DAY), 'Store')
ON DUPLICATE KEY UPDATE tag_id = VALUES(tag_id), expires_at = VALUES(expires_at);exports['qs-interface']:refreshVip('license:1a2b3c...')tag_id es uno de vip, premium, elite, legend, immortal; expires_at en UTC, o NULL para permanente. Sin la recarga, el cambio aparece en menos de una hora.
Idiomas#
Se incluyen 41 traducciones en locales/: ar, bg, bn, ca, cs, da, de, el, en, es, et, fa, fi, fr, he, hi, hr, hu, id, it, ja, ko, lt, lv, ms, nl, no, pl, pt, ro, ru, sk, sl, sv, sw, th, tr, uk, ur, vi y zh. Elige uno en /interfaceconfig → General → Language y todos los textos de todas las pantallas cambian a la vez, sin reiniciar.
Hasta que alguien elija uno ahí, el idioma viene de la convar que comparten todos los recursos de Quasar:
setr qs:locale "es"Cualquier clave que falte en tu idioma vuelve al inglés, con un aviso en la consola que la nombra. El dinero se formatea por separado, con General → Money format.



