9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-19 15:09:15 +00:00

支持参数默认值嵌套

This commit is contained in:
XiaoMoMi
2025-11-26 00:58:12 +08:00
parent 431aea5385
commit 6e20de126f
21 changed files with 341 additions and 324 deletions

View File

@@ -114,7 +114,7 @@ public abstract class CraftEngine implements Plugin {
LegacyRecipeTypes.init();
// 初始化模板管理器
this.templateManager = new TemplateManagerImpl();
this.templateManager = TemplateManager.INSTANCE;
// 初始化全局变量管理器
this.globalVariableManager = new GlobalVariableManager();
// 初始化物品浏览器

View File

@@ -0,0 +1,303 @@
package net.momirealms.craftengine.core.plugin.config.template;
import net.momirealms.craftengine.core.plugin.config.template.argument.TemplateArgument;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.util.SNBTReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public interface ArgumentString {
String rawValue();
Object get(Map<String, TemplateArgument> arguments);
final class Literal implements ArgumentString {
private final String value;
public Literal(String value) {
this.value = value;
}
public static Literal literal(String value) {
return new Literal(value);
}
@Override
public String rawValue() {
return this.value;
}
@Override
public Object get(Map<String, TemplateArgument> arguments) {
return this.value;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Literal literal)) return false;
return this.value.equals(literal.value);
}
@Override
public int hashCode() {
return this.value.hashCode();
}
@Override
public String toString() {
return "Literal(" + this.value + ")";
}
}
final class Placeholder implements ArgumentString {
private final String placeholder;
private final String rawText;
private final Object defaultValue;
private final boolean hasDefaultValue;
public Placeholder(String placeholderContent) {
this.rawText = "${" + placeholderContent + "}";
int separatorIndex = placeholderContent.indexOf(":-");
if (separatorIndex == -1) {
this.placeholder = placeholderContent;
this.defaultValue = null;
this.hasDefaultValue = false;
} else {
this.placeholder = placeholderContent.substring(0, separatorIndex);
String defaultValueString = placeholderContent.substring(separatorIndex + 2);
try {
this.defaultValue = ((TemplateManagerImpl) TemplateManager.INSTANCE).preprocessUnknownValue(new SNBTReader(defaultValueString).deserializeAsJava());
} catch (LocalizedResourceConfigException e) {
e.appendTailArgument(this.placeholder);
throw e;
}
this.hasDefaultValue = true;
}
}
public static Placeholder placeholder(String placeholder) {
return new Placeholder(placeholder);
}
@Override
public Object get(Map<String, TemplateArgument> arguments) {
TemplateArgument replacement = arguments.get(this.placeholder);
if (replacement != null) {
return replacement.get(arguments);
}
if (this.hasDefaultValue) {
if (this.defaultValue == null) {
return null;
}
return ((TemplateManagerImpl) TemplateManager.INSTANCE).processUnknownValue(this.defaultValue, arguments);
}
throw new LocalizedResourceConfigException("warning.config.template.argument.missing_value", this.rawText);
}
@Override
public String rawValue() {
return this.rawText;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Placeholder that)) return false;
return this.placeholder.equals(that.placeholder);
}
@Override
public int hashCode() {
return this.placeholder.hashCode();
}
@Override
public String toString() {
return "Placeholder(" + this.placeholder + ")";
}
}
final class Complex2 implements ArgumentString {
private final String rawText;
private final ArgumentString arg1;
private final ArgumentString arg2;
public Complex2(String rawText, ArgumentString arg1, ArgumentString arg2) {
this.arg1 = arg1;
this.arg2 = arg2;
this.rawText = rawText;
}
@Override
public Object get(Map<String, TemplateArgument> arguments) {
Object arg1 = this.arg1.get(arguments);
Object arg2 = this.arg2.get(arguments);
if (arg1 == null && arg2 == null) return null;
if (arg1 == null) return String.valueOf(arg2);
if (arg2 == null) return String.valueOf(arg1);
return String.valueOf(arg1) + arg2;
}
@Override
public String rawValue() {
return this.rawText;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Complex that)) return false;
return this.rawText.equals(that.rawText);
}
@Override
public int hashCode() {
return this.rawText.hashCode();
}
@Override
public String toString() {
return "Complex2(" + this.rawText + ")";
}
}
final class Complex implements ArgumentString {
private final List<ArgumentString> parts;
private final String rawText;
public Complex(String rawText, List<ArgumentString> parts) {
this.parts = parts;
this.rawText = rawText;
}
@Override
public Object get(Map<String, TemplateArgument> arguments) {
StringBuilder result = new StringBuilder();
boolean hasValue = false;
for (ArgumentString part : this.parts) {
Object arg = part.get(arguments);
if (arg != null) {
result.append(arg);
hasValue = true;
}
}
if (!hasValue) return null;
return result.toString();
}
@Override
public String rawValue() {
return this.rawText;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Complex that)) return false;
return this.rawText.equals(that.rawText);
}
@Override
public int hashCode() {
return this.rawText.hashCode();
}
@Override
public String toString() {
return "Complex(" + this.rawText + ")";
}
}
static ArgumentString preParse(String input) {
if (input == null || input.isEmpty()) {
return Literal.literal("");
}
List<ArgumentString> arguments = new ArrayList<>();
StringBuilder currentLiteral = new StringBuilder();
final int n = input.length();
int i = 0;
while (i < n) {
char c = input.charAt(i);
// --- 1. 优先检测占位符触发器 ---
if (c == '$' && i + 1 < n && input.charAt(i + 1) == '{') {
// a. 提交之前的普通文本
if (!currentLiteral.isEmpty()) {
arguments.add(Literal.literal(currentLiteral.toString()));
currentLiteral.setLength(0);
}
// b. 解析占位符内部,此处的逻辑拥有自己的转义规则
int contentStartIndex = i + 2;
StringBuilder keyBuilder = new StringBuilder();
int depth = 1;
int j = contentStartIndex;
boolean foundMatch = false;
while (j < n) {
char innerChar = input.charAt(j);
// --- 占位符内部的转义逻辑 ---
if (innerChar == '\\') {
if (j + 1 < n && (input.charAt(j + 1) == '{' || input.charAt(j + 1) == '}')) {
keyBuilder.append(input.charAt(j + 1));
j += 2;
} else {
// 在占位符内部,一个无法识别的转义\依旧被当作普通\处理
keyBuilder.append(innerChar);
j++;
}
} else if (innerChar == '{') {
depth++;
keyBuilder.append(innerChar);
j++;
} else if (innerChar == '}') {
depth--;
if (depth == 0) { // 找到匹配的闭合括号
arguments.add(Placeholder.placeholder(keyBuilder.toString()));
i = j + 1;
foundMatch = true;
break;
}
keyBuilder.append(innerChar);
j++;
} else {
keyBuilder.append(innerChar);
j++;
}
}
if (foundMatch) {
continue;
} else {
// 未找到闭合括号,将 '$' 视为普通字符
currentLiteral.append(c);
i++;
}
}
// --- 2. 其次,只处理对触发器'$'的转义 ---
else if (c == '\\' && i + 1 < n && input.charAt(i + 1) == '$') {
currentLiteral.append('$'); // 直接添加 '$'
i += 2; // 跳过 '\' 和 '$'
}
// --- 3. 处理所有其他字符(包括独立的'\'和'{')为普通文本 ---
else {
currentLiteral.append(c);
i++;
}
}
if (!currentLiteral.isEmpty()) {
arguments.add(Literal.literal(currentLiteral.toString()));
}
return switch (arguments.size()) {
case 0 -> Literal.literal("");
case 1 -> arguments.getFirst();
case 2 -> new Complex2(input, arguments.get(0), arguments.get(1));
default -> new Complex(input, arguments);
};
}
}

