private T GetResourceDefinition <T>(TagResourceReference resourceReference) { var tagResource = GetPageableResource(resourceReference).Resource; T result; byte[] resourceDefinitionData = tagResource.DefinitionData; ApplyResourceDefinitionFixups(tagResource, resourceDefinitionData); byte[] resourceRawData = GetResourceData(resourceReference); if (resourceRawData == null) { resourceRawData = new byte[0]; } // deserialize the resource definition again using (var definitionDataStream = new MemoryStream(resourceDefinitionData)) using (var definitionDataReader = new EndianReader(definitionDataStream, EndianFormat.LittleEndian)) using (var dataStream = new MemoryStream(resourceRawData)) using (var dataReader = new EndianReader(dataStream, EndianFormat.LittleEndian)) { var context = new ResourceDefinitionSerializationContext(dataReader, definitionDataReader, tagResource.DefinitionAddress.Type); var deserializer = new ResourceDeserializer(Cache.Version); // deserialize without access to the data definitionDataReader.SeekTo(tagResource.DefinitionAddress.Offset); result = deserializer.Deserialize <T>(context); } return(result); }
private TagResourceReference CreateResource <T>(T resourceDefinition, ResourceLocation location, TagResourceTypeGen3 resourceType) { var resourceReference = new TagResourceReference(); var pageableResource = new PageableResource(); pageableResource.Page = new ResourcePage(); pageableResource.Resource = new ResourceData(); pageableResource.ChangeLocation(location); pageableResource.Resource.Unknown2 = 1; pageableResource.Resource.ResourceType = resourceType; resourceReference.HaloOnlinePageableResource = pageableResource; var definitionStream = new MemoryStream(); var dataStream = new MemoryStream(); using (var definitionWriter = new EndianWriter(definitionStream, EndianFormat.LittleEndian)) using (var dataWriter = new EndianWriter(dataStream, EndianFormat.LittleEndian)) { var context = new ResourceDefinitionSerializationContext(dataWriter, definitionWriter, CacheAddressType.Definition); var serializer = new ResourceSerializer(Cache.Version); serializer.Serialize(context, resourceDefinition); var data = dataStream.ToArray(); var definitionData = definitionStream.ToArray(); dataStream.Position = 0; pageableResource.DisableChecksum(); dataStream.Position = 0; AddResource(pageableResource, dataStream); // add resource definition and fixups pageableResource.Resource.DefinitionData = definitionData; pageableResource.Resource.FixupLocations = context.FixupLocations; pageableResource.Resource.DefinitionAddress = context.MainStructOffset; pageableResource.Resource.InteropLocations = context.InteropLocations; } return(resourceReference); }
private T GetResourceDefinition <T>(TagResourceReference resourceReference) { var tagResource = GetTagResourceFromReference(resourceReference); T result; byte[] resourceDefinitionData = new byte[tagResource.DefinitionDataLength]; Array.Copy(ResourceGestalt.DefinitionData, tagResource.DefinitionDataOffset, resourceDefinitionData, 0, tagResource.DefinitionDataLength); ApplyResourceDefinitionFixups(tagResource, resourceDefinitionData); byte[] primaryResourceData = GetPrimaryResource(resourceReference.Gen3ResourceID); byte[] secondaryResourceData = GetSecondaryResource(resourceReference.Gen3ResourceID); if (primaryResourceData == null) { primaryResourceData = new byte[0]; } if (secondaryResourceData == null) { secondaryResourceData = new byte[0]; } using (var definitionDataStream = new MemoryStream(resourceDefinitionData)) using (var dataStream = new MemoryStream(primaryResourceData)) using (var secondaryDataStream = new MemoryStream(secondaryResourceData)) using (var definitionDataReader = new EndianReader(definitionDataStream, EndianFormat.BigEndian)) using (var dataReader = new EndianReader(dataStream, EndianFormat.BigEndian)) using (var secondaryDataReader = new EndianReader(secondaryDataStream, EndianFormat.BigEndian)) { var context = new ResourceDefinitionSerializationContext(dataReader, secondaryDataReader, definitionDataReader, tagResource.DefinitionAddress.Type); var deserializer = new ResourceDeserializer(Cache.Version); definitionDataReader.SeekTo(tagResource.DefinitionAddress.Offset); result = deserializer.Deserialize <T>(context); } return(result); }