K Envantere Envanter Düzenleme Eklentisi

  • Konuyu açan Konuyu açan nyami
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 12
  • Gösterim Gösterim 2K

nyami

ZeRo
Premium Üye
Geliştirici
Yardımsever Üye
Usta Üye
Mesaj
725
Çözümler
50
Beğeni
1.222
Puan
1.130
Ticaret Puanı
1
K envanter ve normal envanter düzenleme sistemini sizlerle paylaşıyorum. Bkların rastgele gelme sorununu fixlenmiştir.

Aynı kitap türünden 200 den fazla olunca tek 200 lük gelmesinin fix i
char.cpp void CHARACTER::SortSpecialInventoryItems(BYTE type):
Genişlet Daralt Kopyala
                        //Arat
                        LPITEM book_item = GetSkillBookInventoryItem(i);
                        if (book_item && book_item->GetVnum() == item->GetVnum())
                        {
                   
                   
                        //Değiştir
                        LPITEM book_item = GetSkillBookInventoryItem(i);
                        if (book_item && book_item->GetVnum() == item->GetVnum() && (item->GetCount() + book_item->GetCount()) <= 200)
                        {
 

Dosya Eklentileri

En son bir moderatör tarafından düzenlenmiş:
düzenle dediğimizde eşyalar en başa sıralanmasada olduğu yerde kalsa onu nasıl yaparız?
 
düzenle tuşunu eklemezsen olduğu yerde kalıyor zaten bu nasıl bir istek
örnekle anlatayım
mesela envanterin herhangibir yerinde 32 tane kırmızı pot var diyelim başka bir yerdede 18 tane var diyelim envanter düzenleye bastığımda bunun ikisini birleştirip envanterin en başına göndermesin 32 li pot nerdeyse 18 taneyi onun üzerine eklesin ve yeri sabit kalsın.
 
örnekle anlatayım
mesela envanterin herhangibir yerinde 32 tane kırmızı pot var diyelim başka bir yerdede 18 tane var diyelim envanter düzenleye bastığımda bunun ikisini birleştirip envanterin en başına göndermesin 32 li pot nerdeyse 18 taneyi onun üzerine eklesin ve yeri sabit kalsın.
şimdi daha açıklayıcı oldu, kod bilen arkadaşlar yapabilir heralde ben anlamam fazla
 
K envanter ve normal envanter düzenleme sistemini sizlerle paylaşıyorum. Bkların rastgele gelme sorununu fixlenmiştir.

Aynı kitap türünden 200 den fazla olunca tek 200 lük gelmesinin fix i
char.cpp void CHARACTER::SortSpecialInventoryItems(BYTE type):
Genişlet Daralt Kopyala
                        //Arat
                        LPITEM book_item = GetSkillBookInventoryItem(i);
                        if (book_item && book_item->GetVnum() == item->GetVnum())
                        {
                  
                  
                        //Değiştir
                        LPITEM book_item = GetSkillBookInventoryItem(i);
                        if (book_item && book_item->GetVnum() == item->GetVnum() && (item->GetCount() + book_item->GetCount()) <= 200)
                        {
normal envanterde çalışıyormu yoksa k envanter fileste yoksa onlarıda ekliyormuyuz ?
 
Dosyalarımdan mı kaynaklı bilmiyorum ama bunu kullanıyorum üç envanter dolusu 200 stok dolusu nesneniz olursa ilk veya ikinci envanterden iki-üç eşya silerseniz ve envanteri düzenlerseniz oyundan giriş ekranına atma mevcut.

Bilginize.

Örnek: Hangi stoklarda bu sorun mevcut. 50,100,200 vb.
 
Dosyalarımdan mı kaynaklı bilmiyorum ama bunu kullanıyorum üç envanter dolusu 200 stok dolusu nesneniz olursa ilk veya ikinci envanterden iki-üç eşya silerseniz ve envanteri düzenlerseniz oyundan giriş ekranına atma mevcut.

Bilginize.

Örnek: Hangi stoklarda bu sorun mevcut. 50,100,200 vb.
Bu sistem eski ve çok kaynak harcıyor. Her itemi tek tek tutup sıralıyor üst üste atmaya çalışıyor maksimum stok sayısını alıp fazla kalanlar için yeniden item üretip boş slota atıyor. Yani hem çok fazla işlem yapıyor hem de gereksiz veri harcıyor. Güncel fileslardan daha iyi olanlarını çekip kurun.

client src taraflı birşey yokmu sadece pack ve game src mi
client src ile bir işlemi yok.
 
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

Geri
Üst