Example #1
0
        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;
        }
Example #2
0
        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 = "";
                    }
                }
            }
        }