コード例 #1
0
ファイル: ModContent.cs プロジェクト: IFATEI/tModLoader
        public static void Unload()
        {
            ItemLoader.Unload();
            EquipLoader.Unload();
            ModPrefix.Unload();
            ModDust.Unload();
            TileLoader.Unload();
            ModTileEntity.Unload();
            WallLoader.Unload();
            ProjectileLoader.Unload();
            NPCLoader.Unload();
            NPCHeadLoader.Unload();
            PlayerHooks.Unload();
            BuffLoader.Unload();
            MountLoader.Unload();
            ModGore.Unload();
            SoundLoader.Unload();
            DisposeMusic();
            BackgroundTextureLoader.Unload();
            UgBgStyleLoader.Unload();
            SurfaceBgStyleLoader.Unload();
            GlobalBgStyleLoader.Unload();
            WaterStyleLoader.Unload();
            WaterfallStyleLoader.Unload();
            WorldHooks.Unload();
            ResizeArrays(true);
            for (int k = 0; k < Recipe.maxRecipes; k++)
            {
                Main.recipe[k] = new Recipe();
            }
            Recipe.numRecipes = 0;
            RecipeGroupHelper.ResetRecipeGroups();
            Recipe.SetupRecipes();
            MapLoader.UnloadModMap();
            ItemSorting.SetupWhiteLists();
            modHotKeys.Clear();
            RecipeHooks.Unload();
            CommandManager.Unload();
            TagSerializer.Reload();
            ModNet.Unload();
            CustomCurrencyManager.Initialize();
            EffectsTracker.RemoveModEffects();

            CleanupModReferences();
        }
コード例 #2
0
        public GameCacheGen1(MapFile mapFile, FileInfo file)
        {
            BaseMapFile  = mapFile;
            CacheFile    = file;
            Version      = BaseMapFile.Version;
            CacheFile    = file;
            Deserializer = new TagDeserializer(Version);
            Serializer   = new TagSerializer(Version);
            Endianness   = BaseMapFile.EndianFormat;
            DisplayName  = mapFile.Header.NameOld + ".map";
            Directory    = file.Directory;

            using (var cacheStream = OpenCacheRead())
                using (var reader = new EndianReader(cacheStream, Endianness))
                {
                    TagCacheGen1 = new TagCacheGen1(reader, mapFile);
                }
        }
コード例 #3
0
        public TagCacheHaloOnline CreateTagCache(Stream stream)
        {
            TagCacheHaloOnlineHeader header = new TagCacheHaloOnlineHeader
            {
                TagTableOffset = 0x20,
                CreationTime   = 0x01D0631BCC791704
            };

            stream.Position = 0;
            var writer      = new EndianWriter(stream, EndianFormat.LittleEndian);
            var dataContext = new DataSerializationContext(writer);
            var serializer  = new TagSerializer(CacheVersion.HaloOnline106708);

            serializer.Serialize(dataContext, header);
            stream.Position = 0;

            return(new TagCacheHaloOnline(stream, new Dictionary <int, string>()));
        }
コード例 #4
0
        public override void Load()
        {
            Instance = this;

            Utility.Load();

            TagSerializer.AddSerializer(new FrequencySerializer());
            TagSerializer.AddSerializer(new ItemPairSerializer());
            TagSerializer.AddSerializer(new FluidPairSerializer());

            if (!Main.dedServ)
            {
                textureGemsMiddle = ModContent.GetTexture("QuantumStorage/Textures/Tiles/GemMiddle_0");
                textureGemsSide   = ModContent.GetTexture("QuantumStorage/Textures/Tiles/GemSide_0");
                textureRingSmall  = ModContent.GetTexture("QuantumStorage/Textures/Items/RingSmall");
                textureRingBig    = ModContent.GetTexture("QuantumStorage/Textures/Items/RingBig");
            }
        }
コード例 #5
0
        private void BuildResourceData(TagSerializer serializer, Stream resourceDataStream)
        {
            var definition = new RenderGeometryResourceDefinition();

            definition.VertexBuffers = new List <D3DPointer <VertexBufferDefinition> >();
            definition.IndexBuffers  = new List <D3DPointer <IndexBufferDefinition> >();
            foreach (var mesh in _meshes)
            {
                // Serialize the mesh's vertex buffer
                var vertexBufferStart = (int)resourceDataStream.Position;
                var vertexCount       = SerializeVertexBuffer(mesh, resourceDataStream);
                var vertexBufferEnd   = (int)resourceDataStream.Position;

                // Add a definition for it
                mesh.Mesh.VertexBuffers[0] = (ushort)definition.VertexBuffers.Count;
                definition.VertexBuffers.Add(new D3DPointer <VertexBufferDefinition>
                {
                    Definition = new VertexBufferDefinition
                    {
                        Count      = vertexCount,
                        Format     = mesh.VertexFormat,
                        VertexSize = VertexSizes[mesh.VertexFormat],
                        Data       = new ResourceDataReference(vertexBufferEnd - vertexBufferStart, new ResourceAddress(ResourceAddressType.Resource, vertexBufferStart)),
                    },
                });

                // Serialize the mesh's index buffer
                var indexBufferStart = vertexBufferEnd;
                SerializeIndexBuffer(mesh, resourceDataStream);
                var indexBufferEnd = (int)resourceDataStream.Position;

                // Add a definition for it
                mesh.Mesh.IndexBuffers[0] = (ushort)definition.IndexBuffers.Count;
                definition.IndexBuffers.Add(new D3DPointer <IndexBufferDefinition>
                {
                    Definition = new IndexBufferDefinition
                    {
                        Type = mesh.Mesh.IndexBufferType,
                        Data = new ResourceDataReference(indexBufferEnd - indexBufferStart, new ResourceAddress(ResourceAddressType.Resource, indexBufferStart)),
                    },
                });
            }
            SerializeDefinitionData(serializer, definition);
        }
コード例 #6
0
ファイル: HavokConverter.cs プロジェクト: jaron780/TagTool
        public static byte[] ConvertHkpMoppData(CacheVersion sourceVersion, CacheVersion destVersion, byte[] data)
        {
            if (data == null || data.Length == 0)
            {
                return(data);
            }

            byte[] result;
            using (var inputReader = new EndianReader(new MemoryStream(data), CacheVersionDetection.IsLittleEndian(sourceVersion) ? EndianFormat.LittleEndian : EndianFormat.BigEndian))
                using (var outputStream = new MemoryStream())
                    using (var outputWriter = new EndianWriter(outputStream, CacheVersionDetection.IsLittleEndian(destVersion) ? EndianFormat.LittleEndian : EndianFormat.BigEndian))
                    {
                        var dataContext  = new DataSerializationContext(inputReader, outputWriter);
                        var deserializer = new TagDeserializer(sourceVersion);
                        var serializer   = new TagSerializer(destVersion);
                        while (!inputReader.EOF)
                        {
                            var         header      = deserializer.Deserialize <HkpMoppCode>(dataContext);
                            var         dataSize    = header.ArrayBase.GetCapacity();
                            var         alignedSize = dataSize + 0xf & ~0xf;
                            var         nextOffset  = inputReader.Position + alignedSize;
                            List <byte> moppCodes   = new List <byte>();
                            for (int j = 0; j < header.ArrayBase.GetCapacity(); j++)
                            {
                                moppCodes.Add(inputReader.ReadByte());
                            }
                            inputReader.SeekTo(nextOffset);

                            moppCodes = ConvertMoppCodes(sourceVersion, destVersion, moppCodes);

                            serializer.Serialize(dataContext, header);
                            for (int j = 0; j < moppCodes.Count; j++)
                            {
                                outputWriter.Write(moppCodes[j]);
                            }

                            StreamUtil.Align(outputStream, 0x10);
                        }
                        result = outputStream.ToArray();
                    }
            return(result);
        }
