Çözülemedi npcden eşya ile satın alma k envanter uyarlaması

  • Konuyu açan Konuyu açan hasanmacit
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 14
  • Gösterim Gösterim 202
Ne yazık ki bu konuda sorulara çözüm bulunmuyor. Eğer konuda yorumlar varsa hepsini inceleyebilirsiniz. Belki sizlerin sorununuzu çözmek için için ipuçları bulabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

hasanmacit

Geliştirici
Geliştirici
Yardımsever Üye
Emekli Üye
Editör
Mesaj
5.652
Çözümler
235
Beğeni
6.779
Puan
3.850
Ticaret Puanı
7
selamlar. doğru gözüken bir uyarlama fakat eşyayı okumuyor ben mi bir yerde yanlış yapıyorum diye size de sormak istedim. countspecifyitem den eşyaları okuyor. eşya aslında var ama okuyamıyor sanırım. anlamadım. düşüncesi olan? eklediğim konu aşağıda.

C++:
Genişlet Daralt Kopyala
    if (dwWItemVnum > 0)
            if (ch->CountSpecifyItem(dwWItemVnum) < (int)dwPrice)
                return SHOP_SUBHEADER_GC_NOT_ENOUGH_ITEM;

C++:
Genişlet Daralt Kopyala
int CHARACTER::CountSpecifyItem(DWORD vnum) const
{
    int    count = 0;
    LPITEM item;

    for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
    {
        item = GetInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
            {
                continue;
            }
            else
            {
                count += item->GetCount();
            }
        }
    }
#ifdef ENABLE_SPECIAL_STORAGE
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetUpgradeInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetBookInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetStoneInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetFlowerInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetAttrInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetChestInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
#endif
    return count;
}

 
SPECIAL_INVENTORY_MAX_NUM kısmını INVENTORY_MAX_NUM ile değiştirip denedinmi
 
GetUpgradeInventoryItem diye belirtmissin zaten

ENABLE_SPECIAL_STORAGE
var olan envanter düzenini değiştirmiyormuydu benmi yanlış hatırlıyorum :/ bi denesene ne kaybedersin :D
tamamda getupgradeinventoryitem special_max_numdan okuyor inventory_max_num yazarsam core verir
 
selamlar. doğru gözüken bir uyarlama fakat eşyayı okumuyor ben mi bir yerde yanlış yapıyorum diye size de sormak istedim. countspecifyitem den eşyaları okuyor. eşya aslında var ama okuyamıyor sanırım. anlamadım. düşüncesi olan? eklediğim konu aşağıda.

Kod:
Genişlet Daralt Kopyala
    if (dwWItemVnum > 0)
            if (ch->CountSpecifyItem(dwWItemVnum) < (int)dwPrice)
                return SHOP_SUBHEADER_GC_NOT_ENOUGH_ITEM;

Kod:
Genişlet Daralt Kopyala
int CHARACTER::CountSpecifyItem(DWORD vnum) const
{
    int    count = 0;
    LPITEM item;

    for (int i = 0; i < INVENTORY_MAX_NUM; ++i)
    {
        item = GetInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
            {
                continue;
            }
            else
            {
                count += item->GetCount();
            }
        }
    }
#ifdef ENABLE_SPECIAL_STORAGE
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetUpgradeInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetBookInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetStoneInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetFlowerInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetAttrInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
    for (int i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
    {
        item = GetChestInventoryItem(i);
        if (NULL != item && item->GetVnum() == vnum)
        {
            if (m_pkMyShop && m_pkMyShop->IsSellingItem(item->GetID()))
                continue;
            else
                count += item->GetCount();
        }
    }
#endif
    return count;
}

C++:
Genişlet Daralt Kopyala
    int CShop::Buy(LPCHARACTER ch, BYTE pos)
    {
        if (pos >= m_itemVector.size())
        {
            sys_log(0, "Shop::Buy : invalid position %d : %s", pos, ch->GetName());
            return SHOP_SUBHEADER_GC_INVALID_POS;
        }

        sys_log(0, "Shop::Buy : name %s pos %d", ch->GetName(), pos);

        GuestMapType::iterator it = m_map_guest.find(ch);

        if (it == m_map_guest.end())
            return SHOP_SUBHEADER_GC_END;

        SHOP_ITEM& r_item = m_itemVector[pos];
#ifdef ENABLE_BUY_WITH_ITEM
        DWORD dwWItemVnum = r_item.witemVnum;
#endif
#ifdef ENABLE_YANG_LIMIT_SYSTEM
        long long llPrice = r_item.price;
#else
        DWORD dwPrice = r_item.price;
#endif
#ifdef ENABLE_BUY_WITH_ITEM
        if (dwWItemVnum > 0)
        {
#ifdef ENABLE_YANG_LIMIT_SYSTEM
            if (ch->CountSpecifyItem(dwWItemVnum) < llPrice)
#else
            if (ch->CountSpecifyItem(dwWItemVnum) < dwPrice)
#endif
            {
                return SHOP_SUBHEADER_GC_NOT_ENOUGH_ITEM;
            }
        }
#ifdef ENABLE_YANG_LIMIT_SYSTEM
        else if (ch->GetGold() < (long long)llPrice)
#else
        else if (ch->GetGold() < (int)dwPrice)
#endif
#else
        if (ch->GetGold() < dwPrice)
#endif
        {
            LogManager::instance().HackLog("SHOP_BUY_GOLD_OVERFLOW", ch);
            return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
        }

        LPITEM pkSelectedItem = ITEM_MANAGER::instance().Find(r_item.itemid);

        if (IsPCShop())
        {
            if (!pkSelectedItem)
            {
                sys_log(0, "Shop::Buy : Critical: This user seems to be a hacker : invalid pcshop item : BuyerPID:%d SellerPID:%d",
                    ch->GetPlayerID(),
                    m_pkPC->GetPlayerID());

                return SHOP_SUBHEADER_GC_SOLD_OUT; // @fixme132 false to SHOP_SUBHEADER_GC_SOLD_OUT
            }

            if ((pkSelectedItem->GetOwner() != m_pkPC))
            {
                sys_log(0, "Shop::Buy : Critical: This user seems to be a hacker : invalid pcshop item : BuyerPID:%d SellerPID:%d",
                    ch->GetPlayerID(),
                    m_pkPC->GetPlayerID());

                return SHOP_SUBHEADER_GC_SOLD_OUT; // @fixme132 false to SHOP_SUBHEADER_GC_SOLD_OUT
            }
        }

        //DWORD dwPrice = r_item.price;

        //if (it->second)    // if other empire, price is triple
        //    dwPrice *= 3;

#ifdef ENABLE_YANG_LIMIT_SYSTEM
        if (ch->GetGold() < (long long)llPrice)
        {
            sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %lld", ch->GetName(), ch->GetGold(), llPrice);
            return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
        }
#else
        if (ch->GetGold() < (int)dwPrice)
        {
            sys_log(1, "Shop::Buy : Not enough money : %s has %d, price %d", ch->GetName(), ch->GetGold(), dwPrice);
            return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
        }
#endif

        LPITEM item;

        if (m_pkPC)
            item = r_item.pkItem;
        else
            item = ITEM_MANAGER::instance().CreateItem(r_item.vnum, r_item.count);

        if (!item)
            return SHOP_SUBHEADER_GC_SOLD_OUT;

#ifdef ENABLE_SHOP_BLACKLIST
        if (!m_pkPC)
        {
            if (quest::CQuestManager::instance().GetEventFlag("hivalue_item_sell") == 0)
            {

                if (item->GetVnum() == 70024 || item->GetVnum() == 70035)
                {
                    return SHOP_SUBHEADER_GC_END;
                }
            }
        }
#endif

        int iEmptyPos;
        if (item->IsDragonSoul())
        {
            iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
        }
#ifdef ENABLE_SPECIAL_STORAGE
        else if (item->IsUpgradeItem())
            iEmptyPos = ch->GetEmptyUpgradeInventory(item);
        else if (item->IsBook())
            iEmptyPos = ch->GetEmptyBookInventory(item);
        else if (item->IsStone())
            iEmptyPos = ch->GetEmptyStoneInventory(item);
        else if (item->IsChest())
            iEmptyPos = ch->GetEmptyChestInventory(item);
#endif
        else
        {
            iEmptyPos = ch->GetEmptyInventory(item->GetSize());
        }

        if (iEmptyPos < 0)
        {
            if (m_pkPC)
            {
                sys_log(1, "Shop::Buy at PC Shop : Inventory full : %s size %d", ch->GetName(), item->GetSize());
                return SHOP_SUBHEADER_GC_INVENTORY_FULL;
            }
            else
            {
                sys_log(1, "Shop::Buy : Inventory full : %s size %d", ch->GetName(), item->GetSize());
                M2_DESTROY_ITEM(item);
                return SHOP_SUBHEADER_GC_INVENTORY_FULL;
            }
        }

#ifdef ENABLE_BUY_WITH_ITEM
        if (dwWItemVnum > 0)
#ifdef ENABLE_YANG_LIMIT_SYSTEM
            ch->RemoveSpecifyItem(dwWItemVnum, llPrice);
#else
            ch->RemoveSpecifyItem(dwWItemVnum, dwPrice);
#endif
        else
#ifdef ENABLE_YANG_LIMIT_SYSTEM
            ch->PointChange(POINT_GOLD, -llPrice, false);
#else
            ch->PointChange(POINT_GOLD, -dwPrice, false);
#endif
#else
        ch->PointChange(POINT_GOLD, -dwPrice, false);
#endif


        DWORD dwTax = 0;
        int iVal = 0;

        {
            iVal = quest::CQuestManager::instance().GetEventFlag("personal_shop");

            if (0 < iVal)
            {
                if (iVal > 100)
                    iVal = 100;

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                dwTax = llPrice * iVal / 100;
                llPrice = llPrice - dwTax;
#else
                dwTax = dwPrice * iVal / 100;
                dwPrice = dwPrice - dwTax;
#endif
            }
            else
            {
                iVal = 0;
                dwTax = 0;
            }
        }


        if (!m_pkPC)
        {
            CMonarch::instance().SendtoDBAddMoney(dwTax, ch->GetEmpire(), ch);
        }


        if (m_pkPC)
        {
            m_pkPC->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);

            if (item->GetVnum() == 90008 || item->GetVnum() == 90009) // VCARD
            {
                VCardUse(m_pkPC, ch, item);
                item = NULL;
            }
            else
            {
                char buf[512];

                if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
                {
#ifdef ENABLE_YANG_LIMIT_SYSTEM
                    snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %lld", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), llPrice);
#else
                    snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %u", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), dwPrice);
#endif
                    LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), SHOP_BUY, buf);
                    LogManager::instance().GoldBarLog(m_pkPC->GetPlayerID(), item->GetID(), SHOP_SELL, buf);
                }

                item->RemoveFromCharacter();
                if (item->IsDragonSoul())
                    item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
