İçeriğe geç
Türkiye'nin SRO tanıtım & topluluk platformu

Knight Online Mob/NPC'ye Ölünce Exp Gitmesini Kapatma

Cevaplar0
Görüntüleme10
Ticaret Puanı
0
Katılım
8 Eyl 2026
Mesajlar
88
Tepkime puanı
1
Puanları
0
Mevcut Bakiye
2960 ₺
[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



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 tek nExpLost = 0 yapmak yerine, tecrübe puanı düşüşünü tetikleyen ExpChange(-nExpLost); fonksiyon çağrısını ve hesaplama bloğunu devre dışı bırakmak sunucu performansını korur ve istemciye boş yere WIZ_EXP_CHANGE paketi yollanmasını engeller.



Nasıl Uygulanır?

  1. GameServer kaynak kodunuzu (Source) Visual Studio ile açın.
  2. User.cpp dosyasını açarak CTRL + F yardı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:
  1. User.cpp dosyasını kaydedin.
  2. GameServer projenizi Release modunda yeniden derleyin (Rebuild Solution).
  3. 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!
 

Konuyu görüntüleyenler

Yükleniyor...
Yükleniyor...
Şu anda sitemizde 40,424 Aktif Kullanıcı
Çevrimiçi üyeler
Konular 1,311
Mesajlar 4,191
Kullanıcılar 1,624
Son üye mrt
Geri
Üst