コード例 #7
0
        public override void Load()
        {
            Utility.Load();

            TagSerializer.AddSerializer(new FrequencySerializer());
            TagSerializer.AddSerializer(new ItemPairSerializer());
            TagSerializer.AddSerializer(new FluidPairSerializer());

            if (!Main.dedServ)
            {
                textureGemsMiddle = ModContent.GetTexture("QuantumStorage/Textures/Tiles/GemMiddle_0");
                textureGemsSide   = ModContent.GetTexture("QuantumStorage/Textures/Tiles/GemSide_0");
                textureRingSmall  = ModContent.GetTexture("QuantumStorage/Textures/Items/RingSmall");
                textureRingBig    = ModContent.GetTexture("QuantumStorage/Textures/Items/RingBig");

                textureLootAll    = ModContent.GetTexture("BaseLibrary/Textures/UI/LootAll");
                textureDepositAll = ModContent.GetTexture("BaseLibrary/Textures/UI/DepositAll");
                textureQuickStack = ModContent.GetTexture("BaseLibrary/Textures/UI/QuickStack");
            }
        }
コード例 #8
0
        public override void Load()
        {
            Instance = this;

            bagKey = RegisterHotKey("Open Bag", "B");

            TagSerializer.AddSerializer(new FreqSerializer());

            if (!Main.dedServ)
            {
                vacuumBagOn  = ModLoader.GetTexture(ItemTexturePath + "VacuumBagActive");
                vacuumBagOff = ModLoader.GetTexture(ItemTexturePath + "VacuumBagInactive");

                for (int i = 0; i < 3; i++)
                {
                    gemsMiddle[i] = ModLoader.GetTexture(TileTexturePath + "GemMiddle" + i);
                    gemsSide[i]   = ModLoader.GetTexture(TileTexturePath + "GemSide" + i);
                }
            }
        }
コード例 #9
0
        public HaloOnlineCacheContext(DirectoryInfo directory) :
            base(directory)
        {
            var tagNames = LoadTagNames();

            using (var stream = OpenTagCacheRead())
                TagCache = new TagCache(stream, tagNames);

            if (CacheVersion.Unknown == (Version = CacheVersionDetection.DetectFromTagCache(TagCache, out var closestVersion)))
            {
                Version = closestVersion;
            }

            Deserializer = new TagDeserializer(Version == CacheVersion.Unknown ? closestVersion : Version);
            Serializer   = new TagSerializer(Version == CacheVersion.Unknown ? closestVersion : Version);

            StringIdResolver stringIdResolver = null;

            if (CacheVersionDetection.Compare(Version, CacheVersion.HaloOnline700123) >= 0)
            {
                stringIdResolver = new StringIdResolverMS30();
            }
            else if (CacheVersionDetection.Compare(Version, CacheVersion.HaloOnline498295) >= 0)
            {
                stringIdResolver = new StringIdResolverMS28();
            }
            else
            {
                stringIdResolver = new StringIdResolverMS23();
            }

            using (var stream = OpenStringIdCacheRead())
                StringIdCache = new StringIdCache(stream, stringIdResolver);

            TagGroup.Instances[new Tag("obje")] = new TagGroup(new Tag("obje"), Tag.Null, Tag.Null, GetStringId("object"));
            TagGroup.Instances[new Tag("item")] = new TagGroup(new Tag("item"), new Tag("obje"), Tag.Null, GetStringId("item"));
            TagGroup.Instances[new Tag("devi")] = new TagGroup(new Tag("devi"), new Tag("obje"), Tag.Null, GetStringId("device"));
            TagGroup.Instances[new Tag("unit")] = new TagGroup(new Tag("unit"), new Tag("obje"), Tag.Null, GetStringId("unit"));
            TagGroup.Instances[new Tag("rm  ")] = new TagGroup(new Tag("rm  "), Tag.Null, Tag.Null, GetStringId("render_method"));
            TagGroup.Instances[new Tag("test")] = new TagGroup(new Tag("test"), Tag.Null, Tag.Null, GetStringId("test_blah"));
        }
コード例 #10
0
        /// <summary>
        /// Builds a model tag and resource data.
        /// </summary>
        /// <param name="serializer">The tag serializer to use to serialize the model definition data.</param>
        /// <param name="resourceDataStream">The stream to write resource data to.</param>
        /// <returns></returns>
        /// <exception cref="System.InvalidOperationException">Cannot build a model if a region is active</exception>
        public RenderModel Build(TagSerializer serializer, Stream resourceDataStream)
        {
            if (_currentRegion != null)
            {
                throw new InvalidOperationException("Cannot build a model if a region is active");
            }

            foreach (var mesh in _model.Geometry.Meshes)
            {
                if (mesh.Type == VertexType.Skinned)
                {
                    mesh.RigidNodeIndex = -1;
                }
            }

            CompressVertices();

            BuildResourceData(serializer, resourceDataStream);

            return(_model);
        }
