mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2025-12-19 15:09:15 +00:00
优化聚合条件
This commit is contained in:
@@ -15,11 +15,11 @@ import net.momirealms.craftengine.core.loot.LootContext;
|
|||||||
import net.momirealms.craftengine.core.plugin.context.Condition;
|
import net.momirealms.craftengine.core.plugin.context.Condition;
|
||||||
import net.momirealms.craftengine.core.plugin.context.Context;
|
import net.momirealms.craftengine.core.plugin.context.Context;
|
||||||
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
|
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
|
||||||
import net.momirealms.craftengine.core.plugin.context.condition.AllOfCondition;
|
|
||||||
import net.momirealms.craftengine.core.plugin.context.event.EventConditions;
|
import net.momirealms.craftengine.core.plugin.context.event.EventConditions;
|
||||||
import net.momirealms.craftengine.core.plugin.context.number.NumberProvider;
|
import net.momirealms.craftengine.core.plugin.context.number.NumberProvider;
|
||||||
import net.momirealms.craftengine.core.plugin.context.number.NumberProviders;
|
import net.momirealms.craftengine.core.plugin.context.number.NumberProviders;
|
||||||
import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters;
|
import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters;
|
||||||
|
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||||
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||||
import net.momirealms.craftengine.core.world.BlockPos;
|
import net.momirealms.craftengine.core.world.BlockPos;
|
||||||
import net.momirealms.craftengine.core.world.Vec3d;
|
import net.momirealms.craftengine.core.world.Vec3d;
|
||||||
@@ -30,16 +30,17 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
public class DropExperienceBlockBehavior extends BukkitBlockBehavior {
|
public class DropExperienceBlockBehavior extends BukkitBlockBehavior {
|
||||||
public static final Factory FACTORY = new Factory();
|
public static final Factory FACTORY = new Factory();
|
||||||
private final NumberProvider amount;
|
private final NumberProvider amount;
|
||||||
private final Condition<Context> conditions;
|
private final Predicate<Context> condition;
|
||||||
|
|
||||||
public DropExperienceBlockBehavior(CustomBlock customBlock, NumberProvider amount, Condition<Context> conditions) {
|
public DropExperienceBlockBehavior(CustomBlock customBlock, NumberProvider amount, Predicate<Context> condition) {
|
||||||
super(customBlock);
|
super(customBlock);
|
||||||
this.amount = amount;
|
this.amount = amount;
|
||||||
this.conditions = conditions;
|
this.condition = condition;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -76,7 +77,7 @@ public class DropExperienceBlockBehavior extends BukkitBlockBehavior {
|
|||||||
.withParameter(DirectContextParameters.ITEM_IN_HAND, item)
|
.withParameter(DirectContextParameters.ITEM_IN_HAND, item)
|
||||||
.build();
|
.build();
|
||||||
LootContext context = new LootContext(world, null, 1.0f, holder);
|
LootContext context = new LootContext(world, null, 1.0f, holder);
|
||||||
if (this.conditions != null && !this.conditions.test(context)) {
|
if (!this.condition.test(context)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int finalAmount = this.amount.getInt(context);
|
int finalAmount = this.amount.getInt(context);
|
||||||
@@ -91,14 +92,8 @@ public class DropExperienceBlockBehavior extends BukkitBlockBehavior {
|
|||||||
@Override
|
@Override
|
||||||
public BlockBehavior create(CustomBlock block, Map<String, Object> arguments) {
|
public BlockBehavior create(CustomBlock block, Map<String, Object> arguments) {
|
||||||
NumberProvider amount = NumberProviders.fromObject(ResourceConfigUtils.get(arguments, "amount", "count"));
|
NumberProvider amount = NumberProviders.fromObject(ResourceConfigUtils.get(arguments, "amount", "count"));
|
||||||
Condition<Context> conditions = null;
|
|
||||||
List<Condition<Context>> conditionList = ResourceConfigUtils.parseConfigAsList(ResourceConfigUtils.get(arguments, "conditions", "condition"), EventConditions::fromMap);
|
List<Condition<Context>> conditionList = ResourceConfigUtils.parseConfigAsList(ResourceConfigUtils.get(arguments, "conditions", "condition"), EventConditions::fromMap);
|
||||||
if (conditionList.size() == 1) {
|
return new DropExperienceBlockBehavior(block, amount, MiscUtils.allOf(conditionList));
|
||||||
conditions = conditionList.getFirst();
|
|
||||||
} else if (!conditionList.isEmpty()) {
|
|
||||||
conditions = new AllOfCondition<>(conditionList);
|
|
||||||
}
|
|
||||||
return new DropExperienceBlockBehavior(block, amount, conditions);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import io.netty.handler.codec.MessageToMessageDecoder;
|
|||||||
import io.netty.handler.codec.MessageToMessageEncoder;
|
import io.netty.handler.codec.MessageToMessageEncoder;
|
||||||
import io.netty.util.internal.logging.InternalLogger;
|
import io.netty.util.internal.logging.InternalLogger;
|
||||||
import io.netty.util.internal.logging.InternalLoggerFactory;
|
import io.netty.util.internal.logging.InternalLoggerFactory;
|
||||||
import io.papermc.paper.event.player.AsyncPlayerSpawnLocationEvent;
|
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
|
||||||
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
|
||||||
@@ -130,7 +129,6 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
|
||||||
import java.util.function.BiFunction;
|
import java.util.function.BiFunction;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
package net.momirealms.craftengine.core.plugin.gui.category;
|
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.plugin.context.Context;
|
||||||
import net.momirealms.craftengine.core.util.Key;
|
import net.momirealms.craftengine.core.util.Key;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
public class Category implements Comparable<Category> {
|
public class Category implements Comparable<Category> {
|
||||||
private final Key id;
|
private final Key id;
|
||||||
@@ -17,9 +16,9 @@ public class Category implements Comparable<Category> {
|
|||||||
private final List<String> members;
|
private final List<String> members;
|
||||||
private final int priority;
|
private final int priority;
|
||||||
private final boolean hidden;
|
private final boolean hidden;
|
||||||
private final Condition<Context> condition;
|
private final Predicate<Context> condition;
|
||||||
|
|
||||||
public Category(Key id, String displayName, List<String> displayLore, Key icon, List<String> members, int priority, boolean hidden, Condition<Context> condition) {
|
public Category(Key id, String displayName, List<String> displayLore, Key icon, List<String> members, int priority, boolean hidden, Predicate<Context> condition) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.displayName = displayName;
|
this.displayName = displayName;
|
||||||
this.members = new ArrayList<>(members);
|
this.members = new ArrayList<>(members);
|
||||||
@@ -50,8 +49,8 @@ public class Category implements Comparable<Category> {
|
|||||||
return hidden;
|
return hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@NotNull
|
||||||
public Condition<Context> condition() {
|
public Predicate<Context> condition() {
|
||||||
return condition;
|
return condition;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import net.momirealms.craftengine.core.plugin.context.Condition;
|
|||||||
import net.momirealms.craftengine.core.plugin.context.Context;
|
import net.momirealms.craftengine.core.plugin.context.Context;
|
||||||
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
|
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
|
||||||
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
|
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.context.event.EventConditions;
|
||||||
import net.momirealms.craftengine.core.plugin.gui.*;
|
import net.momirealms.craftengine.core.plugin.gui.*;
|
||||||
import net.momirealms.craftengine.core.plugin.gui.Ingredient;
|
import net.momirealms.craftengine.core.plugin.gui.Ingredient;
|
||||||
@@ -127,8 +126,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager {
|
|||||||
List<String> lore = MiscUtils.getAsStringList(section.getOrDefault("lore", List.of()));
|
List<String> lore = MiscUtils.getAsStringList(section.getOrDefault("lore", List.of()));
|
||||||
boolean hidden = ResourceConfigUtils.getAsBoolean(section.getOrDefault("hidden", false), "hidden");
|
boolean hidden = ResourceConfigUtils.getAsBoolean(section.getOrDefault("hidden", false), "hidden");
|
||||||
List<Condition<Context>> conditionList = ResourceConfigUtils.parseConfigAsList(ResourceConfigUtils.get(section, "conditions", "condition"), EventConditions::fromMap);
|
List<Condition<Context>> conditionList = ResourceConfigUtils.parseConfigAsList(ResourceConfigUtils.get(section, "conditions", "condition"), EventConditions::fromMap);
|
||||||
Condition<Context> 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, MiscUtils.allOf(conditionList));
|
||||||
Category category = new Category(id, name, lore, icon, new ArrayList<>(members), priority, hidden, conditions);
|
|
||||||
if (ItemBrowserManagerImpl.this.byId.containsKey(id)) {
|
if (ItemBrowserManagerImpl.this.byId.containsKey(id)) {
|
||||||
ItemBrowserManagerImpl.this.byId.get(id).merge(category);
|
ItemBrowserManagerImpl.this.byId.get(id).merge(category);
|
||||||
} else {
|
} else {
|
||||||
@@ -169,8 +167,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager {
|
|||||||
);
|
);
|
||||||
|
|
||||||
List<ItemWithAction> iconList = this.categoryOnMainPage.stream().map(it -> {
|
List<ItemWithAction> iconList = this.categoryOnMainPage.stream().map(it -> {
|
||||||
Condition<Context> condition = it.condition();
|
if (!it.condition().test(PlayerOptionalContext.of(player))) {
|
||||||
if (condition != null && !condition.test(PlayerOptionalContext.of(player))) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
Item<?> item = this.plugin.itemManager().createWrappedItem(it.icon(), player);
|
Item<?> item = this.plugin.itemManager().createWrappedItem(it.icon(), player);
|
||||||
@@ -262,8 +259,7 @@ public class ItemBrowserManagerImpl implements ItemBrowserManager {
|
|||||||
item = Objects.requireNonNull(this.plugin.itemManager().createWrappedItem(ItemKeys.BARRIER, player));
|
item = Objects.requireNonNull(this.plugin.itemManager().createWrappedItem(ItemKeys.BARRIER, player));
|
||||||
item.customNameJson(AdventureHelper.componentToJson(Component.text(subCategoryId).color(NamedTextColor.RED).decoration(TextDecoration.ITALIC, false)));
|
item.customNameJson(AdventureHelper.componentToJson(Component.text(subCategoryId).color(NamedTextColor.RED).decoration(TextDecoration.ITALIC, false)));
|
||||||
} else {
|
} else {
|
||||||
Condition<Context> condition = subCategory.condition();
|
if (!subCategory.condition().test(PlayerOptionalContext.of(player))) {
|
||||||
if (condition != null && !condition.test(PlayerOptionalContext.of(player))) {
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
item = this.plugin.itemManager().createWrappedItem(subCategory.icon(), player);
|
item = this.plugin.itemManager().createWrappedItem(subCategory.icon(), player);
|
||||||
|
|||||||
Reference in New Issue
Block a user