[C++] GM Kodlarında Negatif Sayı Kullanarak Core Düşürme Fix

MT2Dev

Cplusplus
Premium Üye
Üye
Mesaj
135
Çözümler
8
Beğeni
206
Puan
744
Ticaret Puanı
0
GİRİŞ & PROBLEM

Merhaba, bugün komutlarda beklenmeyen negatif (-) bir arg (sayı) vererek (Örnek; /mob 101 -1) core düşmesine sebep olan hata başta olmak üzere bir kaç hatayı fixleyeceğiz ayrıca fonksiyonların ChatPacket kullanımlarını da düzenleyeceğiz. Fix gerektiren bir kodu görmemizi sağlayan, geliştiriciliğe olan katkısından dolayı test serverinin sahibi @Denizeri24 'e ve - count atarak serveri çökerten isimsiz kahramana teşekkürü borç bilirim. ( :ROFLMAO: )

NEDEN ?

GM'lar zaten ekibin bir parçası buna neden gerek duyalım diyebilirsiniz, haklısınız fakat bunu kodlama bilgisi olmayan GM'ın yanlışlıkla tetikleyebileceğini de unutmayın, işimizi şansa bırakmayalım.

Sorunun kaynağı için tıklayabilirsiniz, şimdi çözümüne geçelim.

ÇÖZÜM

Yapacağımız işlem basit, verilen arg değerinin istediğimiz aralıkta olduğuna emin olmamız yeterli olacaktır, başlayalım.

MT2Dev Fix:
// (cmd_gm.cpp) BULUNUR;

ACMD (do_mob)

// KOMPLE DEGISTIRILIR;

ACMD (do_mob)
{
    char arg1[256], arg2[256];
    DWORD vnum = 0;
    two_arguments (argument, arg1, sizeof (arg1), arg2, sizeof (arg2));
    if (!*arg1)
    {
        ch->ChatPacket (CHAT_TYPE_INFO, "Usage: /mob <mob vnum> <mob count>"); // Now it's correct.. - [MT2Dev Note] - 14/04/2024
        return;
    }

    const CMob* pkMob = NULL;
    if (isnhdigit (*arg1))
    {
        str_to_number (vnum, arg1);
        if ((pkMob = CMobManager::instance().Get (vnum)) == NULL)
        {
            vnum = 0;
        }
    }
    else
    {
        pkMob = CMobManager::Instance().Get (arg1, true);
        if (pkMob)
        {
            vnum = pkMob->m_table.dwVnum;
        }
    }

    if (vnum == 0)
    {
        ch->ChatPacket (CHAT_TYPE_INFO, "No such mob(%s) by that vnum", arg1); // I'm added info about vnum. - [MT2Dev Note] - 14/04/2024
        return;
    }

    int iCount = 1;
    if (*arg2)
    {
        str_to_number (iCount, arg2);
        iCount = MINMAX (1, iCount, 40);   // DevFix 121
    }

    if (test_server)
    {
        iCount = MIN (40, iCount);
    }
    else
    {
        iCount = MIN (20, iCount);
    }

    while (iCount--)
    {
        CHARACTER_MANAGER::instance().SpawnMobRange (vnum, ch->GetMapIndex(), ch->GetX() - number (200, 750), ch->GetY() - number (200, 750), ch->GetX() + number (200, 750), ch->GetY() + number (200, 750), true, pkMob->m_table.bType == CHAR_TYPE_STONE);
    }
}



// (cmd_gm.cpp) BULUNUR;

ACMD (do_mob_aggresive)

// KOMPLE DEGISTIRILIR;

