コード例 #1
0
        private static void OnContainerContents(PacketReader reader)
        {
            if (reader.Size == 5)
            {
                return;
            }

            bool oldStyle = false;

            int count = reader.ReadInt16();

            if ((reader.Size - 5) / 20 != count)
            {
                oldStyle = true;
            }

            ItemCollection container = null;

            for (int i = 0; i < count; i++)
            {
                int serial = reader.ReadInt32();
                int id     = reader.ReadUInt16();
                reader.ReadByte(); // Item ID Offset
                int amount = reader.ReadUInt16();
                int x      = reader.ReadInt16();
                int y      = reader.ReadInt16();
                int grid   = 0;

                if (!oldStyle)
                {
                    grid = reader.ReadByte();
                }

                int containerSerial = reader.ReadInt32();
                int hue             = reader.ReadUInt16();

                if (container == null)
                {
                    container = new ItemCollection(containerSerial);
                }

                Item item = Engine.GetOrCreateItem(serial, containerSerial);

                item.ID    = id;
                item.Count = amount;
                item.Owner = containerSerial;
                item.Hue   = hue;
                item.Grid  = grid;
                item.X     = x;
                item.Y     = y;

                container.Add(item);
            }

            if (container == null)
            {
                return;
            }

            Item containerItem = Engine.Items.GetItem(container.Serial);

            if (containerItem.Container == null)
            {
                containerItem.Container = container;
            }
            else
            {
                containerItem.Container.Clear();
                containerItem.Container.Add(container.GetItems());
            }

            Engine.Items.Add(containerItem);

            ContainerContentsEvent?.Invoke(container.Serial, container);

            Engine.RehueList.CheckRehue(container);
        }
コード例 #2
0
        private static void OnContainerContents(PacketReader reader)
        {
            Item containerItem = null;
            int  count         = 0;

            try
            {
                if (reader.Size == 5)
                {
                    return;
                }

                bool oldStyle = false;

                count = reader.ReadInt16();

                if ((reader.Size - 5) / 20 != count)
                {
                    oldStyle = true;
                }

                ItemCollection container = null;

                for (int i = 0; i < count; i++)
                {
                    int serial = reader.ReadInt32();
                    int id     = reader.ReadUInt16();
                    reader.ReadByte(); // Item ID Offset
                    int amount = reader.ReadUInt16();
                    int x      = reader.ReadInt16();
                    int y      = reader.ReadInt16();
                    int grid   = 0;

                    if (!oldStyle)
                    {
                        grid = reader.ReadByte();
                    }

                    int containerSerial = reader.ReadInt32();
                    int hue             = reader.ReadUInt16();

                    if (container == null)
                    {
                        container = new ItemCollection(containerSerial);
                    }

                    Item item = Engine.GetOrCreateItem(serial, containerSerial);

                    item.ID    = id;
                    item.Count = amount;
                    item.Owner = containerSerial;
                    item.Hue   = hue;
                    item.Grid  = grid;
                    item.X     = x;
                    item.Y     = y;

                    container.Add(item);
                }

                if (container == null)
                {
                    return;
                }

                containerItem = Engine.GetOrCreateItem(container.Serial);

                if (containerItem.Container == null)
                {
                    containerItem.Container = container;
                }
                else
                {
                    containerItem.Container.Clear();
                    containerItem.Container.Add(container.GetItems());
                }

                Engine.Items.Add(containerItem);

                ContainerContentsEvent?.Invoke(container.Serial, container);

                Engine.RehueList.CheckRehue(container);
            }
            catch (Exception e)
            {
                e.ToExceptionless().SetProperty("ContainerSerial", containerItem?.Serial)
                .SetProperty("Count", count).SetProperty("Packet", reader.GetData())
                .SetProperty("WorldContainsContainerSerial",
                             Engine.Items.Any(i => containerItem != null && i.Serial == containerItem.Serial))
                .SetProperty("WorldItemCount", Engine.Items.Count())
                .SetProperty("WorldMobileCount", Engine.Mobiles.Count()).Submit();
            }
        }