Neler yeni

Foruma hoş geldin, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Türkiye'nin İlk ve tek FiveM forum adresi

Forum adresimize hoş geldin FiveMTürk olarak amacımız siz değerli kullanıcılarımıza en aktif fikir ve paylaşım platformu sunmak bir yana en güvenilir şekilde alışveriş yapabileceğiniz bir platform sunmaktır.
DF DF
DF DF
DF DF

Paylaşım Araçlara Gelişmiş Kilometre Scripti (Sıfırdan Yazıldı)

exelds

Üye
FT Kullanıcı
Katılım
5 yıl 5 ay 16 gün
Mesajlar
245
Cümleten selam, bu scriptin istendiğini şimdiye kadar birçok kez görmüştüm, yabancı forumlarda yapıldı mı bilgim yok ama bu forumda görmedim. Dolayısıyla oturup sıfırdan kendim bu sistemi kodladım İşinize yararsa yorumlarda belirtmeyi fazla görmeyin.

Not: Karşılaştığınız sorunları veya eklenmesini çıkarılmasını istediğiniz şeyleri öneri olarak bana discorddan iletebilirsiniz. Şuanki hali temel hali diyebiliriz. Bunun üzerine sizin de önerileriniz doğrultusunda discord kanalımızdan güncellemeler paylaşılacaktır.

Bu tarz sıfırdan kendi yapımım veya üzeride ciddi düzenlemeler yaptığım diğer scriptlerimin bulunduğu discord kanalımıza dilerseniz göz atabilirsiniz.



Güncelleme: (29.04.2021)



Discorddan ve yorumlardan gelen istekler üzerine sol alta haritanın sağına anlık aracın kilometre sayacı eklendi. (Sayaç konumu ve renkleri istediğiniz gibi kendinize göre düzenleyebilirsiniz.)

Ekstradan ufak tefek script işleyişinde değişiklikler ve düzeltmeler yapıldı.

Dosyalar güncellenmiştir. Aşağıdaki linkten tekrar indirmeniz yeterlidir.

50950


Script özellikleri:
- Oyun içerisinde haritada işaretlediğinizde sol altta haritada yazan 0.62 mil bu scriptte 1 km olarak geçmektedir. Yani oyuncuları çok sıkmamak için config içerisindeki aşama km değerlerini yüksek tutmaya özen gösterin.
- Bindiğiniz araç eğer NPC aracı değilse gittiğiniz her km database'de o aracın plakasına eklenir.
- Toplam gittiği km değerini istediğiniz aracın şoför koltuğunda "/km" yazarak öğrenebilirsiniz. Sizin config dosyasında belirleyeceğiniz kilometre sınırlarına göre aşama aşama bildirim renkleri farklı olacaktır, her renk bir ileriki aşamayı temsil edecektir.
31124

- Araç kilometre değeri yükseldikçe şansa bağlı olarak araçta çeşitli aksaklıklar meydana gelmeye başlar. Bu özellikleri tek tek buraya anlatmaktansa script içerisinde bulunan config dosyasında zaten ayrıntılı yorum satırları yazdığım için direk bunların resmini atıyorum:
Scripti sunucunuza attıktan sonra bu alanı kendinize göre düzenlemeyi unutmayınız!
31123

- Database'inizde aşağıdaki kodu çalıştırarak owned_vehicles tablonuza "kilometre" sütunu ekleyin.
Kod:
ALTER TABLE `owned_vehicles`
ADD COLUMN `kilometre` INT NULL DEFAULT 0;

