查看: 206|回复: 8

[问题求助] 求助代码判断背包里是否有该物品

[复制链接]

530

时沙

4

精华

35

主题

声望: 7078   虚弱: 4

Lv.3(忠诚者)

QQ群:277946695

炉石金鸡报晓积少成多时沙之瓶信仰战假死猎人今天也只能打恢复的增强萨金鼠(ytfirefox制)

发表于 2020-6-17 01:39:56 | 显示全部楼层 |阅读模式
10DKP
求助各位代码大佬,如何判断背包里是否有该物品,以及数量。
我之前用 player->HasItemCount(id1, count1))来判断,但是这样判断有一个问题就是身上的装备也会被计算在内。
player->DestroyItemCount(id1, count1, true); 删除物品也会删除人物身上的物品,而不是背包内的。

求大佬指教如何判断背包内的物品和删除背包内的物品。










2020-06-17_013719.png

最佳答案

查看完整内容

改下HasItemCount之类的不就好了? 调用 player->HasItemCount(id,count,false,true);

1320

时沙

46

精华

117

主题

声望: 10336   虚弱: 0

管理员

↓收集癖,你懂的↓

万神殿圣光永恒炉石无冕者希尔瓦娜斯·风行者伊利丹·怒风奔波尔菠萝泰坦之握金鸡报晓瓦兰纳尔·远古王者之锤积少成多时沙之瓶炉石天马荣耀属于联盟!为了部落!Doge比格沃斯先生雷施哼哼(lulus制)uiwow(lulus制)银色北伐军黑色宝石猎豹泰兰德·语风莉莉安·沃斯祖国万岁!!小咕信仰战假死猎人今天也只能打恢复的增强萨跑路骑士吟游牧师孝顺骑士潜行者登山猎手划水武僧搓水法爷卖糖术神金鼠(ytfirefox制)

发表于 2020-6-17 01:39:57 | 显示全部楼层
改下HasItemCount之类的不就好了?
  1. bool Player::HasItemCount(uint32 item, uint32 count, bool inBankAlso, bool onlyBag) const
  2. {
  3.     uint32 tempcount = 0;
  4.     if (!onlyBag)
  5.     {
  6.         for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; i++)
  7.         {
  8.             Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i);
  9.             if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
  10.             {
  11.                 tempcount += pItem->GetCount();
  12.                 if (tempcount >= count)
  13.                     return true;
  14.             }
  15.         }
  16.         for (uint8 i = KEYRING_SLOT_START; i < CURRENCYTOKEN_SLOT_END; ++i)
  17.         {
  18.             Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i);
  19.             if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
  20.             {
  21.                 tempcount += pItem->GetCount();
  22.                 if (tempcount >= count)
  23.                     return true;
  24.             }
  25.         }
  26.     }
  27.     for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; i++)
  28.     {
  29.         if (Bag* pBag = GetBagByPos(i))
  30.         {
  31.             for (uint32 j = 0; j < pBag->GetBagSize(); j++)
  32.             {
  33.                 Item* pItem = GetItemByPos(i, j);
  34.                 if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
  35.                 {
  36.                     tempcount += pItem->GetCount();
  37.                     if (tempcount >= count)
  38.                         return true;
  39.                 }
  40.             }
  41.         }
  42.     }
  43.     if (inBankAlso)
  44.     {
  45.         for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; i++)
  46.         {
  47.             Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i);
  48.             if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
  49.             {
  50.                 tempcount += pItem->GetCount();
  51.                 if (tempcount >= count)
  52.                     return true;
  53.             }
  54.         }
  55.         for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; i++)
  56.         {
  57.             if (Bag* pBag = GetBagByPos(i))
  58.             {
  59.                 for (uint32 j = 0; j < pBag->GetBagSize(); j++)
  60.                 {
  61.                     Item* pItem = GetItemByPos(i, j);
  62.                     if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
  63.                     {
  64.                         tempcount += pItem->GetCount();
  65.                         if (tempcount >= count)
  66.                             return true;
  67.                     }
  68.                 }
  69.             }
  70.         }
  71.     }
  72.     return false;
  73. }
复制代码


调用 player->HasItemCount(id,count,false,true);

209

时沙

4

精华

16

主题

声望: 2457   虚弱: 0

Lv.4(锻造者)

炉石信仰战今天也只能打恢复的增强萨吟游牧师金鼠(ytfirefox制)

发表于 2020-6-17 15:03:46 | 显示全部楼层
本帖最后由 fang139842 于 2020-6-17 15:09 编辑

用这个试试
这个是获取  player:HasItem

玩家::HasItem
如果玩家已指定给定数量的条目,则返回“ true”,否则返回“ false”。
这个是删除  player:RemoveItem
玩家::RemoveItem
从玩家移除指定数量的指定物品。

530

时沙

4

精华

35

主题

声望: 7078   虚弱: 4

Lv.3(忠诚者)

QQ群:277946695

炉石金鸡报晓积少成多时沙之瓶信仰战假死猎人今天也只能打恢复的增强萨金鼠(ytfirefox制)

 楼主| 发表于 2020-6-17 15:46:01 | 显示全部楼层
fang139842 发表于 2020-6-17 15:03
用这个试试
这个是获取  player:HasItem
这个是删除  player:RemoveItem

,,你的这个说明在哪里看的,,哪里有参考文档???

60

时沙

0

精华

2

主题

声望: 135   虚弱: 0

Lv.2(潜行者)

炉石

发表于 2020-6-17 20:40:34 | 显示全部楼层
fang139842 发表于 2020-6-17 15:03
用这个试试
这个是获取  player:HasItem
这个是删除  player:RemoveItem

你这个是lua吧,楼主应该是问源码的,楼主可以使用 player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); 按照物品位置删除就不会删除身上的了

209

时沙

4

精华

16

主题

声望: 2457   虚弱: 0

Lv.4(锻造者)

炉石信仰战今天也只能打恢复的增强萨吟游牧师金鼠(ytfirefox制)

发表于 2020-6-17 22:52:16 | 显示全部楼层
额 ,,,不好意思,搞歪了

530

时沙

4

精华

35

主题

声望: 7078   虚弱: 4

Lv.3(忠诚者)

QQ群:277946695

炉石金鸡报晓积少成多时沙之瓶信仰战假死猎人今天也只能打恢复的增强萨金鼠(ytfirefox制)

 楼主| 发表于 2020-6-21 04:16:05 | 显示全部楼层
ayase 发表于 2020-6-17 22:09
改下HasItemCount之类的不就好了?

经过测试。无法正确判断。

17

时沙

0

精华

0

主题

声望: 88   虚弱: 0

Lv.2(潜行者)

炉石

发表于 2020-6-22 21:01:57 | 显示全部楼层
如果不判断身上物品的,就把代码里

for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; i++)
        {
            Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i);
            if (pItem && pItem->GetEntry() == item && !pItem->IsInTrade())
            {
                tempcount += pItem->GetCount();
                if (tempcount >= count)
                    return true;
            }
        }
这个去掉就好了

28

时沙

0

精华

0

主题

声望: 69   虚弱: 1

Lv.1(追随者)

发表于 2020-7-5 20:41:12 | 显示全部楼层
各种大神的回帖 不错
快速回复 返回顶部 返回列表