#ifdef ENABLE_SPECIAL_STORAGE
                else if (item->IsUpgradeItem())
                    item->AddToCharacter(ch, TItemPos(UPGRADE_INVENTORY, iEmptyPos));
                else if (item->IsBook())
                    item->AddToCharacter(ch, TItemPos(BOOK_INVENTORY, iEmptyPos));
                else if (item->IsStone())
                    item->AddToCharacter(ch, TItemPos(STONE_INVENTORY, iEmptyPos));
                else if (item->IsChest())
                    item->AddToCharacter(ch, TItemPos(CHEST_INVENTORY, iEmptyPos));
#endif
                else
                    item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
                ITEM_MANAGER::instance().FlushDelayedSave(item);


#ifdef ENABLE_YANG_LIMIT_SYSTEM
                snprintf(buf, sizeof(buf), "%s %u(%s) %llu %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), llPrice, item->GetCount());
#else
                snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), dwPrice, item->GetCount());
#endif
                LogManager::instance().ItemLog(ch, item, "SHOP_BUY", buf);

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                snprintf(buf, sizeof(buf), "%s %u(%s) %llu %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), llPrice, item->GetCount());
#else
                snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), dwPrice, item->GetCount());
#endif
                LogManager::instance().ItemLog(m_pkPC, item, "SHOP_SELL", buf);
            }

            r_item.pkItem = NULL;
            BroadcastUpdateItem(pos);

#ifdef ENABLE_YANG_LIMIT_SYSTEM
            m_pkPC->PointChange(POINT_GOLD, llPrice, false);
#else
            m_pkPC->PointChange(POINT_GOLD, dwPrice, false);
