UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

475 lines (473 loc) 23.6 kB
"use strict"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. Object.defineProperty(exports, "__esModule", { value: true }); exports.CooperativeAddOnRequirementsGeneratorTest = void 0; const ProjectInfoItem_1 = require("./ProjectInfoItem"); const IInfoItemData_1 = require("./IInfoItemData"); const StorageUtilities_1 = require("../storage/StorageUtilities"); const BehaviorManifestDefinition_1 = require("../minecraft/BehaviorManifestDefinition"); const IProjectItemData_1 = require("../app/IProjectItemData"); const Utilities_1 = require("../core/Utilities"); const ResourceManifestDefinition_1 = require("../minecraft/ResourceManifestDefinition"); const ProjectInfoUtilities_1 = require("./ProjectInfoUtilities"); const UniqueRegEx = new RegExp(/[a-zA-Z0-9]{2,}_[a-zA-Z0-9]{2,}:[\w]+/); const GenericTermList = [ "abilities", "actions", "adventure", "animals", "anims", "armor", "assets", "attachables", "banners", "base", "blocks", "book", "boss", "bosses", "bridge", "camping", "cars", "characters", "chests", "cinema", "cinematics", "cloud", "collectables", "collectibles", "custom_ui", "cut_scene", "cutscene", "deco", "decor", "dev", "dialogue", "dinos", "dinosaurs", "doors", "dragon", "dragons", "dummy", "effects", "enemies", "enemy", "entities", "entity", "env", "equipment", "events", "food", "furniture", "furnitures", "fx", "game_menu", "gameplay", "general", "glow", "guide", "guidebook", "inanimate", "interface", "internal", "intro", "item", "items", "launchers", "machines", "magic", "markers", "market", "marketing_banners", "mastermind", "mechanics", "menu", "menus", "minigames", "misc", "miscellaneous", "mob", "mobs", "monsters", "morphs", "mutant", "neutral", "npc", "npcs", "objectives", "particles", "passive", "passive_mobs", "pets", "platform", "player", "players", "portal", "portals", "preset", "projectile", "projectiles", "properties", "props", "recipe_models", "scanner", "script", "security", "sequences", "sfx", "shop", "skills", "sounds", "static_entity", "store", "structure", "structures", "systems", "tasks", "teams", "teleporter", "tnt", "tools", "towers", "trinkets", "tutorial", "ui", "user_interface", "util", "utilities", "vanilla", "vanilla_mob", "vehicle", "vehicles", "vr", "weapon", "weapons", "wrench", "opaque", "map", "on", "item", "player", "map", "charged", "beacon", "conduit", "moving", "banner", "bed", "cow", "chicken", "dragon", "ender", "enderman", "fang", "fireball", "mob", "warden", "village", "pattern", "wandering", "trial", "stray", "spider", "slime", "chest", "silverfish", "polar", "shield", "husk", "blaze", "axolotl", ]; // rule name/check. For validation errors, name should be a terse description of "your problem" var CooperativeAddOnRequirementsGeneratorTest; (function (CooperativeAddOnRequirementsGeneratorTest) { CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NoLooseFileInTypeFolder"] = 101] = "NoLooseFileInTypeFolder"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NoCommonNamesInCreatorFolderName"] = 102] = "NoCommonNamesInCreatorFolderName"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NoLooseFileInCreatorFolder"] = 104] = "NoLooseFileInCreatorFolder"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["MoreThanOneFolderInCreatorFolderBesidesMaybeCommon"] = 108] = "MoreThanOneFolderInCreatorFolderBesidesMaybeCommon"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NoUnsupportedFolderNameInTypeFolder"] = 109] = "NoUnsupportedFolderNameInTypeFolder"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["MoreThanOneFolderInTypeFolder"] = 110] = "MoreThanOneFolderInTypeFolder"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NoLooseFilesInTypeFolder"] = 111] = "NoLooseFilesInTypeFolder"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NoDimensionElements"] = 131] = "NoDimensionElements"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NoUiElements"] = 133] = "NoUiElements"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NotOneBehaviorPackManifest"] = 160] = "NotOneBehaviorPackManifest"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NotOneResourcePackManifest"] = 161] = "NotOneResourcePackManifest"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["BehaviorPackManifestNotValid"] = 163] = "BehaviorPackManifestNotValid"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["ResourcePackManifestNotValid"] = 164] = "ResourcePackManifestNotValid"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NotOneDependencyFromBehaviorPackToResourcePack"] = 165] = "NotOneDependencyFromBehaviorPackToResourcePack"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["DependencyFromBehaviorPackToResourcePackNotValid"] = 166] = "DependencyFromBehaviorPackToResourcePackNotValid"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["NotOneDependencyFromResourcePackToBehaviorPack"] = 168] = "NotOneDependencyFromResourcePackToBehaviorPack"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["DependencyFromResourcePackToBehaviorPackNotValid"] = 169] = "DependencyFromResourcePackToBehaviorPackNotValid"; CooperativeAddOnRequirementsGeneratorTest[CooperativeAddOnRequirementsGeneratorTest["FoundBehaviorPack"] = 200] = "FoundBehaviorPack"; })(CooperativeAddOnRequirementsGeneratorTest = exports.CooperativeAddOnRequirementsGeneratorTest || (exports.CooperativeAddOnRequirementsGeneratorTest = {})); class CooperativeAddOnRequirementsGenerator { constructor() { this.id = "CADDONREQ"; this.title = "Cooperative Add-On Requirements"; } getTopicData(topicId) { return { title: ProjectInfoUtilities_1.default.getTitleFromEnum(CooperativeAddOnRequirementsGeneratorTest, topicId), }; } async generate(project, contentIndex) { const items = []; let behaviorPackManifest = undefined; let behaviorPackItem = undefined; let resourcePackManifest = undefined; let resourcePackItem = undefined; const itemsCopy = project.getItemsCopy(); for (const projectItem of itemsCopy) { if (projectItem.file) { if (projectItem.itemType === IProjectItemData_1.ProjectItemType.behaviorPackManifestJson) { if (behaviorPackManifest) { // CADDONREQ160 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NotOneBehaviorPackManifest, `Found more than one behavior pack manifest in a cooperative add-on, which is not a best practice`, projectItem)); } else { items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.info, this.id, CooperativeAddOnRequirementsGeneratorTest.FoundBehaviorPack, `Behavior pack manifest found.`, projectItem)); } behaviorPackManifest = await BehaviorManifestDefinition_1.default.ensureOnFile(projectItem.file); behaviorPackItem = projectItem; await behaviorPackManifest?.load(); } else if (projectItem.itemType === IProjectItemData_1.ProjectItemType.resourcePackManifestJson) { if (resourcePackManifest) { // CADDONREQ161 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NotOneResourcePackManifest, `Found more than one resource pack manifest in a cooperative add-on, which is not a best practice`, projectItem)); } resourcePackManifest = await ResourceManifestDefinition_1.default.ensureOnFile(projectItem.file); resourcePackItem = projectItem; await resourcePackManifest?.load(); } } } if (!behaviorPackManifest || !behaviorPackManifest.definition) { // CADDONREQ163 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.BehaviorPackManifestNotValid, `Did not find a valid behavior pack manifest.`, undefined)); } if (!resourcePackManifest || !resourcePackManifest.definition) { //CADDONREQ164 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.ResourcePackManifestNotValid, `Did not find a valid resource pack manifest.`, undefined)); } if (behaviorPackManifest && resourcePackManifest && behaviorPackManifest.definition && resourcePackManifest.definition) { const bpNonInternalDependency = behaviorPackManifest.getFirstNonScriptModuleDependency(); if (!behaviorPackManifest.definition.dependencies || behaviorPackManifest.getNonScriptModuleDependencyCount() !== 1) { // CADDONREQ165 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NotOneDependencyFromBehaviorPackToResourcePack, `Did not find exactly one dependency on the corresponding resource pack in the behavior pack manifest.`, behaviorPackItem, behaviorPackManifest.getNonScriptModuleDependencyCount())); } else if (!bpNonInternalDependency || !bpNonInternalDependency.uuid || !Utilities_1.default.uuidEqual(bpNonInternalDependency.uuid, resourcePackManifest.definition.header.uuid)) { // CADDONREQ166 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.DependencyFromBehaviorPackToResourcePackNotValid, `Behavior pack manifest does not have a proper dependency on the resource pack identifier.`, behaviorPackItem)); } if (!resourcePackManifest.definition.dependencies || resourcePackManifest.definition.dependencies.length !== 1) { // CADDONREQ168 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NotOneDependencyFromResourcePackToBehaviorPack, `Did not find exactly one dependency on the corresponding behavior pack in the resource pack manifest.`, resourcePackItem)); } else if (!resourcePackManifest.definition.dependencies[0].uuid || !Utilities_1.default.uuidEqual(resourcePackManifest.definition.dependencies[0].uuid, behaviorPackManifest.definition.header.uuid)) { // CADDONREQ169 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.DependencyFromResourcePackToBehaviorPackNotValid, `Resource pack manifest does not have a proper dependency on the behavior pack identifier.`, behaviorPackItem)); } } const bpFolder = await project.getDefaultBehaviorPackFolder(); if (bpFolder) { await this.generateFromBehaviorPackFolder(project, bpFolder, items); } const rpFolder = await project.getDefaultResourcePackFolder(); if (rpFolder) { await this.generateFromResourcePackFolder(project, rpFolder, items); } return items; } summarize(info, infoSet) { } async generateFromBehaviorPackFolder(project, folder, items) { await folder.load(); for (const folderName in folder.folders) { const childFolder = folder.folders[folderName]; const folderNameCanon = StorageUtilities_1.default.canonicalizeName(folderName); if (folderNameCanon === "dimensions") { // CADDONREQ131 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NoDimensionElements, `Found dimensions in a cooperative add-on, which is not a best practice.`, undefined)); } if (childFolder && !folder.errorStatus) { if (folderNameCanon === "structures") { await this.generateFromFirstLevelFolderCreator_Game(project, childFolder, items); } else if (folderNameCanon !== "texts" && folderNameCanon !== "entities" && folderNameCanon !== "features" && folderNameCanon !== "feature_rules" && folderNameCanon !== "particles" && folderNameCanon !== "items" && folderNameCanon !== "scripts" && folderNameCanon !== "recipes" && folderNameCanon !== "spawn_rules" && folderNameCanon !== "animations" && folderNameCanon !== "animation_controllers" && folderNameCanon !== "render_controllers" && folderNameCanon !== "blocks") { await this.generateFromFirstLevelFolderCreatorNameGameName(project, childFolder, items); } } } } async generateFromResourcePackFolder(project, folder, items) { await folder.load(); for (const folderName in folder.folders) { const childFolder = folder.folders[folderName]; const folderNameCanon = StorageUtilities_1.default.canonicalizeName(folderName); if (folderNameCanon === "ui") { // CADDONREQ133 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NoUiElements, `Found ui elements in a cooperative add-on, which is not supported`, undefined)); } if (childFolder && !folder.errorStatus) { if (folderNameCanon !== "texts" && folderNameCanon !== "entity" && folderNameCanon !== "items" && folderNameCanon !== "particles" && folderNameCanon !== "materials" && folderNameCanon !== "blocks" && folderNameCanon !== "models" && folderNameCanon !== "attachables" && folderNameCanon !== "render_controllers" && folderNameCanon !== "animation_controllers" && folderNameCanon !== "animations") { await this.generateFromFirstLevelFolderCreatorNameGameName(project, childFolder, items); } } } } static isNameGenericTerm(name) { name = StorageUtilities_1.default.canonicalizeName(name); return GenericTermList.includes(name); } static isNamespacedIdentifier(id) { let identifierSplit = id.split(":"); if (identifierSplit.length !== 2) { return false; } if (identifierSplit[0].length < 2 || identifierSplit[1].length < 2) { return false; } return this.isNamespacedString(identifierSplit[0]); } static isNamespacedString(name) { let tokens = name.split("_"); if (tokens.length < 2) { return false; } return tokens[0].length >= 2 && tokens[1].length >= 2; } static isCommonMaterialName(name) { let tokens = name.split("_"); if (tokens.length < 3) { return true; } return GenericTermList.includes(tokens[0]); } static isUniqueNamespaceOrShortName(name) { name = StorageUtilities_1.default.canonicalizeName(name); if (name.length < 3) { return false; } return UniqueRegEx.test(name); } async generateFromFirstLevelFolderCreator_Game(project, folder, items) { await folder.load(); for (const fileName in folder.files) { if (!this.isPerPackCatalogFile(folder.name, fileName)) { const file = folder.files[fileName]; const projectItem = file?.extendedPath ? project.getItemByExtendedOrProjectPath(file?.extendedPath) : undefined; // CADDONREQ111 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NoLooseFilesInTypeFolder, `Found a loose file in the ${folder.name} folder. Should only see files in the folder ${folder.name}\\creatorshortname_gamename\\`, projectItem, fileName)); } } let folderCount = 0; for (const folderName in folder.folders) { const folderNameCanon = StorageUtilities_1.default.canonicalizeName(folderName); folderCount++; if (CooperativeAddOnRequirementsGenerator.isUniqueNamespaceOrShortName(folderNameCanon)) { // CADDONREQ109 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NoUnsupportedFolderNameInTypeFolder, `Found an add-on-blocked folder '${folderName}' in a parent folder pack\\${folder.name}. Should be named 'creatorshortname' and not a common term`, undefined, folderName)); } } if (folderCount > 1) { // CADDONREQ110 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.MoreThanOneFolderInTypeFolder, `Folder '${folder.name}' has more than one subfolder, which is not supported. There should only be one folder in pack\\${folder.name}\\<studioname>_<mygamename>`, undefined, folder.name)); } } isPerPackCatalogFile(folderName, fileName) { const fileNameCanon = StorageUtilities_1.default.canonicalizeName(fileName); if ((folderName !== "functions" || fileNameCanon !== "tick.json") && (folderName !== "textures" || (fileNameCanon !== "flipbook_textures.json" && fileNameCanon !== "item_textures.json" && fileNameCanon !== "blocks.json" && fileNameCanon !== "block.json" && fileNameCanon !== "textures_list.json" && fileNameCanon !== "texture_list.json" && fileNameCanon !== "terrain_textures.json" && fileNameCanon !== "item_texture.json" && fileNameCanon !== "terrain_texture.json")) && (folderName !== "sounds" || (fileNameCanon !== "sound_definitions.json" && fileNameCanon !== "sounds.json" && fileNameCanon !== "music_definitions.json"))) { return false; } return true; } async generateFromFirstLevelFolderCreatorNameGameName(project, folder, items) { await folder.load(); for (const fileName in folder.files) { if (!this.isPerPackCatalogFile(folder.name, fileName)) { const file = folder.files[fileName]; const projectItem = file?.extendedPath ? project.getItemByExtendedOrProjectPath(file?.extendedPath) : undefined; // CADDONREQ101 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NoLooseFileInTypeFolder, `Found a loose file in the ${folder.name} folder. Should only see files in the folder ${folder.name}\\creatorshortname\\gamename\\`, projectItem, fileName)); } } for (const folderName in folder.folders) { const folderNameCanon = StorageUtilities_1.default.canonicalizeName(folderName); if (CooperativeAddOnRequirementsGenerator.isNameGenericTerm(folderNameCanon)) { // CADDONREQ102 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NoCommonNamesInCreatorFolderName, `Found an cooperative add-on common name folder '${folderName}' in a parent folder pack\\${folder.name}. Should be named 'creatorshortname' and not a common term`, undefined, folderName)); } const childFolder = folder.folders[folderName]; if (childFolder) { await this.generateFromSecondLevelFolderGameName(project, folder.name, childFolder, items); } } } async generateFromSecondLevelFolderGameName(project, parentFolderName, folder, items) { await folder.load(); for (const fileName in folder.files) { const file = folder.files[fileName]; const projectItem = file?.extendedPath ? project.getItemByExtendedOrProjectPath(file.extendedPath) : undefined; // CADDONREQ104 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.NoLooseFileInCreatorFolder, `Found a loose file '${fileName}' in ${parentFolderName}\\${folder.name}. Files should only be in the folder ${parentFolderName}\\${folder.name}\\<mygamename>`, projectItem, fileName)); } let folderCount = 0; for (const childFolderName in folder.folders) { const folderNameCanon = StorageUtilities_1.default.canonicalizeName(childFolderName); if (folderNameCanon !== "common") { folderCount++; } } if (folderCount > 1) { // CADDONREQ108 items.push(new ProjectInfoItem_1.default(IInfoItemData_1.InfoItemType.error, this.id, CooperativeAddOnRequirementsGeneratorTest.MoreThanOneFolderInCreatorFolderBesidesMaybeCommon, `Secondary folder '${folder.name}' in ${parentFolderName} has more than one subfolder (besides 'common'), which is not supported. There should only be one folder (plus optionally 'common') in pack\\${parentFolderName}\\${folder.name}\\<mygamename>`, undefined, folder.name)); } } } exports.default = CooperativeAddOnRequirementsGenerator; //# sourceMappingURL=../maps/info/CooperativeAddOnRequirementsGenerator.js.map