- Vehicleshop yani galeri scriptinizi verdiğim kodlarla güncelleyerek aracın toplam gittiği km değerine göre 2. el satış değerini düşürebilirsiniz. Ben her 10 km de 1 dolar düşecek ve minimum geri satış fiyatının 3 te 1 ine düşebilecek şekilde ayarladım. İstediğiniz gibi kendinize göre özelleştirebilirsiniz.
esx_vehicleshop\client\main.lua içerisinde "elseif zone == 'ResellVehicle' then" bulun ve bu şartın altını diğer elseif e kadar direk alağıdaki şekilde güncelleyin:
Kod:
local playerPed = PlayerPedId()
    local vehicle     = GetVehiclePedIsIn(playerPed, false)
    local plate = ESX.Math.Trim(GetVehicleNumberPlateText(vehicle))
    ESX.TriggerServerCallback('ExeLds:getKilometer', function(kilometre)
            if IsPedSittingInAnyVehicle(playerPed) then

                local vehicleData, model, resellPrice, plate

                if GetPedInVehicleSeat(vehicle, -1) == playerPed then
                    for i=1, #Vehicles, 1 do
                        if GetHashKey(Vehicles[i].model) == GetEntityModel(vehicle) then
                            vehicleData = Vehicles[i]
                            break
                        end
                    end
           
                    resellPrice = ESX.Math.Round(vehicleData.price / 100 * Config.ResellPercentage)
                    local resellPrice2 = ESX.Math.Round(resellPrice-(kilometre/10))
                    if resellPrice2 < resellPrice/3 then
                        resellPrice2 = ESX.Math.Round(resellPrice/3)
                    end
                    model = GetEntityModel(vehicle)

                    CurrentAction     = 'resell_vehicle'
                    CurrentActionMsg  = _U('sell_menu', vehicleData.name, ESX.Math.GroupDigits(resellPrice2))

                    CurrentActionData = {
                        vehicle = vehicle,
                        label = vehicleData.name,
                        price = resellPrice2,
                        model = model,
                        plate = plate
                    }
                end

            end
    end, plate)


Script İndirme Linki:
 
DF
Son düzenleme:
Emek kokuyor.
 
DF
Çok güzel düşünülmüş bir script fakat fazla oyunculu sunucularda aynı anda çok kişinin araç süreceği düşünülürse sürücülerin database'e saniyede bir veri atması biraz sunucuyu yorabilir diye düşünüyorum.
 
DF
Çok güzel düşünülmüş bir script fakat fazla oyunculu sunucularda aynı anda çok kişinin araç süreceği düşünülürse sürücülerin database'e saniyede bir veri atması biraz sunucuyu yorabilir diye düşünüyorum.
Selam, kodları incelediniz mi? Saniyede bir server tarafını tetikleyen herhangi bir fonksiyon bulunmuyor. Özellikle km sayacını stack mantığıyla kodladım. Yani her saniye nekadar yol gittiyse değil 1 km yani 1000 birim yolu gittikten sonra database e güncelleme yolluyor 1 km ye kadar kişinin clientinde tutuyor. Eğer sen bu konuda ekstra endişeliysen bunu client 65. satırdan arttırabilirsin. Örneğin 10000 yazarsan 10 km de bir database de günceller. Clientte hiçbir yerde gereksiz sık server tetiklemesi göremedim, senin gördüğün varsa bunu daha açık belirtirsen tekrar düzenleme yapabilirim.
 
DF
Client 18. satırda test için koyduğum "kilometre = 500" kalmış bunu indirenler silmeyi unutmasın. Ben githubta kodu güncelledim.
 
DF
Selam, kodları incelediniz mi? Saniyede bir server tarafını tetikleyen herhangi bir fonksiyon bulunmuyor. Özellikle km sayacını stack mantığıyla kodladım. Yani her saniye nekadar yol gittiyse değil 1 km yani 1000 birim yolu gittikten sonra database e güncelleme yolluyor 1 km ye kadar kişinin clientinde tutuyor. Eğer sen bu konuda ekstra endişeliysen bunu client 65. satırdan arttırabilirsin. Örneğin 10000 yazarsan 10 km de bir database de günceller. Clientte hiçbir yerde gereksiz sık server tetiklemesi göremedim, senin gördüğün varsa bunu daha açık belirtirsen tekrar düzenleme yapabilirim.

update eventindeki mysql sorgusunu kaldırıp bunu kilometer[plate] array'ine bağlarsan ve bu arraydeki değerleri 10 dakikada bir kaydedecek şekilde ayarlarsan ayrıca client'teki 1000km'de bir updatelenmesine gerek kalmaz ve ara değerler de kullanılabilir, bu sayede hem daha optimize hem de daha detaylı bir script haline gelir. Kesinlikle yaptığın şeyi baltaladığımı düşünme dostum fikrin çok güzel ve başarılı sadece database kullanımının biraz daha optimize olması gerektiğini belirttim. Tekrardan eline sağlık.
 
DF
update eventindeki mysql sorgusunu kaldırıp bunu kilometer[plate] array'ine bağlarsan ve bu arraydeki değerleri 10 dakikada bir kaydedecek şekilde ayarlarsan ayrıca client'teki 1000km'de bir updatelenmesine gerek kalmaz ve ara değerler de kullanılabilir, bu sayede hem daha optimize hem de daha detaylı bir script haline gelir. Kesinlikle yaptığın şeyi baltaladığımı düşünme dostum fikrin çok güzel ve başarılı sadece database kullanımının biraz daha optimize olması gerektiğini belirttim. Tekrardan eline sağlık.
Yok hocam ben eksiklerimin söylenmesini hazmedemeyenlerden değilim o konuda çekingen davranmanıza gerek yok, eksik bulduğunuz noktaları direk bana açık açık söyleyebilirsiniz bu konuda ayrıca teşekkür ederim.

Yazdığın cevap hakkında da eğer yanlış anlamadıysam while true do ile 10 dakikada bir otomatik olarak tüm kilometer[plate] arrayindeki değerleri database e updatelememi tavsiye ediyorsun? Eğer dediğim gibi doğru anladıysam bu söylediğin yöntemin daha optimize olduğunu düşünmüyorum çünkü örneğin 50km giden bir oyuncu için de 1km giden oyuncu için de database e arka arkaya update gönderilecek. Fakat benim bu uyguladığım sistemde sadece senin belirlediğin üst değere ulaşanlar için tekil update eventi çalıştırılacak. Bu değere aynı anda birden fazla oyuncunun ulaşması da çok düşük bi olasılık olduğu için server taraflı bir sıkışma da olmayacaktır.

Tek bir update eventi ile tüm arrayleri owned_vehicles a işleyebilecek olsak yine söylediğin mantıklı fakat yine for döngüsüyle arrayin içindeki değerler kadar ayrı ayrı update sorgusu çalıştırmamız gerekmiyecek mi ben mi yanlış biliyorum? Durum böyle olunca tam tersi asıl bu şekilde optimizasyon açığı olmuş oluyor. İşlemleri arka arkaya bindirmiş oluyoruz. Dediğim gibi söylediğiniz şeyi %100 anladığımdan emin değilim varsa yanlış olduğum noktaları düzeltirseniz sevinirim.
 
DF
Yok hocam ben eksiklerimin söylenmesini hazmedemeyenlerden değilim o konuda çekingen davranmanıza gerek yok, eksik bulduğunuz noktaları direk bana açık açık söyleyebilirsiniz bu konuda ayrıca teşekkür ederim.

Yazdığın cevap hakkında da eğer yanlış anlamadıysam while true do ile 10 dakikada bir otomatik olarak tüm kilometer[plate] arrayindeki değerleri database e updatelememi tavsiye ediyorsun? Eğer dediğim gibi doğru anladıysam bu söylediğin yöntemin daha optimize olduğunu düşünmüyorum çünkü örneğin 50km giden bir oyuncu için de 1km giden oyuncu için de database e arka arkaya update gönderilecek. Fakat benim bu uyguladığım sistemde sadece senin belirlediğin üst değere ulaşanlar için tekil update eventi çalıştırılacak. Bu değere aynı anda birden fazla oyuncunun ulaşması da çok düşük bi olasılık olduğu için server taraflı bir sıkışma da olmayacaktır.

