ox_lib Zonen: lib.zones.box, sphere und poly mit onEnter und onExit

Wie man ox_lib Zonen in FiveM verwendet: lib.zones.box, sphere und poly mit Koordinaten, Größe, Drehung und Debug, onEnter, onExit, inside, Entfernen von Zonen und ox_target.

Du brauchst zu wissen, wann ein Spieler in einen Shop, eine Garage oder einen eingeschränkten Bereich läuft, ohne die Entfernung in einer Schleife jeden Frame zu prüfen. ox_lib Zonen tun das für dich: Du beschreibst eine Form und es ruft deine Funktion auf, wenn der Spieler eintritt oder verlässt. Dieser Leitfaden behandelt die drei Formen, die Callbacks, Entfernung und wann stattdessen ox_target zu verwenden.

Zonen brauchen ox_lib als eine Abhängigkeit, geladen mit @ox_lib/init.lua. Wenn es fehlt, siehe ox_lib init.lua not found.

Zonen-Typen

Es gibt drei, alle unter lib.zones und alle Client-Seite.

Box, ein Rechteck mit einer Höhe, gut für Räume und Türöffnungen:

lua
local zone = lib.zones.box({
    coords = vec3(441.0, -981.0, 30.7),
    size = vec3(4.0, 6.0, 3.0),
    rotation = 90.0,
    debug = true,
    onEnter = function(self)
        print('entered the box')
    end,
    onExit = function(self)
        print('left the box')
    end,
})

Sphere, ein Radius um einen Punkt, gut für offene Bereiche:

lua
local zone = lib.zones.sphere({
    coords = vec3(441.0, -981.0, 30.7),
    radius = 3.0,
    debug = true,
    onEnter = function() print('in range') end,
    onExit = function() print('out of range') end,
})

Poly, ein Umriss von Punkten für unregelmäßige Formen wie einen Hof oder einen Parkplatz:

lua
local zone = lib.zones.poly({
    points = {
        vec3(400.0, -1000.0, 29.0),
        vec3(420.0, -1000.0, 29.0),
        vec3(420.0, -970.0, 29.0),
        vec3(400.0, -970.0, 29.0),
    },
    thickness = 4.0,
    debug = true,
    onEnter = function() print('in the yard') end,
    onExit = function() print('left the yard') end,
})

Für ein Poly ist thickness, wie hoch die Form um die Punkt-Höhe ist. Behalte die Punkte auf Bodenniveau und die Dicke groß genug, um Spieler auf Treppen einzubeziehen.

Koordinaten, Größe und Drehung

  • coords ist das Zentrum einer Box oder Sphere. Bekomme es mit GetEntityCoords(PlayerPedId()), während du dort stehst, oder von einem Koordinaten-Werkzeug.
  • size für eine Box ist Breite, Länge und Höhe als vec3, zentriert auf coords.
  • rotation dreht die Box um ihre vertikale Achse, in Graden. Verwende die Überschrift des Gebäudes oder der Tür.
  • radius ist für Spheres.

Der einfachste Weg, diese richtig zu bekommen, ist debug = true: Die Zone wird in der Welt gezeichnet, damit du hindurch gehen kannst, eine Zahl änderst und die Ressource neu startest, bis es passt. Schalte Debug aus, bevor du freigibst, da es jeden Frame zeichnet.

Callbacks: onEnter, onExit, inside

Drei Callbacks decken die Fälle ab:

lua
local zone = lib.zones.sphere({
    coords = vec3(441.0, -981.0, 30.7),
    radius = 4.0,
    onEnter = function(self)
        lib.showTextUI('[E] Open shop')
    end,
    onExit = function(self)
        lib.hideTextUI()
    end,
    inside = function(self)
        if IsControlJustReleased(0, 38) then
            print('pressed E inside the zone')
        end
    end,
})
  • onEnter und onExit laufen einmal pro Überquerung. Verwende sie für Benachrichtigungen, Text-UI, Laden oder Entladen von etwas.
  • inside läuft jeden Tick während der Spieler drinnen ist. Alles, was jeden Frame geprüft werden muss, wie ein Tastendruck, geht hier hin, und nichts außerhalb der Zone kostet dich etwas.

Halte inside kurz: Keine Datenbank-Aufrufe, keine lib.callback.await, keine Wait in einer Schleife. Für die Tastendruck-Details, siehe markers and text UI.

Zonen entfernen

lib.zones.box gibt ein Objekt zurück. Behalte es und entferne es, wenn der Bereich nicht mehr wichtig ist:

