public static new CustomDataMessage ReadFrom(System.IO.BinaryReader reader)
            {
                var result = new CustomDataMessage();

                result.Data = Model.CustomData.ReadFrom(reader);
                return(result);
            }
        protected override void Parse(ref BitStreamReader bsr)
        {
            DataType = (CustomDataType)bsr.ReadSInt();
            uint size = bsr.ReadUInt();

            DataMessage = CustomDataFactory.CreateCustomDataMessage(DemoRef, DataType);
            try {
                DataMessage.ParseStream(bsr.SplitAndSkip(size * 8));
            } catch (Exception e) {
                DemoRef.LogError($"error while parsing custom data of type: {DataType}... {e.Message}");
                DataMessage = new UnknownCustomDataMessage(DemoRef);
            }
        }
        public static PlayerMessageGame ReadFrom(System.IO.BinaryReader reader)
        {
            switch (reader.ReadInt32())
            {
            case CustomDataMessage.TAG:
                return(CustomDataMessage.ReadFrom(reader));

            case ActionMessage.TAG:
                return(ActionMessage.ReadFrom(reader));

            default:
                throw new System.Exception("Unexpected discriminant value");
            }
        }