public static bool AddById(MapleClient c, int itemId, short quantity, string logInfo, string owner = null, int petid = -1) { if (quantity < 0) { return(false); } var ii = MapleItemInformationProvider.Instance; var type = ii.GetInventoryType(itemId); if (type != MapleInventoryType.Equip) { var slotMax = ii.GetSlotMax(c, itemId); var existing = c.Player.Inventorys[type.Value].ListById(itemId); if (!ii.IsThrowingStar(itemId) && !ii.IsBullet(itemId)) { if (existing.Any()) { // first update all existing slots to slotMax for (var i = 0; i < existing.Count && quantity > 0; i++) { var eItem = (Item)existing[i]; var oldQ = eItem.Quantity; if (oldQ < slotMax && (eItem.Owner == owner || owner == null)) { var newQ = (short)Math.Min(oldQ + quantity, slotMax); quantity -= (short)(newQ - oldQ); eItem.Quantity = newQ; //eItem.log("Added " + (newQ - oldQ) + " items to stack, new quantity is " + newQ + " (" + logInfo + " )", false); c.Send(PacketCreator.UpdateInventorySlot(type, eItem)); } } } while (quantity > 0) { // add new slots if there is still something left var newQ = Math.Min(quantity, slotMax); if (newQ != 0) { quantity -= newQ; var nItem = new Item(itemId, 0, newQ); //, petid); //nItem.log("Created while adding by id. Quantity: " + newQ + " (" + logInfo + ")", false); var newSlot = c.Player.Inventorys[type.Value].AddItem(nItem); if (newSlot == 128) { c.Send(PacketCreator.GetInventoryFull()); c.Send(PacketCreator.GetShowInventoryFull()); return(false); } if (owner != null) { nItem.Owner = owner; } c.Send(PacketCreator.AddInventorySlot(type, nItem)); if ((ii.IsThrowingStar(itemId) || ii.IsBullet(itemId)) && quantity == 0) { break; } } else { c.Send(PacketCreator.EnableActions()); return(false); } } } else { // Throwing Stars and Bullets - Add all into one slot regardless of quantity. var nItem = new Item(itemId, 0, quantity); //nItem.log("Created while adding by id. Quantity: " + quantity + " (" + logInfo + " )", false); var newSlot = c.Player.Inventorys[type.Value].AddItem(nItem); if (newSlot == 128) { c.Send(PacketCreator.GetInventoryFull()); c.Send(PacketCreator.GetShowInventoryFull()); return(false); } c.Send(PacketCreator.AddInventorySlot(type, nItem)); c.Send(PacketCreator.EnableActions()); } } else { if (quantity == 1) { var nEquip = ii.GetEquipById(itemId); //nEquip.log("Created while adding by id. (" + logInfo + " )", false); if (owner != null) { nEquip.Owner = owner; } var newSlot = c.Player.Inventorys[type.Value].AddItem(nEquip); if (newSlot == 128) { c.Send(PacketCreator.GetInventoryFull()); c.Send(PacketCreator.GetShowInventoryFull()); return(false); } c.Send(PacketCreator.AddInventorySlot(type, nEquip)); } else { throw new Exception("Trying to create equip with non-one quantity"); } } return(true); }
public static bool AddFromDrop(MapleClient c, IMapleItem item, bool show, string loginfo = "") { var ii = MapleItemInformationProvider.Instance; var type = ii.GetInventoryType(item.ItemId); if (!c.ChannelServer.AllowMoreThanOne && ii.IsPickupRestricted(item.ItemId) && c.Player.HaveItem(item.ItemId, 1, true, false)) { c.Send(PacketCreator.GetInventoryFull()); c.Send(PacketCreator.ShowItemUnavailable()); return(false); } var quantity = item.Quantity; if (quantity >= 4000 || quantity < 0) { AutobanManager.Instance.Autoban(c, $"XSource| PE Item: {quantity} x {item.ItemId}"); return(false); } if (type != MapleInventoryType.Equip) { var slotMax = ii.GetSlotMax(c, item.ItemId); var existing = c.Player.Inventorys[type.Value].ListById(item.ItemId); if (!ii.IsThrowingStar(item.ItemId) && !ii.IsBullet(item.ItemId)) { if (existing.Any()) { var i = existing.GetEnumerator(); while (quantity > 0) { if (i.MoveNext()) { var eItem = (Item)i.Current; if (eItem != null) { var oldQ = eItem.Quantity; if (oldQ < slotMax && item.Owner == eItem.Owner) { var newQ = (short)Math.Min(oldQ + quantity, slotMax); quantity -= (short)(newQ - oldQ); eItem.Quantity = newQ; c.Send(PacketCreator.UpdateInventorySlot(type, eItem, true)); } } } else { break; } } } // add new slots if there is still something left while (quantity > 0 || ii.IsThrowingStar(item.ItemId) || ii.IsBullet(item.ItemId)) { var newQ = Math.Min(quantity, slotMax); quantity -= newQ; var nItem = new Item(item.ItemId, 0, newQ) { Owner = item.Owner }; var newSlot = c.Player.Inventorys[type.Value].AddItem(nItem); if (newSlot == 0xFF) { c.Send(PacketCreator.GetInventoryFull()); c.Send(PacketCreator.GetShowInventoryFull()); item.Quantity = (short)(quantity + newQ); return(false); } c.Send(PacketCreator.AddInventorySlot(type, nItem, true)); } } else { // Throwing Stars and Bullets - Add all into one slot regardless of quantity. var nItem = new Item(item.ItemId, 0, quantity); var newSlot = c.Player.Inventorys[type.Value].AddItem(nItem); if (newSlot == 0xFF) { c.Send(PacketCreator.GetInventoryFull()); c.Send(PacketCreator.GetShowInventoryFull()); return(false); } c.Send(PacketCreator.AddInventorySlot(type, nItem)); c.Send(PacketCreator.EnableActions()); } } else { if (quantity == 1) { var newSlot = c.Player.Inventorys[type.Value].AddItem(item); if (newSlot == 0xFF) { c.Send(PacketCreator.GetInventoryFull()); c.Send(PacketCreator.GetShowInventoryFull()); return(false); } c.Send(PacketCreator.AddInventorySlot(type, item, true)); } else { throw new Exception("Trying to create equip with non-one quantity"); } } if (show) { c.Send(PacketCreator.GetShowItemGain(item.ItemId, item.Quantity)); } return(true); }