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);
        }
示例#3
0
        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);
        }