ox_target addBoxZone, addModel und addLocalEntity: wie man Ziele hinzufügt
Wie man ox_target Interaktionen in FiveM hinzufügt: addBoxZone, addSphereZone, addModel, addLocalEntity und addGlobalVehicle, mit Optionen, Gruppen, Entfernung und Debug.
Du fügt ein Ziel in deinem Skript hinzu und im Spiel wird nichts angezeigt. Oder die Konsole sagt:
No such export addBoxZone in resource ox_targetDies ist der praktische Leitfaden zu ox_target auf dem Client: die Zone, Modell und Entity-Exporte, die Optionen, die du auf sie legen kannst, und wie man sie entfernt und debuggt.
Stelle sicher, dass ox_target zuerst gestartet wird
Die Exporte existieren nur, während ox_target läuft, und es braucht ox_lib. In server.cfg, starte sie vor deinem Skript:
ensure oxmysql
ensure ox_lib
ensure ox_target
ensure my_scriptFüge es auch zu deiner Ressource fxmanifest.lua hinzu, damit FiveM sich weigert, das Skript ohne sie zu starten:
dependency 'ox_target'Alle Aufrufe unten sind Client-Seite. Lege sie in eine Client-Datei, nicht eine Server-Datei.
Eine Box-Zone
Eine Box-Zone ist ein Rechteck in der Welt. Es ist die richtige Wahl für einen Counter, eine Tür oder einen Geldautomaten:
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 ist das Zentrum der Box, size ist ihre Breite, Länge und Höhe, und rotation dreht sie um die vertikale Achse. Behalte die zurückgegebene zoneId, wenn du die Zone später entfernst.
Eine Sphere-Zone
Eine Sphere ist einfacher, wenn dir die Form egal ist, nur "in der Nähe dieses Punktes":
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,
},
},
})Modelle, Entities und Fahrzeuge
Um jedes Objekt, Ped oder Fahrzeug eines bestimmten Modells zu treffen, verwende addModel. Es nimmt einen Modellnamen oder Hash oder eine Liste davon:
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,
},
})Um eine Entity zu treffen, die du bereits auf deinem Client erstellt hast, verwende 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,
},
})Um eine Option zu jedem Fahrzeug hinzuzufügen, verwende addGlobalVehicle. Andere globale Exporte existieren für Peds, Spieler und Objekte:
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,
},
})Tipp:
addLocalEntityexistiert nur auf dem Client, der die Entity erstellt hat. Für eine vernetzte Entity, auf der andere Spieler die Option sehen sollten, verwende die vernetzte Variante (addEntity) mit der Entity's Netzwerk-ID.
Die Options-Felder
Jede Option ist eine Tabelle. Dies sind die Felder, die du am meisten verwendendest:
| Feld | Was es tut |
|---|---|
name |
Ein eindeutiger Name. Benötigt, um die Option später zu entfernen. |
icon |
Eine Font Awesome Klasse, wie fa-solid fa-box. |
label |
Der Text, der dem Spieler angezeigt wird. |
onSelect |
Funktion, die aufgerufen wird, wenn der Spieler die Option wählt. |
distance |
Wie nah der Spieler sein muss, in Metern. |
canInteract |
Funktion, die true zurückgibt, um die Option zu zeigen. |
groups |
Job oder Gruppe, die erforderlich ist, um die Option zu sehen. |
canInteract erhält die Entity und die Entfernung, damit du eine Option basierend auf jeder Bedingung verstecken kannst:
{
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,
}Für Jobs nimmt groups einen Namen oder eine Tabelle und funktioniert auf ESX, QBCore und QBox durch die Unterstützung von ox_target selbst:
groups = 'police',
-- or several, optionally with a minimum grade
groups = { police = 0, sheriff = 2 },Zonen und Optionen entfernen
Zonen werden mit der ID entfernt, die der Aufruf zurückgab:
exports.ox_target:removeZone(zoneId)Optionen, die zu Modellen, Entities und globalen Zielen hinzugefügt werden, werden durch den name, den du ihnen gibst, entfernt:
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')Räume auf, wenn deine Ressource stoppt, andernfalls kann ein Neustart Duplikate hinterlassen:
AddEventHandler('onResourceStop', function(resource)
if resource ~= GetCurrentResourceName() then return end
exports.ox_target:removeZone(zoneId)
exports.ox_target:removeLocalEntity(ped, 'my_script_ped')
end)Debug einer Zone, die nicht angezeigt wird
Setze debug = true auf der Zone. ox_target zeichnet dann ihre Form in der Welt, damit du sofort siehst, wenn die Box an der falschen Stelle ist, zu klein oder im Boden begraben. Die üblichen Ursachen:
- Die Zone ist fehlplatziert. Die
coordssind das Zentrum, also eine Box, deren Z auf Bodenniveau sitzt, ist halb unter Tage. Erhöhe es um die Hälfte seiner Höhe. - Die Entfernung ist zu klein. Der Spieler muss in
distanceder Zone sein, um die Option zu sehen. - Eine Prüfung schlägt fehl. Eine
groupsodercanInteract, die false zurückgibt, versteckt die Option ohne Fehler. Entferne es vorübergehend zum Testen. - Zwei Ziele laufen. Wenn qb-target auch gestartet wird, siehe qb-target vs ox_target.
Standardmäßig hältst du eine Taste (Links Alt) um das Ziel-Auge zu öffnen, also teste mit ihr.
Checkliste
| Symptom | Behebung |
|---|---|
No such export addBoxZone in resource ox_target |
Starte ox_target (und ox_lib) vor deinem Skript |
| Option wird nie angezeigt | Schalte debug = true ein, prüfe distance, groups und canInteract |
| Zone ist halb unter Tage | coords ist das Zentrum: erhöhe z um die Hälfte der Box-Höhe |
| Option wird für alle angezeigt | Füge groups oder eine canInteract Prüfung hinzu |
| Duplikate nach Neustart deines Skripts | Entferne Zonen und Optionen in onResourceStop |
| Brauchst eine Option zu entfernen | Geben ihr einen name und rufe den passenden remove... Export auf |
Kurze Antworten
Wie füge ich eine ox_target Zone von meinem eigenen Skript hinzu?
Rufe exports.ox_target:addBoxZone({ coords = ..., size = ..., rotation = ..., options = { ... } }) auf dem Client auf. Es gibt eine ID zurück, die du behältst, damit du die Zone später entfernen kannst.
Wie zeige ich eine Option nur einigen Jobs?
Verwende groups auf der Option, beispielsweise groups = 'police', oder eine Tabelle für mehrere Jobs. Für alles Spezifischeres, geben true oder false von canInteract zurück.
Warum wird mein Ziel nicht angezeigt?
Normalerweise ist der Spieler außerhalb der Option distance, eine groups oder canInteract Prüfung schlägt fehl, oder ox_target wird nicht vor deinem Skript gestartet. Schalte debug = true auf der Zone ein, um ihre Form zu sehen.
Scripts ohne dieses Problem
Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →
Quest CreatorEin visueller Editor für Quests und NPC-Dialoge, Node für Node im Spiel gebaut.Script ansehen →
Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →