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

Knight Online v1960 Border Defense War (BDW) Aktif Etme

Cevaplar0
Görüntüleme9
Ticaret Puanı
0
Katılım
8 Eyl 2026
Mesajlar
88
Tepkime puanı
1
Puanları
0
Mevcut Bakiye
2960 ₺
[C++ REHBER] Knight Online v1960 Border Defense War (BDW) Aktif Etme
TempleEventTimer Zamanlayıcısı Üzerinden BDW Kayıt, Giriş ve Bitiş Süreçlerini Senkronize Etme



Merhaba değerli forum sakinleri,

Knight Online v1960 ve v19xx–v20xx tabanlı GameServer kaynak kodlarında çoğunlukla Chaos Dungeon varsayılan olarak aktifken, Border Defense War (BDW) zamanlayıcıdan devre dışı bırakılmış veya hatalı zamanlama yüzünden kilitleniyor olabilir.

Aşağıda; saat başı kayıt açılması (10 dk geri sayım), oyuncuların odalara ışınlanması ve süresi bittiğinde etkinliğin düzgünce sonlandırılmasını sağlayan (gece yarısı saat devretme hataları giderilmiş) optimize edilmiş **TempleEventTimer** fonksiyonunu bulabilirsiniz.

Teknik Uyarı (Zamanlama Düzeltmesi)' Alıntı:
DİKKAT:
  • Orijinal paylaşımlarda yer alan nMinute == 42 değeri, kayıt süresi 10 dakika (600 sn) bittikten sonra oyuncuların 32 dakika boyunca boşta beklemesine sebep oluyordu. Bu süre 10. dakikaya çekildi.
  • Gece 23:00 etkinliklerinde saat +1 olduğunda 24 yerine 00:00 olmasından kaynaklanan zindanda kalma (bitmeme) bugu % 24 modülüsü ile giderildi.



Nasıl Uygulanır?

  1. GameServer projenizi Visual Studio ile açın.
  2. CTRL + F yaparak void CGameServerDlg::TempleEventTimer() fonksiyonunu aratın.
  3. Mevcut fonksiyonu tamamen silip yerine aşağıdaki hatasız kodu yapıştırın.



Optimize Edilmiş C++ Kaynak Kodu