ACMD (do_mob_aggresive)
{
    char arg1[256], arg2[256];
    DWORD vnum = 0;
    LPCHARACTER tch;
    two_arguments (argument, arg1, sizeof (arg1), arg2, sizeof (arg2));
    if (!*arg1)
    {
        ch->ChatPacket (CHAT_TYPE_INFO, "Usage: /ma <mob vnum> <mob count>"); // Now it's correct.. - [MT2Dev Note] - 14/04/2024
        return;
    }

    const CMob* pkMob;
    if (isdigit (*arg1))
    {
        str_to_number (vnum, arg1);
        if ((pkMob = CMobManager::instance().Get (vnum)) == NULL)
        {
            vnum = 0;
        }
    }
    else
    {
        pkMob = CMobManager::Instance().Get (arg1, true);
        if (pkMob)
        {
            vnum = pkMob->m_table.dwVnum;
        }
    }

    if (vnum == 0)
    {
        ch->ChatPacket (CHAT_TYPE_INFO, "No such mob(%s) by that vnum", arg1); // I'm added info about vnum. - [MT2Dev Note] - 14/04/2024
        return;
    }

    int iCount = 1;
    if (*arg2)
    {
        str_to_number (iCount, arg2);
        iCount = MINMAX (1, iCount, 40);   // DevFix 121
    }

    if (test_server)
    {
        iCount = MIN (40, iCount);
    }
    else
    {
        iCount = MIN (20, iCount);
    }

    while (iCount--)
    {
        tch = CHARACTER_MANAGER::instance().SpawnMobRange (vnum, ch->GetMapIndex(), ch->GetX() - number (200, 750), ch->GetY() - number (200, 750), ch->GetX() + number (200, 750), ch->GetY() + number (200, 750), true, pkMob->m_table.bType == CHAR_TYPE_STONE);
        if (tch)
        {
            tch->SetAggressive();
        }
    }
}



// (cmd_gm.cpp) BULUNUR;

ACMD (do_mob_coward)

// KOMPLE DEGISTIRILIR;

ACMD (do_mob_coward)
{
    char arg1[256], arg2[256];
    DWORD vnum = 0;
    LPCHARACTER tch;
    two_arguments (argument, arg1, sizeof (arg1), arg2, sizeof (arg2));
    if (!*arg1)
    {
        ch->ChatPacket (CHAT_TYPE_INFO, "Usage: /mc <mob vnum> <mob count>"); // Now it's correct.. - [MT2Dev Note] - 14/04/2024
        return;
    }

    const CMob* pkMob;
    if (isdigit (*arg1))
    {
        str_to_number (vnum, arg1);
        if ((pkMob = CMobManager::instance().Get (vnum)) == NULL)
        {
            vnum = 0;
        }
    }
    else
    {
        pkMob = CMobManager::Instance().Get (arg1, true);
        if (pkMob)
        {
            vnum = pkMob->m_table.dwVnum;
        }
    }

    if (vnum == 0)
    {
        ch->ChatPacket (CHAT_TYPE_INFO, "No such mob(%s) by that vnum", arg1); // I'm added info about vnum. - [MT2Dev Note] - 14/04/2024
        return;
    }

    int iCount = 1;
    if (*arg2)
    {
        str_to_number (iCount, arg2);
        iCount = MINMAX (1, iCount, 40);   // DevFix 121
    }

    if (test_server)
    {
        iCount = MIN (40, iCount);
    }
    else
    {
        iCount = MIN (20, iCount);
    }

    while (iCount--)
    {
        tch = CHARACTER_MANAGER::instance().SpawnMobRange (vnum, ch->GetMapIndex(), ch->GetX() - number (200, 750), ch->GetY() - number (200, 750), ch->GetX() + number (200, 750), ch->GetY() + number (200, 750), true, pkMob->m_table.bType == CHAR_TYPE_STONE);
        if (tch)
        {
            tch->SetCoward();
        }
    }
}




// (cmd_gm.cpp) BULUNUR;

ACMD (do_fishing_simul)

// KOMPLE DEGISTIRILIR;

