por Avenida Team ESX · QBCore · ox · vRP · Standalone

Interact system

Sistema de interacción 3D + motor de diálogos para NPC, sin ninguna dependencia. Coloca una interacción en cualquier punto del mapa: en una entity, en unas coordenadas sueltas, o en un NPC que haces aparecer desde la misma llamada. Sin ox_lib, sin framework, nada que configurar en el servidor.

Entrega Instantánea
Actualizaciones Gratis de por vida
Soporte Discord los 7 días
01 · FUNCIONALIDADES

Lo que hace

02 · SPECS

Especificaciones
técnicas

Framework Todos, con detección auto ESX · QBCore · Qbox · ox · vRP · Standalone · Custom
Dependencias Ninguna ox_lib opcional, desactivado por defecto
Idiomas en juego 15 incluidos ar · cs · de · en · es · fr · id · it · nl · pl · pt-br · ro · ru · th · tr
Código Tebex Escrow Configs y bridges abiertos en producción
Rendimiento 0.00ms en reposo Medido con 100 interacciones
03 · INCLUIDO

Todo lo que
recibes

  • Quince archivos de idioma, ya rellenados

    Tus jugadores leen el script en su idioma desde el primer arranque, y los archivos están fuera del escrow, así que puedes corregir cualquier línea en producción. Nota honesta: están traducidos y revisados por nosotros, pero no los ha corregido un hablante nativo de cada uno de los quince. Dinos qué suena mal en el tuyo y lo arreglamos.

  • Todo se ajusta en config.lua

    Etiqueta, tecla, distancias, icono y color por defecto de un punto, colores con nombre, la correspondencia entre etiqueta de tecla e índice de control, el ped que se usa cuando una entrada no indica ninguno, la distancia de aparición, y `Config.Hud` para elegir qué HUD se oculta durante un diálogo. Todo eso salió del escrow en la 1.1.0.

  • Tres ejemplos que funcionan

    Un watcher de cajeros registrado por hash de modelo con un menú de dos teclas, un NPC con un diálogo ramificado completo y un waypoint GPS, y un punto de baile con varias teclas. Archivos reales en `config/`, bórralos cuando tengas los tuyos.

  • Soporte Discord y actualizaciones de por vida

    Acceso al canal de soporte, y todas las actualizaciones futuras sin coste extra. Sin nivel premium, sin complementos de pago.

04 · DOCUMENTACIÓN

Guía de integración

01

Instalación

  1. Coloca el recurso

    Descarga el script desde tu cuenta Tebex y copia la carpeta avenida_interact/ en resources/[avenida]/ de tu servidor.

  2. Actívalo en server.cfg

    Añade ensure avenida_interact. No hace falta que cargue nada antes: desde la 1.1.0 el recurso no tiene dependencias, así que el orden de carga da igual.

  3. Fija tus valores por defecto

    Abre config/config.lua y ajusta lo que se aplica a todos los puntos: etiqueta, tecla, distancias showIcon y canInteract, icono, color, colores con nombre, distancia de aparición de los peds, y Config.Hud para elegir qué HUD se oculta durante un diálogo.

  4. Quita las demos

    Los ejemplos de config/entities/, config/peds/ y config/positions/ siguen activos mientras sus archivos estén ahí. Borra los que no quieras, el manifest recorre esas carpetas, no hay nada más que tocar.

  5. Prueba la recarga en caliente

    Arranca el servidor y escribe /restart avenida_interact en el juego. Los iconos desaparecen y vuelven limpios, y los puntos registrados por tus propios recursos sobreviven, sin reiniciar tu sesión.

02

Inicio rápido

Tu primer punto de interacción en 30 segundos

Crea un `myscript/client.lua` en tu propio recurso y pega esto. Un marcador cian aparece a 30m, el prompt "E - Hello" se despliega a 2m. Lo único que tiene que estar activo es avenida_interact.

lua
-- myscript/client.lua
exports.avenida_interact:positionRegister({
    coords      = vec3(-265.0, -963.6, 31.2),
    showIcon    = 30.0,           -- marker fades in at 30m
    canInteract = 2.0,            -- label unrolls at 2m
    hintIcon    = 'interact',     -- see the icon list below
    hintColor   = '#22d3ee',      -- hex, or an alias from Config.Colors
    message     = 'Hello',
    bind        = 'E',
    onInteract  = function()
        TriggerEvent('chat:addMessage', { args = { 'Hello, world!' } })
    end,
})
03

Referencia de la API

Exports públicos agrupados por dominio. Cada fila muestra la firma de la llamada y qué hace, no cómo lo hace.

