Yardım Yeni bir loot sistemi oluşturmak - Öneriler ve Sorular

  • Konuyu açan Konuyu açan cacaa
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 6
  • Gösterim Gösterim 278
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

cacaa

Üye
Üye
Mesaj
88
Çözümler
7
Beğeni
50
Puan
709
Ticaret Puanı
0
Sistem hakkında bilgi
Merhabalar, orta seviyede C++ ve C# bilgim mevcut. Daha önce oynayan varsa Loot sistemini değiştirerek Knight Online tarzı bir loot sistemi yapmayı düşünüyorum.
Sistem şu şekilde işleyecek:

- Canavar ölür.
- Canavar öldüğünde yere drop kutusu düşer. (System World Chest eklentisi kullanılabilir.)
- Kutuya sağ klik yapılarak bir ui penceresi açılır ve içerinde düşen itemler görünür. İtemlere tıklayarak envantere ekleriz.
- Bu drop kutusunu sadece yaratığı öldüren kişi görüp toplayabilir. (Eğer grup üyeleri varsa onlar da görüp toplayabilir.)

Her şey fikirde oldukça güzel fakat Metin2 programlamaya yeni giriş yaptığım için bu sourcelerde yer alan kod bloklarını tanımıyorum. Bu sebeple hangi alanlarda ve dosyalarda, hangi fonksiyonlarla çalışacağımı pek iyi bilmiyorum. Yardımlarınızı bekliyorum.

Bu sistem bize ne katar?
- Eğer zorlu bir farm yapılı oyun düşünüyorsak ekonomiyi kontrol altına alır ve eşyaları değerlileştirir.
- Yerden eşya toplayan çöpçüler olmaz. (Tabi bunun için oyun ve server tabanlı itemdrop fonksiyonunu da return ile deaktif etmek gerekiyor.)
- Gereksiz kasmaların önüne geçerek eşya drop lagını fixler.

Sizi bu sistemde birleşmeye ve oyuna yeni bir şey katmaya davet ediyorum. Haydi el ele... :)
 
Güncelleme
Öncelikle yere düşen itemleri kaldırmakla başlıyorum.

char_battle.cpp içerisinde
if (ITEM_MANAGER::instance().CreateDropItem(this, pkAttacker, s_vec_item)) altında
"item->AddToGround(GetMapIndex(), pos);" kısmını deaktif hale getirdim.

Bu işlem hem yang hem de item için geçerlidir. Yani iki farklı kısımda etkisiz hale getirme işlemi yapılacak.

Şimdi AddToGround için tıpkı item gibi bir sandık fonksiyonu ekleyip yere sandık düşürmemiz gerekiyor.
 
Son düzenleme:
Yede sandık düşürmek için mantıklı ama bir o kadar uğraştıcı bir yöntem var düzenlediğin sandıkları slotların içine tek tek ekleyebilirsin düşen diğer itemleri kaldırarak..
Sadece itemi düşüren kişinin görmesi için nasıl bir yol izlenir bilmiyorum ama buna çokta gerek yok gibi..
Çırak sandığı modülünü izleyerekte sandık içerisindeki bütün itemleri tek tıkla envanterine getirebilirsin..
sağ click dediğin sandık önizleme sistemi oluyor zannedersem..
 
Yede sandık düşürmek için mantıklı ama bir o kadar uğraştıcı bir yöntem var düzenlediğin sandıkları slotların içine tek tek ekleyebilirsin düşen diğer itemleri kaldırarak..
Sadece itemi düşüren kişinin görmesi için nasıl bir yol izlenir bilmiyorum ama buna çokta gerek yok gibi..
Çırak sandığı modülünü izleyerekte sandık içerisindeki bütün itemleri tek tıkla envanterine getirebilirsin..
sağ click dediğin sandık önizleme sistemi oluyor zannedersem..

item->GetOwner kullanılarak bir yere varabilirim diye düşünüyorum.
 
Son düzenleme:
Merhabalar düşünceniz beni fazlasıyla mutlu etti, ancak biz bu sistemi zaten MMO oyunumuzda kullanıyoruz. Hack and Slash I.P'de bizim çünkü başka böyle bir I.P girişi yok. Öncelikle göstereyim, yapmaya çalıştığınız şey muhtemelen bu olmalı ve daha sonra kendi kod tarafımızdan örnek vereyim. En azından bir roadmap oluşturabilirsiniz sanırım.

Linkleri görebilmek için giriş yap veya kayıt ol.


Ne yazık ki bahsettiğiniz oyun üzerinde hiç çalışmadım. Kendi oyunumuz, kendi syntax modelimiz, ve enginemiz var. Bahsettiğiniz bu sistemi tasarlamanıza yardımcı olacak bir takım notlar yazayım sizin için. anavar ve oyuncu nesnelerini yönetmek için ECS mimarisini kullanabilirsiniz. ECS, nesneleri bileşenler (components) ve sistemler (systems) olarak ayırır. Canavarlar, 'Health', 'DropTable', ve 'Visibility' gibi bileşenlere bağlı olabilir. Ölüm ve loot logiğini işleyen sistemler, bu bileşenlerin durumlarını sorgulayarak gerekli işlemleri yapar. Canavarın ölüm olayı tetiklendiğinde, DropTable bileşeninden hangi itemlerin düşeceğini belirleyen bir loot algoritması devreye girecek. Bu, belirli bir rastgelelik ve olasılık modeline dayanarak çalışmalıdır. Örneğin, her bir item için ayrı bir düşme şansı tanımlayabilirsiniz ve bu şanslar, Monte Carlo simülasyonu veya benzeri bir yöntemle hesaplanabilir. Canavar öldüğünde, düşecek bir sandık yada bir particle VFX bir kutu yaratılmalıdır. Bu kutu, grafiksel olarak bir 3D model veya sprite ile temsil edilebilir. Biz oyunumuzda Particle ile bunu kullandık. Oyuncu kutuya sağ/sol tıkladığında, bir UI penceresi açılır. Bu pencere, en azından benim bildiğim kadarıyla C#'da WPF veya gibi teknolojilerle geliştirilebilir. Biz hem C++ hemde C# birleşimi özel bir syntax kullanıyoruz bu yüzden universal. Kutunun kimler tarafından görülebileceği ve erişilebileceği, 'Visibility' bileşeni ile kontrol edilebilir. Bizim oyunumuzda yalnızca düşen kişiye görünür grup üyeleri dahi bunu göremez. Bu bileşen, kutunun oluşturulduğu anda, canavarı öldüren oyuncunun ve varsa grup üyelerinin kimliklerini kaydeder. Sistem, her oyuncunun kutuyu görmeye çalıştığında bu bilgileri sorgulayarak, erişim izni verip vermeyeceğine karar verir. (Bu kodda vereceğiniz permission'a bağlı). Binlerce CCU'da bunu kullanacağınızı tahmin ederek drop kutusunun durumu ve içindeki itemlerin durumu, ağ üzerinden senkronize edilmelidir, yada direk CLC'de yapabilirsiniz. Ağ tarafı derseniz WebSockets, TCP/IP veya UDP gibi protokoller kullanılarak yapılabilir. Ayrıca, ağ gecikmeleri ve veri tutarlılığı için önlem almalısınız. İtemlerin gösterimi ve envantere eklenmesi için drag-and-drop veya click-event-handler gibi olay yönlendirme mekanizmaları kullanılabilir. Sanırsam bahsettiğiniz oyunun client tarafında Python ile bu yapılabilir.

Birazda tips bırakayım; Canavarların loot olasılıklarını yönetmek için stokastik modeller kullanarak, non-deterministik drop tabloları implemente edebilirsiniz. Örneğin, Poisson veya Geometrik dağılımlar kullanarak item drop frekansını ve türünü modelleyebilirsiniz. Loot kutusu erişiminde race conditions ve deadlock'lardan kaçınmak için, optimistik veya pesimistik kilit mekanizmaları kullanarak concurrency yönetimi bahsettiğiniz oyunda yapılabiliyorsa kullanabilirsiiz. Özellikle, distributed sys'de kullanılan MVCC yaklaşımını değerlendirebilirsiniz. Drop kutularının ve oyuncuların konumlarına dayalı hızlı sorgulama ve erişim için spatial hashing tekniklerinden faydalanın. Bu, özellikle büyük oyun haritalarında ve yüksek oyuncu sayılarında performansı artırabilir. Loot kutusu işlemlerinin güvenliği ve senkronizasyonu için burada, authoritative server modelini kullanarak, client manipülasyonunu en aza indirgeyin ve state consistency'i sağlayın. Bir sıralar bununla ilgili çok ayrıntılı bir konu paylaşmıştım ama anlayan olmadığından haliyle ilgide görmemişti. Bu forumda bir yerlerde bir kopyasının daha olması lazım.

Bizim kod yapısı da bu şekilde,; Çabanıza karşılık referans olsun benden size.
Alıntılarda özel içerikler gözükmez.


İyi çalışmalar.

Çok teşekkür ederim harika oldu bu benim için.
 
Benzer bir düzenlemeyi yakında bende yapacaktım aklımdaki yapıya göre örnek veriyim belki işe yarar. İlk olarak mob öldüğünde ayrıca bir chest atmasına gerek yok, mobun ölüsü üzerinden basitçe bir board açtırabilirsin ve eşyaları burada listeler. Mob ölüsü eşya içerdiği sürece yerden silinmez(en azından 3-5dk gibi belli bir süre için) ya da mobdaki tüm eşyalar alındığında ölüsü direkt kaybolur. Buraya kadar teknik olarak aynı şeyler buradan sonrası ise oyun tipine bağlı olarak zor ya da yenilikçi bir yapıda yapmak istiyorsan kullanılabilir.

Eşyalara taş basarken ya da istiridye açarken nasıl yakma şansı varsa mobdan eşyaları çekerkende benzer bir şans ile bu eşyaları patlatma ihtimali eklenebilir.
Rng katmak açısından bu eşyalara bir pasif skille dayalı olarak rastgele bonuslar ya da avantajlar eklenebil,r(mevcut efsun yapısından bahsetmiyorum)
Düşen eşya sana ait değilse bunlar için yine bir pasif skille dayalı olarak çalma eklenebilir. eşyayı çaldığıındada alignment ve farklı yollar ile karaktere debufflar verilebilir
 
Üst