Efsun Güncelleme Sistemi

  • Konuyu açan Konuyu açan TheAdmin33
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 15
  • Gösterim Gösterim 416

TheAdmin33

Ah, bu şarkıların gözü kör olsun
Geliştirici
Yardımsever Üye
Usta Üye
Editör
Mesaj
1.132
Çözümler
61
Beğeni
3.306
Puan
1.859
Ticaret Puanı
0
Mevcut efsunun değerini değişririr.

Ekran Alıntısı.webp




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


Vt;
Linkleri görebilmek için giriş yap veya kayıt ol.
 
Son düzenleme:
Ellerine Sağlık bi kodlara bakayım dedim şurası dikkatimi çekti.

2.webp


kırmızı yerleri sil çünkü o koşulu karşılamamışsan zaten başarmışsın demektir. Ve bir de eğer GetValue’nin alacağı değer aralığını biliyorsan buna bağladığın değişkenin veri tipini (derleyicinin) otomatik seçmesi için auto değilde ona uygun veri tipi seçmek belleği optimize etmektir. Çünkü eğer GetValue bir tam sayı döndürecekse derleyici bu değişkenin veri tipini int olarak tanımlar çünkü sen bunu derleyiciye bıraktın ve literalde tam sayı varsayılan olarak int’dir.

Örnek ;

auto a = 5;

Derleyicinin tanımladığı

int a = 5;
 
Son düzenleme:
Ellerine Sağlık bi kodlara bakayım dedim şurası dikkatimi çekti.

20760 eklentisini görüntüle

kırmızı yerleri sil çünkü o koşulu karşılamamışsan zaten başarmışsın demektir. Ve bir de eğer GetValue’nin alacağı değer aralığını biliyorsan buna bağladığın değişkenin veri tipini (derleyicinin) otomatik seçmesi için auto değilde ona uygun veri tipi seçmek belleği optimize etmektir. Çünkü eğer GetValue bir tam sayı döndürecekse derleyici bu değişkenin veri tipini int olarak tanımlar çünkü sen bunu derleyiciye bıraktın ve literalde tam sayı varsayılan olarak int’dir.

Örnek ;

auto a = 5;

Derleyicinin tanımladığı

int a = 5;
düzelttim.
 
Ellerine Sağlık bi kodlara bakayım dedim şurası dikkatimi çekti.

20760 eklentisini görüntüle

kırmızı yerleri sil çünkü o koşulu karşılamamışsan zaten başarmışsın demektir. Ve bir de eğer GetValue’nin alacağı değer aralığını biliyorsan buna bağladığın değişkenin veri tipini (derleyicinin) otomatik seçmesi için auto değilde ona uygun veri tipi seçmek belleği optimize etmektir. Çünkü eğer GetValue bir tam sayı döndürecekse derleyici bu değişkenin veri tipini int olarak tanımlar çünkü sen bunu derleyiciye bıraktın ve literalde tam sayı varsayılan olarak int’dir.

Örnek ;

auto a = 5;

Derleyicinin tanımladığı

int a = 5;
auto yada int demek optimizasyon anlamında bir şey değiştirir mi emin değilim, değer zaten initilize edilirken alacağı değere göre compiler int olarak tanımlar, runtime da birebir aynı şey olur
 
auto yada int demek optimizasyon anlamında bir şey değiştirir mi emin değilim, değer zaten initilize edilirken alacağı değere göre compiler int olarak tanımlar, runtime da birebir aynı şey olur
Sana şöyle açıklayayım diyelim benim evime 3 arkadaşım gelecek ve ben anneme gidip diyorum ki anne benim 3 arkadaşım gelecek ve bunlar toplamda 3 m2 yer kaplar sen ona göre yer ayarla. Sonra arkadaşlarım geliyor bakıyorum annem evimiz toplamda 10 m2 olmasına ragmen 9 m2’sini bu arkadaşlarıma ayırmış. Akşam oldu eve babam geldi diğer kardeşlerim geldi babaannem ve dedem geldi sonra bi sallantı oldu baktık ki ev başımıza yıkılıyor. Ama annem gidip 9 m2 değil de 4 m2 yer ayırsaydı o eve hepimiz sığacaktık. Ev (bellek) yönetimi de bu şekilde optimize(en verimli şekilde) etmiş veya kullanmış olacaktık. (Örnek sadece anlamlandırmak için)
 
Sana şöyle açıklayayım diyelim benim evime 3 arkadaşım gelecek ve ben anneme gidip diyorum ki anne benim 3 arkadaşım gelecek ve bunlar toplamda 3 m2 yer kaplar sen ona göre yer ayarla. Sonra arkadaşlarım geliyor bakıyorum annem evimiz toplamda 10 m2 olmasına ragmen 9 m2’sini bu arkadaşlarıma ayırmış. Akşam oldu eve babam geldi diğer kardeşlerim geldi babaannem ve dedem geldi sonra bi sallantı oldu baktık ki ev başımıza yıkılıyor. Ama annem gidip 9 m2 değil de 4 m2 yer ayırsaydı o eve hepimiz sığacaktık. Ev (bellek) yönetimi de bu şekilde optimize(en verimli şekilde) etmiş veya kullanmış olacaktık. (Örnek sadece anlamlandırmak için)
Anlatımına hayran kaldım 😂
 
Sana şöyle açıklayayım diyelim benim evime 3 arkadaşım gelecek ve ben anneme gidip diyorum ki anne benim 3 arkadaşım gelecek ve bunlar toplamda 3 m2 yer kaplar sen ona göre yer ayarla. Sonra arkadaşlarım geliyor bakıyorum annem evimiz toplamda 10 m2 olmasına ragmen 9 m2’sini bu arkadaşlarıma ayırmış. Akşam oldu eve babam geldi diğer kardeşlerim geldi babaannem ve dedem geldi sonra bi sallantı oldu baktık ki ev başımıza yıkılıyor. Ama annem gidip 9 m2 değil de 4 m2 yer ayırsaydı o eve hepimiz sığacaktık. Ev (bellek) yönetimi de bu şekilde optimize(en verimli şekilde) etmiş veya kullanmış olacaktık. (Örnek sadece anlamlandırmak için)
kral bu verdiğin örnek anca db de kolon tanımlarken 3 karakter uzunluğa sahip veri için 50 karakter kolon tanımlarsan olur o da hem diski hem memory’i etkiler auto yada int kullanmanın bunla bir alakası olmaması gerekli runtime da birebir aynıdır compile ederken zaten int’e çevirir runtime da memory açısından bir fark oluşturmaz
 
kral bu verdiğin örnek anca db de kolon tanımlarken 3 karakter uzunluğa sahip veri için 50 karakter kolon tanımlarsan olur o da hem diski hem memory’i etkiler auto yada int kullanmanın bunla bir alakası olmaması gerekli runtime da birebir aynıdır compile ederken zaten int’e çevirir runtime da memory açısından bir fark oluşturmaz
Kanka ben anlatamadım sanırım. Varsayım yapıyorum şimdi

auto a = number(0, 100);

a değişkeni için bellekte 4 bytelık yer tahsisi edilecek. Çünkü a değişkeni tam sayı döndüreceği için int tanımlanacak. Ama sen a değişkenin apaçık ne döndüreceğini bilirsen bellekte hayvan gibi yer tahsis etmezsin 1 bytelık yer tahsis edersin.

Örnek

uint8_t a = number(0, 100); —-> 1 byte
int a = number(0, 100); ——> 4 byte

numberin a değişkenine hangi sonucu vereceğinin bir önemi yok sen a değişkeni için bellekte veri tipinin aralığı kadar yer tahsis etmiş oluyorsun.
 
Son düzenleme:
Kanka ben anlatamadım sanırım. Varsayım yapıyorum şimdi

auto a = number(0, 100);

a değişkeni için bellekte 4 bytelık yer tahsisi edilecek. Çünkü a değişkeni tam sayı döndüreceği için int tanımlanacak. Ama sen a değişkenin apaçık ne döndüreceğini bilirsen bellekte hayvan gibi yer tahsis etmezsin 1 bytelık yer tahsis edersin.

Örnek

uint8_t a = number(0, 100); —-> 1 byte
int a = number(0, 100); ——> 4 byte
heh tamam bu dediğin case için doğru, ben auto yerine int yazmalısın olarak anladım öneriyi
 
Konu için teşekkürler, ufak bir vaktim vardı yorumları da okuyunca kodlara göz atmak istedim, yapay zeka çok iyi bir teknoloji yeni fikirleri uygularken kesinlikle yardım alın tabii ki fakat Metin2 gibi çok kompleks kod tabanları için şuan ki modeller hala yetersiz dolayısıyla hatalı/eksik kod yazma ihtimalleri hala çok yüksek, bunu mutlaka göz önünde bulundurun derim. Son olarak madem böyle bir paylaşım yapmışsınız katkım olsun.

