ox_target addBoxZone, addModel et addLocalEntity : comment ajouter des cibles

Comment ajouter des interactions ox_target dans FiveM : addBoxZone, addSphereZone, addModel, addLocalEntity et addGlobalVehicle, avec des options, des groupes, la suppression et le debug.

Vous ajoutez une cible dans votre script et en jeu rien ne s'affiche. Ou la console dit :

text
No such export addBoxZone in resource ox_target

Ceci est le guide pratique d'ox_target sur le client : la zone, le modèle et les exports d'entité, les options que vous pouvez y mettre, et comment les supprimer et les déboguer.

Assurez-vous que ox_target est démarré en premier

Les exports n'existent que tant que ox_target s'exécute, et il a besoin d'ox_lib. Dans server.cfg, démarrez-les avant votre script :

cfg
ensure oxmysql
ensure ox_lib
ensure ox_target

ensure my_script

Ajoutez-le aussi au fxmanifest.lua de votre ressource, afin que FiveM refuse de démarrer le script sans lui :

lua
dependency 'ox_target'

Tous les appels ci-dessous sont côté client. Mettez-les dans un fichier client, pas dans un serveur.

Une zone boîte

Une zone boîte est un rectangle dans le monde. C'est le bon choix pour un comptoir, une porte ou un guichet automatique :

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 est le centre de la boîte, size est sa largeur, longueur et hauteur, et rotation la tourne autour de l'axe vertical. Gardez le zoneId retourné si vous supprimerez la zone plus tard.

Une zone sphère

Une sphère est plus simple quand vous ne vous souciez pas de la forme, seulement du « près de ce point » :

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

Modèles, entités et véhicules

Pour cibler chaque objet, ped ou véhicule d'un certain modèle, utilisez addModel. Il prend un nom ou un hash de modèle, ou une liste :

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

Pour cibler une entité que vous avez déjà créée sur votre client, utilisez 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,
    },
})

Pour ajouter une option à chaque véhicule, utilisez addGlobalVehicle. D'autres exports globaux existent pour les peds, les joueurs et les objets :

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

Astuce : addLocalEntity n'existe que sur le client qui a créé l'entité. Pour une entité en réseau que d'autres joueurs devraient voir l'option, utilisez la variante en réseau (addEntity) avec l'id réseau de l'entité.

Les champs d'option

Chaque option est une table. Ce sont les champs que vous utiliserez le plus :

Champ Ce qu'il fait
name Un nom unique. Nécessaire pour supprimer l'option plus tard.
icon Une classe Font Awesome, comme fa-solid fa-box.
label Le texte affiché au joueur.
onSelect Fonction appelée quand le joueur choisit l'option.
distance À quelle distance le joueur doit être, en mètres.
canInteract Fonction qui retourne true pour afficher l'option.
groups Emploi ou groupe nécessaire pour voir l'option.

canInteract reçoit l'entité et la distance, afin que vous puissiez masquer une option en fonction de n'importe quelle condition :

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

Pour les emplois, groups prend un nom ou une table, et fonctionne sur ESX, QBCore et QBox via le support de framework propre à ox_target :

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

Supprimer les zones et les options

Les zones sont supprimées avec l'id que l'appel a retourné :

lua
exports.ox_target:removeZone(zoneId)

Les options ajoutées aux modèles, entités et cibles globales sont supprimées par le name que vous leur avez donné :

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')

Nettoyez quand votre ressource s'arrête, sinon un redémarrage peut laisser des doublons derrière :

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)

Déboguer une zone qui ne s'affiche pas

Définissez debug = true sur la zone. ox_target dessine alors sa forme dans le monde, de sorte que vous voyez immédiatement si la boîte est mal placée, trop petite, ou enterrée dans le sol. Les causes habituelles :

  • La zone est mal placée. Les coords sont le centre, donc une boîte dont z s'assied au niveau du sol est à moitié sous terre. Relevez-la de la moitié de sa hauteur.
  • La distance est trop petite. Le joueur doit être dans la distance de la zone pour voir l'option.
  • Une vérification échoue. Un groups ou un canInteract qui retourne false masque l'option sans erreur. Supprimez-le temporairement pour tester.
  • Deux cibles s'exécutent. Si qb-target démarre aussi, voir qb-target vs ox_target.

Par défaut, vous tenez une touche (Alt gauche) pour ouvrir l'œil de ciblage, donc testez avec elle tenue enfoncée.

Liste de contrôle

Symptôme Correction
No such export addBoxZone in resource ox_target Démarrer ox_target (et ox_lib) avant votre script
L'option ne s'affiche jamais Activer debug = true, vérifier distance, groups et canInteract
La zone est à moitié sous terre coords est le centre : relevez z de la moitié de la hauteur de la boîte
L'option s'affiche pour tout le monde Ajouter groups ou une vérification canInteract
Doublons après redémarrage de votre script Supprimer les zones et les options dans onResourceStop
Besoin de supprimer une option Lui donner un name et appeler l'export remove... correspondant

Réponses rapides

Comment ajouter une zone ox_target à partir de mon propre script ?

Appelez exports.ox_target:addBoxZone({ coords = ..., size = ..., rotation = ..., options = { ... } }) sur le client. Il retourne un id que vous gardez pour pouvoir supprimer la zone plus tard.

Comment afficher une option seulement à certains emplois ?

Utilisez groups sur l'option, par exemple groups = 'police', ou une table pour plusieurs emplois. Pour quelque chose de plus spécifique, retournez true ou false à partir de canInteract.

Pourquoi ma cible n'apparaît-elle pas ?

Généralement le joueur est en dehors de la distance de l'option, une vérification groups ou canInteract échoue, ou ox_target n'est pas démarré avant votre script. Activez debug = true sur la zone pour voir sa forme.

Des scripts sans ce problème

Shop CreatorCréez un magasin en moins d’une minute — propriétaires, employés, coffres et braquages inclus.Voir le script →Quest CreatorUn éditeur visuel de quêtes et de dialogues PNJ, construit nœud par nœud en jeu.Voir le script →Item Creator V2Créez des items utilisables avec animations, props, effets et plus — sans écrire une ligne de code.Voir le script →

À lire aussi