UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

435 lines (433 loc) 15.8 kB
"use strict"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. Object.defineProperty(exports, "__esModule", { value: true }); const ste_events_1 = require("ste-events"); const Utilities_1 = require("../core/Utilities"); const Project_1 = require("../app/Project"); const StorageUtilities_1 = require("../storage/StorageUtilities"); const IProjectItemData_1 = require("../app/IProjectItemData"); const IProjectData_1 = require("../app/IProjectData"); const ResourceManifestDefinition_1 = require("./ResourceManifestDefinition"); class BehaviorManifestDefinition { constructor() { this._isLoaded = false; this._onLoaded = new ste_events_1.EventDispatcher(); } get isLoaded() { return this._isLoaded; } get file() { return this._file; } set file(newFile) { this._file = newFile; } get onLoaded() { return this._onLoaded.asEvent(); } get productType() { if (!this.definition || !this.definition.metadata) { return undefined; } return this.definition.metadata.product_type; } set productType(value) { this.ensureMetadata(); if (!this.definition || !this.definition.metadata) { return; } this.definition.metadata.product_type = value; } get description() { if (!this.definition || !this.definition.header) { return undefined; } return this.definition.header.description; } set description(newDescription) { if (this.definition && this.definition.header && newDescription) { this.definition.header.description = newDescription; } } get name() { if (this.definition && this.definition.header) { return this.definition.header.name; } return undefined; } set name(newName) { if (this.definition && this.definition.header && newName) { this.definition.header.name = newName; } } get id() { if (this.definition && this.definition.header) { return this.definition.header.uuid; } return this._id; } set id(newId) { if (this.definition && this.definition.header && newId) { this.definition.header.uuid = newId; } this._id = newId; } async setUuid(newId, project) { const oldId = this.id; this.id = newId; if (newId && oldId && project) { await BehaviorManifestDefinition.setNewBehaviorPackId(project, newId, oldId); } } static async setNewBehaviorPackId(project, newBehaviorPackId, oldBehaviorPackId) { const itemsCopy = project.getItemsCopy(); let setBehaviorPack = false; for (let i = 0; i < itemsCopy.length; i++) { const pi = itemsCopy[i]; if (pi.file) { if (pi.itemType === IProjectItemData_1.ProjectItemType.behaviorPackManifestJson && !setBehaviorPack) { const bpManifestJson = await BehaviorManifestDefinition.ensureOnFile(pi.file); if (bpManifestJson) { if (bpManifestJson.id && Utilities_1.default.uuidEqual(bpManifestJson.id, oldBehaviorPackId)) { bpManifestJson.id = newBehaviorPackId; setBehaviorPack = true; await bpManifestJson.save(); } else if (bpManifestJson.definition && bpManifestJson.definition.dependencies) { const deps = bpManifestJson.definition?.dependencies; for (const dep of deps) { if (dep.uuid === oldBehaviorPackId) { dep.uuid = newBehaviorPackId; } } await bpManifestJson.save(); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.resourcePackManifestJson) { const rpManifestJson = await ResourceManifestDefinition_1.default.ensureOnFile(pi.file); if (rpManifestJson) { if (rpManifestJson.definition && rpManifestJson.definition.dependencies) { const deps = rpManifestJson.definition?.dependencies; for (const dep of deps) { if (dep.uuid === oldBehaviorPackId) { dep.uuid = newBehaviorPackId; } } await rpManifestJson.save(); } } } } } } hasAddonProperties() { return this.productType === "addon"; } async setAddonProperties() { this.productType = "addon"; await this.save(); } randomizeModuleUuids(newScriptModuleId, oldScriptModuleId) { if (!this.definition) { return; } for (let i = 0; i < this.definition.modules.length; i++) { const mod = this.definition.modules[i]; if (mod.uuid) { if (oldScriptModuleId && newScriptModuleId && (mod.uuid === oldScriptModuleId || mod.uuid === newScriptModuleId)) { mod.uuid = newScriptModuleId; } else { mod.uuid = Utilities_1.default.createUuid(); } } } } getNonScriptModuleDependencyCount() { if (!this.definition || !this.definition.dependencies) { return 0; } let count = 0; for (let dependency of this.definition.dependencies) { if (dependency.uuid) { count++; } } return count; } getFirstNonScriptModuleDependency() { if (!this.definition || !this.definition.dependencies) { return undefined; } for (let dependency of this.definition.dependencies) { if (dependency.uuid) { return dependency; } } return undefined; } static async ensureOnFile(file, loadHandler) { let bmj; if (file.manager === undefined) { bmj = new BehaviorManifestDefinition(); bmj.file = file; file.manager = bmj; } if (file.manager !== undefined && file.manager instanceof BehaviorManifestDefinition) { bmj = file.manager; if (!bmj.isLoaded && loadHandler) { bmj.onLoaded.subscribe(loadHandler); } await bmj.load(); } return bmj; } get minEngineVersion() { if (!this.definition || !this.definition.header || !this.definition.header.min_engine_version) { return undefined; } return this.definition.header.min_engine_version; } setMinEngineVersion(versionArray, project) { const header = this.ensureHeaderForProject(project); header.min_engine_version = versionArray; } setModuleVersion(moduleName, version) { if (!this.definition || !this.definition.dependencies) { return false; } let verActual = version; let changedVals = false; if (version.indexOf("-") < 1) { const verArr = version.split("."); if (verArr && verArr.length === 3) { verActual = []; for (let i = 0; i < verArr.length; i++) { try { verActual.push(parseInt(verArr[i])); } catch (e) { throw e; } if (Number.isNaN(verActual[i])) { throw new Error("Could not parse " + version); } } } } for (let i = 0; i < this.definition.dependencies.length; i++) { const dep = this.definition.dependencies[i]; if (dep.module_name === moduleName) { if (dep.version !== verActual) { dep.version = verActual; changedVals = true; } } } return changedVals; } persist() { if (this._file === undefined) { return; } const pjString = JSON.stringify(this.definition, null, 2); this._file.setContent(pjString); } ensureDefinition(name, description) { if (!this.definition) { this.definition = { format_version: 2, header: { name: name, description: description, version: [0, 0, 1], min_engine_version: [1, 20, 10], uuid: Utilities_1.default.createUuid(), }, modules: [], dependencies: [], }; } } ensureHeaderForProject(project) { return this.ensureHeader(project.title, project.description); } ensureMetadata() { if (!this.definition) { return undefined; } if (!this.definition.metadata) { this.definition.metadata = {}; } return this.definition.metadata; } ensureGeneratedWith(toolName, versionString) { const metadata = this.ensureMetadata(); if (!metadata) { return undefined; } if (!metadata.generated_with) { metadata.generated_with = {}; } if (!metadata.generated_with[toolName]) { metadata.generated_with[toolName] = []; } if (!metadata.generated_with[toolName].includes(versionString)) { metadata.generated_with[toolName].push(versionString); } } ensureHeader(name, description) { this.ensureDefinition(name, description); if (!this.definition) { throw new Error(); } if (!this.definition.header) { this.definition.header = this.getDefaultHeader(name, description); } return this.definition.header; } getDefaultHeader(name, description) { return { name: name, description: description, version: [0, 0, 1], min_engine_version: [1, 20, 10], uuid: Utilities_1.default.createUuid(), }; } getScriptModule() { if (!this.definition) { return undefined; } for (let i = 0; i < this.definition.modules.length; i++) { const mod = this.definition.modules[i]; if (mod.type && mod.type.toLowerCase() === "script") { return mod; } } return undefined; } ensureScriptModule(name, description) { this.ensureDefinition(name, description); if (!this.definition) { throw new Error(); } for (let i = 0; i < this.definition.modules.length; i++) { const mod = this.definition.modules[i]; if (mod.type && mod.type.toLowerCase() === "script") { return mod; } } const mod = { type: "script", description: name, version: [0, 0, 1], uuid: Utilities_1.default.createUuid(), language: "javascript", }; this.definition.modules.push(mod); return mod; } async save() { if (this._file === undefined) { return; } this.persist(); await this._file.saveContent(false); } async load() { if (this._file === undefined || this._isLoaded) { return; } await this._file.loadContent(); if (this._file.content === null || this._file.content instanceof Uint8Array) { return; } this.definition = StorageUtilities_1.default.getJsonObject(this._file); this._isLoaded = true; } static async getContent(project, contentOnlyUpdate) { let versionMajor = 0; let versionMinor = 0; let versionPatch = 1; if (project.versionMajor !== undefined) { versionMajor = project.versionMajor; } if (project.versionMinor !== undefined) { versionMinor = project.versionMinor; } if (project.versionPatch !== undefined) { versionPatch = project.versionPatch; } const modulesList = []; const dependenciesList = []; let scriptFile = undefined; let pi = project.getFirstItemByType(IProjectItemData_1.ProjectItemType.catalogIndexJs); if (pi !== undefined) { scriptFile = pi.file; } const behaviorPackRootFolder = await project.getDefaultBehaviorPackFolder(false, contentOnlyUpdate); if (scriptFile === undefined) { pi = project.getFirstItemByType(IProjectItemData_1.ProjectItemType.js); if (pi !== undefined) { scriptFile = pi.file; } if (scriptFile === undefined) { pi = project.getFirstItemByType(IProjectItemData_1.ProjectItemType.testJs); if (pi !== undefined) { scriptFile = pi.file; } } } const scriptState = await project.getScriptState(); if (scriptState.hasScript && scriptFile !== null && scriptFile !== undefined && behaviorPackRootFolder !== null) { let path = scriptFile.getFolderRelativePath(behaviorPackRootFolder); if (path !== undefined) { if (path.startsWith("/")) { path = path.substring(1, path.length); } modulesList.push({ description: project.title + " script", language: "javascript", type: "script", uuid: project.defaultScriptModuleUniqueId, version: [versionMajor, versionMinor, versionPatch], entry: path, }); for (let i = 0; i < Project_1.minecraftScriptModules.length; i++) { const mod = Project_1.minecraftScriptModules[i]; if (scriptState.hasModule[mod.id]) { dependenciesList.push({ uuid: mod.uuid, module_name: mod.module_name, version: mod.preferredVersion, }); } } } } const manifest = { format_version: 2, __comment__: Project_1.AUTOGENERATED_WHOLEFILE_GENERAL_SEPARATOR, header: { description: project.description, name: project.title, uuid: project.defaultBehaviorPackUniqueId, version: [versionMajor, versionMinor, versionPatch], min_engine_version: [1, 20, 10], }, modules: modulesList, dependencies: dependenciesList, }; if (project.focus === IProjectData_1.ProjectFocus.editorExtension) { manifest.capabilities = ["editorExtension"]; } return JSON.stringify(manifest, null, 2); } } exports.default = BehaviorManifestDefinition; //# sourceMappingURL=../maps/minecraft/BehaviorManifestDefinition.js.map