Çözüldü point uyuşmazlığı

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

TheAdmin33

Ah, bu şarkıların gözü kör olsun
Geliştirici
Yardımsever Üye
Usta Üye
Editör
Mesaj
1.408
Çözümler
76
Beğeni
5.637
Puan
2.859
Ticaret Puanı
0
pet sistemi yazdım buff verirken GetPoint kullanarak Def ve Str değerlerini çekiyorum ama "C" ekranında gösterilenle uyuşmuyor ve absürt değerlerde buff veriyor.

Ekran Alıntısı.webp
Ekran Alıntısı2.webp

şu kodu kullanıyorum;
C++:
Genişlet Daralt Kopyala
void CNewPet::GiveBuff()
{
    if (!m_pkChar || !m_petItem)
        return;

    // Buff uygulanacak temel değerler
    int baseValues[3] =
    {
        m_pkOwner->GetMaxHP(),                        // Maksimum HP
        m_pkOwner->GetPoint(POINT_DEF_GRADE),        // Savunma değeri
        m_pkOwner->GetPoint(POINT_ATT_GRADE)        // Saldırı değeri
    };

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

    // Eski buff'ı kaldır
    m_pkOwner->RemoveAffect(EPetConstants::PET_AFFECT_TYPE);

    // Yeni buff'ları ekle
    for (int i = 0; i < 3; ++i)
    {
        m_pkOwner->AddAffect(
            EPetConstants::PET_AFFECT_TYPE,                            // Buff tipi
            aApplyInfo[petBonusType[i]].bPointType,                    // Buff'ın uygulanacağı özellik
            static_cast<int>(baseValues[i] * m_bonus[i] / 1000),    // Buff değeri
            0,                                                        //
            INFINITE_AFFECT_DURATION,                                // Sonsuz süre
            0,                                                        // Flag
            false                                                    // Overwrite (üzerine yazma)
        );
    }
}
 

Dosya Eklentileri

  • Ekran Alıntısı.webp
    Ekran Alıntısı.webp
    49,8 KB · Gösterim: 19
Çözüm
kullanmak isteyen kendi pet sistemine uyarlayıp kullanabilir.

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

    m_pkOwner->RemoveAffect(EPetConstants::PET_AFFECT_TYPE);

    // ---- ATTACK hesaplama (client ile birebir) ----
    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...
C++:
Genişlet Daralt Kopyala
void CNewPet::GiveBuff()
{
    [...]
    
    m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "MaxHP:%d ,Def:%d, Str:%d", baseValues[0], baseValues[1], baseValues[2]);

    m_pkOwner->RemoveAffect(EPetConstants::PET_AFFECT_TYPE);
    
    [...]
}

Burada bir sıralama hatası var gibi. Eski buff kaldırılmadan chate yazdırıyorsun, dolayısıyla "eğer varsa" bir önceki buff etkileri ile birlikte chate yazdırılıyor olabilir.

Aşağıdaki gibi düzenleyip tekrar dene:
C++:
Genişlet Daralt Kopyala
void CNewPet::GiveBuff()
{
    if (!m_pkChar || !m_petItem)
        return;
    
    // Eski buff'ı kaldır
    m_pkOwner->RemoveAffect(EPetConstants::PET_AFFECT_TYPE); // buraya taşındı

    [...]
    [...]
    
    // en sona taşındı
    m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "MaxHP:%d ,Def:%d, Str:%d", baseValues[0], baseValues[1], baseValues[2]);
}
 
C++:
Genişlet Daralt Kopyala
void CNewPet::GiveBuff()
{
    [...]
   
    m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "MaxHP:%d ,Def:%d, Str:%d", baseValues[0], baseValues[1], baseValues[2]);

    m_pkOwner->RemoveAffect(EPetConstants::PET_AFFECT_TYPE);
   
    [...]
}

Burada bir sıralama hatası var gibi. Eski buff kaldırılmadan chate yazdırıyorsun, dolayısıyla "eğer varsa" bir önceki buff etkileri ile birlikte chate yazdırılıyor olabilir.

