Paylaşım - Yeni GPS Sistemi (Hitch Warning Çözüm)

Fivem.com.tr

Fivem.com.tr
Katılım
1 Eki 2022
Mesajlar
5,891
Tepki
112
Herkese selam. Ben ciddi anlamda uzun zamandır bu hitch warning, sunucuda laglanma vs. sıkıntılarıyla uğraşıyorum. Araştırmadığım yerli, yabancı konu kalmadı. Bu hitch warning sorunu okadar fazla sebepten kaynaklanabiliyor ki, oyuzden bu paylaşacağım konu kesin sorunumu çözer diye düşünmeyin. Bunun yanında ek başka sorunlu scriptleriniz de olabilir ama GPS sisteminiz aşağıda belirttiğim şekildeyse illaki bi düzelme gözlemleyeceksinizdir.



Benim uzun zamandır uğraştığım hitch warning sorunu tamamen polis/doktorların GPS muhabbetlerinden kaynaklanıyormuş diyebilirim. GPS konusunda tamamen farklı bi şekilde kendime has kodlama yaptım ve hitch sorunumu çözdüm. Çözdüm dediğim de tamamen hitch warningler kesildi gibi anlaşılmasın, lag vs. gibi bi sorun kalmadı ama araştırdığım kadarıyla fivemde yüksek oyuncularda (30 üzeri) hiç hitch warning almamak pek mümkün değil. Aldığınız hitch sayıları 3 basamaklı olduğu sürece sorun yok. 64 kişi civarlarında 600-700 civarını sürekli olarak geçmediği sürece durum gayet iyi benim gözümde.



Öncelikle bu yüksek hitch warninglerin, sunucularda yaşanan laglanmaların vs. genel polis/doktorların GPS sisteminden kaynaklanıyor deme sebebim tamamen aşağıdaki trigger:

ESX.TriggerServerCallback('esx_society:getOnlinePlayers', function(players)



Bu event oyuncu sayınız yükseldikce ve o an aktif polis/doktor sayısı arttıkca sunucunuzu çok daha kötü duruma götürüyor. Çünkü mevcut olan tüm oyuncuları ayırt etmeksizin bi tabloya ekliyor ve bunu client tarafına, tetikleyen polis/doktor oyuncuya iletiyor (Mevcut oyunculardan sadece police/doktorları tabloya ekleyecek şekilde güncellemiştim ama durumda yine de iyileşme olmadı). Bu işlemi tüm aktif polis/doktor oyuncular için ayrı ayrı yapıyor. Buna ek olarak birde her seferinde oyuncuların isimlerini çekiyorsanız database den durum hepten içler acısı bir hal alıyor. Her nekadar bu eventi belli zaman aralıklarında triggerlıyor olsanız da her seferinde tüm bu ağır işlemlerin tekrar tekrar sıfırdan yapılması sunucu için çok büyük problem teşkil ediyor.



Benim yazmış olduğum GPS sistemi genel olarak ortalıkta dönen GPS sistemlerinden farklı. GPS sunucuya ilk giriş yapıldığında deaktif oluyor ve polis/ems oyuncularının kendilerinin aktif etmeleri gerekiyor. Yani GPS isteğe göre kapatılıp açılabiliyor. GPS aktif edildiğinde server side daki tabloda sadece o oyuncunun bilgileri tutuluyor ve GPS devre dışı bırakıldığında veya kişi sunucudan ayrıldığında o kişi server tarafından siliyor. Böylece GPS olayı optimize bi şekilde işliyor ve oyuncu sayısı nekadar yüksek olursa olsun herhangi bir değişme, ek yük bindirme vs. olmuyor.



Şuan için hem onduty hem offduty tüm polis/doktor oyuncular GPS açabiliyor. Zaten kapatılıp açılabildiği için oyunculara bu tarz bi sınır koymayı gereksiz gördüm.



Eğer sizin gözlemlediğiniz atladığım noktalar, yanlış kodladığım kısımlar varsa yorumlardan iletirseniz kodları tekrar düzenlerim. Bunun dışında takıldığınız, hata aldığınız noktalarda aynı şekilde yorum ile bana ve diğer bilen arkadaşlara sorabilirsiniz. Mümkün olduğunca yardımcı olmaya çalışırım.



Changelog:



01.10.2020
(Bu versiyonu discord kanalımda paylaştım)

- Artık belli bir zaman aralığında bir haritadaki tüm blipleri silip tekrar eklemeyecek, sadece gps sistemine yeni biri giriş yaptığında veya mevcut biri çıkış yaptığında blipler güncellenecek. Böylece hem görsel olarak sürekli git gel yapan blipler olmayacak hem de gereksiz işlem yapılmadığı için sistem daha optimize çalışacak.

- Polis araçlarına mesleği polis olmayan biri bindiğinde tüm polislere uyarı sesiyle birlikte kayıtsız polis aracı bildirimi gidecek ve haritada bu kayıtsız polis aracı tüm polisler tarafından anlık görünür olacaktır. Polis olmayan oyuncu araçtan indikten sonra haritada blipi silinecektir.



Not: Polis olmayan oyuncu sadece şoför koltuğuna bindiğinde bu bildirim aktif olacak şekilde ayarlanmıştır.

Not: İsteğe göre ek özellikler eklenebilir. Bu isteklerinizi bana discorddan iletebilirsiniz.



Bu versiyonu burada paylaşmadım çünkü forumda temel versiyonu kalsın istiyorum. Yeni ekleyeceğim özellikler daha çok kiminin isteyeceği özellikler olabilirken kimileri istemeyebilir. Gelecek güncellemeleri aynı şekilde discordumda paylaşacağım. Burada temel hali kalacak.









12.07.2020

- Rozet numarası sistemi eklendi. GPS i polis bir oyuncu aktif etmeye çalıştığında karşısına rozet numarası girebileceği pencere gelecektir. Buraya yazdığı rozet numarası bliplerde isminin başına köşeli parantez içinde eklenecektir.

- GPS listesine oyuncu giriş çıkışı olduğunda anlık oyuncuların GPS leri güncellenecektir. Böylece sistem daha optimize, gecikmesiz ve anlık olarak işleyecektir.Önceden bir oyuncu örneğin GPS kapattığında duruma göre 30 saniye kadar beklemek gerekebiliyordu diğer oyuncuların haritalarından silinmesi için.

- Kişinin üzerinden GPS eşyası alındığında otomatik olarak GPS sisteminden çıkarılmama sorunu düzeltildi.



678-2afdf67c9a2e2866a783f71ca8509e1a.jpg





Anlatım:

Bu GPS sistemiyle birlikte bliplerde steam isimleri değil karakter isimleri de yazacağı için öncelikle eski GPS sistemine dair herşeyi hem client hem server tarafından silin. Updateblip trigger ve register eventleridir, createblip fonksiyonlarıdır vs.



Sonrasında policejob client kısmında istediğiniz yere aşağıdaki kodları ekleyin



Kod:


Kod:
local gpsInfo = false

RegisterNetEvent('exelds:GPSStart')
AddEventHandler('exelds:GPSStart', function()
    ESX.TriggerServerCallback('esx_policejob:getItem', function (count)
if count > 0 then   
    if PlayerData.job.name == 'police' or PlayerData.job.name == 'offpolice' then
        ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'Rozet Numarası', {
            title = "Rozet Numaranızı Girin",
        }, function (data2, menu)
            --[[local amount = tonumber(data2.value)

            if amount == nil then
                exports['mythic_notify']:DoHudText('error', 'Buraya bir sayı yazmanız gerekmektedir!')
            else]]
                getGPSListforPolice()
                TriggerServerEvent('exelds:addGPSList', data2.value)
                TriggerEvent('exelds:gpsInfo', true)
                gpsInfo = true
                exports['mythic_notify']:SendAlert('inform', data2.value..' rozet numarası ile GPS aktif edildi', 7000, { ['background-color'] = '#0E506C', ['color'] = '#FFFFFF' })
                menu.close()
            --end
        end, function (data2, menu)
            exports['mythic_notify']:DoHudText('error', 'GPS aktif edilemedi!')
            menu.close()
        end)
    elseif PlayerData.job.name == 'ambulance' or PlayerData.job.name == 'offambulance' then
        getGPSListforAmbulance()
        TriggerServerEvent('exelds:addGPSList')
        TriggerEvent('exelds:gpsInfo', true)
        gpsInfo = true
        exports['mythic_notify']:SendAlert('inform', 'GPS aktif edildi', 3000, { ['background-color'] = '#0E506C', ['color'] = '#FFFFFF' })
    end
else
    exports['mythic_notify']:SendAlert('inform', 'Üzerinde GPS bulunmuyor', 3000, { ['background-color'] = '#CC0000', ['color'] = '#FFFFFF' })
end
    end, 'gps')
end)

