Çözüldü 6-7. efsunların sabit gelme problemi

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

DeadLyEscaPe

Üye
Üye
Mesaj
441
Çözümler
28
Beğeni
106
Puan
474
Ticaret Puanı
0
Merhabalar, 6-7. efsunları değiştirirken level5 oranındaki en son yüksek seviye olan değerler geliyor. 1-5 efsun aralığındaki mantık gibi çalışmıyor. Game source kısmına biraz baktım fakat çözemedim. Fikri olanlar yorum bırakırsa sevinirim.

Adsız.png
 
Çözüm
Böyle kullanmıştım ben deneyip kendine göre düzenleyebilirsin. Farklı çözümlerde belki vardır.
item_attribute.cpp:
Genişlet Daralt Kopyala
bool CItem::AddRareAttribute()
{
    int count = GetRareAttrCount();

    if (count >= ITEM_ATTRIBUTE_RARE_NUM)
        return false;

    int pos = count + ITEM_ATTRIBUTE_RARE_START;
    TPlayerItemAttribute & attr = m_aAttr[pos];

    int nAttrSet = GetAttributeSetIndex();
    std::vector<int> avail;

    for (int i = 0; i < MAX_APPLY_NUM; ++i)
    {
        const TItemAttrTable & r = g_map_itemRare[i];

        if (r.dwApplyIndex != 0 && r.bMaxLevelBySet[nAttrSet] > 0 && HasRareAttr(i) != true)
        {
            avail.push_back(i);
        }
    }

    const TItemAttrTable& r = g_map_itemRare[avail[number(0, avail.size() - 1)]];
    int...
Böyle kullanmıştım ben deneyip kendine göre düzenleyebilirsin. Farklı çözümlerde belki vardır.
item_attribute.cpp:
Genişlet Daralt Kopyala
bool CItem::AddRareAttribute()
{
    int count = GetRareAttrCount();

    if (count >= ITEM_ATTRIBUTE_RARE_NUM)
        return false;

    int pos = count + ITEM_ATTRIBUTE_RARE_START;
    TPlayerItemAttribute & attr = m_aAttr[pos];

    int nAttrSet = GetAttributeSetIndex();
    std::vector<int> avail;

    for (int i = 0; i < MAX_APPLY_NUM; ++i)
    {
        const TItemAttrTable & r = g_map_itemRare[i];

        if (r.dwApplyIndex != 0 && r.bMaxLevelBySet[nAttrSet] > 0 && HasRareAttr(i) != true)
        {
            avail.push_back(i);
        }
    }

    const TItemAttrTable& r = g_map_itemRare[avail[number(0, avail.size() - 1)]];
    int nAttrLevel = number(1, 5);
    int randomChance = number(0, 100);

    if (randomChance < 1) // 20% Chance to get max lvl attr
        nAttrLevel = 5;
    else if (randomChance < 1) // 20% chance to get max lvl attr
        nAttrLevel = 4;
    else if (randomChance < 20) // 20% chance to get max lvl attr
        nAttrLevel = 3;
    else if (randomChance < 40) // 20% chance to get max lvl attr
        nAttrLevel = 2;
    else if (randomChance < 60) // 20% chance to get max lvl attr
        nAttrLevel = 1;

    if (nAttrLevel > r.bMaxLevelBySet[nAttrSet])
        nAttrLevel = r.bMaxLevelBySet[nAttrSet];

    attr.bType = r.dwApplyIndex;
    attr.sValue = r.lValues[nAttrLevel - 1];

    UpdatePacket();

    Save();

    const char * pszIP = NULL;

    if (GetOwner() && GetOwner()->GetDesc())
        pszIP = GetOwner()->GetDesc()->GetHostName();

    LOG_LEVEL_CHECK(LOG_LEVEL_MAX, LogManager::instance().ItemLog(pos, attr.bType, attr.sValue, GetID(), "SET_RARE", "", pszIP ? pszIP : "", GetOriginalVnum()));
    return true;
}
 
Çözüm
Böyle kullanmıştım ben deneyip kendine göre düzenleyebilirsin. Farklı çözümlerde belki vardır.
item_attribute.cpp:
Genişlet Daralt Kopyala
bool CItem::AddRareAttribute()
{
    int count = GetRareAttrCount();

    if (count >= ITEM_ATTRIBUTE_RARE_NUM)
        return false;

    int pos = count + ITEM_ATTRIBUTE_RARE_START;
    TPlayerItemAttribute & attr = m_aAttr[pos];

    int nAttrSet = GetAttributeSetIndex();
    std::vector<int> avail;

    for (int i = 0; i < MAX_APPLY_NUM; ++i)
    {
        const TItemAttrTable & r = g_map_itemRare[i];

        if (r.dwApplyIndex != 0 && r.bMaxLevelBySet[nAttrSet] > 0 && HasRareAttr(i) != true)
        {
            avail.push_back(i);
        }
    }

    const TItemAttrTable& r = g_map_itemRare[avail[number(0, avail.size() - 1)]];
    int nAttrLevel = number(1, 5);
    int randomChance = number(0, 100);

    if (randomChance < 1) // 20% Chance to get max lvl attr
        nAttrLevel = 5;
    else if (randomChance < 1) // 20% chance to get max lvl attr
        nAttrLevel = 4;
    else if (randomChance < 20) // 20% chance to get max lvl attr
        nAttrLevel = 3;
    else if (randomChance < 40) // 20% chance to get max lvl attr
        nAttrLevel = 2;
    else if (randomChance < 60) // 20% chance to get max lvl attr
        nAttrLevel = 1;

    if (nAttrLevel > r.bMaxLevelBySet[nAttrSet])
        nAttrLevel = r.bMaxLevelBySet[nAttrSet];

    attr.bType = r.dwApplyIndex;
    attr.sValue = r.lValues[nAttrLevel - 1];

    UpdatePacket();

    Save();

    const char * pszIP = NULL;

    if (GetOwner() && GetOwner()->GetDesc())
        pszIP = GetOwner()->GetDesc()->GetHostName();

    LOG_LEVEL_CHECK(LOG_LEVEL_MAX, LogManager::instance().ItemLog(pos, attr.bType, attr.sValue, GetID(), "SET_RARE", "", pszIP ? pszIP : "", GetOriginalVnum()));
    return true;
}

Kendime uyarlayıp kullanıyorum, çok teşekkürler.
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst