Ejemplo n.º 1
0
        public override int Write(AssetBinaryWriter writer, bool includeHeader)
        {
            if (Value.Length > 0)
            {
                ArrayType = Value[0].PropertyType;
            }

            if (includeHeader)
            {
                writer.Write(ArrayType);
                writer.WritePropertyGuid(PropertyGuid);
            }

            int here = (int)writer.BaseStream.Position;

            writer.Write(Value.Length);
            if (ArrayType.Value.Value == "StructProperty" && ShouldSerializeStructsDifferently)
            {
                if (Value.Length == 0 && DummyStruct == null)
                {
                    throw new InvalidOperationException("No dummy struct present in an empty StructProperty array, cannot serialize");
                }
                if (Value.Length > 0)
                {
                    DummyStruct = (StructPropertyData)Value[0];
                }

                FName fullType = DummyStruct.StructType;

                int lengthLoc = -1;
                if (writer.Asset.EngineVersion >= UE4Version.VER_UE4_INNER_ARRAY_TAG_INFO)
                {
                    writer.Write(DummyStruct.Name);
                    writer.Write(new FName("StructProperty"));
                    lengthLoc = (int)writer.BaseStream.Position;
                    writer.Write((long)0);
                    writer.Write(fullType);
                    if (writer.Asset.EngineVersion >= UE4Version.VER_UE4_STRUCT_GUID_IN_PROPERTY_TAG)
                    {
                        writer.Write(DummyStruct.StructGUID.ToByteArray());
                    }
                    if (writer.Asset.EngineVersion >= UE4Version.VER_UE4_PROPERTY_GUID_IN_PROPERTY_TAG)
                    {
                        writer.Write((byte)0);
                    }
                }

                for (int i = 0; i < Value.Length; i++)
                {
                    ((StructPropertyData)Value[i]).StructType = fullType;
                    Value[i].Offset = writer.BaseStream.Position;
                    Value[i].Write(writer, false);
                }

                if (writer.Asset.EngineVersion >= UE4Version.VER_UE4_INNER_ARRAY_TAG_INFO)
                {
                    int fullLen = (int)writer.BaseStream.Position - lengthLoc;
                    int newLoc  = (int)writer.BaseStream.Position;
                    writer.Seek(lengthLoc, SeekOrigin.Begin);
                    writer.Write(fullLen - 32 - (includeHeader ? 1 : 0));
                    writer.Seek(newLoc, SeekOrigin.Begin);
                }
            }
            else
            {
                for (int i = 0; i < Value.Length; i++)
                {
                    Value[i].Offset = writer.BaseStream.Position;
                    Value[i].Write(writer, false);
                }
            }

            return((int)writer.BaseStream.Position - here);
        }