Çözüldü damage_block hakkında

  • Konuyu açan Konuyu açan enes turan
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 2
  • Gösterim Gösterim 67
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ı.

enes turan

Premium Üye
Premium Üye
Yardımsever Üye
Usta Üye
Mesaj
1.072
Çözümler
78
Beğeni
1.277
Puan
1.339
Ticaret Puanı
0
merhabalar geliştirdiğim filese official sunucuda olan tamlık pasif skilini eklemiştim yohara maplarında işe yaraması açısından şöyle bir kod yazdım

karakterin skili 'SKILL_HIT' ve 'POINT_HIT_PCT' tamlık efsunu statlarına göre miss vurma olayını hesaplıyor

C++:
Genişlet Daralt Kopyala
//bool CHARACTER::Damage içine

    if (pAttacker->IsConquerorMap(pAttacker->GetMapIndex()) && pAttacker->IsPC())
    {
        const int skillprecision = aiSkillPrecision[MINMAX(0, pAttacker->GetSkillLevel(SKILL_HIT), SKILL_MAX_LEVEL)]; //20%
        const int blockperc = skillprecision + pAttacker->GetPoint(POINT_HIT_PCT);
        int iChance = 0;
        if (pAttacker->GetPoint(POINT_HIT_PCT))
            iChance = rand() % pAttacker->GetPoint(POINT_HIT_PCT) + 1;

        if (iChance > blockperc)
        {
            SendDamagePacket(pAttacker, 0, DAMAGE_BLOCK);
            return false;
        }
    }

fakat karakter üzerindeki POINT_HIT_PCT yi bir türlü hesaplattıramadım fikri olan varmı yanlışım nerede ?
 
Çözüm
C++:
Genişlet Daralt Kopyala
    if (pAttacker->IsConquerorMap(pAttacker->GetMapIndex()) && pAttacker->IsPC())
    {
        const int skillLevel = MINMAX(0, pAttacker->GetSkillLevel(SKILL_HIT), SKILL_MAX_LEVEL);

        if (skillLevel < SKILL_MAX_LEVEL)
        {
            const int skillBlockReduce = aiSkillPrecision[skillLevel];
            const int hitPointBonus = pAttacker->GetPoint(POINT_HIT_PCT);

            const int baseBlockChance = 50;
            int finalBlockChance = baseBlockChance - skillBlockReduce - hitPointBonus;

            finalBlockChance = std::clamp(finalBlockChance, 0, 100);

            const int iChance = number(1, 100);
            if (iChance <= finalBlockChance)
            {
                SendDamagePacket(pAttacker, 0...
Hızlı bir cevap için yapay zekadan yardım aldım. Ne kadar doğru ne kadar yanlış bilemem.
POINT_HIT_PCT istatistiğini hesaba kattığınız blok mantığı şu anda hiç tetiklenmiyor; çünkü iChance’ı hâlihazırda yalnızca POINT_HIT_PCT kadar bir aralıkta (1…stat) üretiyorsunuz, ama blockperc stat+skillPrecision kadar büyük (ör. stat=10, skill=20 → blockperc=30). Yani iChance (en fazla 10) hiçbir zaman 30’u geçemiyor ve asla miss / blok tetiklenmiyor.


Bunu düzeltmek için iki temel yolu öneririm:
1. Rastgele Sayı Aralığını 1–100’e Çekmek:
cpp:
Genişlet Daralt Kopyala
if (pAttacker->IsConquerorMap(map) && pAttacker->IsPC())
{
    int skillPrecision = aiSkillPrecision[MINMAX(0, pAttacker->GetSkillLevel(SKILL_HIT), SKILL_MAX_LEVEL)];
    int statPrecision  = pAttacker->GetPoint(POINT_HIT_PCT);
    int blockPerc      = skillPrecision + statPrecision; // Örn. 20 + 10 = %30

    // 1-100 arasında rastgele sayı
    int roll = number(1, 100); // veya rand()%100 + 1

    // eğer roll ≤ blockPerc ise miss
    if (roll <= blockPerc)
    {
        SendDamagePacket(pAttacker, 0, DAMAGE_BLOCK);
        return false;
    }
}
  • Avantaj: Yüzde mantığı (%30 miss) direkt uygulanır.
  • Düzeltme: iChance yerine roll değişkeni her zaman 1–100 oluyor; böylece stat+skill kombinasyonu gerçek bir yüzdeye dönüşüyor.

    İkinci olarakta önerisi:

    2. Tek Bir Rastgele Aralık Kullanmak

    Eğer statPrecision ve skillPrecision’i aynı tabanda karşılaştırmak isterseniz, iChance’ı blockPerc’in üzerine kadar çekebilirsiniz:


  • cpp:
    Genişlet Daralt Kopyala
    int blockMax = skillPrecision + statPrecision; // Örn. 30
    int roll     = number(1, blockMax);             // 1…30 arasında
    
    // eğer roll ≤ skillPrecision ise miss (yalnızca skillPrecision kadar yani 20 seviye)
    if (roll <= skillPrecision)
    {
        SendDamagePacket(pAttacker, 0, DAMAGE_BLOCK);
        return false;
    }

    Burada statPrecision doğrudan rastgele aralığı büyütüyor; block şansını iki katmanlı kontrolle modüle edebiliyorsunuz.


    İşine yararsa ne mutlu :)
 
C++:
Genişlet Daralt Kopyala
    if (pAttacker->IsConquerorMap(pAttacker->GetMapIndex()) && pAttacker->IsPC())
    {
        const int skillLevel = MINMAX(0, pAttacker->GetSkillLevel(SKILL_HIT), SKILL_MAX_LEVEL);

        if (skillLevel < SKILL_MAX_LEVEL)
        {
            const int skillBlockReduce = aiSkillPrecision[skillLevel];
            const int hitPointBonus = pAttacker->GetPoint(POINT_HIT_PCT);

            const int baseBlockChance = 50;
            int finalBlockChance = baseBlockChance - skillBlockReduce - hitPointBonus;

            finalBlockChance = std::clamp(finalBlockChance, 0, 100);

            const int iChance = number(1, 100);
            if (iChance <= finalBlockChance)
            {
                SendDamagePacket(pAttacker, 0, DAMAGE_BLOCK);
                return false;
            }
        }

    }

bu haliyle tam istediğim gibi oldu teşekkür ederim :)
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst