diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/Category.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/Category.java index deb353317..639ccbbfc 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/Category.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/Category.java @@ -1,5 +1,7 @@ package net.momirealms.craftengine.core.plugin.gui.category; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.util.Key; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -15,9 +17,9 @@ public class Category implements Comparable { private final List members; private final int priority; private final boolean hidden; - private final String permission; + private final Condition condition; - public Category(Key id, String displayName, List displayLore, Key icon, List members, int priority, boolean hidden, String permission) { + public Category(Key id, String displayName, List displayLore, Key icon, List members, int priority, boolean hidden, Condition condition) { this.id = id; this.displayName = displayName; this.members = new ArrayList<>(members); @@ -25,7 +27,7 @@ public class Category implements Comparable { this.priority = priority; this.displayLore = new ArrayList<>(displayLore); this.hidden = hidden; - this.permission = permission; + this.condition = condition; } public void addMember(String member) { @@ -49,8 +51,8 @@ public class Category implements Comparable { } @Nullable - public String permission() { - return permission; + public Condition condition() { + return condition; } public List displayLore() { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java index ee60fa95a..4b1446046 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java @@ -13,8 +13,12 @@ import net.momirealms.craftengine.core.pack.Pack; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.config.ConfigParser; import net.momirealms.craftengine.core.plugin.config.IdSectionConfigParser; +import net.momirealms.craftengine.core.plugin.context.Condition; +import net.momirealms.craftengine.core.plugin.context.Context; import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; +import net.momirealms.craftengine.core.plugin.context.condition.AllOfCondition; +import net.momirealms.craftengine.core.plugin.context.event.EventConditions; import net.momirealms.craftengine.core.plugin.gui.*; import net.momirealms.craftengine.core.plugin.gui.Ingredient; import net.momirealms.craftengine.core.util.*; @@ -117,8 +121,9 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { int priority = ResourceConfigUtils.getAsInt(section.getOrDefault("priority", 0), "priority"); List lore = MiscUtils.getAsStringList(section.getOrDefault("lore", List.of())); boolean hidden = ResourceConfigUtils.getAsBoolean(section.getOrDefault("hidden", false), "hidden"); - String permission = ResourceConfigUtils.getAsStringOrNull(section.get("permission")); - Category category = new Category(id, name, lore, icon, new ArrayList<>(members), priority, hidden, permission); + List> conditionList = ResourceConfigUtils.parseConfigAsList(ResourceConfigUtils.get(section, "conditions", "condition"), EventConditions::fromMap); + Condition conditions = conditionList.isEmpty() ? null : conditionList.size() == 1 ? conditionList.getFirst() : new AllOfCondition<>(conditionList); + Category category = new Category(id, name, lore, icon, new ArrayList<>(members), priority, hidden, conditions); if (ItemBrowserManagerImpl.this.byId.containsKey(id)) { ItemBrowserManagerImpl.this.byId.get(id).merge(category); } else { @@ -159,7 +164,8 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { ); List iconList = this.categoryOnMainPage.stream().map(it -> { - if (it.permission() != null && !player.hasPermission(it.permission())) { + Condition condition = it.condition(); + if (condition != null && !condition.test(PlayerOptionalContext.of(player))) { return null; } Item item = this.plugin.itemManager().createWrappedItem(it.icon(), player); @@ -250,9 +256,11 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager { if (subCategory == null) { item = Objects.requireNonNull(this.plugin.itemManager().createWrappedItem(ItemKeys.BARRIER, player)); item.customNameJson(AdventureHelper.componentToJson(Component.text(subCategoryId).color(NamedTextColor.RED).decoration(TextDecoration.ITALIC, false))); - } else if (subCategory.permission() != null && !player.hasPermission(subCategory.permission())) { - return null; } else { + Condition condition = subCategory.condition(); + if (condition != null && !condition.test(PlayerOptionalContext.of(player))) { + return null; + } item = this.plugin.itemManager().createWrappedItem(subCategory.icon(), player); if (ItemUtils.isEmpty(item)) { if (!subCategory.icon().equals(ItemKeys.AIR)) {