- Eksik kontrolleri ekledim.
- Bağışıklılık, Ortalama Zarar, Beceri Hasarı gibi efsunlarda kullanılmasını engelledim.
- Sadece iç itemler, zırh ve silahlarda kullanılabilecek şekilde düzenledim.
- Tabii kodları da biraz düzenledim.

NOT:
Test etmedim, muhtemelen sorun çıkmaz ama olur da çıkarsa yazarsınız.

item.h:
Genişlet Daralt Kopyala
//Arat;

    public:
        void        SetForceAttribute(int i, BYTE bType, short sValue);


//Degistir;

    public:
        void        SetForceAttribute (int i, BYTE bType, short sValue);
        #ifdef ENABLE_CHANGE_ATTRIBUTE_LEVEL
        bool        ChangeAttributeLevel (BYTE index);
        #endif //ENABLE_CHANGE_ATTRIBUTE_LEVEL

char_item.cpp:
Genişlet Daralt Kopyala
//Arat;

                                    else if (item->GetVnum() == 76014)
                                    {
                                        int aiChangeProb[ITEM_ATTRIBUTE_MAX_LEVEL] =
                                        {
                                            0, 10, 50, 39, 1
                                        };

                                        item2->ChangeAttribute(aiChangeProb);
                                    }


//Hemen Altına ekle;

                                    #ifdef ENABLE_CHANGE_ATTRIBUTE_LEVEL
                                    else if (item->GetVnum() >= 71220 && item->GetVnum() <= 71226)
                                    {
                                        if ((item2->GetType() == ITEM_WEAPON) || (item2->GetType() == ITEM_ARMOR))  // Sadece belirli itemlerde kullanilabilir. - [MT2Dev]
                                        {
                                            BYTE attributeIndex = item->GetValue (0);
                                            if (!item2->ChangeAttributeLevel (attributeIndex))
                                            {
                                                // Detaylandirilmis ChatPacket. - [MT2Dev]
                                                ChatPacket (CHAT_TYPE_INFO, "%d . Efsun degistirilemez!", attributeIndex);
                                                return false;  // Return false olmalıydı Otosan'ın gururu @okan4141 a tesekkuru borc bilirim.. - [MT2Dev]
                                            }

                                            // Detaylandirilmis ChatPacket. - [MT2Dev]
                                            ChatPacket (CHAT_TYPE_INFO, "%d . Efsun basariyla degistirildi.", attributeIndex);
                                            // Loglama islemi. - [MT2Dev]
                                            char buf[28];
                                            snprintf (buf, sizeof (buf), "%u", item2->GetID());
                                            LogManager::instance().ItemLog (this, item, "CHANGE_ATTRIBUTE_LEVEL", buf);
                                            item->SetCount (item->GetCount()-1);
                                            break;
                                        }
                                        else
                                        {
                                            ChatPacket (CHAT_TYPE_INFO, "Efsun degisim esyasi bu item icin kullanilamaz!");
                                            break;
                                        }
                                    }
                                    #endif //ENABLE_CHANGE_ATTRIBUTE_LEVEL

item_attribute.cpp:
Genişlet Daralt Kopyala
//En alta ekle;

