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));
    }
예제 #2
0
        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
        }
예제 #3
0
        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));
        }
예제 #4
0
        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));
        }