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:
No such export addBoxZone in resource ox_targetTo 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:
ensure oxmysql
ensure ox_lib
ensure ox_target
ensure my_scriptDodaj to także do fxmanifest.lua twojego zasobu, więc FiveM odmawia uruchomienia skryptu bez niego:
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:
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":
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:
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:
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:
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:
addLocalEntityistnieje 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:
{
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:
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:
exports.ox_target:removeZone(zoneId)Opcje dodane do modeli, encji i globalnych celów są usuwane przez name który dałeś im:
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:
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.
coordsto 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
distancestrefy aby zobaczyć opcję. - Sprawdzenie nie powiedzie się.
groupslubcanInteractktó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 →