Yardım k envarter efsun nesnesi sorunu

  • Konuyu açan Konuyu açan hancı21
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 14
  • Gösterim Gösterim 129
Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

hancı21

Üye
Üye
Mesaj
173
Çözümler
1
Beğeni
19
Puan
79
Ticaret Puanı
0
k envarter efsun nesnesi sorunu efsun nesnesi bölümünden oto düzelte bastımmı oyundan atıyor yardımcı olursanız sevinirim
 
Çözüm
Fix:
Genişlet Daralt Kopyala
// Düzenlenmiş envanter sıralama sistemi - Disconnect problemi giderildi

#ifdef __SORT_INVENTORY_ITEMS__

// Eşyaları isimlerine göre alfabetik olarak sırala
static bool SortItems(const LPITEM& s1, const LPITEM& s2)
{
    std::string name(s1->GetName());
    std::string name2(s2->GetName());
    return name < name2;
}

// Envanteri sıralama fonksiyonu
void CHARACTER::SortInventoryItems()
{
    int lastSortInventoryPulse = GetSortInventoryPulse();
    int iPulse = thecore_pulse();

    // Yakın zamanda sıralama yapıldıysa bekleme süresi kontrolü
    if (lastSortInventoryPulse - iPulse > 0)
    {
        int deltaInSeconds = ((lastSortInventoryPulse / PASSES_PER_SEC(1)) - (iPulse / PASSES_PER_SEC(1)));
        int minutes =...
evet tüm bölümde yapıyor cok fazla olunca yapıyor
şöyle ki kullandığın k envanteri ve oto toplama sistemlerinin ikisi de güncel sistemlere aşırı uyumsuz ve sürekli sorun çıkaran sistemler. yani basit bir k envanterindeki itemi yere atmak için bile 5 farklı yerden kodlarında değişiklik yapmanı gerektiriyor. ki bu değişklikleri yapsan bile herhangi bir anda kodların saçmalaması için elinden gelen bir şey olmayacak. biraz daha komplike bir sisteme geçmeni öneririm. örnek vermem gerekirse valiant2sf nin içinkide k envanteri ve oto düzeltmeye göz atmanı öneririm. hem güncel sistemleri hem de güncel serverlere yakın. evet zor bir sökme ve yeniden kendi kodlarına uyarlamaya maruz kalacaksın ama yaparsan elinde güzel 2 sistem olacak.
 
şöyle ki kullandığın k envanteri ve oto toplama sistemlerinin ikisi de güncel sistemlere aşırı uyumsuz ve sürekli sorun çıkaran sistemler. yani basit bir k envanterindeki itemi yere atmak için bile 5 farklı yerden kodlarında değişiklik yapmanı gerektiriyor. ki bu değişklikleri yapsan bile herhangi bir anda kodların saçmalaması için elinden gelen bir şey olmayacak. biraz daha komplike bir sisteme geçmeni öneririm. örnek vermem gerekirse valiant2sf nin içinkide k envanteri ve oto düzeltmeye göz atmanı öneririm. hem güncel sistemleri hem de güncel serverlere yakın. evet zor bir sökme ve yeniden kendi kodlarına uyarlamaya maruz kalacaksın ama yaparsan elinde güzel 2 sistem olacak.
oda aynı sorunlu denedim
 
5 sayfa 100 lük şeklinde dolu ilk 3 satırı sildim ve düzenlemeye bastım. oyundan atma sorunu görmedim. siz tam olarak nasıl denediniz?

 
Bende de bu sorun mevcut 1,1,1 olarak stok yaptığınız zaman oyundan atma söz konusu değil fakat 50, 100, 200 stoklu halde yaparsanız oyundan giriş ekranına atma mevcut.

Not: Orijinal yapı 200 stok!
 
Fix:
Genişlet Daralt Kopyala
// Düzenlenmiş envanter sıralama sistemi - Disconnect problemi giderildi

#ifdef __SORT_INVENTORY_ITEMS__

// Eşyaları isimlerine göre alfabetik olarak sırala
static bool SortItems(const LPITEM& s1, const LPITEM& s2)
{
    std::string name(s1->GetName());
    std::string name2(s2->GetName());
    return name < name2;
}

// Envanteri sıralama fonksiyonu
void CHARACTER::SortInventoryItems()
{
    int lastSortInventoryPulse = GetSortInventoryPulse();
    int iPulse = thecore_pulse();

    // Yakın zamanda sıralama yapıldıysa bekleme süresi kontrolü
    if (lastSortInventoryPulse - iPulse > 0)
    {
        int deltaInSeconds = ((lastSortInventoryPulse / PASSES_PER_SEC(1)) - (iPulse / PASSES_PER_SEC(1)));
        int minutes = deltaInSeconds / 180;
        int seconds = (deltaInSeconds - (minutes * 180));
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Envanteri tekrar sıralamak için %d saniye bekleyin."), seconds);
        return;
    }

    // Diğer pencereler açıkken sıralamayı engelle
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Lütfen envanteri sıralamadan önce diğer pencereleri kapatın."));
        return;
    }

    static std::vector<LPITEM> v;
    LPITEM myitems;
    v.clear();
    int size = INVENTORY_MAX_NUM;

    // Tüm envanter eşyalarını topla ve karakterden çıkar
    for (int i = 0; i < size; ++i)
    {
        if (!(myitems = GetInventoryItem(i)))
            continue;
        v.push_back(myitems);
        myitems->RemoveFromCharacter();
        myitems->SetSkipSave(true);
    }

    std::sort(v.begin(), v.end(), SortItems);

    // Eşyayı yeniden yaratmadan ve veritabanına yazmadan güvenli şekilde geri ver
    for (auto item : v)
    {
        if (item)
        {
            item->SetSkipSave(true);
            AutoGiveItem(item, false);
        }
    }

    // Oyuncuya bilgi ver
    SetSortInventoryPulse(thecore_pulse() + PASSES_PER_SEC(180));    // 3 dakika
    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Envanter başarıyla sıralandı."));
}

// Özel envanterleri sıralama fonksiyonu
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
    if (!IsPC()) return;
    if (!CanHandleItem()) return;

    // Görev objesini al ve görev çalışıyor mu kontrol et
    quest::PC* pPC = quest::CQuestManager::instance().GetPCForce(GetPlayerID());
    if (!pPC || pPC->IsRunning()) return;

    // Zamanlayıcı etkinliği varsa iptal et
    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("İptal edildi."));
        event_cancel(&m_pkTimedEvent);
    }

    int lastSortSpecialInventoryPulse = GetSortSpecialInventoryPulse();
    int iPulse = thecore_pulse();
    // Yakın zamanda sıralama yapıldıysa bekleme süresi kontrolü
    if (lastSortSpecialInventoryPulse - iPulse > 0)
    {
        int deltaInSeconds = ((lastSortSpecialInventoryPulse / PASSES_PER_SEC(1)) - (iPulse / PASSES_PER_SEC(1)));
        int minutes = deltaInSeconds / 180;
        int seconds = (deltaInSeconds - (minutes * 180));
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Özel envanteri tekrar sıralamak için %d saniye bekleyin."), seconds);
        return;
    }
    // Diğer pencereler açıkken sıralamayı engelle
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Lütfen özel envanteri sıralamadan önce diğer pencereleri kapatın."));
        return;
    }

    std::vector<LPITEM> vecItems;
    vecItems.clear();
    LPITEM pkItem;

    int startSlot = 0, endSlot = 0;

    // Türe göre özel envanter slot aralıklarını belirle
    switch (type)
    {
        case 0: startSlot = SKILL_BOOK_INVENTORY_SLOT_START; endSlot = SKILL_BOOK_INVENTORY_SLOT_END; break;
        case 1: startSlot = UPGRADE_ITEMS_INVENTORY_SLOT_START; endSlot = UPGRADE_ITEMS_INVENTORY_SLOT_END; break;
        case 2: startSlot = STONE_INVENTORY_SLOT_START; endSlot = STONE_INVENTORY_SLOT_END; break;
        case 3: startSlot = BOX_INVENTORY_SLOT_START; endSlot = BOX_INVENTORY_SLOT_END; break;
        case 4: startSlot = EFSUN_INVENTORY_SLOT_START; endSlot = EFSUN_INVENTORY_SLOT_END; break;
        case 5: startSlot = CICEK_INVENTORY_SLOT_START; endSlot = CICEK_INVENTORY_SLOT_END; break;
        default: startSlot = SKILL_BOOK_INVENTORY_SLOT_START; endSlot = SKILL_BOOK_INVENTORY_SLOT_END; break;
    }

    // Seçilen özel envanter alanındaki eşyaları topla
    for (int i = startSlot; i < endSlot; ++i)
    {
        if (!(pkItem = GetInventoryItem(i)))
            continue;
        vecItems.push_back(pkItem);
        pkItem->RemoveFromCharacter();
        pkItem->SetSkipSave(true);
    }

    std::sort(vecItems.begin(), vecItems.end(), SortItems);

    // Sırala ve oyuncuya güvenli şekilde geri ver
    for (auto item : vecItems)
    {
        if (item)
        {
            item->SetSkipSave(true);
            AutoGiveItem(item, false);
        }
    }

    // Oyuncuyu bilgilendir
    SetSortSpecialInventoryPulse(thecore_pulse() + PASSES_PER_SEC(180));    // 3 dakika
    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Özel envanter başarıyla sıralandı."));
}

#endif
 

Dosya Eklentileri

Çözüm
Geri
Üst