Interact Points

  • positionRegister
    exports.avenida_interact:positionRegister(cfg) --> id

    Registra un punto en unas coordenadas fijas. Acepta todos los campos visuales (hintIcon, hintColor, showIcon, canInteract, offsetZ, blips) más choices[] para varias teclas en el mismo punto. canInteract acepta un número o una función, así que puedes condicionar el prompt a un trabajo, un item o un cooldown. Devuelve un id.

  • pedRegister
    exports.avenida_interact:pedRegister(cfg) --> id

    Hace aparecer un NPC configurado (modelo, animDict y animName o un scenario, blip), le engancha un punto y devuelve su índice. El ped es invencible, no huye y no cae en ragdoll. Aparece y desaparece a la distancia que marca Config.PedSpawnRange, 50m por defecto. Pon randomComponents = false en un vendedor con nombre, porque si no cada jugador le verá ropa distinta.

  • pedRemove
    exports.avenida_interact:pedRemove(idx)

    Añadido en la 1.1.0. Hace desaparecer un ped registrado con pedRegister y borra su registro, para que un NPC de misiones temporal pueda irse cuando la misión termina.

  • entityRegister
    exports.avenida_interact:entityRegister(cfg) --> id

    Engancha un punto a una entity existente, pasada en cfg.entity. Admite cfg.bone para colgar el prompt de un bone en vez del centro de la entity. Úsalo para lo que otro script haya hecho aparecer: un vehículo, un prop colocado, un objeto tirado.

  • entityRegisterByHash
    exports.avenida_interact:entityRegisterByHash(hash, cfg)

    Watcher pasivo: la config se aplica a todas las entities de ese modelo, las ya cargadas y las que aparezcan después. Un único thread cubre todos los hashes registrados y hace una pasada cada 5s. Es lo que quieres para cajeros, máquinas expendedoras y puertas, en vez de mantener una lista de coordenadas.

  • entityRemove
    exports.avenida_interact:entityRemove(idx)

    Desengancha el punto devuelto por entityRegister. La entity en sí no se toca.

  • interactCreate
    exports.avenida_interact:interactCreate(cfg) --> id

    Punto en tiempo de ejecución, que creas y quitas cuando hace falta. Úsalo cuando el punto solo existe un rato: un objetivo de misión, una bolsa en el suelo, un cuerpo que registrar.

  • interactRemove
    exports.avenida_interact:interactRemove(id)

    Quita un punto creado con interactCreate, y su blip si declaraba uno.

  • unlockLastInteract
    exports.avenida_interact:unlockLastInteract()

    Un punto se bloquea al usarse, para que una tecla mantenida no lo dispare dos veces. Llama a esto al final de tu acción para rearmarlo. Si el jugador sigue dentro del alcance, el prompt vuelve enseguida. Si no, espera a que se acerque otra vez.

Prompt API

  • HandleTextUI
    exports.avenida_interact:HandleTextUI(id, data) --> duiHandler

    Crea o actualiza una burbuja 3D autónoma, sin punto de interacción detrás. Para cuando quieres controlar la visibilidad desde tu propio thread. Devuelve el handler que pasas a Draw3DSprite.

  • Draw3DSprite
    exports.avenida_interact:Draw3DSprite({ duiHandler, coords, maxDistance, hintOnly? })

    Dibuja la burbuja en el mundo desde un thread de render, corregida según la proporción de la pantalla. Con hintOnly = true solo se dibuja el marcador, que es el estado a larga distancia de un punto normal.

  • CloseTextUI
    exports.avenida_interact:CloseTextUI(id)

    Oculta una burbuja pero mantiene su DUI en memoria, así que reabrirla es instantáneo.

  • RemoveTextUI
    exports.avenida_interact:RemoveTextUI(id)

    Quita una burbuja del todo y libera su DUI. Úsalo cuando sepas que no va a volver.

  • RemoveTextUIs
    exports.avenida_interact:RemoveTextUIs()

    Quita todas las burbujas activas. Se llama automáticamente cuando el recurso se para.

  • IsDuiVisible
    exports.avenida_interact:IsDuiVisible() --> boolean

    Verdadero mientras hay un prompt en pantalla. Léelo para que tus propios prompts no se apilen encima de una interacción.

Key handler

  • HandleHoldTextUI
    exports.avenida_interact:HandleHoldTextUI(id, data) --> duiHandler

    La capa sobre la que se construyen los puntos: dibuja un prompt en Coords y vigila su tecla desde un thread manager a 50ms. data toma BindToHold (índice de control), DistanceHold, Coords, ChoicesUI y ChoicesCtrl para un prompt de varias teclas, onCallback(id) y canInteract(id, dist). Dispara al pulsar con un debounce de 500ms, y tu callback se ejecuta dentro de un pcall, así que un error tuyo no rompe el prompt.

  • CloseHoldTextUI
    exports.avenida_interact:CloseHoldTextUI(id)

    Oculta el prompt sin destruir la instancia, para una salida limpia cuando el jugador deja la zona.

  • RemoveHoldTextUI
    exports.avenida_interact:RemoveHoldTextUI(id)

    Destruye una instancia y libera su DUI.

  • RemoveHoldTextUIs
    exports.avenida_interact:RemoveHoldTextUIs()

    Destruye todas las instancias activas.

04

Recetas

Ejemplos para copiar y pegar en los casos más habituales. Los metes en tu recurso, ajustas los valores y a producción.

El caso más simple: un punto en unas coordenadas, con su blip declarado en la misma tabla. El marcador se ve a 30m, la etiqueta a 2m. Pégalo en cualquier archivo de cliente de tu recurso.

lua
exports.avenida_interact:positionRegister({
    coords      = vec3(149.5, -1040.4, 29.4),
    showIcon    = 30.0,
    canInteract = 2.0,
    hintIcon    = 'bank',
    hintColor   = 'blue',
    message     = 'Use the ATM',
    bind        = 'E',
    onInteract  = function()
        TriggerEvent('myserver-banking:openATM')
    end,
    blips = {
        sprite  = 277,
        color   = 2,
        scale   = 0.8,
        text    = 'ATM',
        display = 4,
    },
})
05

Preguntas frecuentes

  • No lo necesitas. Desde la 1.1.0 `bridges/compat.lua` implementa la creación de DUI, los puntos de proximidad y los helpers de espera solo con natives, y la línea `@ox_lib/init.lua` está comentada en el manifest. Si prefieres pasar por ox_lib, pon `Config.UseOxLib = true` y descomenta esa línea. Los dos caminos siguen soportados, y el nativo es el que viene por defecto.
OPINIONES

Lo que dicen los compradores

5.0 2 opiniones verificadas

  • Revoria

    very good scriptwriters a reactive and competent listening team I recommend go there with your eyes closed!!

    Ver en Discord ↗
  • theara

    Best script, best support! Fast support and friendly!

    Ver en Discord ↗
Carrito
Spirit RP
Discord