- Katılım
- 5 yıl 7 ay 13 gün
- Mesajlar
- 245
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.
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
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
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
ve son olarak policejob client kısmına aşağıdaki kodu ekleyin:
Komut ile aktif etme/devre dışı bırakma:
policejob client kısmına aşağıdaki kodu ekleyin
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.
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.
Linkleri,görmek için
Giriş yap veya üye ol.
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.
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:
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:
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:
ESX.RegisterUsableItem('gps', function(source)
TriggerClientEvent('exelds:gpsAcKapat', source)
end)
ve son olarak policejob client kısmına aşağıdaki kodu ekleyin:
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:
RegisterCommand("gpsac", function()
TriggerEvent('exelds:GPSStart')
end)
RegisterCommand("gpskapat", function()
TriggerEvent('exelds:GPSStop')
end)
Son düzenleme: