Hikayeler

Reklam vermek için turkmmo@gmail.com

C++ dan anlayan dostlar bakabilirmi

MAyestrOO

Level 2
Üye
Katılım
16 May 2025
Konular
15
Mesajlar
58
Online süresi
3g 65547s
Reaksiyon Skoru
24
Altın Konu
0
Başarım Puanı
28
TM Yaşı
11 Ay 8 Gün
MmoLira
1,032
DevLira
15

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!

simdi söyle birşey deniyorum yapay zekadan yardım alarak karakterle pazar kurup /clientless yaptıgımda karakterin offline geçmesi lazım suanda geçiyor ama tekrar giriş yapamıyorum kod satırıma bakarmısınız neler eksik bitane silkroadda sunucuda vardı aynı sistemi umarım buraya entegree edeceğim :) simdiden ty dostlar


Offline system yazmaya çalısıyorumm XD:
// cmd.cpp dosyasında, do_clientless fonksiyonunun tamamı
ACMD(do_clientless)
{
    // Kontrol: Sadece oyuncunun standart pazar dükkanı varsa clientless moduna geçsin.
    // Kaynağınızdaki hata veren GetOfflineShop() kontrolü kaldırıldı.
    if (!ch->GetShop())
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Bu komutu kullanmak için aktif bir dükkanınız olmalıdır."));
        return;
    }
    
    // Yere atılmış eşya kontrolü kaldırıldı (GetGroundItem hatasını gidermek için).
    // Güvenlik için, bu kontrolü yapan bir fonksiyonunuz varsa eklemeniz önerilir.

    // Karakterin clientless moduna geçişini işaretle (char.h'a eklediğiniz fonksiyon)
    ch->SetOfflineMode(true);
    
    // Oyuncuya bilgi mesajı gönder
    ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Oyun bağlantınız kesiliyor. Karakteriniz oyunda kalacaktır."));

    // Bağlantıyı kesme işlemi (DESC::Destroy()'u tetiklemesi için)
    LPDESC d = ch->GetDesc();
    if (d)
    {
        // 1. Karakteri kaydet
        ch->Save();
        
        // 2. Bağlantıyı kapatma fazına geçir.
        // Bu, DESC::Destroy() fonksiyonunu tetikleyecek ve karakteri silme işi orada yönetilecek.
        // 'Close()' hatasını gidermek için SetPhase kullanıldı.
        d->SetPhase(PHASE_CLOSE);
        
        // Bu noktada d->m_lpCharacter = NULL; işlemi yapılmaz.
        // Çünkü bu, DESC::Destroy() fonksiyonunda, IsOfflineMode() kontrolü içinde yapılacaktır.
        
        sys_log(0, "CLIENTLESS_COMMAND: %s Karakteri clientless (ID: %u) moduna geçti.", ch->GetName(), ch->GetPlayerID());
    }
    else
    {
        ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Bağlantı bulunamadığı için komut başarısız oldu."));
    }
}

------------------------------------------------------------------------------------------
    { "clientless",            do_clientless,            0,               POS_DEAD,       GM_PLAYER    },
 
yapay zekanın sorun olarak teşkil ettiği yer:
void CInputLogin::LoginByKey(LPDESC d, const char * data)
{
    TPacketCGLogin2 * pinfo = (TPacketCGLogin2 *) data;

    char login[LOGIN_MAX_LEN + 1];
    trim_and_lower(pinfo->login, login, sizeof(login));

    // is blocked ip?
    {
        dev_log(LOG_DEB0, "check_blocked_country_start");

        if (!is_block_exception(login) && is_blocked_country_ip(d->GetHostName()))
        {
            sys_log(0, "BLOCK_COUNTRY_IP (%s)", d->GetHostName());
            d->SetPhase(PHASE_CLOSE);
            return;
        }

        dev_log(LOG_DEB0, "check_blocked_country_end");
    }

    if (g_bNoMoreClient)
    {
        TPacketGCLoginFailure failurePacket;

        failurePacket.header = HEADER_GC_LOGIN_FAILURE;
        strlcpy(failurePacket.szStatus, "SHUTDOWN", sizeof(failurePacket.szStatus));
        d->Packet(&failurePacket, sizeof(TPacketGCLoginFailure));
        return;
    }

    if (g_iUserLimit > 0)
    {
        int iTotal;
        int * paiEmpireUserCount;
        int iLocal;

        DESC_MANAGER::instance().GetUserCount(iTotal, &paiEmpireUserCount, iLocal);

        if (g_iUserLimit <= iTotal)
        {
            TPacketGCLoginFailure failurePacket;

            failurePacket.header = HEADER_GC_LOGIN_FAILURE;
            strlcpy(failurePacket.szStatus, "FULL", sizeof(failurePacket.szStatus));

            d->Packet(&failurePacket, sizeof(TPacketGCLoginFailure));
            return;
        }
    }

    // ------------------------------------------------------------------------------------
    // HESAP ZATEN BAĞLI KONTROLÜ (Clientless Desteği için zorunlu değil ama temizlik için önerilir)
    // ------------------------------------------------------------------------------------
    if (DESC_MANAGER::instance().FindByLoginName(login))
    {
        TPacketGCLoginFailure failurePacket;

        sys_log(0, "InputLogin::LoginByKey : already_connect (DESC) %s", login);
        
        failurePacket.header = HEADER_GC_LOGIN_FAILURE;
        // Oyuncuya gösterilecek mesajı gönderiyoruz
        strlcpy(failurePacket.szStatus, "ALREADY_CONNECTED", sizeof(failurePacket.szStatus));
        d->Packet(&failurePacket, sizeof(TPacketGCLoginFailure));
        return;
    }
    // ------------------------------------------------------------------------------------

    sys_log(0, "LOGIN_BY_KEY: %s key %u", login, pinfo->dwLoginKey);

    d->SetLoginKey(pinfo->dwLoginKey);
#ifndef _IMPR[HASH=2389]#ifndef[/HASH]CKET_ENCRYPTION_
    d->SetSecurityKey(pinfo->adwClientKey);
#endif

    T[HASH=3]#endif[/HASH]GDLoginByKey ptod;

    strlcpy(ptod.szLogin, login, sizeof(ptod.szLogin));
    ptod.dwLoginKey = pinfo->dwLoginKey;
    thecore_memcpy(ptod.adwClientKey, pinfo->adwClientKey, sizeof(DWORD) * 4);
    strlcpy(ptod.szIP, d->GetHostName(), sizeof(ptod.szIP));

    db_clientdesc->DBPacket(HEADER_GD_LOGIN_BY_KEY, d->GetHandle(), &ptod, sizeof(TPacketGDLoginByKey));
}
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst