Okçuların Skill Coldown Ekleme Seri Skill atmasını Engelleme

DeltaSoft

Yönetici
MAREŞAL
Katılım
12 May 2026
Mesajlar
80
Tepkime puanı
80
ARCHER SEQUENTIAL COOLDOWN SİSTEMİ
Knight Online GameServer | C++ | Anti-Spam Skill Sistemi

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

KONU NEDİR?

Knight Online GameServer'da Archer'ların 108560, 208560, 108570, 208570 numaralı skill'lerini
peş peşe spam yaparak hedef karşı tarafa ulaşmadan 10 tane skill yutturmasını engelleyen bir sunucu taraflı cooldown sistemidir.

Bu sistem tamamen sunucu tarafında çalışır. Client side herhangi bir değişiklik gerekmez.
Oyuncu aynı skill'i kullandıktan sonra 2 saniye geçmeden tekrar kullanamaz.


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

HANGİ DOSYALAR DEĞİŞECEK?

Toplam 4 dosya değişecek:

DosyaKonumNe Yapılıyor?
User.cppGameServer/Cooldown kontrol fonksiyonu güncellenir
MagicProcess.cppGameServer/Skill paketi bloklanır
MagicInstance.cppGameServer/ArrowUseTime hesabından muaf tutulur
AntiBotSystem.cppGameServer/Bot sisteminden muaf tutulur

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ADIM 1 — User.cpp

Dosya yolunu aç: GameServer/User.cpp

Aşağıdaki fonksiyonu içinde bul:

C++:
bool CUser::CheckSkillCooldown(uint32 nSkillID)

Bu fonksiyon içinde şu kısımları bulacaksın:

C++:
bool isTripleArrow = (nSkillID == 107515 || nSkillID == 108515 || nSkillID == 207515 || nSkillID == 208515);
bool isQuintupleArrow = (nSkillID == 107555 || nSkillID == 108555 || nSkillID == 207555 || nSkillID == 208555);

if (isTripleArrow || isQuintupleArrow)

Bu if satırından HEMEN ÖNCE şu bloğu ekle:

C++:
    // ── 108560 / 208560 / 108570 / 208570 — Pese pese kullanim engeli ──
    // Bu skill'ler arka arkaya gönderildiginde hedef, karsi tarafa ulasmadan
    // birden fazla skill yutabilir. Her kullanim arasinda en az 2 saniye bekleme zorunludur.
    static const uint32 ARCHER_SEQUENTIAL_COOLDOWN_MS = 2000; // 2 saniye (ms)

    bool isSequentialArrow = (nSkillID == 108560 || nSkillID == 208560
                           || nSkillID == 108570 || nSkillID == 208570);

    if (isSequentialArrow)
    {
        uint32 currentTime = UNIXTIME2;
        uint32 lastUsage   = m_lastSkillUsage[nSkillID];

        if (lastUsage > 0 && (currentTime - lastUsage) < ARCHER_SEQUENTIAL_COOLDOWN_MS)
        {
            // Cooldown dolmadi — skill paketini engelle
            return false;
        }

        // Cooldown dolmus ya da ilk kullanim — izin ver, zamani guncelle
        m_lastSkillUsage[nSkillID] = currentTime;
        return true;
    }
    // ─────────────────────────────────────────────────────────────────────

Not: ARCHER_SEQUENTIAL_COOLDOWN_MS değerini değiştirerek cooldown süresini ayarlayabilirsin.
Örneğin 1500 = 1.5 saniye, 3000 = 3 saniye.


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ADIM 2 — MagicProcess.cpp

Dosya yolunu aç: GameServer/MagicProcess.cpp

Bu satırı bul:

C++:
    if (pCaster->isPlayer())
    {
        CUser* pUser = TO_USER(pCaster);
        pUser->CheckSkillFlood();
        pUser->CheckSkillCooldown(instance.nSkillID);  // ← bu satır
    }

Yukarıdaki bloğun tamamını aşağıdaki ile değiştir:

C++:
    // ── Skill Cooldown + Flood Kontrol ─────────────────────────────────────
    // CheckSkillCooldown false donerse skill paketi tamamen iptal edilir.
    // 108560 / 208560 / 108570 / 208570 icin 2 saniyelik sunucu tarafli cooldown uygulanir.
    if (pCaster->isPlayer())
    {
        CUser* pUser = TO_USER(pCaster);
        pUser->CheckSkillFlood();

        if (!pUser->CheckSkillCooldown(instance.nSkillID))
            return; // Cooldown aktif — paket iptal
    }
    // ────────────────────────────────────────────────────────────────────────

Dikkat: Eski kodda return yoktu, sadece fonksiyon çağrılıyordu.
Artık false döndüğünde skill tamamen bloklanıyor.


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ADIM 3 — MagicInstance.cpp

Dosya yolunu aç: GameServer/MagicInstance.cpp

Bu satırları bul:

C++:
            bool isMultiArrow = isArcher3liOK() || isArcher5liOK();
            if (isMultiArrow || pUser->isRogue())
            {
                useTime = UNIXTIME2;
            }

Yukarıdaki bloğu aşağıdaki ile değiştir:

C++:
            // 108560/208560/108570/208570 icin MagicProcess'te zaten cooldown uygulanıyor.
            // Bu blokta ek gecikme eklememek için isSeqArrow kontrolü eklendi.
            bool isMultiArrow = isArcher3liOK() || isArcher5liOK();
            bool isSeqArrow   = (nSkillID == 108560 || nSkillID == 208560
                              || nSkillID == 108570 || nSkillID == 208570);

            if (isMultiArrow || isSeqArrow || pUser->isRogue())
            {
                useTime = UNIXTIME2; // Ek gecikme yok
            }

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ADIM 4 — AntiBotSystem.cpp

Dosya yolunu aç: GameServer/AntiBotSystem.cpp

Bu satırları bul:

C++:
    bool isTripleArrow    = (nSkillID == 107515 || nSkillID == 108515 || nSkillID == 207515 || nSkillID == 208515);
    bool isQuintupleArrow = (nSkillID == 107555 || nSkillID == 108555 || nSkillID == 207555 || nSkillID == 208555);
    
    if (isTripleArrow || isQuintupleArrow)
    {
        m_dwLastSkillTime = dwNow;
        m_nLastSkillID = nSkillID;
        return true;
    }

Yukarıdaki bloğu aşağıdaki ile değiştir:

C++:
    bool isTripleArrow    = (nSkillID == 107515 || nSkillID == 108515 || nSkillID == 207515 || nSkillID == 208515);
    bool isQuintupleArrow = (nSkillID == 107555 || nSkillID == 108555 || nSkillID == 207555 || nSkillID == 208555);
    // Sunucu tarafli cooldown uygulanan skill'ler — bot sistemi mudahale etmemeli
    bool isSequentialArrow = (nSkillID == 108560 || nSkillID == 208560
                           || nSkillID == 108570 || nSkillID == 208570);
    
    if (isTripleArrow || isQuintupleArrow || isSequentialArrow)
    {
        m_dwLastSkillTime = dwNow;
        m_nLastSkillID    = nSkillID;
        return true;
    }

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

DERLEME VE TEST

Tüm değişiklikleri yaptıktan sonra:

  1. Visual Studio'da Build → Rebuild Solution yap
  2. Sunucuyu başlat
  3. Archer karakteriyle 108570 skill'ini peş peşe kullan
  4. 2 saniye dolmadan ikinci kullanımın bloklandığını göreceksin

Cooldown süresini değiştirmek için User.cpp'deki şu satırı düzenle:
static const uint32 ARCHER_SEQUENTIAL_COOLDOWN_MS = 2000;
2000 = 2 saniye | 1500 = 1.5 saniye | 3000 = 3 saniye


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

SİSTEM NASIL ÇALIŞIYOR?


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

SIKÇA SORULAN SORULAR

S: Bu sistem tüm skill'leri etkiler mi?
H: Hayır. Sadece 108560, 208560, 108570, 208570 ID'li skill'leri etkiler.

S: Client tarafında değişiklik gerekiyor mu?
H: Hayır. Tamamen sunucu tarafındadır.

S: 3'lü ve 5'li oklar etkileniyor mu?
H: Hayır. 107515/207515 ve 107555/207555 serileri bu sistemden muaftır.

S: Cooldown süresini nasıl değiştiririm?
H: User.cpp'deki ARCHER_SEQUENTIAL_COOLDOWN_MS sabitini değiştir, derlemeyi tekrar yap.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Herhangi bir sorun yaşarsan konu altına yorum bırakabilirsin.
DeltaSoft Development Team
 

Konuyu Görüntüleyen Kullanıcılar (Toplam:0)