mirror of
https://github.com/Xiao-MoMi/craft-engine.git
synced 2026-01-04 15:41:38 +00:00
添加has_player条件,优化部分情景下物品构建
This commit is contained in:
@@ -5,4 +5,6 @@ import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
|
||||
public interface ConditionalRecipe<T> extends Recipe<T> {
|
||||
|
||||
boolean canUse(final PlayerOptionalContext context);
|
||||
|
||||
boolean hasCondition();
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ public abstract class CustomCraftingTableRecipe<T> extends AbstractGroupedRecipe
|
||||
private final CustomRecipeResult<T> visualResult;
|
||||
private final Function<PlayerOptionalContext>[] craftingFunctions;
|
||||
private final Condition<PlayerOptionalContext> craftingCondition;
|
||||
private final boolean alwaysRebuildResult;
|
||||
|
||||
protected CustomCraftingTableRecipe(Key id,
|
||||
boolean showNotification,
|
||||
@@ -21,12 +22,18 @@ public abstract class CustomCraftingTableRecipe<T> extends AbstractGroupedRecipe
|
||||
String group,
|
||||
CraftingRecipeCategory category,
|
||||
Function<PlayerOptionalContext>[] craftingFunctions,
|
||||
Condition<PlayerOptionalContext> craftingCondition) {
|
||||
Condition<PlayerOptionalContext> craftingCondition,
|
||||
boolean alwaysRebuildResult) {
|
||||
super(id, showNotification, result, group);
|
||||
this.category = category == null ? CraftingRecipeCategory.MISC : category;
|
||||
this.visualResult = visualResult;
|
||||
this.craftingFunctions = craftingFunctions;
|
||||
this.craftingCondition = craftingCondition;
|
||||
this.alwaysRebuildResult = alwaysRebuildResult;
|
||||
}
|
||||
|
||||
public boolean alwaysRebuildOutput() {
|
||||
return alwaysRebuildResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -35,6 +42,11 @@ public abstract class CustomCraftingTableRecipe<T> extends AbstractGroupedRecipe
|
||||
return this.craftingCondition.test(context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCondition() {
|
||||
return this.craftingCondition != null;
|
||||
}
|
||||
|
||||
public CraftingRecipeCategory category() {
|
||||
return this.category;
|
||||
}
|
||||
|
||||
@@ -29,8 +29,9 @@ public class CustomShapedRecipe<T> extends CustomCraftingTableRecipe<T> {
|
||||
CraftingRecipeCategory category,
|
||||
Pattern<T> pattern,
|
||||
Function<PlayerOptionalContext>[] craftingFunctions,
|
||||
Condition<PlayerOptionalContext> craftingCondition) {
|
||||
super(id, showNotification, result, visualResult, group, category, craftingFunctions, craftingCondition);
|
||||
Condition<PlayerOptionalContext> craftingCondition,
|
||||
boolean alwaysRebuildOutput) {
|
||||
super(id, showNotification, result, visualResult, group, category, craftingFunctions, craftingCondition, alwaysRebuildOutput);
|
||||
this.pattern = pattern;
|
||||
this.parsedPattern = pattern.parse();
|
||||
}
|
||||
@@ -176,7 +177,8 @@ public class CustomShapedRecipe<T> extends CustomCraftingTableRecipe<T> {
|
||||
arguments.containsKey("group") ? arguments.get("group").toString() : null, craftingRecipeCategory(arguments),
|
||||
new Pattern<>(pattern.toArray(new String[0]), ingredients),
|
||||
functions(arguments),
|
||||
conditions(arguments)
|
||||
conditions(arguments),
|
||||
ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("always-rebuild-result", true), "always-rebuild-result")
|
||||
);
|
||||
}
|
||||
|
||||
@@ -191,7 +193,8 @@ public class CustomShapedRecipe<T> extends CustomCraftingTableRecipe<T> {
|
||||
VANILLA_RECIPE_HELPER.craftingCategory(json),
|
||||
new Pattern<>(VANILLA_RECIPE_HELPER.craftingShapedPattern(json), ingredients),
|
||||
null,
|
||||
null
|
||||
null,
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
|
||||
import net.momirealms.craftengine.core.plugin.context.function.Function;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
import net.momirealms.craftengine.core.util.MiscUtils;
|
||||
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@@ -28,8 +29,9 @@ public class CustomShapelessRecipe<T> extends CustomCraftingTableRecipe<T> {
|
||||
CraftingRecipeCategory category,
|
||||
List<Ingredient<T>> ingredients,
|
||||
Function<PlayerOptionalContext>[] craftingFunctions,
|
||||
Condition<PlayerOptionalContext> craftingCondition) {
|
||||
super(id, showNotification, result, visualResult, group, category, craftingFunctions, craftingCondition);
|
||||
Condition<PlayerOptionalContext> craftingCondition,
|
||||
boolean alwaysRebuildOutput) {
|
||||
super(id, showNotification, result, visualResult, group, category, craftingFunctions, craftingCondition, alwaysRebuildOutput);
|
||||
this.ingredients = ingredients;
|
||||
this.placementInfo = PlacementInfo.create(ingredients);
|
||||
}
|
||||
@@ -95,7 +97,8 @@ public class CustomShapelessRecipe<T> extends CustomCraftingTableRecipe<T> {
|
||||
arguments.containsKey("group") ? arguments.get("group").toString() : null, craftingRecipeCategory(arguments),
|
||||
ingredients,
|
||||
functions(arguments),
|
||||
conditions(arguments)
|
||||
conditions(arguments),
|
||||
ResourceConfigUtils.getAsBoolean(arguments.getOrDefault("always-rebuild-result", true), "always-rebuild-result")
|
||||
);
|
||||
}
|
||||
|
||||
@@ -108,7 +111,8 @@ public class CustomShapelessRecipe<T> extends CustomCraftingTableRecipe<T> {
|
||||
VANILLA_RECIPE_HELPER.readGroup(json), VANILLA_RECIPE_HELPER.craftingCategory(json),
|
||||
VANILLA_RECIPE_HELPER.shapelessIngredients(json.getAsJsonArray("ingredients")).stream().map(this::toIngredient).toList(),
|
||||
null,
|
||||
null
|
||||
null,
|
||||
false
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,6 +74,11 @@ public class CustomSmithingTransformRecipe<T> extends AbstractedFixedResultRecip
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCondition() {
|
||||
return this.condition != null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public boolean matches(RecipeInput input) {
|
||||
|
||||
@@ -65,6 +65,11 @@ public class CustomSmithingTrimRecipe<T> extends AbstractRecipe<T>
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasCondition() {
|
||||
return this.condition != null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public T assemble(RecipeInput input, ItemBuildContext context) {
|
||||
|
||||
@@ -24,6 +24,7 @@ public class LootConditions {
|
||||
register(CommonConditions.SURVIVES_EXPLOSION, new SurvivesExplosionCondition.FactoryImpl<>());
|
||||
register(CommonConditions.ANY_OF, new AnyOfCondition.FactoryImpl<>(LootConditions::fromMap));
|
||||
register(CommonConditions.ALL_OF, new AllOfCondition.FactoryImpl<>(LootConditions::fromMap));
|
||||
register(CommonConditions.HAS_PLAYER, new HasPlayerCondition.FactoryImpl<>());
|
||||
register(CommonConditions.ENCHANTMENT, new EnchantmentCondition.FactoryImpl<>());
|
||||
register(CommonConditions.INVERTED, new InvertedCondition.FactoryImpl<>(LootConditions::fromMap));
|
||||
register(CommonConditions.FALLING_BLOCK, new FallingBlockCondition.FactoryImpl<>());
|
||||
|
||||
@@ -21,7 +21,7 @@ public class IdAllocator {
|
||||
private final BiMap<String, Integer> forcedIdMap = HashBiMap.create(128);
|
||||
private final BitSet occupiedIdSet = new BitSet();
|
||||
private final Map<String, CompletableFuture<Integer>> pendingAllocations = new LinkedHashMap<>();
|
||||
private final Map<String, Integer> cachedIdMap = new HashMap<>();
|
||||
private final Map<String, Integer> cachedIdMap = new LinkedHashMap<>();
|
||||
|
||||
private long lastModified;
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ import java.util.function.Predicate;
|
||||
|
||||
public class VisualBlockStateAllocator {
|
||||
private final Path cacheFilePath;
|
||||
private final Map<String, BlockStateWrapper> cachedBlockStates = new HashMap<>();
|
||||
private final Map<String, BlockStateWrapper> cachedBlockStates = new LinkedHashMap<>();
|
||||
private final Map<String, Pair<AutoStateGroup, CompletableFuture<BlockStateWrapper>>> pendingAllocations = new LinkedHashMap<>();
|
||||
@SuppressWarnings("unchecked")
|
||||
private final List<Pair<String, CompletableFuture<BlockStateWrapper>>>[] pendingAllocationFutures = new List[AutoStateGroup.values().length];
|
||||
|
||||
@@ -29,4 +29,5 @@ public final class CommonConditions {
|
||||
public static final Key EXPRESSION = Key.from("craftengine:expression");
|
||||
public static final Key IS_NULL = Key.from("craftengine:is_null");
|
||||
public static final Key HAND = Key.from("craftengine:hand");
|
||||
public static final Key HAS_PLAYER = Key.from("craftengine:has_player");
|
||||
}
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
package 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.ContextKey;
|
||||
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
|
||||
import net.momirealms.craftengine.core.util.Key;
|
||||
import net.momirealms.craftengine.core.util.ResourceConfigUtils;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
public class HasPlayerCondition<CTX extends Context> implements Condition<CTX> {
|
||||
|
||||
public HasPlayerCondition() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Key type() {
|
||||
return CommonConditions.IS_NULL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(CTX ctx) {
|
||||
if (ctx instanceof PlayerOptionalContext context) {
|
||||
return context.isPlayerPresent();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static class FactoryImpl<CTX extends Context> implements ConditionFactory<CTX> {
|
||||
|
||||
@Override
|
||||
public Condition<CTX> create(Map<String, Object> arguments) {
|
||||
return new HasPlayerCondition<>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import java.util.Map;
|
||||
public class EventConditions {
|
||||
|
||||
static {
|
||||
register(CommonConditions.HAS_PLAYER, new HasPlayerCondition.FactoryImpl<>());
|
||||
register(CommonConditions.MATCH_ITEM, new MatchItemCondition.FactoryImpl<>());
|
||||
register(CommonConditions.MATCH_ENTITY, new MatchEntityCondition.FactoryImpl<>());
|
||||
register(CommonConditions.MATCH_BLOCK, new MatchBlockCondition.FactoryImpl<>());
|
||||
|
||||
Reference in New Issue
Block a user