64 lines
2.7 KiB
Java
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, "");
|
|
}
|
|
}
|