コード例 #11
0
ファイル: BitmapDdsInjector.cs プロジェクト: Pedro413/TagTool
        public void InjectDds(TagSerializer serializer, TagDeserializer deserializer, Bitmap bitmap, int imageIndex, Stream ddsStream, ResourceLocation location = ResourceLocation.Textures)
        {
            var resource    = bitmap.Resources[imageIndex].Resource;
            var newResource = (resource == null);
            ResourceSerializationContext resourceContext;
            BitmapTextureInteropResource definition;

            if (newResource)
            {
                // Create a new resource reference
                resource = new PageableResource
                {
                    Page     = new RawPage(),
                    Resource = new TagResourceGen3
                    {
                        ResourceFixups           = new List <TagResourceGen3.ResourceFixup>(),
                        ResourceDefinitionFixups = new List <TagResourceGen3.ResourceDefinitionFixup>(),
                        ResourceType             = TagResourceTypeGen3.Bitmap,
                        Unknown2 = 1
                    }
                };

                bitmap.Resources[imageIndex].Resource = resource;
                resourceContext = new ResourceSerializationContext(CacheContext, resource);
                definition      = new BitmapTextureInteropResource
                {
                    Texture = new TagStructureReference <BitmapTextureInteropResource.BitmapDefinition>
                    {
                        Definition = new BitmapTextureInteropResource.BitmapDefinition
                        {
                            Data        = new TagData(),
                            UnknownData = new TagData(),
                        }
                    }
                };
            }
            else
            {
                // Deserialize the old definition
                resourceContext = new ResourceSerializationContext(CacheContext, resource);
                definition      = deserializer.Deserialize <BitmapTextureInteropResource>(resourceContext);
            }
            if (definition.Texture == null || definition.Texture.Definition == null)
            {
                throw new ArgumentException("Invalid bitmap definition");
            }
            var texture   = definition.Texture.Definition;
            var imageData = bitmap.Images[imageIndex];

            // Read the DDS header and modify the definition to match
            var dds      = DdsHeader.Read(ddsStream);
            var dataSize = (int)(ddsStream.Length - ddsStream.Position);

            texture.Data        = new TagData(dataSize, new CacheResourceAddress(CacheResourceAddressType.Resource, 0));
            texture.Width       = (short)dds.Width;
            texture.Height      = (short)dds.Height;
            texture.Depth       = (sbyte)Math.Max(1, dds.Depth);
            texture.MipmapCount = (sbyte)Math.Max(1, dds.MipMapCount);
            texture.Type        = BitmapDdsFormatDetection.DetectType(dds);
            texture.D3DFormat   = (int)((dds.D3D10Format != DxgiFormat.Bc5UNorm) ? dds.FourCc : DdsFourCc.FromString("ATI2"));
            texture.Format      = BitmapDdsFormatDetection.DetectFormat(dds);

            // Set flags based on the format
            switch (texture.Format)
            {
            case BitmapFormat.Dxt1:
            case BitmapFormat.Dxt3:
            case BitmapFormat.Dxt5:
            case BitmapFormat.Dxn:
                texture.Flags = BitmapFlags.Compressed;
                break;

            default:
                texture.Flags = BitmapFlags.None;
                break;
            }
            if ((texture.Width & (texture.Width - 1)) == 0 && (texture.Height & (texture.Height - 1)) == 0)
            {
                texture.Flags |= BitmapFlags.PowerOfTwoDimensions;
            }

            // If creating a new image, then add a new resource, otherwise replace the existing one
            if (newResource)
            {
                resource.ChangeLocation(location);
                CacheContext.AddResource(resource, ddsStream);
            }
            else
            {
                CacheContext.ReplaceResource(resource, ddsStream);
            }

            // Serialize the new resource definition
            serializer.Serialize(resourceContext, definition);

            // Modify the image data in the bitmap tag to match the definition
            imageData.Width       = texture.Width;
            imageData.Height      = texture.Height;
            imageData.Depth       = texture.Depth;
            imageData.Type        = texture.Type;
            imageData.Format      = texture.Format;
            imageData.Flags       = texture.Flags;
            imageData.MipmapCount = (sbyte)(texture.MipmapCount - 1);
            imageData.DataOffset  = texture.Data.Address.Offset;
            imageData.DataSize    = texture.Data.Size;
            imageData.Curve       = (BitmapImageCurve)texture.Curve;
        }
コード例 #12
0
        public override bool Execute(List <string> args)
        {
            if (args.Count != 4)
            {
                return(false);
            }

            var sourceTag = ParseTagIndex(Info, args[0]);

            if (sourceTag == null || !sourceTag.IsInGroup(new Tag("armr")))
            {
                WriteLine("Source tag must be of group 'armr'.");
                return(false);
            }

            var inputCsv = new FileInfo(args[1]);

            if (!inputCsv.Exists)
            {
                WriteLine($"Input csv file does not exist: {inputCsv.FullName}");
                return(false);
            }

            var outputCsv = new FileInfo(args[2]);

            var destDir = new DirectoryInfo(args[3]);

            if (!destDir.Exists)
            {
                WriteLine($"Destination cache directory does not exist: {destDir.FullName}");
                return(false);
            }

            var destTagsFile = new FileInfo(Combine(destDir.FullName, "tags.dat"));

            if (!destTagsFile.Exists)
            {
                WriteLine($"Destination tag cache file does not exist: {destTagsFile.FullName}");
                return(false);
            }

            var destStringIDsFile = new FileInfo(Combine(destDir.FullName, "string_ids.dat"));

            if (!destStringIDsFile.Exists)
            {
                WriteLine($"Destination string id cache file does not exist: {destStringIDsFile.FullName}");
                return(false);
            }

            var destResourcesFile = new FileInfo(Combine(destDir.FullName, "resources.dat"));

            if (!destResourcesFile.Exists)
            {
                WriteLine($"Destination resource cache file does not exist: {destResourcesFile.FullName}");
                return(false);
            }

            var destTexturesFile = new FileInfo(Combine(destDir.FullName, "textures.dat"));

            if (!destTexturesFile.Exists)
            {
                WriteLine($"Destination texture cache file does not exist: {destTexturesFile.FullName}");
                return(false);
            }

            var destTexturesBFile = new FileInfo(Combine(destDir.FullName, "textures_b.dat"));

            if (!destTexturesBFile.Exists)
            {
                WriteLine($"Destination texture cache file does not exist: {destTexturesBFile.FullName}");
                return(false);
            }

            var destAudioFile = new FileInfo(Combine(destDir.FullName, "audio.dat"));

            if (!destAudioFile.Exists)
            {
                WriteLine($"Destination audio cache file does not exist: {destAudioFile.FullName}");
                return(false);
            }

            TagVersionMap tagMap;

            using (var reader = new StreamReader(inputCsv.OpenRead()))
                tagMap = ParseTagVersionMap(reader);

            TagCache destTagCache;

            using (var stream = destTagsFile.OpenRead())
                destTagCache = new TagCache(stream);

            DefinitionSet guessedVersion;
            var           destVersion = Detect(destTagCache, out guessedVersion);

            if (destVersion == Unknown)
            {
                WriteLine($"Unrecognized target version! (guessed {GetVersionString(guessedVersion)})");
                return(true);
            }

            WriteLine($"Destination cache version: {GetVersionString(destVersion)}");

            StringIDCache destStringIDCache;

            using (var stream = destStringIDsFile.OpenRead())
                destStringIDCache = new StringIDCache(stream, Create(destVersion));

            var destResources = new ResourceDataManager();

            destResources.LoadCachesFromDirectory(destDir.FullName);

            var srcResources = new ResourceDataManager();

            srcResources.LoadCachesFromDirectory(Info.CacheFile.DirectoryName);

            var destSerializer   = new TagSerializer(destVersion);
            var destDeserializer = new TagDeserializer(destVersion);

            return(true);
        }
