ecSRO Yardım Ecsro files damage sorunu yardım

Merhaba,

Daha önce damage arttırma gibi birşey ile uğraşmadım fakat tahminim bu tarz bir işlem için hem modüller hemde client üzerinde düzenlemeler yapmanız gerekecek ve sadece offset ile çözülmeyebilir. Packet yapısında güncellemeler gerekebilir.
 
Oyla 0
Joymax damageyi int16 olarak kodlamış muhtemelen 0 – 65.535 düz mantık düşünmek gerekirse o zamanlar en yüksek HP’li mob Lord Yarkan (9.353.045) olduğu için bu limit yeterli görülmüş.
65k damage zaten fazlasıyla yeterli hem performans kazanırım hem bug riskini azaltırım diye düşündü muhtemelen.
Damage bu değeri aşınca overflow olur negatif veya daha küçük sayılar görürsün.
Bu veri tipini değiştirmek mümkün değil Gs editlenir bir şekilde fakat bunun client tarafı var @TALENT (Rüzgarında) dediği gibi Pointer tanımları damage renderler vs vs bir sürü iş yükü.
Bu yüzden 65k sınırı vSRO 188’de tamamen kalkmış.
 
Oyla 0
Joymax damageyi int16 olarak kodlamış muhtemelen 0 – 65.535 düz mantık düşünmek gerekirse o zamanlar en yüksek HP’li mob Lord Yarkan (9.353.045) olduğu için bu limit yeterli görülmüş.
65k damage zaten fazlasıyla yeterli hem performans kazanırım hem bug riskini azaltırım diye düşündü muhtemelen.
Damage bu değeri aşınca overflow olur negatif veya daha küçük sayılar görürsün.
Bu veri tipini değiştirmek mümkün değil Gs editlenir bir şekilde fakat bunun client tarafı var @TALENT (Rüzgarında) dediği gibi Pointer tanımları damage renderler vs vs bir sürü iş yükü.
Bu yüzden 65k sınırı vSRO 188’de tamamen kalkmış.
vsro
24 bit
16.777.215

VSRO_MAX_DMG_LIMIT.PNG
 
Oyla 0
Sebebi bunun Joymax 2005 yılında ilk clientte short int olarak oluşturmuş o yüzden max sınır short int için 65535, bunun sebebi de muhtemelen ağ tarafında ki hız için. Burada iki taraflı fix biri client,biri server tarafında. Örnek olsun diye sana gösteriyorum yapılabilecek işlemleri ama burada sana bütün detayını vermem mümkün değil. Aşağıda client tarafı var, bir sürü noktaya hook atmak gerekiyor fakat bu sadece clientte ki cap düzeltir, server tarafında hala bütün damage fonksiyonlarında 65535 limiti var, eğer daha önce bakmadıysan anlaman biraz zor. Bütün damage fonksiyonunu en baştan yazmak gerekiyor. İlla server tarafını da yapıcam dersen damage fonksiyonunu IDA veya Ghidra ile bulduğunda adım adım hesaplamalar göreceksin, her damage type sonrası (üç tip damage var imbue damage, phy ve mag üçüde farklı noktalarda ayrı ayrı hesaplanıyor) max dmg 65535 eşitleyen fonksiyon çağrıları var. Onları bypass etmen gerekiyor fakat en zor nokta oyundaki wall skilleri problem yaratıyor. Çok saçma bir şekilde ve mantıkla bu wall skillerini eklemişler o yüzden wall skillerinin damage hesabını, damage resistance ve damage wall hp kısmını, oyunun original formüllerini tamamen bypass edip en baştan yazman gerekiyor, yoksa wall skillerinde bug oluşuyor mesela wall kırılmıyor gibi gibi. Diğer bir problem blade skillerinin bu yatırma skilleri var, skill ismi aklıma gelmedi, orada da problem oluşuyor çünkü original damage hesaplama formülünde karakter yerde iken damage x1.5 olarak kodlanmış. O yüzden bu kısmı da hooklayıp en baştan bir damage formülü yazman gerekiyor.

Client :
/**
* Damage Cap Fix (v5.2)
* Transitioning WORD (16-bit) damage to DWORD (32-bit).
*/

// --- Group A: Entity Damage Storage (+0x128) ---
{
// A1: mov edx, [esp+8] (Read 32-bit damage)
BYTE expected[] = { 0x66, 0x8B, 0x54, 0x24, 0x08 };
BYTE patch[] = { 0x8B, 0x54, 0x24, 0x08, 0x90 };
VerifyAndPatch("A1-StorageRead", 0x006AF5E4, expected, 5, patch, 5);

// A2: mov [ecx+128h], edx (Store 32-bit damage)
BYTE expected2[] = { 0x66, 0x89, 0x91, 0x28, 0x01, 0x00, 0x00 };
BYTE patch2[] = { 0x89, 0x91, 0x28, 0x01, 0x00, 0x00, 0x90 };
VerifyAndPatch("A2-StorageWrite", 0x006AF5F1, expected2, 7, patch2, 7);
}

