private void UpdateStackSize(BinaryReader messageDataReader)
        {
            CM_Inventory.UpdateStackSize message = CM_Inventory.UpdateStackSize.read(messageDataReader);

            uint id = message.item;

            if (!character.UpdateStackSize(id, message.amount, message.newValue))
            {
                if (!otherObjects.ContainsKey(id))
                {
                    otherObjects.Add(id, new Item(id));
                }
                otherObjects[id].StackSize = message.amount;
                otherObjects[id].Value     = message.newValue;
            }
        }
        private Tuple <List <uint>, string, int> GetDroppedInformation(int deathRecord)
        {
            uint        affectedCharacterID = character.ID;
            List <uint> droppedItems        = new List <uint>();
            List <uint> unknownItems        = new List <uint>();
            string      deathText           = null;
            int         lastDeathRecord     = deathRecord;
            int         deathTextRecord;

            int i;

            if (character.PKStatus != PKStatusEnum.PKLite_PKStatus)
            {
                // find the death text, assumes printed after all items are moved
                for (i = deathRecord + 1; i < records.Count; i++)
                {
                    using (BinaryReader messageDataReader = new BinaryReader(new MemoryStream(records[i].data)))
                    {
                        PacketOpcode opcode = Util.readUnorderedOpcode(messageDataReader);
                        if (opcode == PacketOpcode.Evt_Communication__TextboxString_ID)
                        {
                            CM_Communication.TextBoxString message = CM_Communication.TextBoxString.read(messageDataReader);

                            if (message.ChatMessageType == 0x0 && message.MessageText.ToString().StartsWith("You've lost"))
                            {
                                deathText = message.MessageText.ToString();
                                break;
                            }
                        }
                    }
                }
                if (deathText == null)
                {
                    // couldn't find death text
                    return(new Tuple <List <uint>, string, int>(new List <uint>(), null, deathRecord));
                }
            }
            else
            {
                return(new Tuple <List <uint>, string, int>(new List <uint>(), "<PKLite Death>", deathRecord));
            }

            deathTextRecord = i;

            for (--i; i > deathRecord; i--)
            {
                using (BinaryReader messageDataReader = new BinaryReader(new MemoryStream(records[i].data)))
                {
                    PacketOpcode opcode = Util.readOrderedOpcode(messageDataReader, ref affectedCharacterID);

                    if (opcode == PacketOpcode.INVENTORY_PUT_OBJ_IN_CONTAINER_EVENT)
                    {
                        CM_Inventory.PutObjectInContainerEvent message = CM_Inventory.PutObjectInContainerEvent.read(messageDataReader);

                        Debug.Assert(affectedCharacterID == character.ID);
                        if (character.Contains(message.i_container))
                        {
                            // we can pickup items after we die
                            if (lastDeathRecord == deathRecord)
                            {
                                lastDeathRecord = i;
                            }
                            unknownItems.Remove(message.i_objectId);
                        }
                        else
                        {
                            droppedItems.Add(message.i_objectId);

                            Item item;
                            if (!character.FindItem(message.i_objectId, out item))
                            {
                                // look for stack size adjustment
                                unknownItems.Add(message.i_objectId);
                            }
                        }
                    }
                    else if (opcode == PacketOpcode.PLAYER_DEATH_EVENT)
                    {
                        CM_Death.PlayerDeathEvent message = CM_Death.PlayerDeathEvent.read(messageDataReader);

                        if (message.VictimId == character.ID)
                        {
                            if (message.KillerId >= 0x50000000 && message.KillerId <= 0x5FFFFFFF)
                            {
                                character.PlayerKill = true;
                            }
                        }
                    }
                }
            }

            for (i = deathTextRecord + 1; i < records.Count && unknownItems.Count > 0; i++)
            {
                using (BinaryReader messageDataReader = new BinaryReader(new MemoryStream(records[i].data)))
                {
                    PacketOpcode opcode = Util.readOrderedOpcode(messageDataReader, ref affectedCharacterID);

                    if (opcode == PacketOpcode.STACKABLE_SET_STACKSIZE_EVENT)
                    {
                        CM_Inventory.UpdateStackSize message = CM_Inventory.UpdateStackSize.read(messageDataReader);

                        Debug.Assert(affectedCharacterID == character.ID);
                        Item item;
                        if (character.FindItem(message.item, out item) && !item.Name.Equals("Pyreal"))
                        {
                            for (int j = 0; j < droppedItems.Count; j++)
                            {
                                Item droppedItem;
                                if (!character.FindItem(droppedItems[j], out droppedItem))
                                {
                                    droppedItems[j] = item.ID;
                                    break;
                                }
                            }
                            unknownItems.RemoveAt(0);
                        }
                    }
                }
            }

            return(new Tuple <List <uint>, string, int>(droppedItems, deathText, lastDeathRecord));
        }