[C++] İstediğiniz İteme +Basınca Duyuru

H4ZEJ

Üye
Üye
Mesaj
113
Çözümler
3
Beğeni
77
Puan
724
Ticaret Puanı
0
unknown.png


Sistemi yabancı bi forumda gördüm paylaşmak istedim bir iki sorunu var anlayan arkadaşlar yardımcı olursa onlarıda halledebiliriz.

Sistemin tek sıkıntısı /n kısmında efsun değerlerini göstermesi ve break komutu eklememize rağmen 2. sıradan itibaren itemler kaçıncı sıradaysa o kadar duyuru atıyor.

char item ara

C++:
            ITEM_MANAGER::instance().RemoveItem(item, "REMOVE (REFINE SUCCESS)");

Bu koddan 2 tane bulunmakta 2sinede eklemeniz gerekiyor

altına ekle

C++:
int m_nTableMin[] = {268, 238, 228, 218, 181, 191};
int m_nTableMax[] = {269, 239, 229, 219, 189, 199};  

for (int i = 0; i < _countof(m_nTableMin); i++){
    for (int j = 0; j < _countof(m_nTableMax); j++){
        if (m_nTableMin[i] <= pkNewItem->GetVnum() && pkNewItem->GetVnum() <= m_nTableMax[j]){
            char buf[1024];
            char itemlink[256];
            int len;

            len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x",
                    pkNewItem->GetVnum(), pkNewItem->GetFlag(),
                    pkNewItem->GetSocket(0), pkNewItem->GetSocket(1), pkNewItem->GetSocket(2));

            for (int i = 0; i < ITEM_ATTRIBUTE_MAX_NUM; ++i)
                if (pkNewItem->GetAttributeType(i) != 0){
                    len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d",
                            pkNewItem->GetAttributeType(i), pkNewItem->GetAttributeValue(i));
                }

            snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pkNewItem->GetName());
            break;

            char szUpgradeAnnouncement[QUERY_MAX_LEN];
            snprintf(szUpgradeAnnouncement, sizeof(szUpgradeAnnouncement), "[CH%d]: [%s] İtemini Başarıyla Geliştirdi!! %s ", g_bChannel, GetName(), buf);
            BroadcastNotice(szUpgradeAnnouncement);
            break;
        }
    }
}
 
En son bir moderatör tarafından düzenlenmiş:
Güzel bir sistem nadir itemleri +9 yapınca duyuru geçmesi hoş olur.
Yine Allods Online diyeceğim bana kızacaksın ama oyunda da epik item yapınca dünyadan duyuru geçiyordu. :D Metin2 içinde böyle bir düzenleme olması gayet iyi olmuş bence. :)
 
Sistem çok iyi bende yabancı bir forumda görmüştüm gerçekten başarılı ama gelişmesi gerekiyor.
 
konuda da belirttiğim gibi fazladan duyuru yapıyor ve /n den duyuru yaptığı için ekranın yukarısında çıkan siyah yazıda sanırsam efsun değerleri olan sayıları yazıyor bunların yazmaması ve itemin 1 kere duyuru yapması gerekiyor
 
/n ile gözükmeyebilir. Duyuruyu normal chatten geçirsek daha iyi olur sanki
 
Sorun düzeltilemedimi
C++ bilgim yok fakat inceleyince şöyle bir sorun keşfettim fazladan duyuru atmasını engeller mi bilmiyorum denemedim sadece hatanın orada olduğunu düşünüyorum ve bu şekilde düzeleceğini düşünüyorum.

İç içe olan döngünün içindeki ikinci break, ilk break ifadesinden hemen sonra geliyo, bu yüzden ilk break ifadesi çalıştıktan sonra iç döngüden çıkıyo ve dış döngüye devam ediyo. Ama dış döngüden çıkılmadan önce 'BroadcastNotice' fonksiyonu çağırıldığı için her adımda duyuru yapıyor. İç döngünün tamamını if blokunun içine koyarsak dış döngüden çıkmadan önce break ifadesini kullanabiliriz yani:

