Krutzo 1
Krutzo
shrpnl 1
shrpnl
Best Studio 1
Best Studio
D 1
delimuratt
Aliyldrim 1
Aliyldrim
Mt2Hizmet 1
Mt2Hizmet
noisiv 1
noisiv
Manwe Work 1
Manwe Work
melankolıa18 1
melankolıa18
Agora Metin2 1
Agora Metin2
Cannn6161 1
Cannn6161
kralhakan2009 1
kralhakan2009
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

[C++] Bouquet Damage Exploit Fix (Serverside)

5.00 yıldız(lar) 3 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
Çözüm
6
Online süresi
26d 15h
Reaksiyon Skoru
735
Altın Konu
1
Başarım Puanı
184
MmoLira
8,746
DevLira
123
Ticaret - 0%
0   0   0

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

GİRİŞ & PROBLEM

Merhaba, yabancı bir forumda bu sorunu keşfeden bir arkadaşın açıklamasını ve çözümünü içeren konuyu görünce incelediğim, sonrasında da server src taraflı detaylı bir kontrol gerektirdiğine karar verdiğim bir açık için bu fixi paylaşıyorum, açıktan kısaca bahsetmek gerekirse bu sorundan bahseden ilk konunun sahibi arkadaştan bir alıntı yapayım;

Adsız.png


NELERİ DEĞİŞTİRDİK ?

Orijinal konuda bu sorun Client Src üzerinden çözülmüş fakat bu oldukça sağlıksız bir yöntem, zira Client tarafındaki bir kontrolü bypass etmek bazen düşündüğünüzden çok daha kolay olabilir dolayısıyla bunun için daha sağlam bir fix oluşturdum, içerisinde sadece Buket yok, evlilik eşyalarının tamamı ve Olta/Kazma gibi eşyaların da server taraflı kontrolü mevcut, bu fix sonrasında bu yöntemi kullanan hileler çalışmayacaktır.

NASIL YAPILIR ?

Başlayalım, öncelikle Game Src içinden "char.cpp" dosyası açılır.

[CODE lang="cpp" title="char.cpp"]// BUL;

bool CHARACTER::CanMove() const


// ÜSTÜNE EKLE;


(EĞER PROJENİZDE; C++17 ve üstü destekleniyorsa bunu ekleyin)


// START OF DevFix 129
bool CHARACTER::IsPCAbleToAttack() const
{
if (!IsPC())
{
sys_log (2, "<CHARACTER::IsPCAbleToAttack> Only PCs able to use this function! %s Try to use this!", GetName());
return false;
}

// Wedding Item Vnums. - [MT2Dev Note]
constexpr int BOUQUET_VNUM_MIN = 50201;
constexpr int BOUQUET_VNUM_MAX = 50204;
constexpr int WEDDING_S_VNUM_MIN = 11901;
constexpr int WEDDING_S_VNUM_MAX = 11904;
constexpr int WEDDING_D_VNUM_MIN = 11911;
constexpr int WEDDING_D_VNUM_MAX = 11914;

// If PC try to attack while wearing rod or pick, return false. - [MT2Dev Note]
if (const auto Wear_Weapon = GetWear (WEAR_WEAPON))
{
if (Wear_Weapon->GetType() == ITEM_ROD || Wear_Weapon->GetType() == ITEM_PICK)
{
sys_log (2, "<CHARACTER::IsPCAbleToAttack> %s tried to attack with pick/rod!", GetName());
return false;
}
}

// If PC try to attack while wearing bouquet, return false. - [MT2Dev Note]
if (const auto Part_Weapon = GetWear (PART_WEAPON))
{
if (Part_Weapon->GetVnum() >= BOUQUET_VNUM_MIN && Part_Weapon->GetVnum() <= BOUQUET_VNUM_MAX)
{
sys_log (2, "<CHARACTER::IsPCAbleToAttack> %s tried to attack with bouquet!", GetName());
return false;
}
}

// If PC try to attack while wearing wedding suit/dresses, return false. - [MT2Dev Note]
if (const auto Part_Body = GetWear (PART_MAIN))
{
if ((Part_Body->GetVnum() >= WEDDING_S_VNUM_MIN && Part_Body->GetVnum() <= WEDDING_S_VNUM_MAX) ||
(Part_Body->GetVnum() >= WEDDING_D_VNUM_MIN && Part_Body->GetVnum() <= WEDDING_D_VNUM_MAX))
{
sys_log (2, "<CHARACTER::IsPCAbleToAttack> %s tried to attack while wearing marriage suit/dress!", GetName());
return false;
}
}

return true;
}
// END OF DevFix 129






(EĞER PROJENİZDE; C++17 ve üstü DESTEKLENMİYORSA bunu ekleyin)


// START OF DevFix 129
bool CHARACTER::IsPCAbleToAttack() const
{
if (!IsPC())
{
sys_log (2, "<CHARACTER::IsPCAbleToAttack> Only PCs able to use this function! %s Try to use this!", GetName());
return false;
}

const auto Wear_Weapon = GetWear (WEAR_WEAPON);
const auto Part_Weapon = GetWear (PART_WEAPON);
const auto Part_Body = GetWear (PART_MAIN);

// If PC try to attack while wearing rod or pick, return false. - [MT2Dev Note]
if (Wear_Weapon && (Wear_Weapon->GetType() == ITEM_ROD || Wear_Weapon->GetType() == ITEM_PICK))
{
sys_log (2, "<CHARACTER::IsPCAbleToAttack> %s tried to attack with pick/rod!", GetName());
return false;
}

// If PC try to attack while wearing bouquet, return false. - [MT2Dev Note]
if (Part_Weapon && (Part_Weapon->GetVnum() >= 50201 && Part_Weapon->GetVnum() <= 50204)) // Bouquet vnums hard-coded in here.. - [MT2Dev Note]
{
sys_log (2, "<CHARACTER::IsPCAbleToAttack> %s tried to attack with bouquet!", GetName());
return false;
}

// If PC try to attack while wearing wedding suit/dresses, return false. - [MT2Dev Note]
if (Part_Body && ((Part_Body->GetVnum() >= 11901 && Part_Body->GetVnum() <= 11904) ||
(Part_Body->GetVnum() >= 11911 && Part_Body->GetVnum() <= 11914))) // Suit/dress vnums hard-coded in here.. - [MT2Dev Note]
{
sys_log (2, "<CHARACTER::IsPCAbleToAttack> %s tried to attack while wearing marriage suit/dress!", GetName());
return false;
}

return true;
}
// END OF DevFix 129[/CODE]

Daha sonra "char.h" dosyası açılır.

[CODE lang="cpp" title="char.h"]// BUL;

bool CanMove() const;

// ÜSTÜNE EKLE;

// START OF DevFix 129
bool IsPCAbleToAttack() const; // Is this PC able to attack someone ? - [MT2Dev Note]
// END OF DevFix 129[/CODE]

Son olarak "char_battle.cpp" açılır.

[CODE lang="cpp" title="char_battle.cpp"]// bool CHARACTER::Attack (LPCHARACTER pkVictim, BYTE bType) FONKSİYONUNUN İÇİNDE EN ÜSTTE BUL;

if (!CanMove())
{
return false;
}

// ALTINA EKLE;

// START OF DevFix 129
if (IsPC() && !IsPCAbleToAttack())
{
if (test_server)
{
ChatPacket (CHAT_TYPE_INFO, "<Control> Cannot attack while wearing this equipments!");
}

return false;
}
// END OF DevFix 129


// bool CHARACTER::Damage (LPCHARACTER pAttacker, int dam, EDamageType type) FONKSIYONUNUN İÇİNDE EN BAŞTA BUL;

if (DAMAGE_TYPE_MAGIC == type)
{
dam = (int) ((float) dam * (100 + (pAttacker->GetPoint (POINT_MAGIC_ATT_BONUS_PER) + pAttacker->GetPoint (POINT_MELEE_MAGIC_ATT_BONUS_PER))) / 100.f + 0.5f);
}

// ÜSTÜNE EKLE (DİKKAT: FONKSIYONUN İÇİNE EKLENECEK!);

// START OF DevFix 129
if (pAttacker && pAttacker->IsPC() && !pAttacker->IsPCAbleToAttack())
{
SendDamagePacket (pAttacker, 0, DAMAGE_BLOCK);
return false;
}
// END OF DevFix 129[/CODE]
Sevgiler, MT2Dev.
 
Paylaşım için teşekkürler.
 
Paylaşım için teşekkürler.
 
Paylaşım için teşekkürler.
 

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

Geri
Üst