Strefy ox_lib: lib.zones.box, sphere i poly z onEnter i onExit
Jak używać stref ox_lib w FiveM: lib.zones.box, sphere i poly z coords, rozmiar, rotacja i debug, onEnter, onExit, inside, usuwanie stref, i ox_target.
Potrzebujesz wiedzieć gdy gracz wchodzi do sklepu, garażu lub ograniczonego obszaru, bez sprawdzania dystansu w pętli każdej klatki. Strefy ox_lib to robią dla ciebie: opisujesz kształt, i to wołuje twoją funkcję gdy gracz wchodzi lub wychodzi. Ten przewodnik obejmuje trzy kształty, callback'i, usuwanie i kiedy używać ox_target zamiast.
Strefy potrzebują ox_lib jako zależność, załadowaną z @ox_lib/init.lua. Jeśli brakuje, patrz ox_lib init.lua nie znaleziono.
Typy stref
Są trzy, wszystkie pod lib.zones i wszystkie po stronie klienta.
Box, prostokąt z wysokością, dobry dla pokojów i drzwi:
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, promień wokół punktu, dobry dla otwartych obszarów:
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, kontur punktów dla nieregularnych kształtów takich jak podwórze lub parking:
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,
})Dla poly, thickness to jak wysoki jest kształt wokół wysokości punktów. Trzymaj punkty na poziomie gruntu i grubość wystarczająco dużą aby uwzględnić graczy na schodach.
Coords, rozmiar i rotacja
coordsto centrum box'a lub sphere. Zdobądź to zGetEntityCoords(PlayerPedId())podczas gdy tam stoisz, lub z narzędzia współrzędnych.sizedla box'a to szerokość, długość i wysokość jakovec3, wyśrodkowana nacoords.rotationobraca box wokół jego pionowej osi, w stopniach. Użyj nagłówka budynku lub drzwi.radiusto dla sphere.
Najłatwiej otrzymać te prawidłowe to debug = true: strefa jest rysowana na świecie, więc możesz przechodzić przez nią, zmienić liczbę i uruchomić ponownie zasób aż pasuje. Wyłącz debug przed wydaniem, ponieważ rysuje każdą ramkę.
Callback'i: onEnter, onExit, inside
Trzy callback'i obejmują przypadki:
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,
})onEnterionExituruchamiają się raz na przekroczenie. Użyj ich dla powiadomień, UI tekstu, ładowania lub rozładowywania czegoś.insideuruchamia się każdą klatkę podczas gdy gracz jest wewnątrz. Cokolwiek które musi być sprawdzone każdą ramkę, takie jak wciśnięcie klawisza, idzie tutaj, i nic poza strefą cię nie kosztuje.
Trzymaj inside krótki: bez wezwań bazy danych, bez lib.callback.await, bez Wait w pętli. Dla szczegółu wciśnięcia klawisza, patrz znaczniki i UI tekstu.
Usuwanie stref
lib.zones.box zwraca obiekt. Trzymaj to i usuń to gdy obszar przestaje mieć znaczenie:
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)Pamiętaj aby ukryć każdą UI którą strefa pokazywała: jeśli gracz jest wewnątrz gdy usuwasz, onExit może nie być wołany dla nich.
Możesz także pytać strefę czy punkt jest wewnątrz, z zone:contains(coords), na przykład aby sprawdzić pozycję gracza gdy menu się otwiera.
Strefy vs ox_target
Rozwiązują różne problemy:
| lib.zones | ox_target | |
|---|---|---|
| Pytanie | "Czy gracz jest w tym obszarze?" | "Czy gracz patrzy na to i naciska przycisk?" |
| Wyjście | Twoje callback'i | Lista opcji w menu celu |
| Użyj dla | Bezpieczne strefy, limity prędkości, obszary muzyki, spawn NPC gdy blisko | Drzwi, bankomaty, liczniki sklepów, obiekty |
Jeśli gracz powinien wybrać interakcję, użyj stref ox_target, i porównaj z starszymi systemami w qb-target vs ox-target. Jeśli coś powinno się stać automatycznie gdy przybędą, użyj strefy lib. Łączenie ich jest powszechne: strefa ładuje peda gdy przybywasz, i ox_target daje pedowi jego opcje.
Wydajność
Strefy są tanie w porównaniu z ręczną pętlą #(coords - playerCoords) < 3.0, ponieważ ox_lib sprawdza je w jednej centralnej pętli i tylko uruchamia twoją funkcję inside gdzie ma to zastosowanie. Kilka nawyków to utrzymuje w ten sposób:
- Tworz strefy raz, nie w pętli lub każdy raz gdy menu się otwiera.
- Nie twórz setek małych stref jeśli jedna większa by wystarczyła.
- Umieść pracę w
onEnterionExitraczej niżinside. - Wyłącz
debugw produkcji.
Sprawdzaj rezultat z resmon, jak w high resmon ms.
Checklist
| Objaw | Naprawić |
|---|---|
| Strefa nigdy się nie uruchamia | Użyj centrów coords, prawidłowych size i rotation; ustaw debug = true aby zobaczyć |
lib jest nil |
Dodaj @ox_lib/init.lua do shared_scripts |
| UI tekstu zostaje po wyjściu | Wołaj lib.hideTextUI() w onExit i gdy strefa jest usuwana |
| Wciśnięcie klawisza nie jest wykrywane | Sprawdzaj to w inside, nie onEnter |
| Zasób restart pozostawia strefy | Wołaj zone:remove() na onResourceStop |
Szybkie odpowiedzi
Jaka jest różnica między lib.zones i ox_target?
lib.zones mówi ci gdy gracz jest wewnątrz obszaru, więc uruchamiasz swój własny kod. ox_target dodaje interakcję (opcję look-and-click) do encji lub strefy. Używaj stref dla obszarów, ox_target dla rzeczy które gracz naciska.
Jak pokazać strefę podczas budowania?
Ustaw debug = true w opcjach strefy. Rysuje kształt na świecie, więc możesz naprawić współrzędne, rozmiar i rotację. Wyłącz to gdy skończysz.
Jak usunąć strefę?
Trzymaj obiekt który lib.zones.box zwraca i wołaj zone:remove(). Zrób to gdy zasób się zatrzyma lub gdy obszar już nie jest potrzebny.
Skrypty bez tego problemu
Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →
Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →
CCTV Security CamerasKamery do rozstawienia, tablet z podglądem wielu kamer na żywo i drukowane zdjęcia jako dowody.Zobacz skrypt →