コード例 #13
0
        public override bool Execute(List <string> args)
        {
            if (args.Count != 3)
            {
                return(false);
            }

            GameLanguage language;

            if (!ArgumentParser.ParseLanguage(args[0], out language))
            {
                return(false);
            }

            // Look up the stringID that was passed in
            var stringIdStr   = args[1];
            var stringIdIndex = _stringIds.Strings.IndexOf(stringIdStr);

            if (stringIdIndex < 0)
            {
                Console.Error.WriteLine("Unable to find stringID \"{0}\".", stringIdStr);
                return(true);
            }
            var stringId = _stringIds.GetStringId(stringIdIndex);

            if (stringId == 0)
            {
                Console.Error.WriteLine("Failed to resolve the stringID.");
                return(true);
            }
            var newValue = ArgumentParser.Unescape(args[2]);

            // Look up or create a localized string entry
            var localizedStr = _unic.Strings.FirstOrDefault(s => s.StringId == stringId);
            var added        = false;

            if (localizedStr == null)
            {
                // Add a new string
                localizedStr = new LocalizedString {
                    StringId = stringId
                };
                _unic.Strings.Add(localizedStr);
                added = true;
            }

            // Save the tag data
            _unic.SetString(localizedStr, language, newValue);
            using (var stream = _fileInfo.Open(FileMode.Open, FileAccess.ReadWrite))
                TagSerializer.Serialize(new TagSerializationContext(stream, _cache, _tag), _unic);

            if (added)
            {
                Console.WriteLine("String added successfully.");
            }
            else
            {
                Console.WriteLine("String changed successfully.");
            }
            return(true);
        }
コード例 #14
0
ファイル: ReplaceCommand.cs プロジェクト: XeCREATURE/TagTool
        public override bool Execute(List <string> args)
        {
            if (args.Count != 2)
            {
                return(false);
            }

            var destDir = new DirectoryInfo(args[1]);

            if (!destDir.Exists)
            {
                WriteLine($"Destination cache directory does not exist: {destDir.FullName}");
                return(false);
            }

            var destTagsFile = new FileInfo(Combine(destDir.FullName, "tags.dat"));

            if (!destTagsFile.Exists)
            {
                WriteLine($"Destination tag cache file does not exist: {destTagsFile.FullName}");
                return(false);
            }

            var destStringIDsFile = new FileInfo(Combine(destDir.FullName, "string_ids.dat"));

            if (!destStringIDsFile.Exists)
            {
                WriteLine($"Destination string id cache file does not exist: {destStringIDsFile.FullName}");
                return(false);
            }

            var destResourcesFile = new FileInfo(Combine(destDir.FullName, "resources.dat"));

            if (!destResourcesFile.Exists)
            {
                WriteLine($"Destination resource cache file does not exist: {destResourcesFile.FullName}");
                return(false);
            }

            var destTexturesFile = new FileInfo(Combine(destDir.FullName, "textures.dat"));

            if (!destTexturesFile.Exists)
            {
                WriteLine($"Destination texture cache file does not exist: {destTexturesFile.FullName}");
                return(false);
            }

            var destTexturesBFile = new FileInfo(Combine(destDir.FullName, "textures_b.dat"));

            if (!destTexturesBFile.Exists)
            {
                WriteLine($"Destination texture cache file does not exist: {destTexturesBFile.FullName}");
                return(false);
            }

            var destAudioFile = new FileInfo(Combine(destDir.FullName, "audio.dat"));

            if (!destAudioFile.Exists)
            {
                WriteLine($"Destination audio cache file does not exist: {destAudioFile.FullName}");
                return(false);
            }

            TagCache destTagCache;

            using (var stream = destTagsFile.OpenRead())
                destTagCache = new TagCache(stream);

            DefinitionSet guessedVersion;
            var           destVersion = Detect(destTagCache, out guessedVersion);

            if (destVersion == Unknown)
            {
                WriteLine($"Unrecognized target version! (guessed {GetVersionString(guessedVersion)})");
                return(true);
            }

            WriteLine($"Destination cache version: {GetVersionString(destVersion)}");

            StringIDCache destStringIDCache;

            using (var stream = destStringIDsFile.OpenRead())
                destStringIDCache = new StringIDCache(stream, Create(destVersion));

            var destResources = new ResourceDataManager();

            destResources.LoadCachesFromDirectory(destDir.FullName);

            var srcResources = new ResourceDataManager();

            srcResources.LoadCachesFromDirectory(Info.CacheFile.DirectoryName);

            var destSerializer   = new TagSerializer(destVersion);
            var destDeserializer = new TagDeserializer(destVersion);

            var destInfo = new OpenTagCache
            {
                Cache         = destTagCache,
                CacheFile     = destTagsFile,
                StringIDs     = destStringIDCache,
                StringIDsFile = destStringIDsFile,
                Version       = destVersion,
                Serializer    = destSerializer,
                Deserializer  = destDeserializer
            };

            var destTag = ParseTagIndex(destInfo, args[0]);

            if (destTag == null || !destTag.IsInGroup(new Tag("mode")))
            {
                WriteLine("Destination tag must be of group 'mode'.");
                return(false);
            }

            RenderModel destDefinition;

            using (var destStream = destInfo.OpenCacheRead())
            {
                var context = new TagSerializationContext(destStream, destInfo.Cache, destInfo.StringIDs, destTag);
                destDefinition = destInfo.Deserializer.Deserialize <RenderModel>(context);
            }

            using (MemoryStream inStream = new MemoryStream(), outStream = new MemoryStream())
            {
                // First extract the model data
                srcResources.Extract(Definition.Geometry.Resource, inStream);

                // Now open source and destination vertex streams
                inStream.Position = 0;
                var inVertexStream  = VertexStreamFactory.Create(Info.Version, inStream);
                var outVertexStream = VertexStreamFactory.Create(destInfo.Version, outStream);

                // Deserialize the definition data
                var resourceContext = new ResourceSerializationContext(Definition.Geometry.Resource);
                var definition      = Info.Deserializer.Deserialize <RenderGeometryResourceDefinition>(resourceContext);

                // Convert each vertex buffer
                foreach (var buffer in definition.VertexBuffers)
                {
                    TagConverter.ConvertVertexBuffer(buffer.Definition, inStream, inVertexStream, outStream, outVertexStream);
                }

                // Copy each index buffer over
                foreach (var buffer in definition.IndexBuffers)
                {
                    if (buffer.Definition.Data.Size == 0)
                    {
                        continue;
                    }
                    inStream.Position = buffer.Definition.Data.Address.Offset;
                    buffer.Definition.Data.Address = new ResourceAddress(ResourceAddressType.Resource, (int)outStream.Position);
                    var bufferData = new byte[buffer.Definition.Data.Size];
                    inStream.Read(bufferData, 0, bufferData.Length);
                    outStream.Write(bufferData, 0, bufferData.Length);
                    StreamUtil.Align(outStream, 4);
                }

                destInfo.Serializer.Serialize(resourceContext, definition);

                outStream.Position = 0;
                destResources.Replace(destDefinition.Geometry.Resource, outStream);
            }

            return(true);
        }
