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:

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, promień wokół punktu, dobry dla otwartych obszarów:

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, kontur punktów dla nieregularnych kształtów takich jak podwórze lub parking:

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,
})

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

  • coords to centrum box'a lub sphere. Zdobądź to z GetEntityCoords(PlayerPedId()) podczas gdy tam stoisz, lub z narzędzia współrzędnych.
  • size dla box'a to szerokość, długość i wysokość jako vec3, wyśrodkowana na coords.
  • rotation obraca box wokół jego pionowej osi, w stopniach. Użyj nagłówka budynku lub drzwi.
  • radius to 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:

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 i onExit uruchamiają się raz na przekroczenie. Użyj ich dla powiadomień, UI tekstu, ładowania lub rozładowywania czegoś.
  • inside uruchamia 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:

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)

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 onEnter i onExit raczej niż inside.
  • Wyłącz debug w 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 →

Czytaj dalej