Çözüldü ClearAttribute Fonksiyonu son efson kaldırma düzenlemesi

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

asilords

MT Üye
MT Üye
Mesaj
470
Çözümler
18
Beğeni
134
Puan
749
Ticaret Puanı
0
Merhaba void CItem::ClearAttribute() Fonksiyonunu sadece son efsunu kaldırmak için nasıl düzenleyebilirim. Örn. 5 varsa 4e düşürücek sonuncuyu silecek. 4 efsun varsa 3'e düşürecek.

a:
Genişlet Daralt Kopyala
void CItem::ClearAttribute()
{
    for (int i = 0; i < MAX_NORM_ATTR_NUM; ++i)
    {
        m_aAttr[i].bType = 0;
        m_aAttr[i].sValue = 0;
    }
}

Bu efsun eklemek için kod:

b:
Genişlet Daralt Kopyala
item2->SetForceAttribute(item2->GetAttributeCount(), type, value);
 
Çözüm
yeni ClearLastAttribute fonksiyonu ekledim şu şekilde kodladım çalışıyor
UpdatePacket ve save de gerekiyormuş farklı kodlardan baktım
@Kaiser üstad çalışıyor ama sıkıntı görüyormusun ?

1:
Genişlet Daralt Kopyala
void CItem::ClearLastAttribute()
{
    int i = GetAttributeCount() - 1;

    m_aAttr[i].bType = 0;
    m_aAttr[i].sValue = 0;

    UpdatePacket();
    Save();
}
Kullanım senaryosuna göre sorunsuz çalışabilir evet.
Aşağıdaki halinde kullanman daha iyi olur;
C++:
Genişlet Daralt Kopyala
void CItem::ClearLastAttribute()
{
    int i = GetAttributeCount() - 1;
    
    if (m_aAttr[i].bType != 0) // her ihtimale karşı
    {
        m_aAttr[i].bType = 0;
        m_aAttr[i].sValue = 0;
        UpdatePacket();
        Save();
    }
}
Güvenli ve esnek bir yaklaşım için aşağıdaki gibi yapabilirsin:
.h dosyasında ClearAttribute fonksiyonuna aşağıdaki şekilde bir argüman ekle.
C++:
Genişlet Daralt Kopyala
void ClearAttribute(bool lastAttr = false) // = false olmak zorunda

Sonra fonksiyonu değiştir:
C++:
Genişlet Daralt Kopyala
void CItem::ClearAttribute(bool lastAttr)
{
    if (lastAttr)
    {
        /*
        for (int i = MAX_NORM_ATTR_NUM - 1; i >= 0; --i)
        {
            if (m_aAttr[i].bType != 0)
            {
                m_aAttr[i].bType = 0;
                m_aAttr[i].sValue = 0;
                break;
            }
        }
        */
        // Üstteki for daha güvenli, amacına göre ikisini dene
        // For'u kullanacaksan alttaki iki satırı sil
        m_aAttr[MAX_NORM_ATTR_NUM - 1].bType = 0;
        m_aAttr[MAX_NORM_ATTR_NUM - 1].sValue = 0;
    }
    else
    {
        for (int i = 0; i < MAX_NORM_ATTR_NUM; ++i)
        {
            m_aAttr[i].bType = 0;
            m_aAttr[i].sValue = 0;
        }
    }
}
Son elemanı silmesi için her nereden çağrı yapacaksan oradaki çağrıyı da şu şekilde değiştir;
C++:
Genişlet Daralt Kopyala
ClearAttribute(true);
 
Güvenli ve esnek bir yaklaşım için aşağıdaki gibi yapabilirsin:
.h dosyasında ClearAttribute fonksiyonuna aşağıdaki şekilde bir argüman ekle.
C++:
Genişlet Daralt Kopyala
void ClearAttribute(bool lastAttr = false) // = false olmak zorunda

