示例#1
0
        public static PropertyData TypeToClass(string type, string name, AssetReader asset, BinaryReader reader = null, long leng = 0, bool includeHeader = true)
        {
            //Debug.WriteLine(type);
            PropertyData data;

            switch (type)
            {
            case "BoolProperty":
                data = new BoolPropertyData(name, asset);
                break;

            case "Int8Property":
                data = new Int8PropertyData(name, asset);
                break;

            case "Int16Property":
                data = new Int16PropertyData(name, asset);
                break;

            case "IntProperty":
                data = new IntPropertyData(name, asset);
                break;

            case "Int64Property":
                data = new Int64PropertyData(name, asset);
                break;

            case "UInt16Property":
                data = new UInt16PropertyData(name, asset);
                break;

            case "UInt32Property":
                data = new UInt32PropertyData(name, asset);
                break;

            case "UInt64Property":
                data = new UInt64PropertyData(name, asset);
                break;

            case "FloatProperty":
                data = new FloatPropertyData(name, asset);
                break;

            case "TextProperty":
                data = new TextPropertyData(name, asset);
                break;

            case "StrProperty":
                data = new StrPropertyData(name, asset);
                break;

            case "ObjectProperty":
                data = new ObjectPropertyData(name, asset);
                break;

            case "EnumProperty":
                data = new EnumPropertyData(name, asset);
                break;

            case "ByteProperty":
                data = new BytePropertyData(name, asset);
                break;

            case "NameProperty":
                data = new NamePropertyData(name, asset);
                break;

            case "ArrayProperty":
                data = new ArrayPropertyData(name, asset);
                break;

            case "MapProperty":
                data = new MapPropertyData(name, asset);
                break;

            case "StructProperty":
                data = new StructPropertyData(name, asset);
                break;

            case "Guid":
                data = new GuidPropertyData(name, asset);
                break;

            case "LinearColor":
                data = new LinearColorPropertyData(name, asset);
                break;

            case "Color":
                data = new ColorPropertyData(name, asset);
                break;

            case "Vector":
                data = new VectorPropertyData(name, asset);
                break;

            case "Vector2D":
                data = new Vector2DPropertyData(name, asset);
                break;

            case "Box":
                data = new BoxPropertyData(name, asset);
                break;

            case "IntPoint":
                data = new IntPointPropertyData(name, asset);
                break;

            case "DateTime":
                data = new DateTimePropertyData(name, asset);
                break;

            case "Timespan":
                data = new TimespanPropertyData(name, asset);
                break;

            case "Rotator":
                data = new RotatorPropertyData(name, asset);
                break;

            case "Quat":
                data = new QuatPropertyData(name, asset);
                break;

            case "Vector4":
                data = new Vector4PropertyData(name, asset);
                break;

            case "SoftObjectProperty":
                data = new SoftObjectPropertyData(name, asset);
                break;

            case "MulticastDelegateProperty":
                data = new MulticastDelegatePropertyData(name, asset);
                break;

            default:
#if DEBUG
                Debug.WriteLine("Last type: " + lastType);
#endif
                if (reader == null)
                {
                    throw new FormatException("Unknown property type: " + type + " (on " + name + ")");
                }
                throw new FormatException("Unknown property type: " + type + " (on " + name + " at " + reader.BaseStream.Position + ")");
            }
#if DEBUG
            lastType = type;
#endif
            if (reader != null)
            {
                data.Read(reader, includeHeader, leng);
            }
            return(data);
        }
示例#2
0
        public MemoryStream Bake(Dictionary <string, List <string> > newItems, byte[] superRawData)
        {
            BinaryReader yReader = new BinaryReader(new MemoryStream(superRawData));
            AssetWriter  y       = new AssetWriter
            {
                WillStoreOriginalCopyInMemory = true, WillWriteSectionSix = true, data = new AssetReader()
            };

            y.data.Read(yReader);
            y.OriginalCopy = superRawData;

            // Find some categories
            Dictionary <string, List <ArrayPropertyData> > itemTypesProperty = new Dictionary <string, List <ArrayPropertyData> >();

            for (int cat = 0; cat < y.data.categories.Count; cat++)
            {
                if (y.data.categories[cat] is NormalCategory normalCat)
                {
                    for (int i = 0; i < normalCat.Data.Count; i++)
                    {
                        foreach (KeyValuePair <string, List <string> > entry in newItems)
                        {
                            string arrName = entry.Key;
                            if (entry.Key.Contains('.'))
                            {
                                string[] tData   = entry.Key.Split(new char[] { '.' });
                                string   catName = tData[0].ToLower();
                                arrName = tData[1];
                                if (y.data.GetHeaderReference(y.data.GetLinkReference(normalCat.ReferenceData.connection)).ToLower() != catName)
                                {
                                    continue;
                                }
                            }

                            if (normalCat.Data[i].Name.Equals(arrName) && normalCat.Data[i] is ArrayPropertyData)
                            {
                                if (!itemTypesProperty.ContainsKey(entry.Key))
                                {
                                    itemTypesProperty.Add(entry.Key, new List <ArrayPropertyData>());
                                }
                                itemTypesProperty[entry.Key].Add((ArrayPropertyData)normalCat.Data[i]);
                            }
                        }
                    }
                }
            }

            foreach (KeyValuePair <string, List <string> > itemPaths in newItems)
            {
                if (!itemTypesProperty.ContainsKey(itemPaths.Key))
                {
                    continue;
                }
                foreach (string itemPath in itemPaths.Value)
                {
                    string realName      = itemPath;
                    string className     = Path.GetFileNameWithoutExtension(itemPath) + "_C";
                    string softClassName = Path.GetFileNameWithoutExtension(itemPath);
                    if (itemPath.Contains("."))
                    {
                        string[] tData = itemPath.Split(new char[] { '.' });
                        realName      = tData[0];
                        className     = tData[1];
                        softClassName = tData[1];
                    }

                    int bigNewLink = 0;

                    for (int prop = 0; prop < itemTypesProperty[itemPaths.Key].Count; prop++)
                    {
                        ArrayPropertyData currentItemTypesProperty = itemTypesProperty[itemPaths.Key][prop];
                        PropertyData[]    usArrData = currentItemTypesProperty.Value;
                        int oldLen = usArrData.Length;
                        Array.Resize(ref usArrData, oldLen + 1);
                        switch (currentItemTypesProperty.ArrayType)
                        {
                        case "ObjectProperty":
                            if (bigNewLink >= 0)
                            {
                                y.data.AddHeaderReference(realName);
                                y.data.AddHeaderReference(className);
                                Link newLink = new Link("/Script/Engine", "BlueprintGeneratedClass", y.data.AddLink("/Script/CoreUObject", "Package", 0, realName).Index, className, y.data);
                                bigNewLink = y.data.AddLink(newLink);
                            }

                            usArrData[oldLen] = new ObjectPropertyData(currentItemTypesProperty.Name, y.data)
                            {
                                LinkValue = bigNewLink
                            };
                            itemTypesProperty[itemPaths.Key][prop].Value = usArrData;
                            break;

                        case "SoftObjectProperty":
                            y.data.AddHeaderReference(realName);
                            y.data.AddHeaderReference(realName + "." + softClassName);
                            usArrData[oldLen] = new SoftObjectPropertyData(currentItemTypesProperty.Name, y.data)
                            {
                                Value  = realName + "." + softClassName,
                                Value2 = 0
                            };
                            itemTypesProperty[itemPaths.Key][prop].Value = usArrData;
                            break;
                        }
                    }
                }
            }

            return(y.WriteData(new BinaryReader(new MemoryStream(y.OriginalCopy))));
        }