Metin2 Exp Bug'u

  • Konuyu açan Konuyu açan TakographiC
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 4
  • Gösterim Gösterim 101

TakographiC

Oʏᴜɴ Gʀᴀғiᴋ Tᴀꜱᴀʀıᴍ Hiᴢᴍᴇᴛi
MT Üye
Mesaj
280
Çözümler
5
Beğeni
346
Puan
429
Ticaret Puanı
0


Herkese selam,
Geliştirmekte olduğumuz files'ımızı test ederken videoda yer alan bir bug gördük.
Bilindiği gibi metin2'de farm atarken ölündüğünde exp kaybetme cezası var.
Karakter 5-10 defa veya daha fazla'da olabilir öldüğünde Random exp değeri kaydediyor ve karakter çok saçma bir şekilde random level alıyor.

Kendimce bulduğum
ilk aklıma gelen çözüm karakter öldüğünde exp cezasını kapatmak oldu. Aklınızda farklı bir çözüm var ise görüşlerinize açığım.

Burayı görüntülemek için üye girişi yapmalı veya kayıt olmalısınız.

 
En son bir moderatör tarafından düzenlenmiş:
Log koyup sebep olan şeyi bulmak lazım. Naviden player expi unsigned yapmakta muhtemelen bu sorunu çözer ama temelinde başka bir sıkıntı var gibi
 
Log koyup sebep olan şeyi bulmak lazım. Naviden player expi unsigned yapmakta muhtemelen bu sorunu çözer ama temelinde başka bir sıkıntı var gibi
Ölüp yeniden doğduğunda exp kaybından kaynalı olduğunu düşündüğüm için yaptım aslında ama farklı çözümlerde deneyebiliriz dediğin gibi.​
 
Max karakterin sahip olduğu kadar kaybetmesini sağladığımızda çözülmüş olması gerekmekte, denersiniz.
C++:
Genişlet Daralt Kopyala
void CHARACTER::DeathPenalty(BYTE bTown)
{
    sys_log(1, "DEATH_PENALTY_CHECK(%s) town(%d)", GetName(), bTown);

    Cube_close(this);

#ifdef ENABLE_ACCE_COSTUME_SYSTEM
    CloseAcce();
#endif

    if (GetLevel() < 10)
    {
        sys_log(0, "NO_DEATH_PENALTY_LESS_LV10(%s)", GetName());
        ChatPacket(CHAT_TYPE_INFO, "[LS;901]");
        return;
    }

    if (number(0, 2))
    {
        sys_log(0, "NO_DEATH_PENALTY_LUCK(%s)", GetName());
        ChatPacket(CHAT_TYPE_INFO, "[LS;901]");
        return;
    }

    if (!IS_SET(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY))
        return;

    REMOVE_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY);

    // NO_DEATH_PENALTY_BUG_FIX
    if (!bTown)
    {
        if (FindAffect(AFFECT_NO_DEATH_PENALTY))
        {
            sys_log(0, "NO_DEATH_PENALTY_AFFECT(%s)", GetName());
            ChatPacket(CHAT_TYPE_INFO, "[LS;901]");
            RemoveAffect(AFFECT_NO_DEATH_PENALTY);
            return;
        }
    }
    // END_OF_NO_DEATH_PENALTY_BUG_FIX

    int iLoss = 0;

    if (!bTown)
    {
        const long long llNextExp = static_cast<long long>(GetNextExp());
        const int iLossPerc = __GetExpLossPerc(GetLevel());

        long long llLoss = (llNextExp * iLossPerc) / 100;

        if (llLoss > 800000)
            llLoss = 800000;

        if (llLoss < 0)
            llLoss = 0;

        iLoss = static_cast<int>(llLoss);

        if (IsEquipUniqueItem(UNIQUE_ITEM_TEARDROP_OF_GODNESS))
            iLoss /= 2;

        const int iCurExp = std::max(0, GetPoint(POINT_EXP));

        if (iLoss > iCurExp)
            iLoss = iCurExp;

        if (iLoss < 0)
            iLoss = 0;
    }

    sys_log(0, "DEATH_PENALTY(%s) EXP_LOSS: %d percent %d%% CUR_EXP: %d",
        GetName(),
        iLoss,
        __GetExpLossPerc(GetLevel()),
        GetPoint(POINT_EXP));

    if (iLoss > 0)
        PointChange(POINT_EXP, -iLoss, true);
}
 
Max karakterin sahip olduğu kadar kaybetmesini sağladığımızda çözülmüş olması gerekmekte, denersiniz.
C++:
Genişlet Daralt Kopyala
void CHARACTER::DeathPenalty(BYTE bTown)
{
    sys_log(1, "DEATH_PENALTY_CHECK(%s) town(%d)", GetName(), bTown);

    Cube_close(this);

#ifdef ENABLE_ACCE_COSTUME_SYSTEM
    CloseAcce();
#endif

    if (GetLevel() < 10)
    {
        sys_log(0, "NO_DEATH_PENALTY_LESS_LV10(%s)", GetName());
        ChatPacket(CHAT_TYPE_INFO, "[LS;901]");
        return;
    }

    if (number(0, 2))
    {
        sys_log(0, "NO_DEATH_PENALTY_LUCK(%s)", GetName());
        ChatPacket(CHAT_TYPE_INFO, "[LS;901]");
        return;
    }

    if (!IS_SET(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY))
        return;

    REMOVE_BIT(m_pointsInstant.instant_flag, INSTANT_FLAG_DEATH_PENALTY);

    // NO_DEATH_PENALTY_BUG_FIX
    if (!bTown)
    {
        if (FindAffect(AFFECT_NO_DEATH_PENALTY))
        {
            sys_log(0, "NO_DEATH_PENALTY_AFFECT(%s)", GetName());
            ChatPacket(CHAT_TYPE_INFO, "[LS;901]");
            RemoveAffect(AFFECT_NO_DEATH_PENALTY);
            return;
        }
    }
    // END_OF_NO_DEATH_PENALTY_BUG_FIX

    int iLoss = 0;

    if (!bTown)
    {
        const long long llNextExp = static_cast<long long>(GetNextExp());
        const int iLossPerc = __GetExpLossPerc(GetLevel());

        long long llLoss = (llNextExp * iLossPerc) / 100;

        if (llLoss > 800000)
            llLoss = 800000;

        if (llLoss < 0)
            llLoss = 0;

        iLoss = static_cast<int>(llLoss);

        if (IsEquipUniqueItem(UNIQUE_ITEM_TEARDROP_OF_GODNESS))
            iLoss /= 2;

        const int iCurExp = std::max(0, GetPoint(POINT_EXP));

        if (iLoss > iCurExp)
            iLoss = iCurExp;

        if (iLoss < 0)
            iLoss = 0;
    }

    sys_log(0, "DEATH_PENALTY(%s) EXP_LOSS: %d percent %d%% CUR_EXP: %d",
        GetName(),
        iLoss,
        __GetExpLossPerc(GetLevel()),
        GetPoint(POINT_EXP));

    if (iLoss > 0)
        PointChange(POINT_EXP, -iLoss, true);
}
Denemedim ama hiç kaybetmemesi daha iyi sanki, Yine de yorumun için teşekkür ederim. :)
 
Geri
Üst