- #1
Konu Sahibi
: serkankacan
[C++ REHBER] Knight Online Mob/NPC'ye Ölünce Exp Gitmesini Kapatma (No Exp Loss)
User.cpp Üzerinden Karakter Öldüğünde Tecrübe Puanı Kaybını Devre Dışı Bırakma
User.cpp Üzerinden Karakter Öldüğünde Tecrübe Puanı Kaybını Devre Dışı Bırakma
Merhaba değerli forum sakinleri,
Özellikle PK, Kolay (Easy) Farm veya PvP konseptli sunucularda oyuncuların yaratıklara (Mob), kulelere (Guard Tower) veya muhafızlara (Patrol Guard) öldüklerinde **Exp kaybetmesi (Exp düşmesi)** istenmeyen bir durumdur.
Aşağıda; satır satır kod silmekle uğraşmadan, sunucuya gereksiz paket trafiği yüklemeden yaratıklara ölündüğünde Exp kaybını tamamen engelleyen optimize yöntemi bulabilirsiniz.
Teknik Bilgilendirme' Alıntı:Tüm satırları tek teknExpLost = 0yapmak yerine, tecrübe puanı düşüşünü tetikleyenExpChange(-nExpLost);fonksiyon çağrısını ve hesaplama bloğunu devre dışı bırakmak sunucu performansını korur ve istemciye boş yereWIZ_EXP_CHANGEpaketi yollanmasını engeller.
Nasıl Uygulanır?
- GameServer kaynak kodunuzu (Source) Visual Studio ile açın.
- User.cpp dosyasını açarak
CTRL + Fyardımıyla şu bloğu aratın:
C++:
if (pKiller->isNPC())
Mevcut (Orijinal) Kod Bloğu
C++:
if (pKiller->isNPC())
{
int64 nExpLost = 0;
CNpc *pNpc = TO_NPC(pKiller);
if (pNpc->GetType() == NPC_PATROL_GUARD || (GetZoneID() != GetNation() && GetZoneID() <= ELMORAD))
nExpLost = m_iMaxExp / 100;
else
nExpLost = m_iMaxExp / 20;
if ((pNpc->GetType() == NPC_GUARD_TOWER1 || pNpc->GetType() == NPC_GUARD_TOWER2) && isInPKZone())
noticeType = DeathNotice;
if (m_bPremiumType != 0)
nExpLost = nExpLost * (GetPremiumProperty(PremiumExpRestorePercent)) / 100;
ExpChange(-nExpLost);
}
Düzeltilmiş ve Optimize Edilmiş Kod Bloğu (Önerilen)
Ölünce Exp düşüşünü tamamen kapatmak için bloğu aşağıdaki gibi sadeleştirmeniz yeterlidir (Kule bildirimleri korunur, gereksiz Exp paketi gönderilmez):
C++:
if (pKiller->isNPC())
{
CNpc *pNpc = TO_NPC(pKiller);
// Kule ölümlerinde PK bölgesindeki ölüm bildirimini (Notice) koruyoruz
if ((pNpc->GetType() == NPC_GUARD_TOWER1 || pNpc->GetType() == NPC_GUARD_TOWER2) && isInPKZone())
noticeType = DeathNotice;
// ===============================================================
// NO EXP LOSS: Ölünce Exp gitmesi tamamen kapatılmıştır.
// ===============================================================
/*
int64 nExpLost = 0;
if (pNpc->GetType() == NPC_PATROL_GUARD || (GetZoneID() != GetNation() && GetZoneID() <= ELMORAD))
nExpLost = m_iMaxExp / 100;
else
nExpLost = m_iMaxExp / 20;
if (m_bPremiumType != 0)
nExpLost = nExpLost * (GetPremiumProperty(PremiumExpRestorePercent)) / 100;
ExpChange(-nExpLost);
*/
}
Alternatif: Sadece Belirli Haritalarda (Örn: Moradon/CZ) Kapatmak İsterseniz
Eğer eslantta exp gitsin ama Ronark Land (CZ) veya etkinlik haritalarında gitmesin isterseniz koşul ekleyebilirsiniz:
C++:
// Sadece Ronark Land haritasında Exp gitmesini engellemek için:
if (!isInPKZone())
{
ExpChange(-nExpLost);
}
Derleme ve Test:
- User.cpp dosyasını kaydedin.
- GameServer projenizi Release modunda yeniden derleyin (Rebuild Solution).
- Yeni `GameServer.exe` ile oyunu açıp bir canavara ölerek karakterinizin Exp kaybetmediğini doğrulayın.
Sorularınızı ve takıldığınız yerleri konu altından iletebilirsiniz. Herkese iyi forumlar ve keyifli geliştirmeler!

