- Katılım
- 12 May 2026
- Mesajlar
- 80
- Tepkime puanı
- 80
Knight Online GameServer | C++ | Anti-Spam Skill Sistemi
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Toplam 4 dosya değişecek:
| Dosya | Konum | Ne Yapılıyor? |
|---|---|---|
| User.cpp | GameServer/ | Cooldown kontrol fonksiyonu güncellenir |
| MagicProcess.cpp | GameServer/ | Skill paketi bloklanır |
| MagicInstance.cpp | GameServer/ | ArrowUseTime hesabından muaf tutulur |
| AntiBotSystem.cpp | GameServer/ | Bot sisteminden muaf tutulur |
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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;
}
// ─────────────────────────────────────────────────────────────────────
Örneğin 1500 = 1.5 saniye, 3000 = 3 saniye.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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
}
// ────────────────────────────────────────────────────────────────────────
Artık false döndüğünde skill tamamen bloklanıyor.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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;
}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Tüm değişiklikleri yaptıktan sonra:
- Visual Studio'da Build → Rebuild Solution yap
- Sunucuyu başlat
- Archer karakteriyle 108570 skill'ini peş peşe kullan
- 2 saniye dolmadan ikinci kullanımın bloklandığını göreceksin
static const uint32 ARCHER_SEQUENTIAL_COOLDOWN_MS = 2000;
2000 = 2 saniye | 1500 = 1.5 saniye | 3000 = 3 saniye
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Oyuncu skill paketini gönderir → MagicProcess.cpp yakalar
2. CheckSkillCooldown() fonksiyonu çağrılır
3. Skill ID 108560/208560/108570/208570'den biri mi? → Özel kontrol
4. Son kullanımdan bu yana 2 saniye geçmedi → return false → paket iptal
5. 2 saniye geçti → return true → skill normal işlenir
6. Zaman kaydedilir → sonraki kontrol için hazır
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
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
Herhangi bir sorun yaşarsan konu altına yorum bırakabilirsin.
DeltaSoft Development Team