ox_target addBoxZone, addModel i addLocalEntity: jak dodać cele

Jak dodać interakcje ox_target w FiveM: addBoxZone, addSphereZone, addModel, addLocalEntity i addGlobalVehicle, z opcjami, grupami, usuwaniem i debuggowaniem.

Dodajesz cel w twoim skrypcie i w grze nic się nie pokazuje. Lub konsola mówi:

text
No such export addBoxZone in resource ox_target

To praktyczny przewodnik do ox_target na kliencie: strefa, model i encje exporty, opcje które możesz na nich umieścić, i jak usunąć i debugować je.

Upewnij się że ox_target jest uruchomiony najpierw

Exporty istnieją tylko podczas gdy ox_target pracuje, i to potrzebuje ox_lib. W server.cfg, uruchom je przed twoim skryptem:

cfg
ensure oxmysql
ensure ox_lib
ensure ox_target

ensure my_script

Dodaj to także do fxmanifest.lua twojego zasobu, więc FiveM odmawia uruchomienia skryptu bez niego:

lua
dependency 'ox_target'

Wszystkie wołania poniżej są po stronie klienta. Umieść je w pliku klienta, nie serwerze.

Strefa box

Strefa box to prostokąt na świecie. To prawidłowy wybór dla licznika, drzwi lub bankomatu:

lua
local zoneId = exports.ox_target:addBoxZone({
    coords = vec3(441.2, -981.9, 30.7),
    size = vec3(1.5, 1.0, 2.0),
    rotation = 90.0,
    debug = false,
    options = {
        {
            name = 'my_script_counter',
            icon = 'fa-solid fa-box',
            label = 'Open the counter',
            distance = 2.0,
            onSelect = function(data)
                print('selected', data.name)
            end,
        },
    },
})

coords to centrum box'a, size to jego szerokość, długość i wysokość, i rotation obraca go wokół pionowej osi. Trzymaj zwrócony zoneId jeśli usuniesz strefę później.

Strefa sphere

Sphere jest prostszy gdy nie przejmujesz się kształtem, tylko o "blisko tego punktu":

lua
exports.ox_target:addSphereZone({
    coords = vec3(-1037.5, -2737.9, 20.2),
    radius = 1.5,
    options = {
        {
            name = 'my_script_sphere',
            icon = 'fa-solid fa-hand',
            label = 'Talk',
            onSelect = function()
                print('talking')
            end,
        },
    },
})

Modele, encje i pojazdy

Aby skupić każdy obiekt, peda lub pojazd pewnego modelu, użyj addModel. Bierze nazwę modelu lub hash, lub listę z nich:

lua
exports.ox_target:addModel({ `prop_vend_soda_01`, `prop_vend_soda_02` }, {
    {
        name = 'my_script_vending',
        icon = 'fa-solid fa-bottle-water',
        label = 'Use the machine',
        distance = 1.5,
        onSelect = function(data)
            print('entity', data.entity)
        end,
    },
})

Aby skupić jedną encję którą już stworzyłeś na kliencie, użyj addLocalEntity:

lua
local ped = CreatePed(4, `a_m_m_business_01`, 441.2, -981.9, 29.7, 90.0, false, true)

exports.ox_target:addLocalEntity(ped, {
    {
        name = 'my_script_ped',
        icon = 'fa-solid fa-comment',
        label = 'Talk to him',
        onSelect = function(data)
            print('talk to', data.entity)
        end,
    },
})

Aby dodać opcję do każdego pojazdu, użyj addGlobalVehicle. Inne globalne exporty istnieją dla pedów, graczy i obiektów:

lua
exports.ox_target:addGlobalVehicle({
    {
        name = 'my_script_inspect',
        icon = 'fa-solid fa-magnifying-glass',
        label = 'Inspect vehicle',
        distance = 2.5,
        onSelect = function(data)
            print('vehicle', data.entity)
        end,
    },
})

Porada: addLocalEntity istnieje tylko na kliencie który stworzył encję. Dla encji sieciowej którą inni gracze powinni zobaczyć opcję na, użyj wariantu sieciowego (addEntity) z sieciowym id encji.

Pola opcji

Każda opcja to tabela. To pola które będziesz używać najczęściej:

