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

Knight Online Oturunca Exp Kazanma (Exp Seal & Sitting Exp Sistemi)

Cevaplar0
Görüntüleme6
Ticaret Puanı
0
Katılım
8 Eyl 2026
Mesajlar
88
Tepkime puanı
1
Puanları
0
Mevcut Bakiye
2960 ₺
[C++ REHBER] Knight Online Oturunca Exp Kazanma (Exp Seal & Sitting Exp Sistemi)
v19xx / v20xx GameServer Üzerinden Oturma Durumunu Algılama ve Otomatik Exp Verme



Merhaba değerli forum sakinleri,

Knight Online v19xx ve üzeri sürümlerde USKO stilinde oyuncular oturduğunda (C tuşu / Sit State) istemcide Exp Seal barının devreye girmesi ve karakterin oturduğu süre boyunca belirli aralıklarla (Timer döngüsünde) Exp kazanabilmesi için gerekli GameServer C++ kodlarını paylaşıyoruz.

Teknik Bilgilendirme' Alıntı:
İstemci tarafında oturan oyuncunun Exp Seal animasyonunu görmesi için WIZ_EXP_SEAL paketi tetiklenir. Ancak oyuncunun gerçek anlamda Exp kazanabilmesi için istemci paketinin yanı sıra GameServer'ın kullanıcı güncelleme döngüsünde (CUser::Update()) oyuncunun oturma durumunun (isSitting()) kontrol edilmesi ve ExpChange() metodunun çağrılması gerekmektedir.



1. ADIM: GameDefine.h Tanımlamaları

GameServer / GameDefine.h
dosyanızı açın ve enum tanımlamalarının bulunduğu uygun bir bölüme aşağıdaki kodları ekleyin:

C++:
// Exp Seal / Sitting Exp Durum Kodları
enum ExpSealOpcode
{
    EXP_SEAL_ON  = 1,
    EXP_SEAL_OFF = 2
};



2. ADIM: User.h Fonksiyon Prototipleri

GameServer / User.h
dosyanızı açın ve `public:` veya uygun gördüğünüz fonksiyon bloklarının altına ekleyin:

C++:
    // Exp Seal & Oturma Kontrol Fonksiyonları
    void ExpSealSystem(Packet & pkt);
    void ExpSealOn(Packet & pkt);



3. ADIM: User.cpp Paket Yönlendirmesi (HandlePacket)

GameServer / User.cpp
dosyanızı açarak CUser::HandlePacket(Packet & pkt) fonksiyonundaki `switch (pkt.GetOpcode())` bloğunun en altına ekleyin:

C++:
        case WIZ_EXP_SEAL:
            ExpSealSystem(pkt);
            break;



4. ADIM: User.cpp Fonksiyon Gövdeleri

GameServer / User.cpp
dosyasının en altına aşağıdaki optimize edilmiş fonksiyon bloklarını ekleyin:

C++:
void CUser::ExpSealSystem(Packet & pkt)
{
    uint8 opcode;
    pkt >> opcode;

    switch (opcode)
    {
        case EXP_SEAL_ON:
            ExpSealOn(pkt);
            break;

        case EXP_SEAL_OFF:
            // İsteğe bağlı: Oyuncu kalktığında seal durumunu kapatma
            break;

        default:
            printf("[ExpSeal] Bilinmeyen alt opcode alindi: 0x%02X\n", opcode);
            break;
    }
}

void CUser::ExpSealOn(Packet & pkt)
{
    // İstemciye Exp Seal durumunun aktif olduğunu bildirir
    Packet result(WIZ_EXP_SEAL, uint8(EXP_SEAL_ON));
    result << uint8(1) << uint8(0) << uint8(3);
    Send(&result);
}



5. ADIM (ÖNEMLİ): Periyodik Olarak Exp Verme Mantığı

Karakter oturduğunda sadece paket göndermek istemcide göstergeyi açar; karakterin oturdukça gerçekten Exp alması için User.cpp içerisindeki periyodik döngüye (CUser::Update()) oturma kontrolü eklenmelidir:

C++:
// CUser::Update() veya saniyelik/dakikalık kontrol bloğuna eklenebilir:
if (isSitting() && !isDead())
{
    // Örnek: Oturan karaktere her periyotta 500 Exp ver (Miktarı değiştirebilirsiniz)
    ExpChange(500);
}



Derleme ve Test Adımları

  1. Değişiklikleri kaydettikten sonra Visual Studio üzerinden GameServer projesini Rebuild edin.
  2. GameServer'ı çalıştırıp oyuna girin.
  3. Karakterinizle "C" tuşuna basarak oturun; arayüzde Exp Seal barının aktifleştiğini ve Exp değerinizin arttığını doğrulayın.

Sorularınızı ve eklemek istediğiniz bölge/premium bazlı exp çarpanı mantıklarını konu altından belirtebilirsiniz. Herkese iyi forumlar!
 

Konuyu görüntüleyenler

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