RegisterNetEvent('exelds:GPSStop')
AddEventHandler('exelds:GPSStop', function()
    gpsInfo = false
    TriggerServerEvent('exelds:removeGPSList')
    TriggerEvent('exelds:gpsInfo', false)
    for k, existingBlip in pairs(blipsCops) do
        RemoveBlip(existingBlip)
    end
    blipsCops = {}
    exports['mythic_notify']:SendAlert('inform', 'GPS devre dışı bırakıldı', 3000, { ['background-color'] = '#0E506C', ['color'] = '#FFFFFF' })
end)
function getGPSListforPolice()
    for k, existingBlip in pairs(blipsCops) do
        RemoveBlip(existingBlip)
    end
    blipsCops = {}
    ESX.TriggerServerCallback('exelds:getGPSList', function(GPSList)
        for i = 1, #GPSList do
            local id = GetPlayerFromServerId(GPSList[i][1])
            if NetworkIsPlayerActive(id) and GetPlayerPed(id) ~= PlayerPedId() then
            local name = GPSList[i][2]
            local job = GPSList[i][3]       
            if job == 'police' or job == 'offpolice' then
                local rozetNum = GPSList[i][4]      
                createBlipLastPD(id, name, rozetNum)
            elseif job == 'ambulance' or job == 'offambulance' then
                createBlipLastEMS(id, name)
            end
            end
        end
    end)
end
function getGPSListforAmbulance()
    for k, existingBlip in pairs(blipsCops) do
        RemoveBlip(existingBlip)
    end
    blipsCops = {}
    ESX.TriggerServerCallback('exelds:getGPSList', function(GPSList)
        for i = 1, #GPSList do
            local id = GetPlayerFromServerId(GPSList[i][1])
            if NetworkIsPlayerActive(id) and GetPlayerPed(id) ~= PlayerPedId() then
            local name = GPSList[i][2]
            local job = GPSList[i][3]
            if job == 'ambulance' or job == 'offambulance' then
                createBlipLastEMS(id, name)
            end
            end
        end
    end)
end
function createBlipLastPD(id, isim, rozetNum)
    local ped = GetPlayerPed(id)
    local blip = GetBlipFromEntity(ped)
    if not DoesBlipExist(blip) then -- Add blip and create head display on player
        blip = AddBlipForEntity(ped)
        SetBlipSprite(blip, 1)
        SetBlipColour(blip, 57)
        ShowHeadingIndicatorOnBlip(blip, true) -- Player Blip indicator
        SetBlipRotation(blip, math.ceil(GetEntityHeading(ped))) -- update rotation
        SetBlipScale(blip, 0.85) -- set scale
        SetBlipAsShortRange(blip, true)
        BeginTextCommandSetBlipName('STRING')
        AddTextComponentString('[~b~ '..rozetNum..' ~s~] '..isim)
        EndTextCommandSetBlipName(blip)
        table.insert(blipsCops, blip) -- add blip to array so we can remove it later
    end
end
function createBlipLastEMS(id, isim)
    local ped = GetPlayerPed(id)
    local blip = GetBlipFromEntity(ped)
    if not DoesBlipExist(blip) then
        blip = AddBlipForEntity(ped)
        SetBlipSprite(blip, 1)
        SetBlipColour(blip, 1)
        ShowHeadingIndicatorOnBlip(blip, true)
        SetBlipRotation(blip, math.ceil(GetEntityHeading(ped)))
        SetBlipScale(blip, 0.85)
        SetBlipAsShortRange(blip, true)
        BeginTextCommandSetBlipName('STRING')
        AddTextComponentString('[~r~LSMS~s~] '..isim)
        EndTextCommandSetBlipName(blip)
        table.insert(blipsCops, blip)
    end
end

RegisterNetEvent('exelds:refreshGPS')
AddEventHandler('exelds:refreshGPS', function()
    if gpsInfo == true then
        if PlayerData.job.name == 'police' or PlayerData.job.name == 'offpolice' then
            getGPSListforPolice()
        elseif PlayerData.job.name == 'ambulance' or PlayerData.job.name == 'offambulance' then
            getGPSListforAmbulance()
        end
    end
end)



