UNPKG

@minecraft/creator-tools

Version:

Minecraft Creator Tools command line and libraries.

279 lines (278 loc) 10.6 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 Utilities_1 = __importDefault(require("../core/Utilities")); const Database_1 = __importDefault(require("../minecraft/Database")); const ICondition_1 = require("./ICondition"); const IField_1 = require("./IField"); class FieldUtilities { static getFieldValueAsBoolean(name, defaultValue, container) { let value = undefined; if (container.dataPropertyObject !== undefined) { const prop = container.dataPropertyObject.getProperty(name); if (prop !== undefined) { value = prop.value; } } if (container.getsetPropertyObject !== undefined) { value = container.getsetPropertyObject.getProperty(name); } if (container.directObject !== undefined) { value = container.directObject[name]; } if (value === undefined) { return defaultValue; } if (typeof value === "boolean") { return value; } else if (typeof value === "number") { if (value === 0) { return false; } else { return true; } } else if (typeof value === "string") { if (value === "false") { return false; } else { return true; } } return defaultValue; } static async getSubForm(field) { if (field.subForm) { return field.subForm; } if (field.subFormId) { const subForm = await Database_1.default.ensureFormLoadedByPath(field.subFormId); return subForm; } return undefined; } static getFieldValue(field, container) { let curVal = undefined; const dataObj = container.dataPropertyObject; if (dataObj !== undefined) { let prop = dataObj.getProperty(field.id); if (prop === undefined && field.altId !== undefined) { prop = dataObj.getProperty(field.altId); } if (prop !== undefined) { curVal = prop.value; } } const gsObj = container.getsetPropertyObject; if (gsObj !== undefined) { if (field.id === "__scalar") { const res = gsObj.getBaseValue(); if (typeof res === "object") { return undefined; } return res; } curVal = gsObj.getProperty(field.id); if (curVal === undefined && field.altId !== undefined) { curVal = gsObj.getProperty(field.altId); } } const dirObj = container.directObject; if (dirObj !== undefined) { if (field.id === "__scalar") { if (typeof dirObj === "object") { return undefined; } return dirObj; } curVal = dirObj[field.id]; } return curVal; } static getFieldTitle(field) { let title = field.id; if (field.title !== undefined) { title = field.title; } else { title = Utilities_1.default.humanifyMinecraftName(title); } if (title === undefined) { title = "Untitled"; } return title; } static getFieldId(field) { if (field.id) { return field.id; } if (field.title) { return field.title; } return "<no id>"; } static getFieldById(id, form) { const fields = form.fields; for (let i = 0; i < fields.length; i++) { const field = fields[i]; if (field.id === id) { return field; } } return undefined; } /** * Legacy numeric-to-string mapping for FieldDataType. * Some form.json files still contain numeric dataType values from that era. * This map converts them to the current string-based FieldDataType values. */ static _legacyNumericDataTypeMap = { 0: IField_1.FieldDataType.int, 1: IField_1.FieldDataType.boolean, 2: IField_1.FieldDataType.string, 3: IField_1.FieldDataType.float, 4: IField_1.FieldDataType.stringEnum, 5: IField_1.FieldDataType.intEnum, 6: IField_1.FieldDataType.intBoolean, 7: IField_1.FieldDataType.number, 8: IField_1.FieldDataType.stringLookup, 9: IField_1.FieldDataType.intValueLookup, 10: IField_1.FieldDataType.long, 11: IField_1.FieldDataType.point3, 12: IField_1.FieldDataType.intPoint3, 13: IField_1.FieldDataType.longFormString, 14: IField_1.FieldDataType.keyedObjectCollection, 15: IField_1.FieldDataType.objectArray, 16: IField_1.FieldDataType.object, 17: IField_1.FieldDataType.stringArray, 18: IField_1.FieldDataType.intRange, 19: IField_1.FieldDataType.floatRange, 20: IField_1.FieldDataType.minecraftFilter, 21: IField_1.FieldDataType.percentRange, 22: IField_1.FieldDataType.minecraftEventTrigger, 23: IField_1.FieldDataType.longFormStringArray, 24: IField_1.FieldDataType.keyedStringCollection, 25: IField_1.FieldDataType.version, 26: IField_1.FieldDataType.uuid, 27: IField_1.FieldDataType.keyedBooleanCollection, 28: IField_1.FieldDataType.keyedStringArrayCollection, 29: IField_1.FieldDataType.arrayOfKeyedStringCollection, 30: IField_1.FieldDataType.keyedKeyedStringArrayCollection, 31: IField_1.FieldDataType.keyedNumberCollection, 32: IField_1.FieldDataType.numberArray, 33: IField_1.FieldDataType.checkboxListAsStringArray, 34: IField_1.FieldDataType.molang, 35: IField_1.FieldDataType.molangArray, 36: IField_1.FieldDataType.point2, 37: IField_1.FieldDataType.localizableString, 38: IField_1.FieldDataType.keyedNumberArrayCollection, 39: IField_1.FieldDataType.minecraftEventReference, }; /** * Converts a legacy numeric FieldDataType value to its string equivalent. * If the value is already a string, returns it as-is. */ static normalizeFieldDataType(dataType) { if (typeof dataType === "number") { return FieldUtilities._legacyNumericDataTypeMap[dataType] ?? IField_1.FieldDataType.string; } return dataType; } /** * Normalizes all numeric dataType values in a form definition (and its nested * subForms/alternates) to string-based FieldDataType values. */ static normalizeFormFieldDataTypes(form) { if (!form.fields) { return; } for (const field of form.fields) { FieldUtilities.normalizeFieldDataTypes(field); } if (form.scalarField) { FieldUtilities.normalizeFieldDataTypes(form.scalarField); } } static normalizeFieldDataTypes(field) { if (field.dataType !== undefined) { field.dataType = FieldUtilities.normalizeFieldDataType(field.dataType); } if (field.alternates) { for (const alt of field.alternates) { FieldUtilities.normalizeFieldDataTypes(alt); } } if (field.subForm) { FieldUtilities.normalizeFormFieldDataTypes(field.subForm); } } static getStringKeyedFieldType(fieldType) { switch (fieldType) { case IField_1.FieldDataType.string: return IField_1.FieldDataType.keyedStringCollection; case IField_1.FieldDataType.number: return IField_1.FieldDataType.keyedNumberCollection; case IField_1.FieldDataType.stringArray: return IField_1.FieldDataType.keyedStringArrayCollection; case IField_1.FieldDataType.numberArray: return IField_1.FieldDataType.keyedNumberArrayCollection; case IField_1.FieldDataType.boolean: return IField_1.FieldDataType.keyedBooleanCollection; case IField_1.FieldDataType.object: return IField_1.FieldDataType.keyedObjectCollection; } return fieldType; } static evaluate(form, conditions, container, defaultField) { for (let condition of conditions) { let field; if (condition.field) { field = FieldUtilities.getFieldById(condition.field, form); } if (!field && defaultField) { field = defaultField; } if (!field) { Log_1.default.fail("Could not find field '" + condition.field + "'"); return false; } const actualVal = FieldUtilities.getFieldValue(field, container); if (condition.comparison) { const comp = condition.comparison.toLowerCase(); if (comp === ICondition_1.ComparisonType.equals) { if (condition.value !== undefined && actualVal !== condition.value) { return false; } if (condition.anyValues !== undefined) { let foundMatch = false; for (const val of condition.anyValues) { if (val === actualVal) { foundMatch = true; } } if (!foundMatch) { return false; } } } else if (comp === ICondition_1.ComparisonType.isDefined && (actualVal === undefined || actualVal === null)) { return false; } else if (comp === ICondition_1.ComparisonType.isNonEmpty && (actualVal === undefined || actualVal === null || (typeof actualVal === "string" && actualVal.length <= 0))) { return false; } } } return true; } } exports.default = FieldUtilities;