Sonra fonksiyonu değiştir:
C++:
Genişlet Daralt Kopyala
void CItem::ClearAttribute(bool lastAttr)
{
    if (lastAttr)
    {
        /*
        for (int i = MAX_NORM_ATTR_NUM - 1; i >= 0; --i)
        {
            if (m_aAttr[i].bType != 0)
            {
                m_aAttr[i].bType = 0;
                m_aAttr[i].sValue = 0;
                break;
            }
        }
        */
        // Üstteki for daha güvenli, amacına göre ikisini dene
        // For'u kullanacaksan alttaki iki satırı sil
        m_aAttr[MAX_NORM_ATTR_NUM - 1].bType = 0;
        m_aAttr[MAX_NORM_ATTR_NUM - 1].sValue = 0;
    }
    else
    {
        for (int i = 0; i < MAX_NORM_ATTR_NUM; ++i)
        {
            m_aAttr[i].bType = 0;
            m_aAttr[i].sValue = 0;
        }
    }
}
Son elemanı silmesi için her nereden çağrı yapacaksan oradaki çağrıyı da şu şekilde değiştir;
C++:
Genişlet Daralt Kopyala
ClearAttribute(true);

Yanıtladıgınızdan bu yana tüm alternatifleri deniyorum çalışmıyor fonksiyonlar onu geçtim kendi orijinal ClearAttribute() fonksiyonuda çalışmıyor
 
yeni ClearLastAttribute fonksiyonu ekledim şu şekilde kodladım çalışıyor
UpdatePacket ve save de gerekiyormuş farklı kodlardan baktım
@Kaiser üstad çalışıyor ama sıkıntı görüyormusun ?

1:
Genişlet Daralt Kopyala
void CItem::ClearLastAttribute()
{
    int i = GetAttributeCount() - 1;

    m_aAttr[i].bType = 0;
    m_aAttr[i].sValue = 0;

    UpdatePacket();
    Save();
}
 
UpdatePacket sunucuyu ne kadar yorar bilmiyorum ama Save'i böyle sıkça kullanılabilecek fonksiyonlarda çağırmamalısın.

Bu mantıklıymış:
C++:
Genişlet Daralt Kopyala
int i = GetAttributeCount() - 1;
ama Kaiser'in sunduğu çözüm de mantıken aynı şey. Döngüyü son elemandan başlatıp bir kere çalışınca kırmak.

Doğru şekilde test etmemiş olabilirsin
 
Bu arada ClearAttribute ne zaman çalışıyordu? Ne için kullanılıyor? Oynarken hiç görmedim efsun eksilten bir şeyi. Acaba gelmemesi gereken bir efsun geldiğinde silmek için mi kullanılıyordu?
 
Bu arada ClearAttribute ne zaman çalışıyordu? Ne için kullanılıyor? Oynarken hiç görmedim efsun eksilten bir şeyi. Acaba gelmemesi gereken bir efsun geldiğinde silmek için mi kullanılıyordu?
Efsun nesnesi için kullanılmış, ChangeAttribute fonsiyonu içine ClearAttribute eklemişler tüm efsunları kaldırıp tekrardan yenilerini ekliyor bir nevi değiştirme. Save'i her Arttıröma kağıdı ile yeni efsun eklendiğinde çalışıyor bşley olacağını sanmıyorum.
 
yeni ClearLastAttribute fonksiyonu ekledim şu şekilde kodladım çalışıyor
UpdatePacket ve save de gerekiyormuş farklı kodlardan baktım
@Kaiser üstad çalışıyor ama sıkıntı görüyormusun ?

1:
Genişlet Daralt Kopyala
void CItem::ClearLastAttribute()
{
    int i = GetAttributeCount() - 1;

    m_aAttr[i].bType = 0;
    m_aAttr[i].sValue = 0;

    UpdatePacket();
    Save();
}
Kullanım senaryosuna göre sorunsuz çalışabilir evet.
Aşağıdaki halinde kullanman daha iyi olur;
C++:
Genişlet Daralt Kopyala
void CItem::ClearLastAttribute()
{
    int i = GetAttributeCount() - 1;
    
    if (m_aAttr[i].bType != 0) // her ihtimale karşı
    {
        m_aAttr[i].bType = 0;
        m_aAttr[i].sValue = 0;
        UpdatePacket();
        Save();
    }
}
 
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst