Hikayeler

Reklam vermek için turkmmo@gmail.com

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

5.00 yıldız(lar) 2 Değerlendirme Değerlendirenler

MT2Dev

Cplusplus
Telefon Numarası Onaylanmış Üye TC Kimlik Numarası Doğrulanmış Üye
Fahri Üye
TM Üye
Katılım
30 Ocak 2020
Konular
50
Mesajlar
812
Online süresi
26g 54000s
Reaksiyon Skoru
735
Altın Konu
1
Başarım Puanı
184
TM Yaşı
6 Yıl 2 Ay 21 Gün
MmoLira
8,731
DevLira
123

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

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.

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.

ÇÖ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;
 

En Çok Reaksiyon Alan Mesajlar

Paylaşım için teşekkürler. Güzel bir konuya değinmişsiniz.
 
Paylaşım için teşekkürler.
 
Paylaşım için teşekkürler.
 

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

Geri
Üst