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

Interact system

Sistema de interação 3D + engine de diálogo de NPC, sem nenhuma dependência. Coloque uma interação em qualquer lugar do mapa: numa entity, numa coordenada qualquer, ou num NPC que você spawna na mesma chamada. Sem ox_lib, sem framework, nada para configurar do lado do servidor.

Entrega Instantânea
Atualizações Grátis para sempre
Suporte Discord todo dia
01 · FUNCIONALIDADES

O que ele faz

02 · SPECS

Especificações
técnicas

Framework Todos, detecção auto ESX · QBCore · Qbox · ox · vRP · Standalone · Custom
Dependências Nenhuma ox_lib opcional, desligado por padrão
Idiomas no jogo 15 incluídos ar · cs · de · en · es · fr · id · it · nl · pl · pt-br · ro · ru · th · tr
Source Tebex Escrow Configs e bridges abertos em produção
Performance 0.00ms em repouso Medido com 100 interações
03 · INCLUSO

Tudo o que
você recebe

  • Quinze arquivos de idioma, entregues preenchidos

    Seus jogadores leem o script no idioma deles desde o primeiro start, e os arquivos ficam fora do escrow, então você corrige qualquer linha em produção. Nota honesta: eles são traduzidos e revisados por nós, não revisados por nativos dos quinze idiomas. Diga o que soa errado no seu e a gente corrige.

  • Tudo se ajusta no config.lua

    Rótulo, tecla, distâncias, ícone e cor padrão de um ponto, cores nomeadas, a correspondência entre rótulo de tecla e índice de controle, o ped usado quando uma entrada não informa nenhum, a distância de spawn, e `Config.Hud` para escolher qual HUD some durante um diálogo. Tudo isso saiu do escrow na 1.1.0.

  • Três exemplos que funcionam

    Um watcher de caixas eletrônicos registrado por hash de modelo com menu de duas teclas, um NPC com diálogo ramificado completo e waypoint no GPS, e um ponto de dança com várias teclas. Arquivos reais em `config/`, apague quando os seus estiverem prontos.

  • Suporte no Discord e updates vitalícios

    Acesso ao canal de suporte, e todas as atualizações futuras sem custo extra. Sem plano premium, sem addon pago.

04 · DOCUMENTAÇÃO

Guia de integração

01

Instalação

  1. Coloque o resource

    Baixe o script pela sua conta Tebex e copie a pasta avenida_interact/ para resources/[avenida]/ no seu servidor.

  2. Ative no server.cfg

    Adicione ensure avenida_interact. Nada precisa subir antes: desde a 1.1.0 o resource não tem dependência, então a ordem de carregamento não importa.

  3. Defina seus padrões

    Abra config/config.lua e ajuste o que vale para todos os pontos: rótulo, tecla, distâncias showIcon e canInteract, ícone, cor, cores nomeadas, distância de spawn dos peds, e Config.Hud para escolher qual HUD some durante um diálogo.

  4. Apague as demos

    Os exemplos em config/entities/, config/peds/ e config/positions/ ficam ativos enquanto os arquivos estiverem lá. Apague os que não quiser, o manifest varre essas pastas, não tem mais nada para editar.

  5. Teste o hot reload

    Suba o servidor e digite /restart avenida_interact no jogo. Os ícones somem e voltam limpos, e os pontos registrados pelos seus próprios resources sobrevivem, sem você precisar reiniciar a sua sessão.

02

Início rápido

Seu primeiro ponto de interação em 30 segundos

Crie um `myscript/client.lua` no seu próprio resource e cole isto. Um marcador ciano aparece a 30m, o prompt "E - Hello" abre a 2m. A única coisa que precisa estar rodando é o próprio 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

Referência da API

Exports públicos agrupados por domínio. Cada linha mostra a assinatura da chamada e o que ela faz, não como faz.

Interact Points

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

    Registra um ponto em coordenadas fixas. Aceita todos os campos visuais (hintIcon, hintColor, showIcon, canInteract, offsetZ, blips) mais choices[] para várias teclas no mesmo ponto. canInteract aceita um número ou uma função, então você pode travar o prompt num emprego, num item ou num cooldown. Retorna um id.

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

    Spawna um NPC configurado (modelo, animDict e animName ou um scenario, blip), pendura um ponto nele e retorna o índice. O ped é invencível, não foge e não cai em ragdoll. Ele nasce e some no raio de Config.PedSpawnRange, 50m por padrão. Coloque randomComponents = false num vendedor com nome, senão cada jogador vê uma roupa diferente.

  • pedRemove
    exports.avenida_interact:pedRemove(idx)

    Adicionado na 1.1.0. Despawna um ped registrado com pedRegister e apaga o registro dele, então um NPC de missão temporário pode ir embora quando a missão acaba.

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

    Pendura um ponto numa entity existente, passada em cfg.entity. Suporta cfg.bone para prender o prompt num bone em vez do centro da entity. Serve para o que outro script já spawnou: um veículo, um prop colocado, um item largado.

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

    Watcher passivo: a config vale para toda entity daquele modelo, as já carregadas e as que aparecerem depois. Uma única thread cobre todos os hashes registrados e faz uma varredura a cada 5s. É isso que você quer para caixas eletrônicos, máquinas de venda e portas, em vez de ficar mantendo uma lista de coordenadas.

  • entityRemove
    exports.avenida_interact:entityRemove(idx)

    Solta o ponto que o entityRegister devolveu. A entity em si não é tocada.

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

    Ponto em runtime, criado e removido sob demanda. Use quando o ponto só existe por um tempo: um objetivo de missão, uma mochila no chão, um corpo para revistar.

  • interactRemove
    exports.avenida_interact:interactRemove(id)

    Remove um ponto criado por interactCreate, junto com o blip dele se ele tiver declarado um.

  • unlockLastInteract
    exports.avenida_interact:unlockLastInteract()

    Um ponto se tranca depois de usado, para que uma tecla segurada não dispare duas vezes. Chame isto no fim da sua ação para rearmá-lo. Se o jogador ainda estiver perto, o prompt volta na hora, senão ele espera o jogador chegar perto de novo.

Prompt API

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

    Cria ou atualiza uma bolha 3D autônoma, sem nenhum ponto de interação por trás. Para quando você quer controlar a visibilidade pela sua própria thread. Retorna o handler que você passa para o Draw3DSprite.

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

    Desenha a bolha no mundo a partir de uma thread de render, corrigida conforme a proporção da tela. Com hintOnly = true só o marcador é desenhado, que é o estado de longa distância de um ponto normal.

  • CloseTextUI
    exports.avenida_interact:CloseTextUI(id)

    Esconde uma bolha, mas mantém o DUI dela na memória, então reabrir é instantâneo.

  • RemoveTextUI
    exports.avenida_interact:RemoveTextUI(id)

    Remove uma bolha de vez e libera o DUI dela. Use quando souber que ela não vai voltar.

  • RemoveTextUIs
    exports.avenida_interact:RemoveTextUIs()

    Remove todas as bolhas ativas. O resource chama isso sozinho quando ele para.

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

    Verdadeiro enquanto tem um prompt na tela. Leia isso para os seus próprios prompts não empilharem em cima de uma interação.

Key handler

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

    A camada em que os pontos são construídos: ela desenha um prompt em Coords e fica de olho na tecla dele numa thread manager a 50ms. data recebe BindToHold (índice de controle), DistanceHold, Coords, ChoicesUI e ChoicesCtrl para um prompt de várias teclas, onCallback(id) e canInteract(id, dist). Dispara ao apertar, com debounce de 500ms, e o seu callback roda num pcall, então um erro do seu lado não quebra o prompt.

  • CloseHoldTextUI
    exports.avenida_interact:CloseHoldTextUI(id)

    Esconde o prompt sem destruir a instância, para uma saída limpa quando o jogador sai da zona.

  • RemoveHoldTextUI
    exports.avenida_interact:RemoveHoldTextUI(id)

    Destrói uma instância e libera o DUI dela.

  • RemoveHoldTextUIs
    exports.avenida_interact:RemoveHoldTextUIs()

    Destrói todas as instâncias ativas.

04

Receitas

Exemplos de copiar e colar para os casos mais comuns. Você cola na sua resource, ajusta os valores e já está em produção.

O caso mais simples: um ponto em coordenadas, com o blip declarado na mesma table. O marcador aparece a 30m, o rótulo a 2m. Cole isso em qualquer arquivo de client do seu resource.

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

Perguntas frequentes

  • Não precisa. Desde a 1.1.0 o `bridges/compat.lua` implementa a criação de DUI, os pontos de proximidade e os helpers de espera em natives puros, e a linha `@ox_lib/init.lua` está comentada no manifest. Se preferir passar pelo ox_lib, coloque `Config.UseOxLib = true` e descomente essa linha. Os dois caminhos são mantidos, o nativo é o padrão.
AVALIAÇÕES

O que dizem os compradores

5.0 2 avaliações verificadas

  • Revoria

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

    Ver no Discord ↗
  • theara

    Best script, best support! Fast support and friendly!

    Ver no Discord ↗
Carrinho
Spirit RP
Discord