@minecraft/creator-tools
Version:
Minecraft Creator Tools command line and libraries.
279 lines (278 loc) • 10.6 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 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;