コード例 #15
0
        private void WriteFileEntries(EndianWriter writer, ISerializationContext context, TagSerializer serializer)
        {
            const int kFileTableEntrySize = 0x108;

            uint sectionOffset        = (uint)writer.BaseStream.Position;
            GenericSectionEntry table = new GenericSectionEntry(Files.Count, 0x8);

            table.Write(writer);

            // make room for table
            writer.BaseStream.Position = sectionOffset + table.TableOffset + Files.Count * kFileTableEntrySize;
            var index = 0;

            foreach (var fileEntry in Files)
            {
                StreamUtil.Align(writer.BaseStream, 0x10);
                uint offset = (uint)(writer.BaseStream.Position - sectionOffset);
                // write the contents
                fileEntry.Value.CopyTo(writer.BaseStream);

                // seek to the file table entry
                writer.BaseStream.Position = sectionOffset + table.TableOffset + index * kFileTableEntrySize;
                index++;

                // write the table entry
                var tableEntry = new FileTableEntry();
                tableEntry.Path   = fileEntry.Key;
                tableEntry.Size   = (uint)fileEntry.Value.Length;
                tableEntry.Offset = offset;
                serializer.Serialize(context, tableEntry);

                // move back to where we were
                writer.Seek(0, SeekOrigin.End);
            }
        }
コード例 #16
0
 private void WriteMetadataSection(DataSerializationContext context, TagSerializer serializer)
 {
     serializer.Serialize(context, Metadata);
 }
コード例 #17
0
        private void WriteTagNamesSection(EndianWriter writer, DataSerializationContext context, TagSerializer serializer)
        {
            uint sectionOffset = (uint)writer.BaseStream.Position;
            GenericSectionEntry tagNameFileEntry = new GenericSectionEntry(TagCacheNames.Count, 0x8);

            tagNameFileEntry.Write(writer);
            // make room for table

            writer.Write(new byte[0x8 * TagCacheNames.Count]);

            for (int i = 0; i < TagCacheNames.Count; i++)
            {
                //prepare tag names
                var names = new Dictionary <int, string>();

                foreach (var entry in TagCaches[i].TagTable)
                {
                    if (entry != null && entry.Name != null)
                    {
                        names.Add(entry.Index, entry.Name);
                    }
                }

                uint offset = (uint)writer.BaseStream.Position;

                GenericSectionEntry tagNameTable = new GenericSectionEntry(names.Count, offset - sectionOffset + 0x8);
                tagNameTable.Write(writer);

                foreach (var entry in names)
                {
                    var tagNameEntry = new ModPackageTagNamesEntry(entry.Key, entry.Value);
                    serializer.Serialize(context, tagNameEntry);
                }

                uint size = (uint)(writer.BaseStream.Position - offset);

                writer.BaseStream.Seek(tagNameFileEntry.TableOffset + 0x8 * i + sectionOffset, SeekOrigin.Begin);
                var tableEntry = new GenericTableEntry(size, offset - sectionOffset);
                tableEntry.Write(writer);
                writer.BaseStream.Seek(0, SeekOrigin.End);
            }
        }
コード例 #18
0
        private void WriteTagsSection(EndianWriter writer, DataSerializationContext context, TagSerializer serializer)
        {
            uint sectionOffset = (uint)writer.BaseStream.Position;
            GenericSectionEntry tagCachesEntry = new GenericSectionEntry(TagCaches.Count, 0x8);

            tagCachesEntry.Write(writer);
            // make room for table

            writer.Write(new byte[0x28 * TagCaches.Count]);

            for (int i = 0; i < TagCaches.Count; i++)
            {
                uint offset = (uint)writer.BaseStream.Position;

                TagCachesStreams[i].Position = 0;
                StreamUtil.Copy(TagCachesStreams[i], writer.BaseStream, (int)TagCachesStreams[i].Length);
                StreamUtil.Align(writer.BaseStream, 4);

                uint size = (uint)(writer.BaseStream.Position - offset);

                writer.BaseStream.Seek(tagCachesEntry.TableOffset + 0x28 * i + sectionOffset, SeekOrigin.Begin);
                var tableEntry = new CacheTableEntry(size, offset - sectionOffset, CacheNames[i]);
                serializer.Serialize(context, tableEntry);
                writer.BaseStream.Seek(0, SeekOrigin.End);
            }
        }
コード例 #19
0
        public void Save(FileInfo file)
        {
            if (!file.Directory.Exists)
            {
                file.Directory.Create();
            }

            using (var packageStream = file.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite))
                using (var writer = new EndianWriter(packageStream, leaveOpen: true))
                {
                    var serializer  = new TagSerializer(CacheVersion.HaloOnline106708);
                    var dataContext = new DataSerializationContext(writer);

                    packageStream.SetLength(0);

                    //
                    // reserve header space
                    //

                    writer.Write(new byte[typeof(ModPackageHeader).GetSize()]);

                    //
                    // build section table
                    //

                    Header.SectionTable.Count  = (int)ModPackageSection.SectionCount;
                    Header.SectionTable.Offset = (uint)writer.BaseStream.Position;

                    writer.Write(new byte[typeof(ModPackageSectionHeader).GetSize() * (int)ModPackageSection.SectionCount]);


                    uint size;
                    uint offset;

                    //
                    // Write metadata
                    //

                    offset = (uint)writer.BaseStream.Position;
                    WriteMetadataSection(dataContext, serializer);
                    size = (uint)(writer.BaseStream.Position - offset);
                    WriteSectionEntry((int)ModPackageSection.Metadata, writer, size, offset);

                    //
                    // Write tag cache
                    //

                    offset = (uint)writer.BaseStream.Position;
                    WriteTagsSection(writer, dataContext, serializer);
                    size = (uint)(writer.BaseStream.Position - offset);
                    WriteSectionEntry((int)ModPackageSection.Tags, writer, size, offset);

                    //
                    // Write tag names table
                    //

                    offset = (uint)writer.BaseStream.Position;
                    WriteTagNamesSection(writer, dataContext, serializer);
                    size = (uint)(writer.BaseStream.Position - offset);
                    WriteSectionEntry((int)ModPackageSection.TagNames, writer, size, offset);

                    //
                    // write resource cache
                    //

                    offset = (uint)writer.BaseStream.Position;
                    WriteResourcesSection(writer);
                    size = (uint)(writer.BaseStream.Position - offset);
                    WriteSectionEntry((int)ModPackageSection.Resources, writer, size, offset);

                    //
                    // Write map file section
                    //

                    if (MapFileStreams.Count > 0)
                    {
                        offset = (uint)writer.BaseStream.Position;
                        WriteMapsSection(writer);
                        size = (uint)(writer.BaseStream.Position - offset);
                        WriteSectionEntry((int)ModPackageSection.MapFiles, writer, size, offset);

                        DetermineMapFlags();
                    }

                    //
                    // Write campaign file section
                    //
                    if (CampaignFileStream != null && CampaignFileStream.Length > 0)
                    {
                        offset = (uint)writer.BaseStream.Position;
                        WriteCampaignFileSection(writer);
                        size = (uint)(writer.BaseStream.Position - offset);
                        WriteSectionEntry((int)ModPackageSection.CampaignFiles, writer, size, offset);
                    }

                    //
                    // Write font file section
                    //
                    if (FontPackage != null && FontPackage.Length > 0)
                    {
                        offset = (uint)writer.BaseStream.Position;
                        WriteFontFileSection(writer);
                        size = (uint)(writer.BaseStream.Position - offset);
                        WriteSectionEntry((int)ModPackageSection.Fonts, writer, size, offset);
                    }

                    //
                    // Write stringid file section
                    //
                    if (StringTable != null)
                    {
                        offset = (uint)writer.BaseStream.Position;
                        WriteStringIdsSection(writer);
                        size = (uint)(writer.BaseStream.Position - offset);
                        WriteSectionEntry((int)ModPackageSection.StringIds, writer, size, offset);
                    }

                    //
                    // Write files section
                    //
                    if (Files != null && Files.Count > 0)
                    {
                        offset = (uint)writer.BaseStream.Position;
                        WriteFileEntries(writer, dataContext, serializer);
                        size = (uint)(writer.BaseStream.Position - offset);
                        WriteSectionEntry((int)ModPackageSection.Files, writer, size, offset);
                    }

                    //
                    // calculate package sha1
                    //

                    packageStream.Position = typeof(ModPackageHeader).GetSize();
                    Header.SHA1            = new SHA1Managed().ComputeHash(packageStream);

                    //
                    // update package header
                    //

                    Header.FileSize = (uint)packageStream.Length;

                    packageStream.Position = 0;
                    serializer.Serialize(dataContext, Header);

                    if (packageStream.Length > uint.MaxValue)
                    {
                        Console.WriteLine($"WARNING: Mod package size exceeded 0x{uint.MaxValue.ToString("X8")} bytes, it will fail to load.");
                    }
                }
        }
