Jak tworzyć znaczniki mapy w FiveM: AddBlipForCoord i znaczniki promienia

Utwórz znaczniki w FiveM z AddBlipForCoord: sprite, kolor, skala, krótki zakres, etykieta nazwy, znaczniki promienia z AddBlipForRadius, usuwanie znaczników i znaczniki tylko dla pracy.

Wołasz AddBlipForCoord i otrzymujesz białą plamę bez ikony, lub znacznik z nazwą "Blip" lub "NULL", lub jeden, który zostaje na mapie po zatrzymaniu skryptu. Znaczniki są proste, gdy znasz kolejność wołań. Ten artykuł przechodzi przez tworzenie jednego, naminentowanie go, rysowanie promienia, usuwanie go, i pokazywanie znaczników tylko dla pracy.

Podstawowy znacznik

Wszystkie rodzime znaczniki działają na kliencie. To tworzy ikonę sklepu na pozycji:

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)

Co każde wołanie robi:

Rodzime Cel
AddBlipForCoord Tworzy znacznik i zwraca uchwyt. Przechowaj go.
SetBlipSprite Ikona, liczba.
SetBlipDisplay Gdzie się pokazuje: 4 to główna mapa i minimapa.
SetBlipScale Rozmiar. 1.0 to normalne.
SetBlipColour Kolor, liczba.
SetBlipAsShortRange true pokazuje to na minimapie tylko gdy blisko.

Numery dla sprite'ów i kolorów są wypisane na stronie dokumentacji FiveM, pod referencjami gry, znaczniki. Sprite 52 powyżej to ikona sklepu. Jeśli widzisz tylko białą plamę, numer sprite'u jest złyły lub brakuje mu.

Ustaw nazwę

Etykieta wyświetlana na mapie i w menu pauzy nie jest prostym argumentem stringu. Przechodzi przez rodzime komendy tekstowe, w tej kolejności:

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

Znacznik musi już istnieć, i musisz wołać wszystkie trzy. Pomiń jeden, a nazwa jest pusta lub pokazuje domyślną. Bez nazwy, znacznik pojawia się w legendzie jako "Blip" lub jego sprite.

Wskazówka: włóż te wołania w funkcję, która przyjmuje tabelę, więc każdy znacznik to jedna linia w configu zamiast dziesięciu linii rodzimych.

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

Krótki zakres lub zawsze widoczny

SetBlipAsShortRange(blip, true) oznacza, że znacznik pokazuje się na minimapie tylko, gdy gracz jest blisko, i wciąż jest widoczny na pełnej mapie. Z false, zawsze pokazuje się na minimapie, skrajnie zakończony, gdziekolwiek gracz jest. Używaj krótki zakres dla sklepów i prac, i false dla głównego celu.

Znaczniki promienia

Znacznik promienia to kolorowe koło na obszar, takie jak strefa wyszukiwania lub teren. AddBlipForRadius robi koło, ale nie ikonę, więc dodaj zwykły znacznik w tym samym punkcie, jeśli chcesz oba:

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

Ostatni argument to promień w metrach. Ustaw alfa (0 do 255) nisko, lub koło przykrywa mapę. Znacznik promienia to oddzielny uchwyt, więc usuń go osobnie.

Usuń znaczniki

Zawsze przechowuj uchwyt, i usuń znacznik, gdy nie jest już potrzebny:

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

Znaczniki nie są usuwane dla ciebie, gdy zasób się zatrzymuje, lub nie niezawodnie, więc oczyść w handlerze. Bez tego, restartowanie skryptu gromadzi duplikaty na mapie:

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)

Znaczniki tylko dla pracy

Znaczniki są tworzone na kliencie każdego gracza, więc znacznik tylko dla pracy oznacza: stwórz go dla prawej pracy, usuń go dla wszystkich pozostałych. Przechowuj tabelę tego, co stworzyłeś, i reaguj na zmiany pracy.

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

Na QBCore (i QBox przez jego warstwę kompatybilności):

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)

Oba używają tego samego refreshBlips i createBlip z góry. Jeśli skrypt może się zrestartować, podczas gdy gracz jest online, też wołaj refreshBlips raz przy starcie z bieżącą pracą, ponieważ załadowane zdarzenie już się odbyło do tego czasu.

Ostrzeżenie: ukrycie znacznika na kliencie nie jest bezpieczeństwem. Gracz wciąż może go zobaczyć, jeśli poprawia klienta. Dla sekretu, takiego jak nielegalne schronienie, nie wysyłaj pozycji do klienta w ogóle, aż gracz to zarabia.

Inne typy znaczników

  • AddBlipForEntity(entity) śledzi pojazd lub pedę.
  • SetBlipRoute(blip, true) rysuje trasę GPS do znacznika.
  • SetBlipFlashes(blip, true) powoduje, że miga.

Lista kontrolna

Symptom Naprawa
Biała plama, bez ikony Wołaj SetBlipSprite z prawidłowym numerem sprite'u
Znacznik nie ma nazwy lub złą nazwę Użyj sekwencji trzech wołań nazwy po stworzeniu znacznika
Znacznik zbyt duży lub zbyt mały Dostosuj SetBlipScale (1.0 to normalne)
Koło promienia ukrywa mapę Obniż to z SetBlipAlpha
Duplikaty po restarcie skryptu RemoveBlip w onResourceStop
Znacznik musi pokazać tylko dla jednej pracy Stwórz i usuń na zdarzeniach aktualizacji pracy

Szybkie odpowiedzi

Dlaczego mój znacznik pokazuje złą nazwę lub brak nazwy?

Nazwa musi być ustawiona z BeginTextCommandSetBlipName('STRING'), AddTextComponentSubstringPlayerName(name) i EndTextCommandSetBlipName(blip), w tej kolejności, po tym jak znacznik istnieje.

Jak usunąć znacznik?

Wołaj RemoveBlip(blip) z uchwytem, który przechowałeś, gdy go tworzyłeś. Jeśli nie przechowałeś uchwytu, nie możesz usunąć ten znacznik.

Jak pokazać znacznik tylko dla jednej pracy?

Utwórz go, gdy praca gracza pasuje, i usuń go, gdy praca się zmienia. Zrób to ze zdarzenia aktualizacji pracy struktury, ponieważ znacznik jest tworzony na kliencie.

Skrypty bez tego problemu

Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →Quest CreatorWizualny edytor questów i dialogów z NPC, budowanych węzeł po węźle w grze.Zobacz skrypt →

Czytaj dalej