Gecikmeler ve Bekleme Süreleri

Hakkında

Bir bekleme süresi (cooldown), bir olayın yalnızca son gerçekleşmesinden bu yana belirli bir süre geçtiğinde tetiklenmesini sağlar.

Bir olay için bekleme süresi birkaç farklı yolla oluşturulabilir ve bu, zamana dayalı bir koşul belirlenerek yapılır.

function myFunc() if funcNotOnCooldown then -- İşlemleri yap end end

CurTime

CurTime, bir olay için gecikme ayarlamak adına kullanışlı bir araçtır. Fonksiyon, sunucunun aktif kalma süresini saniye cinsinden döndürür. Bu da, döndürülen değeri kaydedip ardından tekrar çağırarak geçen süreyi takip edebileceğimiz anlamına gelir.

İşte CurTime kullanılarak yapılmış bir bekleme süresi örneği:

local delay = 2 local lastOccurance = -delay -- İlk tetikleme denemesinin çalışacağından emin olun local function myFunc() local timeElapsed = CurTime() - lastOccurance if timeElapsed < delay then -- Son olaydan bu yana geçen süre 2 saniyeden azsa print( "Olay bekleme süresinde ve tetiklenmedi" ) else print( "Olay tetiklendi!" ) lastOccurance = CurTime() end end
Eğer olayınız oyun içi olaylarla ilgili değilse, sunucu zamanı yerine her zaman gerçek dünya saatiyle senkronize olan RealTime fonksiyonunu kullanmayı düşünebilirsiniz.

Yukarıdaki örnekte, son olayın ne zaman gerçekleştiğini anlamak için CurTime kullandık. Bunun yerine, bir sonraki olayın ne zaman gerçekleşmesi gerektiğini belirlemek için de kullanabiliriz.

local delay = 5 local nextOccurance = 0 local function myFunc() local timeLeft = nextOccurance - CurTime() if timeLeft < 0 then -- Zaman, bir sonraki gerçekleşme zamanını geçtiyse print( "Olay tetiklendi!" ) nextOccurance = CurTime() + delay end end

Zamanlayıcılar

Gecikme ayarlamanın bir başka yöntemi de timer kütüphanesini kullanmaktır.

local delay = 2 local shouldOccur = true local function myFunc() if shouldOccur then print( "Olay tetiklendi!" ) shouldOccur = false timer.Simple( delay, function() shouldOccur = true end ) else print( "Olay hala bekleme süresinde" ) end end
Zamanlayıcının bitmesine ne kadar süre kaldığını bilmek isterseniz, timer.Create ve timer.TimeLeft fonksiyonlarını kullanın.
GM:Think ve GM:HUDPaint gibi her karede/tick'te çalışan hook'ların içinde zamanlayıcı kullanmamanız önerilir.

Gerçek Dünya Zamanı

Harita değişiklikleri ve hatta sunucu yeniden başlatmaları arasında devam etmesi gereken uzun bekleme süreleriyle uğraşıyorsanız, bekleme süresini ayarlamak için gerçek dünya zamanını kullanmanız gerekir. Gerçek dünya zamanını os.time ve os.date ile kullanabiliriz.

Harita değişiklikleri ve sunucu yeniden başlatmaları arasında bilgiyi kaydetmenin farklı yolları vardır. Aşağıdaki örnekte, fonksiyonum için 24 saatlik bir bekleme süresi ayarlamak amacıyla cookie kütüphanesini kullanacağım.

local cooldown = 86400 -- Saniye cinsinden 24 saat (24*60*60) local function myFunc() local nextUse = cookie.GetNumber( "myFuncNextUse", 0 ) local time = os.time() if time < nextUse then print( "Olay bekleme süresinde ve tetiklenmedi" ) local nextUseString = os.date( "%Y/%m/%d - %H:%M:%S" , nextUse ) -- Bir sonraki kullanım zamanını güzelce biçimlendir print( "Olayın tekrar kullanılabileceği tarih: " .. nextUseString ) else print( "Olay başarıyla tetiklendi!" ) cookie.Set( "myFuncNextUse", time + cooldown ) end end

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord