vSRO Çözüldü DPS Meter için AGENT_ENTITY_SKILL_CAST_END çözümlemesi

merttopal7

.
Aktiflik: 3%
Muhafız 50 mesaj
Katılım
21 Ara 2019
Mesajlar
159
Tepkime puanı
65
Puan
28
Konum
Turkey
Web sitesi
merttopal.com.tr
Özel Başlık (Postbit)
Software Developer
Thread owner
ÇÖZÜM;
Maalesef döküman bu opcode için hatalı.
Başka bir forumdan aşağıdaki yapıyı buldum. Sorunsuz çalışıyor.
// 0xB070 Server_WorldObject_Cast_Start
1 byte isSuccess
if (isSuccess == 1 )
{
1 byte unk1
1 byte unk2
4 byte skillTypId
4 byte casterWorldId
4 byte unk3
4 byte targetWorldId
1 byte instantResponse

if (instantResponse == 1)
{
ParseDmg()
}
else
{
1 byte hasDmg ?? --> 1 --> yes ??
}
}
else
{
2 byte ErrorCode
}
// 0xB071 Server_WorldObject_Cast_End
1 byte isSuccess
if (isSuccess == 1)
{
4 byte castWorldId
4 byte castTargetWorldId

ParseDmg();
}
else if (isSuccess == 2)
{
2 byte ErrorCode
4 byte castWorldId
}
------------------------------------------------------
// ParseDmg
1 byte hasDmg
if (hasDmg == 1 )
{
1 byte hitcount
1 byte targetCount
for (int i = 0; i < targetCount; i++)
{
4 byte targetWorldId
for (int ii = 0; ii < hitcount; ii++)
{
1 byte effects // bitmask --> ATTACK_STATE_KNOCKBACK = 0x01, ATTACK_STATE_BLOCK = 0x02, ATTACK_STATE_POSITION = 0x04, abort ? --> 0x08 ATTACK_STATE_DEAD = 0x80
1 byte dmgSource // bitmask --> DAMAGE_STATE_NORMAL = 0x01, DAMAGE_STATE_CRIT = 0x02, DAMAGE_STATE_STATUS = 0x10

if ((attackState & 0x0A) != 0x00) // if ATTACK_STATE_BLOCK or abort --> no more data
{
continue;
}

4 byte dmg
1 byte unk4
1 byte unk5
1 byte unk6
}
}
}






Filter üzerinde B0710 ve B071 okumak istedim.
SilkroadDoc'dan kontrol ettiğimde;
B0710 Kodu patlatmıyor ancak targetDamage her zaman 0 okunuyor.
B071 ile ilgili bir hata olduğunu düşünmeye başladım. Forumda bu kod için konu açılmış ancak beceremedim.

public uint SkillUID;
public uint EntityDestinationUID;
public byte hasDamage;
public byte hitCount;
public byte targetCount;
public uint TargetUID;
public uint TargetSkillEffectFlag;
public byte TargetSkillDamageFlag;
public uint TargetDamage;
public uint unkUInt01;
public byte Result;

Okuduğum veriler;
SkillUID: 710
EntityDestinationUID: 113711
hasDamage: 1
hitCount: 1
targetCount: 1
TargetUID: 113711
TargetSkillEffectFlag: 1687880064 (Muhtemelen Hatalı)
TargetSkillDamageFlag: 26
TargetDamage: 16384
unkUInt01: Crash...


Bilgili arkadaşların desteklerini bekliyorum. Herkese iyi forumlar.
 
Zamanında bir glut sronu çözmüştüm ve bunu guard üzerinden 2 kişiye fixletmiştim , buda sanırım bu tür bir soruna benziyor , Maksimum damage 16 milyon civarına kadar çıkabiliyor.
SkillEffectFlag.Block veya Cancel durumlarında o target atlanıyor, bu yüzden TargetDamage sıfır veya okunmuyor olabilir.
Sen 4 byte okuduğunda, bu 1 byte’lık fazla okuma sonraki alanı (unkUInt01) bir byte kaydırıyor.
Bu yüzden > TargetSkillEffectFlag saçma değerler (örneğin 1687880064) çıkıyor,
TargetDamage yanlış hesaplanıyor, unkUInt01 ve Result bozuluyor veya crash yaratıyor.
Silkroad orjinal paket veri yapısı gerçekten 10 byte kadar yükselip yada özelleştirme yapabileceğimiz derin bir alan bıraksaydı game server üzerinden yapacağım çok mükemmel işler çıkarabilecektik bu aynı zamanda oyuncularıda çok sevindirecek bir sistemdi ama maalesef 4byte aşamıyoruz.
 
