Como criar blips no mapa em FiveM: AddBlipForCoord e radius blips

Crie blips em FiveM com AddBlipForCoord: sprite, cor, escala, short range, um rótulo de nome, radius blips com AddBlipForRadius, removendo blips e blips apenas para jobs.

Você chama AddBlipForCoord e obtém um ponto branco sem ícone, ou um blip com o nome "Blip" ou "NULL", ou um que fica no mapa após o script parar. Blips são simples uma vez que você sabe a ordem das chamadas. Este artigo percorre criar um, nomeá-lo, desenhar um raio, removê-lo, e mostrar blips apenas para um job.

Um blip básico

Todos os nativos de blip rodam no cliente. Isto cria um ícone de loja em uma posição:

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)

O que cada chamada faz:

Nativo Propósito
AddBlipForCoord Cria o blip e retorna um handle. Mantenha-o.
SetBlipSprite O ícone, um número.
SetBlipDisplay Onde mostra: 4 é o mapa principal e o minimap.
SetBlipScale O tamanho. 1.0 é normal.
SetBlipColour A cor, um número.
SetBlipAsShortRange true mostra no minimap apenas quando próximo.

Os números para sprites e cores estão listados no site de documentação do FiveM, em game references, blips. O sprite 52 acima é um ícone de loja. Se você vê apenas um ponto branco, o número do sprite está errado ou faltando.

Defina o nome

O rótulo mostrado no mapa e no menu de pausa não é um argumento de string simples. Passa pelos nativos de comando de texto, nesta ordem:

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

O blip deve já existir, e você deve chamar os três. Pule um e o nome é vazio ou mostra um padrão. Sem um nome, um blip aparece na legenda como "Blip" ou pelo seu sprite.

Dica: coloque estas chamadas em uma função que pega uma tabela, para que cada blip seja uma linha em uma config em vez de dez linhas de nativos.

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

Short range ou sempre visível

SetBlipAsShortRange(blip, true) significa que o blip apenas mostra no minimap quando o jogador está próximo, e ainda é visível no mapa completo. Com false, sempre mostra no minimap, edge-clamped, onde quer que o jogador esteja. Use short range para lojas e jobs, e false para um objetivo principal.

Radius blips

Um radius blip é um círculo colorido para uma área, como uma zona de busca ou um turf. AddBlipForRadius faz o círculo, mas não um ícone, então adicione um blip normal no mesmo local se quiser ambos:

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

O último argumento é o raio em metros. Defina o alpha (0 a 255) baixo, ou o círculo cobre o mapa. O radius blip é um handle separado, então remova-o separadamente.

Remova blips

Sempre mantenha o handle, e remova o blip quando não for mais necessário:

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

Blips não são removidos para você quando um recurso para, ou não confiável, então limpe em um handler. Sem ele, reiniciar seu script empilha duplicatas no mapa:

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 apenas para job

Blips são criados no próprio cliente de cada jogador, então um blip apenas para job significa: crie-o para o job certo, remova-o para todos os outros. Mantenha uma tabela do que você criou, e reaja a mudanças de job.

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

No QBCore (e QBox através de sua camada de compatibilidade):

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)

Ambos usam o mesmo refreshBlips e createBlip acima. Se o script pode reiniciar enquanto o jogador está online, também chame refreshBlips uma vez ao iniciar com o job atual, já que o evento de carregamento já disparou até então.

Atenção: esconder um blip no cliente não é segurança. Um jogador ainda pode vê-lo se patchar o cliente. Para um segredo, como um esconderijo ilegal, não envie a posição ao cliente até que o jogador a ganhe.

Outros tipos de blip

  • AddBlipForEntity(entity) segue um veículo ou um ped.
  • SetBlipRoute(blip, true) desenha uma rota GPS para o blip.
  • SetBlipFlashes(blip, true) o faz piscar.

Checklist

Sintoma Solução
Ponto branco, sem ícone Chame SetBlipSprite com um número de sprite válido
Blip sem nome ou nome errado Use a sequência de chamada de três nomes após criar o blip
Blip muito grande ou muito pequeno Ajuste SetBlipScale (1.0 é normal)
Círculo de raio esconde o mapa Abaixe com SetBlipAlpha
Duplicatas após um restart de script RemoveBlip em onResourceStop
Blip deve mostrar apenas para um job Crie e remova nos eventos de atualização de job

Respostas rápidas

Por que meu blip mostra o nome errado ou nenhum nome?

O nome deve ser definido com BeginTextCommandSetBlipName('STRING'), AddTextComponentSubstringPlayerName(name) e EndTextCommandSetBlipName(blip), nessa ordem, após o blip existir.

Como removo um blip?

Chame RemoveBlip(blip) com o handle que você armazenou ao criá-lo. Se você não manteve o handle, você não pode remover aquele blip.

Como mostro um blip apenas para um job?

Crie-o quando o job do jogador corresponder, e remova-o quando o job muda. Faça do evento de atualização de job do framework, já que um blip é criado no cliente.

Scripts sem esse problema

Shop CreatorMonte uma loja em menos de um minuto — donos, funcionários, cofres e assaltos inclusos.Ver script →Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →Quest CreatorUm editor visual de missões e diálogos com NPCs, montado nó por nó dentro do jogo.Ver script →

Continue lendo