ox_target addBoxZone, addModel und addLocalEntity: wie man Ziele hinzufügt

Wie man ox_target Interaktionen in FiveM hinzufügt: addBoxZone, addSphereZone, addModel, addLocalEntity und addGlobalVehicle, mit Optionen, Gruppen, Entfernung und Debug.

Du fügt ein Ziel in deinem Skript hinzu und im Spiel wird nichts angezeigt. Oder die Konsole sagt:

text
No such export addBoxZone in resource ox_target

Dies ist der praktische Leitfaden zu ox_target auf dem Client: die Zone, Modell und Entity-Exporte, die Optionen, die du auf sie legen kannst, und wie man sie entfernt und debuggt.

Stelle sicher, dass ox_target zuerst gestartet wird

Die Exporte existieren nur, während ox_target läuft, und es braucht ox_lib. In server.cfg, starte sie vor deinem Skript:

cfg
ensure oxmysql
ensure ox_lib
ensure ox_target

ensure my_script

Füge es auch zu deiner Ressource fxmanifest.lua hinzu, damit FiveM sich weigert, das Skript ohne sie zu starten:

lua
dependency 'ox_target'

Alle Aufrufe unten sind Client-Seite. Lege sie in eine Client-Datei, nicht eine Server-Datei.

Eine Box-Zone

Eine Box-Zone ist ein Rechteck in der Welt. Es ist die richtige Wahl für einen Counter, eine Tür oder einen Geldautomaten:

lua
local zoneId = exports.ox_target:addBoxZone({
    coords = vec3(441.2, -981.9, 30.7),
    size = vec3(1.5, 1.0, 2.0),
    rotation = 90.0,
    debug = false,
    options = {
        {
            name = 'my_script_counter',
            icon = 'fa-solid fa-box',
            label = 'Open the counter',
            distance = 2.0,
            onSelect = function(data)
                print('selected', data.name)
            end,
        },
    },
})

coords ist das Zentrum der Box, size ist ihre Breite, Länge und Höhe, und rotation dreht sie um die vertikale Achse. Behalte die zurückgegebene zoneId, wenn du die Zone später entfernst.

Eine Sphere-Zone

Eine Sphere ist einfacher, wenn dir die Form egal ist, nur "in der Nähe dieses Punktes":

lua
exports.ox_target:addSphereZone({
    coords = vec3(-1037.5, -2737.9, 20.2),
    radius = 1.5,
    options = {
        {
            name = 'my_script_sphere',
            icon = 'fa-solid fa-hand',
            label = 'Talk',
            onSelect = function()
                print('talking')
            end,
        },
    },
})

Modelle, Entities und Fahrzeuge

Um jedes Objekt, Ped oder Fahrzeug eines bestimmten Modells zu treffen, verwende addModel. Es nimmt einen Modellnamen oder Hash oder eine Liste davon:

lua
exports.ox_target:addModel({ `prop_vend_soda_01`, `prop_vend_soda_02` }, {
    {
        name = 'my_script_vending',
        icon = 'fa-solid fa-bottle-water',
        label = 'Use the machine',
        distance = 1.5,
        onSelect = function(data)
            print('entity', data.entity)
        end,
    },
})

Um eine Entity zu treffen, die du bereits auf deinem Client erstellt hast, verwende addLocalEntity:

lua
local ped = CreatePed(4, `a_m_m_business_01`, 441.2, -981.9, 29.7, 90.0, false, true)

exports.ox_target:addLocalEntity(ped, {
    {
        name = 'my_script_ped',
        icon = 'fa-solid fa-comment',
        label = 'Talk to him',
        onSelect = function(data)
            print('talk to', data.entity)
        end,
    },
})

Um eine Option zu jedem Fahrzeug hinzuzufügen, verwende addGlobalVehicle. Andere globale Exporte existieren für Peds, Spieler und Objekte:

lua
exports.ox_target:addGlobalVehicle({
    {
        name = 'my_script_inspect',
        icon = 'fa-solid fa-magnifying-glass',
        label = 'Inspect vehicle',
        distance = 2.5,
        onSelect = function(data)
            print('vehicle', data.entity)
        end,
    },
})

Tipp: addLocalEntity existiert nur auf dem Client, der die Entity erstellt hat. Für eine vernetzte Entity, auf der andere Spieler die Option sehen sollten, verwende die vernetzte Variante (addEntity) mit der Entity's Netzwerk-ID.

Die Options-Felder

Jede Option ist eine Tabelle. Dies sind die Felder, die du am meisten verwendendest:

