Ejemplo n.º 1
0
        public UEMapProperty(BinaryReader reader, long valueLength)
        {
            var keyType   = reader.ReadUEString();
            var valueType = reader.ReadUEString();

            if (valueType == "IntProperty")
            {
                valueType += "Array";
            }

            var unknown = reader.ReadBytes(5);

            if (unknown.Any(b => b != 0))
            {
                throw new InvalidOperationException($"Offset: 0x{reader.BaseStream.Position-5:x8}. Expected ??? to be 0, but was 0x{unknown.AsHex()}");
            }

            var count = reader.ReadInt32();

            for (var i = 0; i < count; i++)
            {
                UEProperty key, value;

                if (keyType == "StructProperty")
                {
                    key = Read(reader);
                }
                else
                {
                    key = UESerializer.Deserialize(null, keyType, -1, reader);
                }
                var values = new List <UEProperty>();

                switch (valueType)
                {
                case "StructProperty":
                    value = Read(reader);
                    break;

                case "BoolProperty":
                    value = new UEBoolProperty()
                    {
                        Value = reader.ReadBoolean()
                    };
                    Debug.WriteLine(String.Format("  {0}: {1}", ((UEStringProperty)key).Value, ((UEBoolProperty)value).Value));
                    break;

                case "FloatProperty":
                    var bytes = reader.ReadBytes(4);
                    value = new UEFloatProperty()
                    {
                        Value = System.BitConverter.ToSingle(bytes, 0)
                    };
                    Debug.WriteLine(String.Format("  {0}: {1}", ((UEStringProperty)key).Value, ((UEFloatProperty)value).Value));
                    break;

                case "EnumProperty":
                    var      length     = reader.ReadInt32();
                    var      valueBytes = reader.ReadBytes(length);
                    Encoding Utf8       = new UTF8Encoding(false);

                    if (length > 0)
                    {
                        value = new UEEnumProperty()
                        {
                            Value = Utf8.GetString(valueBytes, 0, valueBytes.Length - 1)
                        };
                        Debug.WriteLine(String.Format("  {0}: {1}", ((UEStringProperty)key).Value, ((UEFloatProperty)value).Value));
                    }
                    else
                    {
                        value = new UEEnumProperty();
                        Debug.WriteLine(String.Format("  {0}: {1}", ((UEStringProperty)key).Value, ""));
                    }

                    break;

                default:
                    value = UESerializer.Deserialize(null, valueType, -1, reader);
                    break;
                }

                values.Add(value);

                Map.Add(new UEKeyValuePair {
                    Key = key, Values = values
                });
            }
        }
Ejemplo n.º 2
0
        public UESetProperty(BinaryReader reader, long valueLength)
        {
            var ItemType = reader.ReadUEString();

            if (ItemType == "IntProperty")
            {
                ItemType += "Array";
            }

            var terminator = reader.ReadByte();

            if (terminator != 0)
            {
                throw new FormatException($"Offset: 0x{reader.BaseStream.Position - 1:x8}. Expected terminator (0x00), but was (0x{terminator:x2})");
            }

            reader.ReadInt32();
            var count = reader.ReadInt32();

            Address = $"0x{ reader.BaseStream.Position - 1:x8}";

            Items = new UEProperty[count];
            switch (ItemType)
            {
            case "StructProperty":
                Items = Read(reader, count);
                break;

            case "ByteProperty":
                Items = UEByteProperty.Read(reader, valueLength, count);
                break;

            case "IntPropertyArray":
                for (var i = 0; i < count; i++)
                {
                    var value = reader.ReadInt32();
                    Items[i] = new UEIntProperty()
                    {
                        Value = value
                    };
                    Debug.WriteLine(String.Format("  {0} {1}", ((UEIntProperty)Items[i]).Value, $"0x{reader.BaseStream.Position - 1:x8}"));
                }
                break;

            case "EnumProperty":
                for (var i = 0; i < count; i++)
                {
                    Items[i] = new UEEnumProperty()
                    {
                        Value = reader.ReadUEString(),
                    };
                    Debug.WriteLine(String.Format("  {0} ({1}) {2}", ((UEEnumProperty)Items[i]).EnumType, ((UEEnumProperty)Items[i]).Value, $"0x{reader.BaseStream.Position - 1:x8}"));
                }
                break;

            case "SoftObjectProperty":
                for (var i = 0; i < count; i++)
                {
                    Items[i] = new UEStringProperty()
                    {
                        Value = reader.ReadUEString(),
                    };
                    Debug.WriteLine(String.Format("  {0} {1}", ((UEStringProperty)Items[i]).Value, $"0x{reader.BaseStream.Position - 1:x8}"));
                }
                break;

            default:
            {
                for (var i = 0; i < count; i++)
                {
                    Items[i] = UESerializer.Deserialize(null, ItemType, -1, reader);
                }
                break;
            }
            }
        }
Ejemplo n.º 3
0
        public UEArrayProperty(BinaryReader reader, long valueLength)
        {
            ItemType = reader.ReadUEString();
            if (ItemType == "IntProperty")
            {
                ItemType += "Array";
            }

            var terminator = reader.ReadByte();

            if (terminator != 0)
            {
                throw new FormatException($"Offset: 0x{reader.BaseStream.Position - 1:x8}. Expected terminator (0x00), but was (0x{terminator:x2})");
            }

            // valueLength starts here
            var count = reader.ReadInt32();

            Items = new UEProperty[count];

            switch (ItemType)
            {
            case "StructProperty":
                Items = Read(reader, count);
                break;

            case "ByteProperty":
                Items = UEByteProperty.Read(reader, valueLength, count);
                break;

            case "IntPropertyArray":
                for (var i = 0; i < count; i++)
                {
                    var value = reader.ReadInt32();
                    Items[i] = new UEIntProperty()
                    {
                        Value = value
                    };
                }
                break;

            case "EnumProperty":
                for (var i = 0; i < count; i++)
                {
                    Items[i] = new UEEnumProperty()
                    {
                        Value = reader.ReadUEString(),
                    };
                }
                break;

            case "SoftObjectProperty":
                for (var i = 0; i < count; i++)
                {
                    Items[i] = new UEStringProperty()
                    {
                        Value = reader.ReadUEString(),
                    };
                    reader.ReadBytes(4);
                }
                break;

            default:
            {
                for (var i = 0; i < count; i++)
                {
                    Items[i] = UESerializer.Deserialize(null, ItemType, -1, reader);
                }
                break;
            }
            }
        }