Levelli Pet Sistemi STR Fix

  • Konuyu açan Konuyu açan TheAdmin33
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 1
  • Gösterim Gösterim 52

TheAdmin33

Ah, bu şarkıların gözü kör olsun
Geliştirici
Yardımsever Üye
Usta Üye
Editör
Mesaj
1.507
Çözümler
84
Beğeni
6.869
Puan
2.859
Ticaret Puanı
0
Pet sistemi yazdım. Pet'e buff vermek için GetPoint kullanarak DEF ve STR değerlerini çekiyorum.Ancak çekilen değerler, "C" ekranında gösterilen değerlerle uyuşmuyor. Bunun sebebi, buff fonksiyonunda GetPoint(POINT_DEF_GRADE) ve GetPoint(POINT_ATT_GRADE) kullanılmasıdır.

Ve bu durum piyasadaki bir çok levelli pet sistemin bu şekilde. Bunun yerine, client source içerisindeki CPythonPlayer::__GetTotalAtk mantığını server tarafında da uygulayarak STR değerini doğru şekilde hesaplayabilir ve kullanabilirsiniz.

Kullanmak isteyen kendi pet sistemine uyarlayıp kullanabilir

pet_buff.cpp:
Genişlet Daralt Kopyala
void CNewPet::GiveBuff()
{
    if (!m_pkChar || !m_petItem)
        return;

    m_pkOwner->RemoveAffect(EPetConstants::PET_AFFECT_TYPE);

    // ---- ATTACK (like client) ----
    LPITEM weapon = m_pkOwner->GetWear(WEAR_WEAPON);
    int weaponMin = 0, weaponMax = 0, weaponBonus = 0;
    if (weapon && weapon->GetType() == ITEM_WEAPON)
    {
        weaponMin = weapon->GetValue(3);
        weaponMax = weapon->GetValue(4);
        weaponBonus = weapon->GetValue(5);
    }

    int raceStat = 0;
    switch (m_pkOwner->GetJob())
    {
        case JOB_WARRIOR:
        case JOB_SURA:
            raceStat = m_pkOwner->GetPoint(POINT_ST);
            break;
        case JOB_ASSASSIN:
            raceStat = m_pkOwner->GetPoint(POINT_DX);
            break;
        case JOB_SHAMAN:
            raceStat = m_pkOwner->GetPoint(POINT_IQ);
            break;
#ifdef ENABLE_WOLFMAN_CHARACTER
        case JOB_WOLFMAN:
            raceStat = m_pkOwner->GetPoint(POINT_DX);
            break;
#endif
        default:
            raceStat = m_pkOwner->GetPoint(POINT_ST);
            break;
    }

    int levelAtk = m_pkOwner->GetLevel() * 2;
    int statAtk = (4 * m_pkOwner->GetPoint(POINT_ST) + 2 * raceStat) / 3;
    int hitRateSrc = (m_pkOwner->GetPoint(POINT_DX) * 4 + m_pkOwner->GetLevel() * 2) / 6;
    int hitRate = 100 * (MIN(90, hitRateSrc) + 210) / 300;
    int weaponAtk = (((weaponMin + weaponMax) / 2) + weaponBonus) * 2;
    int attValue = levelAtk + (statAtk + weaponAtk) * hitRate / 100;

    attValue += m_pkOwner->GetPoint(POINT_ATT_GRADE_BONUS);

    // -----------------------------------------------

    int baseValues[3] =
    {
        m_pkOwner->GetMaxHP(),
        m_pkOwner->GetPoint(POINT_CLIENT_DEF_GRADE),
        attValue
    };

//    m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "MaxHP:%d ,Def:%d, Str:%d", baseValues[0], baseValues[1], baseValues[2]);
//    m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "MaxHP:%d ,Def:%d, Str:%d", m_pkOwner->GetMaxHP(), m_pkOwner->GetPoint(POINT_DEF_GRADE), m_pkOwner->GetPoint(POINT_ATT_GRADE));

    for (int i = 0; i < 3; ++i)
    {
        m_pkOwner->AddAffect(
            EPetConstants::PET_AFFECT_TYPE,
            aApplyInfo[petBonusType[i]].bPointType,
            static_cast<int>(baseValues[i] * m_bonus[i] / 1000),
            0,
            INFINITE_AFFECT_DURATION,
            0,
            false
        );
    }
}
 
Geri
Üst