Merhaba, Hoşgeldin!

VSRO.org, Silkroad Online, Knight Online, Metin2 ve diğer çevrimiçi oyunlar için öncü bir yardım ve geliştirme platformudur. Misyonumuz, bilgi ve deneyim sahibi bireyleri, bilgiye ihtiyaç duyanlarla bir araya getirerek, zengin bir etkileşim ortamı yaratmak ve farklı bakış açılarını birleştirmektir. Topluluğumuzda güçlü bir işbirliği ve öğrenme kültürü oluşturarak, herkesin değerli katkılarda bulunmasını sağlıyoruz.

vSRO Çözüldü 0xb070 ve 0xb071 Paketlerinin ParseDamage() Structureleri

kovboi

KGuardEDGE
.
Developer
Katılım
12 Eki 2019
Mesajlar
251
Çözümler
2
Tepkime puanı
637
Puanları
93
Konum
Antalya
Türk Lirası
0.00₺
Selam arkadaşlar.
Etrafta bir çok paylaşılmış structure mevcut ancak hiç biri tam olarak doğru değil.
0xb070 ve 0xb071 paketleri ortak bir ParseDamage() verisi içermekte. 0xb071 paketinden örnek vereceğim.

C#:
İçeriği görebilmek için Giriş yap ya da üye ol.

Ancak ne yazık ki şu paket ayrışamıyor.

C#:
İçeriği görebilmek için Giriş yap ya da üye ol.

ParseDamage() için net structure gerekiyor.

Olması gereken okuma şöyle gözüküyor
C#:
İçeriği görebilmek için Giriş yap ya da üye ol.
 
Filter ile spawn paketlerini kontrol etmek performansı etkilemiyor mu? Çünkü paketlerin içinde herşey var ve sürekli olarak geliyor. Çok az oyuncuda fark edileceğini düşünmesek bile 2-3k üzeri bir oyunda o kadar char için yığınla gelen paketleri filter okuma yaparken darboğaz yaşar gibime geliyor.

Aslında asıl önemli mesele şu ki 598k orjinal HP ye sahip olan TG ye örneğin 3M vurduğumuzda pencereye hasar clientten alındığı için 3M olarak yansıtılıyor. Ama bu gerçek hasarımız değil ki. GameServer aggro listesinde hasarımızı o anki cana göre depolamakta. Tabi şimdi diyeceksiniz ki DPS Meter yani "Damage Per Second" saniye başı hasar kardeşim bu tabi ki böyle olmak zorunda. Ama bana göre maksat vurulan hasarları toplayıp göstermek ise... tabi ki gerçek hasarlar gösterilmeli ki bir anlamı olsun. Yanımdaki adamdan ne kadar az veya fazla hasarla kaybedip & kazandığımı görmek isterim değil mi?

Şöylede bir alternatif olabilir. Bahsettiğin paketlerin içinde karşıdan gelen skillID verileride yer alıyor. Yani gelen skillID hangi UniqueID ye ait ise bu ipucu ile UniqueName de alınabilinir ve hasarları toplayıp gösterme fonksiyonuna ilave edilebilinir. Yani spawnları sürekli kontrol etmek gerekmez. Tabi ki asıl yapılması gereken ve doğru olan yöntem Unique öldükten sonra GS den map ile tüm verileri çekip ilk 8 listeyi filtreye göndermek olacaktır. Aksi halde çok fazla iş gücü ve performansı etkileyen işlemler yapmak zorunda kalıyoruz.

Bu arada çok az insan bilir. Bu özelliği silkroad'a ilk getiren GrindRoad isimli oyun idi...

 
Oyla 0
@MrHyperion öncelikle bu uzunca cevabın için teşekkür ederim.


