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:
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:
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:
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
coordsist das Zentrum einer Box oder Sphere. Bekomme es mitGetEntityCoords(PlayerPedId()), während du dort stehst, oder von einem Koordinaten-Werkzeug.sizefür eine Box ist Breite, Länge und Höhe alsvec3, zentriert aufcoords.rotationdreht die Box um ihre vertikale Achse, in Graden. Verwende die Überschrift des Gebäudes oder der Tür.radiusist 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:
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,
})onEnterundonExitlaufen einmal pro Überquerung. Verwende sie für Benachrichtigungen, Text-UI, Laden oder Entladen von etwas.insidelä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:
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
onEnterundonExitanstattinside. - Schalte
debugin 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 →