VENT MULTI GİRİŞ ENGELLEME SİSTEMİ - IP LIMITER

VENT MULTI GİRİŞ ENGELLEME SİSTEMİ - IP LIMITER

Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!

DeltaSoft

Yönetici
MAREŞAL
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Ç
  • 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)

⚙️ SİSTEM YAPISI
  • 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

📁 Dosya: GameServer\GameServerDlg.h

🔍 Nerede Bulunur:
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();

✏️ NE YAPILIR:
LoadGMSettingsFromIni(); satırından sonra (Line ~122) şu kod satırlarını ekleyin:

Kod:
void ClearRegisteredIPs();
std::set<std::string> registeredIPs;

📝 TAM SONUÇ:
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

📁 Dosya: GameServer\EventSigningSystem.cpp

🔍 Nerede Bulunur:
bool CGameServerDlg::AddEventUser(CUser* pUser) metodunu bulun (Line ~333)

✏️ NE YAPILIR:
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;
}

📌 ÖNEMLİ NOTLAR:
  • `!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

📁 Dosya: GameServer\EventSigningSystem.cpp

🔍 Nerede Bulunur:
void CGameServerDlg::RemoveEventUser(CUser* pUser) metodunu bulun (Line ~395)

✏️ NE YAPILIR:
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

📁 Dosya: GameServer\EventMainSystem.cpp

🔍 Nerede Bulunur:
void CGameServerDlg::TempleEventStart() metodunu bulun (Line ~597)

✏️ NE YAPILIR:
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

📁 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:

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()

═══════════════════════════════════════════════════════════════════

⚠️ ÖNEMLI - BOTLAR İÇİN EXCEPTION HANDLING

Bu sistem otomatik olarak botları kontrol dışında tutar çünkü:

1. AddEventUser() içinde:
Kod:
if (!pUser->isBot())
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ç:
  • Player'lar: Aynı IP'den sadece 1 katılabilir
  • Botlar: Sınırsız katılım, IP kontrolü yok

═══════════════════════════════════════════════════════════════════

✅ 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:

  • 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.

═══════════════════════════════════════════════════════════════════

🔧 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

DosyaSatırİşlem
GameServerDlg.h117Deklarasyon ekle (2 satır)
EventSigningSystem.cpp333AddEventUser() güncelle
EventSigningSystem.cpp395RemoveEventUser() güncelle
EventMainSystem.cpp608ClearRegisteredIPs() çağrısı ekle
EventMainSystem.cpp635ClearRegisteredIPs() metodunu ekle

═══════════════════════════════════════════════════════════════════

💡 Ö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
 

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

Geri
Üst
×