Filter ile spawn paketlerini kontrol etmek performansı etkilemiyor mu? Çünkü paketlerin içinde herşey var ve sürekli olarak geliyor. Çok az oyuncuda fark edileceğini düşünmesek bile 2-3k üzeri bir oyunda o kadar char için yığınla gelen paketleri filter okuma yaparken darboğaz yaşar gibime geliyor.
Tam olarak darboğaz olarak nitelendiremeyiz çünkü işlemci gücünü verimli bir şekilde kullanabilmesini engelleyecek herhangi bir ThreadSafe gerekliliği yok. Tabi yine de çok doğru. Önemli seviyede işlemci tüketimine sebep olacaktır. Bu yüzden ben de SelfSpawn’ı kullansam da GroupSpawn’ı kullanmamayı seçtim.
Aslında asıl önemli mesele şu ki 598k orjinal HP ye sahip olan TG ye örneğin 3M vurduğumuzda pencereye hasar clientten alındığı için 3M olarak yansıtılıyor. Ama bu gerçek hasarımız değil ki. GameServer aggro listesinde hasarımızı o anki cana göre depolamakta.
DPS senin de söylediğin gibi saniyelik çalışmak zorundadır. ThreadSafe darboğazı zaten bir problemken GameServer üzerinden saniyelik veri çekmek söz konusu bile olamaz. Bu yüzden %100 doğrulukta değil de tabiri caizse “aşağı-yukarı” olarak değerlendiririz.
Şöylede bir alternatif olabilir. Bahsettiğin paketlerin içinde karşıdan gelen skillID verileride yer alıyor. Yani gelen skillID hangi UniqueID ye ait ise bu ipucu ile UniqueName de alınabilinir ve hasarları toplayıp gösterme fonksiyonuna ilave edilebilinir.
Burada UniqueID ile UniqueName alınması yine GroupSpawn Parse ihtiyacı doğurur. Ki zaten UniqueName bilgisine falan ihtiyacımız yok. Hasar alan objenin Monster, Struct, Character veya benzeri ne olduğu FocusObject paketi okunurken tespit edilebiliyor. Böylece GroupSpawn ihtiyacı olmadan sadece UniqueID içeren Kartezyen bir Thread Koruma ile darboğazı minimize ederek Damage bilgilerini saklayabiliyoruz.

Objenin adı ve ne kadar canı kaldığı oyun içinde hali hazırda o objeyi seçince çıkan pencerede gauge ile birlikte yer alıyor. Guardın sadece o objeyi seçmiş olanlara damage listesini periyodik olarak atması yeterli oluyor.
Tabi ki asıl yapılması gereken ve doğru olan yöntem Unique öldükten sonra GS den map ile tüm verileri çekip ilk 8 listeyi filtreye göndermek olacaktır.
Damages “per second” adından da anlaşılabileceği üzere DPS anlık demektir ve öldükten sonra göndermek DPS için bir yöntem değildir. Ama tabi ki nihai damage listesini göstermek için gereklidir.
Aksi halde çok fazla iş gücü ve performansı etkileyen işlemler yapmak zorunda kalıyoruz.
Damage başına ortalama 7 nanosaniye maliyeti var aslında. Objenin tam olarak ne olduğunu öğrenmek yerine sadece tür bilgisiyle hareket etmemin bunda payı büyük. GroupSpawn maliyeti de olmadığı için iş gücü yok sayılabilir seviyede.
Bu arada çok az insan bilir. Bu özelliği silkroad'a ilk getiren GrindRoad isimli oyun idi...
Bu güzel 👍🏻 😇 İlkler değerlidir.
 
Oyla 0
59721f94e6c9302965be842229d7f231.gif


isminin saniye başı hasar olması sadece anlık yazdırma ile çalışması gerektiği anlamına gelmez ki. Saniye başı gerçek hasarları GS zaten topluyor, Unique ölünce bu veriyi yazdırmakta bu sistemin en doğru birer parçası...

Client ile sadece görsel hasarları yazdırabilirsiniz. Ek olarak bir çok işlem yükü ve uğraş gerektiriyor.
GS ile ise hazır hesaplanmış veriyi sadece okuyup, yazdırmak yeterli olmakta. Extra bir işlem yükü ve uğraşta gerektirmez.

Anlatmaya çalıştığım aslında bu idi. Yani 12,732,060 HP ye sahip olan Demon Shaitan tek başına bir nuker char tarafından kesiliyor diyelim. HP si %5 kaldığında devil + zerk + offer + ignore ile bir wiz karakterinin 3m vurduğunu varsayalım.

Sonuç ne olur? GS gerçek hasarı hesapladığı için unique'yi nuker chara verir ve wiz karakterinin sadece %5lik kısımda etki ettiği hasarı yazdırır.
Peki clientte durum ne olur? Sadece görsel hasarı okuduğu için wiz karakterinin 3m vurduğunu yazdırır...

