Comment créer des blips de carte dans FiveM : AddBlipForCoord et blips de rayon

Créez des blips dans FiveM avec AddBlipForCoord : sprite, couleur, échelle, courte portée, un label de nom, blips de rayon avec AddBlipForRadius, suppression de blips et blips réservés aux jobs.

Vous appelez AddBlipForCoord et obtenez un point blanc sans icône, ou un blip avec le nom « Blip » ou « NULL », ou un qui reste sur la carte après l'arrêt du script. Les blips sont simples une fois que vous connaissez l'ordre des appels. Cet article vous guide dans la création d'un, son nommage, le dessin d'un rayon, sa suppression, et l'affichage des blips seulement à un job.

Un blip basique

Tous les natives de blips s'exécutent sur le client. Cela crée une icône de magasin à une position :

lua
local blip = AddBlipForCoord(25.7, -1347.3, 29.5)

SetBlipSprite(blip, 52)
SetBlipDisplay(blip, 4)
SetBlipScale(blip, 0.8)
SetBlipColour(blip, 2)
SetBlipAsShortRange(blip, true)

BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName('24/7 Shop')
EndTextCommandSetBlipName(blip)

Ce que chaque appel fait :

Native Objectif
AddBlipForCoord Crée le blip et retourne une poignée. Gardez-la.
SetBlipSprite L'icône, un nombre.
SetBlipDisplay Où il s'affiche : 4 c'est la carte principale et la mini-carte.
SetBlipScale La taille. 1.0 est normal.
SetBlipColour La couleur, un nombre.
SetBlipAsShortRange true l'affiche sur la mini-carte seulement quand proche.

Les nombres pour les sprites et les couleurs sont listés sur le site de documentation FiveM, sous références de jeu, blips. Le sprite 52 ci-dessus est une icône de magasin. Si vous ne voyez qu'un point blanc, le numéro de sprite est faux ou manquant.

Définir le nom

Le label affiché sur la carte et dans le menu pause n'est pas un argument de chaîne simple. Il passe par les natives de commandes de texte, dans cet ordre :

lua
BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName('24/7 Shop')
EndTextCommandSetBlipName(blip)

Le blip doit déjà exister, et vous devez appeler tous les trois. Sautez-en un et le nom est vide ou affiche un défaut. Sans un nom, un blip apparaît dans la légende comme « Blip » ou par son sprite.

Conseil : mettez ces appels dans une fonction qui prend une table, pour que chaque blip soit une ligne dans une config au lieu de dix lignes de natives.

lua
local function createBlip(data)
    local blip = AddBlipForCoord(data.coords.x, data.coords.y, data.coords.z)
    SetBlipSprite(blip, data.sprite)
    SetBlipDisplay(blip, 4)
    SetBlipScale(blip, data.scale or 0.8)
    SetBlipColour(blip, data.colour or 0)
    SetBlipAsShortRange(blip, data.shortRange ~= false)

    BeginTextCommandSetBlipName('STRING')
    AddTextComponentSubstringPlayerName(data.name)
    EndTextCommandSetBlipName(blip)

    return blip
end

local shopBlip = createBlip({
    coords = vec3(25.7, -1347.3, 29.5),
    sprite = 52,
    colour = 2,
    name = '24/7 Shop',
})

Courte portée ou toujours visible

SetBlipAsShortRange(blip, true) signifie que le blip s'affiche seulement sur la mini-carte quand le joueur est proche, et il reste visible sur la carte complète. Avec false, il s'affiche toujours sur la mini-carte, serré aux bords, peu importe où le joueur est. Utilisez la courte portée pour les magasins et les jobs, et false pour un objectif principal.

Blips de rayon

Un blip de rayon est un cercle coloré pour une zone, comme une zone de recherche ou un territoire. AddBlipForRadius crée le cercle, mais pas une icône, donc ajoutez un blip normal au même endroit si vous voulez les deux :

lua
local area = AddBlipForRadius(25.7, -1347.3, 29.5, 150.0)
SetBlipColour(area, 1)
SetBlipAlpha(area, 100)

Le dernier argument est le rayon en mètres. Définissez l'alpha (0 à 255) bas, ou le cercle couvre la carte. Le blip de rayon est une poignée séparée, donc supprimez-le séparément.