Feld Was es tut
name Ein eindeutiger Name. Benötigt, um die Option später zu entfernen.
icon Eine Font Awesome Klasse, wie fa-solid fa-box.
label Der Text, der dem Spieler angezeigt wird.
onSelect Funktion, die aufgerufen wird, wenn der Spieler die Option wählt.
distance Wie nah der Spieler sein muss, in Metern.
canInteract Funktion, die true zurückgibt, um die Option zu zeigen.
groups Job oder Gruppe, die erforderlich ist, um die Option zu sehen.

canInteract erhält die Entity und die Entfernung, damit du eine Option basierend auf jeder Bedingung verstecken kannst:

lua
{
    name = 'my_script_repair',
    icon = 'fa-solid fa-wrench',
    label = 'Repair',
    distance = 2.0,
    canInteract = function(entity, distance, coords, name, bone)
        return GetVehicleEngineHealth(entity) < 900.0
    end,
    onSelect = function(data)
        print('repair', data.entity)
    end,
}

Für Jobs nimmt groups einen Namen oder eine Tabelle und funktioniert auf ESX, QBCore und QBox durch die Unterstützung von ox_target selbst:

lua
groups = 'police',
-- or several, optionally with a minimum grade
groups = { police = 0, sheriff = 2 },

Zonen und Optionen entfernen

Zonen werden mit der ID entfernt, die der Aufruf zurückgab:

lua
exports.ox_target:removeZone(zoneId)

Optionen, die zu Modellen, Entities und globalen Zielen hinzugefügt werden, werden durch den name, den du ihnen gibst, entfernt:

lua
exports.ox_target:removeModel({ `prop_vend_soda_01` }, 'my_script_vending')
exports.ox_target:removeLocalEntity(ped, 'my_script_ped')
exports.ox_target:removeGlobalVehicle('my_script_inspect')

Räume auf, wenn deine Ressource stoppt, andernfalls kann ein Neustart Duplikate hinterlassen:

lua
AddEventHandler('onResourceStop', function(resource)
    if resource ~= GetCurrentResourceName() then return end
    exports.ox_target:removeZone(zoneId)
    exports.ox_target:removeLocalEntity(ped, 'my_script_ped')
end)

Debug einer Zone, die nicht angezeigt wird

Setze debug = true auf der Zone. ox_target zeichnet dann ihre Form in der Welt, damit du sofort siehst, wenn die Box an der falschen Stelle ist, zu klein oder im Boden begraben. Die üblichen Ursachen:

  • Die Zone ist fehlplatziert. Die coords sind das Zentrum, also eine Box, deren Z auf Bodenniveau sitzt, ist halb unter Tage. Erhöhe es um die Hälfte seiner Höhe.
  • Die Entfernung ist zu klein. Der Spieler muss in distance der Zone sein, um die Option zu sehen.
  • Eine Prüfung schlägt fehl. Eine groups oder canInteract, die false zurückgibt, versteckt die Option ohne Fehler. Entferne es vorübergehend zum Testen.
  • Zwei Ziele laufen. Wenn qb-target auch gestartet wird, siehe qb-target vs ox_target.

Standardmäßig hältst du eine Taste (Links Alt) um das Ziel-Auge zu öffnen, also teste mit ihr.

Checkliste

Symptom Behebung
No such export addBoxZone in resource ox_target Starte ox_target (und ox_lib) vor deinem Skript
Option wird nie angezeigt Schalte debug = true ein, prüfe distance, groups und canInteract
Zone ist halb unter Tage coords ist das Zentrum: erhöhe z um die Hälfte der Box-Höhe
Option wird für alle angezeigt Füge groups oder eine canInteract Prüfung hinzu
Duplikate nach Neustart deines Skripts Entferne Zonen und Optionen in onResourceStop
Brauchst eine Option zu entfernen Geben ihr einen name und rufe den passenden remove... Export auf

Kurze Antworten

Wie füge ich eine ox_target Zone von meinem eigenen Skript hinzu?

Rufe exports.ox_target:addBoxZone({ coords = ..., size = ..., rotation = ..., options = { ... } }) auf dem Client auf. Es gibt eine ID zurück, die du behältst, damit du die Zone später entfernen kannst.

Wie zeige ich eine Option nur einigen Jobs?

Verwende groups auf der Option, beispielsweise groups = 'police', oder eine Tabelle für mehrere Jobs. Für alles Spezifischeres, geben true oder false von canInteract zurück.

Warum wird mein Ziel nicht angezeigt?

Normalerweise ist der Spieler außerhalb der Option distance, eine groups oder canInteract Prüfung schlägt fehl, oder ox_target wird nicht vor deinem Skript gestartet. Schalte debug = true auf der Zone ein, um ihre Form zu sehen.

Scripts ohne dieses Problem

Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →Quest CreatorEin visueller Editor für Quests und NPC-Dialoge, Node für Node im Spiel gebaut.Script ansehen →Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →

Weiterlesen