示例#1
0
    /// <summary>
    /// 按个例放入道具
    /// </summary>
    /// <param name="item">道具个例</param>
    /// <param name="amount">数量</param>
    /// <param name="simulLoseItems">同时失去的道具</param>
    public void Get(ItemData item, int amount, params ItemWithAmount[] simulLoseItems)
    {
        if (customGetAction != null && customGetAction(item, amount))
        {
            return;
        }

        if (item.Model_old.StackAble || !item.IsInstance)
        {
            Get(item.Model_old, amount, simulLoseItems);
        }
        else if (!item.Model_old.StackAble && amount == 1)
        {
            int oldAmount = 0;
            if (simulLoseItems != null && simulLoseItems.Length > 0)
            {
                Lose(simulLoseItems);
            }
            if (keyedSlots.TryGetValue(item.ModelID, out var find))
            {
                oldAmount = find.Count;
                find.Add(PutIntoEmptySlot(item, 1));
            }
            else
            {
                keyedSlots.Add(item.ModelID, new List <ItemSlotData>()
                {
                    PutIntoEmptySlot(item, 1)
                });
            }
            OnItemAmountChanged?.Invoke(item.Model_old, oldAmount, oldAmount + amount);
        }
    }
示例#2
0
    /// <summary>
    /// 按原型放入道具
    /// </summary>
    /// <param name="model">道具原型</param>
    /// <param name="amount">数量</param>
    /// <param name="simulLoseItems">同时失去的道具</param>
    public void Get(ItemBase model, int amount, params ItemWithAmount[] simulLoseItems)
    {
        if (customGetAction != null && customGetAction(new ItemData(model, false), amount))
        {
            return;
        }

        if (!model || amount < 1)
        {
            return;
        }
        WeightCost += model.Weight * amount;
        if (simulLoseItems != null && simulLoseItems.Length > 0)
        {
            Lose(simulLoseItems);
        }
        ItemData item      = null;
        int      oldAmount = 0;

        if (keyedSlots.TryGetValue(model.ID, out var find))
        {
            ItemWithAmount iwa = null;
            foreach (var slot in find)
            {
                oldAmount += slot.amount;
                if (!item)
                {
                    item = slot.item;
                    if (item)
                    {
                        items.TryGetValue(item.ID, out iwa);
                    }
                }
                int take = slot.Put(amount);
                if (iwa)
                {
                    iwa.amount += take;
                }
                amount -= take;
            }
        }
        else
        {
            find = new List <ItemSlotData>();
            keyedSlots.Add(model.ID, find);
        }
        CostEmptySlot(find);
        OnItemAmountChanged?.Invoke(model, oldAmount, oldAmount + amount);

        void CostEmptySlot(List <ItemSlotData> collection)
        {
            if (amount <= 0 || collection == null)
            {
                return;
            }
            if (model.StackAble && item == null)
            {
                item = model.CreateData();                                 //如果物品可叠加但没有在背包中找到,则这个是新物品
            }
            ItemSlotData temp;

            for (int i = 0; i < amount / model.StackNum; i++)
            {
                temp = PutIntoEmptySlot(model.StackAble ? item : model.CreateData(), model.StackNum);
                if (temp)
                {
                    collection.Add(temp);
                }
            }
            if (model.StackAble)
            {
                temp = PutIntoEmptySlot(item, amount % model.StackNum);
                if (temp)
                {
                    collection.Add(temp);
                }
            }
        }
    }