[C++ & Py] Chronobreak Item

  • Konuyu açan Konuyu açan Legandalith
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 6
  • Gösterim Gösterim 382

Legandalith

MT Üye
MT Üye
Mesaj
168
Çözümler
5
Beğeni
183
Puan
769
Ticaret Puanı
0
Uzun zamandır başlayıp başlayıp devam ettiremediğim C++ serüvenine ve Metin2 geliştiriciliğine attığım adımın kendim açımdan ilk meyvesini bugün ortaya bir şey çıkararak aldım. Umarım aklıma daha fazla fikir gelirde bunları hayata geçirebilmek için biraz daha kanser olabilirim diyip Chronobreak itemı nedir bundan bahsedeyim.

Chronobreak Item'ı kullanıldığında oyundaki en son başarısız eşya geliştirme işlemindeki kaybettiğiniz eşyaların tümünü geri verir. Aşağıda tam olarak çalışma mantığını izleyebilirsiniz (Sadece scroll ile basılan eşyalar için geçerli):



Bilinmesi gerekenler:

  1. Itemlarınız kaç socket değeri alıyorsa maksimum o kadar eşyalı sistemlerde geçerlildir. Eğer 3 socketli bir filesa sahipseniz ve basma eşyası olarak 4 item isteniyorsa bu ya sorun çıkartır ya da son itemi saymaz. Fakat şuan kodları hiç değiştirmeden filesınıza eklerseniz 6 socketli fileslar için ayarlanmıştır.​
  2. Item olarak oyunun içindeki Levi's Ring'in ismini değiştirirek boş duracağına işime yarasın diyip bu eşyayı değiştirmiştim. Eğer kendiniz bir eşya ekleyeceksiniz type değerini 18 yapmalısınız.​
  3. Bu mekaniğin gerçekleşebilmesi için itemi yakmadan önce bu eşyaya sahip olmalısınız. Chronobreak yokken eşya yakarsanız bunu kaydetmez, Chronobreak envanterinizdeyken ekipman geliştirme işleminin başarısız olması gerekli.​


Problem yaşama durumunda konunun altından ulaşırsanız ilgilenirim.

Linkleri görebilmek için giriş yap veya kayıt ol.


Level sınırı değişikliğini görmek için tıkla
 

Dosya Eklentileri

Son düzenleme:
Çok başarılı sistem @Tengrist in dediği gibi low level zindanlarda iş yapar.
Teşekkür ederim, low level için level sınırı güncellemesini gene bu konu altında güncelleyeceğim.

Ayrıca yabancı bir arkadaş dm yoluyla bana ulaştı ve sistemi çalıştıramadığını söyledi, dosyalara her şeyi eksiksiz paylaştığımı düşünsemde belki hata benden kaynaklıdır diye düşündüğümden bugün tekrar dosyalara bir göz atacağım fakat indirip kurup deneyen biri varsa ve bilgilendirirse sevinirim.
 
Level sınırı değişikliği için char_item.cpp içerisindeki fonksiyonları şu şekilde değiştirin:

C++:
Genişlet Daralt Kopyala
//Arat      
       
        LPITEM pkNewItem = ITEM_MANAGER::instance().CreateItem(result_fail_vnum, 1, 0, false);

        if (pkNewItem)
        {
       
//Önceki dosyalardan eklediğiniz fonksiyonu bununla değiştir:

LPITEM myring = FindSpecifyItem(40002);

if (myring && myring->GetCount() > 0)
{
    if (pkNewItem->GetLimitType(0) == LIMIT_LEVEL && pkNewItem->GetLimitValue(0) <= 60)
    {
        int socket_count = myring->GetSocketCount();
        for (int j = 0; j <= socket_count; ++j)
        {
            myring->SetSocket(j, 0);
        }
        for (int i = 0; i < prt->material_count; ++i)
        {
            int combined = combineVnumAndCount(prt->materials[i].vnum, prt->materials[i].count);
            myring->SetSocket(i, combined);
        }
    }
}

C++:
Genişlet Daralt Kopyala
// Arat

NotifyRefineFail(this, item, szRefineType);

// Üstündeki fonksiyonu şu şekilde değiştir:

LPITEM myring = FindSpecifyItem(40002);

if (myring && myring->GetCount() > 0)
{
    if (item->GetLimitType(0) == LIMIT_LEVEL && item->GetLimitValue(0) <= 60)
    {
        int socket_count = myring->GetSocketCount();
        for (int j = 0; j <= socket_count; ++j)
        {
            myring->SetSocket(j, 0);
        }
        for (int i = 0; i < prt->material_count; ++i)
        {
            int combined = combineVnumAndCount(prt->materials[i].vnum, prt->materials[i].count);
            myring->SetSocket(i, combined);
        }
    }
}

Item level sınırını fonksiyonların içindeki GetLimitValue(0) <= 60 60 level'i değiştirin.
 
Üst