Rename internal CMagicGem implementation
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
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, "");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user