Cómo funcionan las integraciones#
Text UI no necesita un framework. Lo consulta para una sola cosa: el trabajo del jugador, para que un aviso se pueda mostrar solo a un trabajo. El framework se elige según lo que ya está en ejecución, y cada uno lo gestiona un pequeño archivo bridge que puedes abrir y editar:
Recurso iniciado | Bridge | De dónde se lee el trabajo |
|---|---|---|
|
| Los datos del jugador, actualizados por |
|
| Los datos del jugador, actualizados por |
|
| Lo mismo, mediante la compatibilidad de Qbox con QBCore. |
Ninguno de ellos | — | Standalone. Todos los avisos funcionan, siempre que su |
En un servidor standalone, un aviso cuyo
jobsea distinto de'all'lanza un error en lugar de mostrarse, porque no hay trabajo con el que comparar. Omitejob, o ponlo en'all'.
ESX TextUI#
Los scripts de ESX muestran sus avisos con ESX.TextUI y los ocultan con ESX.HideUI, que normalmente van a esx_textui. Dirige esas dos funciones a Text UI y todos los scripts de ESX del servidor lo usarán sin tocarlos.
Busca las dos funciones
Abre
es_extended/client/functions.luay busca:lua function ESX.TextUI(...) return IsResourceFound('esx_textui') and exports['esx_textui']:TextUI(...) end function ESX.HideUI() return IsResourceFound('esx_textui') and exports['esx_textui']:HideUI() endReemplázalas
lua function ESX.TextUI(message, _type) return exports['qs-textui']:displayTextUI(message) end function ESX.HideUI() return exports['qs-textui']:hideTextUI() endEl segundo valor que pasa ESX es un tipo de color (
info,success,error), no una tecla, así que se omite y la insignia muestraConfig.DefaultKey. Los códigos como~INPUT_CONTEXT~de los mensajes antiguos de ESX se eliminan automáticamente.Reinicia el servidor
Reinicia todo el servidor en lugar de solo
es_extended: cada recurso de ESX guarda su propia copia del objeto compartido.
DrawText de QBCore y Qbox#
Los scripts de QBCore usan exports['qb-core']:DrawText(text, position), ChangeText, HideText y KeyPressed. Están en qb-core/client/drawtext.lua. Reemplaza las tres primeras funciones de ese archivo, y deja keyPressed y las líneas exports(...) del final como están:
-- qb-core/client/drawtext.lua
local positions = {
left = 'center-left',
right = 'center-right',
top = 'top-center'
}
local function hideText()
exports['qs-textui']:hideTextUI()
end
local function drawText(text, position)
exports['qs-textui']:displayTextUI(text, nil, positions[position])
end
local function changeText(text, position)
exports['qs-textui']:changeText(text)
endLas posiciones de QBCore se asignan a las de Text UI, y un script que no pasa ninguna obtiene Config.DefaultAlign. QBCore no envía una tecla, así que la insignia muestra Config.DefaultKey.
Posición en QBCore | Posición en Text UI |
|---|---|
|
|
|
|
|
|
Qbox mantiene los mismos exports DrawText, ChangeText y HideText por compatibilidad. Haz el mismo cambio donde qbx_core los define: busca en su carpeta exports('DrawText'.
Mostrar un aviso a un solo trabajo#
Cada aviso 3D y área de configuración admite un job. Los jugadores con otro trabajo no lo ven en absoluto, y el trabajo se lee en vivo: un jugador que cambia de trabajo ve aparecer o desaparecer el aviso en un cuarto de segundo. Para algo más fino, como un rango o el estado de servicio, añade un canInteract:
exports['qs-textui']:create3DTextUI('mechanic_tuning', {
coords = vector3(-211.5, -1324.6, 30.9),
displayDist = 8.0,
interactDist = 2.0,
enableKeyClick = true,
keyNum = 38,
key = 'E',
text = 'Tuning menu',
job = 'mechanic',
canInteract = function()
return IsPedInAnyVehicle(PlayerPedId(), false)
end,
triggerData = { triggerName = 'my-mechanic:client:openTuning', args = {} }
})Añadir un framework#
Dar soporte a un framework que no está en la lista requiere un archivo y una línea.
Escribe un bridge
Crea
client/custom/framework/myframework.lua. Solo tiene que devolver el nombre y el rango del trabajo del jugador:lua if Config.Framework ~= 'myframework' then return end function GetJobName() local job = exports['my_framework']:GetPlayerJob() return job and job.name or 'unemployed' end function GetJobGrade() local job = exports['my_framework']:GetPlayerJob() return job and job.grade or 0 endSustituye
my_frameworkyGetPlayerJobpor lo que ofrezca tu framework.GetJobNamese llama a menudo, así que lee un valor en caché en lugar de preguntar al servidor.Regístralo
En
shared/config.lua, añade el nombre del recurso del framework a la lista de detección:lua local frameworks = { ['es_extended'] = 'esx', ['qb-core'] = 'qb', ['qbx_core'] = 'qb', ['my_framework'] = 'myframework' }Reinicia
Inicia tu framework antes de
qs-textuiy reinicia el servidor.Config.Frameworkahora se resuelve como'myframework'y tu bridge es el que se carga.



