private static byte[] FixTexture2DFast(AssetsFileInstance inst, AssetFileInfoEx inf) { AssetsFileReader r = inst.file.reader; r.Position = inf.absoluteFilePos; r.Position += (ulong)r.ReadInt32() + 4; r.Align(); r.Position += 0x48; r.Position += (ulong)r.ReadInt32() + 4; r.Align(); r.Position += 0x8; ulong filePathPos = r.Position; int assetLengthMinusFP = (int)(filePathPos - inf.absoluteFilePos); string filePath = r.ReadCountStringInt32(); string directory = Path.GetDirectoryName(inst.path); string fixedPath = Path.Combine(directory, filePath); byte[] newData = new byte[assetLengthMinusFP + 4 + fixedPath.Length]; r.Position = inf.absoluteFilePos; //imo easier to write it with binary writer than manually copy the bytes using (MemoryStream ms = new MemoryStream()) using (AssetsFileWriter w = new AssetsFileWriter(ms)) { w.bigEndian = false; w.Write(r.ReadBytes(assetLengthMinusFP)); w.WriteCountStringInt32(fixedPath); var ret = ms.ToArray(); if (ret == null) { return(null); } return(ret); } }
private void BackgroundWork(object sender, DoWorkEventArgs e) { List <AssetID> assetIds = new List <AssetID>(); foreach (string fileName in fileNames) { AssetsFileInstance inst = am.LoadAssetsFile(fileName, true); inst.table.GenerateQuickLookupTree(); am.LoadClassDatabaseFromPackage(inst.file.typeTree.unityVersion); foreach (AssetFileInfoEx inf in inst.table.GetAssetsOfType(0x73)) { AssetsFileReader fr = new AssetsFileReader(inst.file.readerPar); fr.bigEndian = false; fr.Position = inf.absoluteFilePos; fr.ReadCountStringInt32(); fr.Align(); fr.Position += 20; string m_ClassName = fr.ReadCountStringInt32(); fr.Align(); string m_Namespace = fr.ReadCountStringInt32(); fr.Align(); string m_AssemblyName = fr.ReadCountStringInt32(); fr.Align(); AssetID assetId = new AssetID(Path.GetFileName(fileName), inf.index); ScriptInfo scriptInfo = new ScriptInfo(m_AssemblyName, m_Namespace, m_ClassName); assetIds.Add(assetId); monoScriptToInfo.Add(assetId, scriptInfo); monoScriptRefs.Add(assetId, new List <AssetID>()); bw.ReportProgress(0, assetId); } } foreach (string fileName in fileNames) { //don't worry, this doesn't load them twice AssetsFileInstance inst = am.LoadAssetsFile(fileName, true); foreach (AssetFileInfoEx inf in inst.table.GetAssetsOfType(0x72)) { AssetsFileReader fr = new AssetsFileReader(inst.file.readerPar); fr.bigEndian = false; fr.Position = inf.absoluteFilePos; fr.Position += 16; int m_FileID = fr.ReadInt32(); long m_PathID = fr.ReadInt64(); string refFileName = fileName; if (m_FileID != 0) { refFileName = inst.file.dependencies.dependencies[m_FileID - 1].assetPath; } AssetID scriptId = new AssetID(Path.GetFileName(refFileName), m_PathID); AssetID selfId = new AssetID(Path.GetFileName(fileName), inf.index); if (monoScriptRefs.ContainsKey(scriptId)) { monoScriptRefs[scriptId].Add(selfId); } } } bw.ReportProgress(0); }
public override void Parse(AssetIdentifier identifier, AssetsFileReader reader, ResourceAssets resourceAssets, Dictionary <int, string> relativeFileIdToPath) { MonobehaviourAsset monobehaviour = new MonobehaviourAsset(); int fileId = reader.ReadInt32(); monobehaviour.GameObjectIdentifier = new AssetIdentifier(relativeFileIdToPath[fileId], reader.ReadInt64()); monobehaviour.Enabled = reader.ReadBoolean(); reader.Align(); monobehaviour.MonoscriptIdentifier = new AssetIdentifier(relativeFileIdToPath[reader.ReadInt32()], reader.ReadInt64()); monobehaviour.Name = reader.ReadCountStringInt32(); // Hack - If we have not yet loaded monoscripts then we are currently processing unit monobehaviours // that we do not care about. Monoscripts should be fully loaded before we actually parse anything // we do care about in resource.assets. If this becomes a problem later, we can do two passes and // load monobeahviours in the second pass. if (!MonoscriptAssetParser.MonoscriptsByAssetId.ContainsKey(monobehaviour.MonoscriptIdentifier)) { return; } MonoscriptAsset monoscript = MonoscriptAssetParser.MonoscriptsByAssetId[monobehaviour.MonoscriptIdentifier]; monobehaviour.MonoscriptName = monoscript.Name; if (monobehaviourParsersByMonoscriptName.TryGetValue(monoscript.Name, out MonobehaviourParser monoResourceParser)) { monoResourceParser.Parse(identifier, monobehaviour.GameObjectIdentifier, reader, resourceAssets, relativeFileIdToPath); } MonobehavioursByAssetId.Add(identifier, monobehaviour); }
public override void Parse(AssetIdentifier identifier, AssetIdentifier gameObjectIdentifier, AssetsFileReader reader, ResourceAssets resourceAssets, Dictionary <int, string> relativeFileIdToPath) { reader.Align(); uint size = reader.ReadUInt32(); WorldEntityInfo wei; for (int i = 0; i < size; i++) { wei = new WorldEntityInfo(); wei.classId = reader.ReadCountStringInt32(); wei.techType = (TechType)reader.ReadInt32(); wei.slotType = (EntitySlot.Type)reader.ReadInt32(); wei.prefabZUp = reader.ReadBoolean(); reader.Align(); wei.cellLevel = (LargeWorldEntity.CellLevel)reader.ReadInt32(); wei.localScale = new UnityEngine.Vector3(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); resourceAssets.WorldEntitiesByClassId.Add(wei.classId, wei); } }
public AssetsFile(AssetsFileReader reader) { this.reader = reader; readerPar = reader.BaseStream; header = new AssetsFileHeader(); header.Read(0, reader); typeTree = new TypeTree(); typeTree.Read(reader.Position, reader, header.format, reader.bigEndian); AssetCount = reader.ReadUInt32(); reader.Align(); AssetTablePos = Convert.ToUInt32(reader.BaseStream.Position); reader.BaseStream.Position += AssetFileInfo.GetSize(header.format) * AssetCount; preloadTable = new PreloadList(); preloadTable.Read(reader.Position, reader, header.format, reader.bigEndian); dependencies = new AssetsFileDependencyList(); dependencies.Read(reader.Position, reader, header.format, reader.bigEndian); }
private List <AssetInfo> GetFSMInfos(AssetsFile file, AssetsFileTable table, bool hasDataField) { List <AssetInfo> assetInfos = new List <AssetInfo>(); uint assetCount = table.assetFileInfoCount; uint fsmTypeId = 0; foreach (AssetFileInfoEx info in table.assetFileInfo) { bool isMono = false; if (fsmTypeId == 0) { ushort monoType; if (file.header.format <= 0x10) { monoType = info.scriptIndex; } else { monoType = file.typeTree.unity5Types[info.curFileTypeOrIndex].scriptIndex; } if (monoType != 0xFFFF) { isMono = true; } } else if (info.curFileType == fsmTypeId) { isMono = true; } if (isMono) { AssetTypeInstance monoAti = am.GetATI(file, info); AssetExternal ext = am.GetExtAsset(curFile, monoAti.GetBaseField().Get("m_Script")); AssetTypeInstance scriptAti = am.GetExtAsset(curFile, monoAti.GetBaseField().Get("m_Script")).instance; AssetTypeInstance goAti = am.GetExtAsset(curFile, monoAti.GetBaseField().Get("m_GameObject")).instance; if (goAti == null) //found a scriptable object, oops { fsmTypeId = 0; continue; } string m_Name = goAti.GetBaseField().Get("m_Name").GetValue().AsString(); string m_ClassName = scriptAti.GetBaseField().Get("m_ClassName").GetValue().AsString(); if (m_ClassName == "PlayMakerFSM") { if (fsmTypeId == 0) { fsmTypeId = info.curFileType; } AssetsFileReader reader = file.reader; long oldPos = reader.BaseStream.Position; reader.BaseStream.Position = info.absoluteFilePos; reader.BaseStream.Position += 28; uint length = reader.ReadUInt32(); reader.ReadBytes((int)length); reader.Align(); reader.BaseStream.Position += 16; if (!hasDataField) { reader.BaseStream.Position -= 4; } uint length2 = reader.ReadUInt32(); string fsmName = Encoding.UTF8.GetString(reader.ReadBytes((int)length2)); reader.BaseStream.Position = oldPos; assetInfos.Add(new AssetInfo() { id = info.index, size = info.curFileSize, name = m_Name + "-" + fsmName }); } } } assetInfos.Sort((x, y) => x.name.CompareTo(y.name)); return(assetInfos); }
public override void Parse(AssetIdentifier identifier, AssetsFileReader reader, ResourceAssets resourceAssets) { reader.Align(); resourceAssets.LootDistributionsJson = reader.ReadCountStringInt32().Replace("\\n", ""); }
public AssetTypeValueField ReadType(AssetsFileReader reader, ulong filePos, AssetTypeValueField valueField, bool bigEndian) { if (valueField.templateField.isArray) { if (valueField.templateField.childrenCount == 2) { EnumValueTypes sizeType = valueField.templateField.children[0].valueType; if (sizeType == EnumValueTypes.ValueType_Int32 || sizeType == EnumValueTypes.ValueType_UInt32) { valueField.childrenCount = reader.ReadUInt32(); valueField.pChildren = new AssetTypeValueField[valueField.childrenCount]; for (int i = 0; i < valueField.childrenCount; i++) { valueField.pChildren[i] = new AssetTypeValueField(); valueField.pChildren[i].templateField = valueField.templateField.children[1]; valueField.pChildren[i] = ReadType(reader, reader.Position, valueField.pChildren[i], bigEndian); } if (valueField.templateField.align) { reader.Align(); } AssetTypeArray ata = new AssetTypeArray(); ata.size = valueField.childrenCount; valueField.value = new AssetTypeValue(EnumValueTypes.ValueType_Array, 0); valueField.value.Set(ata); } else { Debug.WriteLine("Invalid array value type! Found an unexpected " + sizeType.ToString() + " type instead!"); } } else { Debug.WriteLine("Invalid array!"); } } else { EnumValueTypes type = valueField.templateField.valueType; if (type != 0) { valueField.value = new AssetTypeValue(type, 0); } if (type == EnumValueTypes.ValueType_String) { valueField.value.Set(reader.ReadCountStringInt32()); reader.Align(); } else { valueField.childrenCount = valueField.templateField.childrenCount; if (valueField.childrenCount == 0) { valueField.pChildren = new AssetTypeValueField[0]; switch (valueField.templateField.valueType) { case EnumValueTypes.ValueType_Int8: valueField.value.Set(reader.ReadSByte()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_UInt8: case EnumValueTypes.ValueType_Bool: valueField.value.Set(reader.ReadByte()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_Int16: valueField.value.Set(reader.ReadInt16()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_UInt16: valueField.value.Set(reader.ReadUInt16()); if (valueField.templateField.align) { reader.Align(); } break; case EnumValueTypes.ValueType_Int32: valueField.value.Set(reader.ReadInt32()); break; case EnumValueTypes.ValueType_UInt32: valueField.value.Set(reader.ReadUInt32()); break; case EnumValueTypes.ValueType_Int64: valueField.value.Set(reader.ReadInt64()); break; case EnumValueTypes.ValueType_UInt64: valueField.value.Set(reader.ReadUInt64()); break; case EnumValueTypes.ValueType_Float: valueField.value.Set(reader.ReadSingle()); break; case EnumValueTypes.ValueType_Double: valueField.value.Set(reader.ReadDouble()); break; } } else { valueField.pChildren = new AssetTypeValueField[valueField.childrenCount]; for (int i = 0; i < valueField.childrenCount; i++) { valueField.pChildren[i] = new AssetTypeValueField(); valueField.pChildren[i].templateField = valueField.templateField.children[i]; valueField.pChildren[i] = ReadType(reader, reader.Position, valueField.pChildren[i], bigEndian); } } } } return(valueField); }
public override void Parse(AssetIdentifier identifier, AssetsFileReader reader, ResourceAssets resourceAssets, Dictionary <int, string> relativeFileIdToPath) { reader.Align(); resourceAssets.LootDistributionsJson = reader.ReadCountStringInt32().Replace("\\n", ""); }