public static void PackWorld(string directoryName, Stream targetStream, Func <string, bool> filter, bool embedExternalContent) { WorldInfo worldInfo = GetWorldInfo(directoryName); if (worldInfo == null) { throw new InvalidOperationException("Directory does not contain a world."); } List <string> list = new List <string>(); RecursiveEnumerateDirectory(directoryName, list, null, filter); using (ZipArchive zipArchive = ZipArchive.Create(targetStream, keepStreamOpen: true)) { foreach (string item in list) { using (Stream source = Storage.OpenFile(item, OpenFileMode.Read)) { string fileName = Storage.GetFileName(item); zipArchive.AddStream(fileName, source); } } if (embedExternalContent) { if (!BlocksTexturesManager.IsBuiltIn(worldInfo.WorldSettings.BlocksTextureName)) { try { using (Stream source2 = Storage.OpenFile(BlocksTexturesManager.GetFileName(worldInfo.WorldSettings.BlocksTextureName), OpenFileMode.Read)) { string filenameInZip = Storage.CombinePaths("EmbeddedContent", Storage.GetFileNameWithoutExtension(worldInfo.WorldSettings.BlocksTextureName) + ".scbtex"); zipArchive.AddStream(filenameInZip, source2); } } catch (Exception ex) { Log.Warning($"Failed to embed blocks texture \"{worldInfo.WorldSettings.BlocksTextureName}\". Reason: {ex.Message}"); } } foreach (PlayerInfo playerInfo in worldInfo.PlayerInfos) { if (!CharacterSkinsManager.IsBuiltIn(playerInfo.CharacterSkinName)) { try { using (Stream source3 = Storage.OpenFile(CharacterSkinsManager.GetFileName(playerInfo.CharacterSkinName), OpenFileMode.Read)) { string filenameInZip2 = Storage.CombinePaths("EmbeddedContent", Storage.GetFileNameWithoutExtension(playerInfo.CharacterSkinName) + ".scskin"); zipArchive.AddStream(filenameInZip2, source3); } } catch (Exception ex2) { Log.Warning($"Failed to embed character skin \"{playerInfo.CharacterSkinName}\". Reason: {ex2.Message}"); } } } } } }
public IEnumerable <ActiveExternalContentInfo> GetActiveExternalContent() { string downloadedContentAddress = CommunityContentManager.GetDownloadedContentAddress(ExternalContentType.World, DirectoryName); if (!string.IsNullOrEmpty(downloadedContentAddress)) { yield return(new ActiveExternalContentInfo { Address = downloadedContentAddress, DisplayName = WorldSettings.Name, Type = ExternalContentType.World }); } if (!BlocksTexturesManager.IsBuiltIn(WorldSettings.BlocksTextureName)) { downloadedContentAddress = CommunityContentManager.GetDownloadedContentAddress(ExternalContentType.BlocksTexture, WorldSettings.BlocksTextureName); if (!string.IsNullOrEmpty(downloadedContentAddress)) { yield return(new ActiveExternalContentInfo { Address = downloadedContentAddress, DisplayName = BlocksTexturesManager.GetDisplayName(WorldSettings.BlocksTextureName), Type = ExternalContentType.BlocksTexture }); } } SubsystemPlayers subsystemPlayers = base.Project.FindSubsystem <SubsystemPlayers>(throwOnError: true); foreach (PlayerData playersDatum in subsystemPlayers.PlayersData) { if (!CharacterSkinsManager.IsBuiltIn(playersDatum.CharacterSkinName)) { downloadedContentAddress = CommunityContentManager.GetDownloadedContentAddress(ExternalContentType.CharacterSkin, playersDatum.CharacterSkinName); yield return(new ActiveExternalContentInfo { Address = downloadedContentAddress, DisplayName = CharacterSkinsManager.GetDisplayName(playersDatum.CharacterSkinName), Type = ExternalContentType.CharacterSkin }); } } SubsystemFurnitureBlockBehavior subsystemFurnitureBlockBehavior = base.Project.FindSubsystem <SubsystemFurnitureBlockBehavior>(throwOnError: true); foreach (FurnitureSet furnitureSet in subsystemFurnitureBlockBehavior.FurnitureSets) { if (furnitureSet.ImportedFrom != null) { downloadedContentAddress = CommunityContentManager.GetDownloadedContentAddress(ExternalContentType.FurniturePack, furnitureSet.ImportedFrom); yield return(new ActiveExternalContentInfo { Address = downloadedContentAddress, DisplayName = FurniturePacksManager.GetDisplayName(furnitureSet.ImportedFrom), Type = ExternalContentType.FurniturePack }); } } }