ACMD (do_fishing_simul) // DevFix 121
{
    char arg1[256];
    char arg2[256];
    char arg3[256];
    argument = one_argument (argument, arg1, sizeof (arg1));
    two_arguments (argument, arg2, sizeof (arg2), arg3, sizeof (arg3));

    unsigned char level = 100;
    unsigned char prob_idx = 0;
    int count = 1000;
    ch->ChatPacket (CHAT_TYPE_INFO, "Usage: /fishing_simul <level> <prob index> <count>");
    ch->ChatPacket (CHAT_TYPE_INFO, "Limit: <level 0-100> <prob 0-100> <count 0-100000>");

    if (*arg1)
    {
        if (level > 100)
        {
            return;
        }
        else
        {
            str_to_number (level, arg1);
        }
    }

    if (*arg2)
    {
        if (prob_idx > 100)
        {
            return;
        }
        else
        {
            str_to_number (prob_idx, arg2);
        }
    }

    if (*arg3)
    {
        if (count < 0 || count > 100000)
        {
            return;
        }
        else
        {
            str_to_number (count, arg3);
        }
    }

    fishing::Simulation (level, count, prob_idx, ch);
}




/* BİLGİ: */ Sıradaki yapacağımız işlem aslında bir core düşmesine sebebiyet vermeyebilir fakat eklenmesi gereken bir kontrol olduğu için onu da bunların arasında vermiş olayım.
             GM tarafından yang miktarı değiştirilen karakterin istemediğimiz bir miktarda yanga sahip olmasını engelleyelim;
/* ÖNEMLİ NOT: */ Eğer "Extended Max Yang" sistemini kullanıyorsanız, yani "maksimum yang miktarını arttırdıysanız" aşağıdaki kodda yer alan tüm int olan bölümleri long long int ile DEĞİŞTİRİN!




// (cmd_gm.cpp) BULUNUR;

ACMD (do_set)

// ICINDE BULUNUR;

        case 0:

// KOMPLE DEGISTIRILIR;

        case 0:   // Gold
        {
            int gold = 0; // If you use extended yang limit, change this int with long long int!!! - [MT2Dev Note] - 19/04/2024
            str_to_number (gold, arg3);
            DBManager::instance().SendMoneyLog (MONEY_LOG_MISC, 3, gold);
            tch->PointChange (POINT_GOLD, gold, true);
            int after_gold = tch->GetGold(); // If you use extended yang limit, change this int with long long int!!!- [MT2Dev Note] - 19/04/2024
            if (after_gold < 0) // DevFix 121
            {
                tch->PointChange (POINT_GOLD, -after_gold, true);
                after_gold = 0;
            }

            if (after_gold > GOLD_MAX) // DevFix 121
            {
                int difference = after_gold - GOLD_MAX; // If you use extended yang limit, change this int with long long int!!! - [MT2Dev Note] - 19/04/2024
                tch->PointChange (POINT_GOLD, -difference, true);
                after_gold = GOLD_MAX;
            }
        } // Also useless log removed by me. - [MT2Dev Note] - 19/04/2024
        break;


 
süper süper
 
Paylaşım için teşekkürler. Söyleyen yada test eden olmasa kimse bilmiyodu çok iyi olmuş. 😊
 
Mob spawn limitini degismemek lazım .
20 yeterli be abee 😁paylaşım için teşekkürler
 
Mob spawn limitini degismemek lazım .
20 yeterli be abee 😁paylaşım için teşekkürler

Aslında fix için kodu paylaşırken biraz değiştirdim :LOL: , orijinal hali biraz farklı;

Adsız.png


Performans testi için lazım oluyor, aynı kodu spamlamakla uğraşmamak için. :D

NOT: Normalde test server modunda tüm GM'ler otomatik olarak IMPLEMENTOR olarak kabul ediliyor fakat ben o bölümü deaktif ettim, yani o bölüm duruyorsa koddaki GM seviyesi kontrolü anlamsız olur, belirteyim.
 
Bununla uğraşırken /do_set komutunun ne kadar rezil bir halde olduğunu fark ettim, ona komple renewal gerekiyor, yakında paylaşırım. 👋
 
Geri
Üst