#endif

            if (iVal > 0)
                m_pkPC->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÆÇ¸Å±İ¾×ÀÇ %d %% °¡ ¼¼±İÀ¸·Î ³ª°¡°ÔµË´Ï´Ù"), iVal);

            CMonarch::instance().SendtoDBAddMoney(dwTax, m_pkPC->GetEmpire(), m_pkPC);
        }
        else
        {
            if (item->IsDragonSoul())
                item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
#ifdef ENABLE_SPECIAL_STORAGE
            else if (item->IsUpgradeItem())
            {

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                long long bCount = item->GetCount();
#else
                WORD bCount = item->GetCount();
#endif
                if (IS_SET(item->GetFlag(), ITEM_FLAG_STACKABLE))
                {
                    for (WORD i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = ch->GetUpgradeInventoryItem(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 ENABLE_YANG_LIMIT_SYSTEM
                            long long bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
#else
                            WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;
                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                                break;
                        }
                    }

                    item->SetCount(bCount);
                }

                if (bCount > 0)
                    item->AddToCharacter(ch, TItemPos(UPGRADE_INVENTORY, iEmptyPos));
                else
                    M2_DESTROY_ITEM(item);
                //item->AddToCharacter(ch, TItemPos(UPGRADE_INVENTORY, iEmptyPos));
            }
            else if (item->IsBook())
            {

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                long long bCount = item->GetCount();
#else
                WORD bCount = item->GetCount();
#endif
                if (IS_SET(item->GetFlag(), ITEM_FLAG_STACKABLE))
                {
                    for (WORD i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = ch->GetBookInventoryItem(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 ENABLE_YANG_LIMIT_SYSTEM
                            long long bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
#else
                            WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;
                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                                break;
                        }
                    }

                    item->SetCount(bCount);
                }

                if (bCount > 0)
                    item->AddToCharacter(ch, TItemPos(BOOK_INVENTORY, iEmptyPos));
                else
                    M2_DESTROY_ITEM(item);
                //item->AddToCharacter(ch, TItemPos(BOOK_INVENTORY, iEmptyPos));

            }
            else if (item->IsStone())
            {

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                long long bCount = item->GetCount();
#else
                WORD bCount = item->GetCount();
#endif
                if (IS_SET(item->GetFlag(), ITEM_FLAG_STACKABLE))
                {
                    for (WORD i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = ch->GetStoneInventoryItem(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 ENABLE_YANG_LIMIT_SYSTEM
                            long long bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
#else
                            WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;
                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                                break;
                        }
                    }

                    item->SetCount(bCount);
                }

                if (bCount > 0)
                    item->AddToCharacter(ch, TItemPos(STONE_INVENTORY, iEmptyPos));
                else
                    M2_DESTROY_ITEM(item);
                //item->AddToCharacter(ch, TItemPos(STONE_INVENTORY, iEmptyPos));
            }
            else if (item->IsChest())
            {

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                long long bCount = item->GetCount();
#else
                WORD bCount = item->GetCount();
#endif
                if (IS_SET(item->GetFlag(), ITEM_FLAG_STACKABLE))
                {
                    for (WORD i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = ch->GetChestInventoryItem(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 ENABLE_YANG_LIMIT_SYSTEM
                            long long bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
#else
                            WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;
                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                                break;
                        }
                    }

                    item->SetCount(bCount);
                }

                if (bCount > 0)
                    item->AddToCharacter(ch, TItemPos(CHEST_INVENTORY, iEmptyPos));
                else
                    M2_DESTROY_ITEM(item);
                //item->AddToCharacter(ch, TItemPos(CHEST_INVENTORY, iEmptyPos));



            }
#endif
            else
            {
#ifdef ENABLE_YANG_LIMIT_SYSTEM
                long long bCount = item->GetCount();
#else
                WORD bCount = item->GetCount();
#endif
                if (IS_SET(item->GetFlag(), ITEM_FLAG_STACKABLE))
                {
                    for (WORD i = 0; i < INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = ch->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 ENABLE_YANG_LIMIT_SYSTEM
                            long long bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
#else
                            WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;
                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                                break;
                        }
                    }

                    item->SetCount(bCount);
                }

                if (bCount > 0)
                    item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
                else
                    M2_DESTROY_ITEM(item);
            }
            //item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));



            ITEM_MANAGER::instance().FlushDelayedSave(item);
            LogManager::instance().ItemLog(ch, item, "BUY", item->GetName());

            if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
            {
                LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), PERSONAL_SHOP_BUY, "");
            }