View File

@@ -2,6 +2,7 @@ package net.momirealms.craftengine.core.plugin.config.template;
import net.momirealms.craftengine.core.plugin.Manageable;
import net.momirealms.craftengine.core.plugin.config.ConfigParser;
import net.momirealms.craftengine.core.plugin.config.template.argument.TemplateArgument;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.SNBTReader;
@@ -12,299 +13,9 @@ import java.util.Map;
public interface TemplateManager extends Manageable {
TemplateManager INSTANCE = new TemplateManagerImpl();
ConfigParser parser();
Object applyTemplates(Key id, Object input);
interface ArgumentString {
String rawValue();
Object get(Map<String, TemplateArgument> arguments);
}
final class Literal implements ArgumentString {
private final String value;
public Literal(String value) {
this.value = value;
}
public static Literal literal(String value) {
return new Literal(value);
}
@Override
public String rawValue() {
return this.value;
}
@Override
public Object get(Map<String, TemplateArgument> arguments) {
return this.value;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Literal literal)) return false;
return this.value.equals(literal.value);
}
@Override
public int hashCode() {
return this.value.hashCode();
}
@Override
public String toString() {
return "Literal(" + this.value + ")";
}
}
final class Placeholder implements ArgumentString {
private final String placeholder;
private final String rawText;
private final Object defaultValue;
private final boolean hasDefaultValue;
public Placeholder(String placeholderContent) {
this.rawText = "${" + placeholderContent + "}";
int separatorIndex = placeholderContent.indexOf(":-");
if (separatorIndex == -1) {
this.placeholder = placeholderContent;
this.defaultValue = null;
this.hasDefaultValue = false;
} else {
this.placeholder = placeholderContent.substring(0, separatorIndex);
String defaultValueString = placeholderContent.substring(separatorIndex + 2);
try {
this.defaultValue = new SNBTReader(defaultValueString).deserializeAsJava();
} catch (LocalizedResourceConfigException e) {
e.appendTailArgument(this.placeholder);
throw e;
}
this.hasDefaultValue = true;
}
}
public static Placeholder placeholder(String placeholder) {
return new Placeholder(placeholder);
}
@Override
public Object get(Map<String, TemplateArgument> arguments) {
TemplateArgument replacement = arguments.get(this.placeholder);
if (replacement != null) {
return replacement.get(arguments);
}
if (this.hasDefaultValue) {
return this.defaultValue;
}
throw new LocalizedResourceConfigException("warning.config.template.argument.missing_value", this.rawText);
}
@Override
public String rawValue() {
return this.rawText;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Placeholder that)) return false;
return this.placeholder.equals(that.placeholder);
}
@Override
public int hashCode() {
return this.placeholder.hashCode();
}
@Override
public String toString() {
return "Placeholder(" + this.placeholder + ")";
}
}
final class Complex2 implements ArgumentString {
private final String rawText;
private final ArgumentString arg1;
private final ArgumentString arg2;
public Complex2(String rawText, ArgumentString arg1, ArgumentString arg2) {
this.arg1 = arg1;
this.arg2 = arg2;
this.rawText = rawText;
}
@Override
public Object get(Map<String, TemplateArgument> arguments) {
Object arg1 = this.arg1.get(arguments);
Object arg2 = this.arg2.get(arguments);
if (arg1 == null && arg2 == null) return null;
if (arg1 == null) return String.valueOf(arg2);
if (arg2 == null) return String.valueOf(arg1);
return String.valueOf(arg1) + arg2;
}
@Override
public String rawValue() {
return this.rawText;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Complex that)) return false;
return this.rawText.equals(that.rawText);
}
@Override
public int hashCode() {
return this.rawText.hashCode();
}
@Override
public String toString() {
return "Complex2(" + this.rawText + ")";
}
}
final class Complex implements ArgumentString {
private final List<ArgumentString> parts;
private final String rawText;
public Complex(String rawText, List<ArgumentString> parts) {
this.parts = parts;
this.rawText = rawText;
}
@Override
public Object get(Map<String, TemplateArgument> arguments) {
StringBuilder result = new StringBuilder();
boolean hasValue = false;
for (ArgumentString part : this.parts) {
Object arg = part.get(arguments);
if (arg != null) {
result.append(arg);
hasValue = true;
}
}
if (!hasValue) return null;
return result.toString();
}
@Override
public String rawValue() {
return this.rawText;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Complex that)) return false;
return this.rawText.equals(that.rawText);
}
@Override
public int hashCode() {
return this.rawText.hashCode();
}
@Override
public String toString() {
return "Complex(" + this.rawText + ")";
}
}
static ArgumentString preParse(String input) {
if (input == null || input.isEmpty()) {
return Literal.literal("");
}
List<ArgumentString> arguments = new ArrayList<>();
StringBuilder currentLiteral = new StringBuilder();
final int n = input.length();
int i = 0;
while (i < n) {
char c = input.charAt(i);
// --- 1. 优先检测占位符触发器 ---
if (c == '$' && i + 1 < n && input.charAt(i + 1) == '{') {
// a. 提交之前的普通文本
if (!currentLiteral.isEmpty()) {
arguments.add(Literal.literal(currentLiteral.toString()));
currentLiteral.setLength(0);
}
// b. 解析占位符内部,此处的逻辑拥有自己的转义规则
int contentStartIndex = i + 2;
StringBuilder keyBuilder = new StringBuilder();
int depth = 1;
int j = contentStartIndex;
boolean foundMatch = false;
while (j < n) {
char innerChar = input.charAt(j);
// --- 占位符内部的转义逻辑 ---
if (innerChar == '\\') {
if (j + 1 < n && (input.charAt(j + 1) == '{' || input.charAt(j + 1) == '}')) {
keyBuilder.append(input.charAt(j + 1));
j += 2;
} else {
// 在占位符内部,一个无法识别的转义\依旧被当作普通\处理
keyBuilder.append(innerChar);
j++;
}
} else if (innerChar == '{') {
depth++;
keyBuilder.append(innerChar);
j++;
} else if (innerChar == '}') {
depth--;
if (depth == 0) { // 找到匹配的闭合括号
arguments.add(Placeholder.placeholder(keyBuilder.toString()));
i = j + 1;
foundMatch = true;
break;
}
keyBuilder.append(innerChar);
j++;
} else {
keyBuilder.append(innerChar);
j++;
}
}
if (foundMatch) {
continue;
} else {
// 未找到闭合括号,将 '$' 视为普通字符
currentLiteral.append(c);
i++;
}
}
// --- 2. 其次,只处理对触发器'$'的转义 ---
else if (c == '\\' && i + 1 < n && input.charAt(i + 1) == '$') {
currentLiteral.append('$'); // 直接添加 '$'
i += 2; // 跳过 '\' 和 '$'
}
// --- 3. 处理所有其他字符(包括独立的'\'和'{')为普通文本 ---
else {
currentLiteral.append(c);
i++;
}
}
if (!currentLiteral.isEmpty()) {
arguments.add(Literal.literal(currentLiteral.toString()));
}
return switch (arguments.size()) {
case 0 -> Literal.literal("");
case 1 -> arguments.getFirst();
case 2 -> new Complex2(input, arguments.get(0), arguments.get(1));
default -> new Complex(input, arguments);
};
}
}

