Aksesuar Cevher Bonuslarının Gerçek Değerlerle Hesaplanmasını Sağlayan Düzeltme

Aethre

www.pvpers.gg
Katılım
19 Haz 2024
Konular
361
Mesajlar
437
Beğeniler
705
GG Coin
12,795
Ticaret Değeri - 0%
0   0   0
Discord
pvpers.gg
Aksesuar Cevher Bonuslarının Doğru Hesaplanmasını Sağlayan Fix

Metin2 kaynak dosyalarında, aksesuar sistemine entegre edilen cevherlerin sağladığı bonus değerleri teoride constants.cpp dosyasında tanımlanan aiAccessorySocketEffectivePct dizisine göre hesaplanmaktadır. Ancak pratikte sistem, bu oranlara tam anlamıyla uygun çalışmamakta ve oyuncuların beklentilerini karşılayamayan sonuçlar ortaya çıkmaktadır.

Bu paylaşımda, bu hesaplama hatasını düzelten bir fix yer almaktadır. Fix, hem sunucu tarafında (item.cpp) hem de istemci tarafında (uitooltip.py) gerekli düzenlemeleri içermektedir. Aşağıdaki düzenlemeler sayesinde, cevher bonuslarının doğru biçimde hesaplanması ve gösterimi sağlanır.

Düzenleme öncesi :


Düzenleme sonrası :


constants.cpp:
Kod:
const int aiAccessorySocketEffectivePct[ITEM_ACCESSORY_SOCKET_MAX_NUM + 1] ={0, 10, 20, 40};



item.cpp Fix:

Arat:​


Kod:
for (int i = 0; i < ITEM_APPLY_MAX_NUM; ++i){if (m_pProto->aApplies[i].bType == APPLY_NONE)continue;

long value = m_pProto->aApplies[i].lValue;

if (m_pProto->aApplies[i].bType == APPLY_SKILL)
{
    m_pOwner->ApplyPoint(m_pProto->aApplies[i].bType, bAdd ? value : value ^ 0x00800000);
}
else
{
    if (0 != accessoryGrade)
        value += MAX(accessoryGrade, value * aiAccessorySocketEffectivePct[accessoryGrade] / 100);

    m_pOwner->ApplyPoint(m_pProto->aApplies[i].bType, bAdd ? value : -value);
}


}

Değiştir:​


Kod:
for (int i = 0; i < ITEM_APPLY_MAX_NUM; ++i){const auto& apply = m_pProto->aApplies[i];

if (apply.bType == APPLY_NONE)
    continue;

long value = apply.lValue;

if (apply.bType == APPLY_SKILL)
{
    m_pOwner->ApplyPoint(apply.bType, bAdd ? value : value ^ 0x00800000);
}
else
{
    if (accessoryGrade > 0)
    {
        long totalBonus = 0;

        for (int j = 0; j < accessoryGrade; ++j)
        {
            totalBonus += MAX(1, value * aiAccessorySocketEffectivePct[j + 1] / 100);
        }
        value += totalBonus;
        m_pOwner->ApplyPoint(apply.bType, bAdd ? value : -value);
    }
}


}



uitooltip.py Fix:

Arat:​


Kod:
def __AppendAccessoryMetinSlotInfo(self, metinSlot, mtrlVnum):
ACCESSORY_SOCKET_MAX_SIZE = 3

cur=min(metinSlot[0], ACCESSORY_SOCKET_MAX_SIZE)
end=min(metinSlot[1], ACCESSORY_SOCKET_MAX_SIZE)

affectType1, affectValue1 = item.GetAffect(0)
affectList1=[0, max(1, affectValue1*10/100), max(2, affectValue1*20/100), max(3, affectValue1*40/100)]

affectType2, affectValue2 = item.GetAffect(1)
affectList2=[0, max(1, affectValue2*10/100), max(2, affectValue2*20/100), max(3, affectValue2*40/100)]

mtrlPos=0
mtrlList=[mtrlVnum]*cur+[player.METIN_SOCKET_TYPE_SILVER]*(end-cur)
for mtrl in mtrlList:
    affectString1 = self.__GetAffectString(affectType1, affectList1[mtrlPos+1]-affectList1[mtrlPos])        
    affectString2 = self.__GetAffectString(affectType2, affectList2[mtrlPos+1]-affectList2[mtrlPos])

    leftTime = 0
    if cur == mtrlPos+1:
        leftTime=metinSlot[2]

    self.__AppendMetinSlotInfo_AppendMetinSocketData(mtrlPos, mtrl, affectString1, affectString2, leftTime)
    mtrlPos+=1

Değiştir:​


Gizlenmiş içeriği görüntüleyebilmek için Giriş Yap ya da Kayıt Ol
Bu işlem, 15 saniyeden az sürer.



Bu düzenleme sayesinde hem görsel olarak gösterilen değerler daha tutarlı hale gelir, hem de sunucu tarafındaki uygulama oyunculara adil bir deneyim sunar. Özellikle cevher sistemiyle uğraşan geliştiriciler için önemli bir iyileştirmedir.
 
Geri
Üst Alt