9
0
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:
XiaoMoMi
2025-10-15 15:55:44 +08:00
parent 77e12baaa6
commit 2e84396795
18 changed files with 240 additions and 115 deletions

View File

@@ -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();
}

View File

@@ -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;
}

View File

@@ -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
);
}

View File

@@ -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
);
}
}

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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<>());

View File

@@ -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;

View File

@@ -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];

View File

@@ -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");
}

View File

@@ -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<>();
}
}
}

View File

@@ -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<>());