- Katılım
- 12 May 2026
- Mesajlar
- 87
- Tepkime puanı
- 133
EVENT MULTI GİRİŞ ENGELLEME SİSTEMİ - IP LIMITER
GENEL AÇIKLAMA
Bu sistem, BDW (Border Defense War), JR (Juraid Mountain) ve CHAOS gibi eventlere multi hesapla giriş yapmayı engeller. Her oyuncu kendi IP adresinden sadece bir hesapla katılabilir. Botlar ise bu kontrol dışında kalır ve serbest girebilir.
AMAÇ
SİSTEM YAPISI
═══════════════════════════════════════════════════════════════════
ADIM 1: GameServerDlg.h - Deklarasyonlar Ekleme
Dosya: GameServer\GameServerDlg.h
Nerede Bulunur:
Line 117 civarında public: bölümünde şu kodları arayın:
NE YAPILIR:
LoadGMSettingsFromIni(); satırından sonra (Line ~122) şu kod satırlarını ekleyin:
TAM SONUÇ:
═══════════════════════════════════════════════════════════════════
ADIM 2: EventSigningSystem.cpp - AddEventUser Metodu Güncelleme
Dosya: GameServer\EventSigningSystem.cpp
Nerede Bulunur:
bool CGameServerDlg::AddEventUser(CUser* pUser) metodunu bulun (Line ~333)
NE YAPILIR:
Mevcut kod:
Aşağıdaki kod ile değiştirin (IP KONTROL LOJİĞİ EKLEME):
ÖNEMLİ NOTLAR:
═══════════════════════════════════════════════════════════════════
ADIM 3: EventSigningSystem.cpp - RemoveEventUser Metodu Güncelleme
Dosya: GameServer\EventSigningSystem.cpp
Nerede Bulunur:
void CGameServerDlg::RemoveEventUser(CUser* pUser) metodunu bulun (Line ~395)
NE YAPILIR:
Mevcut kod:
Aşağıdaki kod ile değiştirin:
═══════════════════════════════════════════════════════════════════
ADIM 4: EventMainSystem.cpp - TempleEventStart Metodu Güncelleme
Dosya: GameServer\EventMainSystem.cpp
Nerede Bulunur:
void CGameServerDlg::TempleEventStart() metodunu bulun (Line ~597)
NE YAPILIR:
Mevcut kod:
ClearRegisteredIPs(); satırını ekleyin:
═══════════════════════════════════════════════════════════════════
ADIM 5: EventMainSystem.cpp - ClearRegisteredIPs Metodu Ekleme
Dosya: GameServer\EventMainSystem.cpp
NEREDE BULUNUR:
TempleEventStart() metodunun sonundan sonra (#pragma endregion kısmından sonra) bir yer bulun. EventPartyCreate() metodundan önce.
NE YAPILIR:
Aşağıdaki kodu ekleyin:
═══════════════════════════════════════════════════════════════════
ÖNEMLI - BOTLAR İÇİN EXCEPTION HANDLING
Bu sistem otomatik olarak botları kontrol dışında tutar çünkü:
1. AddEventUser() içinde:
Bu satır bot değilse kontrol yap anlamı taşır. Botlar bu kontrolü atlar.
2. RemoveEventUser() içinde:
Botlar event'ten ayrılırken IP silinmez çünkü `isBot()` kontrolü var.
3. Sonuç:
═══════════════════════════════════════════════════════════════════
TEST ETME
1. COMPILE/BUILD:
Visual Studio'da Clean Build yap (Ctrl+Shift+B)
2. SERVER'I BAŞLAT
3. CONSOLE'U GÖZLEMLE:
BDW event'i aç, test et:
═══════════════════════════════════════════════════════════════════
HATA ÇÖZME
Sorun: Konsol mesajları çıkmıyor?
→ Rebuild et (Ctrl+Shift+B)
→ Output penceresini kontrol et
Sorun: GetRemoteIP() boş dönüyor?
→ Kod tamamdır, gelen IP adresini görmek için Player'ın gerçekten gelmediğini kontrol et
Sorun: Botlar event'e giremiyorsa?
→ Bot türünün `isBot()` true döndürdüğünü kontrol et
═══════════════════════════════════════════════════════════════════
SISTEM DAĞILIMI
═══════════════════════════════════════════════════════════════════
ÖZET
Bu sistem 4 adımda kurulur:
1. Header dosyasına 2 deklarasyon ekle
2. AddEventUser() metoduna IP kontrolü ekle (Bot exception'ı ile)
3. RemoveEventUser() metoduna IP temizleme ekle (Bot exception'ı ile)
4. EventMainSystem'e TempleEventStart() için clear işlemi ve metod tanımı ekle
Sonuç: Multi giriş engellenir, botlar serbest kalır!
═══════════════════════════════════════════════════════════════════
Döküman Tarihi: 20 Mayıs 2026
DeltaSoft GameServer - IP Limiter System v1.0
Bu sistem, BDW (Border Defense War), JR (Juraid Mountain) ve CHAOS gibi eventlere multi hesapla giriş yapmayı engeller. Her oyuncu kendi IP adresinden sadece bir hesapla katılabilir. Botlar ise bu kontrol dışında kalır ve serbest girebilir.
- Aynı IP'den birden fazla hesabın event katılımını engelle
- Botların event katılımında herhangi bir kısıtlama yapma (Bifrost event'lerinde geçerli)
- Event başladığında IP listesini temizle (sonraki event için sıfırla)
- std::set<std::string> registeredIPs → IP adreslerini depolayan veri yapısı
- ClearRegisteredIPs() → IP listesini temizleyen metod
- AddEventUser() → Oyuncu event'e katılırken IP kontrol eden metod
- RemoveEventUser() → Oyuncu event'ten ayrılırken IP'yi silen metod
═══════════════════════════════════════════════════════════════════
ADIM 1: GameServerDlg.h - Deklarasyonlar Ekleme
Line 117 civarında public: bölümünde şu kodları arayın:
Kod:
void UserCallback(StreamUser u, uint32 multipier = 1);
void TrovoLive();
void OnBossMobKilled(int mobID);
void LoadBowlRewardSettings();
void LoadZoneOnlineRewardFromIni();
void EtrafaItemVerFromIni();
void LoadGMSettingsFromIni();
LoadGMSettingsFromIni(); satırından sonra (Line ~122) şu kod satırlarını ekleyin:
Kod:
void ClearRegisteredIPs();
std::set<std::string> registeredIPs;
Kod:
void UserCallback(StreamUser u, uint32 multipier = 1);
void TrovoLive();
void OnBossMobKilled(int mobID);
void LoadBowlRewardSettings();
void LoadZoneOnlineRewardFromIni();
void EtrafaItemVerFromIni();
void LoadGMSettingsFromIni();
void ClearRegisteredIPs(); // ← YENİ EKLE
std::set<std::string> registeredIPs; // ← YENİ EKLE
bool GmisOnlineNotice;
═══════════════════════════════════════════════════════════════════
ADIM 2: EventSigningSystem.cpp - AddEventUser Metodu Güncelleme
bool CGameServerDlg::AddEventUser(CUser* pUser) metodunu bulun (Line ~333)
Mevcut kod:
Kod:
bool CGameServerDlg::AddEventUser(CUser* pUser)
{
if (pUser == nullptr || !pUser->isInGame())
return false;
if (pUser->m_EventDisandTime > UNIXTIME)
{
g_pMain->SendHelpDescription(pUser, string_format("Event katýlýmýnýz A-F-K kaldýgýnýz için 12 saat boyunca yasaklanmýþtýr."));
g_pMain->SendHelpDescription(pUser, string_format("Ceza Bitimine Kalan Sure : %d saat.", time_t(pUser->m_EventDisandTime - UNIXTIME) / 60 / 60));
return false;
}
...
}
Aşağıdaki kod ile değiştirin (IP KONTROL LOJİĞİ EKLEME):
Kod:
bool CGameServerDlg::AddEventUser(CUser* pUser)
{
if (pUser == nullptr || !pUser->isInGame())
return false;
// IP kontrol sistemi - aynı IP'den sadece bir hesap katılabilir (Botlar hariç)
std::string playerIP = pUser->GetRemoteIP();
printf("[EVENT DEBUG] Join denemesi - Oyuncu: %s, IP: %s, Kayıtlı IP'ler: %zu, isBot: %d\n", pUser->GetName(), playerIP.c_str(), registeredIPs.size(), pUser->isBot());
// IP kontrolü - SADECE PLAYER'LAR için (Botlar geçiyor)
if (!pUser->isBot())
{
if (registeredIPs.find(playerIP) != registeredIPs.end())
{
printf("[EVENT BLOCKED] Aynı IP'den iki join (Player): %s\n", playerIP.c_str());
g_pMain->SendHelpDescription(pUser, "This IP is already registered for the event!");
return false;
}
registeredIPs.insert(playerIP);
printf("[EVENT] Player IP kaydedildi: %s\n", playerIP.c_str());
}
else
{
printf("[EVENT] Bot giriş (IP kontrolü geçiliyor): %s\n", playerIP.c_str());
}
if (pUser->m_EventDisandTime > UNIXTIME)
{
g_pMain->SendHelpDescription(pUser, string_format("Event katýlýmýnýz A-F-K kaldýgýnýz için 12 saat boyunca yasaklanmýþtýr."));
g_pMain->SendHelpDescription(pUser, string_format("Ceza Bitimine Kalan Sure : %d saat.", time_t(pUser->m_EventDisandTime - UNIXTIME) / 60 / 60));
registeredIPs.erase(playerIP);
return false;
}
int hwidCount = 0;
foreach_stlmap(itr, m_TempleEventUserMap)
{
if (itr->second->reg_hwID > 0 && itr->second->reg_hwID == pUser->nHardwareID)
hwidCount++;
}
if (hwidCount >= 5)
{
g_pMain->SendHelpDescription(pUser, string_format("Event katiliminizi yalnizca [5] client'den saglayabilirsiniz."));
registeredIPs.erase(playerIP);
return false;
}
_TEMPLE_EVENT_USER* pEventUser = new _TEMPLE_EVENT_USER();
pEventUser->strUserID = pUser->GetName();
pEventUser->m_iJoinOrder = m_TempleEventLastUserOrder++;
pEventUser->reg_hwID = pUser->nHardwareID;
if (!g_pMain->m_TempleEventUserMap.PutData(pEventUser->m_iJoinOrder, pEventUser)) {
delete pEventUser;
registeredIPs.erase(playerIP);
return false;
}
pUser->m_iEventJoinOrder = pEventUser->m_iJoinOrder;
pUser->m_sJoinedEvent = g_pMain->pTempleEvent.ActiveEvent;
return true;
}
- `!pUser->isBot()` → Oyuncu bot değilse IP kontrolü yap
- `pUser->isBot()` → Bot ise kontrol geçmesine izin ver
- `registeredIPs.insert(playerIP)` → IP'yi listeye ekle
- `registeredIPs.erase(playerIP)` → Başarısız olunca IP'yi sil
═══════════════════════════════════════════════════════════════════
ADIM 3: EventSigningSystem.cpp - RemoveEventUser Metodu Güncelleme
void CGameServerDlg::RemoveEventUser(CUser* pUser) metodunu bulun (Line ~395)
Mevcut kod:
Kod:
void CGameServerDlg::RemoveEventUser(CUser* pUser)
{
if (pUser == nullptr)
return;
std::string playerIP = pUser->GetRemoteIP();
if (registeredIPs.find(playerIP) != registeredIPs.end()) {
registeredIPs.erase(playerIP);
g_pMain->SendHelpDescription(pUser, string_format("Participation in the event has been cancelled.||Your IP: %s\n", playerIP.c_str()));
}
m_TempleEventUserMap.DeleteData(pUser->m_iEventJoinOrder);
pUser->ResetTempleEventData();
}
Aşağıdaki kod ile değiştirin:
Kod:
void CGameServerDlg::RemoveEventUser(CUser* pUser)
{
if (pUser == nullptr)
return;
// IP silme işlemi sadece player'lar için (botlar gelmiyor zaten)
if (!pUser->isBot())
{
std::string playerIP = pUser->GetRemoteIP();
if (registeredIPs.find(playerIP) != registeredIPs.end()) {
registeredIPs.erase(playerIP);
printf("[EVENT] Player IP silindi: %s\n", playerIP.c_str());
g_pMain->SendHelpDescription(pUser, "Event participation cancelled.");
}
}
else
{
printf("[EVENT] Bot çıkışı: %s (IP silinmiş değil)\n", pUser->GetName());
}
m_TempleEventUserMap.DeleteData(pUser->m_iEventJoinOrder);
pUser->ResetTempleEventData();
}
═══════════════════════════════════════════════════════════════════
ADIM 4: EventMainSystem.cpp - TempleEventStart Metodu Güncelleme
void CGameServerDlg::TempleEventStart() metodunu bulun (Line ~597)
Mevcut kod:
Kod:
void CGameServerDlg::TempleEventStart()
{
int16 act = pTempleEvent.ActiveEvent;
if (act != (int16)EventOpCode::TEMPLE_EVENT_BORDER_DEFENCE_WAR
&& act != (int16)EventOpCode::TEMPLE_EVENT_CHAOS
&& act != (int16)EventOpCode::TEMPLE_EVENT_JURAD_MOUNTAIN)
return;
uint16 remtime = 0;
if (pTempleEvent.SignRemainSeconds > UNIXTIME)
remtime = uint16(pTempleEvent.SignRemainSeconds - UNIXTIME);
Packet result(WIZ_EVENT, uint8(TEMPLE_EVENT));
ClearRegisteredIPs(); satırını ekleyin:
Kod:
void CGameServerDlg::TempleEventStart()
{
int16 act = pTempleEvent.ActiveEvent;
if (act != (int16)EventOpCode::TEMPLE_EVENT_BORDER_DEFENCE_WAR
&& act != (int16)EventOpCode::TEMPLE_EVENT_CHAOS
&& act != (int16)EventOpCode::TEMPLE_EVENT_JURAD_MOUNTAIN)
return;
uint16 remtime = 0;
if (pTempleEvent.SignRemainSeconds > UNIXTIME)
remtime = uint16(pTempleEvent.SignRemainSeconds - UNIXTIME);
ClearRegisteredIPs(); // ← YENİ EKLE
Packet result(WIZ_EVENT, uint8(TEMPLE_EVENT));
═══════════════════════════════════════════════════════════════════
ADIM 5: EventMainSystem.cpp - ClearRegisteredIPs Metodu Ekleme
TempleEventStart() metodunun sonundan sonra (#pragma endregion kısmından sonra) bir yer bulun. EventPartyCreate() metodundan önce.
Aşağıdaki kodu ekleyin:
Kod:
}
#pragma endregion
#pragma region CGameServerDlg::ClearRegisteredIPs()
void CGameServerDlg::ClearRegisteredIPs()
{
registeredIPs.clear(); // IP listesini temizle
printf("Registered IP list has been cleared.\n");
}
#pragma endregion
#pragma region CUser::EventPartyCreate()
═══════════════════════════════════════════════════════════════════
Bu sistem otomatik olarak botları kontrol dışında tutar çünkü:
1. AddEventUser() içinde:
Kod:
if (!pUser->isBot())
2. RemoveEventUser() içinde:
Botlar event'ten ayrılırken IP silinmez çünkü `isBot()` kontrolü var.
3. Sonuç:
- Player'lar: Aynı IP'den sadece 1 katılabilir
- Botlar: Sınırsız katılım, IP kontrolü yok
═══════════════════════════════════════════════════════════════════
1. COMPILE/BUILD:
Visual Studio'da Clean Build yap (Ctrl+Shift+B)
2. SERVER'I BAŞLAT
3. CONSOLE'U GÖZLEMLE:
BDW event'i aç, test et:
- 1. hesapla join et → Console: [EVENT] Player IP kaydedildi: 192.168.x.x
- 2. hesapla (aynı IP) join dene → Console: [EVENT BLOCKED] Aynı IP'den iki join
- Bot ile join et → Console: [EVENT] Bot giriş (IP kontrolü geçiliyor)
- Event başlat → Console: Registered IP list has been cleared.
═══════════════════════════════════════════════════════════════════
Sorun: Konsol mesajları çıkmıyor?
→ Rebuild et (Ctrl+Shift+B)
→ Output penceresini kontrol et
Sorun: GetRemoteIP() boş dönüyor?
→ Kod tamamdır, gelen IP adresini görmek için Player'ın gerçekten gelmediğini kontrol et
Sorun: Botlar event'e giremiyorsa?
→ Bot türünün `isBot()` true döndürdüğünü kontrol et
═══════════════════════════════════════════════════════════════════
| Dosya | Satır | İşlem |
| GameServerDlg.h | 117 | Deklarasyon ekle (2 satır) |
| EventSigningSystem.cpp | 333 | AddEventUser() güncelle |
| EventSigningSystem.cpp | 395 | RemoveEventUser() güncelle |
| EventMainSystem.cpp | 608 | ClearRegisteredIPs() çağrısı ekle |
| EventMainSystem.cpp | 635 | ClearRegisteredIPs() metodunu ekle |
═══════════════════════════════════════════════════════════════════
Bu sistem 4 adımda kurulur:
1. Header dosyasına 2 deklarasyon ekle
2. AddEventUser() metoduna IP kontrolü ekle (Bot exception'ı ile)
3. RemoveEventUser() metoduna IP temizleme ekle (Bot exception'ı ile)
4. EventMainSystem'e TempleEventStart() için clear işlemi ve metod tanımı ekle
Sonuç: Multi giriş engellenir, botlar serbest kalır!
═══════════════════════════════════════════════════════════════════
Döküman Tarihi: 20 Mayıs 2026
DeltaSoft GameServer - IP Limiter System v1.0
