Öneri envanter düzenleme sistemi hk

  • Konuyu açan Konuyu açan enes turan
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 17
  • Gösterim Gösterim 221
Konu sahibi önerilerinizi bekliyor. Konuya yorum yazabilirsiniz.

enes turan

Premium Üye
Premium Üye
Yardımsever Üye
Usta Üye
Mesaj
1.064
Çözümler
78
Beğeni
1.265
Puan
1.339
Ticaret Puanı
0
char.cpp:
Genişlet Daralt Kopyala
static bool SortItems(const LPITEM& s1, const LPITEM& s2)
{
    std::string name(s1->GetName());
    std::string name2(s2->GetName());

    return name < name2;
}

void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    std::vector<LPITEM> vec_pkItems;
    LPITEM pkItem;
    const auto size = static_cast<WORD>(INVENTORY_MAX_NUM);

    for (WORD i = 0; i < size; ++i)
    {
        if ((pkItem = GetInventoryItem(i)))
        {
            vec_pkItems.emplace_back(pkItem);
            pkItem->RemoveFromCharacter();
            SyncQuickslot(QUICKSLOT_TYPE_ITEM, static_cast<BYTE>(i), 0xFF);
        }
    }

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

    for (const auto& item : vec_pkItems)
    {
        const auto itemTable = ITEM_MANAGER::instance().GetTable(item->GetVnum());
        if (!itemTable)
            continue;

        static const std::initializer_list<DWORD> excepList = {
            ITEM_AUTO_HP_RECOVERY_S,
            ITEM_AUTO_HP_RECOVERY_M,
            ITEM_AUTO_HP_RECOVERY_L,
            ITEM_AUTO_HP_RECOVERY_X,
            ITEM_AUTO_SP_RECOVERY_S,
            ITEM_AUTO_SP_RECOVERY_M,
            ITEM_AUTO_SP_RECOVERY_L,
            ITEM_AUTO_SP_RECOVERY_X,
            REWARD_BOX_ITEM_AUTO_HP_RECOVERY_S,
            REWARD_BOX_ITEM_AUTO_SP_RECOVERY_XS,
            REWARD_BOX_ITEM_AUTO_SP_RECOVERY_S,
            REWARD_BOX_ITEM_AUTO_HP_RECOVERY_S,
            REWARD_BOX_ITEM_AUTO_HP_RECOVERY_XS,
            FUCKING_BRAZIL_ITEM_AUTO_SP_RECOVERY_S,
            FUCKING_BRAZIL_ITEM_AUTO_HP_RECOVERY_S
        };

        if (itemTable->dwFlags & ITEM_FLAG_STACKABLE && itemTable->bType != ITEM_BLEND &&
            (std::find(excepList.begin(), excepList.end(), item->GetVnum()) == excepList.end()))
        {
            AutoGiveItem(item->GetVnum(), item->GetCount(), -1, false);
            M2_DESTROY_ITEM(item);
        }
        else
            AutoGiveItem(item, false);
    };

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}

envanter düzenleme sistemi hakkında biraz öneriye ihtiyacım var bunu ekledim güzel çalışıyor fakat incelediğimde şöyle bişey fark ettim

oyuncu sıralama yaptığında itemler vec_pkItems içinde tutuluyor ve sıralama işlemi tamamlandıktan sonra envantere tekrardan ekliyor.

silip ekleme kısmı biraz sıkıntılı diye düşünüyorum item kaybı olabilir, buga sebep olabilir vs vs potansiyel tehtit

birde zaten örneğin 50300 random bk var adamda düzenle dediği an tüm bk lar değişiyor :) silip tekrar eklediği için.

bunun için ne yapılabilir silme kısmını kaldırıp sadece envanterde aynı item varsa sadece geri kalanı üzerine stack yapsın şeklinde değiştirmek mantıklı olur mu fikirlerinize açığım ?
 
Belki İşini Görür
C++:
Genişlet Daralt Kopyala
static bool SortItems(const LPITEM& s1, const LPITEM& s2)
{
    std::string name(s1->GetName());
    std::string name2(s2->GetName());
    return name < name2;
}

void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    std::vector<LPITEM> vec_pkItems;
    LPITEM pkItem;
    const auto size = static_cast<WORD>(INVENTORY_MAX_NUM);

    for (WORD i = 0; i < size; ++i)
    {
        if ((pkItem = GetInventoryItem(i)))
        {
            vec_pkItems.emplace_back(pkItem);
        }
    }

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

    static const std::unordered_set<DWORD> excepSet = {
        ITEM_AUTO_HP_RECOVERY_S,
        ITEM_AUTO_HP_RECOVERY_M,
        ITEM_AUTO_HP_RECOVERY_L,
        ITEM_AUTO_HP_RECOVERY_X,
        ITEM_AUTO_SP_RECOVERY_S,
        ITEM_AUTO_SP_RECOVERY_M,
        ITEM_AUTO_SP_RECOVERY_L,
        ITEM_AUTO_SP_RECOVERY_X,
        REWARD_BOX_ITEM_AUTO_HP_RECOVERY_S,
        REWARD_BOX_ITEM_AUTO_SP_RECOVERY_XS,
        REWARD_BOX_ITEM_AUTO_SP_RECOVERY_S,
        REWARD_BOX_ITEM_AUTO_HP_RECOVERY_S,
        REWARD_BOX_ITEM_AUTO_HP_RECOVERY_XS,
        FUCKING_BRAZIL_ITEM_AUTO_SP_RECOVERY_S,
        FUCKING_BRAZIL_ITEM_AUTO_HP_RECOVERY_S
    };

    for (const auto& item : vec_pkItems)
    {
        const auto itemTable = ITEM_MANAGER::instance().GetTable(item->GetVnum());
        if (!itemTable)
            continue;

        if (itemTable->dwFlags & ITEM_FLAG_STACKABLE && itemTable->bType != ITEM_BLEND &&
            excepSet.find(item->GetVnum()) == excepSet.end())
        {
            bool itemFound = false;
            for (WORD i = 0; i < size; ++i)
            {
                LPITEM existingItem = GetInventoryItem(i);
                if (existingItem && existingItem->GetVnum() == item->GetVnum())
                {
                    existingItem->IncreaseCount(item->GetCount());
                    itemFound = true;
                    break;
                }
            }

            if (!itemFound)
            {
                AutoGiveItem(item->GetVnum(), item->GetCount(), -1, false);
                M2_DESTROY_ITEM(item);
            }
        }
        else
        {
            AutoGiveItem(item, false);
        }
    }

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
 
teşekkür ederim ama itemleri bir vectörde tutma olayı biraz korkutuyor ne olur olmaz :D

sadece staclama yapacak şekilde düzenleyeceğim galiba :)
 
kullanmak isteyen olursa
her envanteri ayrı ayrı tarar
ilk bulduğu itemin üzerine diğerini ekler
staclanamayan itemleri sıralama yapmaz