コード例 #20
0
        public bool Write(EndianWriter writer)
        {
            if (!ContentFlags.HasFlag(BlfFileContentFlags.StartOfFile) || !ContentFlags.HasFlag(BlfFileContentFlags.EndOfFile))
            {
                return(false);
            }

            TagSerializer serializer = new TagSerializer(Version, Format);

            writer.Format = Format;
            var dataContext = new DataSerializationContext(writer);

            serializer.Serialize(dataContext, StartOfFile);

            if (ContentFlags.HasFlag(BlfFileContentFlags.Scenario))
            {
                serializer.Serialize(dataContext, Scenario);
            }

            if (ContentFlags.HasFlag(BlfFileContentFlags.ContentHeader))
            {
                serializer.Serialize(dataContext, ContentHeader);
            }

            if (ContentFlags.HasFlag(BlfFileContentFlags.MapVariant))
            {
                serializer.Serialize(dataContext, MapVariant);
            }

            if (ContentFlags.HasFlag(BlfFileContentFlags.GameVariant))
            {
                serializer.Serialize(dataContext, GameVariant);
            }

            if (ContentFlags.HasFlag(BlfFileContentFlags.Campaign))
            {
                serializer.Serialize(dataContext, Campaign);
            }

            if (ContentFlags.HasFlag(BlfFileContentFlags.ModReference))
            {
                serializer.Serialize(dataContext, ModReference);
            }

            if (ContentFlags.HasFlag(BlfFileContentFlags.MapVariantTagNames))
            {
                serializer.Serialize(dataContext, MapVariantTagNames);
            }


            switch (AuthenticationType)
            {
            case BlfAuthenticationType.None:
                serializer.Serialize(dataContext, EndOfFile);
                break;

            case BlfAuthenticationType.CRC:
                serializer.Serialize(dataContext, EndOfFileCRC);
                break;

            case BlfAuthenticationType.RSA:
                serializer.Serialize(dataContext, EndOfFileRSA);
                break;

            case BlfAuthenticationType.SHA1:
                serializer.Serialize(dataContext, EndOfFileSHA1);
                break;
            }

            return(true);
        }
コード例 #21
0
        private void WriteTagNamesSection(EndianWriter writer, DataSerializationContext context, TagSerializer serializer)
        {
            //prepare tag names
            var names = new Dictionary <int, string>();

            foreach (var entry in Tags.Index)
            {
                if (entry != null && entry.Name != null)
                {
                    names.Add(entry.Index, entry.Name);
                }
            }

            // create entry and immediatly write the tag names table
            GenericSectionEntry mapEntry = new GenericSectionEntry(names.Count, (int)writer.BaseStream.Position + 0x8);

            mapEntry.Write(writer);

            foreach (var entry in names)
            {
                var tagNameEntry = new ModPackageTagNamesEntry(entry.Key, entry.Value);
                serializer.Serialize(context, tagNameEntry);
            }
        }
コード例 #22
0
ファイル: ModContent.cs プロジェクト: vSLG/tModLoader
        //TODO: Unhardcode ALL of this.
        internal static void Unload()
        {
            ContentInstance.Clear();
            ModTypeLookup.Clear();
            ItemLoader.Unload();
            EquipLoader.Unload();
            PrefixLoader.Unload();
            DustLoader.Unload();
            TileLoader.Unload();
            TileEntity.manager.Reset();
            WallLoader.Unload();
            ProjectileLoader.Unload();
            NPCLoader.Unload();
            NPCHeadLoader.Unload();
            BossBarLoader.Unload();
            PlayerHooks.Unload();
            BuffLoader.Unload();
            MountLoader.Unload();
            RarityLoader.Unload();
            DamageClassLoader.Unload();
            InfoDisplayLoader.Unload();
            GoreLoader.Unload();
            SoundLoader.Unload();
            DisposeMusic();
            BackgroundTextureLoader.Unload();
            UgBgStyleLoader.Unload();
            SurfaceBgStyleLoader.Unload();
            GlobalBgStyleLoader.Unload();
            WaterStyleLoader.Unload();
            WaterfallStyleLoader.Unload();
            PlayerDrawLayerLoader.Unload();
            SystemHooks.Unload();
            ResizeArrays(true);
            for (int k = 0; k < Recipe.maxRecipes; k++)
            {
                Main.recipe[k] = new Recipe();
            }
            Recipe.numRecipes = 0;
            RecipeGroupHelper.ResetRecipeGroups();
            Recipe.SetupRecipes();
            MapLoader.UnloadModMap();
            ItemSorting.SetupWhiteLists();
            HotKeyLoader.Unload();
            RecipeLoader.Unload();
            CommandLoader.Unload();
            TagSerializer.Reload();
            ModNet.Unload();
            Config.ConfigManager.Unload();
            CustomCurrencyManager.Initialize();
            EffectsTracker.RemoveModEffects();

            // ItemID.Search = IdDictionary.Create<ItemID, short>();
            // NPCID.Search = IdDictionary.Create<NPCID, short>();
            // ProjectileID.Search = IdDictionary.Create<ProjectileID, short>();
            // TileID.Search = IdDictionary.Create<TileID, ushort>();
            // WallID.Search = IdDictionary.Create<WallID, ushort>();
            // BuffID.Search = IdDictionary.Create<BuffID, int>();

            ContentSamples.Initialize();

            CleanupModReferences();
        }
コード例 #23
0
        public void Save(FileInfo file)
        {
            if (!file.Directory.Exists)
            {
                file.Directory.Create();
            }

            using (var packageStream = file.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite))
                using (var writer = new EndianWriter(packageStream, leaveOpen: true))
                {
                    var serializer  = new TagSerializer(CacheVersion.HaloOnline106708);
                    var dataContext = new DataSerializationContext(writer);

                    packageStream.SetLength(0);

                    //
                    // reserve header space
                    //

                    writer.Write(new byte[typeof(ModPackageHeaderExtended).GetSize()]);

                    //
                    // build section table
                    //

                    Header.SectionTable.Count  = (int)ModPackageSection.SectionCount;
                    Header.SectionTable.Offset = (int)writer.BaseStream.Position;

                    writer.Write(new byte[typeof(ModPackageSectionHeader).GetSize() * (int)ModPackageSection.SectionCount]);


                    int size, offset;

                    //
                    // Write metadata
                    //

                    offset = (int)writer.BaseStream.Position;
                    WriteMetadataSection(dataContext, serializer);
                    size = (int)writer.BaseStream.Position - offset;
                    WriteSectionEntry((int)ModPackageSection.Metadata, writer, size, offset);

                    //
                    // Write tag cache
                    //

                    offset = (int)writer.BaseStream.Position;
                    WriteTagsSection(writer);
                    size = (int)writer.BaseStream.Position - offset;
                    WriteSectionEntry((int)ModPackageSection.Tags, writer, size, offset);

                    //
                    // Write tag names table
                    //

                    offset = (int)writer.BaseStream.Position;
                    WriteTagNamesSection(writer, dataContext, serializer);
                    size = (int)writer.BaseStream.Position - offset;
                    WriteSectionEntry((int)ModPackageSection.TagNames, writer, size, offset);

                    //
                    // write resource cache
                    //

                    offset = (int)writer.BaseStream.Position;
                    WriteResourcesSection(writer);
                    size = (int)writer.BaseStream.Position - offset;
                    WriteSectionEntry((int)ModPackageSection.Resources, writer, size, offset);

                    //
                    // Write map file section
                    //

                    if (MapFileStreams.Count > 0)
                    {
                        offset = (int)writer.BaseStream.Position;
                        WriteMapsSection(writer);
                        size = (int)writer.BaseStream.Position - offset;
                        WriteSectionEntry((int)ModPackageSection.MapFiles, writer, size, offset);

                        DetermineMapFlags();
                    }

                    //
                    // Write campaign file section
                    //
                    if (CampaignFileStream != null && CampaignFileStream.Length > 0)
                    {
                        offset = (int)writer.BaseStream.Position;
                        WriteCampaignFileSection(writer);
                        size = (int)writer.BaseStream.Position - offset;
                        WriteSectionEntry((int)ModPackageSection.CampaignFiles, writer, size, offset);
                    }

                    //
                    // Add support for the remaining sections when needed (Fonts, StringIds, Locales)
                    //

                    //
                    // calculate package sha1
                    //

                    packageStream.Position = typeof(ModPackageHeaderExtended).GetSize();
                    Header.SHA1            = new SHA1Managed().ComputeHash(packageStream);

                    //
                    // update package header
                    //

                    Header.FileSize = (int)packageStream.Length;

                    packageStream.Position = 0;
                    serializer.Serialize(dataContext, Header);
                }
        }
コード例 #24
0
        public void InjectDds(TagSerializer serializer, TagDeserializer deserializer, Bitmap bitmap, int imageIndex, Stream ddsStream)
        {
            var resource    = bitmap.Resources[imageIndex].Resource;
            var newResource = (resource == null);
            ResourceSerializationContext    resourceContext;
            BitmapTextureResourceDefinition definition;

            if (newResource)
            {
                // Create a new resource reference
                resource = new ResourceReference
                {
                    DefinitionFixups = new List <ResourceDefinitionFixup>(),
                    D3DObjectFixups  = new List <D3DObjectFixup>(),
                    Type             = 1, // TODO: Map out this type enum instead of using numbers
                    Unknown68        = 1
                };
                bitmap.Resources[imageIndex].Resource = resource;
                resourceContext = new ResourceSerializationContext(resource);
                definition      = new BitmapTextureResourceDefinition
                {
                    Texture = new D3DPointer <BitmapTextureResourceDefinition.BitmapDefinition>
                    {
                        Definition = new BitmapTextureResourceDefinition.BitmapDefinition()
                    }
                };
            }
            else
            {
                // Deserialize the old definition
                resourceContext = new ResourceSerializationContext(resource);
                definition      = deserializer.Deserialize <BitmapTextureResourceDefinition>(resourceContext);
            }
            if (definition.Texture == null || definition.Texture.Definition == null)
            {
                throw new ArgumentException("Invalid bitmap definition");
            }
            var texture   = definition.Texture.Definition;
            var imageData = bitmap.Images[imageIndex];

            // Read the DDS header and modify the definition to match
            var dds      = DdsHeader.Read(ddsStream);
            var dataSize = (int)(ddsStream.Length - ddsStream.Position);

            texture.Data            = new ResourceDataReference(dataSize, new ResourceAddress(ResourceAddressType.Resource, 0));
            texture.Width           = (short)dds.Width;
            texture.Height          = (short)dds.Height;
            texture.Depth           = (sbyte)Math.Max(1, dds.Depth);
            texture.Levels          = (sbyte)Math.Max(1, dds.MipMapCount);
            texture.Type            = BitmapDdsFormatDetection.DetectType(dds);
            texture.D3DFormatUnused = (int)((dds.D3D10Format != DxgiFormat.Bc5UNorm) ? dds.FourCc : DdsFourCc.FromString("ATI2"));
            texture.Format          = BitmapDdsFormatDetection.DetectFormat(dds);

            // Set flags based on the format
            switch (texture.Format)
            {
            case BitmapFormat.Dxt1:
            case BitmapFormat.Dxt3:
            case BitmapFormat.Dxt5:
            case BitmapFormat.Dxn:
                texture.Flags = BitmapFlags.Compressed;
                break;

            default:
                texture.Flags = BitmapFlags.None;
                break;
            }
            if ((texture.Width & (texture.Width - 1)) == 0 && (texture.Height & (texture.Height - 1)) == 0)
            {
                texture.Flags |= BitmapFlags.PowerOfTwoDimensions;
            }

            // If creating a new image, then add a new resource, otherwise replace the existing one
            if (newResource)
            {
                _resourceManager.Add(resource, ResourceLocation.Textures, ddsStream);
            }
            else
            {
                _resourceManager.Replace(resource, ddsStream);
            }

            // Serialize the new resource definition
            serializer.Serialize(resourceContext, definition);

            // Modify the image data in the bitmap tag to match the definition
            imageData.Width       = texture.Width;
            imageData.Height      = texture.Height;
            imageData.Depth       = texture.Depth;
            imageData.Type        = texture.Type;
            imageData.Format      = texture.Format;
            imageData.Flags       = texture.Flags;
            imageData.MipmapCount = (sbyte)(texture.Levels - 1);
            imageData.DataOffset  = texture.Data.Address.Offset;
            imageData.DataSize    = texture.Data.Size;
            imageData.Unknown15   = texture.Unknown35;
        }