#ifdef ENABLE_CHANGE_ATTRIBUTE_LEVEL
bool CItem::ChangeAttributeLevel (BYTE index)
{
    // AttributeSetIndex kontrolu. - [MT2Dev]
    int nAttrSet = GetAttributeSetIndex();
    if (nAttrSet < 0)
    {
        sys_err ("ChangeAttributeLevel: Cannot determine attribute set for item ID %u", GetID());
        return false;
    }

    BYTE currentType = m_aAttr[index].bType;
    // Eksik kontrol tamamlandi. - [MT2Dev]
    if (currentType <= APPLY_NONE || currentType > MAX_APPLY_NUM)
    {
        sys_err ("ChangeAttributeLevel: No attribute found at index %d for item ID %u", index, GetID());
        return false;
    }

    // Ortalama Zarar & Beceri Hasari & Bagisiklilik efsunlari gibi efsunlarda kullanilmamasi icin kontrol. - [MT2Dev]
    if (currentType == APPLY_SKILL_DAMAGE_BONUS ||      // Beceri Hasari
        currentType == APPLY_NORMAL_HIT_DAMAGE_BONUS || // Ortalama Zarar
        currentType == APPLY_SKILL_DEFEND_BONUS ||      // Beceri Hasarina Karsi Koyma
        currentType == APPLY_NORMAL_HIT_DEFEND_BONUS || // Ortalama Zarara Karsi Koyma
        currentType == APPLY_IMMUNE_STUN ||             // Sersemlik Karsisinda Bagisiklilik
        currentType == APPLY_IMMUNE_SLOW ||             // Yavaslama Karsisinda Bagisiklilik
        currentType == APPLY_IMMUNE_FALL)               // Yere Dusme Karsisinda Bagisiklilik
    {
        return false;
    }

    const TItemAttrTable& currentAttr = g_map_itemAttr[currentType];
    short maxLevel = currentAttr.bMaxLevelBySet[nAttrSet];
    if (maxLevel <= 0)
    {
        sys_err ("ChangeAttributeLevel: Invalid max level for attribute type %d in item ID %u", currentType, GetID());
        return false;
    }

    short newLevel = number (1, maxLevel);
    short newValue = currentAttr.lValues[newLevel-1];
    if (newValue <= 0)
    {
        sys_err ("ChangeAttributeLevel: Invalid new value for attribute type %d in item ID %u", currentType, GetID());
        return false;
    }
    m_aAttr[index].sValue = newValue;

    UpdatePacket();
    Save();

    const char* pszIP = (GetOwner() && GetOwner()->GetDesc()) ? GetOwner()->GetDesc()->GetHostName() : "";
    LogManager::instance().ItemLog (index, currentType, newValue, GetID(), "CHANGE_ATTR_LEVEL", "", pszIP, GetOriginalVnum());

    return true;
}
#endif //ENABLE_CHANGE_ATTRIBUTE_LEVEL
 
Son düzenleme:
Konu için teşekkürler, ufak bir vaktim vardı yorumları da okuyunca kodlara göz atmak istedim, yapay zeka çok iyi bir teknoloji yeni fikirleri uygularken kesinlikle yardım alın tabii ki fakat Metin2 gibi çok kompleks kod tabanları için şuan ki modeller hala yetersiz dolayısıyla hatalı/eksik kod yazma ihtimalleri hala çok yüksek, bunu mutlaka göz önünde bulundurun derim. Son olarak madem böyle bir paylaşım yapmışsınız katkım olsun.

- Eksik kontrolleri ekledim.
- Bağışıklılık, Ortalama Zarar, Beceri Hasarı gibi efsunlarda kullanılmasını engelledim.
- Sadece iç itemler, zırh ve silahlarda kullanılabilecek şekilde düzenledim.
- Tabii kodları da biraz düzenledim.

NOT:
Test etmedim, muhtemelen sorun çıkmaz ama olur da çıkarsa yazarsınız.

item.h:
Genişlet Daralt Kopyala
//Arat;

    public:
        void        SetForceAttribute(int i, BYTE bType, short sValue);


//Degistir;

    public:
        void        SetForceAttribute (int i, BYTE bType, short sValue);
        #ifdef ENABLE_CHANGE_ATTRIBUTE_LEVEL
        bool        ChangeAttributeLevel (BYTE index);
        #endif //ENABLE_CHANGE_ATTRIBUTE_LEVEL

char_item.cpp:
Genişlet Daralt Kopyala
//Arat;

                                    else if (item->GetVnum() == 76014)
                                    {
                                        int aiChangeProb[ITEM_ATTRIBUTE_MAX_LEVEL] =
                                        {
                                            0, 10, 50, 39, 1
                                        };

                                        item2->ChangeAttribute(aiChangeProb);
                                    }


//Hemen Altına ekle;

                                    #ifdef ENABLE_CHANGE_ATTRIBUTE_LEVEL
                                    else if (item->GetVnum() >= 71220 && item->GetVnum() <= 71226)
                                    {
                                        if ((item2->GetType() == ITEM_WEAPON) || (item2->GetType() == ITEM_ARMOR))  // Sadece belirli itemlerde kullanilabilir. - [MT2Dev]
                                        {
                                            BYTE attributeIndex = item->GetValue (0);
                                            if (!item2->ChangeAttributeLevel (attributeIndex))
                                            {
                                                // Detaylandirilmis ChatPacket. - [MT2Dev]
                                                ChatPacket (CHAT_TYPE_INFO, "%d . Efsun degistirilemez!", attributeIndex);
                                                break;  // Return false yerine direkt olarak case sonlandirmak daha mantikli. - [MT2Dev]
                                            }

                                            // Detaylandirilmis ChatPacket. - [MT2Dev]
                                            ChatPacket (CHAT_TYPE_INFO, "%d . Efsun basariyla degistirildi.", attributeIndex);
                                            // Loglama islemi. - [MT2Dev]
                                            char buf[28];
                                            snprintf (buf, sizeof (buf), "%u", item2->GetID());
                                            LogManager::instance().ItemLog (this, item, "CHANGE_ATTRIBUTE_LEVEL", buf);
                                            item->SetCount (item->GetCount()-1);
                                            break;
                                        }
                                        else
                                        {
                                            ChatPacket (CHAT_TYPE_INFO, "Efsun degisim esyasi bu item icin kullanilamaz!");
                                            break;
                                        }
                                    }
                                    #endif //ENABLE_CHANGE_ATTRIBUTE_LEVEL

