Çözüldü Moblara vurabilmek için level sınırı koymak

  • Konuyu açan Konuyu açan Tengrist
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 22
  • Gösterim Gösterim 363
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

Tengrist

MT Üye
MT Üye
Mesaj
763
Çözümler
26
Beğeni
563
Puan
809
Ticaret Puanı
0
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?
 
Çözüm
C++:
Genişlet Daralt Kopyala
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;
}

C++:
Genişlet Daralt Kopyala
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;

Altına Ekle:

C++:
Genişlet Daralt Kopyala
    if (pkVictim->IsMonster())
    {
        if (!ExampleFunc(pkVictim->GetRaceNum(), this))
            return false;
    }

Şimdi Eve Geldim Denedim Çalışıyor. Canavar Bana Hasar Verebilir Fakat Ben Ona Hiçbir Şekilde (Skill atmak vb.) Hasar...
drop sınırı için nasıl kontrol koyulmuş onu kontrol et aynısını attack kısmına koy olur bence
 
Şunu dener misin;
char_battle.cpp:
Genişlet Daralt Kopyala
//Bul
::Attack

//Fonksiyonun en ustune koy

LPCHARACTER ch = quest::CQuestManager::Instance.GetCurrentCharacterPtr();

if (ch->GetLevel() < 5)
  return false;
 
Şunu dener misin;
char_battle.cpp:
Genişlet Daralt Kopyala
//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
 
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?
char_battle.cpp:
Genişlet Daralt Kopyala
// 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.
 
char_battle.cpp:
Genişlet Daralt Kopyala
// 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.
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
 
1729716314159.webp


Böyle bir şey mi arıyorsun tam olarak ?
 
Clientten attack fonksiyonuna level sınırı eklersen vuruş yapmaz istenilen moba bence daha mantıklı
 
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
Kodu bu şekilde güncelleyip kullanabilirsin:
C++:
Genişlet Daralt Kopyala
    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.
 
Kodu bu şekilde güncelleyip kullanabilirsin:
C++:
Genişlet Daralt Kopyala
    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.
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
 
Düzenledim, spesifik bir mob id'si dışında sonradan da istediğin mob'a level sınırı koyabileceğin şekilde yazdım.
Şunu dener misin;
char_battle.cpp:
Genişlet Daralt Kopyala
//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;
        }
    }
  }
 
Son düzenleme:
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
Hayır burada yapılan düzenleme ham damage değeri üzerinedir. Delici esnasında ham damage + delici değeri şeklinde işler.
 
Dü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:
Genişlet Daralt Kopyala
//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
Teşekkür ederim hocam, sizin kodunuzu da deneyeceğim
Hayır burada yapılan düzenleme ham damage değeri üzerinedir. Delici esnasında ham damage + delici değeri şeklinde işler.
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
 
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
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.
Bu if bloklarını yapmak istediğin şeye göre düzenleyebilirsin.
 
ClientSourceden neden yapmıyorsunuz İşlemi gameye kadar götürüyorsunuz. Eğer amaç vurmamak ise.
 
ClientSourceden 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.

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.
 
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.
Sanırım ben işin hile tarafını düşünmedim. 🤣
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst