diff --git a/AssetStudio/Extensions/BinaryReaderExtensions.cs b/AssetStudio/Extensions/BinaryReaderExtensions.cs index a84c2b5..536fc2b 100644 --- a/AssetStudio/Extensions/BinaryReaderExtensions.cs +++ b/AssetStudio/Extensions/BinaryReaderExtensions.cs @@ -26,7 +26,7 @@ namespace AssetStudio public static string ReadAlignedString(this BinaryReader reader) { var length = reader.ReadInt32(); - if (length > 0 && length < (reader.BaseStream.Length - reader.BaseStream.Position)) + if (length > 0 && length <= reader.BaseStream.Length - reader.BaseStream.Position) { var stringData = reader.ReadBytes(length); var result = Encoding.UTF8.GetString(stringData); diff --git a/AssetStudioUtility/ScriptDumper.cs b/AssetStudioUtility/ScriptDumper.cs index 944448a..5a125e8 100644 --- a/AssetStudioUtility/ScriptDumper.cs +++ b/AssetStudioUtility/ScriptDumper.cs @@ -7,8 +7,7 @@ using dnlib.DotNet; namespace AssetStudio { - //TODO unfinished - //Separate, EngineType read + //TODO to json file public sealed class ScriptDumper : IDisposable { private Dictionary moduleDic = new Dictionary(); @@ -359,6 +358,32 @@ namespace AssetStudio } } } + else if (fieldDef.FieldType is GenericInstSig genericSig && genericSig.GenericArguments.Count == 1 && genericSig.GenericArguments[0].IsGenericParameter) + { + for (var i = 0; i < typeDef.GenericParameters.Count; i++) + { + var g = typeDef.GenericParameters[i]; + if (g.FullName == genericSig.GenericArguments[0].FullName) + { + var type = ((GenericInstSig)typeSig).GenericArguments[i]; + var fieldTypeDef = fieldDef.FieldType.ToTypeDefOrRef().ResolveTypeDefThrow(); + if (fieldTypeDef.Interfaces.Any(x => x.Interface.FullName == "System.Collections.Generic.ICollection`1")) //System.Collections.Generic.IEnumerable`1 + { + var size = reader.ReadInt32(); + sb.AppendLine($"{new string('\t', indent + 1)}int size = {size}"); + for (int j = 0; j < size; j++) + { + sb.AppendLine($"{new string('\t', indent + 2)}[{i}]"); + DumpType(type, sb, reader, "data", indent + 2, false, false); + } + } + else + { + DumpType(fieldDef.FieldType, sb, reader, fieldDef.Name, indent + 1); + } + } + } + } else { DumpType(fieldDef.FieldType, sb, reader, fieldDef.Name, indent + 1);