Tek bir update eventi ile tüm arrayleri owned_vehicles a işleyebilecek olsak yine söylediğin mantıklı fakat yine for döngüsüyle arrayin içindeki değerler kadar ayrı ayrı update sorgusu çalıştırmamız gerekmiyecek mi ben mi yanlış biliyorum? Durum böyle olunca tam tersi asıl bu şekilde optimizasyon açığı olmuş oluyor. İşlemleri arka arkaya bindirmiş oluyoruz. Dediğim gibi söylediğiniz şeyi %100 anladığımdan emin değilim varsa yanlış olduğum noktaları düzeltirseniz sevinirim.

doğru anlamışsın ama yaklaşık 10 dakikada bir defa sorgu yapmak sınırı aşan her kişi için update atmaktan daha optimize olur yine de tabi siz bilirsiniz düzenleyip düzenlememek size kalmış
 
DF
doğru anlamışsın ama yaklaşık 10 dakikada bir defa sorgu yapmak sınırı aşan her kişi için update atmaktan daha optimize olur yine de tabi siz bilirsiniz düzenleyip düzenlememek size kalmış

"Tek bir update eventi ile tüm arrayleri owned_vehicles a işleyebilecek olsak yine söylediğin mantıklı fakat yine for döngüsüyle arrayin içindeki değerler kadar ayrı ayrı update sorgusu çalıştırmamız gerekmiyecek mi ben mi yanlış biliyorum? Durum böyle olunca tam tersi asıl bu şekilde optimizasyon açığı olmuş oluyor. İşlemleri arka arkaya bindirmiş oluyoruz."

Burada bahsettiğim sebepten dolayı söylediğiniz yöntemin benim şuanki kullandığım yöntemden daha optimize olacağını düşünmüyorum. Ama yine de teşekkür ederim öneriniz için.
 
DF
31289


31290

Burada ilk defa plakalarını algılamak için sorgu atıyorsun sanırım sorgular ile problemin var ise şöyle yapmanı tavsiye ederim

Mysql.OnReady gibi bir function'u olması gerekiyor sunucu startlandığında tüm plate'leri array'e çekersin bu işlemden sonra birde trigger yazarsın yeni bir araç alındığında vehicleshoptan bu array'e identifier ve plate'ini yollayan böylelikle büyük bir yükten kurtulursun sadece arada ki bağlantı client & server arasında ki triggerlardan ibaret olur.


ki sorgularının yoracağını düşünmem herkes sorgulara külfet gözüyle bakıyorlar fakat fivem'in attığı sorgular sorgu bile değil daha büyük projelerde çalışan insanlar fivemde ki sorguların problem olmayacağını bilir (saniyelik bir loop yok ise) Veritabanınız için sorgu problemi oluşturmayacaktır.

DIPNOT: Disk'i SSD & M2 SSD olan için geçerli bir varsayımdır bu
 
DF
Ekli dosyayı görüntüle 31289


Ekli dosyayı görüntüle 31290

Burada ilk defa plakalarını algılamak için sorgu atıyorsun sanırım sorgular ile problemin var ise şöyle yapmanı tavsiye ederim

Mysql.OnReady gibi bir function'u olması gerekiyor sunucu startlandığında tüm plate'leri array'e çekersin bu işlemden sonra birde trigger yazarsın yeni bir araç alındığında vehicleshoptan bu array'e identifier ve plate'ini yollayan böylelikle büyük bir yükten kurtulursun sadece arada ki bağlantı client & server arasında ki triggerlardan ibaret olur.


ki sorgularının yoracağını düşünmem herkes sorgulara külfet gözüyle bakıyorlar fakat fivem'in attığı sorgular sorgu bile değil daha büyük projelerde çalışan insanlar fivemde ki sorguların problem olmayacağını bilir (saniyelik bir loop yok ise) Veritabanınız için sorgu problemi oluşturmayacaktır.

DIPNOT: Disk'i SSD & M2 SSD olan için geçerli bir varsayımdır bu
Öncelikle öneri için teşekkürler.

Sadece client tarafında oyuncu araca ilk defa bindiğinde o araç bilgilerini datadan değil server tarafından çekebilsin diye bu şekilde bi öneride bulunduysan söylediğin doğru, kilometre başı datada yapılan update eventinde (updateCar) ek olarak server tarafındaki array'de de update yapılarak dediğin durum önlenebilir ama bunun sorun olacağını düşünmüyorum, kaç oyuncu, sorun olacak kadar kaç kere ilk defa bi araca binebilir ki? Benim belki sorun olabilir diye düşündüğüm nokta kilometre başı data da yapılan update işlemleriydi, elimden geldiğince yük bindirmeyeceğini düşündüğüm şekilde kodlamaya çalıştım.

Dediğin yönteme update işlemlerini de dahil edersek:
Mysql.OnReady ile dediğin gibi sunucu startlandığında tüm plakaların kilometre değerlerini server tarafında array'e çekebilirim fakat sonrasında artık tüm update işlemlerini de doğal olarak bu server tarafındaki array içerisinde yapmam lazım. Durum böyle olunca da bu server tarafında güncellenen array içindeki değerleri belli zaman aralıklarında data da update fonksiyonu ile güncellemem gerekiyor, bu da benim şuanki kodlama şeklimde zamana yayılmış bi şekilde bireysel işlemlerle gerçekleştirilen güncelleme işini for döngüsüyle array içindeki tüm değerler için ayrı ayrı update çalıştırarak arka arkaya update sorgusuyla datada güncellemem gerekecek anlamına geliyor. Buna ek olarak bu ara ara yapılan güncellemenin bekleme süresini pek uzun tutmamalıyım çünkü bu update yapılmadan önce sunucunun kapanması durumunda son yapılan update den o zamana kadar gerçekleşen tüm server taraflı güncellemeler kaybolacaktır. Yanlış düşündüğüm nokta varsa düzeltirsen sevinirim ama bu şekilde düşündüğümde server taraflı array aracılığıyla bu işlemleri yapmak mantıklı gelmedi. Şuanda zaten oyuncunun bindiği aracın kilometre bilgisi clientinde tutuluyor ve her gittiği 1 kilometre de bir güncelleme tetikleniyor (isteğe göre 10-20-50 km olarak değiştirilebilir). Yani iki farklı oyuncunun server tarafına aynı anda güncelleme yollama ihtimali çok düşük, bu sebeple de server tarafına bi aşırı yüklenme, kitlenme vs. gibi bir durum yaşanmayacaktır diye düşünüyorum.
 
DF
Son düzenleme:
Aynı düşüncedeyim ben sadece yapılabilir bir öneri olarak cache mantığını önerdim. Server Sided GPS muhabbetinde de aynı şekilde kullanıyorum client tarafı farklı zamanlarda server'a istek atıp veri gönderiyor kaydettiriyor bu yüzden şişme olmuyor hep 10ms civarında kullanıyor sv sided
 
DF
Güncelleme: (29.04.2021)



Discorddan ve yorumlardan gelen istekler üzerine sol alta haritanın sağına anlık aracın kilometre sayacı eklendi. (Sayaç konumu ve renkleri istediğiniz gibi kendinize göre düzenleyebilirsiniz.)

Ekstradan ufak tefek script işleyişinde değişiklikler yapıldı.

Dosyalar güncellenmiştir. Linkten tekrar indirmeniz yeterlidir.

50951
 
DF

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kayıt ol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Şimdi kayıt ol
Giriş yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş yap

Bu konuyu görüntüleyen kullanıcılar

Tema düzenleyici

Tema özelletirmeleri

Granit arka planlar

Lütfen Javascript'i etkinleştirin!Javascript'i etkinleştirin!