Pole Co robi
name Unikalna nazwa. Potrzebna aby usunąć opcję później.
icon Klasa Font Awesome, takie jak fa-solid fa-box.
label Tekst pokazany graczowi.
onSelect Funkcja wołana gdy gracz wybierze opcję.
distance Jak blisko gracz musi być, w metrach.
canInteract Funkcja która zwraca true aby pokazać opcję.
groups Praca lub grupa potrzebna aby zobaczyć opcję.

canInteract otrzymuje encję i dystans, więc możesz ukryć opcję bazowaną na każdym warunku:

lua
{
    name = 'my_script_repair',
    icon = 'fa-solid fa-wrench',
    label = 'Repair',
    distance = 2.0,
    canInteract = function(entity, distance, coords, name, bone)
        return GetVehicleEngineHealth(entity) < 900.0
    end,
    onSelect = function(data)
        print('repair', data.entity)
    end,
}

Dla prac, groups bierze nazwę lub tabelę, i pracuje na ESX, QBCore i QBox poprzez własne wsparcie framework'u ox_target:

lua
groups = 'police',
-- or several, optionally with a minimum grade
groups = { police = 0, sheriff = 2 },

Usuń strefy i opcje

Strefy są usuwane z id które wołanie zwróciło:

lua
exports.ox_target:removeZone(zoneId)

Opcje dodane do modeli, encji i globalnych celów są usuwane przez name który dałeś im:

lua
exports.ox_target:removeModel({ `prop_vend_soda_01` }, 'my_script_vending')
exports.ox_target:removeLocalEntity(ped, 'my_script_ped')
exports.ox_target:removeGlobalVehicle('my_script_inspect')

Czyść gdy twój zasób się zatrzymuje, inaczej restart może pozostawić duplikaty:

lua
AddEventHandler('onResourceStop', function(resource)
    if resource ~= GetCurrentResourceName() then return end
    exports.ox_target:removeZone(zoneId)
    exports.ox_target:removeLocalEntity(ped, 'my_script_ped')
end)

Debuguj strefę która się nie pokazuje

Ustaw debug = true na strefie. ox_target wtedy rysuje jej kształt na świecie, więc widzisz od razu czy box jest źle umieszczony, zbyt mały, czy zagrożony w podłodze. Zwykłe przyczyny:

  • Strefa jest błędnie umieszczona. coords to centrum, więc box którego z siedzi na poziomie podłogi jest w połowie pod ziemią. Podnieś to o połowę jego wysokości.
  • Dystans jest zbyt mały. Gracz musi być wewnątrz distance strefy aby zobaczyć opcję.
  • Sprawdzenie nie powiedzie się. groups lub canInteract która zwraca false ukrywa opcję bez błędu. Tymczasowo usuń to aby testować.
  • Dwa cele są uruchomione. Jeśli qb-target jest też uruchomiony, patrz qb-target vs ox_target.

Domyślnie trzymasz klawisz (Left Alt) aby otworzyć oko kierowania, więc testuj z nim wciśniętym.

Checklist

Objaw Naprawić
No such export addBoxZone in resource ox_target Uruchom ox_target (i ox_lib) przed twoim skryptem
Opcja nigdy się nie pokazuje Włącz debug = true, sprawdzaj distance, groups i canInteract
Strefa jest w połowie pod ziemią coords to centrum: podnieś z o połowę wysokości box'a
Opcja pokazuje się dla wszystkich Dodaj groups lub canInteract sprawdzenie
Duplikaty po restarcie twojego skryptu Usuń strefy i opcje w onResourceStop
Musisz usunąć jedną opcję Daj jej name i wołaj pasujący remove... export

Szybkie odpowiedzi

Jak dodać strefę ox_target ze swojego własnego skryptu?

Wołaj exports.ox_target:addBoxZone({ coords = ..., size = ..., rotation = ..., options = { ... } }) na kliencie. Zwraca id które trzymasz aby mogła usunąć strefę później.

Jak pokazać opcję tylko niektórym pracom?

Użyj groups na opcji, na przykład groups = 'police', lub tabeli dla kilku prac. Dla czegoś bardziej specjalnego, zwróć true lub false z canInteract.

Dlaczego mój cel się nie pojawia?

Zwykle gracz jest poza distance opcji, groups lub canInteract sprawdzenie nie powiedzie się, lub ox_target nie jest uruchamiany przed twoim skryptem. Włącz debug = true na strefie aby zobaczyć jej kształt.

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 →Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →

Czytaj dalej