View File

@@ -4,6 +4,7 @@ import net.momirealms.craftengine.core.pack.LoadingSequence;
import net.momirealms.craftengine.core.pack.Pack;
import net.momirealms.craftengine.core.plugin.config.ConfigParser;
import net.momirealms.craftengine.core.plugin.config.IdObjectConfigParser;
import net.momirealms.craftengine.core.plugin.config.template.argument.*;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.MiscUtils;
@@ -14,16 +15,16 @@ import java.util.*;
@SuppressWarnings("DuplicatedCode")
public class TemplateManagerImpl implements TemplateManager {
private static final ArgumentString TEMPLATE = Literal.literal("template");
private static final ArgumentString OVERRIDES = Literal.literal("overrides");
private static final ArgumentString ARGUMENTS = Literal.literal("arguments");
private static final ArgumentString MERGES = Literal.literal("merges");
private static final ArgumentString TEMPLATE = ArgumentString.Literal.literal("template");
private static final ArgumentString OVERRIDES = ArgumentString.Literal.literal("overrides");
private static final ArgumentString ARGUMENTS = ArgumentString.Literal.literal("arguments");
private static final ArgumentString MERGES = ArgumentString.Literal.literal("merges");
private final static Set<ArgumentString> NON_TEMPLATE_ARGUMENTS = new HashSet<>(Set.of(TEMPLATE, ARGUMENTS, OVERRIDES, MERGES));
private final Map<Key, Object> templates = new HashMap<>();
private final TemplateParser templateParser;
public TemplateManagerImpl() {
protected TemplateManagerImpl() {
this.templateParser = new TemplateParser();
}
@@ -69,13 +70,13 @@ public class TemplateManagerImpl implements TemplateManager {
));
}
private Object preprocessUnknownValue(Object value) {
public Object preprocessUnknownValue(Object value) {
switch (value) {
case Map<?, ?> map -> {
Map<String, Object> in = MiscUtils.castToMap(map, false);
Map<ArgumentString, Object> out = new LinkedHashMap<>(map.size());
for (Map.Entry<String, Object> entry : in.entrySet()) {
out.put(TemplateManager.preParse(entry.getKey()), preprocessUnknownValue(entry.getValue()));
out.put(ArgumentString.preParse(entry.getKey()), preprocessUnknownValue(entry.getValue()));
}
return out;
}
@@ -87,7 +88,7 @@ public class TemplateManagerImpl implements TemplateManager {
return objList;
}
case String string -> {
return TemplateManager.preParse(string);
return ArgumentString.preParse(string);
}
case null, default -> {
return value;
@@ -188,7 +189,7 @@ public class TemplateManagerImpl implements TemplateManager {
// 处理一个类型未知的值本方法只管将member处理好后传递回调用者a
@SuppressWarnings("unchecked")
private Object processUnknownValue(Object value,
public Object processUnknownValue(Object value,
Map<String, TemplateArgument> arguments) {
switch (value) {
case Map<?, ?> innerMap ->
@@ -237,7 +238,7 @@ public class TemplateManagerImpl implements TemplateManager {
// 如果模板id被用了参数则应先应用参数后再查询模板
Object actualTemplate = templateId.get(parentArguments);
if (actualTemplate == null) continue; // 忽略被null掉的模板
Object template = Optional.ofNullable(this.templates.get(Key.of(actualTemplate.toString())))
Object template = Optional.ofNullable(((TemplateManagerImpl) INSTANCE).templates.get(Key.of(actualTemplate.toString())))
.orElseThrow(() -> new LocalizedResourceConfigException("warning.config.template.invalid", actualTemplate.toString()));
Object processedTemplate = processUnknownValue(template, arguments);
if (processedTemplate != null) templateList.add(processedTemplate);

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;

View File

@@ -1,7 +1,9 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import com.ezylang.evalex.Expression;
import com.ezylang.evalex.data.EvaluationValue;
import net.momirealms.craftengine.core.plugin.config.template.ArgumentString;
import net.momirealms.craftengine.core.plugin.config.template.TemplateManager;
import net.momirealms.craftengine.core.util.Key;
import java.util.Locale;
@@ -11,11 +13,11 @@ import java.util.function.Function;
public class ExpressionTemplateArgument implements TemplateArgument {
public static final Factory FACTORY = new Factory();
private final TemplateManager.ArgumentString expression;
private final ArgumentString expression;
private final ValueType valueType;
protected ExpressionTemplateArgument(String expression, ValueType valueType) {
this.expression = TemplateManager.preParse(expression);
this.expression = ArgumentString.preParse(expression);
this.valueType = valueType;
}

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.util.Key;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.MiscUtils;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.util.Key;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.util.Key;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.util.Key;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.util.Key;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.util.Key;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import java.util.Map;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.registry.Registries;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.plugin.locale.TranslationManager;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.plugin.locale.TranslationManager;

View File

@@ -1,4 +1,4 @@
package net.momirealms.craftengine.core.plugin.config.template;
package net.momirealms.craftengine.core.plugin.config.template.argument;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.ResourceConfigUtils;

View File

@@ -37,7 +37,7 @@ import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory;
import net.momirealms.craftengine.core.pack.model.special.SpecialModelReader;
import net.momirealms.craftengine.core.pack.model.tint.TintFactory;
import net.momirealms.craftengine.core.pack.model.tint.TintReader;
import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory;
import net.momirealms.craftengine.core.plugin.config.template.argument.TemplateArgumentFactory;
import net.momirealms.craftengine.core.plugin.context.Context;
import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory;
import net.momirealms.craftengine.core.plugin.context.function.FunctionFactory;

View File

@@ -37,7 +37,7 @@ import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory;
import net.momirealms.craftengine.core.pack.model.special.SpecialModelReader;
import net.momirealms.craftengine.core.pack.model.tint.TintFactory;
import net.momirealms.craftengine.core.pack.model.tint.TintReader;
import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory;
import net.momirealms.craftengine.core.plugin.config.template.argument.TemplateArgumentFactory;
import net.momirealms.craftengine.core.plugin.context.Context;
import net.momirealms.craftengine.core.plugin.context.condition.ConditionFactory;
import net.momirealms.craftengine.core.plugin.context.function.FunctionFactory;

View File

@@ -1,7 +1,7 @@
org.gradle.jvmargs=-Xmx1G
# Project settings
project_version=0.0.65.13
project_version=0.0.65.13.1
config_version=58
lang_version=40
project_group=net.momirealms