UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

249 lines (248 loc) 15.4 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 }); exports.EntityTypeInfo = exports.EntityTypeUpdate = void 0; 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 EntityTypeDefinition_1 = __importDefault(require("../minecraft/EntityTypeDefinition")); const Log_1 = __importDefault(require("../core/Log")); var EntityTypeUpdate; (function (EntityTypeUpdate) { EntityTypeUpdate[EntityTypeUpdate["UpdateFormatVersionToLatest"] = 1051] = "UpdateFormatVersionToLatest"; })(EntityTypeUpdate || (exports.EntityTypeUpdate = EntityTypeUpdate = {})); var EntityTypeInfo; (function (EntityTypeInfo) { EntityTypeInfo[EntityTypeInfo["RuntimeIdentifier"] = 52] = "RuntimeIdentifier"; EntityTypeInfo[EntityTypeInfo["Identifier"] = 53] = "Identifier"; EntityTypeInfo[EntityTypeInfo["Metadata"] = 54] = "Metadata"; EntityTypeInfo[EntityTypeInfo["FormatVersionDefined"] = 100] = "FormatVersionDefined"; EntityTypeInfo[EntityTypeInfo["FormatVersionMajorVersionLowerThanCurrent"] = 110] = "FormatVersionMajorVersionLowerThanCurrent"; EntityTypeInfo[EntityTypeInfo["FormatVersionMajorVersionHigherThanCurrent"] = 111] = "FormatVersionMajorVersionHigherThanCurrent"; EntityTypeInfo[EntityTypeInfo["FormatVersionMinorVersionLowerThanCurrent"] = 120] = "FormatVersionMinorVersionLowerThanCurrent"; EntityTypeInfo[EntityTypeInfo["FormatVersionMinorVersionHigherThanCurrent"] = 121] = "FormatVersionMinorVersionHigherThanCurrent"; EntityTypeInfo[EntityTypeInfo["FormatVersionPatchVersionLowerThanCurrent"] = 130] = "FormatVersionPatchVersionLowerThanCurrent"; EntityTypeInfo[EntityTypeInfo["FormatVersionPatchVersionHigherThanCurrent"] = 131] = "FormatVersionPatchVersionHigherThanCurrent"; EntityTypeInfo[EntityTypeInfo["FailedToRetrieveLatestMinecraftVersion"] = 500] = "FailedToRetrieveLatestMinecraftVersion"; EntityTypeInfo[EntityTypeInfo["FailedToParseLatestMinecraftVersion"] = 501] = "FailedToParseLatestMinecraftVersion"; })(EntityTypeInfo || (exports.EntityTypeInfo = EntityTypeInfo = {})); /** * Validates and updates entity type definitions, including format version management. * * @see {@link ../../../public/data/forms/mctoolsval/entitytype.form.json} for topic definitions */ class EntityTypeManager { id; title = "Entity Type"; constructor() { this.id = "ENTITYTYPE"; } getUpdaterData(updaterId) { return { title: updaterId.toString(), }; } summarize(info, infoSet) { } async generate(project, contentIndex) { 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, 509, "Could not retrieve version.")); return infoItems; } const verSplit = ver.split("."); if (verSplit.length < 3 || verSplit.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 piiRuntimeIdentifier = new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.featureAggregate, this.id, EntityTypeInfo.RuntimeIdentifier, "Entity Type Runtime Identifier"); const piiIdentifier = new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.featureAggregate, this.id, EntityTypeInfo.Identifier, "Entity Type Identifier"); const piiMetadata = new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.featureAggregate, this.id, EntityTypeInfo.Metadata, "Entity Type Metadata"); infoItems.push(piiRuntimeIdentifier); infoItems.push(piiIdentifier); infoItems.push(piiMetadata); const itemsCopy = project.getItemsCopy(); for (let i = 0; i < itemsCopy.length; i++) { const pi = itemsCopy[i]; if (pi.itemType === IProjectItemData_1.ProjectItemType.entityTypeBehavior) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const bpEntityType = await EntityTypeDefinition_1.default.ensureOnFile(pi.primaryFile); if (bpEntityType) { await bpEntityType.load(); if (bpEntityType && bpEntityType._data && bpEntityType._data.description) { const desc = bpEntityType._data.description; if (desc.identifier !== undefined && desc.identifier.toLowerCase().startsWith("minecraft:")) { piiIdentifier.incrementFeature(desc.identifier.toLowerCase()); } else { piiIdentifier.incrementFeature("(no override identifier)"); } if (desc.runtime_identifier !== undefined && desc.runtime_identifier.toLowerCase !== undefined && desc.runtime_identifier.toLowerCase().startsWith("minecraft:")) { piiRuntimeIdentifier.incrementFeature(desc.runtime_identifier.toLowerCase()); } else { piiRuntimeIdentifier.incrementFeature("(no runtime identifier)"); } if (desc.aliases) { // eslint-disable-next-line @typescript-eslint/no-unused-vars for (const aliasName in desc.aliases) { piiMetadata.incrementFeature("Entity Type Alias"); } } if (desc.properties) { for (const propName in desc.properties) { const prop = desc.properties[propName]; if (prop) { piiMetadata.incrementFeature("Entity Type Property"); if (prop.client_sync === true) { piiMetadata.incrementFeature("Entity Type Property Client Sync=true"); } if (prop.client_sync === false) { piiMetadata.incrementFeature("Entity Type Property Client Sync=false"); } if (prop.type === "bool" || prop.type === "int" || prop.type === "float" || prop.type === "enum") { piiMetadata.incrementFeature("Entity Type " + prop.type + " Property"); } else if (prop.type) { Log_1.default.debug("Unknown entity property type found: " + prop.type); piiMetadata.incrementFeature("Entity Type Unknown Property"); } if (prop.values) { piiMetadata.spectrumFeature("Entity Type Property Value Count", prop.values.length); } } } } if (desc.is_experimental) { piiMetadata.incrementFeature("Experimental Entity Type"); } if (desc.is_spawnable) { piiMetadata.incrementFeature("Spawnable Entity Type"); } if (desc.is_summonable) { piiMetadata.incrementFeature("Summonable Entity Type"); } } else { piiMetadata.incrementFeature("Entity Type without description"); } const fv = bpEntityType.getFormatVersionAsNumberArray(); if (!bpEntityType || !fv) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, 100, "Entity type does not define a format_version.", pi)); } else { if (fv.length > 0 && fv[0] < parseInt(verSplit[0])) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.recommendation, this.id, 110, "Behavior pack entity type format version (" + fv.join(".") + ") has a lower major version number compared to current version", pi)); } else if (fv[0] > parseInt(verSplit[0])) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, 111, "Behavior pack entity type format version (" + fv.join(".") + ") has a higher major version number compared to current version", pi)); } else if (fv[1] < parseInt(verSplit[1]) - 1) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.recommendation, this.id, 120, "Behavior pack entity type format version (" + fv.join(".") + ") has a lower minor version number compared to the current version or the previous current minor version", pi)); } else if (fv[1] > parseInt(verSplit[1])) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, 121, "Behavior pack entity type format version (" + fv.join(".") + ") has a higher minor version number compared to current version", pi)); } else if (fv[2] < parseInt(verSplit[2])) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.recommendation, this.id, 130, "Behavior pack entity type format version (" + fv.join(".") + ") has a lower patch version number compared to current version", pi)); } else if (fv[2] > parseInt(verSplit[2]) && fv[1] === parseInt(verSplit[1])) { infoItems.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, 131, "Behavior pack entity type format version (" + fv.join(".") + ") has a higher patch version number compared to current version", pi)); } } } } } } return infoItems; } async update(project, updateId) { const results = []; switch (updateId) { case EntityTypeUpdate.UpdateFormatVersionToLatest: const localResults = await this.updateFormatVersionToLatestVersion(project); results.push(...localResults); break; } return results; } getUpdateIds() { return [EntityTypeUpdate.UpdateFormatVersionToLatest]; } async updateFormatVersionToLatestVersion(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, EntityTypeInfo.FailedToRetrieveLatestMinecraftVersion, "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.entityTypeBehavior) { if (!pi.isContentLoaded) { await pi.loadContent(); } if (pi.primaryFile) { const wtManifest = await EntityTypeDefinition_1.default.ensureOnFile(pi.primaryFile); if (wtManifest) { const mev = wtManifest.formatVersion; if (mev) { const mevY = mev?.split("."); if (mevY && (mevY.length < 3 || mevY.length > 4 || parseInt(mevY[0]) !== major || parseInt(mevY[1]) !== minor || parseInt(mevY[2]) !== patch)) { wtManifest.setBehaviorPackFormatVersion(major + "." + minor + "." + patch); wtManifest.persist(); results.push(new ProjectUpdateResult_1.default(IUpdateResult_1.UpdateResultType.updatedFile, this.id, 200, "Updated behavior pack entity type manager format_version to '" + major + "." + minor + "." + patch + "'.", pi, ver)); } } } } } } return results; } } exports.default = EntityTypeManager;