// --- Group C: GenDigits (Damage Text Rendering) ---
{
// C1: Load DWORD damage from offset 0x10
BYTE expected[] = { 0x66, 0x8B, 0x42, 0x0C };
BYTE patch[] = { 0x8B, 0x42, 0x10, 0x90 };
VerifyAndPatch("C1-DigitCountLoad-0x10", 0x006B1A6F, expected, 4, patch, 4);

// C2: 32-bit zero test
BYTE expected2[] = { 0x66, 0x85, 0xC0 };
BYTE patch2[] = { 0x85, 0xC0, 0x90 };
VerifyAndPatch("C2-ZeroTest", 0x006B1A73, expected2, 3, patch2, 3);

// C3: Remove 16-bit truncation mask
BYTE expected3[] = { 0x25, 0xFF, 0xFF, 0x00, 0x00 };
BYTE patch3[] = { 0x90, 0x90, 0x90, 0x90, 0x90 };
VerifyAndPatch("C3-MaskFFFF-count", 0x006B1A82, expected3, 5, patch3, 5);

// C4: Loop load from offset 0x10
BYTE expected4[] = { 0x66, 0x8B, 0x6A, 0x0C };
BYTE patch4[] = { 0x8B, 0x6A, 0x10, 0x90 };
VerifyAndPatch("C4-LoopLoad-0x10", 0x006B1BC7, expected4, 4, patch4, 4);

// C5/C6: Unsigned division (xor edx, edx)
BYTE expected5[] = { 0x25, 0xFF, 0xFF, 0x00, 0x00, 0x99 };
BYTE patch5[] = { 0x90, 0x90, 0x90, 0x31, 0xD2, 0x90 };
VerifyAndPatch("C5C6-MaskFFFF+UnsignedDiv", 0x006B1C13, expected5, 6, patch5, 6);
}

// --- Group D: 0x30D1 Packet (Damage Popup) ---
{
// Read 4 bytes instead of 2
BYTE expected[] = { 0xBD, 0x02, 0x00, 0x00, 0x00 };
BYTE patch[] = { 0xBD, 0x04, 0x00, 0x00, 0x00 };
VerifyAndPatch("D1-30D1-ReadDamageDWORD", 0x006BDF4E, expected, 5, patch, 5);
}

// --- Group F: 0x3201 Packet (Wall Damage) ---
{
// F1: Buffer size check (4 bytes)
BYTE expected[] = { 0x8D, 0x48, 0x02 };
BYTE patch[] = { 0x8D, 0x48, 0x04 };
VerifyAndPatch("F1-3201-CheckSize", 0x005D323B, expected, 3, patch, 3);

// F2: Read size (4 bytes)
BYTE expected2[] = { 0xBD, 0x02, 0x00, 0x00, 0x00 };
BYTE patch2[] = { 0xBD, 0x04, 0x00, 0x00, 0x00 };
VerifyAndPatch("F2-3201-ReadSize", 0x005D3375, expected2, 5, patch2, 5);

// F3: Remove 0xFFFF truncation mask
BYTE expected3[] = { 0x81, 0xE1, 0xFF, 0xFF, 0x00, 0x00 };
BYTE patch3[] = { 0x90, 0x90, 0x90, 0x90, 0x90, 0x90 };
VerifyAndPatch("F3-3201-RemoveWordMask", 0x005D33FB, expected3, 6, patch3, 6);
}

// --- Group E: B070 Hit Parser (Multi-hit) ---
{
// E1-E3: Update damage read size to 4 bytes for Cases 0, 4, 5
BYTE push4[] = { 0x6A, 0x04, 0x56 };
BYTE push2[] = { 0x6A, 0x02, 0x56 };
VerifyAndPatch("E1-B070-Case0", 0x006BD563, push2, 3, push4, 3);
VerifyAndPatch("E2-B070-Case4", 0x006BD58D, push2, 3, push4, 3);
VerifyAndPatch("E3-B070-Case5", 0x006BD602, push2, 3, push4, 3);

// E4: Case 7 inline read (4 bytes)
BYTE mov4[] = { 0xBB, 0x04, 0x00, 0x00, 0x00 };
BYTE mov2[] = { 0xBB, 0x02, 0x00, 0x00, 0x00 };
VerifyAndPatch("E4-B070-Case7", 0x006BD6BB, mov2, 5, mov4, 5);
}

// --- Hook Installation ---
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());

DetourAttach(&(PVOID&)g_pfnOriginal_GenDigits, Hooked_GenDigits);
DetourAttach(&(PVOID&)g_pfnOriginal_6AF610, Hooked_6AF610);

if (DetourTransactionCommit() != NO_ERROR) {
DetourTransactionAbort();
}
 
Oyla 0

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

Etiketler
Etiketler Etiketler
65k damage ecsro files
Geri
Üst Alt