Thread owner
Zamanında bir glut sronu çözmüştüm ve bunu guard üzerinden 2 kişiye fixletmiştim , buda sanırım bu tür bir soruna benziyor , Maksimum damage 16 milyon civarına kadar çıkabiliyor.
SkillEffectFlag.Block veya Cancel durumlarında o target atlanıyor, bu yüzden TargetDamage sıfır veya okunmuyor olabilir.
Sen 4 byte okuduğunda, bu 1 byte’lık fazla okuma sonraki alanı (unkUInt01) bir byte kaydırıyor.
Bu yüzden > TargetSkillEffectFlag saçma değerler (örneğin 1687880064) çıkıyor,
TargetDamage yanlış hesaplanıyor, unkUInt01 ve Result bozuluyor veya crash yaratıyor.
Silkroad orjinal paket veri yapısı gerçekten 10 byte kadar yükselip yada özelleştirme yapabileceğimiz derin bir alan bıraksaydı game server üzerinden yapacağım çok mükemmel işler çıkarabilecektik bu aynı zamanda oyuncularıda çok sevindirecek bir sistemdi ama maalesef 4byte aşamıyoruz.
Yanıtınız için teşekkür ederim. Muhtemelen verdiğim hasar 2-3m civarlarında. 4 byte okuduğum veriyi 3 byte okuyup sonucu paylaşacağım.

Daha önce client için harici bir socket yapısı denemiştim. GS - devkit birleştirmiştim. Bir sorun yaşamamıştım. Buna gerek var mı derseniz hep olumsuz yanıt aldım. Bahsettiğiniz okuma için işe yarar mı bilmem ancak paylaşmak istedim. (Nodejs - TCP socket - Gameserver şu şekildeydi)
 
ÇÖZÜM;
Maalesef döküman bu opcode için hatalı.
Başka bir forumdan aşağıdaki yapıyı buldum. Sorunsuz çalışıyor.
// 0xB070 Server_WorldObject_Cast_Start
1 byte isSuccess
if (isSuccess == 1 )
{
1 byte unk1
1 byte unk2
4 byte skillTypId
4 byte casterWorldId
4 byte unk3
4 byte targetWorldId
1 byte instantResponse

if (instantResponse == 1)
{
ParseDmg()
}
else
{
1 byte hasDmg ?? --> 1 --> yes ??
}
}
else
{
2 byte ErrorCode
}
// 0xB071 Server_WorldObject_Cast_End
1 byte isSuccess
if (isSuccess == 1)
{
4 byte castWorldId
4 byte castTargetWorldId

ParseDmg();
}
else if (isSuccess == 2)
{
2 byte ErrorCode
4 byte castWorldId
}
------------------------------------------------------
// ParseDmg
1 byte hasDmg
if (hasDmg == 1 )
{
1 byte hitcount
1 byte targetCount
for (int i = 0; i < targetCount; i++)
{
4 byte targetWorldId
for (int ii = 0; ii < hitcount; ii++)
{
1 byte effects // bitmask --> ATTACK_STATE_KNOCKBACK = 0x01, ATTACK_STATE_BLOCK = 0x02, ATTACK_STATE_POSITION = 0x04, abort ? --> 0x08 ATTACK_STATE_DEAD = 0x80
1 byte dmgSource // bitmask --> DAMAGE_STATE_NORMAL = 0x01, DAMAGE_STATE_CRIT = 0x02, DAMAGE_STATE_STATUS = 0x10

if ((attackState & 0x0A) != 0x00) // if ATTACK_STATE_BLOCK or abort --> no more data
{
continue;
}

4 byte dmg
1 byte unk4
1 byte unk5
1 byte unk6
}
}
}






Filter üzerinde B0710 ve B071 okumak istedim.
SilkroadDoc'dan kontrol ettiğimde;
B0710 Kodu patlatmıyor ancak targetDamage her zaman 0 okunuyor.
B071 ile ilgili bir hata olduğunu düşünmeye başladım. Forumda bu kod için konu açılmış ancak beceremedim.

public uint SkillUID;
public uint EntityDestinationUID;
public byte hasDamage;
public byte hitCount;
public byte targetCount;
public uint TargetUID;
public uint TargetSkillEffectFlag;
public byte TargetSkillDamageFlag;
public uint TargetDamage;
public uint unkUInt01;
public byte Result;

Okuduğum veriler;
SkillUID: 710
EntityDestinationUID: 113711
hasDamage: 1
hitCount: 1
targetCount: 1
TargetUID: 113711
TargetSkillEffectFlag: 1687880064 (Muhtemelen Hatalı)
TargetSkillDamageFlag: 26
TargetDamage: 16384
unkUInt01: Crash...


Bilgili arkadaşların desteklerini bekliyorum. Herkese iyi forumlar.
Neden client tarafında okumuyorsunuz?
Üst üste post gönderildiği için tek mesajda birleştirildi:

ÇÖZÜM;
Maalesef döküman bu opcode için hatalı.
Başka bir forumdan aşağıdaki yapıyı buldum. Sorunsuz çalışıyor.
// 0xB070 Server_WorldObject_Cast_Start
1 byte isSuccess
if (isSuccess == 1 )
{
1 byte unk1
1 byte unk2
4 byte skillTypId
4 byte casterWorldId
4 byte unk3
4 byte targetWorldId
1 byte instantResponse

if (instantResponse == 1)
{
ParseDmg()
}
else
{
1 byte hasDmg ?? --> 1 --> yes ??
}
}
else
{
2 byte ErrorCode
}
// 0xB071 Server_WorldObject_Cast_End
1 byte isSuccess
if (isSuccess == 1)
{
4 byte castWorldId
4 byte castTargetWorldId

ParseDmg();
}
else if (isSuccess == 2)
{
2 byte ErrorCode
4 byte castWorldId
}
------------------------------------------------------
// ParseDmg
1 byte hasDmg
if (hasDmg == 1 )
{
1 byte hitcount
1 byte targetCount
for (int i = 0; i < targetCount; i++)
{
4 byte targetWorldId
for (int ii = 0; ii < hitcount; ii++)
{
1 byte effects // bitmask --> ATTACK_STATE_KNOCKBACK = 0x01, ATTACK_STATE_BLOCK = 0x02, ATTACK_STATE_POSITION = 0x04, abort ? --> 0x08 ATTACK_STATE_DEAD = 0x80
1 byte dmgSource // bitmask --> DAMAGE_STATE_NORMAL = 0x01, DAMAGE_STATE_CRIT = 0x02, DAMAGE_STATE_STATUS = 0x10

if ((attackState & 0x0A) != 0x00) // if ATTACK_STATE_BLOCK or abort --> no more data
{
continue;
}

4 byte dmg
1 byte unk4
1 byte unk5
1 byte unk6
}
}
}






Filter üzerinde B0710 ve B071 okumak istedim.
SilkroadDoc'dan kontrol ettiğimde;
B0710 Kodu patlatmıyor ancak targetDamage her zaman 0 okunuyor.
B071 ile ilgili bir hata olduğunu düşünmeye başladım. Forumda bu kod için konu açılmış ancak beceremedim.

public uint SkillUID;
public uint EntityDestinationUID;
public byte hasDamage;
public byte hitCount;
public byte targetCount;
public uint TargetUID;
public uint TargetSkillEffectFlag;
public byte TargetSkillDamageFlag;
public uint TargetDamage;
public uint unkUInt01;
public byte Result;

Okuduğum veriler;
SkillUID: 710
EntityDestinationUID: 113711
hasDamage: 1
hitCount: 1
targetCount: 1
TargetUID: 113711
TargetSkillEffectFlag: 1687880064 (Muhtemelen Hatalı)
TargetSkillDamageFlag: 26
TargetDamage: 16384
unkUInt01: Crash...


Bilgili arkadaşların desteklerini bekliyorum. Herkese iyi forumlar.
Bunu filterimde deniycem sonuçlara bakayım damage meter var bende ama hasar yanlış mı gösteriyor veya sen canlı meter mi yapacaksın?
 
Thread owner
Neden client tarafında okumuyorsunuz?
Üst üste post gönderildiği için tek mesajda birleştirildi:


Bunu filterimde deniycem sonuçlara bakayım damage meter var bende ama hasar yanlış mı gösteriyor veya sen canlı meter mi yapacaksın?
Evet canlı meter yapmak istedim.
Her şey filterde olsun tek koddan yönetimi sağlamak için bu yolu seçtim.
Damageler doğru okunuyor.
B071 için hasar doğru okunuyor.
B070 için hasarın 1/256'sı okunuyor. (256 ile çarptım. 1/10.000 kadar sapma oluyor. Çok önemli değil gibi.)
UniqueSpawnID değeri de dönüyor. Bu ID üzerinden Unique'ye erişmek de hayli uğraştırıcı. Spawn Opcode'lerine de bakmanız gerekecek. Uzun lafın kısası client side çok daha kolay gibi.
Spawn için kaynak: [Release] CharacterData, EntitySpawn
 

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

Benzer konular

Cevaplar
9
Görüntüleme
239
alir13
Cevaplar
4
Görüntüleme
276
enescolak2
Cevaplar
4
Görüntüleme
1K
Stark
Cevaplar
2
Görüntüleme
2K
Santahashi
Etiketler
Etiketler Etiketler
dps dpsmeter filter
Geri
Üst Alt