Ben DPS nin saniyelik çalışması zorundadır demedim. Madem hasarlar gösterilecek o zaman zaten GS tarafından saniye başı hesaplanan doğru hasarları kullanıcılara göstermemiz gerekir dedim.

Ayrıca bu anlık yazdırmayı ilk olarak LENOX, Electus için kodlamıştı ama sabit bir şekilde hala stabilite edemediler. İlk başlarda lag problemleri ile karşılaştılar. Uzun bir süre aktif etmediler. Şuan açık olan Oasis sunucusunun betasında görmüştüm aktif edilmişti ama yine doğru düzgün çalışmıyordu. Unique seçili olduğu halde pencere kapanıp/geri açılıyor vs bir takım problemleri vardı.
 
Oyla 0
Clientte damage 3m gözükse de ayar çekilebilir, mobun kaç canı kaldığını biliyor sonuçta. Filterla yapıldığında da aynı şekilde. Ama illa ki problemler olacaktır. Gsden almak en iyisi bence de.
 
Oyla 0
Ben DPS nin saniyelik çalışması zorundadır demedim. Madem hasarlar gösterilecek o zaman zaten GS tarafından saniye başı hesaplanan doğru hasarları kullanıcılara göstermemiz gerekir dedim.
DPS adında da geçtiği gibi saniyelik çalışmak zorundadır. Saniyelik çalışmıyorsa DPS değildir onun adı.

GS tarafından veri çekmek söylediğin gibi mantıklı ancak çok iyi reverse edilmiş olması lazım.

Şu an guard üzerinden yeterli seviyede doğrulukla anlık gösterimi maliyetsiz olarak yapabiliyoruz zaten. Final damageleri de GS tarafından yollatmak çok mantıklı. Ancak anlık için GS kullanımı ne derece stabil olur bilmiyorum.


Clientte damage 3m gözükse de ayar çekilebilir, mobun kaç canı kaldığını biliyor sonuçta.
Benim algoritmam mobun canını bilmiyor. Final damageleri GS’den almak o açıdan şart. Anlıklar için halen kafam karışık tabi.
 
Oyla 0
Mobun RefObjID'si var zaten elinde, RefObjCommon/RefObjChar'dan küçük bir önyükleme ile alamaz mısın en başta?

Vallahi "yeterli seviyede doğrulukla" başını ağrıtmazlar umarım :D Ben GS'den net bir şekilde aldığım halde kaç kişiye SRO'daki partiye göre hesaplama sistemini anlatmak durumunda kaldım. "KARDEŞ BOZUK BU" diye geliyorlar, delleniyorum.
 
Oyla 0
Mobun RefObjID'si var zaten elinde, RefObjCommon/RefObjChar'dan küçük bir önyükleme ile alamaz mısın en başta?

Vallahi "yeterli seviyede doğrulukla" başını ağrıtmazlar umarım :D Ben GS'den net bir şekilde aldığım halde kaç kişiye SRO'daki partiye göre hesaplama sistemini anlatmak durumunda kaldım. "KARDEŞ BOZUK BU" diye geliyorlar, delleniyorum.
Başımı ağrıtacakları kesin 😂

Mobun RefObjID’si yok ya elimde. Groupspawnda değil mi o?
 
Oyla 0
Ya VSRO bu beyler. Önerileriniz, fikir alışverişleriniz ve tartışmalarınız muazzam ama VSRO kitlesi kanser. Ne yapsanız da yaranamazsınız, salsanız mı? :D
 
Oyla 0
Ya VSRO bu beyler. Önerileriniz, fikir alışverişleriniz ve tartışmalarınız muazzam ama VSRO kitlesi kanser. Ne yapsanız da yaranamazsınız, salsanız mı? :D
VSRO gitti CSGO geldi artık orası doğru 😂
Herkes ya kill kasacak, ya unique kasacak, ya job kasacak.

Eskiden kill alayım derdinde olmayan tank bladeler ve toma warlocklar vardı. Şimdi bladelerin statları yükseltiliyor, eu skilleri kapatılıyor vs vs.

Bir de eskiden server sahipleri vurgun kaç yapardı, şimdi guildler vurgun kaç yapıyor.
 
Oyla 0
Geri
Üst Alt