Qué reemplaza#
Cientos de scripts de FiveM incluyen su propio DrawText3D: una función que dibuja una línea de texto blanco en una coordenada, llamada en cada fotograma desde un bucle mientras el jugador está cerca.
[E] Open door[E] Talk to the clerk[G] Lockpick
Se dibuja con los natives de texto del juego, así que no se puede personalizar, hay que redibujarlo en cada fotograma y cada script lleva una copia ligeramente distinta. Text UI mantiene el nombre de la función y la llamada, y convierte cada etiqueta en un aviso de verdad: un marcador a distancia, y la insignia de la tecla y el texto de cerca.
Solo se reemplaza la función. El script mantiene su propio bucle y su propia comprobación de tecla, así que su comportamiento no cambia, solo el aspecto de la etiqueta.
Reemplazar la función#
Añade el wrapper
Busca la función
DrawText3Den los archivos de cliente del script — normalmente enclient/main.luaoclient/functions.lua— y reemplaza toda la función por esta:lua local texts = {} function DrawText3D(x, y, z, text, id, key) id = id or text exports['qs-textui']:drawText3D(x, y, z, text, id, key or 'E') if texts[id] then texts[id] = 5 return end texts[id] = 5 CreateThread(function() while texts[id] > 0 do texts[id] = texts[id] - 1 Wait(0) end texts[id] = nil exports['qs-textui']:DeleteDrawText3D(id) end) endCada llamada se reenvía a Text UI, así que una etiqueta que se mueve o cambia de texto lo sigue. Cuando el script deja de llamarla durante unos fotogramas —el jugador se alejó—, la etiqueta se elimina.
Mantén una alternativa (opcional)
Para un script que también deba funcionar en servidores sin Text UI, usa esta versión en su lugar. Elige Text UI cuando
qs-textuiestá iniciado, y el clásico texto blanco cuando no.lua local texts = {} if GetResourceState('qs-textui') == 'started' then function DrawText3D(x, y, z, text, id, key) id = id or text exports['qs-textui']:drawText3D(x, y, z, text, id, key or 'E') if texts[id] then texts[id] = 5 return end texts[id] = 5 CreateThread(function() while texts[id] > 0 do texts[id] = texts[id] - 1 Wait(0) end texts[id] = nil exports['qs-textui']:DeleteDrawText3D(id) end) end else function DrawText3D(x, y, z, text) SetTextScale(0.35, 0.35) SetTextFont(4) SetTextProportional(1) SetTextColour(255, 255, 255, 215) SetTextEntry('STRING') SetTextCentre(true) AddTextComponentString(text) SetDrawOrigin(x, y, z, 0) DrawText(0.0, 0.0) local factor = text:len() / 370 DrawRect(0.0, 0.0 + 0.0125, 0.017 + factor, 0.03, 0, 0, 0, 75) ClearDrawOrigin() end endLa comprobación se hace una vez, cuando el script se inicia, así que
qs-textuidebe iniciarse antes que él enserver.cfg.Dale a cada etiqueta un id y una tecla
Los scripts antiguos llaman a la función con cuatro valores y ponen la tecla dentro del texto:
lua DrawText3D(x, y, z, '[E] Open door')Añade un id único y la tecla, y quita la tecla del texto; la insignia ya la muestra:
lua DrawText3D(x, y, z, 'Open door', 'motel_door_' .. doorId, 'E')Sin id, el propio texto se usa como id. Eso sirve para la mayoría de scripts, pero un script que dibuja el mismo texto en varios lugares a la vez necesita un id por lugar, o las etiquetas se fusionan en una.
Un ejemplo completo#
Un bucle de puerta típico tras el cambio. Solo la línea DrawText3D es distinta del original:
CreateThread(function()
while true do
local sleep = 1000
local coords = GetEntityCoords(PlayerPedId())
for doorId, door in pairs(Doors) do
if #(coords - door.coords) < 2.0 then
sleep = 0
DrawText3D(door.coords.x, door.coords.y, door.coords.z, 'Open door', 'door_' .. doorId, 'E')
if IsControlJustReleased(0, 38) then
OpenDoor(doorId)
end
end
end
Wait(sleep)
end
end)Cómo se comportan las etiquetas#
Las etiquetas dibujadas con DrawText3D usan distancias fijas, medidas desde el jugador hasta la etiqueta:
Distancia | Qué se muestra |
|---|---|
Más de 5 m | Nada. |
De 2 a 5 m | Un pequeño marcador en el punto. |
Menos de 2 m | La insignia de la tecla y el texto. |
El script sigue decidiendo cuándo existe la etiqueta: un script que solo dibuja a menos de 1,5 m muestra la etiqueta desde 1,5 m y la elimina más allá. Para tus propias distancias, una tecla gestionada por Text UI o un filtro de trabajo, crea el aviso con create3DTextUI en su lugar — consulta Comandos y exports.
Los códigos de GTA que queden en el texto — ~g~, ~r~, ~h~, ~n~ — se convierten en colores, negrita y saltos de línea, y los códigos como ~INPUT_CONTEXT~ se eliminan. Consulta Formato de texto.
Las etiquetas pertenecen al script que las dibujó. Cuando ese script se detiene o se reinicia, sus etiquetas se eliminan con él.



