/// <summary> /// 应用指定资源包的资源。 /// </summary> /// <param name="resourcePackPath">要应用的资源包路径。</param> public void ApplyResources(string resourcePackPath) { if (!m_CheckResourcesComplete) { throw new Exception("You must check resources complete first."); } if (m_ApplyingResourcePackStream != null) { throw new Exception(Utility.Text.Format("There is already a resource pack '{0}' being applied.", m_ApplyingResourcePackPath)); } if (m_UpdatingResourceGroup != null) { throw new Exception(Utility.Text.Format("There is already a resource group '{0}' being updated.", m_UpdatingResourceGroup.Name)); } try { long length = 0L; ResourcePackVersionList versionList = default(ResourcePackVersionList); using (FileStream fileStream = new FileStream(resourcePackPath, FileMode.Open, FileAccess.Read)) { length = fileStream.Length; versionList = m_ResourceComponent.ResourcePackVersionListSerializer.Deserialize(fileStream); } if (!versionList.IsValid) { throw new Exception("Deserialize resource pack version list failure."); } if (versionList.Offset + versionList.Length != length) { throw new Exception("Resource pack length is invalid."); } m_ApplyingResourcePackPath = resourcePackPath; m_ApplyingResourcePackStream = new FileStream(resourcePackPath, FileMode.Open, FileAccess.Read); m_ApplyingResourcePackStream.Position = versionList.Offset; m_FailureFlag = false; ResourcePackVersionList.Resource[] resources = versionList.GetResources(); foreach (ResourcePackVersionList.Resource resource in resources) { ResourceName resourceName = new ResourceName(resource.Name, resource.Variant, resource.Extension, resource.AssetCategory); UpdateInfo updateInfo = null; if (!m_UpdateCandidateInfo.TryGetValue(resourceName, out updateInfo)) { continue; } if (updateInfo.LoadType == (LoadType)resource.LoadType && updateInfo.Length == resource.Length && updateInfo.HashCode == resource.HashCode) { m_ApplyWaitingInfo.Add(new ApplyInfo(resourceName, updateInfo.FileSystemName, (LoadType)resource.LoadType, resource.Offset, resource.Length, resource.HashCode, resource.ZipLength, resource.ZipHashCode, updateInfo.ResourcePath)); } } } catch (Exception exception) { if (m_ApplyingResourcePackStream != null) { m_ApplyingResourcePackStream.Dispose(); m_ApplyingResourcePackStream = null; } throw new Exception(Utility.Text.Format("Apply resources '{0}' with exception '{1}'.", resourcePackPath, exception.ToString()), exception); } }
/// <summary> /// 序列化资源包版本资源列表(版本 0)回调函数。 /// </summary> /// <param name="binaryWriter">目标流。</param> /// <param name="versionList">要序列化的资源包版本资源列表(版本 0)。</param> /// <returns>是否序列化资源包版本资源列表(版本 0)成功。</returns> public static bool ResourcePackVersionListSerializeCallback_V0(BinaryWriter binaryWriter, ResourcePackVersionList versionList) { if (!versionList.IsValid) { return(false); } Utility.Random.GetRandomBytes(s_CachedHashBytes); binaryWriter.Write(s_CachedHashBytes); binaryWriter.Write(versionList.Offset); binaryWriter.Write(versionList.Length); binaryWriter.Write(versionList.HashCode); ResourcePackVersionList.Resource[] resources = versionList.GetResources(); binaryWriter.Write7BitEncodedInt32(resources.Length); foreach (ResourcePackVersionList.Resource resource in resources) { binaryWriter.WriteEncryptedString(resource.Name, s_CachedHashBytes); binaryWriter.WriteEncryptedString(resource.Variant, s_CachedHashBytes); binaryWriter.WriteEncryptedString(resource.Extension != DefaultExtension ? resource.Extension : null, s_CachedHashBytes); binaryWriter.Write(resource.LoadType); binaryWriter.Write7BitEncodedInt64(resource.Offset); binaryWriter.Write7BitEncodedInt32(resource.Length); binaryWriter.Write(resource.HashCode); binaryWriter.Write7BitEncodedInt32(resource.ZipLength); binaryWriter.Write(resource.ZipHashCode); } Array.Clear(s_CachedHashBytes, 0, CachedHashBytesLength); return(true); }