C++:
void CGameServerDlg::TempleEventTimer()
{
    uint32 nHour = g_localTime.tm_hour;
    uint32 nMinute = g_localTime.tm_min;

    if (m_nTempleEventRemainSeconds > 0)
        m_nTempleEventRemainSeconds--;

    // ===================================================================
    // 1. ADIM: ETKİNLİK BAŞLATMA VE GERİ SAYIM (KAYIT AŞAMASI)
    // ===================================================================
    if (pTempleEvent.ActiveEvent == -1)
    {
        // CHAOS DUNGEON KONTROLÜ
        for (int i = 0; i < CHAOS_EVENT_COUNT; i++)
        {
            if (nHour == m_nChaosTime[i] && nMinute == 0)
            {
                pTempleEvent.ActiveEvent = TEMPLE_EVENT_CHAOS;
                pTempleEvent.ZoneID = ZONE_CHAOS_DUNGEON;
                m_nTempleEventRemainSeconds = 600; // 10 Dakika Giriş Sayacı
                TempleEventStart();
                return;
            }
        }

        // BORDER DEFENSE WAR (BDW) KONTROLÜ
        for (int i = 0; i < BORDER_DEFENSE_WAR_EVENT_COUNT; i++)
        {
            if (nHour == m_nBorderDefenseWarTime[i] && nMinute == 0)
            {
                pTempleEvent.ActiveEvent = TEMPLE_EVENT_BORDER_DEFENCE_WAR;
                pTempleEvent.ZoneID = ZONE_BORDER_DEFENSE_WAR;
                m_nTempleEventRemainSeconds = 600; // 10 Dakika Giriş Sayacı
                TempleEventStart();
                return;
            }
        }
    }
    // ===================================================================
    // 2. ADIM: AKTİF ETKİNLİK SÜREÇLERİ (IŞINLANMA, SAVAŞ VE BİTİŞ)
    // ===================================================================
    else if (pTempleEvent.ActiveEvent != -1)
    {
        // ---------------------------------------------------------------
        // CHAOS SÜRECİ
        // ---------------------------------------------------------------
        if (pTempleEvent.ActiveEvent == TEMPLE_EVENT_CHAOS)
        {
            for (int i = 0; i < CHAOS_EVENT_COUNT; i++)
            {
                // Dakika 10: Kullanıcıları içeri çek
                if (nHour == m_nChaosTime[i] && nMinute == 10 && !pTempleEvent.isActive)
                {
                    m_nTempleEventRemainSeconds = 0;
                    pTempleEvent.LastEventRoom = 1;
                    pTempleEvent.isActive = true;
                    TempleEventStart();
                    TempleEventTeleportUsers();
                    TempleEventSummonChaosCubes();
                    break;
                }
                // Dakika 11: Saldırıları serbest bırak (Hazırlık süresi sonu)
                else if (nHour == m_nChaosTime[i] && nMinute == 11 && !pTempleEvent.isAttackable)
                {
                    pTempleEvent.isAttackable = true;
                    break;
                }
                // Dakika 30: Etkinliği bitir (20 Dakikalık Savaş)
                else if (nHour == m_nChaosTime[i] && nMinute == 30 && pTempleEvent.isActive)
                {
                    TempleEventFinish();
                    break;
                }
            }
        }
        // ---------------------------------------------------------------
        // BORDER DEFENSE WAR (BDW) SÜRECİ
        // ---------------------------------------------------------------
        else if (pTempleEvent.ActiveEvent == TEMPLE_EVENT_BORDER_DEFENCE_WAR)
        {
            for (int i = 0; i < BORDER_DEFENSE_WAR_EVENT_COUNT; i++)
            {
                // Dakika 10: 10 dakikalık kayıt biter, odalar açılır ve oyuncular çekilir
                if (nHour == m_nBorderDefenseWarTime[i] && nMinute == 10 && !pTempleEvent.isActive)
                {
                    m_nTempleEventRemainSeconds = 0;
                    pTempleEvent.LastEventRoom = 1;
                    pTempleEvent.isActive = true;
                    TempleEventStart();
                    TempleEventTeleportUsers();
                    break;
                }
                // Dakika 11: Kapılar açılır / Ataklar serbest bırakılır
                else if (nHour == m_nBorderDefenseWarTime[i] && nMinute == 11 && !pTempleEvent.isAttackable)
                {
                    pTempleEvent.isAttackable = true;
                    break;
                }
                // Bitiş: Etkinlik başlangıcından 30 dakika sonra (Gece yarısı taşması önlenmiş kontrol)
                else if (nHour == ((m_nBorderDefenseWarTime[i] + (m_nBorderDefenseWarTime[i] == 23 ? 1 : 0)) % 24)
                         && nMinute == 40
                         && pTempleEvent.isActive)
                {
                    TempleEventFinish();
                    break;
                }
            }
        }
    }
}



Kontrol Edilmesi Gereken Diğer Noktalar

  1. Saat Dizisi (m_nBorderDefenseWarTime): Sunucu ayarlarınızda (GameServer.ini veya TEMPLE_EVENT tablosunda) BDW saatlerinin tanımlı olduğundan ve sayacın (BORDER_DEFENSE_WAR_EVENT_COUNT) 0'dan büyük olduğundan emin olun.
  2. Zone Bilgisi: ZONE_BORDER_DEFENSE_WAR sabitinin sunucunuzdaki BDW bölge numarası (standart olarak `ZONE_BORDER_DEFENSE_WAR = 84` veya `87`) ile eşleştiğini doğrulayın.
  3. Derleme: Değişiklikleri kaydedip GameServer projenizi Release modunda derleyin.

Sorularınızı ve takıldığınız yerleri bu konu altından paylaşabilirsiniz. Herkese keyifli savaşlar ve iyi forumlar!
 

Konuyu görüntüleyenler

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