@minecraft/creator-tools
Version:
Minecraft Creator Tools command line and libraries.
176 lines (175 loc) • 8.48 kB
JavaScript
;
// 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;