private static void HandleOpenBox(GameSession session, IReadOnlyCollection <Item> items, int amount) { int opened = 0; OpenBoxResult result = OpenBoxResult.Success; foreach (Item item in items) { for (int i = opened; i < amount; i++) { if (item.Amount <= 0) { break; } if (!ItemBoxHelper.GiveItemFromOpenBox(session, item, out result)) { break; } opened++; } } session.Send(ItemUsePacket.Use(items.First().Id, opened, result)); }
public override void Handle(GameSession session, PacketReader packet) { int boxId = packet.ReadInt(); packet.ReadShort(); // Unknown int amount = packet.ReadInt(); short opened = 0; // Amount of opened boxes List <Item> items = new List <Item> (session.Player.Inventory.Items.Values); // Make copy of items in-case new item is added foreach (Item item in items) { // Continue over non-matching item ids if (item.Id != boxId) { continue; } for (int i = opened; i < amount; i++) { // Create new item from opening box Item newItem = new Item(30001001); // Remove box if there is only 1 left if (item.Amount <= 1) { session.Player.Inventory.Remove(item.Uid, out Item removed); session.Send(ItemInventoryPacket.Remove(item.Uid)); InventoryController.Add(session, newItem); opened++; break; // Break out of the amount loop because this stack of boxes is empty, look for next stack } // Update box amount if there is more than 1 item.Amount -= 1; session.Send(ItemInventoryPacket.Update(item.Uid, item.Amount)); InventoryController.Add(session, newItem); opened++; } } session.Send(ItemUsePacket.Use(boxId, amount)); // Need to handle opening boxes, probably serialize the item xml }
private static void HandleOpenBox(GameSession session, Dictionary <long, Item> items, /*OpenItemBox box,*/ int amount) { int opened = 0; foreach (KeyValuePair <long, Item> kvp in items) { Item item = kvp.Value; for (int i = opened; i < amount; i++) { if (item.Amount <= 0) { break; } opened++; ItemBoxHelper.GiveItemFromOpenBox(session, item); } } session.Send(ItemUsePacket.Use(items.FirstOrDefault().Value.Id, amount)); }
private static void HandleSelectBox(GameSession session, Dictionary <long, Item> items, SelectItemBox box, int index, int amount) { ItemDropMetadata metadata = ItemDropMetadataStorage.GetItemDropMetadata(box.BoxId); int opened = 0; foreach (KeyValuePair <long, Item> kvp in items) { Item item = kvp.Value; for (int i = opened; i < amount; i++) { if (item.Amount <= 0) { break; } opened++; ItemBoxHelper.GiveItemFromSelectBox(session, item, index); } } session.Send(ItemUsePacket.Use(items.FirstOrDefault().Value.Id, amount)); }
public override void Handle(GameSession session, PacketReader packet) { int boxId = packet.ReadInt(); packet.ReadShort(); // Unknown int amount = packet.ReadInt(); BoxType boxType = (BoxType)packet.ReadShort(); int index = 0; if (boxType == BoxType.SELECT) { index = packet.ReadShort() - 0x30; // Starts at 0x30 for some reason if (index < 0) { return; } } short opened = 0; // Amount of opened boxes List <Item> items = new List <Item>(session.Player.Inventory.Items.Values); // Make copy of items in-case new item is added foreach (Item item in items) { // Continue over non-matching item ids if (item.Id != boxId) { continue; } // Do nothing if box has no data stored if (item.Content.Count <= 0) { break; } for (int i = opened; i < amount; i++) { bool breakOut = false; // Needed to remove box before adding item to prevent item duping // Remove box if there is only 1 left if (item.Amount <= 1) { InventoryController.Remove(session, item.Uid, out Item removed); opened++; breakOut = true; // Break out of the amount loop because this stack of boxes is empty, look for next stack } else { // Update box amount if there is more than 1 item.Amount -= 1; InventoryController.Update(session, item.Uid, item.Amount); opened++; } // Handle selection box if (boxType == BoxType.SELECT) { if (index < item.Content.Count) { ItemUseHelper.GiveItem(session, item.Content[index]); } } // Handle open box else if (boxType == BoxType.OPEN) { ItemUseHelper.OpenBox(session, item.Content); } if (breakOut) { break; } } } session.Send(ItemUsePacket.Use(boxId, amount)); }
public override void Handle(GameSession session, PacketReader packet) { int boxId = packet.ReadInt(); packet.ReadShort(); // Unknown int amount = packet.ReadInt(); BoxType boxType = (BoxType)packet.ReadShort(); int index = 0; if (boxType == BoxType.SELECT) { index = packet.ReadShort() - 0x30; // Starts at 0x30 for some reason if (index < 0) { return; } } int opened = 0; Dictionary <long, Item> items = new Dictionary <long, Item>(session.Player.Inventory.Items.Where(x => x.Value.Id == boxId)); // Make copy of items in-case new item is added foreach (KeyValuePair <long, Item> kvp in items) { Item item = kvp.Value; // Do nothing if box has no data stored if (item.Content.Count <= 0) { break; } for (int i = opened; i < amount; i++) { bool breakOut = false; // Needed to remove box before adding item to prevent item duping if (item.Amount <= 1) { breakOut = true; // Break out of the amount loop because this stack of boxes is empty, look for next stack } opened++; InventoryController.Consume(session, item.Uid, 1); // Handle selection box if (boxType == BoxType.SELECT) { if (index < item.Content.Count) { ItemUseHelper.GiveItem(session, item.Content[index]); } } // Handle open box else if (boxType == BoxType.OPEN) { ItemUseHelper.OpenBox(session, item.Content); } if (breakOut) { break; } } } session.Send(ItemUsePacket.Use(boxId, amount)); }