Yardım Okçu attack çoklu vurma nasıl yapabilirim.

Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.
Merhaba,
Metin2de karakter vuruşları atakları vs. char_battlr.cpp dosyasından gelir.
void CHARACTER::Attack(LPCHARACTER pkVictim, ...)
Tam olarak bu fonksiyon, bunun yanında animasyonu vsde farklıdır.
Bunu test ederek geliştirebilrsin. Vuruş animasyonu okun çıkışı vs geliştirilebilir. Ben size başlangıç olarak örnek kod aşağıda bırakayım devamını siz geliştirirsiniz.
Diğer karekterler içinde yukarıda verdiğim attack fonksiyonu içerisinde düzenlemeler yaparak istediğine ulaşabilirsin.
Mesela ;

char_battle.cpp:
Genişlet Daralt Kopyala
case BATTLE_TYPE_RANGE:
    FlyTarget(pkVictim->GetVID(), pkVictim->GetX(), pkVictim->GetY(), HEADER_CG_FLY_TARGETING);
    iRet = Shoot(0) ? BATTLE_DAMAGE : BATTLE_NONE;
    break;
Burası okçu için geçerli, Shoot(0) olduğu için tek vuruş algılıyor. Bu case de düzenlemeler yaparak 1den fazla vuruşa sahip olabilirsin.
Şu kodları kendine göre düzenleyebilirsin ya da direk kopyala yapıştır.

char_battle.cpp:
Genişlet Daralt Kopyala
case BATTLE_TYPE_RANGE:
    FlyTarget(pkVictim->GetVID(), pkVictim->GetX(), pkVictim->GetY(), HEADER_CG_FLY_TARGETING);
    iRet = Shoot(0) ? BATTLE_DAMAGE : BATTLE_NONE;

    if (iRet == BATTLE_DAMAGE)
    {
        const int radius = 300; // 300 oyun birimi içinde
        const int maxExtraTargets = 2; // hedef harici 2 moba daha

        std::vector<LPCHARACTER> extraTargets;

        SECTREE_MANAGER::instance().for_each_entity_inside_range(pkVictim->GetX(), pkVictim->GetY(), radius,
            [&](LPENTITY ent)
            {
                if (!ent->IsType(ENTITY_CHARACTER))
                    return;

                LPCHARACTER ch = (LPCHARACTER)ent;

                if (ch == this || ch == pkVictim)
                    return;

                if (!ch->IsMonster() || ch->IsDead())
                    return;

                if (IsAttackable(ch) && CanAttack(ch))
                    extraTargets.push_back(ch);

                if (extraTargets.size() >= maxExtraTargets)
                    return;
            });

        for (auto ch : extraTargets)
        {
            // Hasar oranını istersen azaltabilirsin, örneğin:
            // int damage = GetDamage(pkVictim) * 0.5;
            Damage(ch, pkVictim->GetLastDamage());
        }
    }
    break;

int damage = GetDamage(pkVictim) * 0.5;
Şu satırda zaten yorum satırı var da, eğer 0.5i azaltıp ya da çoğaltırsan yanında vurduğu slotlara hasarıda ona göre azaltıp çoğaltabilirsin.


Not : Dediğim gibi tamamen test amaçlı yazdım. Bununla istediğine ulaşırsın ama animasyon olarak nasıl olur bilmiyorum. Bi dene bakalım.
 
Merhaba,
Metin2de karakter vuruşları atakları vs. char_battlr.cpp dosyasından gelir.

Tam olarak bu fonksiyon, bunun yanında animasyonu vsde farklıdır.
Bunu test ederek geliştirebilrsin. Vuruş animasyonu okun çıkışı vs geliştirilebilir. Ben size başlangıç olarak örnek kod aşağıda bırakayım devamını siz geliştirirsiniz.
Diğer karekterler içinde yukarıda verdiğim attack fonksiyonu içerisinde düzenlemeler yaparak istediğine ulaşabilirsin.
Mesela ;

char_battle.cpp:
Genişlet Daralt Kopyala
case BATTLE_TYPE_RANGE:
    FlyTarget(pkVictim->GetVID(), pkVictim->GetX(), pkVictim->GetY(), HEADER_CG_FLY_TARGETING);
    iRet = Shoot(0) ? BATTLE_DAMAGE : BATTLE_NONE;
    break;
Burası okçu için geçerli, Shoot(0) olduğu için tek vuruş algılıyor. Bu case de düzenlemeler yaparak 1den fazla vuruşa sahip olabilirsin.
Şu kodları kendine göre düzenleyebilirsin ya da direk kopyala yapıştır.

char_battle.cpp:
Genişlet Daralt Kopyala
case BATTLE_TYPE_RANGE:
    FlyTarget(pkVictim->GetVID(), pkVictim->GetX(), pkVictim->GetY(), HEADER_CG_FLY_TARGETING);
    iRet = Shoot(0) ? BATTLE_DAMAGE : BATTLE_NONE;

    if (iRet == BATTLE_DAMAGE)
    {
        const int radius = 300; // 300 oyun birimi içinde
        const int maxExtraTargets = 2; // hedef harici 2 moba daha

        std::vector<LPCHARACTER> extraTargets;

        SECTREE_MANAGER::instance().for_each_entity_inside_range(pkVictim->GetX(), pkVictim->GetY(), radius,
            [&](LPENTITY ent)
            {
                if (!ent->IsType(ENTITY_CHARACTER))
                    return;

                LPCHARACTER ch = (LPCHARACTER)ent;

                if (ch == this || ch == pkVictim)
                    return;

                if (!ch->IsMonster() || ch->IsDead())
                    return;

                if (IsAttackable(ch) && CanAttack(ch))
                    extraTargets.push_back(ch);

                if (extraTargets.size() >= maxExtraTargets)
                    return;
            });

        for (auto ch : extraTargets)
        {
            // Hasar oranını istersen azaltabilirsin, örneğin:
            // int damage = GetDamage(pkVictim) * 0.5;
            Damage(ch, pkVictim->GetLastDamage());
        }
    }
    break;

int damage = GetDamage(pkVictim) * 0.5;
Şu satırda zaten yorum satırı var da, eğer 0.5i azaltıp ya da çoğaltırsan yanında vurduğu slotlara hasarıda ona göre azaltıp çoğaltabilirsin.


Not : Dediğim gibi tamamen test amaçlı yazdım. Bununla istediğine ulaşırsın ama animasyon olarak nasıl olur bilmiyorum. Bi dene bakalım.
 

Dosya Eklentileri

  • battle hata.webp
    battle hata.webp
    41,8 KB · Gösterim: 23
Geri
Üst