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

Interact system

3D-Interaktionssystem + NPC-Dialog-Engine, ganz ohne Dependencies. Setz eine Interaktion an jede beliebige Stelle der Map: auf eine Entity, auf eine freie Koordinate oder auf einen NPC, den du im selben Aufruf spawnst. Kein ox_lib, kein Framework, nichts, was du serverseitig einrichten musst.

Lieferung Sofort
Updates Für immer kostenlos
Support Täglich auf Discord
01 · FUNKTIONEN

Was es kann

02 · SPECS

Technische
Daten

Framework Alle, automatisch erkannt ESX · QBCore · Qbox · ox · vRP · Standalone · Custom
Dependencies Keine ox_lib optional, standardmäßig aus
In-Game-Sprachen 15 enthalten ar · cs · de · en · es · fr · id · it · nl · pl · pt-br · ro · ru · th · tr
Source Tebex Escrow Configs und Bridges bleiben offen
Performance 0.00ms im Leerlauf Gemessen mit 100 Interaktionen
03 · INKLUSIVE

Alles, was du
bekommst

  • Fünfzehn Sprachdateien, gefüllt ausgeliefert

    Deine Spieler lesen das Script vom ersten Start an in ihrer Sprache, und die Dateien liegen außerhalb des Escrows, du kannst also jede Zeile im laufenden Betrieb ändern. Ehrlicher Hinweis: Sie sind von uns übersetzt und geprüft, nicht von Muttersprachlern aller fünfzehn gegengelesen. Sag uns, was in deiner falsch klingt, dann korrigieren wir es.

  • Alles in config.lua einstellbar

    Standard-Label, Taste, Distanzen, Icon und Farbe eines Punkts, benannte Farben, die Zuordnung von Tastenkürzeln zu Control-Indizes, der Ped für Einträge ohne eigenes Modell, die Spawn-Distanz und `Config.Hud`, um zu bestimmen, welches HUD während eines Dialogs ausgeblendet wird. Das alles hat in 1.1.0 den Escrow verlassen.

  • Drei funktionierende Beispiele

    Ein ATM-Watcher über den Model-Hash mit Zwei-Tasten-Menü, ein NPC mit komplett verzweigtem Dialog und GPS-Waypoint und ein Tanzpunkt mit mehreren Bindings. Das sind echte Dateien in `config/`, lösch sie, sobald deine eigenen stehen.

  • Discord-Support und Updates auf Lebenszeit

    Zugang zum Support-Channel und jedes künftige Update ohne Aufpreis. Keine Premium-Stufe, kein kostenpflichtiges Add-on.

04 · DOKUMENTATION

Guide zur Integration

01

Installation

  1. Resource ablegen

    Hol dir das Script aus deinem Tebex-Konto und kopier den Ordner avenida_interact/ auf deinem Server nach resources/[avenida]/.

  2. In der server.cfg aktivieren

    Füg ensure avenida_interact hinzu. Vorher muss nichts anderes starten: Seit 1.1.0 hat die Resource keine Dependencies, die Ladereihenfolge ist also egal.

  3. Deine Defaults setzen

    Öffne config/config.lua und stell ein, was für alle Punkte gilt: Label, Taste, die Distanzen showIcon und canInteract, Icon, Farbe, benannte Farben, die Spawn-Distanz der Peds und Config.Hud für das HUD, das während eines Dialogs ausgeblendet wird.

  4. Demos entfernen

    Die Beispiele in config/entities/, config/peds/ und config/positions/ sind aktiv, solange ihre Dateien da sind. Lösch die, die du nicht willst. Das Manifest globt diese Ordner, mehr musst du nicht anfassen.

  5. Hot Reload testen

    Starte den Server und tipp im Spiel /restart avenida_interact. Die Icons verschwinden und kommen sauber zurück, und die Punkte deiner eigenen Resources bleiben erhalten, ohne dass du deine Session neu startest.

02

Schnellstart

Dein erster Interaktionspunkt in 30 Sekunden

Leg eine `myscript/client.lua` in deiner eigenen Resource an und füg das hier ein. Ein cyanfarbener Marker erscheint ab 30m, der Prompt „E - Hello“ rollt ab 2m aus. Laufen muss dafür nur avenida_interact selbst.

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

API-Referenz

Öffentliche Exports nach Bereich gruppiert. Jede Zeile zeigt die Signatur und was der Export macht, nicht wie er es macht.

Interact Points

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

    Registriert einen Punkt auf festen Koordinaten. Nimmt jedes visuelle Feld (hintIcon, hintColor, showIcon, canInteract, offsetZ, blips) plus choices[] für mehrere Tasten auf demselben Punkt. canInteract akzeptiert eine Zahl oder eine Funktion, du kannst den Prompt also an einen Job, ein Item oder einen Cooldown binden. Gibt eine ID zurück.

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

    Spawnt einen konfigurierten NPC (Modell, animDict und animName oder ein Scenario, Blip), hängt einen Punkt daran und gibt seinen Index zurück. Der Ped ist unverwundbar, flieht nicht und geht nicht in Ragdoll. Er spawnt und verschwindet wieder im Umkreis von Config.PedSpawnRange, standardmäßig 50m. Setz randomComponents = false bei einem Händler mit festem Namen, sonst sieht jeder Spieler ein anderes Outfit.

  • pedRemove
    exports.avenida_interact:pedRemove(idx)

    Neu in 1.1.0. Despawnt einen mit pedRegister registrierten Ped und löscht seine Registrierung, damit ein temporärer Questgeber wieder gehen kann, wenn die Quest vorbei ist.

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

    Hängt einen Punkt an eine bestehende Entity, die du als cfg.entity übergibst. Unterstützt cfg.bone, um den Prompt an einen Bone statt an das Zentrum der Entity zu hängen. Für alles, was ein anderes Script gespawnt hat: ein Fahrzeug, ein platziertes Prop, ein fallengelassenes Item.

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

    Passiver Watcher: Die Config gilt für jede Entity dieses Modells, für die schon gestreamten und für die, die später auftauchen. Ein einziger Thread deckt alle registrierten Hashes ab und geht sie alle 5s durch. Genau das willst du für ATMs, Automaten und Türen, statt eine Koordinatenliste zu pflegen.

  • entityRemove
    exports.avenida_interact:entityRemove(idx)

    Hängt den von entityRegister zurückgegebenen Punkt wieder ab. Die Entity selbst bleibt unangetastet.

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

    Punkt zur Laufzeit, nach Bedarf erzeugt und entfernt. Für alles, was nur eine Weile existiert: ein Missionsziel, eine Tasche am Boden, eine Leiche zum Durchsuchen.

  • interactRemove
    exports.avenida_interact:interactRemove(id)

    Entfernt einen mit interactCreate erzeugten Punkt und seinen Blip, falls er einen deklariert hat.

  • unlockLastInteract
    exports.avenida_interact:unlockLastInteract()

    Ein Punkt sperrt sich nach der Benutzung selbst, damit eine gehaltene Taste ihn nicht zweimal auslöst. Ruf das am Ende deiner Aktion auf, um ihn wieder freizugeben. Ist der Spieler noch in Reichweite, kommt der Prompt direkt zurück, sonst wartet er, bis der Spieler wieder in Reichweite kommt.

Prompt API

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

    Erzeugt oder aktualisiert eine eigenständige 3D-Sprechblase, ganz ohne Interaktionspunkt dahinter. Für den Fall, dass du die Sichtbarkeit aus deinem eigenen Thread steuern willst. Gibt den Handler zurück, den du an Draw3DSprite weitergibst.

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

    Zeichnet die Sprechblase in Weltkoordinaten aus einem Render-Thread, entzerrt anhand des Seitenverhältnisses. Mit hintOnly = true wird nur der Marker gezeichnet, das ist der Zustand, den ein normaler Punkt aus der Ferne zeigt.

  • CloseTextUI
    exports.avenida_interact:CloseTextUI(id)

    Blendet eine Sprechblase aus, behält ihr DUI aber im Speicher, das erneute Öffnen geht damit ohne Verzögerung.

  • RemoveTextUI
    exports.avenida_interact:RemoveTextUI(id)

    Entfernt eine Sprechblase endgültig und gibt ihr DUI frei. Nimm das, wenn du weißt, dass sie nicht wiederkommt.

  • RemoveTextUIs
    exports.avenida_interact:RemoveTextUIs()

    Entfernt alle aktiven Sprechblasen. Beim Stoppen der Resource passiert das automatisch.

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

    Gibt true zurück, solange ein Prompt auf dem Bildschirm ist. Frag den Export ab, damit sich deine eigenen Prompts nicht über eine laufende Interaktion legen.

Key handler

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

    Die Schicht, auf der die Punkte aufbauen: Sie zeichnet einen Prompt an Coords und überwacht dessen Taste aus einem Manager-Thread, der alle 50ms läuft. data nimmt BindToHold (Control-Index), DistanceHold, Coords, ChoicesUI und ChoicesCtrl für einen Prompt mit mehreren Tasten, onCallback(id) und canInteract(id, dist). Löst beim Tastendruck aus, mit 500ms Debounce, und dein Callback läuft in einem pcall, ein Fehler auf deiner Seite reißt den Prompt also nicht mit runter.

  • CloseHoldTextUI
    exports.avenida_interact:CloseHoldTextUI(id)

    Blendet den Prompt aus, ohne die Instanz zu zerstören, für einen sauberen Abgang, wenn der Spieler die Zone verlässt.

  • RemoveHoldTextUI
    exports.avenida_interact:RemoveHoldTextUI(id)

    Zerstört eine Instanz und gibt ihr DUI frei.

  • RemoveHoldTextUIs
    exports.avenida_interact:RemoveHoldTextUIs()

    Zerstört alle aktiven Instanzen.

04

Rezepte

Praxisnahe Copy-Paste-Beispiele. In deine eigene Resource kopieren, Werte anpassen, fertig.

Der einfachste Fall: ein Punkt auf festen Koordinaten, mit seinem Blip in derselben Table. Der Marker erscheint ab 30m, das Label ab 2m. Pack das in eine beliebige Client-Datei deiner 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

Fehlerbehebung

  • Nein. Seit 1.1.0 baut `bridges/compat.lua` die DUI-Erstellung, die Proximity-Points und die Wait-Helper mit reinen Natives nach, und die Zeile `@ox_lib/init.lua` ist im Manifest auskommentiert. Wenn du das lieber über ox_lib laufen lässt, setz `Config.UseOxLib = true` und kommentier die Zeile ein. Beide Wege werden gepflegt, der native ist der Standard.
BEWERTUNGEN

Was Käufer sagen

5.0 2 verifizierte Bewertungen

  • Revoria

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

  • theara

    Best script, best support! Fast support and friendly!

Warenkorb
Spirit RP
Discord