bool CHARACTER::ExampleFunc(const uint32_t raceNum, LPCHARACTER ch)
{
const uint8_t level = ch->GetLevel();
if (raceNum == 1093 && level >= 70 && level <= 75)
return false;
return true;
}
bool CHARACTER::Attack(LPCHARACTER pkVictim, BYTE bType)
{
if (test_server)
sys_log(0, "[TEST_SERVER] Attack : %s type %d, MobBattleType %d", GetName(), bType, !GetMobBattleType() ? 0 : GetMobAttackRange());
if (!CanMove())
return false;
if (pkVictim->IsMonster())
{
if (!ExampleFunc(pkVictim->GetRaceNum(), this))
return false;
}
//Bul
::Attack
//Fonksiyonun en ustune koy
LPCHARACTER ch = quest::CQuestManager::Instance.GetCurrentCharacterPtr();
if (ch->GetLevel() < 5)
return false;
karakterin leveli 5 ten küçükse oluyo bu karakterin leveli ile mobun levelini hesaplayıp aradaki farkı alman lazımŞunu dener misin;
char_battle.cpp://Bul ::Attack //Fonksiyonun en ustune koy LPCHARACTER ch = quest::CQuestManager::Instance.GetCurrentCharacterPtr(); if (ch->GetLevel() < 5) return false;
Yanlış anlamışım, tekrar düzenleyeyimkarakterin leveli 5 ten küçükse oluyo bu karakterin leveli ile mobun levelini hesaplayıp aradaki farkı alman lazım
Arkadaşlar selamlar,
Birkaç mob üzerine oyuncuların hasar verebilmesi için düzenleme yapmak istiyorum
1093 vnumlı moba sadece 70-75 level arasındaki oyuncuların saldırabilmesini istiyorum nasıl yapabilirim?
// bool CHARACTER::Damage fonksiyonunun en sonuna (return false; üstüne) ekleyin;
if (GetRaceNum() == 1093 && pAttacker->IsPC())
{
unsigned short playerlvl = pAttacker->GetLevel()
if (playerlvl < 70 || playerlvl > 75)
{
dam = 0;
pAttacker->ChatPacket (CHAT_TYPE_INFO, "<Sistem> Seviyen sebebiyle hasar vuramazsin!"); // Fikir vermesi icin, duzenlersiniz.
}
}
Hocam çok teşekkür ederim yarın deneyeceğim bi soru daha sorsam bu vnumlı canavara atılan hasar mesela oyuncunun sahip olduğu yarı insan efsunu kadar olmasını istersem nasıl yapabilirim, bir oyuncunun üzerindeki x bonusunu çeken fonksiyon var mı bildiğiniz varsa yarı insana karşı bonusu nasıl çekebilirim heralde ismi ATT_HUMAN tarzı nir şey miydichar_battle.cpp:// bool CHARACTER::Damage fonksiyonunun en sonuna (return false; üstüne) ekleyin; if (GetRaceNum() == 1093 && pAttacker->IsPC()) { unsigned short playerlvl = pAttacker->GetLevel() if (playerlvl < 70 || playerlvl > 75) { dam = 0; pAttacker->ChatPacket (CHAT_TYPE_INFO, "<Sistem> Seviyen sebebiyle hasar vuramazsin!"); // Fikir vermesi icin, duzenlersiniz. } }
Aklıma ilk geleni rastgele yazdım, denemedim ama muhtemelen çalışacaktır. Oyuncu saldırır fakat hasar vuramaz, istersen chat_packet ile bilgi yollayabilirsin fakat her vuruşta aynı yazıyı spamlayacağını unutma, farklı yollarla yapabilirsin buradaki kodlar yardımcı olacaktır.
Rubinum videosu izliyodum da event bosslarına çeşitli level sınırı koymuşlar belirli level altındaki veya üstündeki adamlar hasar atamıyordu
Kodu bu şekilde güncelleyip kullanabilirsin:Hocam çok teşekkür ederim yarın deneyeceğim bi soru daha sorsam bu vnumlı canavara atılan hasar mesela oyuncunun sahip olduğu yarı insan efsunu kadar olmasını istersem nasıl yapabilirim, bir oyuncunun üzerindeki x bonusunu çeken fonksiyon var mı bildiğiniz varsa yarı insana karşı bonusu nasıl çekebilirim heralde ismi ATT_HUMAN tarzı nir şey miydi
if (GetRaceNum() == 1093 && pAttacker->IsPC())
{
unsigned short playerlvl = pAttacker->GetLevel();
if (playerlvl < 70 || playerlvl > 75)
{
int human_bonus = pAttacker->GetPoint(POINT_ATTBONUS_HUMAN);
dam = human_bonus;
//pAttacker->ChatPacket (CHAT_TYPE_INFO, "<Sistem> Seviyen sebebiyle hasar vuramazsin!");
}
}
Hocam skillerin dmgleri önemsiz, uyarınız için ayrıca teşekkür ederim, 1 105 newschool saçmalığı için files yapıyorum aklıma bir çeşit event geldi o yüzden sormuştum, eski global bir filesta sadece yarı insan bonusu kadar bonusla hasar atılabilen event dungeonlar vardı bir sorum daha olacak hocam delici vuruş gelince de yarı insan değeri kadar mı hasar atılır yine bu düzenlemede, eğer değilse yarı insanın işlemesini kapatmanın bir mantığı var mı oyun kodlarındaKodu bu şekilde güncelleyip kullanabilirsin:
C++:if (GetRaceNum() == 1093 && pAttacker->IsPC()) { unsigned short playerlvl = pAttacker->GetLevel(); if (playerlvl < 70 || playerlvl > 75) { int human_bonus = pAttacker->GetPoint(POINT_ATTBONUS_HUMAN); dam = human_bonus; //pAttacker->ChatPacket (CHAT_TYPE_INFO, "<Sistem> Seviyen sebebiyle hasar vuramazsin!"); } }
Fakat bunu sadece bu şekilde kullanmak mantıksız olacaktır. Çünkü skillerde de aynı hasarı atacaktır. Yani örnek veriyorum karakterde 50 yarı insan varsa, düz vuruş ve skillerin tamamı 50 olarak işlenecektir. Dolayısıyla bu şekilde kullanmak istersen ekstra düzenlemeler yapman gerekebilir.
//Ekle
#include <map>
//Bul
::Damage
//Fonksiyonun en üstüne ekle
// mobID, minLevelToAttack, maxLevelToAttack
std::map<int, std::pair<int, int>> AttackConstraintsToMobs = {
{ 101, {50, 60} },
{ 1093, {70, 75} },
{ 2493, {80, 90} },
};
std::map<int, std::pair<int, int>>::const_iterator it;
if (pkAttacker->IsPC())
{
it = AttackConstraintsToMobs.find(GetRaceNum());
if (it != AttackConstraintsToMobs.end())
{
if (pkAttacker->GetLevel() < it->second.first || pkAttacker->GetLevel() > it->second.second)
{
pkAttacker->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Seviyen %d'den yuksek ve %d'den kucuk olmali."), it->second.first, it->second.second);
return false;
}
}
}
Hayır burada yapılan düzenleme ham damage değeri üzerinedir. Delici esnasında ham damage + delici değeri şeklinde işler.Hocam skillerin dmgleri önemsiz, uyarınız için ayrıca teşekkür ederim, 1 105 newschool saçmalığı için files yapıyorum aklıma bir çeşit event geldi o yüzden sormuştum, eski global bir filesta sadece yarı insan bonusu kadar bonusla hasar atılabilen event dungeonlar vardı bir sorum daha olacak hocam delici vuruş gelince de yarı insan değeri kadar mı hasar atılır yine bu düzenlemede, eğer değilse yarı insanın işlemesini kapatmanın bir mantığı var mı oyun kodlarında
Teşekkür ederim hocam, sizin kodunuzu da deneyeceğimDüzenledim, spesifik bir mob id'si dışında istediğin mob'a göre level sınırı belirleyebileceğin şekilde yazdım.
Şunu dener misin;
char_battle.cpp://Ekle #include <map> //Bul ::Attack //Fonksiyonun en üstüne ekle LPCHARACTER ch = quest::CQuestManager::instance->GetCurrentCharacterPtr(); // mobID, minLevelToAttack, maxLevelToAttack std::map<int, std::pair<int, int>> AttackConstraintsToMobs = { { 101, {50, 60} }, { 1093, {70, 75} }, { 2493, {80, 90} }, }; if (ch->GetLevel() < AttackConstraintsToMobs[pkVictim->GetVID()].first || ch->GetLevel() > AttackConstraintsToMobs[pkVictim->GetVID()].second) return false;
Umarım mob id'sini doğru almışımdır, github'daki Metin2 kaynak koduna baktım
Hocam peki delici hasarı için ilgili condition ı hangi dosyada bulabilirim? Diğerleri 200 yarı-insanla vururken delici denk gelen şimdi milyonları görür, oraya da anladığım kadarıyla if atıp boss vnuma göre damage kaç dam ise o dam'da kalmasını sağlamam lazım sanırımHayır burada yapılan düzenleme ham damage değeri üzerinedir. Delici esnasında ham damage + delici değeri şeklinde işler.
Aynı dosya içinde if (iPenetratePct) bu kodu aratırsan iki tane sonuç bulacaksın. Biri düz vuruş için deliciyi, diğeri skiller için deliciyi temsil eder.Teşekkür ederim hocam, sizin kodunuzu da deneyeceğim
Hocam peki delici hasarı için ilgili condition ı hangi dosyada bulabilirim? Diğerleri 200 yarı-insanla vururken delici denk gelen şimdi milyonları görür, oraya da anladığım kadarıyla if atıp boss vnuma göre damage kaç dam ise o dam'da kalmasını sağlamam lazım sanırım
Client bazlısında hocam hileciler düşündürttü ondan direkt game taraflı düşündümClientSourceden neden yapmıyorsunuz İşlemi gameye kadar götürüyorsunuz. Eğer amaç vurmamak ise.
Bu tarz engellemeleri eğer mümkünse ve çok büyük işlem yükü getirmeyecekse (bu tarz kontroller nerdeyse hiç yük yüklemez bile, yeni nesil derleyicilerde tabii) mutlaka game tarafından yapın hocam, hem pack tarafını hem client tarafını manipülasyondan korumak çok daha zor ama game tarafına doğrudan kimse müdahale edemez ancak paketlerle oynayabilirler.ClientSourceden neden yapmıyorsunuz İşlemi gameye kadar götürüyorsunuz. Eğer amaç vurmamak ise.
Sanırım ben işin hile tarafını düşünmedim.Bu tarz engellemeleri eğer mümkünse ve çok büyük işlem yükü getirmeyecekse (bu tarz kontroller nerdeyse hiç yük yüklemez bile, yeni nesil derleyicilerde tabii) mutlaka game tarafından yapın hocam, hem pack tarafını hem client tarafını manipülasyondan korumak çok daha zor ama game tarafına doğrudan kimse müdahale edemez ancak paketlerle oynayabilirler.
Bazı arkadaşları görüyorum paket şifrelemeyi komple iptal ediyorlar, eski usul xtea dahil ne varsa kapatıyorlar .exe dosyalarını direkt paketleyip atıyorlar ondan sonra hileye çözüm olsun diye ac şirketi arıyorlar, önce siz önlem alın sonra bazı şeyleri engellemek daha kolay olur zaten, ha paket şifreleme sistemini olduğu gibi alıp aktif etmek hiçbir işe yaramaz zaten kodlar 10 senedir piyasada, şifreleme methodunu değiştirin, keyleri değiştirin kullanmaya devam edin. Cryptopp destekli şifreleme belki oyun açılışında, ışınlanmada size 1-2 saniye kaybettirir ama hile veya farklı paket değişiklikleri ile uğraşacağıma 1-2 saniye geç oyuna girmeyi tercih ederim.