diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 3c69c19..21878bf 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -544,7 +544,7 @@ namespace AssetStudio break; case ClassIDType.AnimationClip: obj = objectReader.serializedType?.m_Type != null && LoadingViaTypeTreeEnabled - ? new AnimationClip(objectReader, TypeTreeHelper.ReadTypeByteArray(objectReader.serializedType.m_Type, objectReader), jsonOptions) + ? new AnimationClip(objectReader, TypeTreeHelper.ReadTypeByteArray(objectReader.serializedType.m_Type, objectReader), jsonOptions, objectInfo) : new AnimationClip(objectReader); break; case ClassIDType.Animator: diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 79af15a..1f996f0 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -1027,10 +1027,12 @@ namespace AssetStudio public ClipMuscleConstant m_MuscleClip; public AnimationClipBindingConstant m_ClipBindingConstant; public AnimationEvent[] m_Events; + public byte[] m_AnimData; + public StreamingInfo m_StreamingInfo; public AnimationClip() { } - public AnimationClip(ObjectReader reader, byte[] type, JsonSerializerOptions jsonOptions) : base(reader) + public AnimationClip(ObjectReader reader, byte[] type, JsonSerializerOptions jsonOptions, ObjectInfo objInfo) : base(reader) { var parsedAnimClip = JsonSerializer.Deserialize(type, jsonOptions); m_AnimationType = parsedAnimClip.m_AnimationType; @@ -1051,6 +1053,22 @@ namespace AssetStudio m_MuscleClip = parsedAnimClip.m_MuscleClip; m_ClipBindingConstant = parsedAnimClip.m_ClipBindingConstant; m_Events = parsedAnimClip.m_Events; + if (!reader.version.IsTuanjie) + return; + m_AnimData = parsedAnimClip.m_AnimData; + m_StreamingInfo = parsedAnimClip.m_StreamingInfo; + if (!(m_AnimData?.Length > 0)) + return; + m_MuscleClipSize = (uint)m_AnimData.Length; + using (var muscleStream = new MemoryStream(m_AnimData)) + { + using (var muscleReader = new EndianBinaryReader(muscleStream, EndianType.LittleEndian)) + { + _ = muscleReader.ReadUInt32(); + var objReader = new ObjectReader(muscleReader, assetsFile, objInfo); + m_MuscleClip = new ClipMuscleConstant(objReader); + } + } } public AnimationClip(ObjectReader reader) : base(reader) @@ -1094,28 +1112,31 @@ namespace AssetStudio } } - if (version >= (5, 3))//5.3 and up + if (!version.IsTuanjie) { - int numEulerCurves = reader.ReadInt32(); - m_EulerCurves = new Vector3Curve[numEulerCurves]; - for (int i = 0; i < numEulerCurves; i++) + if (version >= (5, 3)) //5.3 and up { - m_EulerCurves[i] = new Vector3Curve(reader); + int numEulerCurves = reader.ReadInt32(); + m_EulerCurves = new Vector3Curve[numEulerCurves]; + for (int i = 0; i < numEulerCurves; i++) + { + m_EulerCurves[i] = new Vector3Curve(reader); + } } - } - int numPCurves = reader.ReadInt32(); - m_PositionCurves = new Vector3Curve[numPCurves]; - for (int i = 0; i < numPCurves; i++) - { - m_PositionCurves[i] = new Vector3Curve(reader); - } + int numPCurves = reader.ReadInt32(); + m_PositionCurves = new Vector3Curve[numPCurves]; + for (int i = 0; i < numPCurves; i++) + { + m_PositionCurves[i] = new Vector3Curve(reader); + } - int numSCurves = reader.ReadInt32(); - m_ScaleCurves = new Vector3Curve[numSCurves]; - for (int i = 0; i < numSCurves; i++) - { - m_ScaleCurves[i] = new Vector3Curve(reader); + int numSCurves = reader.ReadInt32(); + m_ScaleCurves = new Vector3Curve[numSCurves]; + for (int i = 0; i < numSCurves; i++) + { + m_ScaleCurves[i] = new Vector3Curve(reader); + } } int numFCurves = reader.ReadInt32(); @@ -1147,7 +1168,18 @@ namespace AssetStudio if (version >= 4)//4.0 and up { m_MuscleClipSize = reader.ReadUInt32(); - m_MuscleClip = new ClipMuscleConstant(reader); + if (m_MuscleClipSize > 0) + { + if (version.IsTuanjie) + { + _ = reader.ReadUInt32(); + } + m_MuscleClip = new ClipMuscleConstant(reader); //m_AnimData (Tuanjie) + if (version.IsTuanjie) + { + m_StreamingInfo = new StreamingInfo(reader); + } + } } if (version >= (4, 3)) //4.3 and up {