- Mesaj
- 488
- Çözümler
- 36
- Beğeni
- 1.077
- Puan
- 1.149
- 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. ( )
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.
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. ( )
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;