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 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, ""); } }