Files
MagicGem-Reforged/src/main/java/cn/infstar/magicgem/condition/ConditionEngine.java
T

64 lines
2.7 KiB
Java

package cn.infstar.magicgem.condition;
import cn.infstar.magicgem.config.LanguageManager;
import cn.infstar.magicgem.dsl.Directive;
import cn.infstar.magicgem.expression.DynamicExpression;
import cn.infstar.magicgem.item.ItemMatcher;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.List;
import java.util.Locale;
import java.util.Map;
public final class ConditionEngine {
private final DynamicExpression expressions;
private final ItemMatcher itemMatcher;
private final LanguageManager languages;
public ConditionEngine(DynamicExpression expressions, ItemMatcher itemMatcher, LanguageManager languages) {
this.expressions = expressions;
this.itemMatcher = itemMatcher;
this.languages = languages;
}
public CheckResult check(List<Directive> conditions, Player player, ItemStack item) {
for (Directive condition : conditions) {
CheckResult result = check(condition, player, item);
if (!result.success()) return result;
}
return CheckResult.PASS;
}
public CheckResult check(Directive condition, Player player, ItemStack item) {
String type = condition.type().toLowerCase(Locale.ROOT).replace("_", "");
boolean passed;
try {
passed = switch (type) {
case "papi", "expression" -> expressions.test(condition.argument("false", "p", "expression", "condition", "c"), player, item, Map.of());
case "permission" -> player.hasPermission(condition.argument("", "p", "permission")) == condition.booleanArgument(true, "has");
case "invempty" -> emptySlots(player) >= condition.intArgument(1, "amount");
case "item", "require" -> itemMatcher.matches(item, condition.argument("", "type", "require", "r"));
default -> false;
};
} catch (RuntimeException exception) {
return new CheckResult(false, languages.text("cmagic.condition_parse", "&c条件解析失败: {condition}",
"condition", condition.source()));
}
return passed ? CheckResult.PASS : new CheckResult(false,
condition.argument(languages.text("cmagic.condition_failed", "&c条件不满足: {condition}",
"condition", condition.type()), "tip", "message", "m"));
}
private int emptySlots(Player player) {
int count = 0;
for (ItemStack content : player.getInventory().getStorageContents())
if (content == null || content.getType().isAir()) count++;
return count;
}
public record CheckResult(boolean success, String message) {
public static final CheckResult PASS = new CheckResult(true, "");
}
}