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); }
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)))); }