C++:
int m_nTableMin[] = {268, 238, 228, 218, 181, 191};
int m_nTableMax[] = {269, 239, 229, 219, 189, 199}; 

for (int i = 0; i < _countof(m_nTableMin); i++){
    for (int j = 0; j < _countof(m_nTableMax); j++){
        if (m_nTableMin[i] <= pkNewItem->GetVnum() && pkNewItem->GetVnum() <= m_nTableMax[j]){
            char buf[1024];
            char itemlink[256];
            int len;

            len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x",
                    pkNewItem->GetVnum(), pkNewItem->GetFlag(),
                    pkNewItem->GetSocket(0), pkNewItem->GetSocket(1), pkNewItem->GetSocket(2));

            for (int i = 0; i < ITEM_ATTRIBUTE_MAX_NUM; ++i)
                if (pkNewItem->GetAttributeType(i) != 0){
                    len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d",
                            pkNewItem->GetAttributeType(i), pkNewItem->GetAttributeValue(i));
                }

            snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pkNewItem->GetName());

            char szUpgradeAnnouncement[QUERY_MAX_LEN];
            snprintf(szUpgradeAnnouncement, sizeof(szUpgradeAnnouncement), "[CH%d]: [%s] İtemini Başarıyla Geliştirdi!! %s ", g_bChannel, GetName(), buf);
            BroadcastNotice(szUpgradeAnnouncement);
            break;
        }
    }
}

Şu şekilde çalışacağını düşünüyorum. C++ bilen arkadaşlarda bir bakabilir tabii dediğim gibi pek emin değilim ve denemedim.
 
C++ bilgim yok fakat inceleyince şöyle bir sorun keşfettim fazladan duyuru atmasını engeller mi bilmiyorum denemedim sadece hatanın orada olduğunu düşünüyorum ve bu şekilde düzeleceğini düşünüyorum.

İç içe olan döngünün içindeki ikinci break, ilk break ifadesinden hemen sonra geliyo, bu yüzden ilk break ifadesi çalıştıktan sonra iç döngüden çıkıyo ve dış döngüye devam ediyo. Ama dış döngüden çıkılmadan önce 'BroadcastNotice' fonksiyonu çağırıldığı için her adımda duyuru yapıyor. İç döngünün tamamını if blokunun içine koyarsak dış döngüden çıkmadan önce break ifadesini kullanabiliriz yani:

C++:
int m_nTableMin[] = {268, 238, 228, 218, 181, 191};
int m_nTableMax[] = {269, 239, 229, 219, 189, 199};

for (int i = 0; i < _countof(m_nTableMin); i++){
    for (int j = 0; j < _countof(m_nTableMax); j++){
        if (m_nTableMin[i] <= pkNewItem->GetVnum() && pkNewItem->GetVnum() <= m_nTableMax[j]){
            char buf[1024];
            char itemlink[256];
            int len;

            len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x",
                    pkNewItem->GetVnum(), pkNewItem->GetFlag(),
                    pkNewItem->GetSocket(0), pkNewItem->GetSocket(1), pkNewItem->GetSocket(2));

            for (int i = 0; i < ITEM_ATTRIBUTE_MAX_NUM; ++i)
                if (pkNewItem->GetAttributeType(i) != 0){
                    len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d",
                            pkNewItem->GetAttributeType(i), pkNewItem->GetAttributeValue(i));
                }

            snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pkNewItem->GetName());

            char szUpgradeAnnouncement[QUERY_MAX_LEN];
            snprintf(szUpgradeAnnouncement, sizeof(szUpgradeAnnouncement), "[CH%d]: [%s] İtemini Başarıyla Geliştirdi!! %s ", g_bChannel, GetName(), buf);
            BroadcastNotice(szUpgradeAnnouncement);
            break;
        }
    }
}

