[LUA] Patron sistemi yazmak

  • Konuyu açan Konuyu açan DeadLyEscaPe
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 5
  • Gösterim Gösterim 280

DeadLyEscaPe

MT Üye
MT Üye
Mesaj
470
Çözümler
29
Beğeni
117
Puan
474
Ticaret Puanı
0
Merhabalar. Ne kadar doğru ve kullanışlı olduğunu bilmeden, bazı quest dosyalarından fonksiyonların kullanımı ile ilgili araştırmalar sonucu ve bazı örneklendirmeler ile amatörce bir sistem yazdım. Benim görebildiğim oluşabilecek tüm sorunları ve hataları engelledim. Her şey şuan için doğru ve güzel işliyor. Kafamda birkaç sorum ve güncelleme yapmak istediğim şeyler var. Sorulara gelmeden önce güncellemelerden bahsetmek istiyorum.

Patronların listelendiği yeri, sırası ile;
1. Sadece seviyenin ve seviyenin altındaki patronları listede görüntüle.
2. Seviyenin görüntülendiği patronlara ait biletin envanterinde mevcut ise patronu listeye dahil et.
3. Patronlar ile arandaki soğuma süresi sıfır olan patronları görüntüle.
4. Soğuma süresini öğrenmek istediğin patronların listesini ayrı bir pencerede görüntüle. ( Daha gelişmiş versiyonu LUA ile yapılabilir mi bilmiyorum. Soğuma süresi dolan patronun PM yoluyla bilgilendirilmesi. (PM yolu ile mesaj gönderme fonksiyonu yıllar önce paylaşılmıştı sanırım.) Bunun için loop kullanılması gerek sanırım. Bunu kullanmak istemiyorum. Bunu kullanmadan yapılabilir mi?

Örneğin:
" Azrail ile arandaki soğuma süren 1 saat 53 dakika 32 saniye kaldı. "

Sorularım;
1. Soğuma süresi pc.setqf ile tutuluyor. d.setqf ile tutsam süre sadece zindan içerisinde kaldığın sürece mi geçerli olur? Zindandan çıkış yapıldığında soğuma süresi sıfırlanır mı? Bunu böyle tutmak yerine kesilen patronların soğuma sürelerini listeleyen bir mysql tablosu oluşturulsa ve oradan süre çekilip ona göre patron ile tekrar buluşup buluşulamayacağına karar verilse aynı şeyi mi yapmış oluruz performans açısından, daha mı kötü olur? Ya da bu süreyi bu şekilde tutmak doğru mu?

2. Quest ile böyle bir sistem yazılması dezavantaj mı? Game ve python taraflı yazılanlar var biliyorum. Bu şekilde kullanmak sağlıklı mı? Orta oyunculu sunucuda riskleri var mı? (Bunun için aslında kod yapısını görmeniz gerek. (Timer ve loop kullanmadım.)

Ne kadar basit ve amatörce de olsa sadece questi İşin ehli kişilerle questi paylaşmak istiyorum. Maruz görün. Eğer bilgili kişiler yardımcı olursa çok memnun olurum.



Güncelleme 20.02.2025 - 03.06 Perşembe

1. Tüm patronları oyuncuya göstermek yerine koşullanan sıralamaya göre patronları listeler.
1.webp


2. Soğuma biletine sahip olunan patronların soğuma süresini görüntüleyebilir ve sıfırlayabilir.

3.webp


3. VIP oyuncular, soğuma biletine ihtiyaç duymadan soğuma süresi olan tüm patronları görüntüleyebilir ve sıfırlayabilir.

2.webp


4. VIP oyunculara özel olarak patronlarla yüzleşeceğin elçi ile konuşurken patrona ait biletin olmaması durumunda o an o pencereden bileti
ücreti karşılığında satın alabilme

4.webp


5. Patronu tam yok etme esnasında zindandan çıkış yapmak istenildiğinde oluşan sürekli patron kesme hatası düzeltildi.
( Patron canı %10 ve altında ise çıkış yapamazsın.)

6. Beklenmeyen bir şekilde zindanda patron varken elçi ile diyaloğa girme durumunda çok büyük sıkıntılar çıkabilir. Bunun önüne tamamen geçildi.

7. Geçici süre de olsa gereksiz log tutumunu engelleme:
Oyuncunun patronla yüzleşebilecek maksimum seviyesi vardır. Bu seviye aşıldığında oyuncu patronla bir daha karşılaşamaz.
Maksimum seviye aşılmışsa kontrolü sağlandıktan sonra soğuma süresi devam eden patron var ise performans açısından silinmesi daha uygundur.
Bu kontrol zindana her giriş yapıldığında sorgulanır.
Zindana girişte seviye aşılmışsa ve soğuma süresi devam ediyorsa önceki patronların soğuma süresi sıfırlanır.


Sistem ile ilgili detaylı video:

 
Son düzenleme:
Soğuma süresi dolan patronun PM yoluyla bilgilendirilmesi. (PM yolu ile mesaj gönderme fonksiyonu yıllar önce paylaşılmıştı sanırım.) Bunun için loop kullanılması gerek sanırım. Bunu kullanmak istemiyorum. Bunu kullanmadan yapılabilir mi?

"cooldown_bitis_zamani - suanki_zaman" çıkan zamanda tetiklenecek şekilde quest üzerinden bir timer oluşturarak timer tetiklendiğinde kullanıcıya bildirim iletebilirsin

Soğuma süresi pc.setqf ile tutuluyor. d.setqf ile tutsam süre sadece zindan içerisinde kaldığın sürece mi geçerli olur? Zindandan çıkış yapıldığında soğuma süresi sıfırlanır mı? Bunu böyle tutmak yerine kesilen patronların soğuma sürelerini listeleyen bir mysql tablosu oluşturulsa ve oradan süre çekilip ona göre patron ile tekrar buluşup buluşulamayacağına karar verilse aynı şeyi mi yapmış oluruz performans açısından, daha mı kötü olur? Ya da bu süreyi bu şekilde tutmak doğru mu?

dungeonlar tek core(ch99) üzerinden erişilebilecekse ve maks süreleri 12 saatten azsa(ya da ortalama oyunun uptime değeri neyse) direkt gamede bir std::map üzerinde oyuncu pidine görede tutabilirsin, boş yere quest flag kullanmamış olursun. bunun dışında yine quest flag'e alternatif olarak player tablosuna yeni bir json sütunu oluşturup toplu halde tüm zindanların soğuma sürelerin tutacak şekilde karakter çıkışlarında burayada kaydedebilirsin, her bir zindan için ayrı ayrı quest flag açmamış olursun.

Quest ile böyle bir sistem yazılması dezavantaj mı? Game ve python taraflı yazılanlar var biliyorum. Bu şekilde kullanmak sağlıklı mı? Orta oyunculu sunucuda riskleri var mı? (Bunun için aslında kod yapısını görmeniz gerek. (Timer ve loop kullanmadım.)

scriptlerin(py ve lua) genel olarak amacı core sisteme müdahale etmeden konudaki gibi eklentiler yazabilmek, bakımsız düzenleyebilmek vs. aynı amacı karşıladıktan sonra gamenin kendisinden yapmaktan çok daha mantıklı bir seçim
 
"cooldown_bitis_zamani - suanki_zaman" çıkan zamanda tetiklenecek şekilde quest üzerinden bir timer oluşturarak timer tetiklendiğinde kullanıcıya bildirim iletebilirsin



dungeonlar tek core(ch99) üzerinden erişilebilecekse ve maks süreleri 12 saatten azsa(ya da ortalama oyunun uptime değeri neyse) direkt gamede bir std::map üzerinde oyuncu pidine görede tutabilirsin, boş yere quest flag kullanmamış olursun. bunun dışında yine quest flag'e alternatif olarak player tablosuna yeni bir json sütunu oluşturup toplu halde tüm zindanların soğuma sürelerin tutacak şekilde karakter çıkışlarında burayada kaydedebilirsin, her bir zindan için ayrı ayrı quest flag açmamış olursun.



scriptlerin(py ve lua) genel olarak amacı core sisteme müdahale etmeden konudaki gibi eklentiler yazabilmek, bakımsız düzenleyebilmek vs. aynı amacı karşıladıktan sonra gamenin kendisinden yapmaktan çok daha mantıklı bir seçim

Teşekkür ederim yönlendirme için uygulamaya çalışacağım.

İkinci alternatif kulağıma daha hoş geldi. Bununla ilgili ufak bir örnek kod verebilir misiniz müsait olduğunuzda?

" player tablosuna yeni bir json sütunu oluşturup toplu halde tüm zindanların soğuma sürelerin tutacak şekilde karakter çıkışlarında burayada kaydedebilirsin "
 
Teşekkür ederim yönlendirme için uygulamaya çalışacağım.

İkinci alternatif kulağıma daha hoş geldi. Bununla ilgili ufak bir örnek kod verebilir misiniz müsait olduğunuzda?

" player tablosuna yeni bir json sütunu oluşturup toplu halde tüm zindanların soğuma sürelerin tutacak şekilde karakter çıkışlarında burayada kaydedebilirsin "
hem game hem db hemde json işleme işin içine girdiği için basitçe birkaç satır ile anlatmak pek mümkün değil malesef ancak json kısmı için ikarus v2'nin db kısmında örnek kullanım mevcut, verileri aktarmak içinde CHARACTER sınıfındaki m_points(CHARACTER_POINT) üzerinden Save tetiklendiğinde dbye aktarıp kaydedebilirsiniz, ENABLE_EXTENDED_BATTLE_PASS bu sistem benzer bir düzenleme yapmış örnek olarak bakılabilir
 
Konuda 7 adet güncelleme mevcut.

Tekrar merhaba. Bu sistemde bir zaman sınırlayıcısı olmadan patrona geri dönüş eklentisi mevcut. Oyuncu istediği zaman geri dönebilir. Bunu süreli yapmak istiyorum.

İşleyiş:
Zindana giriş yapıldı, bir patron çağırıldı. Zindanda bir adet patron bulunurken; beklenmedik bir çıkış yapılırsa, internet kopması, elektrik gitmesi, görev yöneticisinden sonlandırılması gibi yani logout olunursa 180 saniyelik süre akmaya başlayacak. Bu süre zarfında geri dönmek için NPC'ye gittiğinde süre dolmamış ise seni kaldığın yerden devam ettirecek ve süreyi sıfırlayıp seni tekrar içeri alacak. NPC'ye geri gittiğinde süre dolmuşsa sana sürenin dolduğunu, tekrar giriş yapmak isteyip istemediğini soracak.

Varsayımım:
Patrona geri dönmek için 3 dakika zaman verilmesi avantajlı mı? Dezavantajlı mı?
Burada 3 dakikalık zamanı sürekli kontrol etmeyecek, sadece beklenmedik bir çıkışta süreyi başlatarak kontrol edecek.
Oyuncu tekrar zindandan içeri girdiğinde zaman sıfırlanacak.
Bu eylem yapılmazsa ve oyuncu beklenmedik bir çıkış yaparsa veri tabanında sürekli bir oyuncu için bir kayıt tutulacak.
Eğer zamanlayıcı işlemi yapılırsa o süre zarfınca oyuncu NPC'ye ne kadar hızlı geri dönerse sunucu için bir avantaj, oyuncu için bir dezavantaj. Oyuncu için neden dezavantaj? Daha önceden süre sınırı olmaksızın zindana kaldığı yerden devam edebiliyordu, artık hızlı bir bilgisayara ihtiyacı var. Sunucu yönünden avantajı ise oyuncunun bir daha ne zaman patrona geri döneceği, < belirsiz zaman > kadar sunucuda gereksiz kayıt tutmasından kurtulacak.
En kötü ihtimal ile belirsiz bir zaman kadar kayıt tutmak yerine, 3 dakika boyunca kayıt tutmak diğerine nazaran daha büyük avantajdır diye düşünüyorum.

Sunucu açısından; bir zamanlayıcı kontrolü daha çok mu yorucudur? Yoksa belki de hiç patrona geri dönmeyecek bir oyuncunun kaydını sınırsız süre sunucuda tutmak mı daha yorucudur?

Son:
Quest sınırları içerisinde yazılabilecek kafamdaki en iyi patron sistemini yazmak istiyorum. Bunun için kafamı kurcalayan konuları bu konu altından sizlere sormak istiyorum.

Varsayımım yanlış mı? Eğer yanlışsa sebeplerini, doğru ise " Bu yöntemle, şu şekilde yaparsan daha performanslı olur " dediğiniz yönteminiz varsa açıklayabilirseniz sevinirim.

İyi forumlar.
 
Son düzenleme:
Geri
Üst