Как создать маркеры на карте в FiveM: AddBlipForCoord и радиус маркеры
Создайте маркеры в FiveM с AddBlipForCoord: спрайт, цвет, масштаб, короткий диапазон, ярлык имени, маркеры радиуса с AddBlipForRadius, удаление маркеров и маркеры только для работы.
Вы вызываете AddBlipForCoord и получаете белую точку без иконки, или маркер с именем «Blip» или «NULL», или один, который остаётся на карте после остановки скрипта. Маркеры просты, как только вы знаете порядок вызовов. Эта статья проходит через создание одного, его названия, рисование радиуса, удаление его, и показ маркеров только для работы.
Базовый маркер
Все native маркеров запускаются на клиенте. Это создаёт иконку магазина в положении:
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)Что делает каждый вызов:
| Native | Назначение |
|---|---|
AddBlipForCoord |
Создаёт маркер и возвращает дескриптор. Сохраняйте его. |
SetBlipSprite |
Иконка, число. |
SetBlipDisplay |
Где он показывается: 4 — это главная карта и миникарта. |
SetBlipScale |
Размер. 1.0 — это нормально. |
SetBlipColour |
Цвет, число. |
SetBlipAsShortRange |
true показывает его на миникарте только если близко. |
Числа для спрайтов и цветов перечисляются на сайте документации FiveM, под ссылками игры, маркеры. Спрайт 52 выше — это иконка магазина. Если вы видите только белую точку, число спрайта неправильно или отсутствует.
Установите имя
Ярлык, показанный на карте и в меню паузы, — это не простой аргумент строки. Он проходит через native команд текста, в этом порядке:
BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName('24/7 Shop')
EndTextCommandSetBlipName(blip)Маркер должен уже существовать, и вы должны вызвать всех трёх. Пропустите один и имя пусто или показывает значение по умолчанию. Без имени маркер появляется в легенде как «Blip» или по его спрайту.
Совет: положите эти вызовы в функцию, которая принимает таблицу, поэтому каждый маркер — это одна строка в конфиге вместо десяти строк native.
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',
})Короткий диапазон или всегда видимый
SetBlipAsShortRange(blip, true) означает, что маркер показывается только на миникарте, когда игрок близко, и он всё ещё видимый на полной карте. С false, он всегда показывается на миникарте, привязанный к краям, где бы ни был игрок. Используйте короткий диапазон для магазинов и работ, и false для основной цели.
Маркеры радиуса
Маркер радиуса — это цветной круг для области, такой как зона поиска или территория. AddBlipForRadius делает круг, но не иконку, поэтому добавьте обычный маркер на том же месте, если вы хотите оба:
local area = AddBlipForRadius(25.7, -1347.3, 29.5, 150.0)
SetBlipColour(area, 1)
SetBlipAlpha(area, 100)Последний аргумент — это радиус в метрах. Установите альфа (0 на 255) низко, или круг покрывает карту. Маркер радиуса — это отдельный дескриптор, поэтому удалите его отдельно.
Удалить маркеры
Всегда сохраняйте дескриптор, и удалите маркер, когда он больше не требуется:
if DoesBlipExist(shopBlip) then
RemoveBlip(shopBlip)
endМаркеры не удаляются для вас, когда ресурс останавливается, или не надёжно, поэтому очистьте в обработчике. Без этого перезапуск скрипта накапливает дубликаты на карте:
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)Маркеры только для работы
Маркеры создаются на клиенте каждого игрока, поэтому маркер только для работы означает: создайте его для правильной работы, удалите его для остальных. Сохраняйте таблицу того, что вы создали, и реагируйте на изменения работы.
На ESX:
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)На QBCore (и QBox через его слой совместимости):
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)Оба используют одно и то же refreshBlips и createBlip выше. Если скрипт может перезагружаться, пока игрок онлайн, также вызовите refreshBlips один раз при запуске с текущей работой, так как загруженное событие уже произошло к тому времени.
Внимание: скрытие маркера на клиенте — это не безопасность. Игрок всё ещё может увидеть его, если он патчит клиент. Для секрета, такой как незаконная база, не отправляйте положение клиенту вообще, пока игрок его не заработает.
Другие типы маркеров
AddBlipForEntity(entity)следит за транспортным средством или персонажем.SetBlipRoute(blip, true)рисует маршрут GPS на маркер.SetBlipFlashes(blip, true)делает его мигающим.
Контрольный список
| Проблема | Решение |
|---|---|
| Белая точка, без иконки | Вызовите SetBlipSprite с действительным числом спрайта |
| Маркер без имени или неправильного имени | Используйте последовательность вызовов трёх имён после создания маркера |
| Маркер слишком большой или слишком маленький | Отрегулируйте SetBlipScale (1.0 — это нормально) |
| Круг радиуса скрывает карту | Опустите его с SetBlipAlpha |
| Дубликаты после перезагрузки скрипта | RemoveBlip в onResourceStop |
| Маркер должен показываться только для одной работы | Создайте и удалите при событиях обновления работы |
Короткие ответы
Почему мой маркер показывает неправильное имя или без имени?
Имя должно быть установлено с BeginTextCommandSetBlipName('STRING'), AddTextComponentSubstringPlayerName(name) и EndTextCommandSetBlipName(blip), в этом порядке, после того как маркер существует.
Как мне удалить маркер?
Вызовите RemoveBlip(blip) с дескриптором, который вы сохранили при создании. Если вы не сохранили дескриптор, вы не можете удалить этот маркер.
Как я показываю маркер только для одной работы?
Создайте его, когда работа игрока совпадает, и удалите его, когда работа меняется. Делайте это из события обновления работы фреймворка, так как маркер создаётся на клиенте.
Скрипты без этой проблемы
Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →
Advanced BoostingУгон машин на заказ через планшет: контракты от класса D до S+, команды и живая очередь.Смотреть скрипт →
Quest CreatorВизуальный редактор квестов и диалогов с NPC — узел за узлом прямо в игре.Смотреть скрипт →