UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

274 lines (273 loc) 11.9 kB
"use strict"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const ste_events_1 = require("ste-events"); const ZipStorage_1 = __importDefault(require("../storage/ZipStorage")); const IProjectItemData_1 = require("./IProjectItemData"); const IProjectItemVariant_1 = require("./IProjectItemVariant"); const Log_1 = __importDefault(require("../core/Log")); const MCWorld_1 = __importDefault(require("../minecraft/MCWorld")); const IStorage_1 = require("../storage/IStorage"); const Pack_1 = require("../minecraft/Pack"); class ProjectItemVariant { _item; _data; _file = null; _folder = null; _projectVariant; _isFileContentProcessed = false; _isLoaded = false; _onFileRetrieved = new ste_events_1.EventDispatcher(); _onFolderRetrieved = new ste_events_1.EventDispatcher(); _onLoaded = new ste_events_1.EventDispatcher(); _isDefault; constructor(parentItem, data, projectVariant) { this._item = parentItem; this._data = data; this._projectVariant = projectVariant; this._isDefault = this._data.label === ""; } get projectVariant() { return this._projectVariant; } get errorMessage() { return this._data.errorMessage; } set errorMessage(newErrorMessage) { this._data.errorMessage = newErrorMessage; } get isLoaded() { return this._isLoaded; } get onLoaded() { return this._onLoaded.asEvent(); } get onFileRetrieved() { return this._onFileRetrieved.asEvent(); } get onFolderRetrieved() { return this._onFolderRetrieved.asEvent(); } get label() { return this._data.label; } get variantType() { return this._data.variantType; } get file() { if (this._isDefault) { return this._item.defaultFile; } return this._file; } setFile(file) { this._file = file; } get itemType() { return this._item.itemType; } get projectPath() { return this._data.projectPath; } set variantType(newVariantType) { this._data.variantType = newVariantType; } set projectPath(newProjectPath) { this._data.projectPath = newProjectPath; } get folder() { if (this._isDefault) { return this._item.defaultFolder; } return this._folder; } setFolder(file) { this._folder = file; } _handleMCWorldLoaded(world, worldA) { this._fireLoadedEvent(); } _fireLoadedEvent() { if (this._onLoaded && this.isLoaded) { this._onLoaded.dispatch(this, this); } } get errorStatus() { return this._data.errorStatus; } set errorStatus(errorStatus) { this._data.errorStatus = errorStatus; } async ensureFileStorage() { if (this._item.storageType === IProjectItemData_1.ProjectItemStorageType.singleFile && this._file === null && this.projectPath !== null && this.projectPath !== undefined && this.projectPath.startsWith("/") && this._item.project.projectFolder !== null && this._item.project.projectFolder !== undefined) { const prefixPaths = this.projectPath.split("#"); if (prefixPaths.length > 1) { let folderToLoadFrom = this._item.project.projectFolder; for (let i = 0; i < prefixPaths.length - 1; i++) { if (folderToLoadFrom) { const zipFile = await folderToLoadFrom.ensureFileFromRelativePath(prefixPaths[i]); await zipFile.loadContent(); if (zipFile.content && zipFile.content instanceof Uint8Array) { if (!zipFile.fileContainerStorage) { const zipStorage = new ZipStorage_1.default(); zipStorage.storagePath = zipFile.storageRelativePath + "#"; await zipStorage.loadFromUint8Array(zipFile.content, zipFile.name); zipStorage.containerFile = zipFile; zipFile.fileContainerStorage = zipStorage; } folderToLoadFrom = zipFile.fileContainerStorage.rootFolder; } else { folderToLoadFrom = undefined; } } } if (folderToLoadFrom) { this._file = await folderToLoadFrom.ensureFileFromRelativePath(prefixPaths[prefixPaths.length - 1]); this._isFileContentProcessed = false; } else { Log_1.default.debugAlert("Unable to parse a containerized file path of '" + this.projectPath + "'"); return null; } } else { this._file = await this._item.project.projectFolder.ensureFileFromRelativePath(this.projectPath); this._isFileContentProcessed = false; } } else if (this._item.storageType === IProjectItemData_1.ProjectItemStorageType.singleFile && this._file === null && (this.projectPath === null || this.projectPath === undefined) && this.variantType === IProjectItemVariant_1.ProjectItemVariantType.subPack && this._item.project.projectFolder !== null && this._item.project.projectFolder !== undefined) { await this._item.project.ensurePacksAsync(); const pack = await this._item.getPack(); if (pack && pack.packType === Pack_1.PackType.resource && this._item.projectPath) { const manifest = (await pack.ensureManifest()); const folder = pack.folder; if (manifest && folder) { const subpack = manifest.getSubpackByFolderName(this.label); if (subpack) { const path = this._item.projectPath; const resourcePacksRel = path.indexOf("/resource_packs/"); if (resourcePacksRel > -1) { const file = await folder.getFileFromRelativePath(path.substring(resourcePacksRel + 15)); if (file) { this._file = file; } } } } } } return this._file; } async loadFileStorage() { if (!this._isFileContentProcessed && this._file) { /*if (this._data.creationType === ProjectItemCreationType.generated) { await ProjectAutogeneration.updateItemAutogeneration(this, true); } else {*/ await this._file.loadContent(); // } //await ProjectAutogeneration.updateItemAutogeneratedSideFiles(this); this._isFileContentProcessed = true; this._onFileRetrieved.dispatch(this, this._file); if (this.itemType === IProjectItemData_1.ProjectItemType.MCWorld || this.itemType === IProjectItemData_1.ProjectItemType.MCTemplate) { const mcworld = await MCWorld_1.default.ensureOnFile(this._file, this._item.project, this._handleMCWorldLoaded); if (mcworld) { this.errorMessage = mcworld.storageErrorMessage; if (mcworld.storageErrorStatus === IStorage_1.StorageErrorStatus.unprocessable) { this.errorStatus = IProjectItemData_1.ProjectItemErrorStatus.unprocessable; } else { this.errorStatus = IProjectItemData_1.ProjectItemErrorStatus.none; } } } else { this._fireLoadedEvent(); } } } async ensureAndLoadFileStorage() { await this.ensureFileStorage(); await this.loadFileStorage(); return this._file; } async ensureFolderStorage() { if (this._item.storageType === IProjectItemData_1.ProjectItemStorageType.folder) { if (this._folder === null && this.projectPath !== null && this.projectPath !== undefined && this.projectPath.startsWith("/") && this._item.project.projectFolder !== null && this._item.project.projectFolder !== undefined) { const prefixPaths = this.projectPath.split("#"); if (prefixPaths.length > 1) { let folderToLoadFrom = this._item.project.projectFolder; for (let i = 0; i < prefixPaths.length - 1; i++) { if (folderToLoadFrom) { const zipFile = await folderToLoadFrom.ensureFileFromRelativePath(prefixPaths[i]); await zipFile.loadContent(); if (zipFile.content && zipFile.content instanceof Uint8Array) { if (!zipFile.fileContainerStorage) { const zipStorage = new ZipStorage_1.default(); zipStorage.storagePath = zipFile.storageRelativePath + "#"; await zipStorage.loadFromUint8Array(zipFile.content, zipFile.name); zipStorage.containerFile = zipFile; zipFile.fileContainerStorage = zipStorage; } folderToLoadFrom = zipFile.fileContainerStorage.rootFolder; } else { folderToLoadFrom = undefined; } } } if (folderToLoadFrom) { this._folder = await folderToLoadFrom.ensureFolderFromRelativePath(prefixPaths[prefixPaths.length - 1]); } else { // Log.debugAlert("Unable to parse a containerized file path of '" + this.storagePath + "'"); return null; } } else { this._folder = await this._item.project.projectFolder.ensureFolderFromRelativePath(this.projectPath); } await this._folder.load(); this._onFolderRetrieved.dispatch(this, this._folder); if (this.itemType === IProjectItemData_1.ProjectItemType.worldFolder) { const mcworld = await MCWorld_1.default.ensureMCWorldOnFolder(this._folder, this._item.project, this._handleMCWorldLoaded); if (mcworld) { this.errorMessage = mcworld.storageErrorMessage; if (mcworld.storageErrorStatus === IStorage_1.StorageErrorStatus.unprocessable) { this.errorStatus = IProjectItemData_1.ProjectItemErrorStatus.unprocessable; } else { this.errorStatus = IProjectItemData_1.ProjectItemErrorStatus.none; } } } else { this._fireLoadedEvent(); } } return this._folder; } return undefined; } } exports.default = ProjectItemVariant;