Comandos#
Text UI no registra comandos de chat ni de consola. Los avisos los crean tus scripts mediante los exports siguientes, o se colocan en shared/config.lua — consulta Uso.
Exports de cliente#
Todos los exports son del lado del cliente. Para mostrar un aviso desde el servidor, dispara un evento de cliente propio y llama al export allí.
Export | Qué hace |
|---|---|
| Muestra el aviso en pantalla. |
| Cambia el texto del aviso en pantalla en su sitio. |
| Oculta el aviso en pantalla. |
| Fija un aviso en una coordenada, con sus propias distancias, tecla, evento, trabajo y condición. |
| Cambia el texto de un aviso 3D. |
| Elimina un aviso 3D. |
| Una etiqueta 3D rápida, solo visual, con distancias fijas. |
| Un aviso que sigue a otro jugador, con hasta dos teclas. |
| Elimina un aviso sobre un jugador. |
Aviso en pantalla — displayTextUI, changeText, hideTextUI
-- displayTextUI(text, key?, align?)
exports['qs-textui']:displayTextUI('Open the garage', 'E', 'center-right')
-- changeText(text, key?) — new text without sliding in again
exports['qs-textui']:changeText('Close the garage', 'E')
exports['qs-textui']:hideTextUI()Parámetro | Predeterminado | Significado |
|---|---|---|
| — | El texto. Se permiten códigos de GTA y HTML. |
|
| La etiqueta de la insignia. Solo visual: tu script gestiona la pulsación. |
|
| Una de las nueve posiciones en pantalla. Un valor desconocido vuelve al predeterminado. |
Solo hay un aviso en pantalla a la vez: un segundo displayTextUI reemplaza al primero. Muéstralo cuando el jugador entra en la zona y ocúltalo cuando sale, no en cada fotograma:
local garage = vector3(215.8, -810.1, 30.7)
local shown = false
CreateThread(function()
while true do
local near = #(GetEntityCoords(PlayerPedId()) - garage) < 3.0
if near and not shown then
exports['qs-textui']:displayTextUI('Open the garage', 'E')
shown = true
elseif not near and shown then
exports['qs-textui']:hideTextUI()
shown = false
end
if near and IsControlJustReleased(0, 38) then
-- open your garage here
end
Wait(near and 0 or 500)
end
end)Texto 3D en una coordenada — create3DTextUI, update3DTextUI, DeleteDrawText3D
Un aviso que flota sobre un punto, con sus propias distancias y un evento que se dispara al pulsar su tecla. Llámalo una vez —cuando tu script se inicia, o cuando aparece aquello a lo que apunta—, no en un bucle.
exports['qs-textui']:create3DTextUI('pd_duty', {
coords = vector3(441.8, -982.1, 30.7),
displayDist = 8.0,
interactDist = 2.0,
enableKeyClick = true,
keyNum = 38,
key = 'E',
text = 'Go on duty',
job = 'police',
canInteract = function()
return not IsPedInAnyVehicle(PlayerPedId(), false)
end,
triggerData = {
triggerName = 'my-police:server:toggleDuty',
args = { station = 'mrpd' },
isServer = true
},
invokingResource = GetCurrentResourceName()
})
exports['qs-textui']:update3DTextUI('pd_duty', 'Go off duty')
exports['qs-textui']:DeleteDrawText3D('pd_duty')Campo | Obligatorio | Significado |
|---|---|---|
| Sí | Un |
| Sí | Distancia a la que aparece el marcador. |
| Sí | Distancia a la que se muestra el texto y funciona la tecla. |
| Sí | La etiqueta de la insignia, también para un aviso sin tecla. |
| Sí | El texto. Se permiten códigos de GTA y HTML. |
| No | ID de control de la tecla (38 = E). Sin él, el aviso solo informa. |
| No | Déjalo en |
| No | El evento que se dispara al pulsar: |
| No |
|
| No | Una función. Devuelve |
| No | Un nombre de recurso. Cuando ese recurso se detiene, el aviso se elimina. Pasa |
El evento llega con args como único parámetro:
-- server side, because isServer = true
RegisterNetEvent('my-police:server:toggleDuty', function(args)
local src = source
print(src, args.station)
end)Un id que ya existe se ignora, así que llamar a create3DTextUI dos veces con el mismo id conserva el primero. Para cambiar algo que no sea el texto, elimínalo y vuelve a crearlo. update3DTextUI solo cambia el texto, y no hace nada si el texto es el mismo.
Etiqueta 3D rápida — drawText3D
-- drawText3D(x, y, z, text, id, key)
exports['qs-textui']:drawText3D(100.0, 200.0, 30.0, 'Warehouse', 'warehouse_label', 'E')
exports['qs-textui']:DeleteDrawText3D('warehouse_label')Una etiqueta solo visual con distancias fijas —un marcador desde 5 m, el texto desde 2 m— y sin pulsación propia: el script que la llama comprueba la tecla por su cuenta. Llamarla de nuevo con el mismo id mueve la etiqueta y actualiza su texto, así que se puede llamar en cada fotograma sin problema. Es lo que usa el wrapper de DrawText3D.
Las etiquetas de drawText3D pertenecen al recurso que las creó y se eliminan cuando se detiene. La misma llamada está disponible como evento de cliente:
TriggerEvent('textui:DrawText3D', x, y, z, text, id, key)Texto 3D sobre un jugador — create3DTextUIOnPlayers, DeleteDrawText3DOnPlayers
Un aviso que flota sobre otro jugador y lo sigue. Admite una segunda tecla y un segundo evento, para dos acciones sobre la misma persona:
local promptId = 'cuffed_' .. targetServerId
exports['qs-textui']:create3DTextUIOnPlayers(promptId, {
id = targetServerId, -- server id of the player to follow
displayDist = 6.0,
interactDist = 2.0,
enableKeyClick = true,
key = 'E',
text = 'Search · ~c~[G] Escort',
keyNum = 38,
triggerData = {
triggerName = 'my-police:client:search',
args = { target = targetServerId }
},
keyNum2 = 47,
triggerData2 = {
triggerName = 'my-police:client:escort',
args = { target = targetServerId }
}
})
exports['qs-textui']:DeleteDrawText3DOnPlayers(promptId)Campo | Significado |
|---|---|
| Server id del jugador al que sigue el aviso. |
| Debe ser |
| La primera tecla y su evento. |
| Segunda tecla opcional y su evento. |
| Como en |
La insignia muestra una tecla, así que menciona la segunda en el texto, como arriba. Los avisos sobre jugadores no se filtran por trabajo —decide quién recibe uno antes de crearlo— y no se eliminan cuando tu recurso se detiene, así que elimínalos tú.
Cuando qs-textui se reinicia#
Los avisos creados mediante exports viven en la memoria de Text UI. Reiniciar qs-textui los borra, mientras que los scripts que los crearon siguen en ejecución. Reinicia también esos scripts, o vuelve a crear tus avisos cada vez que Text UI se inicie:
local function createPrompts()
exports['qs-textui']:create3DTextUI('pd_duty', { --[[ ... ]] })
end
CreateThread(createPrompts)
AddEventHandler('onClientResourceStart', function(resource)
if resource == 'qs-textui' then
createPrompts()
end
end)