Supprimer les blips

Gardez toujours la poignée, et supprimez le blip quand il n'est plus nécessaire :

lua
if DoesBlipExist(shopBlip) then
    RemoveBlip(shopBlip)
end

Les blips ne sont pas supprimés pour vous quand une ressource s'arrête, ou pas de manière fiable, donc nettoyez dans un gestionnaire. Sans cela, redémarrer votre script accumule les doublons sur la carte :

lua
AddEventHandler('onResourceStop', function(resource)
    if resource ~= GetCurrentResourceName() then return end
    if DoesBlipExist(shopBlip) then RemoveBlip(shopBlip) end
    if DoesBlipExist(area) then RemoveBlip(area) end
end)

Blips réservés aux jobs

Les blips sont créés sur le client propre de chaque joueur, donc un blip réservé aux jobs signifie : créez-le pour le bon job, supprimez-le pour tout le monde d'autre. Gardez une table de ce que vous avez créé, et réagissez aux changements de job.

Sur ESX :

lua
local blips = {}

local function refreshBlips(job)
    for i = #blips, 1, -1 do
        RemoveBlip(blips[i])
        blips[i] = nil
    end

    if job and job.name == 'police' then
        blips[#blips + 1] = createBlip({
            coords = vec3(441.2, -981.9, 30.7),
            sprite = 60,
            colour = 3,
            name = 'Police station',
        })
    end
end

RegisterNetEvent('esx:playerLoaded', function(xPlayer)
    refreshBlips(xPlayer.job)
end)

RegisterNetEvent('esx:setJob', function(job)
    refreshBlips(job)
end)

Sur QBCore (et QBox via sa couche de compatibilité) :

lua
local QBCore = exports['qb-core']:GetCoreObject()

RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()
    refreshBlips(QBCore.Functions.GetPlayerData().job)
end)

RegisterNetEvent('QBCore:Client:OnJobUpdate', function(job)
    refreshBlips(job)
end)

Les deux utilisent le même refreshBlips et createBlip d'en haut. Si le script peut redémarrer alors que le joueur est en ligne, appelez aussi refreshBlips une fois au démarrage avec le job courant, puisque l'événement chargé a déjà été déclenché à ce moment-là.

Attention : cacher un blip sur le client n'est pas sécurisé. Un joueur peut toujours le voir s'il patchs le client. Pour un secret, comme un repaire illégal, n'envoyez pas la position au client du tout jusqu'à ce que le joueur l'gagne.

Autres types de blips

  • AddBlipForEntity(entity) suit un véhicule ou un ped.
  • SetBlipRoute(blip, true) dessine une route GPS au blip.
  • SetBlipFlashes(blip, true) le fait clignoter.

Checklist

Problème Solution
Point blanc, pas d'icône Appelez SetBlipSprite avec un numéro de sprite valide
Le blip n'a pas de nom ou a le mauvais nom Utilisez la séquence de trois appels de nom après la création du blip
Le blip est trop grand ou trop petit Ajustez SetBlipScale (1.0 est normal)
Le cercle de rayon cache la carte Baissez-le avec SetBlipAlpha
Doublons après un redémarrage de script RemoveBlip dans onResourceStop
Le blip doit s'afficher pour un seul job Créez et supprimez sur les événements de mise à jour du job

Réponses rapides

Pourquoi mon blip affiche le mauvais nom ou pas de nom ?

Le nom doit être défini avec BeginTextCommandSetBlipName('STRING'), AddTextComponentSubstringPlayerName(name) et EndTextCommandSetBlipName(blip), dans cet ordre, après que le blip existe.

Comment je supprime un blip ?

Appelez RemoveBlip(blip) avec la poignée que vous avez stockée quand vous avez créé le blip. Si vous n'avez pas gardé la poignée, vous ne pouvez pas supprimer ce blip.

Comment je montre un blip pour un seul job ?

Créez-le quand le job du joueur correspond, et supprimez-le quand le job change. Faites-le depuis l'événement de mise à jour du job du framework, puisqu'un blip est créé sur le client.

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 →Advanced BoostingDu boosting de véhicules piloté par tablette : contrats de classe D à S+, crews et file d’attente en direct.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 →

À lire aussi