/// <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); } }
/// <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); } } } }