Şu şekilde çalışacağını düşünüyorum. C++ bilen arkadaşlarda bir bakabilir tabii dediğim gibi pek emin değilim ve denemedim.
bilgi için çok sağol bende tam anlamıyorum biri çözmüştür diye cnlandırım dedim konuyu
 
Düzeltilmiş versiyon(kontrol edin) lütfen:
int m_nTableMin[] = {268, 238, 228, 218, 181, 191};
int m_nTableMax[] = {269, 239, 229, 219, 189, 199};
bool upgraded = false;

for (int i = 0; i < _countof(m_nTableMin); i++) {
    for (int j = 0; j < _countof(m_nTableMax); j++) {
        if (m_nTableMin[i] <= pkNewItem->GetVnum() && pkNewItem->GetVnum() <= m_nTableMax[j]) {
            char buf[1024];
            char itemlink[256];
            int len;

            len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x",
                    pkNewItem->GetVnum(), pkNewItem->GetFlag(),
                    pkNewItem->GetSocket(0), pkNewItem->GetSocket(1), pkNewItem->GetSocket(2));

            for (int k = 0; k < ITEM_ATTRIBUTE_MAX_NUM; ++k) {
                if (pkNewItem->GetAttributeType(k) != 0) {
                    len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d",
                            pkNewItem->GetAttributeType(k), pkNewItem->GetAttributeValue(k));
                }
            }

            snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pkNewItem->GetName());

            upgraded = true;
        }
    }
}

if (upgraded) {
    char szUpgradeAnnouncement[QUERY_MAX_LEN];
    snprintf(szUpgradeAnnouncement, sizeof(szUpgradeAnnouncement), "[CH%d]: [%s] Itemini Başarıyla Geliştirdi!! %s ", g_bChannel, GetName(), buf);
    BroadcastNotice(szUpgradeAnnouncement);
}

Bu şekilde denediğinizde çalışabilir belki.
 
Düzeltilmiş versiyon(kontrol edin) lütfen:
int m_nTableMin[] = {268, 238, 228, 218, 181, 191};
int m_nTableMax[] = {269, 239, 229, 219, 189, 199};
bool upgraded = false;

for (int i = 0; i < _countof(m_nTableMin); i++) {
    for (int j = 0; j < _countof(m_nTableMax); j++) {
        if (m_nTableMin[i] <= pkNewItem->GetVnum() && pkNewItem->GetVnum() <= m_nTableMax[j]) {
            char buf[1024];
            char itemlink[256];
            int len;

            len = snprintf(itemlink, sizeof(itemlink), "item:%x:%x:%x:%x:%x",
                    pkNewItem->GetVnum(), pkNewItem->GetFlag(),
                    pkNewItem->GetSocket(0), pkNewItem->GetSocket(1), pkNewItem->GetSocket(2));

            for (int k = 0; k < ITEM_ATTRIBUTE_MAX_NUM; ++k) {
                if (pkNewItem->GetAttributeType(k) != 0) {
                    len += snprintf(itemlink + len, sizeof(itemlink) - len, ":%x:%d",
                            pkNewItem->GetAttributeType(k), pkNewItem->GetAttributeValue(k));
                }
            }

            snprintf(buf, sizeof(buf), "|cffffc700|H%s|h[%s]|h|r", itemlink, pkNewItem->GetName());

            upgraded = true;
        }
    }
}

if (upgraded) {
    char szUpgradeAnnouncement[QUERY_MAX_LEN];
    snprintf(szUpgradeAnnouncement, sizeof(szUpgradeAnnouncement), "[CH%d]: [%s] Itemini Başarıyla Geliştirdi!! %s ", g_bChannel, GetName(), buf);
    BroadcastNotice(szUpgradeAnnouncement);
}

Bu şekilde denediğinizde çalışabilir belki.
1677687364890.png

bu hatayı aldım
 
Geri
Üst