コード例 #25
0
ファイル: GameSerializer.cs プロジェクト: wesIdeal/ChessLib
 public GameSerializer(PGNFormatterOptions options) : base(options)
 {
     tagSerializer          = new TagSerializer(Options);
     _moveSectionSerializer = new MoveSectionSerializer(Options);
 }
コード例 #26
0
        public override bool Execute(List <string> args)
        {
            if (args.Count != 1)
            {
                return(false);
            }

            var destDir = new DirectoryInfo(args[0]);

            if (!destDir.Exists)
            {
                Write("Destination directory does not exist. Create it? [y/n] ");
                var answer = ReadLine().ToLower();

                if (answer.Length == 0 || !(answer.StartsWith("y") || answer.StartsWith("n")))
                {
                    return(false);
                }

                if (answer.StartsWith("y"))
                {
                    destDir.Create();
                }
                else
                {
                    return(false);
                }
            }

            WriteLine($"Generating cache files in \"{destDir.FullName}\"...");

            var destTagsFile = new FileInfo(Combine(destDir.FullName, "tags.dat"));

            Write($"Generating {destTagsFile.FullName}...");
            using (var tagCacheStream = destTagsFile.Create())
                using (var writer = new BinaryWriter(tagCacheStream))
                {
                    writer.Write((int)0);                   // padding
                    writer.Write((int)0);                   // tag list offset
                    writer.Write((int)0);                   // tag count
                    writer.Write((int)0);                   // padding
                    writer.Write((long)130713360239499012); // timestamp
                    writer.Write((long)0);                  // padding
                }
            WriteLine("done.");

            var destStringIDsFile = new FileInfo(Combine(destDir.FullName, "string_ids.dat"));

            Write($"Generating {destStringIDsFile.FullName}...");
            using (var stringIDCacheStream = destStringIDsFile.Create())
                using (var writer = new BinaryWriter(stringIDCacheStream))
                {
                    writer.Write((int)0); // string count
                    writer.Write((int)0); // data size
                }
            WriteLine("done.");

            var resourceCachePaths = new string[]
            {
                Combine(destDir.FullName, "audio.dat"),
                Combine(destDir.FullName, "resources.dat"),
                Combine(destDir.FullName, "textures.dat"),
                Combine(destDir.FullName, "textures_b.dat"),
                Combine(destDir.FullName, "video.dat")
            };

            foreach (var resourceCachePath in resourceCachePaths)
            {
                Write($"Generating {resourceCachePath}...");
                using (var resourceCacheStream = File.Create(resourceCachePath))
                    using (var writer = new BinaryWriter(resourceCacheStream))
                    {
                        writer.Write((int)0); // padding
                        writer.Write((int)0); // table offset
                        writer.Write((int)0); // resource count
                        writer.Write((int)0); // padding
                    }
                WriteLine("done.");
            }

            var dependencies = new Dictionary <int, TagInstance>();

            LoadTagDependencies(0, ref dependencies);
            LoadTagDependencies(0x16, ref dependencies);
            LoadTagDependencies(0x27D7, ref dependencies);

            var destResourcesFile = new FileInfo(Combine(destDir.FullName, "resources.dat"));

            if (!destResourcesFile.Exists)
            {
                WriteLine($"Destination resource cache file does not exist: {destResourcesFile.FullName}");
                return(false);
            }

            var destTexturesFile = new FileInfo(Combine(destDir.FullName, "textures.dat"));

            if (!destTexturesFile.Exists)
            {
                WriteLine($"Destination texture cache file does not exist: {destTexturesFile.FullName}");
                return(false);
            }

            var destTexturesBFile = new FileInfo(Combine(destDir.FullName, "textures_b.dat"));

            if (!destTexturesBFile.Exists)
            {
                WriteLine($"Destination texture cache file does not exist: {destTexturesBFile.FullName}");
                return(false);
            }

            var destAudioFile = new FileInfo(Combine(destDir.FullName, "audio.dat"));

            if (!destAudioFile.Exists)
            {
                WriteLine($"Destination audio cache file does not exist: {destAudioFile.FullName}");
                return(false);
            }

            TagCache destTagCache;

            using (var stream = destTagsFile.OpenRead())
                destTagCache = new TagCache(stream);

            DefinitionSet guessedVersion;
            var           destVersion = Detect(destTagCache, out guessedVersion);

            if (destVersion == Unknown)
            {
                WriteLine($"Unrecognized target version! (guessed {GetVersionString(guessedVersion)})");
                return(true);
            }

            WriteLine($"Destination cache version: {GetVersionString(destVersion)}");

            StringIDCache destStringIDCache;

            using (var stream = destStringIDsFile.OpenRead())
                destStringIDCache = new StringIDCache(stream, Create(destVersion));

            var destResources = new ResourceDataManager();

            destResources.LoadCachesFromDirectory(destDir.FullName);

            var srcResources = new ResourceDataManager();

            srcResources.LoadCachesFromDirectory(Info.CacheFile.DirectoryName);

            var destSerializer   = new TagSerializer(destVersion);
            var destDeserializer = new TagDeserializer(destVersion);

            var destInfo = new OpenTagCache
            {
                Cache         = destTagCache,
                CacheFile     = destTagsFile,
                StringIDs     = destStringIDCache,
                StringIDsFile = destStringIDsFile,
                Version       = destVersion,
                Serializer    = destSerializer,
                Deserializer  = destDeserializer
            };

            using (Stream srcStream = Info.OpenCacheRead(), destStream = destInfo.OpenCacheReadWrite())
            {
                var maxDependency = dependencies.Keys.Max();
                for (var i = 0; i <= maxDependency; i++)
                {
                    var srcTag = Info.Cache.Tags[i];
                    if (srcTag == null)
                    {
                        destInfo.Cache.AllocateTag();
                        continue;
                    }

                    var srcData = Info.Cache.ExtractTagRaw(srcStream, srcTag);

                    var destTag = destInfo.Cache.AllocateTag(srcTag.Group);
                    destInfo.Cache.SetTagDataRaw(destStream, destTag, srcData);

                    srcData = new byte[0];
                }
            }

            WriteLine($"Done generating cache files in \"{destDir.FullName}\".");

            return(true);
        }
コード例 #27
0
ファイル: LogAdapter.cs プロジェクト: tagolog/logging
 public void InvalidateTags(ITagReadonlyCollection tags, ITagReadonlyCollection builtInTags)
 {
     MdcStorage.Save(TagSerializer.TagsToString(tags, builtInTags));
 }