Şaman "Şimşek Çağırma" (SKILL_BYEURAK - 107) Hasar Vermeme Sorunu ve Çözümü

  • Konuyu açan Konuyu açan Raviel
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 1
  • Gösterim Gösterim 209

Raviel

Gold Üye
Gold Üye
MT Üye
Mesaj
285
Çözümler
6
Beğeni
348
Puan
829
Ticaret Puanı
0
Herkese selamlar,
Başımı ağrıtan ve beni rahatsız eden herhangi bir forumdada paylaşıldığını görmediğim bir sorunun çözümünü paylaşmak istiyorum. Şaman karakterin Şimşek Çağırma (vnum 107) skilli bazen hasar vermiyor, özellikle kalabalık mob gruplarında bu sorun daha sık yaşanıyordu. Skill efekti görünüyor ama hasar işlemiyordu.

Sorunun Teknik sebebi:​

Metin2 sunucusunda uzak menzilli skiller (ranged skills) iki farklı mekanizma ile tetiklenebilir:
  1. USE_SKILL paketi → Doğrudan UseSkill() fonksiyonu çağrılır
  2. SHOOT paketi → Shoot() → CFuncShoot sınıfı üzerinden işlenir
Diğer şaman uzak menzilli skilleri (SKILL_NOEJEON, SKILL_MARYUNG, SKILL_CHAIN vb.) her iki mekanizmada da düzgün çalışacak şekilde tanımlanmış. Ancak SKILL_BYEURAK (107) sadece birinci mekanizmada tanımlıydı, ikincisinde eksikti! Client bazen USE_SKILL, bazen SHOOT paketi gönderdiği için skill rastgele çalışıyor ya da çalışmıyordu.

Aşağıdaki şekilde ekleme yaparsanız sorun çözülecektir:

char_battle.cpp:
Genişlet Daralt Kopyala
// CFuncShoot struct'ı içindeki operator() fonksiyonunda switch-case bloğunu bul

case SKILL_NOEJEON:

// altına ekle

case SKILL_BYEURAK:

input_main.cpp:
Genişlet Daralt Kopyala
// CInputMain::Attack fonksiyonu içindeki switch-case bloğunu bul

case SKILL_NOEJEON:

// altına ekle

case SKILL_BYEURAK:

char_skill.cpp:
Genişlet Daralt Kopyala
// FuncSplashDamage struct'ı içindeki operator() fonksiyonunda
if (!m_bDisableCooltime && m_pInfo && !m_pInfo->HitOnce(m_pkSk->dwVnum) && m_pkSk->dwVnum != SKILL_MUYEONG)
// değiştir
if (!m_bDisableCooltime && m_pInfo && !m_pInfo->HitOnce(m_pkSk->dwVnum) && m_pkSk->dwVnum != SKILL_MUYEONG && m_pkSk->dwVnum != SKILL_BYEURAK)

// CHARACTER::ComputeSkillAtPosition fonksiyonu içinde
if (!m_bDisableCooltime && !m_SkillUseInfo[dwVnum].HitOnce(dwVnum) && dwVnum != SKILL_MUYEONG)
// değiştir
if (!m_bDisableCooltime && !m_SkillUseInfo[dwVnum].HitOnce(dwVnum) && dwVnum != SKILL_MUYEONG && dwVnum != SKILL_BYEURAK)


// CHARACTER::ComputeSkill fonksiyonu içinde
if (!m_bDisableCooltime && !m_SkillUseInfo[dwVnum].HitOnce(dwVnum) && dwVnum != SKILL_MUYEONG)
// değiştir
if (!m_bDisableCooltime && !m_SkillUseInfo[dwVnum].HitOnce(dwVnum) && dwVnum != SKILL_MUYEONG && dwVnum != SKILL_BYEURAK)

Bu sorun muhtemelen orijinal kaynak kodunda bir unutma/eksiklik sonucu oluşmuş. Diğer şaman skilleri (SKILL_NOEJEON = 106, SKILL_CHAIN = 108) düzgün tanımlanmışken, aradaki SKILL_BYEURAK = 107 atlanmış.
 
Konuya bir ekleme yapalım hemen unutmadan. Çift hasar vermemesi için skillin mutlaka şunuda kaldırın:


char_skill.cpp:
Genişlet Daralt Kopyala
// arat:
bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaster)

// içinde arat:
else if (!IS_SET(pkSk->dwFlag, SKILL_FLAG_ATTACK))

// satırı sil:
    else if (dwVnum == SKILL_BYEURAK)
        ComputeSkill(dwVnum, pkVictim);


Böylece hem artık şaman şimşek çağırma skilli tam olarak düştüğü zaman hasar vericek hemde toplu gruplara vururkende AEO damage olarak işleyecektir.
 
Geri
Üst