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

Interact system

Système d'interaction 3D + moteur de dialogues PNJ, sans aucune dépendance. Posez une interaction n'importe où sur la map : sur une entity, sur une coordonnée libre, ou sur un PNJ que vous faites apparaître depuis le même appel. Pas d'ox_lib, pas de framework, rien à configurer côté serveur.

Livraison Instantanée
Mises à jour Gratuites à vie
Support Discord 7j/7
01 · FONCTIONNALITÉS

Ce qu'il fait

02 · SPECS

Spécifications
techniques

Framework Tous, détection auto ESX · QBCore · Qbox · ox · vRP · Standalone · Custom
Dépendances Aucune ox_lib optionnel, désactivé par défaut
Langues en jeu 15 incluses ar · cs · de · en · es · fr · id · it · nl · pl · pt-br · ro · ru · th · tr
Source Tebex Escrow Configs et bridges ouverts en production
Performance 0.00ms au repos Mesuré avec 100 interactions
03 · INCLUS

Tout ce que vous
recevez

  • Quinze fichiers de langue, livrés remplis

    Vos joueurs lisent le script dans leur langue dès le premier démarrage, et les fichiers sont hors escrow, donc vous pouvez corriger n'importe quelle ligne en production. Note honnête : ils sont traduits et relus par nos soins, pas par des natifs des quinze langues. Dites-nous ce qui sonne faux dans la vôtre, c'est corrigé.

  • Tout se règle dans config.lua

    Label, touche, distances, icône et couleur par défaut d'un point, couleurs nommées, correspondance entre libellé de touche et control index, PNJ utilisé quand une entrée n'en précise pas, distance d'apparition, et `Config.Hud` pour choisir quel HUD est masqué pendant un dialogue. Tout ça est sorti de l'escrow en 1.1.0.

  • Trois exemples fonctionnels

    Un watcher d'ATM enregistré par hash de modèle avec un menu à deux touches, un PNJ avec un dialogue à embranchements complet et un waypoint GPS, et un point de danse multi-touches. De vrais fichiers dans `config/`, à supprimer une fois les vôtres écrits.

  • Support Discord et mises à jour à vie

    Accès au salon de support, et toutes les futures mises à jour sans surcoût. Pas de palier premium, pas d'extension payante.

04 · DOCUMENTATION

Guide d'intégration

01

Installation

  1. Déposez la ressource

    Récupérez le script depuis votre compte Tebex, puis copiez le dossier avenida_interact/ dans resources/[avenida]/ sur votre serveur.

  2. Activez dans server.cfg

    Ajoutez ensure avenida_interact. Rien n'a besoin de charger avant : depuis la 1.1.0 la ressource n'a aucune dépendance, l'ordre de chargement n'a donc pas d'importance.

  3. Réglez vos valeurs par défaut

    Ouvrez config/config.lua et ajustez ce qui s'applique à tous les points : label, touche, distances showIcon et canInteract, icône, couleur, couleurs nommées, distance d'apparition des PNJ, et Config.Hud pour choisir quel HUD est masqué pendant un dialogue.

  4. Retirez les démos

    Les exemples de config/entities/, config/peds/ et config/positions/ sont actifs tant que leurs fichiers sont là. Supprimez ceux dont vous ne voulez pas, le manifest globe ces dossiers, il n'y a rien d'autre à modifier.

  5. Testez le rechargement à chaud

    Démarrez le serveur, puis tapez /restart avenida_interact en jeu. Les icônes disparaissent et reviennent proprement, et les points enregistrés par vos propres ressources survivent, sans relancer votre session.

02

Démarrage rapide

Votre premier point d'interaction en 30 secondes

Créez un `myscript/client.lua` dans votre propre ressource et collez ceci. Un marqueur cyan apparaît à 30m, le prompt "E - Hello" se déroule à 2m. La seule chose qui doit tourner, c'est avenida_interact lui-même.

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

Référence API

Exports publics groupés par domaine. Chaque ligne montre la signature d'appel

