UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

321 lines (320 loc) 19.2 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 ProjectInfoItem_1 = __importDefault(require("../info/ProjectInfoItem")); const IProjectItemData_1 = require("../app/IProjectItemData"); const IInfoItemData_1 = require("../info/IInfoItemData"); const Database_1 = __importDefault(require("../minecraft/Database")); const ProjectUpdateResult_1 = __importDefault(require("../updates/ProjectUpdateResult")); const IUpdateResult_1 = require("../updates/IUpdateResult"); const BlockTypeDefinition_1 = __importDefault(require("../minecraft/BlockTypeDefinition")); const ItemTypeDefinition_1 = __importDefault(require("../minecraft/ItemTypeDefinition")); const RecipeBehaviorDefinition_1 = __importDefault(require("../minecraft/RecipeBehaviorDefinition")); const AnimationBehaviorDefinition_1 = __importDefault(require("../minecraft/AnimationBehaviorDefinition")); const SpawnRulesBehaviorDefinition_1 = __importDefault(require("../minecraft/SpawnRulesBehaviorDefinition")); const AnimationControllerResourceDefinition_1 = __importDefault(require("../minecraft/AnimationControllerResourceDefinition")); const AnimationResourceDefinition_1 = __importDefault(require("../minecraft/AnimationResourceDefinition")); const AttachableResourceDefinition_1 = __importDefault(require("../minecraft/AttachableResourceDefinition")); const EntityTypeResourceDefinition_1 = __importDefault(require("../minecraft/EntityTypeResourceDefinition")); const FogResourceDefinition_1 = __importDefault(require("../minecraft/FogResourceDefinition")); const WorldTemplateManifestDefinition_1 = __importDefault(require("../minecraft/WorldTemplateManifestDefinition")); const ProjectItemUtilities_1 = __importDefault(require("../app/ProjectItemUtilities")); const MinecraftVersionRules_1 = require("../core/versioning/MinecraftVersionRules"); /** * Validates and updates format versions across various Minecraft definition types. * * @see {@link ../../../public/data/forms/mctoolsval/formatver.form.json} for topic definitions */ class FormatVersionManager { id = "FORMATVER"; title = "Format Version"; performPlatformVersionValidations = false; getUpdaterData(updaterId) { return { title: updaterId.toString(), }; } summarize(info, infoSet) { } async generate(project, content) { const infoItems = []; const ver = await Database_1.default.getLatestVersionInfo(project.effectiveTrack); if (!ver) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.internalProcessingError, this.id, 500, "Could not retrieve version.")); return infoItems; } const modernGameVersionSplit = ver.split("."); if (modernGameVersionSplit.length < 3 || modernGameVersionSplit.length > 4) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.internalProcessingError, this.id, 501, "Could not latest product retrieve version.", undefined, ver)); return infoItems; } const itemsCopy = project.getItemsCopy(); for (let i = 0; i < itemsCopy.length; i++) { const pi = itemsCopy[i]; if (pi.itemType === IProjectItemData_1.ProjectItemType.blockTypeBehavior) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const btdef = await BlockTypeDefinition_1.default.ensureOnFile(pi.primaryFile); if (btdef) { const ver = btdef.getFormatVersion(); this.checkVersions(ver, modernGameVersionSplit, infoItems, pi, "Block type", 110); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, btdef?.getFormatVersion())); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.itemTypeBehavior) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const itdef = await ItemTypeDefinition_1.default.ensureOnFile(pi.primaryFile); if (itdef) { const ver = itdef.getFormatVersion(); this.checkVersions(ver, modernGameVersionSplit, infoItems, pi, "Item type", 130); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, itdef.getFormatVersion())); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.recipeBehavior) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const rbdef = await RecipeBehaviorDefinition_1.default.ensureOnFile(pi.primaryFile); if (rbdef) { const ver = rbdef.getFormatVersion(); this.checkVersions(ver, modernGameVersionSplit, infoItems, pi, "Recipe", 150); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, rbdef.getFormatVersion())); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.animationBehaviorJson) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const abdef = await AnimationBehaviorDefinition_1.default.ensureOnFile(pi.primaryFile); if (abdef) { const ver = abdef.getFormatVersion(); this.checkVersions(ver, ["1", "10", "0"], infoItems, pi, "Behavior animation", 170); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, abdef.getFormatVersion())); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.animationControllerBehaviorJson) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const abdef = await AnimationBehaviorDefinition_1.default.ensureOnFile(pi.primaryFile); if (abdef) { const ver = abdef.getFormatVersion(); this.checkVersions(ver, ["1", "10", "0"], infoItems, pi, "Behavior animation controller", 190); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, abdef.getFormatVersion())); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.animationResourceJson) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const ardef = await AnimationResourceDefinition_1.default.ensureOnFile(pi.primaryFile); if (ardef) { const ver = ardef.getFormatVersion(); this.checkVersions(ver, ["1", "10", "0"], infoItems, pi, "Resource animation", 210); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, ardef.getFormatVersion())); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.animationControllerResourceJson) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const acrdef = await AnimationControllerResourceDefinition_1.default.ensureOnFile(pi.primaryFile); if (acrdef) { const ver = acrdef.getFormatVersion(); this.checkVersions(ver, ["1", "10", "0"], infoItems, pi, "Resource animation controller", 230); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, acrdef.getFormatVersion())); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.spawnRuleBehavior) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const srbdef = await SpawnRulesBehaviorDefinition_1.default.ensureOnFile(pi.primaryFile); if (srbdef) { const ver = srbdef.getFormatVersion(); this.checkVersions(ver, ["1", "12", "0"], infoItems, pi, "Spawn rules", 250); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, srbdef.getFormatVersion())); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.attachableResourceJson) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const srbdef = await AttachableResourceDefinition_1.default.ensureOnFile(pi.primaryFile); if (srbdef) { const ver = srbdef.getFormatVersion(); this.checkVersions(ver, ["1", "10", "0"], infoItems, pi, "Attachables", 270, true); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, srbdef.getFormatVersion())); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.entityTypeResource) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const etrdef = await EntityTypeResourceDefinition_1.default.ensureOnFile(pi.primaryFile); if (etrdef) { const ver = etrdef.getFormatVersion(); this.checkVersions(ver, modernGameVersionSplit, infoItems, pi, "Entity type resource", 290); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, etrdef.getFormatVersion())); } } } else if (pi.itemType === IProjectItemData_1.ProjectItemType.fogResourceJson) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const etrdef = await FogResourceDefinition_1.default.ensureOnFile(pi.primaryFile); if (etrdef) { const ver = etrdef.getFormatVersion(); this.checkVersions(ver, modernGameVersionSplit, infoItems, pi, "Fog resource", 310); infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, 600 + pi.itemType, ProjectItemUtilities_1.default.getDescriptionForType(pi.itemType) + " format_version", pi, etrdef.getFormatVersion())); } } } } return infoItems; } checkVersions(ver, currentVersion, infoItems, pi, typeString, identifierOffset, allowHigherVersions) { const verShort = currentVersion[0] + "." + currentVersion[1] + "." + currentVersion[2]; if (!ver || ver.length !== 3) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, identifierOffset, typeString + " does not define a format_version.", pi)); return true; } else { if (ver[0] < parseInt(currentVersion[0])) { infoItems.push(new ProjectInfoItem_1.default(this.performPlatformVersionValidations ? IInfoItemData_1.InfoItemType.error : IInfoItemData_1.InfoItemType.recommendation, this.id, identifierOffset + 2, typeString + " version (" + ver.join(".") + ") has a lower major version number compared to the expected version (" + verShort + ")", pi)); } else if (ver[0] > parseInt(currentVersion[0]) && !allowHigherVersions) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, identifierOffset + 4, typeString + " version (" + ver.join(".") + ") has a higher major version number compared to the expected version (" + verShort + ")", pi)); return true; } else if ((0, MinecraftVersionRules_1.isMinorVersionTooOld)(parseInt(currentVersion[0]), parseInt(currentVersion[1]), ver[1])) { infoItems.push(new ProjectInfoItem_1.default(this.performPlatformVersionValidations ? IInfoItemData_1.InfoItemType.error : IInfoItemData_1.InfoItemType.recommendation, this.id, identifierOffset + 6, typeString + " version (" + ver.join(".") + ") has a lower minor version number compared to the expected version (" + verShort + ") or its previous minor version", pi)); } else if (ver[1] > parseInt(currentVersion[1]) && !this.performPlatformVersionValidations && !allowHigherVersions) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.warning, this.id, identifierOffset + 8, typeString + " version (" + ver.join(".") + ") has a higher minor version number compared to the expected version (" + verShort + ")", pi)); return true; } else if (ver[2] < parseInt(currentVersion[2])) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.recommendation, this.id, identifierOffset + 10, typeString + " version (" + ver.join(".") + ") has a lower patch version number compared to the expected version (" + verShort + ")", pi)); } else if (ver[2] > parseInt(currentVersion[2]) && ver[1] === parseInt(currentVersion[1]) && !this.performPlatformVersionValidations && !allowHigherVersions) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, identifierOffset + 12, typeString + " version (" + ver.join(".") + ") has a higher patch version number compared to the expected version (" + verShort + ")", pi)); return true; } } return false; } async update(project, updateId) { const results = []; switch (updateId) { case 1: const localResults = await this.updateBaseGameVersionToLatestVersion(project); results.push(...localResults); break; } return results; } getUpdateIds() { return [1]; } async updateBaseGameVersionToLatestVersion(project) { const results = []; const ver = await Database_1.default.getLatestVersionInfo(project.effectiveTrack); if (!ver) { results.push(new ProjectUpdateResult_1.default(IUpdateResult_1.UpdateResultType.internalProcessingError, this.id, 199, "Could not retrieve version.")); return results; } const verSplit = ver.split("."); if (verSplit.length < 3 || verSplit.length > 4) { results.push(new ProjectUpdateResult_1.default(IUpdateResult_1.UpdateResultType.internalProcessingError, this.id, 200, "Could not retrieve latest product version.", undefined, ver)); return results; } const major = parseInt(verSplit[0]); const minor = parseInt(verSplit[1]); const patch = parseInt(verSplit[2]); const itemsCopy = project.getItemsCopy(); for (let i = 0; i < itemsCopy.length; i++) { const pi = itemsCopy[i]; if (pi.itemType === IProjectItemData_1.ProjectItemType.worldTemplateManifestJson) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const wtManifest = await WorldTemplateManifestDefinition_1.default.ensureOnFile(pi.primaryFile); if (wtManifest) { const mev = wtManifest.baseGameVersion; if (!mev || mev.length < 3 || mev.length > 4 || mev[0] !== major || mev[1] !== minor || mev[2] !== patch) { wtManifest.setBaseGameVersion([major, minor, patch], project); wtManifest.persist(); results.push(new ProjectUpdateResult_1.default(IUpdateResult_1.UpdateResultType.updatedFile, this.id, 200, "Updated world template base_game_version to '" + major + "." + minor + "." + patch + "'.", pi, ver)); } } } } } return results; } } exports.default = FormatVersionManager;