- #1
Konu Sahibi
: serkankacan
[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
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 == 42değ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
+1olduğunda24yerine00:00olmasından kaynaklanan zindanda kalma (bitmeme) bugu% 24modülüsü ile giderildi.
Nasıl Uygulanır?
- GameServer projenizi Visual Studio ile açın.
- CTRL + F yaparak
void CGameServerDlg::TempleEventTimer()fonksiyonunu aratın. - 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
- Saat Dizisi (
m_nBorderDefenseWarTime): Sunucu ayarlarınızda (GameServer.iniveyaTEMPLE_EVENTtablosunda) BDW saatlerinin tanımlı olduğundan ve sayacın (BORDER_DEFENSE_WAR_EVENT_COUNT) 0'dan büyük olduğundan emin olun. - Zone Bilgisi:
ZONE_BORDER_DEFENSE_WARsabitinin sunucunuzdaki BDW bölge numarası (standart olarak `ZONE_BORDER_DEFENSE_WAR = 84` veya `87`) ile eşleştiğini doğrulayın. - 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!