#ifdef ENABLE_YANG_LIMIT_SYSTEM
            DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), -llPrice);
#else
            DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), -dwPrice);
#endif
        }
        if (item)
#ifdef ENABLE_YANG_LIMIT_SYSTEM
            sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %lld", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), llPrice);
#else
            sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %u", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), dwPrice);
#endif

        ch->Save();

        return (SHOP_SUBHEADER_GC_OK);
    }

Bu kodun içeriğinden bakarak yapabilirsiniz örnek bir kod bloğu paylaştım bu sisteme ait.
 
C++:
Genişlet Daralt Kopyala
    int CShop::Buy(LPCHARACTER ch, BYTE pos)
    {
        if (pos >= m_itemVector.size())
        {
            sys_log(0, "Shop::Buy : invalid position %d : %s", pos, ch->GetName());
            return SHOP_SUBHEADER_GC_INVALID_POS;
        }

        sys_log(0, "Shop::Buy : name %s pos %d", ch->GetName(), pos);

        GuestMapType::iterator it = m_map_guest.find(ch);

        if (it == m_map_guest.end())
            return SHOP_SUBHEADER_GC_END;

        SHOP_ITEM& r_item = m_itemVector[pos];
#ifdef ENABLE_BUY_WITH_ITEM
        DWORD dwWItemVnum = r_item.witemVnum;
#endif
#ifdef ENABLE_YANG_LIMIT_SYSTEM
        long long llPrice = r_item.price;
#else
        DWORD dwPrice = r_item.price;
#endif
#ifdef ENABLE_BUY_WITH_ITEM
        if (dwWItemVnum > 0)
        {
#ifdef ENABLE_YANG_LIMIT_SYSTEM
            if (ch->CountSpecifyItem(dwWItemVnum) < llPrice)
#else
            if (ch->CountSpecifyItem(dwWItemVnum) < dwPrice)
#endif
            {
                return SHOP_SUBHEADER_GC_NOT_ENOUGH_ITEM;
            }
        }
#ifdef ENABLE_YANG_LIMIT_SYSTEM
        else if (ch->GetGold() < (long long)llPrice)
#else
        else if (ch->GetGold() < (int)dwPrice)
#endif
#else
        if (ch->GetGold() < dwPrice)
#endif
        {
            LogManager::instance().HackLog("SHOP_BUY_GOLD_OVERFLOW", ch);
            return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
        }

        LPITEM pkSelectedItem = ITEM_MANAGER::instance().Find(r_item.itemid);

        if (IsPCShop())
        {
            if (!pkSelectedItem)
            {
                sys_log(0, "Shop::Buy : Critical: This user seems to be a hacker : invalid pcshop item : BuyerPID:%d SellerPID:%d",
                    ch->GetPlayerID(),
                    m_pkPC->GetPlayerID());

                return SHOP_SUBHEADER_GC_SOLD_OUT; // @fixme132 false to SHOP_SUBHEADER_GC_SOLD_OUT
            }

            if ((pkSelectedItem->GetOwner() != m_pkPC))
            {
                sys_log(0, "Shop::Buy : Critical: This user seems to be a hacker : invalid pcshop item : BuyerPID:%d SellerPID:%d",
                    ch->GetPlayerID(),
                    m_pkPC->GetPlayerID());

                return SHOP_SUBHEADER_GC_SOLD_OUT; // @fixme132 false to SHOP_SUBHEADER_GC_SOLD_OUT
            }
        }

        //DWORD dwPrice = r_item.price;

        //if (it->second)    // if other empire, price is triple
        //    dwPrice *= 3;

#ifdef ENABLE_YANG_LIMIT_SYSTEM
        if (ch->GetGold() < (long long)llPrice)
        {
            sys_log(1, "Shop::Buy : Not enough money : %s has %lld, price %lld", ch->GetName(), ch->GetGold(), llPrice);
            return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
        }
#else
        if (ch->GetGold() < (int)dwPrice)
        {
            sys_log(1, "Shop::Buy : Not enough money : %s has %d, price %d", ch->GetName(), ch->GetGold(), dwPrice);
            return SHOP_SUBHEADER_GC_NOT_ENOUGH_MONEY;
        }
#endif

        LPITEM item;

        if (m_pkPC)
            item = r_item.pkItem;
        else
            item = ITEM_MANAGER::instance().CreateItem(r_item.vnum, r_item.count);

        if (!item)
            return SHOP_SUBHEADER_GC_SOLD_OUT;

#ifdef ENABLE_SHOP_BLACKLIST
        if (!m_pkPC)
        {
            if (quest::CQuestManager::instance().GetEventFlag("hivalue_item_sell") == 0)
            {

                if (item->GetVnum() == 70024 || item->GetVnum() == 70035)
                {
                    return SHOP_SUBHEADER_GC_END;
                }
            }
        }
#endif

        int iEmptyPos;
        if (item->IsDragonSoul())
        {
            iEmptyPos = ch->GetEmptyDragonSoulInventory(item);
        }
#ifdef ENABLE_SPECIAL_STORAGE
        else if (item->IsUpgradeItem())
            iEmptyPos = ch->GetEmptyUpgradeInventory(item);
        else if (item->IsBook())
            iEmptyPos = ch->GetEmptyBookInventory(item);
        else if (item->IsStone())
            iEmptyPos = ch->GetEmptyStoneInventory(item);
        else if (item->IsChest())
            iEmptyPos = ch->GetEmptyChestInventory(item);
#endif
        else
        {
            iEmptyPos = ch->GetEmptyInventory(item->GetSize());
        }

        if (iEmptyPos < 0)
        {
            if (m_pkPC)
            {
                sys_log(1, "Shop::Buy at PC Shop : Inventory full : %s size %d", ch->GetName(), item->GetSize());
                return SHOP_SUBHEADER_GC_INVENTORY_FULL;
            }
            else
            {
                sys_log(1, "Shop::Buy : Inventory full : %s size %d", ch->GetName(), item->GetSize());
                M2_DESTROY_ITEM(item);
                return SHOP_SUBHEADER_GC_INVENTORY_FULL;
            }
        }

#ifdef ENABLE_BUY_WITH_ITEM
        if (dwWItemVnum > 0)
#ifdef ENABLE_YANG_LIMIT_SYSTEM
            ch->RemoveSpecifyItem(dwWItemVnum, llPrice);
#else
            ch->RemoveSpecifyItem(dwWItemVnum, dwPrice);
#endif
        else
#ifdef ENABLE_YANG_LIMIT_SYSTEM
            ch->PointChange(POINT_GOLD, -llPrice, false);
#else
            ch->PointChange(POINT_GOLD, -dwPrice, false);
#endif
#else
        ch->PointChange(POINT_GOLD, -dwPrice, false);
#endif


        DWORD dwTax = 0;
        int iVal = 0;

        {
            iVal = quest::CQuestManager::instance().GetEventFlag("personal_shop");

            if (0 < iVal)
            {
                if (iVal > 100)
                    iVal = 100;

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                dwTax = llPrice * iVal / 100;
                llPrice = llPrice - dwTax;
#else
                dwTax = dwPrice * iVal / 100;
                dwPrice = dwPrice - dwTax;
#endif
            }
            else
            {
                iVal = 0;
                dwTax = 0;
            }
        }


        if (!m_pkPC)
        {
            CMonarch::instance().SendtoDBAddMoney(dwTax, ch->GetEmpire(), ch);
        }


        if (m_pkPC)
        {
            m_pkPC->SyncQuickslot(QUICKSLOT_TYPE_ITEM, item->GetCell(), 255);

            if (item->GetVnum() == 90008 || item->GetVnum() == 90009) // VCARD
            {
                VCardUse(m_pkPC, ch, item);
                item = NULL;
            }
            else
            {
                char buf[512];

                if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
                {
#ifdef ENABLE_YANG_LIMIT_SYSTEM
                    snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %lld", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), llPrice);
#else
                    snprintf(buf, sizeof(buf), "%s FROM: %u TO: %u PRICE: %u", item->GetName(), ch->GetPlayerID(), m_pkPC->GetPlayerID(), dwPrice);
#endif
                    LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), SHOP_BUY, buf);
                    LogManager::instance().GoldBarLog(m_pkPC->GetPlayerID(), item->GetID(), SHOP_SELL, buf);
                }

                item->RemoveFromCharacter();
                if (item->IsDragonSoul())
                    item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
#ifdef ENABLE_SPECIAL_STORAGE
                else if (item->IsUpgradeItem())
                    item->AddToCharacter(ch, TItemPos(UPGRADE_INVENTORY, iEmptyPos));
                else if (item->IsBook())
                    item->AddToCharacter(ch, TItemPos(BOOK_INVENTORY, iEmptyPos));
                else if (item->IsStone())
                    item->AddToCharacter(ch, TItemPos(STONE_INVENTORY, iEmptyPos));
                else if (item->IsChest())
                    item->AddToCharacter(ch, TItemPos(CHEST_INVENTORY, iEmptyPos));
#endif
                else
                    item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
                ITEM_MANAGER::instance().FlushDelayedSave(item);


#ifdef ENABLE_YANG_LIMIT_SYSTEM
                snprintf(buf, sizeof(buf), "%s %u(%s) %llu %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), llPrice, item->GetCount());
#else
                snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", item->GetName(), m_pkPC->GetPlayerID(), m_pkPC->GetName(), dwPrice, item->GetCount());
#endif
                LogManager::instance().ItemLog(ch, item, "SHOP_BUY", buf);

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                snprintf(buf, sizeof(buf), "%s %u(%s) %llu %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), llPrice, item->GetCount());
#else
                snprintf(buf, sizeof(buf), "%s %u(%s) %u %u", item->GetName(), ch->GetPlayerID(), ch->GetName(), dwPrice, item->GetCount());
#endif
                LogManager::instance().ItemLog(m_pkPC, item, "SHOP_SELL", buf);
            }

            r_item.pkItem = NULL;
            BroadcastUpdateItem(pos);

#ifdef ENABLE_YANG_LIMIT_SYSTEM
            m_pkPC->PointChange(POINT_GOLD, llPrice, false);
#else
            m_pkPC->PointChange(POINT_GOLD, dwPrice, false);
#endif

            if (iVal > 0)
                m_pkPC->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ÆÇ¸Å±İ¾×ÀÇ %d %% °¡ ¼¼±İÀ¸·Î ³ª°¡°ÔµË´Ï´Ù"), iVal);

            CMonarch::instance().SendtoDBAddMoney(dwTax, m_pkPC->GetEmpire(), m_pkPC);
        }
        else
        {
            if (item->IsDragonSoul())
                item->AddToCharacter(ch, TItemPos(DRAGON_SOUL_INVENTORY, iEmptyPos));
#ifdef ENABLE_SPECIAL_STORAGE
            else if (item->IsUpgradeItem())
            {

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                long long bCount = item->GetCount();
#else
                WORD bCount = item->GetCount();
#endif
                if (IS_SET(item->GetFlag(), ITEM_FLAG_STACKABLE))
                {
                    for (WORD i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = ch->GetUpgradeInventoryItem(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 ENABLE_YANG_LIMIT_SYSTEM
                            long long bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
#else
                            WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;
                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                                break;
                        }
                    }

                    item->SetCount(bCount);
                }

                if (bCount > 0)
                    item->AddToCharacter(ch, TItemPos(UPGRADE_INVENTORY, iEmptyPos));
                else
                    M2_DESTROY_ITEM(item);
                //item->AddToCharacter(ch, TItemPos(UPGRADE_INVENTORY, iEmptyPos));
            }
            else if (item->IsBook())
            {

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                long long bCount = item->GetCount();
#else
                WORD bCount = item->GetCount();
#endif
                if (IS_SET(item->GetFlag(), ITEM_FLAG_STACKABLE))
                {
                    for (WORD i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = ch->GetBookInventoryItem(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 ENABLE_YANG_LIMIT_SYSTEM
                            long long bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
#else
                            WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;
                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                                break;
                        }
                    }

                    item->SetCount(bCount);
                }

                if (bCount > 0)
                    item->AddToCharacter(ch, TItemPos(BOOK_INVENTORY, iEmptyPos));
                else
                    M2_DESTROY_ITEM(item);
                //item->AddToCharacter(ch, TItemPos(BOOK_INVENTORY, iEmptyPos));

            }
            else if (item->IsStone())
            {

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                long long bCount = item->GetCount();
#else
                WORD bCount = item->GetCount();
#endif
                if (IS_SET(item->GetFlag(), ITEM_FLAG_STACKABLE))
                {
                    for (WORD i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = ch->GetStoneInventoryItem(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 ENABLE_YANG_LIMIT_SYSTEM
                            long long bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
#else
                            WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;
                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                                break;
                        }
                    }

                    item->SetCount(bCount);
                }

                if (bCount > 0)
                    item->AddToCharacter(ch, TItemPos(STONE_INVENTORY, iEmptyPos));
                else
                    M2_DESTROY_ITEM(item);
                //item->AddToCharacter(ch, TItemPos(STONE_INVENTORY, iEmptyPos));
            }
            else if (item->IsChest())
            {

#ifdef ENABLE_YANG_LIMIT_SYSTEM
                long long bCount = item->GetCount();
#else
                WORD bCount = item->GetCount();
#endif
                if (IS_SET(item->GetFlag(), ITEM_FLAG_STACKABLE))
                {
                    for (WORD i = 0; i < SPECIAL_INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = ch->GetChestInventoryItem(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 ENABLE_YANG_LIMIT_SYSTEM
                            long long bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
#else
                            WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;
                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                                break;
                        }
                    }

                    item->SetCount(bCount);
                }

                if (bCount > 0)
                    item->AddToCharacter(ch, TItemPos(CHEST_INVENTORY, iEmptyPos));
                else
                    M2_DESTROY_ITEM(item);
                //item->AddToCharacter(ch, TItemPos(CHEST_INVENTORY, iEmptyPos));



            }
#endif
            else
            {
#ifdef ENABLE_YANG_LIMIT_SYSTEM
                long long bCount = item->GetCount();
#else
                WORD bCount = item->GetCount();
#endif
                if (IS_SET(item->GetFlag(), ITEM_FLAG_STACKABLE))
                {
                    for (WORD i = 0; i < INVENTORY_MAX_NUM; ++i)
                    {
                        LPITEM item2 = ch->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 ENABLE_YANG_LIMIT_SYSTEM
                            long long bCount2 = MIN(g_bItemCountLimit - item2->GetCount(), bCount);
#else
                            WORD bCount2 = MIN(ITEM_MAX_COUNT - item2->GetCount(), bCount);
#endif
                            bCount -= bCount2;
                            item2->SetCount(item2->GetCount() + bCount2);

                            if (bCount == 0)
                                break;
                        }
                    }

                    item->SetCount(bCount);
                }

                if (bCount > 0)
                    item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));
                else
                    M2_DESTROY_ITEM(item);
            }
            //item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos));



            ITEM_MANAGER::instance().FlushDelayedSave(item);
            LogManager::instance().ItemLog(ch, item, "BUY", item->GetName());

            if (item->GetVnum() >= 80003 && item->GetVnum() <= 80007)
            {
                LogManager::instance().GoldBarLog(ch->GetPlayerID(), item->GetID(), PERSONAL_SHOP_BUY, "");
            }

#ifdef ENABLE_YANG_LIMIT_SYSTEM
            DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), -llPrice);
#else
            DBManager::instance().SendMoneyLog(MONEY_LOG_SHOP, item->GetVnum(), -dwPrice);
#endif
        }
        if (item)
#ifdef ENABLE_YANG_LIMIT_SYSTEM
            sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %lld", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), llPrice);
#else
            sys_log(0, "SHOP: BUY: name %s %s(x %d):%u price %u", ch->GetName(), item->GetName(), item->GetCount(), item->GetID(), dwPrice);
#endif

        ch->Save();

        return (SHOP_SUBHEADER_GC_OK);
    }

Bu kodun içeriğinden bakarak yapabilirsiniz örnek bir kod bloğu paylaştım bu sisteme ait.
kodlar aynısı zaten farklı değil
 
Burdaki ENABLE_BUY_WITH_ITEM definesini bir kontrol ederek bakar mısınız yanlış biryer varmı
 

Dosya Eklentileri

bu gibi çözemedim durumlarda maalesef ben sadece sys_log ekleyerek ilerliyorum yapılacak şey satın alma komutu sunucuya geldiği andan itibaren loglamak :(
 
sorunu çözünce gülme krizi tuttu beni :D /i arttırma 1000 yazıyordum 71085 kodlu olanı k envanterine gönderiyormuş fakat eşyayı koyduğum arttırma kağıdı kodu 39029du. ben 39029 diye çağırsam bile eşya olarak 71085 gönderiyormuş o yüzden de okuyamıyormuş aslında sorun yokmuş yani :D yardımcı olmaya çalışan herkese teşekkürler xd
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst