public TsPrefabItem(TsSector sector, int startOffset) : base(sector, startOffset) { Valid = true; Nodes = new List <ulong>(); var fileOffset = startOffset + 0x34; // Set position at start of flags var dlcGuardCount = (Sector.Mapper.IsEts2) ? Common.Ets2DlcGuardCount : Common.AtsDlcGuardCount; Hidden = MemoryHelper.ReadInt8(Sector.Stream, fileOffset + 0x01) > dlcGuardCount || (MemoryHelper.ReadUint8(Sector.Stream, fileOffset + 0x02) & 0x02) != 0; var prefabId = MemoryHelper.ReadUInt64(Sector.Stream, fileOffset += 0x05); Prefab = Sector.Mapper.LookupPrefab(prefabId); if (Prefab == null) { Valid = false; Log.Msg($"Could not find Prefab with id: {MemoryHelper.ReadUInt64(Sector.Stream, fileOffset):X}, " + $"in {Path.GetFileName(Sector.FilePath)} @ {fileOffset} (item uid: 0x{Uid:X})"); } if (Sector.Version >= Common.BaseFileVersion130) { var additionalItemCount = MemoryHelper.ReadInt32(Sector.Stream, fileOffset += 0x08 + 0x08); var nodeCount = MemoryHelper.ReadInt32(Sector.Stream, fileOffset += 0x04 + (additionalItemCount * 0x08)); fileOffset += 0x04; for (var i = 0; i < nodeCount; i++) { Nodes.Add(MemoryHelper.ReadUInt64(Sector.Stream, fileOffset)); fileOffset += 0x08; } var connectedItemCount = MemoryHelper.ReadInt32(Sector.Stream, fileOffset); Origin = MemoryHelper.ReadUint8(Sector.Stream, fileOffset += 0x04 + (0x08 * connectedItemCount) + 0x08); fileOffset += 0x02 + nodeCount * 0x0C; if (Sector.Version >= Common.BaseFileVersion132) { fileOffset += 0x08; } } else { var additionalItemCount = MemoryHelper.ReadInt32(Sector.Stream, fileOffset += 0x08 + 0x10); var nodeCount = MemoryHelper.ReadInt32(Sector.Stream, fileOffset += 0x04 + (0x08 * additionalItemCount)); fileOffset += 0x04; for (var i = 0; i < nodeCount; i++) { Nodes.Add(MemoryHelper.ReadUInt64(Sector.Stream, fileOffset)); fileOffset += 0x08; } var connectedItemCount = MemoryHelper.ReadInt32(Sector.Stream, fileOffset); Origin = MemoryHelper.ReadUint8(Sector.Stream, fileOffset += 0x04 + (0x08 * connectedItemCount) + 0x08); var prefabVegetationCount = MemoryHelper.ReadInt32(Sector.Stream, fileOffset += 0x01 + (NodeLookBlockSize * nodeCount) + 0x01); var vegetationSphereCount = MemoryHelper.ReadInt32(Sector.Stream, fileOffset += 0x04 + (PrefabVegetaionBlockSize * prefabVegetationCount) + 0x04); fileOffset += 0x04 + (VegetationSphereBlockSize * vegetationSphereCount) + (0x18 * nodeCount); } BlockSize = fileOffset - startOffset; }
private void ParsePrefabFiles() { var worldDirectory = Rfs.GetDirectory("def/world"); if (worldDirectory == null) { Log.Msg("Could not read 'def/world' dir"); return; } var prefabFiles = worldDirectory.GetFiles("prefab"); if (prefabFiles == null) { Log.Msg("Could not read prefab files"); return; } foreach (var prefabFile in prefabFiles) { var data = prefabFile.Entry.Read(); var lines = Encoding.UTF8.GetString(data).Split('\n'); var token = 0UL; var path = ""; var category = ""; foreach (var line in lines) { if (line.Contains("prefab_model")) { token = ScsHash.StringToToken(line.Split('.')[1].Trim()); } else if (line.Contains("prefab_desc")) { path = Helper.GetFilePath(line.Split('"')[1]); } else if (line.Contains("category")) { category = line.Split('"')[1]; } if (line.Contains("}") && token != 0 && path != "") { var prefab = new TsPrefab(this, path, token, category); if (prefab.Token != 0 && !_prefabLookup.ContainsKey(prefab.Token)) { _prefabLookup.Add(prefab.Token, prefab); } token = 0; path = ""; category = ""; } } } }