Interact Points

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

    Enregistre un point sur des coordonnées fixes. Accepte tous les champs visuels (hintIcon, hintColor, showIcon, canInteract, offsetZ, blips) plus choices[] pour plusieurs touches sur le même point. canInteract accepte un nombre ou une fonction, vous pouvez donc conditionner le prompt à un job, un item ou un cooldown. Renvoie un id.

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

    Fait apparaître un PNJ configuré (modèle, animDict et animName ou un scenario, blip), lui attache un point et renvoie son index. Le ped est invincible, ne fuit pas et ne tombe pas en ragdoll. Il apparaît et disparaît autour de Config.PedSpawnRange, 50m par défaut. Mettez randomComponents = false sur un vendeur nommé, sinon chaque joueur voit une tenue différente.

  • pedRemove
    exports.avenida_interact:pedRemove(idx)

    Ajouté en 1.1.0. Fait disparaître un ped enregistré avec pedRegister et retire son enregistrement, pour qu'un donneur de quête temporaire puisse partir une fois la quête finie.

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

    Attache un point sur une entity existante, passée dans cfg.entity. Gère cfg.bone pour accrocher le prompt sur un bone plutôt que sur le centre de l'entity. À utiliser pour ce qu'un autre script a fait apparaître : un véhicule, un prop posé, un objet lâché.

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

    Watcher passif : la config s'applique à toutes les entities de ce modèle, celles déjà streamées et celles qui apparaîtront. Un seul thread couvre tous les hash enregistrés et balaye toutes les 5s. C'est ce qu'il vous faut pour les ATM, les distributeurs et les portes, plutôt qu'une liste de coordonnées à maintenir.

  • entityRemove
    exports.avenida_interact:entityRemove(idx)

    Détache le point renvoyé par entityRegister. L'entity elle-même n'est pas touchée.

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

    Point créé et retiré à la volée. À utiliser quand le point n'existe qu'un temps : un objectif de mission, un sac au sol, un corps à fouiller.

  • interactRemove
    exports.avenida_interact:interactRemove(id)

    Retire un point créé par interactCreate, et son blip s'il en déclarait un.

  • unlockLastInteract
    exports.avenida_interact:unlockLastInteract()

    Un point se verrouille une fois utilisé, pour qu'une touche maintenue ne le déclenche pas deux fois. Appelez ceci à la fin de votre action pour le réarmer. Si le joueur est encore à portée, le prompt revient directement, sinon il attend qu'il rentre à nouveau dans la zone.

Prompt API

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

    Crée ou met à jour une bulle 3D autonome, sans point d'interaction derrière. Pour quand vous voulez piloter la visibilité depuis votre propre thread. Renvoie le handler à passer à Draw3DSprite.

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

    Dessine la bulle dans le monde depuis un thread de rendu, dé-étirée selon le ratio de l'écran. Avec hintOnly = true, seul le marqueur est dessiné, c'est l'état longue distance d'un point normal.

  • CloseTextUI
    exports.avenida_interact:CloseTextUI(id)

    Masque une bulle mais garde son DUI en mémoire, la réouverture est donc instantanée.

  • RemoveTextUI
    exports.avenida_interact:RemoveTextUI(id)

    Retire une bulle définitivement et libère son DUI. À utiliser quand vous savez qu'elle ne reviendra pas.

  • RemoveTextUIs
    exports.avenida_interact:RemoveTextUIs()

    Retire toutes les bulles actives. Appelé pour vous quand la ressource s'arrête.

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

    Vrai tant qu'un prompt est à l'écran. Lisez-le pour éviter que vos propres prompts s'empilent par-dessus une interaction.

Key handler

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

    La couche sur laquelle les points sont construits : elle dessine un prompt sur Coords et surveille sa touche depuis un thread manager à 50ms. data prend BindToHold (control index), DistanceHold, Coords, ChoicesUI et ChoicesCtrl pour un prompt multi-touches, onCallback(id) et canInteract(id, dist). Déclenche à la pression avec un debounce de 500ms, et votre callback tourne dans un pcall, donc une erreur de votre côté ne casse pas le prompt.

  • CloseHoldTextUI
    exports.avenida_interact:CloseHoldTextUI(id)

    Masque le prompt sans détruire l'instance, pour une sortie propre quand le joueur quitte la zone.

  • RemoveHoldTextUI
    exports.avenida_interact:RemoveHoldTextUI(id)

    Détruit une instance et libère son DUI.

  • RemoveHoldTextUIs
    exports.avenida_interact:RemoveHoldTextUIs()

    Détruit toutes les instances actives.

04

Recettes

Exemples copier-coller pour les cas courants. À déposer dans ta ressource, ajuster les valeurs, et c'est en prod.

Le cas le plus simple : un point sur des coordonnées, avec son blip déclaré dans la même table. Le marqueur s'affiche à 30m, le label à 2m. À déposer dans n'importe quel fichier client de votre ressource.

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

Questions fréquentes

  • Non. Depuis la 1.1.0, `bridges/compat.lua` implémente la création des DUI, les points de proximité et les helpers d'attente en natifs purs, et la ligne `@ox_lib/init.lua` est commentée dans le manifest. Si vous préférez passer par ox_lib, mettez `Config.UseOxLib = true` et décommentez cette ligne. Les deux chemins sont maintenus, celui en natifs est le défaut.
AVIS

Ce qu'en disent les acheteurs

5.0 2 avis vérifiés

  • Revoria

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

    Voir sur Discord ↗
  • theara

    Best script, best support! Fast support and friendly!

    Voir sur Discord ↗
Panier
Spirit RP
Discord