qb-target vs ox_target: konwertuj AddBoxZone i napraw niewidoczne cele

Przechodzenie z qb-target do ox_target na FiveM: jak konwertować wezwania AddBoxZone i AddTargetModel, co robi warstwa kompatybilności i dlaczego cele się nie pokazują.

Przeszedłeś z qb-target do ox_target, lub pobrałeś skrypt napisany dla jednego, podczas gdy uruchamiasz drugi, i strefy interakcji znikęły lub się podwójły. Oto jak się różnią, jak konwertować wezwania i jak znaleźć dlaczego cel się nie pokazuje.

Różnica w jednej tabeli

Oba zasoby robią tę samą pracę: klawisz otwiera oko targetowania i gracz wybiera opcję na encji lub w strefie. Różnią się w sposobie, w jaki to opisujesz.

Idea qb-target ox_target
Box zone AddBoxZone(name, center, length, width, options, targetOptions) addBoxZone({ coords, size, rotation, options })
Model AddTargetModel(models, options) addModel(models, options)
Co zrobić type, event, action onSelect, event, serverEvent
Job limit job groups
Item limit item items
Extra check canInteract canInteract

ox_target przyjmuje jedną tabelę dla stref, a opcje to zwykła lista, bez wrapper, który trzyma options i distance razem.

Konwertuj box zone

Typowa strefa qb-target:

lua
exports['qb-target']:AddBoxZone('pd_armory', vector3(452.2, -980.0, 30.7), 1.5, 1.0, {
    name = 'pd_armory',
    heading = 90.0,
    debugPoly = false,
    minZ = 29.7,
    maxZ = 31.7,
}, {
    options = {
        {
            type = 'client',
            event = 'my_script:openArmory',
            icon = 'fas fa-gun',
            label = 'Open armory',
            job = 'police',
        },
    },
    distance = 2.0,
})

Ta sama strefa w ox_target:

lua
exports.ox_target:addBoxZone({
    coords = vec3(452.2, -980.0, 30.7),
    size = vec3(1.0, 1.5, 2.0),
    rotation = 90.0,
    debug = false,
    options = {
        {
            name = 'pd_armory',
            event = 'my_script:openArmory',
            icon = 'fa-solid fa-gun',
            label = 'Open armory',
            groups = 'police',
            distance = 2.0,
        },
    },
})

Co się zmieniło:

  • center staje się coords, i jest centrum pudła w obu, ale wysokość teraz pochodzi z size. qb-target używa minZ i maxZ, więc umieść coords.z w połowie między nimi i użyj ich przerwy jako wysokości.
  • length i width stają się x i y z size. Jeśli pudło skończy się w złą stronę, zamień je lub zmień rotation i sprawdź za pomocą debug = true.
  • heading staje się rotation.
  • job staje się groups, a distance przenosi się do każdej opcji.
  • type = 'client' z event pozostaje event. Użyj serverEvent dla type = 'server', lub onSelect z funkcją zamiast zdarzenia.

Konwertuj cel modelu

qb-target:

lua
exports['qb-target']:AddTargetModel({ `prop_atm_01`, `prop_atm_02` }, {
    options = {
        {
            type = 'client',
            event = 'my_script:openAtm',
            icon = 'fas fa-credit-card',
            label = 'Use ATM',
        },
    },
    distance = 1.5,
})

ox_target:

lua
exports.ox_target:addModel({ `prop_atm_01`, `prop_atm_02` }, {
    {
        name = 'my_script_atm',
        event = 'my_script:openAtm',
        icon = 'fa-solid fa-credit-card',
        label = 'Use ATM',
        distance = 1.5,
    },
})

Opcje są teraz samym drugim argumentem, listą tabel opcji. Pełna lista eksportów i pól znajduje się w ox_target: addBoxZone, addModel i addLocalEntity.

Utrzymuj stary skrypt pracującym

ox_target zapewnia kompatybilność dla wielu eksportów qb-target. Skrypt, który wciąż wezwie exports['qb-target']:AddBoxZone(...) może ciągle działać, gdy tylko ox_target jest uruchomiony, o ile używa wspólnych eksportów.

Nie polegaj na tym dla wszystkiego. Mniej powszechne exportsów i niezwykłe pola opcji mogą nie zachowywać się tak samo. Testuj każdy skrypt i gdy jeden źle się zachowuje, konwertuj jego wezwania do natywnych eksportów ox_target, jak pokazano powyżej. Natywne wezwania są również łatwiejsze do czytania i debugowania.

Ostrzeżenie: nie uruchamiaj qb-target obok ox_target, aby „się upewnić". Utrzymuj tylko jeden zasób targetowania i usuń drugi z server.cfg.

Dlaczego cele się nie pokazują

Prawie każdy przypadek „mój cel jest niewidoczny" spada na tę listę.

Oba zasoby działają. Dwa zasoby targetowania walczą o ten sam klawisz. Sprawdź server.cfg i listę zasobów, i utrzymuj tylko jeden:

cfg
ensure ox_lib
ensure ox_target
# ensure qb-target   <- remove or comment out

Odległość jest zbyt mała. Opcja pokazuje się tylko wewnątrz jej distance. Spróbuj distance = 3.0 podczas testowania. Z qb-target, distance siedzi obok options, nie wewnątrz każdej opcji.

Sprawdzenie pracy nie powiedzie się. Opcja z job (qb-target) lub groups (ox_target) jest ukryta dla każdego bez tej pracy, bez błędu. Testuj z właściwą pracą, lub usuń pole na chwilę. Na ox_target ocena w tabeli ({ police = 2 }) oznacza, że gracz musi mieć co najmniej tę ocenę.

A canInteract zwraca nic. Jeśli funkcja ma ścieżkę kodu, która zwraca nil, opcja jest ukryta. Sprawdź, czy zwraca true lub false na każdej ścieżce.

Strefa jest w złym miejscu. Włącz debug = true na ox_target (lub debugPoly = true na qb-target) i spójrz na kształt. Pudło wyśrodkowane na podłodze jest połową podziemnie.

Skrypt działa przed celem. Uruchom zasób targetowania przed skryptem w server.cfg i dodaj dependency 'ox_target' do manifestu.

Lista kontrolna

Symptom Naprawa
Opcje podwójne lub brakujące Uruchamiaj tylko jeden z qb-target i ox_target
job ignorowany po konwersji Zmień nazwę na groups
Strefa jest obracana lub źle zmieniana heading staje się rotation; sprawdź size za pomocą debug = true
Opcja nigdy się nie pokazuje Zwiększ distance, testuj pracę i canInteract
Stary skrypt przestaje działać Konwertuj jego wezwania do natywnych eksportów ox_target
Nic się nie pokazuje w ogóle Uruchom ox_target i ox_lib przed twoimi skryptami

Szybkie odpowiedzi

Czy mogę uruchamiać qb-target i ox_target razem?

Nie. Wybierz jeden. Oba zasoby chcą tego samego klawisza targetowania i tej samej pracy, a uruchomienie obu daje ci podwójne lub brakujące opcje.

Czy moje stare skrypty qb-target pracują z ox_target?

Często tak. ox_target zapewnia kompatybilność dla wielu eksportów qb-target, więc skrypty je wywołujące mogą ciągle działać. Testuj każdy skrypt i konwertuj te, które źle się zachowują, na natywne exportsów ox_target.

Co zastępuje pole job qb-target?

ox_target używa groups. Ustaw groups = 'police', lub tabelę taką jak { police = 0 } aby również wymagać oceny.

Skrypty bez tego problemu

Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →Quest CreatorWizualny edytor questów i dialogów z NPC, budowanych węzeł po węźle w grze.Zobacz skrypt →Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →

Czytaj dalej