lua
local shopZone

local function createZone()
    shopZone = lib.zones.box({
        coords = vec3(441.0, -981.0, 30.7),
        size = vec3(4.0, 4.0, 3.0),
        onEnter = function() lib.showTextUI('[E] Shop') end,
        onExit = function() lib.hideTextUI() end,
    })
end

local function removeZone()
    if shopZone then
        shopZone:remove()
        shopZone = nil
    end
end

AddEventHandler('onResourceStop', function(resource)
    if resource == GetCurrentResourceName() then
        removeZone()
        lib.hideTextUI()
    end
end)

Denke daran, jede UI zu verstecken, die die Zone angezeigt hat: Wenn der Spieler drinnen ist, wenn du sie entfernst, kann onExit nicht für sie aufgerufen werden.

Du kannst auch eine Zone fragen, ob ein Punkt darin ist, mit zone:contains(coords), beispielsweise um die Position des Spielers zu prüfen, wenn ein Menü öffnet.

Zonen vs ox_target

Sie lösen verschiedene Probleme:

lib.zones ox_target
Frage "Ist der Spieler in diesem Bereich?" "Schaut der Spieler darauf und drückt eine Taste?"
Ausgabe Deine Callbacks Eine Liste von Optionen im Ziel-Menü
Verwende für Sichere Zonen, Geschwindigkeitsbegrenzungen, Musik-Bereiche, NPCs spawnen wenn in der Nähe Türen, Geldautomaten, Shop-Counter, Objekte

Wenn der Spieler wählen sollte zu interagieren, verwende ox_target zones und vergleiche mit älteren Systemen in qb-target vs ox-target. Wenn etwas automatisch passieren sollte, wenn sie ankommen, verwende eine lib Zone. Das Kombinieren von beiden ist üblich: Eine Zone lädt einen Ped, wenn du ankommst, und ox_target gibt dem Ped seine Optionen.

Leistung

Zonen sind billig im Vergleich mit einer manuellen #(coords - playerCoords) < 3.0-Schleife, weil ox_lib sie in einer zentralen Schleife prüft und nur deine inside-Funktion läuft, wo sie gilt. Ein paar Gewohnheiten halten es so:

  • Erstelle Zonen einmal, nicht in einer Schleife oder jedes Mal, wenn ein Menü öffnet.
  • Erstelle nicht Hunderte von kleinen Zonen, wenn eine einzelne größere ausreichen würde.
  • Lege die Arbeit in onEnter und onExit anstatt inside.
  • Schalte debug in der Produktion aus.

Prüfe das Ergebnis mit resmon, wie in high resmon ms.

Checkliste

Symptom Behebung
Zone feuert niemals Verwende das Zentrum coords, die richtige size und rotation; setze debug = true um es zu sehen
lib ist nil Füge @ox_lib/init.lua zu shared_scripts hinzu
Text-UI bleibt nach dem Verlassen Rufe lib.hideTextUI() in onExit und auf wenn die Zone entfernt wird
Tastendruck nicht erkannt Prüfe es in inside, nicht onEnter
Ressourcen-Neustart hinterlässt Zonen Rufe zone:remove() auf onResourceStop auf
Hohe Resmon Halte inside leicht und deaktiviere debug

Kurze Antworten

Was ist der Unterschied zwischen lib.zones und ox_target?

lib.zones sagt dir, wenn der Spieler in einem Bereich ist, also führst du deinen eigenen Code aus. ox_target fügt eine Interaktion (eine Schauen-und-Klick-Option) zu einer Entity oder Zone hinzu. Verwende Zonen für Bereiche, ox_target für Dinge, die der Spieler drückt.

Wie zeige ich eine Zone beim Bauen?

Setze debug = true in den Zone-Optionen. Es zeichnet die Form in der Welt, damit du Koordinaten, Größe und Drehung beheben kannst. Schalte es aus, wenn du fertig bist.

Wie entferne ich eine Zone?

Behalte das Objekt, das lib.zones.box gibt und rufe zone:remove() auf. Mache es, wenn die Ressource stoppt oder wenn der Bereich nicht mehr benötigt wird.

Scripts ohne dieses Problem

Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →Advanced BoostingFahrzeug-Boosting per Tablet: Aufträge von Klasse D bis S+, Crews und eine Live-Warteschlange.Script ansehen →CCTV Security CamerasPlatzierbare Kameras, ein Live-Tablet mit Multi-View und ausgedruckte Beweisfotos.Script ansehen →

Weiterlesen