UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

176 lines (175 loc) 8.48 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 Log_1 = __importDefault(require("../core/Log")); const Database_1 = __importDefault(require("../minecraft/Database")); const IProjectItemVariant_1 = require("./IProjectItemVariant"); class ProjectItemVariantCreateManager { static getPredominatingVariantType(project) { let variantStyle = IProjectItemVariant_1.ProjectItemVariantType.versionSliceAlt; const variantCounts = []; const items = project.getItemsCopy(); for (const item of items) { const variants = item.getVariantList(); for (const pv of variants) { variantCounts[pv.variantType] = (variantCounts[pv.variantType] || 0) + 1; } } let winningVote = 0; for (let i = 0; i < IProjectItemVariant_1.MaxVariantCounts; i++) { if (variantCounts[i] > winningVote) { winningVote = variantCounts[i]; variantStyle = i; } } return variantStyle; } static async createVariant(projectItem, itemSeed) { let content; let variantStyle = this.getPredominatingVariantType(projectItem.project); if (!projectItem.primaryFile || !projectItem.projectPath) { Log_1.default.debug(`[VariantCreate] Aborting: primaryFile=${!!projectItem.primaryFile}, projectPath=${projectItem.projectPath}`); return; } let label = itemSeed.label; if (!label) { label = await Database_1.default.getNextMinecraftPreviewVersion(); } if (!label) { Log_1.default.debug("[VariantCreate] Aborting: no label"); return; } Log_1.default.debug(`[VariantCreate] Creating variant '${label}' for '${projectItem.projectPath}', style=${variantStyle}, basedOn='${itemSeed.basedOn}'`); const path = await ProjectItemVariantCreateManager.getTargetFolderPath(projectItem, variantStyle, label); if (!path) { Log_1.default.debug(`[VariantCreate] Aborting: getTargetFolderPath returned undefined for style=${variantStyle}, label='${label}', projectPath='${projectItem.projectPath}'`); return; } if (itemSeed.basedOn) { const contentFile = projectItem.getFile(itemSeed.basedOn); if (contentFile) { if (!contentFile.isContentLoaded) { await contentFile.loadContent(); } if (contentFile.content) { content = contentFile.content; } } } // If no content found from basedOn variant, fall back to the primary file if (content === undefined && projectItem.primaryFile) { if (!projectItem.primaryFile.isContentLoaded) { await projectItem.primaryFile.loadContent(); } if (projectItem.primaryFile.content) { content = projectItem.primaryFile.content; } } if (projectItem.project.projectFolder) { const variantFile = await projectItem.project.projectFolder.ensureFileFromRelativePath(path); if (content !== undefined) { variantFile.setContent(content); await variantFile.saveContent(); const newVariant = projectItem.ensureVariant(label); newVariant.variantType = variantStyle; newVariant.projectPath = path; newVariant.setFile(variantFile); Log_1.default.debug(`[VariantCreate] Created variant '${label}' at '${path}', ` + `file=${variantFile ? "yes" : "no"}, content=${content ? typeof content : "none"}, ` + `variant.file=${newVariant.file ? "yes" : "no"}, ` + `variant.projectPath=${newVariant.projectPath}`); // Ensure the file content is marked as loaded so the editor can display it immediately if (!variantFile.isContentLoaded) { await variantFile.loadContent(); } } else { Log_1.default.debug(`[VariantCreate] No content available to create variant '${label}'`); } } } /** * Tries to build a variant path from a base-packs layout. * E.g., /base-packs/vanilla/behavior/entities/donkey.json * → /base-packs/vanilla_1.26.20/behavior/entities/donkey.json */ static _tryBasePacksPath(projectPath, projectPathLower, variantLabel) { const basePacks = projectPathLower.indexOf("/base-packs/"); if (basePacks >= 0) { const basePackNameStart = basePacks + 12; // after "/base-packs/" const basePackNameEnd = projectPathLower.indexOf("/", basePackNameStart); if (basePackNameEnd > 0) { const basePackName = projectPath.substring(basePackNameStart, basePackNameEnd); return (projectPath.substring(0, basePackNameStart) + basePackName + "_" + variantLabel + projectPath.substring(basePackNameEnd)); } } return undefined; } /** * Tries to build a variant path from a standard _packs/ layout. * E.g., /behavior_packs/mypack_bp/entities/donkey.json * → /behavior_packs/_bp_1.26.20/entities/donkey.json */ static _tryPacksRootPath(projectPath, projectPathLower, variantLabel) { const packsRoot = projectPathLower.indexOf("_packs/"); if (packsRoot >= 0) { const packFolderNameEnd = projectPathLower.indexOf("/", packsRoot + 7); if (packFolderNameEnd > 0) { let packFolderName = projectPath.substring(packsRoot + 7, packFolderNameEnd); const lastUnderscore = packFolderName.lastIndexOf("_"); if (lastUnderscore > 0) { packFolderName = packFolderName.substring(lastUnderscore); } return (projectPath.substring(0, packsRoot + 7) + packFolderName + "_" + variantLabel + projectPath.substring(packFolderNameEnd)); } } return undefined; } static async getTargetFolderPath(projectItem, variantStyle, variantLabel) { const projectPath = projectItem.projectPath; if (!projectPath) { return undefined; } const projectPathLower = projectPath.toLowerCase(); if (variantStyle === IProjectItemVariant_1.ProjectItemVariantType.versionSlice) { const packsResult = ProjectItemVariantCreateManager._tryPacksRootPath(projectPath, projectPathLower, variantLabel); if (packsResult) return packsResult; const baseResult = ProjectItemVariantCreateManager._tryBasePacksPath(projectPath, projectPathLower, variantLabel); if (baseResult) return baseResult; } else if (variantStyle === IProjectItemVariant_1.ProjectItemVariantType.versionSliceAlt) { const staticAssets = projectPathLower.indexOf("/static-assets/"); if (staticAssets) { let packFolderName = projectPath.substring(1, staticAssets); const lastUnderscore = packFolderName.lastIndexOf("_"); if (lastUnderscore > 0) { packFolderName = packFolderName.substring(lastUnderscore); } return "/" + packFolderName + "_" + variantLabel + projectPath.substring(staticAssets); } } // Fallback for 'general' style or when style-specific logic didn't match const baseResult = ProjectItemVariantCreateManager._tryBasePacksPath(projectPath, projectPathLower, variantLabel); if (baseResult) return baseResult; const packsResult = ProjectItemVariantCreateManager._tryPacksRootPath(projectPath, projectPathLower, variantLabel); if (packsResult) return packsResult; return undefined; } } exports.default = ProjectItemVariantCreateManager;