Sonrasında policejob server kısmında eski AddEventHandler('playerDropped' kısmını silin ve yine istediğiniz bir yere aşağıdaki kodları ekleyin



Kod:


Kod:
local GPSList = {}

RegisterServerEvent('exelds:addGPSList')
AddEventHandler('exelds:addGPSList', function(rozetNum)
    local _source = source
    local xPlayer = ESX.GetPlayerFromId(_source)
    MySQL.Async.fetchAll("SELECT firstname, lastname FROM users WHERE identifier = @identifier", { ["@identifier"] = xPlayer.identifier }, function(result)
    local name = string.format("%s %s", result[1].firstname, result[1].lastname)
    table.insert(GPSList, {_source, name, xPlayer.job.name, rozetNum})
    TriggerClientEvent('exelds:refreshGPS', -1)
    end)
end)

RegisterServerEvent('exelds:removeGPSList')
AddEventHandler('exelds:removeGPSList', function()
    local _source = source
    for i = 1, #GPSList do
        if GPSList[i] and GPSList[i][1] == _source then
            table.remove(GPSList, i)
        end
    end
    TriggerClientEvent('exelds:refreshGPS', -1)
end)

ESX.RegisterServerCallback('exelds:getGPSList', function(source, cb)
    cb(GPSList)
end)


AddEventHandler('playerDropped', function()
    local _source         = source
    local xPlayer         = ESX.GetPlayerFromId(_source)
    if _source ~= nil then
        if xPlayer ~= nil and xPlayer.job ~= nil and (xPlayer.job.name == 'police' or xPlayer.job.name == 'offpolice' or xPlayer.job.name == 'ambulance' or xPlayer.job.name == 'offambulance') then
            for i = 1, #GPSList do
                if GPSList[i] and GPSList[i][1] == _source then
                    table.remove(GPSList, i)
                end
            end
        end
    end
end)


ESX.RegisterServerCallback('esx_policejob:getItem', function(source, cb, item)
        local xPlayer = ESX.GetPlayerFromId(source)
        local items = xPlayer.getInventoryItem(item)
        if items == nil then
            cb(0)
        else
            cb(items.count)
        end
end)


AddEventHandler('esx:onRemoveInventoryItem', function(source, item, count)
    local _source = source
    local xPlayer = ESX.GetPlayerFromId(_source)
    if xPlayer ~= nil and xPlayer.job ~= nil and (xPlayer.job.name == 'police' or xPlayer.job.name == 'offpolice' or xPlayer.job.name == 'ambulance' or xPlayer.job.name == 'offambulance') then
        if item.name == 'gps' and item.count < 1 then
            TriggerClientEvent('exelds:GPSStop', source)
        end
    end
end)





Temel olarak kodlar bu şekilde. Şimdi bunları aktif etme konusu tamamen size kalıyor. İster /gpsac /gpskapat gibi komutla bu işlemi gerçekleştirin. İster oyundaki GPS eşyasına bunu atayın veya bambaşka farklı bir yöntem kullanın. Ben ikisi için aşağıya yine kodları yazacam.



GPS eşyası ile aktif etme/devre dışı bırakma:

policejob server kısmına aşağıdaki kodu ekleyin



Kod:


Kod:
ESX.RegisterUsableItem('gps', function(source)
    TriggerClientEvent('exelds:gpsAcKapat', source)
end)





ve son olarak policejob client kısmına aşağıdaki kodu ekleyin:



Kod:


Kod:
RegisterNetEvent('exelds:gpsAcKapat')
AddEventHandler('exelds:gpsAcKapat', function()
    if gpsInfo then
    TriggerEvent('exelds:GPSStop')
    else
    TriggerEvent('exelds:GPSStart')
    end
end)





Komut ile aktif etme/devre dışı bırakma:

policejob client kısmına aşağıdaki kodu ekleyin



Kod:


Kod:
RegisterCommand("gpsac", function()
    TriggerEvent('exelds:GPSStart')
end)

RegisterCommand("gpskapat", function()
    TriggerEvent('exelds:GPSStop')
end)

komutlara ekstra meslek sorgusu ekleyip eklememek size kalmış ama ben ekleme gereği duymadım.Çünkü zaten GPSStart eventinde bu sorgu mevcut. Polis veya doktor olmayan biri GPS listesine giremez.


Bugünün iyi planı yarının mükemmel planından daha iyidir. -Atasözü

Konu alıntıdır, yanlış veya hatalı bir bilgi/paylaşım var ise yanıtlayabilir veya bizimle iletişime geçebilirsiniz.
 

Şu anda bu konu'yu okuyan kullanıcılar

Benzer konular

Üst