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(); }
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); } }
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>())); }
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"); } }
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); }
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); }
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"); } }
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); } } }
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")); }
/// <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); }
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; }
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); }
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); }
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); }
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); } }
private void WriteMetadataSection(DataSerializationContext context, TagSerializer serializer) { serializer.Serialize(context, Metadata); }
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); } }
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); } }
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."); } } }
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); }
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); } }
//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(); }
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); } }
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; }
public GameSerializer(PGNFormatterOptions options) : base(options) { tagSerializer = new TagSerializer(Options); _moveSectionSerializer = new MoveSectionSerializer(Options); }
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); }
public void InvalidateTags(ITagReadonlyCollection tags, ITagReadonlyCollection builtInTags) { MdcStorage.Save(TagSerializer.TagsToString(tags, builtInTags)); }