item_attribute.cpp:
Genişlet Daralt Kopyala
//En alta ekle;

#ifdef ENABLE_CHANGE_ATTRIBUTE_LEVEL
bool CItem::ChangeAttributeLevel (BYTE index)
{
    // AttributeSetIndex kontrolu. - [MT2Dev]
    int nAttrSet = GetAttributeSetIndex();
    if (nAttrSet < 0)
    {
        sys_err ("ChangeAttributeLevel: Cannot determine attribute set for item ID %u", GetID());
        return false;
    }

    BYTE currentType = m_aAttr[index].bType;
    // Eksik kontrol tamamlandi. - [MT2Dev]
    if (currentType <= APPLY_NONE || currentType > MAX_APPLY_NUM)
    {
        sys_err ("ChangeAttributeLevel: No attribute found at index %d for item ID %u", index, GetID());
        return false;
    }

    // Ortalama Zarar & Beceri Hasari & Bagisiklilik efsunlari gibi efsunlarda kullanilmamasi icin kontrol. - [MT2Dev]
    if (currentType == APPLY_SKILL_DAMAGE_BONUS ||      // Beceri Hasari
        currentType == APPLY_NORMAL_HIT_DAMAGE_BONUS || // Ortalama Zarar
        currentType == APPLY_SKILL_DEFEND_BONUS ||      // Beceri Hasarina Karsi Koyma
        currentType == APPLY_NORMAL_HIT_DEFEND_BONUS || // Ortalama Zarara Karsi Koyma
        currentType == APPLY_IMMUNE_STUN ||             // Sersemlik Karsisinda Bagisiklilik
        currentType == APPLY_IMMUNE_SLOW ||             // Yavaslama Karsisinda Bagisiklilik
        currentType == APPLY_IMMUNE_FALL)               // Yere Dusme Karsisinda Bagisiklilik
    {
        return false;
    }

    const TItemAttrTable& currentAttr = g_map_itemAttr[currentType];
    short maxLevel = currentAttr.bMaxLevelBySet[nAttrSet];
    if (maxLevel <= 0)
    {
        sys_err ("ChangeAttributeLevel: Invalid max level for attribute type %d in item ID %u", currentType, GetID());
        return false;
    }

    short newLevel = number (1, maxLevel);
    short newValue = currentAttr.lValues[newLevel-1];
    if (newValue <= 0)
    {
        sys_err ("ChangeAttributeLevel: Invalid new value for attribute type %d in item ID %u", currentType, GetID());
        return false;
    }
    m_aAttr[index].sValue = newValue;

    UpdatePacket();
    Save();

    const char* pszIP = (GetOwner() && GetOwner()->GetDesc()) ? GetOwner()->GetDesc()->GetHostName() : "";
    LogManager::instance().ItemLog (index, currentType, newValue, GetID(), "CHANGE_ATTR_LEVEL", "", pszIP, GetOriginalVnum());

    return true;
}
#endif //ENABLE_CHANGE_ATTRIBUTE_LEVEL
item protoda subtype'ı USE_CHANGE_ATTRIBUTE, char_item.cpp ye type kontrolü eklemeye gerek varmı da?

item_attribute.cpp nin içinde value nin eksi olmasıyla alakalı bir kontrol yok(gözümden kaçmış olabilir), bu kontrolü eklemeye gerek varmı?
 
Konu için teşekkürler, ufak bir vaktim vardı yorumları da okuyunca kodlara göz atmak istedim, yapay zeka çok iyi bir teknoloji yeni fikirleri uygularken kesinlikle yardım alın tabii ki fakat Metin2 gibi çok kompleks kod tabanları için şuan ki modeller hala yetersiz dolayısıyla hatalı/eksik kod yazma ihtimalleri hala çok yüksek, bunu mutlaka göz önünde bulundurun derim. Son olarak madem böyle bir paylaşım yapmışsınız katkım olsun.

- Eksik kontrolleri ekledim.
- Bağışıklılık, Ortalama Zarar, Beceri Hasarı gibi efsunlarda kullanılmasını engelledim.
- Sadece iç itemler, zırh ve silahlarda kullanılabilecek şekilde düzenledim.
- Tabii kodları da biraz düzenledim.

NOT:
Test etmedim, muhtemelen sorun çıkmaz ama olur da çıkarsa yazarsınız.

item.h:
Genişlet Daralt Kopyala
//Arat;

    public:
        void        SetForceAttribute(int i, BYTE bType, short sValue);


//Degistir;

    public:
        void        SetForceAttribute (int i, BYTE bType, short sValue);
        #ifdef ENABLE_CHANGE_ATTRIBUTE_LEVEL
        bool        ChangeAttributeLevel (BYTE index);
        #endif //ENABLE_CHANGE_ATTRIBUTE_LEVEL

char_item.cpp:
Genişlet Daralt Kopyala
//Arat;

                                    else if (item->GetVnum() == 76014)
                                    {
                                        int aiChangeProb[ITEM_ATTRIBUTE_MAX_LEVEL] =
                                        {
                                            0, 10, 50, 39, 1
                                        };

                                        item2->ChangeAttribute(aiChangeProb);
                                    }


//Hemen Altına ekle;

                                    #ifdef ENABLE_CHANGE_ATTRIBUTE_LEVEL
                                    else if (item->GetVnum() >= 71220 && item->GetVnum() <= 71226)
                                    {
                                        if ((item2->GetType() == ITEM_WEAPON) || (item2->GetType() == ITEM_ARMOR))  // Sadece belirli itemlerde kullanilabilir. - [MT2Dev]
                                        {
                                            BYTE attributeIndex = item->GetValue (0);
                                            if (!item2->ChangeAttributeLevel (attributeIndex))
                                            {
                                                // Detaylandirilmis ChatPacket. - [MT2Dev]
                                                ChatPacket (CHAT_TYPE_INFO, "%d . Efsun degistirilemez!", attributeIndex);
                                                break;  // Return false yerine direkt olarak case sonlandirmak daha mantikli. - [MT2Dev]
                                            }

                                            // Detaylandirilmis ChatPacket. - [MT2Dev]
                                            ChatPacket (CHAT_TYPE_INFO, "%d . Efsun basariyla degistirildi.", attributeIndex);
                                            // Loglama islemi. - [MT2Dev]
                                            char buf[28];
                                            snprintf (buf, sizeof (buf), "%u", item2->GetID());
                                            LogManager::instance().ItemLog (this, item, "CHANGE_ATTRIBUTE_LEVEL", buf);
                                            item->SetCount (item->GetCount()-1);
                                            break;
                                        }
                                        else
                                        {
                                            ChatPacket (CHAT_TYPE_INFO, "Efsun degisim esyasi bu item icin kullanilamaz!");
                                            break;
                                        }
                                    }
                                    #endif //ENABLE_CHANGE_ATTRIBUTE_LEVEL

item_attribute.cpp:
Genişlet Daralt Kopyala
//En alta ekle;

#ifdef ENABLE_CHANGE_ATTRIBUTE_LEVEL
bool CItem::ChangeAttributeLevel (BYTE index)
{
    // AttributeSetIndex kontrolu. - [MT2Dev]
    int nAttrSet = GetAttributeSetIndex();
    if (nAttrSet < 0)
    {
        sys_err ("ChangeAttributeLevel: Cannot determine attribute set for item ID %u", GetID());
        return false;
    }

    BYTE currentType = m_aAttr[index].bType;
    // Eksik kontrol tamamlandi. - [MT2Dev]
    if (currentType <= APPLY_NONE || currentType > MAX_APPLY_NUM)
    {
        sys_err ("ChangeAttributeLevel: No attribute found at index %d for item ID %u", index, GetID());
        return false;
    }

    // Ortalama Zarar & Beceri Hasari & Bagisiklilik efsunlari gibi efsunlarda kullanilmamasi icin kontrol. - [MT2Dev]
    if (currentType == APPLY_SKILL_DAMAGE_BONUS ||      // Beceri Hasari
        currentType == APPLY_NORMAL_HIT_DAMAGE_BONUS || // Ortalama Zarar
        currentType == APPLY_SKILL_DEFEND_BONUS ||      // Beceri Hasarina Karsi Koyma
        currentType == APPLY_NORMAL_HIT_DEFEND_BONUS || // Ortalama Zarara Karsi Koyma
        currentType == APPLY_IMMUNE_STUN ||             // Sersemlik Karsisinda Bagisiklilik
        currentType == APPLY_IMMUNE_SLOW ||             // Yavaslama Karsisinda Bagisiklilik
        currentType == APPLY_IMMUNE_FALL)               // Yere Dusme Karsisinda Bagisiklilik
    {
        return false;
    }

    const TItemAttrTable& currentAttr = g_map_itemAttr[currentType];
    short maxLevel = currentAttr.bMaxLevelBySet[nAttrSet];
    if (maxLevel <= 0)
    {
        sys_err ("ChangeAttributeLevel: Invalid max level for attribute type %d in item ID %u", currentType, GetID());
        return false;
    }

    short newLevel = number (1, maxLevel);
    short newValue = currentAttr.lValues[newLevel-1];
    if (newValue <= 0)
    {
        sys_err ("ChangeAttributeLevel: Invalid new value for attribute type %d in item ID %u", currentType, GetID());
        return false;
    }
    m_aAttr[index].sValue = newValue;

    UpdatePacket();
    Save();

    const char* pszIP = (GetOwner() && GetOwner()->GetDesc()) ? GetOwner()->GetDesc()->GetHostName() : "";
    LogManager::instance().ItemLog (index, currentType, newValue, GetID(), "CHANGE_ATTR_LEVEL", "", pszIP, GetOriginalVnum());

    return true;
}
#endif //ENABLE_CHANGE_ATTRIBUTE_LEVEL
break kullanmak case bloğundan çıkarır doğru fakat buradan beklenen bir sonuç varsa bunu doğru işleyemez. Eğer bu fonksiyonun sonunda true varsa bu true sonucunu verecektir çünkü case den çıktıktan sonra fonksiyon içi gereksiz çalışmaya devam edecektir. return false fonksiyonun açıkca başarısız olduğunu belirtir. Eğer başarısız olmasını istediğiniz bir koşul varsa burada break değil return false en doğru kullanımdır. Böylelikle fonksiyonu burada tamamen kesmiş olursun ve buradan beklenen bir sonuç varsa oraya bu sonucu doğru göndermiş olursun.



case A: break;

return true // bu çalışacaktır.

case A: return false; // bu çalışacaktır.
return true;


if (!FonksiyonName()) // çalışmayacaktır çünkü break kullanıldı. switchden çıkıp fonksiyonun en sonundaki true değeri geldi.
return false;

Yada

return FonksiyonName(); // açık değil.
 
Son düzenleme:
item protoda subtype'ı USE_CHANGE_ATTRIBUTE, char_item.cpp ye type kontrolü eklemeye gerek varmı da?

item_attribute.cpp nin içinde value nin eksi olmasıyla alakalı bir kontrol yok(gözümden kaçmış olabilir), bu kontrolü eklemeye gerek varmı?
Yok hocam, protodaki tanımlama yeterli olur.

Ona da gerek yok çünkü zaten değiştirmeden önce mevcut value alınıyor, mevcut için eklenirken/değiştirilirken o kontrol ekli dolayısıyla böyle bir value çekme ihtimalimiz yok (edit ile yapılan bir eşya olmadığı sürece), ortalama beceri gibi - değer alabilen efsunlarda da kullanılmayacağı için gerek olmayacaktır.

break kullanmak case bloğundan çıkarır doğru fakat buradan beklenen bir sonuç varsa bunu doğru işleyemez. Eğer bu fonksiyonun sonunda true varsa bu true sonucunu verecektir çünkü case den çıktıktan sonra fonksiyon içi gereksiz çalışmaya devam edecektir. return false fonksiyonun açıkca başarısız olduğunu belirtir. Eğer başarısız olmasını istediğiniz bir koşul varsa burada break değil return false en doğru kullanımdır. Böylelikle fonksiyonu burada tamamen kesmiş olursun ve buradan beklenen bir sonuç varsa oraya bu sonucu doğru göndermiş olursun.



case A: break;

return true // bu çalışacaktır.

case A: return false; // bu çalışacaktır.
return true;


if (!FonksiyonName()) // çalışmayacaktır çünkü break kullanıldı. switchden çıkıp fonksiyonun en sonundaki true değeri geldi.
return false;

Yada

return FonksiyonName(); // açık değil.

Bu doğru, kodu yeniden yazarken öncelikle farklı iki if bloğu kullanıp ortak bir loglama yapmıştım devam edip loglamayı yapması için ikisinde de break kullandım, sonra iptal ettim ama break kalmış, doğrudur return false; kullanılmazsa devam eder, düzelttim.


 
Yok hocam, protodaki tanımlama yeterli olur.

