- #1
Konu Sahibi
: serkankacan
[C++ REHBER] Knight Online Oturunca Exp Kazanma (Exp Seal & Sitting Exp Sistemi)
v19xx / v20xx GameServer Üzerinden Oturma Durumunu Algılama ve Otomatik Exp Verme
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çinWIZ_EXP_SEALpaketi 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 veExpChange()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ı
- Değişiklikleri kaydettikten sonra Visual Studio üzerinden GameServer projesini Rebuild edin.
- GameServer'ı çalıştırıp oyuna girin.
- 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!