Aşağıdaki gibi düzenleyip tekrar dene:
C++:
Genişlet Daralt Kopyala
void CNewPet::GiveBuff()
{
    if (!m_pkChar || !m_petItem)
        return;
   
    // Eski buff'ı kaldır
    m_pkOwner->RemoveAffect(EPetConstants::PET_AFFECT_TYPE); // buraya taşındı

    [...]
    [...]
   
    // en sona taşındı
    m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "MaxHP:%d ,Def:%d, Str:%d", baseValues[0], baseValues[1], baseValues[2]);
}
buff vermeden önceki değerleri kontrol etmek için onu ekledim. örnek olarak konudaki resimlere göz atabilirsiniz, o resimler pet çıkartılıp buffların temizlenmiş değerlerini içeriyor ve sunucu tarafıyla client tarafında uyuşmazlık var.
 
Pointler uyuşuyor mu peki kontrol ettiniz mi client ile sunucu, birde üstteki stat verilen kısımdaki değerleri mi çekmeye çalışıyorsunuz aşağıdaki hareket hızının olduğu kısımı mı?
 
Son düzenleme:
def bilgisine şu kodla ulaşabiliyorum;
C++:
Genişlet Daralt Kopyala
m_pkOwner->GetPoint(POINT_CLIENT_DEF_GRADE);

ama str değerine bir türlü ulaşamadım.
 
def __GetTotalAtkText(self):
minAtk=player.GetStatus(player.ATT_MIN)
maxAtk=player.GetStatus(player.ATT_MAX)
atkBonus=player.GetStatus(player.ATT_BONUS)
attackerBonus=player.GetStatus(player.ATTACKER_BONUS)
min = int(minAtk+atkBonus+attackerBonus)
max = int(maxAtk+atkBonus+attackerBonus)
if minAtk==maxAtk:
return "%s" % (localeInfo.NumberToString2(min))
else:
return "%s-%s" % (localeInfo.NumberToString2(min), localeInfo.NumberToString2(max)) böyle bir kodu var ama üstteki değerleri mi alttakileri mi almaya çalışıyoruz tam bilemedim
 
C++:
Genişlet Daralt Kopyala
void CNewPet::GiveBuff()
{
    if (!m_pkChar || !m_petItem)
        return;

    m_pkOwner->RemoveAffect(EPetConstants::PET_AFFECT_TYPE);

    int str = m_pkOwner->GetPoint(POINT_ST);
    int dex = m_pkOwner->GetPoint(POINT_DX);
    int con = m_pkOwner->GetPoint(POINT_HT);

    int def = (dex / 2) + (con / 2);
    int atk = (str * 2) + (dex / 4);
    int hp  = m_pkOwner->GetMaxHP();

    int baseValues[3] = { hp, def, atk };

    m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "HP:%d | Def:%d | Atk:%d", hp, def, atk);

    for (int i = 0; i < 3; ++i)
    {
        int apply = static_cast<int>(baseValues[i] * m_bonus[i] / 1000);
        m_pkOwner->AddAffect(
            EPetConstants::PET_AFFECT_TYPE,
            aApplyInfo[petBonusType[i]].bPointType,
            apply,
            0,
            INFINITE_AFFECT_DURATION,
            0,
            false
        );
    }
}
 
client source deki CPythonPlayer::__GetTotalAtk mantığını server tarafında da uyguladım artık str yide doğru bir şekilde çekebiliyorum.

not: Eğer ki min atk ve max atk varsa ortalamasını alıyor.

Ekran Alıntısı.webp
 
kullanmak isteyen kendi pet sistemine uyarlayıp kullanabilir.

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

    m_pkOwner->RemoveAffect(EPetConstants::PET_AFFECT_TYPE);

    // ---- ATTACK hesaplama (client ile birebir) ----
    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);

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

    // Buff uygulanacak temel değerler
    int baseValues[3] =
    {
        m_pkOwner->GetMaxHP(),                        // Maksimum HP
        m_pkOwner->GetPoint(POINT_CLIENT_DEF_GRADE),// Savunma değeri
        attValue                                    // Saldırı değeri
    };

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

    m_pkOwner->ChatPacket(CHAT_TYPE_INFO, "Str:%d", m_pkOwner->GetPoint(POINT_ATT_GRADE));

    // Yeni buff'ları ekle
    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
        );
    }
}
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst