Ajouter des interactions
Ajoutez des interactions personnalisées au context menu via les exports addGlobalPlayers, addGlobalPeds, addGlobalVehicles, addGlobalObjects. Ces exports fonctionnent pour les styles context et custom. Le style normal délègue à ox_target et ne les rend pas.
Exports disponibles
| Export | Cible |
|---|---|
addGlobalPlayers | Joueurs |
addGlobalPeds | PNJ |
addGlobalVehicles | Véhicules |
addGlobalObjects | Objets |
Exemple sur un joueur
exports.core:addGlobalPlayers({
{
label = "Saluer",
distance = 3.0,
canInteract = function(entity, distance)
return IsPedAPlayer(entity)
end,
onSelect = function(data)
-- data.entity = l'entité cliquée
-- data.coords = coordonnées
-- data.distance = distance
-- data.name = nom de l'item
ExecuteCommand("salut")
end
}
})Exemple sur un PNJ
exports.core:addGlobalPeds({
{
label = "Parler",
distance = 3.0,
canInteract = function(entity)
return GetEntityModel(entity) == GetHashKey("a_m_y_business_01")
end,
onSelect = function(data)
-- data.entity = le ped
end
}
})Exemple sur un véhicule
exports.core:addGlobalVehicles({
{
label = "Copier la plaque",
distance = 5.0,
onSelect = function(data)
lib.setClipboard(GetVehicleNumberPlateText(data.entity))
end
}
})Exemple sur un objet
exports.core:addGlobalObjects({
{
label = "Utiliser",
distance = 2.0,
canInteract = function(entity)
return GetEntityModel(entity) == GetHashKey("prop_vend_snak_01")
end,
onSelect = function(data)
-- data.entity = l'objet
end
}
})Exemple de sous-menu
Utilisez le champ items pour créer un sous-menu. Les items enfants peuvent eux-mêmes avoir des items pour des sous-menus imbriqués.
exports.core:addGlobalPlayers({
{
label = "Porter",
distance = 3.0,
items = {
{ label = "Sur le dos", command = "porter" },
{ label = "Sur l'épaule", command = "porter3" },
{ label = "Dans les bras", command = "porter2" },
}
}
})Exemple de sous-menu dynamique
Si le contenu du sous-menu dépend de l'état du jeu (grades d'entreprise, inventaire, etc.), items peut être une fonction évaluée à chaque ouverture du menu :
exports.core:addGlobalPlayers({
{
label = "Recruter",
distance = 3.0,
items = function(entity, distance)
local grades = getCurrentJobGrades()
local result = {}
for _, grade in ipairs(grades) do
result[#result + 1] = {
label = grade.label,
onSelect = function(data)
TriggerServerEvent("myjob:recruit", GetPlayerServerId(NetworkGetPlayerIndexFromPed(data.entity)), grade.id)
end
}
end
return result
end
}
})Champs supportés
| Champ | Type | Description |
|---|---|---|
label | string | Texte du bouton (requis) |
name | string | Identifiant pour delGlobalXxx (par défaut = label) |
distance | number | Distance max en mètres (par défaut 3.0) |
canInteract | boolean | fun(entity, distance): boolean | Condition d'affichage |
onSelect | fun(data) | Action au clic |
items | table[] | fun(entity, distance): table[] | Sous-menu (statique ou dynamique) |
event | string | Événement client déclenché au clic (alternative à onSelect) |
serverEvent | string | Événement serveur déclenché au clic |
command | string | Commande exécutée au clic |
export | string ("resource:name") | Export déclenché au clic (exports.resource:name(data)) |
Provider dynamique (styles context et custom)
Pour injecter des items plats au niveau principal (pas de sous-menu) qui changent dynamiquement, utilisez addGlobalProvider. La fonction est appelée à chaque ouverture du context menu et retourne la liste d'items à afficher.
exports.core:addGlobalProvider(3, function(entity, distance)
local items = {}
if isSomeCondition(entity) then
items[#items + 1] = {
label = "Action spéciale",
onSelect = function(data) doSomething(data.entity) end
}
end
return items
end)Types d'entités : 0 monde, 1 ped, 2 véhicule, 3 objet, 4 joueur.
Retirer une interaction
exports.core:delGlobalPlayers("Saluer")
exports.core:delGlobalVehicles({"Copier la plaque", "Réparer"})
exports.core:delGlobal(1, "Saluer") -- 1 = ped, 2 = véhicule, 3 = objet, 4 = playerLes interactions ajoutées par votre ressource sont automatiquement retirées à son arrêt.
Types d'entités
| Type | Description |
|---|---|
0 | Monde (pas d'entité) |
1 | Ped (PNJ) |
2 | Véhicule |
3 | Objet |
4 | Joueur |
Alias ECM
Les mêmes fonctions sont exposées sous un préfixe ECM: pour la compatibilité avec les ressources écrites pour ECM :
exports.core['ECM:addGlobalPlayers'](options)
exports.core['ECM:addGlobalPeds'](options)
exports.core['ECM:addGlobalVehicles'](options)
exports.core['ECM:addGlobalObjects'](options)
exports.core['ECM:delGlobalPlayers'](names)
exports.core['ECM:delGlobalPeds'](names)
exports.core['ECM:delGlobalVehicles'](names)
exports.core['ECM:delGlobalObjects'](names)Zones
Le context menu expose aussi des zones autonomes, disponibles pour les styles normal et custom :
exports.core:addBoxZone(spec)
exports.core:addSphereZone(spec)
exports.core:addPolyZone(spec)
exports.core:removeZone(name)
local style = exports.core:GetContextType()Style Normal (ox_target)
Pour le style "normal", utilisez directement les exports ox_target (exports.ox_target:addGlobalPlayer, etc.). Voir la documentation ox_target.