public ShipActionPacket(Stream stream, int index)
            : base()
        {

            if (stream != null)
            {
                if (stream.CanSeek)
                {
                    stream.Position = index;
                }
                if (index < stream.Length - 3)
                {
                    SubPacketType = (ShipActionSubPackets.ShipActionSubPacketType)stream.ToInt32();
                }
                if (index < stream.Length - 4)
                {
                    SubPacketData = stream.GetMemoryStream(index + 4);
                    _subPacket = GetSubPacket(SubPacketData);
                }
                else
                {
                    _subPacket = null;
                    SubPacketData = null;
                }
            }
        }
        public ShipAction2Packet(Stream stream, int index) : base()
        {
            try
            {
                if (stream != null)
                {
                    if (stream.CanSeek)
                    {
                        stream.Position = index;
                    }
                    if (index < stream.Length - 3)
                    {
                        SubPacketType = (ShipAction2SubPacketType)stream.ToInt32();
                    }
                    if (index < stream.Length - 4)
                    {
                        SubPacketData = stream.GetMemoryStream(index + 4);

                        _subPacket = GetSubPacket(SubPacketData);
                    }
                    else
                    {
                        _subPacket = null;
                        SubPacketData = null;
                    }
                }
            }
            catch (Exception ex)
            {
                AddError(ex);
            }
        }
        // GameStartSubPacket = 0,
        //GameOverSubPacket = 6,
        //Unknown1SubPacket = 8,
        //Unknown2SubPacket = 9,
        //GameTextMessageSubPacket = 10,
        //JumpStartSubPacket = 12,
        //JumpCompleteSubPacket = 13,
        //AllShipSettingsSubPacket = 15,
        public GameMessagePacket(Stream stream, int index)
        {
            try
            {
                if (stream != null)
                {
                    if (stream.CanSeek)
                    {
                        stream.Position = index;
                    }
                    if (stream.Length > 3)
                    {
                        SubPacketType = (GameMessageSubPacketType)stream.ToInt32();
                       
                    }
                    if (stream.Length >= 4)
                    {
                        SubPacketData = stream.GetMemoryStream(index + 4);

                     
                        _subPacket = GetSubPacket(stream, index + 4);
                    }
                    else
                    {
                        _subPacket = null;
                        SubPacketData = null;
                    }
                }
            }
            catch (Exception ex)
            {
                errors.Add(ex);
            }
        }
        static KeyValuePair<int, object> GetIntermediateType(Type CastType, int index, Stream stream)
        {
            int retVal = index;
            object intermediateObject = null;
            Type cTp = CastType;
            if (cTp.IsEnum)
            {
             
                
                cTp = Enum.GetUnderlyingType(cTp);
            }
            if (cTp == typeof(byte) || cTp == typeof(byte?))
            {

                if (retVal < stream.Length)
                {
                    intermediateObject = Convert.ToByte(stream.ReadByte());
                    retVal = 1;
                }
            }
            if (cTp == typeof(short) || cTp == typeof(short?))
            {

                if (retVal < stream.Length - 1)
                {
                    intermediateObject = stream.ToInt16();
                    retVal = 2;
                }
            }
            if (cTp == typeof(int) || cTp == typeof(int?))
            {

                if (retVal < stream.Length - 3)
                {

                    intermediateObject = stream.ToInt32();
                    retVal = 4;
                }
            }
            if (cTp == typeof(float) || cTp == typeof(float?))
            {

                if (retVal < stream.Length - 3)
                {

                    intermediateObject = stream.ToSingle();
                    retVal = 4;
                }
            }
            if (cTp == typeof(long) || cTp == typeof(long?))
            {

                if (retVal < stream.Length - 7)
                {

                    intermediateObject = stream.ToInt64();
                    retVal = 8;
                }
            }
            if (CastType == typeof(ArtemisString))
            {
                if (retVal < stream.Length - 3)
                {
                    ArtemisString artyString = new ArtemisString(stream, index);
                    intermediateObject = artyString;
                    retVal = artyString.Length * 2 + 4;
                }
            }
            return new KeyValuePair<int,object>(retVal, intermediateObject);
        }