public static void DumpPackageToT3D(IMEPackage package) { var levelExport = package.Exports.FirstOrDefault(x => x.ObjectName == "Level" && x.ClassName == "PersistentLevel"); if (levelExport != null) { var level = ObjectBinary.From <Level>(levelExport); foreach (var actoruindex in level.Actors) { if (package.TryGetUExport(actoruindex.value, out var actorExport)) { switch (actorExport.ClassName) { case "StaticMesh": var sm = ObjectBinary.From <StaticMesh>(actorExport); // Look at vars in sm to find what you need //ExportT3D(sm, "FILENAMEHERE.txt", null); //?? break; case "StaticMeshCollectionActor": break; } } } } }
public static Class ConvertClass(UClass uClass, bool decompileBytecode, FileLib lib = null) { IMEPackage pcc = uClass.Export.FileRef; VariableType parent = new VariableType(pcc.GetEntry(uClass.SuperClass)?.ObjectName.Instanced ?? "object"); VariableType outer = new VariableType(pcc.GetEntry(uClass.OuterClass)?.ObjectName.Instanced ?? parent.Name); // TODO: components var interfaces = new List <VariableType>(); foreach ((UIndex interfaceUIndex, UIndex _) in uClass.Interfaces) { interfaces.Add(new VariableType(pcc.GetEntry(interfaceUIndex)?.ObjectName.Instanced ?? "UNK_INTERFACE")); } var Types = new List <VariableType>(); var Vars = new List <VariableDeclaration>(); var Funcs = new List <Function>(); var States = new List <State>(); var nextItem = uClass.Children; while (pcc.TryGetUExport(nextItem, out ExportEntry nextChild)) { var objBin = ObjectBinary.From(nextChild); switch (objBin) { case UConst uConst: Types.Add(new Const(uConst.Export.ObjectName.Instanced, uConst.Value) { Literal = new ClassOutlineParser(new TokenStream <string>(new StringLexer(uConst.Value))).ParseConstValue() }); nextItem = uConst.Next; break; case UEnum uEnum: Types.Add(ConvertEnum(uEnum)); nextItem = uEnum.Next; break; case UFunction uFunction: Funcs.Add(ConvertFunction(uFunction, uClass, decompileBytecode)); nextItem = uFunction.Next; break; case UProperty uProperty: Vars.Add(ConvertVariable(uProperty)); nextItem = uProperty.Next; break; case UScriptStruct uScriptStruct: Types.Add(ConvertStruct(uScriptStruct)); nextItem = uScriptStruct.Next; break; case UState uState: nextItem = uState.Next; States.Add(ConvertState(uState, uClass, decompileBytecode)); break; default: nextItem = 0; break; } } var propObject = pcc.GetUExport(uClass.Defaults); var defaultProperties = ConvertDefaultProperties(propObject); Class AST = new Class(uClass.Export.ObjectName.Instanced, parent, outer, uClass.ClassFlags, interfaces, Types, Vars, Funcs, States, defaultProperties) { ConfigName = uClass.ClassConfigName, Package = uClass.Export.Parent is null?Path.GetFileNameWithoutExtension(pcc.FilePath) : uClass.Export.ParentInstancedFullPath, }; // Ugly quick fix: foreach (var member in Types) { member.Outer = AST; } foreach (var member in Vars) { member.Outer = AST; } foreach (var member in Funcs) { member.Outer = AST; } foreach (var member in States) { member.Outer = AST; } var virtFuncLookup = new CaseInsensitiveDictionary <ushort>(); for (ushort i = 0; i < uClass.FullFunctionsList.Length; i++) { virtFuncLookup.Add(uClass.FullFunctionsList[i].GetEntry(pcc)?.ObjectName, i); } AST.VirtualFunctionLookup = virtFuncLookup; return(AST); }