Ona da gerek yok çünkü zaten değiştirmeden önce mevcut value alınıyor, mevcut için eklenirken/değiştirilirken o kontrol ekli dolayısıyla böyle bir value çekme ihtimalimiz yok (edit ile yapılan bir eşya olmadığı sürece), ortalama beceri gibi - değer alabilen efsunlarda da kullanılmayacağı için gerek olmayacaktır.



Bu doğru, kodu yeniden yazarken öncelikle farklı iki if bloğu kullanıp ortak bir loglama yapmıştım devam edip loglamayı yapması için ikisinde de break kullandım, sonra iptal ettim ama break kalmış, doğrudur return false; kullanılmazsa devam eder, düzelttim.
Bu da benden olsun :ROFLMAO: :ROFLMAO:


Kod:
Genişlet Daralt Kopyala
                                    else if (item->GetVnum() >= 71220 && item->GetVnum() <= 71226)
                                    {
                                        if (!CanAttributeItemType(item2->GetType()))
                                        {
                                            ChatPacket (CHAT_TYPE_INFO, "Efsun degisim esyasi bu item icin kullanilamaz!");
                                            return false;
                                        }

                                        const BYTE attributeIndex = item->GetValue (0);
                                        if (!item2->ChangeAttributeLevel (attributeIndex))
                                        {
                                            ChatPacket (CHAT_TYPE_INFO, "%d . Efsun degistirilemez!", attributeIndex);
                                            return false;
                                        }

                                        ChatPacket (CHAT_TYPE_INFO, "%d . Efsun basariyla degistirildi.", attributeIndex);

                                        char buf[28];
                                        snprintf (buf, sizeof (buf), "%u", item2->GetID());
                                        LogManager::instance().ItemLog (this, item, "CHANGE_ATTRIBUTE_LEVEL", buf);
                                        item->SetCount (item->GetCount()-1);
                                        break;
                                    }

Arat:

Kod:
Genişlet Daralt Kopyala
bool CHARACTER::CanHandleItem(bool bSkipCheckRefine, bool bSkipObserver)

Üstüne Ekle:

Kod:
Genişlet Daralt Kopyala
static bool CanAttributeItemType(const uint8_t iType)
{
    switch(iType)
    {
        case ITEM_WEAPON:
        case ITEM_ARMOR:
            break;

        default:
            return false;
    }

    return true;
}

@TheAdmin33 Bende denemedim. :ROFLMAO::ROFLMAO:
 
Bu da benden olsun :ROFLMAO: :ROFLMAO:


Kod:
Genişlet Daralt Kopyala
                                    else if (item->GetVnum() >= 71220 && item->GetVnum() <= 71226)
                                    {
                                        if (!CanAttributeItemType(item2->GetType()))
                                        {
                                            ChatPacket (CHAT_TYPE_INFO, "Efsun degisim esyasi bu item icin kullanilamaz!");
                                            return false;
                                        }

                                        const BYTE attributeIndex = item->GetValue (0);
                                        if (!item2->ChangeAttributeLevel (attributeIndex))
                                        {
                                            ChatPacket (CHAT_TYPE_INFO, "%d . Efsun degistirilemez!", attributeIndex);
                                            return false;
                                        }

                                        ChatPacket (CHAT_TYPE_INFO, "%d . Efsun basariyla degistirildi.", attributeIndex);

                                        char buf[28];
                                        snprintf (buf, sizeof (buf), "%u", item2->GetID());
                                        LogManager::instance().ItemLog (this, item, "CHANGE_ATTRIBUTE_LEVEL", buf);
                                        item->SetCount (item->GetCount()-1);
                                        break;
                                    }

Arat:

Kod:
Genişlet Daralt Kopyala
bool CHARACTER::CanHandleItem(bool bSkipCheckRefine, bool bSkipObserver)

Üstüne Ekle:

Kod:
Genişlet Daralt Kopyala
static bool CanAttributeItemType(const uint8_t iType)
{
    switch(iType)
    {
        case ITEM_WEAPON:
        case ITEM_ARMOR:
            break;

        default:
            return false;
    }

    return true;
}

@TheAdmin33 Bende denemedim. :ROFLMAO::ROFLMAO:
bence type kontrolüne gerek yok. Konudaki dosyayı güncelledim o hali yeterli olur.
 
Son düzenleme:
Geri
Üst