Yardım Toplu sandık açma

Konu sahibi bu konuda soru soruyor. Sorusu ile ilgili bilgisi olanların yanıtlamasını bekliyor.

damador

Üye
Üye
Mesaj
155
Çözümler
7
Beğeni
44
Puan
489
Ticaret Puanı
0
Merhaba Ava2 filesin'den CHEST_DROP ve MULTI_CHEST söktüm sistem çalışıyor ama sandıktan çıkan itemlerin chatte sadece id leri çıkıyor

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

[CODE
char_item.cpp:
 ]bool CHARACTER::GiveItemFromSpecialItemGroupNew(DWORD dwGroupNum, WORD& loopCount)
{
    const CSpecialItemGroup* pGroup = ITEM_MANAGER::instance().GetSpecialItemGroup(dwGroupNum);
    if (!pGroup)
    {
        sys_err("cannot find special item group %d", dwGroupNum);
        return false;
    }
    std::map<DWORD, WORD> vecItemCounts;
    std::map<LPITEM, WORD> vecUpdateItems;
    const WORD constCount = loopCount;
    WORD workCount = loopCount;

    int returnCount = 5;

    for (DWORD j = 0; j < constCount; ++j)
    {
        if (returnCount <= 0 || workCount <= 0)
            break;
        std::vector <int> idxes;
        const int n = pGroup->GetMultiIndex(idxes);

        bool isOkey = false;

        for (int i = 0; i < n; i++)
        {
            if (returnCount <= 0 || (workCount <= 0 && !isOkey))
                break;

            const int idx = idxes[i];
            const DWORD dwVnum = pGroup->GetVnum(idx);
            const DWORD dwEarnCount = pGroup->GetCount(idx);
            DWORD dwCount = pGroup->GetCount(idx);

            switch (dwVnum)
            {
                case CSpecialItemGroup::GOLD:
                    PointChange(POINT_GOLD, dwCount);
                    if(isOkey == false)
                    {
                        isOkey = true;
                        workCount -= 1;
                    }
                    break;
                case CSpecialItemGroup::POISON:
                    AttackedByPoison(NULL);
                    if(isOkey == false)
                    {
                        isOkey = true;
                        workCount -= 1;
                    }
                    break;
                case CSpecialItemGroup::EXP:
                    PointChange(POINT_EXP, dwCount);
                    if(isOkey == false)
                    {
                        isOkey = true;
                        workCount -= 1;
                    }
                    break;
                case CSpecialItemGroup::MOB:
                {
                    LPCHARACTER ch = CHARACTER_MANAGER::instance().SpawnMob(dwCount, GetMapIndex(), GetX() + number(-500, 500), GetY() + number(-500, 500), 0, true, -1);
                    if (ch)
                        ch->SetAggressive();
                    
                    if(isOkey == false)
                    {
                        isOkey = true;
                        workCount -= 1;
                    }
                }
                break;
                case CSpecialItemGroup::MOB_GROUP:
                    CHARACTER_MANAGER::instance().SpawnGroup(dwCount, GetMapIndex(), GetX() - number(300, 500), GetY() - number(300, 500), GetX() + number(300, 500), GetY() + number(300, 500), NULL, true);
                    if(isOkey == false)
                    {
                        isOkey = true;
                        workCount -= 1;
                    }
                    break;
                case CSpecialItemGroup::SLOW:
                    AddAffect(AFFECT_SLOW, POINT_MOV_SPEED, -(int)dwCount, AFF_SLOW, 300, 0, true);
                    if(isOkey == false)
                    {
                        isOkey = true;
                        workCount -= 1;
                    }
                    break;
                case CSpecialItemGroup::DRAIN_HP:
                {
                    int iDropHP = GetMaxHP() * dwCount / 100;
                    iDropHP = MIN(iDropHP, GetHP() - 1);
                    PointChange(POINT_HP, -iDropHP);
                    if(isOkey == false)
                    {
                        isOkey = true;
                        workCount -= 1;
                    }
                }
                break;
#ifdef ENABLE_WOLFMAN
                case CSpecialItemGroup::BLEEDING:
                {
                    AttackedByBleeding(NULL);
                    if(isOkey == false)
                    {
                        isOkey = true;
                        workCount -= 1;
                    }
                }
                break;
#endif
                default:
                {
                    LPITEM item = ITEM_MANAGER::Instance().CreateItem(dwVnum, dwCount);
                    if (item)
                    {
                        if (AutoGiveItemChest(item, dwCount, vecUpdateItems))
                        {
                            if(isOkey == false)
                            {
                                isOkey = true;
                                workCount -= 1;
                            }

                            auto itCount = vecItemCounts.find(dwVnum);
                            if (itCount != vecItemCounts.end())
                                itCount->second += dwEarnCount;
                            else
                                vecItemCounts.emplace(dwVnum, dwEarnCount);

                            if (dwCount == 0)
                            {
                                M2_DESTROY_ITEM(item);
                                continue;
                            }
                        }
                        else
                        {
                            M2_DESTROY_ITEM(item);
                            returnCount -= 1;
                        }
                    }
                }
            }
        }
    }

    for (auto it = vecUpdateItems.begin(); it != vecUpdateItems.end(); ++it)
    {
        LPITEM item = it->first;
        item->SetUpdateStatus(false);
        if (item->GetCount() != it->second)
            item->UpdatePacket();

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

    for (auto it = vecItemCounts.begin(); it != vecItemCounts.end(); ++it)
        ChatPacket(CHAT_TYPE_ITEM_INFO, LC_TEXT("durdu_03"), it->first, it->second);

    loopCount = workCount;
    return (workCount != constCount);
}

Kod:
    for (auto it = vecUpdateItems.begin(); it != vecUpdateItems.end(); ++it)
    {
        LPITEM item = it->first;
        item->SetUpdateStatus(false);
        if (item->GetCount() != it->second)
            item->UpdatePacket();

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

    for (auto it = vecItemCounts.begin(); it != vecItemCounts.end(); ++it)
        ChatPacket(CHAT_TYPE_ITEM_INFO, LC_TEXT("durdu_03"), it->first, it->second);

bu kısma tam olarak ne eklemem lazım ? bilen arkadaşlar yardımcı olabilirmi
 
herhangi bir donma olmadan 1 saniyede 1k sandığı açıyor

809 mysql 86 27 0 684M 446M select 0:02 0.03% mysqld
809 mysql 86 27 0 684M 446M select 0:02 2.43% mysqld 1k sandık açınca anlık artıyor
 
Son düzenleme:
herhangi bir donma olmadan 1 saniyede 1k sandığı açıyor

809 mysql 86 27 0 684M 446M select 0:02 0.03% mysqld
809 mysql 86 27 0 684M 446M select 0:02 2.43% mysqld 1k sandık açınca anlık artıyor
hee değerler için teşekkürler bende denerim
 
Geri
Üst