C++:
Genişlet Daralt Kopyala
#if defined(__SORT_INVENTORY_ITEMS__)
void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    const WORD size = INVENTORY_MAX_NUM;

    for (WORD i = 0; i < size; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
            continue;

        for (WORD j = i + 1; j < size; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#if defined(__SPECIAL_INVENTORY_SYSTEM__)
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortSpecialInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortSpecialInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    WORD start = 0, end = 0;

    switch (type)
    {
    case 0:
    default:
        start = SKILL_BOOK_INVENTORY_SLOT_START;
        end = SKILL_BOOK_INVENTORY_SLOT_END;
        break;
    case 1:
        start = UPGRADE_ITEMS_INVENTORY_SLOT_START;
        end = UPGRADE_ITEMS_INVENTORY_SLOT_END;
        break;
    case 2:
        start = STONE_INVENTORY_SLOT_START;
        end = STONE_INVENTORY_SLOT_END;
        break;
    case 3:
        start = GIFT_BOX_INVENTORY_SLOT_START;
        end = GIFT_BOX_INVENTORY_SLOT_END;
        break;
    }

    for (WORD i = start; i < end; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
            continue;

        for (WORD j = i + 1; j < end; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortSpecialInventoryPulse(get_global_time() + 15);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#endif
#endif
 
Düzeltme:
RemoveFromCharacter itemi silmez veya yok etmez, itemi mevcut slottan kaldırıp RESERVED_WINDOW'a alır ve sonra geri yükler. İtemi silen işlev DestroyItem'dir.

RemoveFromCharacter fonksiyonunun görevi itemlerin taşınmasıyla ilgilidir.
Yani bir itemi envanter içinde bir slottan diğer slota koyduğunda, itemin bir önceki konumu olan slot için RemoveFromCharacter, sonra yerleştirdiğin slot için SetItem çalışır. Dolayısıyla herhangi bir item silinmesi konusunda tereddüt etmene gerek yok, çünkü şu an ki durumda böyle bir risk yok.
Elle itemlerin yerini değiştirirken veya giyip-çıkarırken bile defalarca kez bu fonksiyonu kullanıyoruz aslında.
 
Düzeltme:
RemoveFromCharacter itemi silmez veya yok etmez, itemi mevcut slottan kaldırıp RESERVED_WINDOW'a alır ve sonra geri yükler. İtemi silen işlev DestroyItem'dir.

RemoveFromCharacter fonksiyonunun görevi itemlerin taşınmasıyla ilgilidir.
Yani bir itemi envanter içinde bir slottan diğer slota koyduğunda, itemin bir önceki konumu olan slot için RemoveFromCharacter, sonra yerleştirdiğin slot için SetItem çalışır. Dolayısıyla herhangi bir item silinmesi konusunda tereddüt etmene gerek yok, çünkü şu an ki durumda böyle bir risk yok.
Elle itemlerin yerini değiştirirken veya giyip-çıkarırken bile defalarca kez bu fonksiyonu kullanıyoruz aslında.
peki konu mesajındaki blok'u kullanırken 50300 item varken düzenleme yaptığımda bk değişiyordu o neden oluyor peki :/
 
5. slotta öfke bk olsun
1. slotta boş
düzenleme yaptığımda 1. slota hava kılıcı bk olarak geliyor örneğin
Anladım. Bunun itemlerin silinmesi ile alakası yok, asıl sıkıntı beceri kitaplarının kendisinin teferruatlı olması. Beceri kitapları bazı sistemlerde benzer buglara sebep olabiliyor. Mesela MOB_TARGET_INFO'nun da bazı versiyonlarında bklar biraz absürt çalışıyordu.

Ama burada sanırım bu soruna sebep olan fonksiyon muhtemelen AutoGiveItem. Zaten karakterine gelmiş olan bir beceri kitabı, AutoGiveItem ile tekrardan geldiğinde bk'nın skill indexi değişiyor olabilir. (Random değer olarak.)
Dolayısıyla ilk başta öfke olan bk, AutoGiveItem sonrası hava kılıcı vb. olabilir.
 
Anladım. Bunun itemlerin silinmesi ile alakası yok, asıl sıkıntı beceri kitaplarının kendisinin teferruatlı olması. Beceri kitapları bazı sistemlerde benzer buglara sebep olabiliyor. Mesela MOB_TARGET_INFO'nun da bazı versiyonlarında bklar biraz absürt çalışıyordu.

Ama burada sanırım bu soruna sebep olan fonksiyon muhtemelen AutoGiveItem. Zaten karakterine gelmiş olan bir beceri kitabı, AutoGiveItem ile tekrardan geldiğinde bk'nın skill indexi değişiyor olabilir. (Random değer olarak.)
Dolayısıyla ilk başta öfke olan bk, AutoGiveItem sonrası hava kılıcı vb. olabilir.
anladım bilgi için teşekkür ederim.

peki bir geliştirici gözüyle son kullandığım halini değerlendirebilirmisiniz ?

C++:
Genişlet Daralt Kopyala
#if defined(__SORT_INVENTORY_ITEMS__)
void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    const WORD size = INVENTORY_MAX_NUM;

    for (WORD i = 0; i < size; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
            continue;

        for (WORD j = i + 1; j < size; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#if defined(__SPECIAL_INVENTORY_SYSTEM__)
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortSpecialInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortSpecialInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    WORD start = 0, end = 0;

    switch (type)
    {
    case 0:
    default:
        start = SKILL_BOOK_INVENTORY_SLOT_START;
        end = SKILL_BOOK_INVENTORY_SLOT_END;
        break;
    case 1:
        start = UPGRADE_ITEMS_INVENTORY_SLOT_START;
        end = UPGRADE_ITEMS_INVENTORY_SLOT_END;
        break;
    case 2:
        start = STONE_INVENTORY_SLOT_START;
        end = STONE_INVENTORY_SLOT_END;
        break;
    case 3:
        start = GIFT_BOX_INVENTORY_SLOT_START;
        end = GIFT_BOX_INVENTORY_SLOT_END;
        break;
    }

    for (WORD i = start; i < end; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
            continue;

        for (WORD j = i + 1; j < end; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortSpecialInventoryPulse(get_global_time() + 15);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#endif
#endif
 
anladım bilgi için teşekkür ederim.

peki bir geliştirici gözüyle son kullandığım halini değerlendirebilirmisiniz ?

C++:
Genişlet Daralt Kopyala
#if defined(__SORT_INVENTORY_ITEMS__)
void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    const WORD size = INVENTORY_MAX_NUM;

    for (WORD i = 0; i < size; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
            continue;

        for (WORD j = i + 1; j < size; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#if defined(__SPECIAL_INVENTORY_SYSTEM__)
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortSpecialInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortSpecialInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    WORD start = 0, end = 0;

    switch (type)
    {
    case 0:
    default:
        start = SKILL_BOOK_INVENTORY_SLOT_START;
        end = SKILL_BOOK_INVENTORY_SLOT_END;
        break;
    case 1:
        start = UPGRADE_ITEMS_INVENTORY_SLOT_START;
        end = UPGRADE_ITEMS_INVENTORY_SLOT_END;
        break;
    case 2:
        start = STONE_INVENTORY_SLOT_START;
        end = STONE_INVENTORY_SLOT_END;
        break;
    case 3:
        start = GIFT_BOX_INVENTORY_SLOT_START;
        end = GIFT_BOX_INVENTORY_SLOT_END;
        break;
    }

    for (WORD i = start; i < end; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
            continue;

        for (WORD j = i + 1; j < end; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortSpecialInventoryPulse(get_global_time() + 15);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#endif
#endif
Göze çarpan bir sorun göremedim. Tabi sistemi hiç kullanmadığım için net bir şey söyleyemem.

Ancak iki noktaya değineceğim;
Stacklenebilen itemlerin max stack sayısına gelindiğinde sistemin nasıl davrandığını test etmek gerekebilir. Mesela 200 tane kırmızı pot var diyelim, ve yanında da 1 tane tekli kırmızı pot var diyelim. Bu gibi ince soru işaretlerini test etmek gerekebilir.

Bir diğer konu ise; sanırım bkların skill indexleri socket0 ile tutuluyordu. Eğer öyleyse bkları işlem dışı tutmak yerine yedekle-geri yükle gibi küçük bir işlem ekleyebilirsin.
İtemler vektöre eklenirken veya eklenmeden önce yeni bir vector tanımlayıp(veya std::map) mevcut bkların socket0 değerini burada depola.(GetSocket(0))
Daha sonra düzenleme işleminden sonra bklara tekrar socket0 değerini aktar. (SetSocket(0, yedekSocket))
 
Anladım. Bunun itemlerin silinmesi ile alakası yok, asıl sıkıntı beceri kitaplarının kendisinin teferruatlı olması. Beceri kitapları bazı sistemlerde benzer buglara sebep olabiliyor. Mesela MOB_TARGET_INFO'nun da bazı versiyonlarında bklar biraz absürt çalışıyordu.

Ama burada sanırım bu soruna sebep olan fonksiyon muhtemelen AutoGiveItem. Zaten karakterine gelmiş olan bir beceri kitabı, AutoGiveItem ile tekrardan geldiğinde bk'nın skill indexi değişiyor olabilir. (Random değer olarak.)
Dolayısıyla ilk başta öfke olan bk, AutoGiveItem sonrası hava kılıcı vb. olabilir.
Bu konuda ufak bir şey söyliyim aslında beceri kitapları eğer düzenleme yapılmamışsa tek koddan çalışıyor. Oyun içinde de zaten o kodu çağırdığınızda dediğimi anliycaksınız. Daha önce paylaştığım mob targette de böyle bir durum var beceri kitabı çağırdığınızda ya da bu gibi durumlarda türü yazmıyor. Direk beceri kitabı olarak geliyor. Sizdeki olan şeyde bundan dolayı aslında mantık olarak doğru işliyo ama beceri kitaplarının rastgele gelmesinden dolayı beceri kitabın değişiyor. Mob target için de bu geçerli.

 
Göze çarpan bir sorun göremedim. Tabi sistemi hiç kullanmadığım için net bir şey söyleyemem.

Ancak iki noktaya değineceğim;
Stacklenebilen itemlerin max stack sayısına gelindiğinde sistemin nasıl davrandığını test etmek gerekebilir. Mesela 200 tane kırmızı pot var diyelim, ve yanında da 1 tane tekli kırmızı pot var diyelim. Bu gibi ince soru işaretlerini test etmek gerekebilir.

Bir diğer konu ise; sanırım bkların skill indexleri socket0 ile tutuluyordu. Eğer öyleyse bkları işlem dışı tutmak yerine yedekle-geri yükle gibi küçük bir işlem ekleyebilirsin.
İtemler vektöre eklenirken veya eklenmeden önce yeni bir vector tanımlayıp(veya std::map) mevcut bkların socket0 değerini burada depola.(GetSocket(0))
Daha sonra düzenleme işleminden sonra bklara tekrar socket0 değerini aktar. (SetSocket(0, yedekSocket))

Bu konuda ufak bir şey söyliyim aslında beceri kitapları eğer düzenleme yapılmamışsa tek koddan çalışıyor. Oyun içinde de zaten o kodu çağırdığınızda dediğimi anliycaksınız. Daha önce paylaştığım mob targette de böyle bir durum var beceri kitabı çağırdığınızda ya da bu gibi durumlarda türü yazmıyor. Direk beceri kitabı olarak geliyor. Sizdeki olan şeyde bundan dolayı aslında mantık olarak doğru işliyo ama beceri kitaplarının rastgele gelmesinden dolayı beceri kitabın değişiyor. Mob target için de bu geçerli.

evet dediğiniz gibi
C++:
Genişlet Daralt Kopyala
        case ITEM_SKILLBOOK:
            {
                if (IsPolymorphed())
                {
                    ChatPacket(CHAT_TYPE_INFO, LC_TEXT("변신중에는 책을 읽을수 없습니다."));
                    return false;
                }

                DWORD dwVnum = 0;

                if (item->GetVnum() == 50300)
                {
                    dwVnum = item->GetSocket(0);
                }
                else
                {
                    dwVnum = item->GetValue(0);
                }
                ...
                ...

ve kodu düzenledim

C++:
Genişlet Daralt Kopyala
#if defined(__SORT_INVENTORY_ITEMS__)
void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    const WORD size = INVENTORY_MAX_NUM;

    for (WORD i = 0; i < size; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < size; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                    continue;

                if (pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                int countToAdd = pItem2->GetCount();
                pItem1->SetCount(pItem1->GetCount() + countToAdd);

                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            continue;
        }

        for (WORD j = i + 1; j < size; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);

            pItem2->RemoveFromCharacter();
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}

#if defined(__SPECIAL_INVENTORY_SYSTEM__)
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortSpecialInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortSpecialInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    WORD start = 0, end = 0;

    switch (type)
    {
    case 0:
    default:
        start = SKILL_BOOK_INVENTORY_SLOT_START;
        end = SKILL_BOOK_INVENTORY_SLOT_END;
        break;
    case 1:
        start = UPGRADE_ITEMS_INVENTORY_SLOT_START;
        end = UPGRADE_ITEMS_INVENTORY_SLOT_END;
        break;
    case 2:
        start = STONE_INVENTORY_SLOT_START;
        end = STONE_INVENTORY_SLOT_END;
        break;
    case 3:
        start = GIFT_BOX_INVENTORY_SLOT_START;
        end = GIFT_BOX_INVENTORY_SLOT_END;
        break;
    }

    for (WORD i = start; i < end; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < end; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                    continue;

                if (pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                int countToAdd = pItem2->GetCount();
                pItem1->SetCount(pItem1->GetCount() + countToAdd);

                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            continue;
        }

        for (WORD j = i + 1; j < end; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);

            pItem2->RemoveFromCharacter();
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortSpecialInventoryPulse(get_global_time() + 15);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#endif
#endif

eğer socket0 ile aynı değere sahip bk varsa staclanıyor uyuşmayanlara herhangi bir işlem yapılmıyor :)
 
Göze çarpan bir sorun göremedim. Tabi sistemi hiç kullanmadığım için net bir şey söyleyemem.

Ancak iki noktaya değineceğim;
Stacklenebilen itemlerin max stack sayısına gelindiğinde sistemin nasıl davrandığını test etmek gerekebilir. Mesela 200 tane kırmızı pot var diyelim, ve yanında da 1 tane tekli kırmızı pot var diyelim. Bu gibi ince soru işaretlerini test etmek gerekebilir.

Bir diğer konu ise; sanırım bkların skill indexleri socket0 ile tutuluyordu. Eğer öyleyse bkları işlem dışı tutmak yerine yedekle-geri yükle gibi küçük bir işlem ekleyebilirsin.
İtemler vektöre eklenirken veya eklenmeden önce yeni bir vector tanımlayıp(veya std::map) mevcut bkların socket0 değerini burada depola.(GetSocket(0))
Daha sonra düzenleme işleminden sonra bklara tekrar socket0 değerini aktar. (SetSocket(0, yedekSocket))
maxcount olayını şimdi test edebildim dediğiniz gibi kontrol olmadığı için şöyle oluyor

benim maxcount 5000
mesela x itemden 20000 tane var 1000 li şekilde itemleri toplayınca maxcount kadarını topluyor geri kalanlar kayboluyor :)
bunun için bir çözüm öneriniz varmı ?

C++:
Genişlet Daralt Kopyala
#if defined(__SORT_INVENTORY_ITEMS__)
void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    const WORD size = INVENTORY_MAX_NUM;

    for (WORD i = 0; i < size; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < size; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                    continue;

                if (pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                int countToAdd = pItem2->GetCount();
                pItem1->SetCount(pItem1->GetCount() + countToAdd);

                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            continue;
        }

        for (WORD j = i + 1; j < size; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);

            pItem2->RemoveFromCharacter();
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}

#if defined(__SPECIAL_INVENTORY_SYSTEM__)
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortSpecialInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortSpecialInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    WORD start = 0, end = 0;

    switch (type)
    {
    case 0:
    default:
        start = SKILL_BOOK_INVENTORY_SLOT_START;
        end = SKILL_BOOK_INVENTORY_SLOT_END;
        break;
    case 1:
        start = UPGRADE_ITEMS_INVENTORY_SLOT_START;
        end = UPGRADE_ITEMS_INVENTORY_SLOT_END;
        break;
    case 2:
        start = STONE_INVENTORY_SLOT_START;
        end = STONE_INVENTORY_SLOT_END;
        break;
    case 3:
        start = GIFT_BOX_INVENTORY_SLOT_START;
        end = GIFT_BOX_INVENTORY_SLOT_END;
        break;
    }

    for (WORD i = start; i < end; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < end; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                    continue;

                if (pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                int countToAdd = pItem2->GetCount();
                pItem1->SetCount(pItem1->GetCount() + countToAdd);

                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            continue;
        }

        for (WORD j = i + 1; j < end; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);

            pItem2->RemoveFromCharacter();
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortSpecialInventoryPulse(get_global_time() + 15);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#endif
#endif
 
maxcount olayını şimdi test edebildim dediğiniz gibi kontrol olmadığı için şöyle oluyor

benim maxcount 5000
mesela x itemden 20000 tane var 1000 li şekilde itemleri toplayınca maxcount kadarını topluyor geri kalanlar kayboluyor :)
bunun için bir çözüm öneriniz varmı ?

C++:
Genişlet Daralt Kopyala
#if defined(__SORT_INVENTORY_ITEMS__)
void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    const WORD size = INVENTORY_MAX_NUM;

    for (WORD i = 0; i < size; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < size; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                    continue;

                if (pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                int countToAdd = pItem2->GetCount();
                pItem1->SetCount(pItem1->GetCount() + countToAdd);

                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            continue;
        }

        for (WORD j = i + 1; j < size; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);

            pItem2->RemoveFromCharacter();
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}

#if defined(__SPECIAL_INVENTORY_SYSTEM__)
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortSpecialInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortSpecialInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    WORD start = 0, end = 0;

    switch (type)
    {
    case 0:
    default:
        start = SKILL_BOOK_INVENTORY_SLOT_START;
        end = SKILL_BOOK_INVENTORY_SLOT_END;
        break;
    case 1:
        start = UPGRADE_ITEMS_INVENTORY_SLOT_START;
        end = UPGRADE_ITEMS_INVENTORY_SLOT_END;
        break;
    case 2:
        start = STONE_INVENTORY_SLOT_START;
        end = STONE_INVENTORY_SLOT_END;
        break;
    case 3:
        start = GIFT_BOX_INVENTORY_SLOT_START;
        end = GIFT_BOX_INVENTORY_SLOT_END;
        break;
    }

    for (WORD i = start; i < end; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < end; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                    continue;

                if (pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                int countToAdd = pItem2->GetCount();
                pItem1->SetCount(pItem1->GetCount() + countToAdd);

                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            continue;
        }

        for (WORD j = i + 1; j < end; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);

            pItem2->RemoveFromCharacter();
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortSpecialInventoryPulse(get_global_time() + 15);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#endif
#endif
Emin değilim fakat şu şekilde deneyebilirsin:
C++:
Genişlet Daralt Kopyala
#if defined(__SORT_INVENTORY_ITEMS__)
void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    const WORD size = INVENTORY_MAX_NUM;

    for (WORD i = 0; i < size; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < size; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum() || pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                int countToAdd = pItem2->GetCount();
                int availableSpace = ITEM_MAX_COUNT - pItem1->GetCount();

                if (countToAdd <= availableSpace)
                {
                    pItem1->SetCount(pItem1->GetCount() + countToAdd);
                    pItem2->RemoveFromCharacter();
                    M2_DESTROY_ITEM(pItem2);
                }
                else if (availableSpace > 0)
                {
                    pItem1->SetCount(ITEM_MAX_COUNT);
                    pItem2->SetCount(countToAdd - availableSpace);
                }
            }
            continue;
        }

        for (WORD j = i + 1; j < size; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            int availableSpace = ITEM_MAX_COUNT - pItem1->GetCount();

            if (countToAdd <= availableSpace)
            {
                pItem1->SetCount(pItem1->GetCount() + countToAdd);
                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            else if (availableSpace > 0)
            {
                pItem1->SetCount(ITEM_MAX_COUNT);
                pItem2->SetCount(countToAdd - availableSpace);
            }
        }
    }

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}

#if defined(__SPECIAL_INVENTORY_SYSTEM__)
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortSpecialInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortSpecialInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    WORD start = 0, end = 0;

    switch (type)
    {
    case 0:
    default:
        start = SKILL_BOOK_INVENTORY_SLOT_START;
        end = SKILL_BOOK_INVENTORY_SLOT_END;
        break;
    case 1:
        start = UPGRADE_ITEMS_INVENTORY_SLOT_START;
        end = UPGRADE_ITEMS_INVENTORY_SLOT_END;
        break;
    case 2:
        start = STONE_INVENTORY_SLOT_START;
        end = STONE_INVENTORY_SLOT_END;
        break;
    case 3:
        start = GIFT_BOX_INVENTORY_SLOT_START;
        end = GIFT_BOX_INVENTORY_SLOT_END;
        break;
    }

    for (WORD i = start; i < end; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < end; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum() || pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                int countToAdd = pItem2->GetCount();
                int availableSpace = ITEM_MAX_COUNT - pItem1->GetCount();

                if (countToAdd <= availableSpace)
                {
                    pItem1->SetCount(pItem1->GetCount() + countToAdd);
                    pItem2->RemoveFromCharacter();
                    M2_DESTROY_ITEM(pItem2);
                }
                else if (availableSpace > 0)
                {
                    pItem1->SetCount(ITEM_MAX_COUNT);
                    pItem2->SetCount(countToAdd - availableSpace);
                }
            }
            continue;
        }

        for (WORD j = i + 1; j < end; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            int availableSpace = ITEM_MAX_COUNT - pItem1->GetCount();

            if (countToAdd <= availableSpace)
            {
                pItem1->SetCount(pItem1->GetCount() + countToAdd);
                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            else if (availableSpace > 0)
            {
                pItem1->SetCount(ITEM_MAX_COUNT);
                pItem2->SetCount(countToAdd - availableSpace);
            }
        }
    }

    SetSortSpecialInventoryPulse(get_global_time() + 15);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#endif
#endif
 
Linkleri görebilmek için giriş yap veya kayıt ol.
şu dosyalardan __EXTENDED_ITEM_COUNT__ kısımlarını aratarak bi kontrol et aynı sistem bunda da ekli bunda düzgün olabilir bir ihtimal sorununu çözecektir.

Pickupİtem kısmında aradığın fix var sanırım
Kod:
Genişlet Daralt Kopyala
bool CHARACTER::PickupItem(DWORD dwVID)
{
    LPITEM item = ITEM_MANAGER::instance().FindByVID(dwVID);

    if (IsObserverMode())
        return false;

    if (!item || !item->GetSectree())
        return false;

    if (item->DistanceValid(this))
    {
        // @fixme150 BEGIN
        if (item->GetType() == ITEM_QUEST)
        {
            if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
            {
                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You cannot pickup this item if you're using quests"));
                return false;
            }
        }
        // @fixme150 END
        if (item->IsOwnership(this))
        {
            // ¸¸¾à ÁÖÀ¸·Á ÇÏ´Â ¾ÆÀÌÅÛÀÌ ¿¤Å©¶ó¸é
            if (item->GetType() == ITEM_ELK)
            {
                GiveGold(item->GetCount());
                item->RemoveFromGround();

                M2_DESTROY_ITEM(item);

                Save();
            }
#ifdef __CHEQUE_SYSTEM__
            else if (item->GetType() == ITEM_CHEQUE)
            {
                GiveCheque(item->GetCount());
                item->RemoveFromGround();

                M2_DESTROY_ITEM(item);

                Save();
            }
#endif
#ifdef __TOKEN_CURRENCY__
            else if (item->GetVnum() == TOKEN_ITEM_VNUM)
            {
                GiveToken(item->GetCount());
                item->RemoveFromGround();

                M2_DESTROY_ITEM(item);

                Save();
            }
#endif
            // Æò¹üÇÑ ¾ÆÀÌÅÛÀ̶ó¸é
            else
            {
                if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
                {
#ifdef __EXTENDED_ITEM_COUNT__
                    short bCount = item->GetCount();
#else
                    BYTE bCount = item->GetCount();
#endif

                    for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = GetInventoryItem(i);

                        if (!item2)
                            continue;

                        if (item2->GetVnum() == item->GetVnum())
                        {
                            int j;

                            for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
                                if (item2->GetSocket(j) != item->GetSocket(j))
                                    break;

                            if (j != ITEM_SOCKET_MAX_NUM)
                                continue;

#ifdef __EXTENDED_ITEM_COUNT__
                            short bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#else
                            BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;

                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                            {
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item2->GetName());
                                M2_DESTROY_ITEM(item);
                                // if (item2->GetType() == ITEM_QUEST)
                                quest::CQuestManager::instance().PickupItem(GetPlayerID(), item2);
                                return true;
                            }
                        }
                    }

                    item->SetCount(bCount);
                }

#ifdef __SPECIAL_INVENTORY_SYSTEM__
                if ((item->IsSkillBook() || item->IsUpgradeItem() || item->IsStone() || item->IsGiftBox() || item->IsChanger()) && item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
                {
#ifdef __EXTENDED_ITEM_COUNT__
                    short bCount = item->GetCount();
#else
                    BYTE bCount = item->GetCount();
#endif

                    for (int i = SKILL_BOOK_INVENTORY_SLOT_START; i < CHANGERS_INVENTORY_SLOT_END; ++i)
                    {
                        LPITEM item2 = GetInventoryItem(i);

                        if (!item2)
                            continue;

                        if (item2->GetVnum() == item->GetVnum())
                        {
                            int j;

                            for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
                                if (item2->GetSocket(j) != item->GetSocket(j))
                                    break;

                            if (j != ITEM_SOCKET_MAX_NUM)
                                continue;

#ifdef __EXTENDED_ITEM_COUNT__
                            short bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#else
                            BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;

                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                            {
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item2->GetName());
                                M2_DESTROY_ITEM(item);
                                // if (item2->GetType() == ITEM_QUEST)
                                quest::CQuestManager::instance().PickupItem(GetPlayerID(), item2);
                                return true;
                            }
                        }
                    }

                    item->SetCount(bCount);
                }
#endif

                int iEmptyCell;
                if (item->IsDragonSoul())
                {
                    if ((iEmptyCell = GetEmptyDragonSoulInventory(item)) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
#ifdef __SPECIAL_INVENTORY_SYSTEM__
                else if (item->IsSkillBook())
                {
                    if ((iEmptyCell = GetEmptySkillBookInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
                else if (item->IsUpgradeItem())
                {
                    if ((iEmptyCell = GetEmptyUpgradeItemsInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
                else if (item->IsStone())
                {
                    if ((iEmptyCell = GetEmptyStoneInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
                else if (item->IsGiftBox())
                {
                    if ((iEmptyCell = GetEmptyGiftBoxInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
                else if (item->IsChanger())
                {
                    if ((iEmptyCell = GetEmptyChangersInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
#endif
                else
                {
                    if ((iEmptyCell = GetEmptyInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }

                item->RemoveFromGround();

                if (item->IsDragonSoul())
                    item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
#ifdef __SPECIAL_INVENTORY_SYSTEM__
                else if (item->IsSkillBook())
                {
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
                }
                else if (item->IsUpgradeItem())
                {
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
                }
                else if (item->IsStone())
                {
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
                }
                else if (item->IsGiftBox())
                {
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
                }
                else if (item->IsChanger())
                {
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
                }
#endif
                else
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));

                char szHint[32 + 1];
                snprintf(szHint, sizeof(szHint), "%s %u %u", item->GetName(), item->GetCount(), item->GetOriginalVnum());
                LogManager::instance().ItemLog(this, item, "GET", szHint);
                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item->GetName());

                // if (item->GetType() == ITEM_QUEST)
                quest::CQuestManager::instance().PickupItem(GetPlayerID(), item);
            }

            //Motion(MOTION_PICKUP);
            return true;
        }
        else if (GetParty())
        {
            // ´Ù¸¥ ÆÄƼ¿ø ¼ÒÀ¯±Ç ¾ÆÀÌÅÛÀ» ÁÖÀ¸·Á°í ÇÑ´Ù¸é
            NPartyPickupDistribute::FFindOwnership funcFindOwnership(item);

            GetParty()->ForEachOnlineMember(funcFindOwnership);

            LPCHARACTER owner = funcFindOwnership.owner;
            // @fixme115
            if (!owner)
                return false;

            if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
            {
#ifdef __EXTENDED_ITEM_COUNT__
                short bCount = item->GetCount();
#else
                BYTE bCount = item->GetCount();
#endif

                for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
                {
                    LPITEM item2 = owner->GetInventoryItem(i);

                    if (!item2)
                        continue;

                    if (item2->GetVnum() == item->GetVnum())
                    {
                        int j;

                        for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
                            if (item2->GetSocket(j) != item->GetSocket(j))
                                break;

                        if (j != ITEM_SOCKET_MAX_NUM)
                            continue;

#ifdef __EXTENDED_ITEM_COUNT__
                        short bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#else
                        BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
#endif
                        bCount -= bCount2;

                        item2->SetCount(item2->GetCount() + bCount2);

                        if (bCount == 0)
                        {
                            if (owner == this)
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item2->GetName());
                            else
                            {
                                owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s ´ÔÀ¸·ÎºÎÅÍ %s"), GetName(), item2->GetName());
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ Àü´Ş: %s ´Ô¿¡°Ô %s"), item2->GetName(), owner->GetName());
                            }
                            M2_DESTROY_ITEM(item);
                            quest::CQuestManager::instance().PickupItem(owner->GetPlayerID(), item2);
                            return true;
                        }
                    }
                }

                item->SetCount(bCount);
            }

#ifdef __SPECIAL_INVENTORY_SYSTEM__
            if ((item->IsSkillBook() || item->IsUpgradeItem() || item->IsStone() || item->IsGiftBox() || item->IsChanger()) && item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
            {
#ifdef __EXTENDED_ITEM_COUNT__
                short bCount = item->GetCount();
#else
                BYTE bCount = item->GetCount();
#endif

                for (int i = SKILL_BOOK_INVENTORY_SLOT_START; i < CHANGERS_INVENTORY_SLOT_END; ++i)
                {
                    LPITEM item2 = owner->GetInventoryItem(i);

                    if (!item2)
                        continue;

                    if (item2->GetVnum() == item->GetVnum())
                    {
                        int j;

                        for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
                            if (item2->GetSocket(j) != item->GetSocket(j))
                                break;

                        if (j != ITEM_SOCKET_MAX_NUM)
                            continue;

#ifdef __EXTENDED_ITEM_COUNT__
                        short bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#else
                        BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
#endif
                        bCount -= bCount2;

                        item2->SetCount(item2->GetCount() + bCount2);

                        if (bCount == 0)
                        {
                            if (owner == this)
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item2->GetName());
                            else
                            {
                                owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s ´ÔÀ¸·ÎºÎÅÍ %s"), GetName(), item2->GetName());
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ Àü´Ş: %s ´Ô¿¡°Ô %s"), item2->GetName(), owner->GetName());
                            }
                            M2_DESTROY_ITEM(item);
                            quest::CQuestManager::instance().PickupItem(owner->GetPlayerID(), item2);
                            return true;
                        }
                    }
                }

                item->SetCount(bCount);
            }
#endif
            
            int iEmptyCell;

            if (item->IsDragonSoul())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyDragonSoulInventory(item)) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyDragonSoulInventory(item)) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
#ifdef __SPECIAL_INVENTORY_SYSTEM__
            else if (item->IsSkillBook())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptySkillBookInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptySkillBookInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
            else if (item->IsUpgradeItem())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyUpgradeItemsInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyUpgradeItemsInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
            else if (item->IsStone())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyStoneInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyStoneInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
            else if (item->IsGiftBox())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyGiftBoxInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyGiftBoxInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
            else if (item->IsChanger())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyChangersInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyChangersInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
#endif
            else
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }

            item->RemoveFromGround();

            if (item->IsDragonSoul())
                item->AddToCharacter(owner, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
#ifdef __SPECIAL_INVENTORY_SYSTEM__
            else if (item->IsSkillBook())
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
            else if (item->IsUpgradeItem())
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
            else if (item->IsStone())
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
            else if (item->IsGiftBox())
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
            else if (item->IsChanger())
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
#endif
            else
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));

            char szHint[32 + 1];
            snprintf(szHint, sizeof(szHint), "%s %u %u", item->GetName(), item->GetCount(), item->GetOriginalVnum());
            LogManager::instance().ItemLog(owner, item, "GET", szHint);

            if (owner == this)
                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item->GetName());
            else
            {
                owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s ´ÔÀ¸·ÎºÎÅÍ %s"), GetName(), item->GetName());
                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ Àü´Ş: %s ´Ô¿¡°Ô %s"), item->GetName(), owner->GetName());
            }

            // if (item->GetType() == ITEM_QUEST)
            quest::CQuestManager::instance().PickupItem(owner->GetPlayerID(), item);

            return true;
        }
    }

    return false;
}
 
Son düzenleme:
Emin değilim fakat şu şekilde deneyebilirsin:
C++:
Genişlet Daralt Kopyala
#if defined(__SORT_INVENTORY_ITEMS__)
void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    const WORD size = INVENTORY_MAX_NUM;

    for (WORD i = 0; i < size; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < size; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum() || pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                int countToAdd = pItem2->GetCount();
                int availableSpace = ITEM_MAX_COUNT - pItem1->GetCount();

                if (countToAdd <= availableSpace)
                {
                    pItem1->SetCount(pItem1->GetCount() + countToAdd);
                    pItem2->RemoveFromCharacter();
                    M2_DESTROY_ITEM(pItem2);
                }
                else if (availableSpace > 0)
                {
                    pItem1->SetCount(ITEM_MAX_COUNT);
                    pItem2->SetCount(countToAdd - availableSpace);
                }
            }
            continue;
        }

        for (WORD j = i + 1; j < size; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            int availableSpace = ITEM_MAX_COUNT - pItem1->GetCount();

            if (countToAdd <= availableSpace)
            {
                pItem1->SetCount(pItem1->GetCount() + countToAdd);
                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            else if (availableSpace > 0)
            {
                pItem1->SetCount(ITEM_MAX_COUNT);
                pItem2->SetCount(countToAdd - availableSpace);
            }
        }
    }

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}

#if defined(__SPECIAL_INVENTORY_SYSTEM__)
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortSpecialInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortSpecialInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    WORD start = 0, end = 0;

    switch (type)
    {
    case 0:
    default:
        start = SKILL_BOOK_INVENTORY_SLOT_START;
        end = SKILL_BOOK_INVENTORY_SLOT_END;
        break;
    case 1:
        start = UPGRADE_ITEMS_INVENTORY_SLOT_START;
        end = UPGRADE_ITEMS_INVENTORY_SLOT_END;
        break;
    case 2:
        start = STONE_INVENTORY_SLOT_START;
        end = STONE_INVENTORY_SLOT_END;
        break;
    case 3:
        start = GIFT_BOX_INVENTORY_SLOT_START;
        end = GIFT_BOX_INVENTORY_SLOT_END;
        break;
    }

    for (WORD i = start; i < end; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < end; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum() || pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                int countToAdd = pItem2->GetCount();
                int availableSpace = ITEM_MAX_COUNT - pItem1->GetCount();

                if (countToAdd <= availableSpace)
                {
                    pItem1->SetCount(pItem1->GetCount() + countToAdd);
                    pItem2->RemoveFromCharacter();
                    M2_DESTROY_ITEM(pItem2);
                }
                else if (availableSpace > 0)
                {
                    pItem1->SetCount(ITEM_MAX_COUNT);
                    pItem2->SetCount(countToAdd - availableSpace);
                }
            }
            continue;
        }

        for (WORD j = i + 1; j < end; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            int countToAdd = pItem2->GetCount();
            int availableSpace = ITEM_MAX_COUNT - pItem1->GetCount();

            if (countToAdd <= availableSpace)
            {
                pItem1->SetCount(pItem1->GetCount() + countToAdd);
                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            else if (availableSpace > 0)
            {
                pItem1->SetCount(ITEM_MAX_COUNT);
                pItem2->SetCount(countToAdd - availableSpace);
            }
        }
    }

    SetSortSpecialInventoryPulse(get_global_time() + 15);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#endif
#endif
birşey değişmedi malesef fakar şöyle bir çözüm buldum

C++:
Genişlet Daralt Kopyala
                if(pItem1->GetCount() == g_bItemCountLimit)
                    continue;

döngülerin içine ekledim ve sorun çözüldü

Linkleri görebilmek için giriş yap veya kayıt ol.
şu dosyalardan __EXTENDED_ITEM_COUNT__ kısımlarını aratarak bi kontrol et aynı sistem bunda da ekli bunda düzgün olabilir bir ihtimal sorununu çözecektir.

Pickupİtem kısmında aradığın fix var sanırım
Kod:
Genişlet Daralt Kopyala
bool CHARACTER::PickupItem(DWORD dwVID)
{
    LPITEM item = ITEM_MANAGER::instance().FindByVID(dwVID);

    if (IsObserverMode())
        return false;

    if (!item || !item->GetSectree())
        return false;

    if (item->DistanceValid(this))
    {
        // @fixme150 BEGIN
        if (item->GetType() == ITEM_QUEST)
        {
            if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning() == true)
            {
                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("You cannot pickup this item if you're using quests"));
                return false;
            }
        }
        // @fixme150 END
        if (item->IsOwnership(this))
        {
            // ¸¸¾à ÁÖÀ¸·Á ÇÏ´Â ¾ÆÀÌÅÛÀÌ ¿¤Å©¶ó¸é
            if (item->GetType() == ITEM_ELK)
            {
                GiveGold(item->GetCount());
                item->RemoveFromGround();

                M2_DESTROY_ITEM(item);

                Save();
            }
#ifdef __CHEQUE_SYSTEM__
            else if (item->GetType() == ITEM_CHEQUE)
            {
                GiveCheque(item->GetCount());
                item->RemoveFromGround();

                M2_DESTROY_ITEM(item);

                Save();
            }
#endif
#ifdef __TOKEN_CURRENCY__
            else if (item->GetVnum() == TOKEN_ITEM_VNUM)
            {
                GiveToken(item->GetCount());
                item->RemoveFromGround();

                M2_DESTROY_ITEM(item);

                Save();
            }
#endif
            // Æò¹üÇÑ ¾ÆÀÌÅÛÀ̶ó¸é
            else
            {
                if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
                {
#ifdef __EXTENDED_ITEM_COUNT__
                    short bCount = item->GetCount();
#else
                    BYTE bCount = item->GetCount();
#endif

                    for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = GetInventoryItem(i);

                        if (!item2)
                            continue;

                        if (item2->GetVnum() == item->GetVnum())
                        {
                            int j;

                            for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
                                if (item2->GetSocket(j) != item->GetSocket(j))
                                    break;

                            if (j != ITEM_SOCKET_MAX_NUM)
                                continue;

#ifdef __EXTENDED_ITEM_COUNT__
                            short bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#else
                            BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;

                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                            {
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item2->GetName());
                                M2_DESTROY_ITEM(item);
                                // if (item2->GetType() == ITEM_QUEST)
                                quest::CQuestManager::instance().PickupItem(GetPlayerID(), item2);
                                return true;
                            }
                        }
                    }

                    item->SetCount(bCount);
                }

#ifdef __SPECIAL_INVENTORY_SYSTEM__
                if ((item->IsSkillBook() || item->IsUpgradeItem() || item->IsStone() || item->IsGiftBox() || item->IsChanger()) && item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
                {
#ifdef __EXTENDED_ITEM_COUNT__
                    short bCount = item->GetCount();
#else
                    BYTE bCount = item->GetCount();
#endif

                    for (int i = SKILL_BOOK_INVENTORY_SLOT_START; i < CHANGERS_INVENTORY_SLOT_END; ++i)
                    {
                        LPITEM item2 = GetInventoryItem(i);

                        if (!item2)
                            continue;

                        if (item2->GetVnum() == item->GetVnum())
                        {
                            int j;

                            for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
                                if (item2->GetSocket(j) != item->GetSocket(j))
                                    break;

                            if (j != ITEM_SOCKET_MAX_NUM)
                                continue;

#ifdef __EXTENDED_ITEM_COUNT__
                            short bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#else
                            BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;

                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                            {
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item2->GetName());
                                M2_DESTROY_ITEM(item);
                                // if (item2->GetType() == ITEM_QUEST)
                                quest::CQuestManager::instance().PickupItem(GetPlayerID(), item2);
                                return true;
                            }
                        }
                    }

                    item->SetCount(bCount);
                }
#endif

                int iEmptyCell;
                if (item->IsDragonSoul())
                {
                    if ((iEmptyCell = GetEmptyDragonSoulInventory(item)) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
#ifdef __SPECIAL_INVENTORY_SYSTEM__
                else if (item->IsSkillBook())
                {
                    if ((iEmptyCell = GetEmptySkillBookInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
                else if (item->IsUpgradeItem())
                {
                    if ((iEmptyCell = GetEmptyUpgradeItemsInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
                else if (item->IsStone())
                {
                    if ((iEmptyCell = GetEmptyStoneInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
                else if (item->IsGiftBox())
                {
                    if ((iEmptyCell = GetEmptyGiftBoxInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
                else if (item->IsChanger())
                {
                    if ((iEmptyCell = GetEmptyChangersInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty ds inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
#endif
                else
                {
                    if ((iEmptyCell = GetEmptyInventory(item->GetSize())) == -1)
                    {
                        sys_log(0, "No empty inventory pid %u size %ud itemid %u", GetPlayerID(), item->GetSize(), item->GetID());
                        ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }

                item->RemoveFromGround();

                if (item->IsDragonSoul())
                    item->AddToCharacter(this, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
#ifdef __SPECIAL_INVENTORY_SYSTEM__
                else if (item->IsSkillBook())
                {
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
                }
                else if (item->IsUpgradeItem())
                {
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
                }
                else if (item->IsStone())
                {
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
                }
                else if (item->IsGiftBox())
                {
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
                }
                else if (item->IsChanger())
                {
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));
                }
#endif
                else
                    item->AddToCharacter(this, TItemPos(INVENTORY, iEmptyCell));

                char szHint[32 + 1];
                snprintf(szHint, sizeof(szHint), "%s %u %u", item->GetName(), item->GetCount(), item->GetOriginalVnum());
                LogManager::instance().ItemLog(this, item, "GET", szHint);
                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item->GetName());

                // if (item->GetType() == ITEM_QUEST)
                quest::CQuestManager::instance().PickupItem(GetPlayerID(), item);
            }

            //Motion(MOTION_PICKUP);
            return true;
        }
        else if (GetParty())
        {
            // ´Ù¸¥ ÆÄƼ¿ø ¼ÒÀ¯±Ç ¾ÆÀÌÅÛÀ» ÁÖÀ¸·Á°í ÇÑ´Ù¸é
            NPartyPickupDistribute::FFindOwnership funcFindOwnership(item);

            GetParty()->ForEachOnlineMember(funcFindOwnership);

            LPCHARACTER owner = funcFindOwnership.owner;
            // @fixme115
            if (!owner)
                return false;

            if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
            {
#ifdef __EXTENDED_ITEM_COUNT__
                short bCount = item->GetCount();
#else
                BYTE bCount = item->GetCount();
#endif

                for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
                {
                    LPITEM item2 = owner->GetInventoryItem(i);

                    if (!item2)
                        continue;

                    if (item2->GetVnum() == item->GetVnum())
                    {
                        int j;

                        for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
                            if (item2->GetSocket(j) != item->GetSocket(j))
                                break;

                        if (j != ITEM_SOCKET_MAX_NUM)
                            continue;

#ifdef __EXTENDED_ITEM_COUNT__
                        short bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#else
                        BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
#endif
                        bCount -= bCount2;

                        item2->SetCount(item2->GetCount() + bCount2);

                        if (bCount == 0)
                        {
                            if (owner == this)
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item2->GetName());
                            else
                            {
                                owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s ´ÔÀ¸·ÎºÎÅÍ %s"), GetName(), item2->GetName());
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ Àü´Ş: %s ´Ô¿¡°Ô %s"), item2->GetName(), owner->GetName());
                            }
                            M2_DESTROY_ITEM(item);
                            quest::CQuestManager::instance().PickupItem(owner->GetPlayerID(), item2);
                            return true;
                        }
                    }
                }

                item->SetCount(bCount);
            }

#ifdef __SPECIAL_INVENTORY_SYSTEM__
            if ((item->IsSkillBook() || item->IsUpgradeItem() || item->IsStone() || item->IsGiftBox() || item->IsChanger()) && item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))
            {
#ifdef __EXTENDED_ITEM_COUNT__
                short bCount = item->GetCount();
#else
                BYTE bCount = item->GetCount();
#endif

                for (int i = SKILL_BOOK_INVENTORY_SLOT_START; i < CHANGERS_INVENTORY_SLOT_END; ++i)
                {
                    LPITEM item2 = owner->GetInventoryItem(i);

                    if (!item2)
                        continue;

                    if (item2->GetVnum() == item->GetVnum())
                    {
                        int j;

                        for (j = 0; j < ITEM_SOCKET_MAX_NUM; ++j)
                            if (item2->GetSocket(j) != item->GetSocket(j))
                                break;

                        if (j != ITEM_SOCKET_MAX_NUM)
                            continue;

#ifdef __EXTENDED_ITEM_COUNT__
                        short bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#else
                        BYTE bCount2 = MIN(200 - item2->GetCount(), bCount);
#endif
                        bCount -= bCount2;

                        item2->SetCount(item2->GetCount() + bCount2);

                        if (bCount == 0)
                        {
                            if (owner == this)
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item2->GetName());
                            else
                            {
                                owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s ´ÔÀ¸·ÎºÎÅÍ %s"), GetName(), item2->GetName());
                                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ Àü´Ş: %s ´Ô¿¡°Ô %s"), item2->GetName(), owner->GetName());
                            }
                            M2_DESTROY_ITEM(item);
                            quest::CQuestManager::instance().PickupItem(owner->GetPlayerID(), item2);
                            return true;
                        }
                    }
                }

                item->SetCount(bCount);
            }
#endif
           
            int iEmptyCell;

            if (item->IsDragonSoul())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyDragonSoulInventory(item)) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyDragonSoulInventory(item)) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
#ifdef __SPECIAL_INVENTORY_SYSTEM__
            else if (item->IsSkillBook())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptySkillBookInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptySkillBookInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
            else if (item->IsUpgradeItem())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyUpgradeItemsInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyUpgradeItemsInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
            else if (item->IsStone())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyStoneInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyStoneInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
            else if (item->IsGiftBox())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyGiftBoxInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyGiftBoxInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
            else if (item->IsChanger())
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyChangersInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyChangersInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }
#endif
            else
            {
                if (!(owner && (iEmptyCell = owner->GetEmptyInventory(item->GetSize())) != -1))
                {
                    owner = this;

                    if ((iEmptyCell = GetEmptyInventory(item->GetSize())) == -1)
                    {
                        owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¼ÒÁöÇϰí ÀÖ´Â ¾ÆÀÌÅÛÀÌ ³Ê¹« ¸¹½À´Ï´Ù."));
                        return false;
                    }
                }
            }

            item->RemoveFromGround();

            if (item->IsDragonSoul())
                item->AddToCharacter(owner, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyCell));
#ifdef __SPECIAL_INVENTORY_SYSTEM__
            else if (item->IsSkillBook())
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
            else if (item->IsUpgradeItem())
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
            else if (item->IsStone())
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
            else if (item->IsGiftBox())
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
            else if (item->IsChanger())
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));
#endif
            else
                item->AddToCharacter(owner, TItemPos(INVENTORY, iEmptyCell));

            char szHint[32 + 1];
            snprintf(szHint, sizeof(szHint), "%s %u %u", item->GetName(), item->GetCount(), item->GetOriginalVnum());
            LogManager::instance().ItemLog(owner, item, "GET", szHint);

            if (owner == this)
                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s"), item->GetName());
            else
            {
                owner->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ È¹µæ: %s ´ÔÀ¸·ÎºÎÅÍ %s"), GetName(), item->GetName());
                ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¾ÆÀÌÅÛ Àü´Ş: %s ´Ô¿¡°Ô %s"), item->GetName(), owner->GetName());
            }

            // if (item->GetType() == ITEM_QUEST)
            quest::CQuestManager::instance().PickupItem(owner->GetPlayerID(), item);

            return true;
        }
    }

    return false;
}
teşekkür ederim __EXTENDED_ITEM_COUNT__ bu define itemin maxcount sınırı için yükseltme yapılmış sistem attığınız dosyalardada kurulu fakat biraz daha karmaşık kendi kullandığım hali şuan bir sorunu kalmadı bildiğim test ettikçe göreceğiz :)


kullanmak isteyen için son hali

C++:
Genişlet Daralt Kopyala
#if defined(__SORT_INVENTORY_ITEMS__)
void CHARACTER::SortInventoryItems()
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    const WORD size = INVENTORY_MAX_NUM;

    for (WORD i = 0; i < size; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < size; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                    continue;

                if (pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;

                if(pItem1->GetCount() == g_bItemCountLimit)
                    continue;

                int countToAdd = pItem2->GetCount();
                pItem1->SetCount(pItem1->GetCount() + countToAdd);

                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            continue;
        }

        for (WORD j = i + 1; j < size; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            if(pItem1->GetCount() == g_bItemCountLimit)
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);

            pItem2->RemoveFromCharacter();
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortInventoryPulse(get_global_time() + 3);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}

#if defined(__SPECIAL_INVENTORY_SYSTEM__)
void CHARACTER::SortSpecialInventoryItems(BYTE type)
{
    if (IsDead() || GetExchange() || GetMyShop() || GetShopOwner() || IsOpenSafebox() || IsCubeOpen())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1954]");
        return;
    }

    if (GetSortSpecialInventoryPulse() > get_global_time())
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1953;%d]", GetSortSpecialInventoryPulse() - get_global_time());
        return;
    }

    if (quest::CQuestManager::instance().GetPCForce(GetPlayerID())->IsRunning())
        return;

    if (m_pkTimedEvent)
    {
        ChatPacket(CHAT_TYPE_INFO, "[LS;1952]");
        event_cancel(&m_pkTimedEvent);
    }

    WORD start = 0, end = 0;

    switch (type)
    {
    case 0:
    default:
        start = SKILL_BOOK_INVENTORY_SLOT_START;
        end = SKILL_BOOK_INVENTORY_SLOT_END;
        break;
    case 1:
        start = UPGRADE_ITEMS_INVENTORY_SLOT_START;
        end = UPGRADE_ITEMS_INVENTORY_SLOT_END;
        break;
    case 2:
        start = STONE_INVENTORY_SLOT_START;
        end = STONE_INVENTORY_SLOT_END;
        break;
    case 3:
        start = GIFT_BOX_INVENTORY_SLOT_START;
        end = GIFT_BOX_INVENTORY_SLOT_END;
        break;
    }

    for (WORD i = start; i < end; ++i)
    {
        LPITEM pItem1 = GetInventoryItem(i);
        if (!pItem1)
            continue;

        const TItemTable* pTable1 = ITEM_MANAGER::instance().GetTable(pItem1->GetVnum());
        if (!pTable1 || !(pTable1->dwFlags & ITEM_FLAG_STACKABLE) || pTable1->bType == ITEM_BLEND)
            continue;

        if (pItem1->GetVnum() == 50300)
        {
            for (WORD j = i + 1; j < end; ++j)
            {
                LPITEM pItem2 = GetInventoryItem(j);
                if (!pItem2 || pItem1->GetVnum() != pItem2->GetVnum())
                    continue;

                if (pItem1->GetSocket(0) != pItem2->GetSocket(0))
                    continue;


                if(pItem1->GetCount() == g_bItemCountLimit)
                    continue;

                int countToAdd = pItem2->GetCount();
                pItem1->SetCount(pItem1->GetCount() + countToAdd);

                pItem2->RemoveFromCharacter();
                M2_DESTROY_ITEM(pItem2);
            }
            continue;
        }

        for (WORD j = i + 1; j < end; ++j)
        {
            LPITEM pItem2 = GetInventoryItem(j);
            if (!pItem2)
                continue;

            if (pItem1->GetVnum() != pItem2->GetVnum())
                continue;

            if(pItem1->GetCount() == g_bItemCountLimit)
                continue;

            int countToAdd = pItem2->GetCount();
            pItem1->SetCount(pItem1->GetCount() + countToAdd);

            pItem2->RemoveFromCharacter();
            M2_DESTROY_ITEM(pItem2);
        }
    }

    SetSortSpecialInventoryPulse(get_global_time() + 15);
    ChatPacket(CHAT_TYPE_INFO, "[LS;1951]");
}
#endif
#endif
 
Geri
Üst