9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-21 16:09:26 +00:00

向锻造配方添加visual-result支持

This commit is contained in:
XiaoMoMi
2025-10-15 04:16:15 +08:00
parent 864273dadf
commit 39dab8ef52
17 changed files with 168 additions and 52 deletions

View File

@@ -22,7 +22,10 @@ import net.momirealms.craftengine.core.item.recipe.UniqueIdItem;
import net.momirealms.craftengine.core.pack.AbstractPackManager; import net.momirealms.craftengine.core.pack.AbstractPackManager;
import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.util.GsonHelper;
import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.UniqueKey;
import net.momirealms.craftengine.core.util.VersionHelper;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;

View File

@@ -643,6 +643,7 @@ public class RecipeEventListener implements Listener {
} }
Player player = InventoryUtils.getPlayerFromInventoryEvent(event); Player player = InventoryUtils.getPlayerFromInventoryEvent(event);
BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player); BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player);
// todo shift点击应该更好地处理包括function执行次数也是
if (craftingTableRecipe.hasVisualResult()) { if (craftingTableRecipe.hasVisualResult()) {
if (event.isShiftClick()) { if (event.isShiftClick()) {
event.setCancelled(true); event.setCancelled(true);
@@ -651,7 +652,7 @@ public class RecipeEventListener implements Listener {
CraftingInput<ItemStack> input = getCraftingInput(inventory); CraftingInput<ItemStack> input = getCraftingInput(inventory);
inventory.setResult(craftingTableRecipe.assemble(input, ItemBuildContext.of(serverPlayer))); inventory.setResult(craftingTableRecipe.assemble(input, ItemBuildContext.of(serverPlayer)));
} }
Function<PlayerOptionalContext>[] functions = craftingTableRecipe.craftingFunctions(); Function<PlayerOptionalContext>[] functions = craftingTableRecipe.functions();
if (functions != null) { if (functions != null) {
PlayerOptionalContext context = PlayerOptionalContext.of(serverPlayer); PlayerOptionalContext context = PlayerOptionalContext.of(serverPlayer);
for (Function<PlayerOptionalContext> function : functions) { for (Function<PlayerOptionalContext> function : functions) {
@@ -660,6 +661,53 @@ public class RecipeEventListener implements Listener {
} }
} }
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onSmithingFinish(SmithItemEvent event) {
if (!Config.enableRecipeSystem() || !VersionHelper.PREMIUM) return;
org.bukkit.inventory.Recipe recipe = event.getInventory().getRecipe();
if (recipe instanceof SmithingTransformRecipe transformRecipe) {
Key recipeId = Key.of(transformRecipe.getKey().namespace(), transformRecipe.getKey().value());
Optional<Recipe<ItemStack>> optionalRecipe = this.recipeManager.recipeById(recipeId);
// 也许是其他插件注册的配方,直接无视
if (optionalRecipe.isEmpty() || !(optionalRecipe.get() instanceof CustomSmithingTransformRecipe<ItemStack> smithingRecipe)) {
return;
}
SmithingInventory inventory = event.getInventory();
Player player = InventoryUtils.getPlayerFromInventoryEvent(event);
BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player);
if (smithingRecipe.hasVisualResult()) {
if (event.isShiftClick()) {
event.setCancelled(true);
return;
}
SmithingInput<ItemStack> input = getSmithingInput(inventory);
inventory.setResult(smithingRecipe.assemble(input, ItemBuildContext.of(serverPlayer)));
}
Function<PlayerOptionalContext>[] functions = smithingRecipe.functions();
if (functions != null) {
PlayerOptionalContext context = PlayerOptionalContext.of(serverPlayer);
for (Function<PlayerOptionalContext> function : functions) {
function.run(context);
}
}
} else if (recipe instanceof SmithingTrimRecipe trimRecipe) {
Key recipeId = Key.of(trimRecipe.getKey().namespace(), trimRecipe.getKey().value());
Optional<Recipe<ItemStack>> optionalRecipe = this.recipeManager.recipeById(recipeId);
if (optionalRecipe.isEmpty() || !(optionalRecipe.get() instanceof CustomSmithingTrimRecipe<ItemStack> smithingRecipe)) {
return;
}
Player player = InventoryUtils.getPlayerFromInventoryEvent(event);
BukkitServerPlayer serverPlayer = BukkitAdaptors.adapt(player);
Function<PlayerOptionalContext>[] functions = smithingRecipe.functions();
if (functions != null) {
PlayerOptionalContext context = PlayerOptionalContext.of(serverPlayer);
for (Function<PlayerOptionalContext> function : functions) {
function.run(context);
}
}
}
}
private CraftingInput<ItemStack> getCraftingInput(CraftingInventory inventory) { private CraftingInput<ItemStack> getCraftingInput(CraftingInventory inventory) {
ItemStack[] ingredients = inventory.getMatrix(); ItemStack[] ingredients = inventory.getMatrix();
List<UniqueIdItem<ItemStack>> uniqueIdItems = new ArrayList<>(); List<UniqueIdItem<ItemStack>> uniqueIdItems = new ArrayList<>();
@@ -712,7 +760,6 @@ public class RecipeEventListener implements Listener {
event.setResult(null); event.setResult(null);
return; return;
} }
SmithingInput<ItemStack> input = getSmithingInput(inventory); SmithingInput<ItemStack> input = getSmithingInput(inventory);
if (smithingTrimRecipe.matches(input)) { if (smithingTrimRecipe.matches(input)) {
ItemStack result = smithingTrimRecipe.assemble(getSmithingInput(inventory), itemBuildContext); ItemStack result = smithingTrimRecipe.assemble(getSmithingInput(inventory), itemBuildContext);
@@ -736,11 +783,19 @@ public class RecipeEventListener implements Listener {
event.setResult(null); event.setResult(null);
return; return;
} }
Player player = InventoryUtils.getPlayerFromInventoryEvent(event);
ItemBuildContext itemBuildContext = ItemBuildContext.of(BukkitAdaptors.adapt(player));
if (!smithingTransformRecipe.canUse(itemBuildContext)) {
event.setResult(null);
return;
}
SmithingInput<ItemStack> input = getSmithingInput(inventory); SmithingInput<ItemStack> input = getSmithingInput(inventory);
if (smithingTransformRecipe.matches(input)) { if (smithingTransformRecipe.matches(input)) {
Player player = InventoryUtils.getPlayerFromInventoryEvent(event); if (smithingTransformRecipe.hasVisualResult() && VersionHelper.PREMIUM) {
ItemStack processed = smithingTransformRecipe.assemble(input, ItemBuildContext.of(BukkitAdaptors.adapt(player))); event.setResult(smithingTransformRecipe.assembleVisual(input, itemBuildContext));
event.setResult(processed); } else {
event.setResult(smithingTransformRecipe.assemble(input, itemBuildContext));
}
} else { } else {
event.setResult(null); event.setResult(null);
} }

View File

@@ -6,8 +6,6 @@ import net.momirealms.craftengine.bukkit.plugin.command.feature.*;
import net.momirealms.craftengine.core.plugin.command.AbstractCommandManager; import net.momirealms.craftengine.core.plugin.command.AbstractCommandManager;
import net.momirealms.craftengine.core.plugin.command.CommandFeature; import net.momirealms.craftengine.core.plugin.command.CommandFeature;
import net.momirealms.craftengine.core.plugin.command.sender.Sender; import net.momirealms.craftengine.core.plugin.command.sender.Sender;
import net.momirealms.craftengine.core.util.ReflectionUtils;
import net.momirealms.craftengine.core.util.VersionHelper;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.incendo.cloud.SenderMapper; import org.incendo.cloud.SenderMapper;
import org.incendo.cloud.bukkit.CloudBukkitCapabilities; import org.incendo.cloud.bukkit.CloudBukkitCapabilities;

View File

@@ -119,7 +119,6 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiConsumer;
import java.util.function.BiFunction; import java.util.function.BiFunction;
public class BukkitNetworkManager implements NetworkManager, Listener, PluginMessageListener { public class BukkitNetworkManager implements NetworkManager, Listener, PluginMessageListener {

View File

@@ -11,7 +11,6 @@ import net.momirealms.craftengine.core.pack.model.ModernItemModel;
import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator; import net.momirealms.craftengine.core.pack.model.generation.ModelGenerator;
import net.momirealms.craftengine.core.plugin.Manageable; import net.momirealms.craftengine.core.plugin.Manageable;
import net.momirealms.craftengine.core.plugin.config.ConfigParser; import net.momirealms.craftengine.core.plugin.config.ConfigParser;
import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Key;
import net.momirealms.craftengine.core.util.UniqueKey; import net.momirealms.craftengine.core.util.UniqueKey;
import org.incendo.cloud.suggestion.Suggestion; import org.incendo.cloud.suggestion.Suggestion;

View File

@@ -5,7 +5,7 @@ import net.momirealms.craftengine.core.item.recipe.input.RecipeInput;
import net.momirealms.craftengine.core.item.recipe.result.CustomRecipeResult; import net.momirealms.craftengine.core.item.recipe.result.CustomRecipeResult;
import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Key;
public abstract class AbstractedFixedResultRecipe<T> extends AbstractRecipe<T> { public abstract class AbstractedFixedResultRecipe<T> extends AbstractRecipe<T> implements FixedResultRecipe<T> {
protected CustomRecipeResult<T> result; protected CustomRecipeResult<T> result;
public AbstractedFixedResultRecipe(Key id, boolean showNotification, CustomRecipeResult<T> result) { public AbstractedFixedResultRecipe(Key id, boolean showNotification, CustomRecipeResult<T> result) {
@@ -13,10 +13,7 @@ public abstract class AbstractedFixedResultRecipe<T> extends AbstractRecipe<T> {
this.result = result; this.result = result;
} }
public T result(ItemBuildContext context) { @Override
return this.result.buildItemStack(context);
}
public CustomRecipeResult<T> result() { public CustomRecipeResult<T> result() {
return this.result; return this.result;
} }

View File

@@ -2,7 +2,7 @@ package net.momirealms.craftengine.core.item.recipe;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
public interface ConditionalRecipe { public interface ConditionalRecipe<T> extends Recipe<T> {
boolean canUse(final PlayerOptionalContext context); boolean canUse(final PlayerOptionalContext context);
} }

View File

@@ -1,8 +1,5 @@
package net.momirealms.craftengine.core.item.recipe; package net.momirealms.craftengine.core.item.recipe;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.recipe.input.RecipeInput;
import net.momirealms.craftengine.core.item.recipe.result.CustomRecipeResult; import net.momirealms.craftengine.core.item.recipe.result.CustomRecipeResult;
import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Condition;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
@@ -10,7 +7,8 @@ import net.momirealms.craftengine.core.plugin.context.function.Function;
import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.Key;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public abstract class CustomCraftingTableRecipe<T> extends AbstractGroupedRecipe<T> implements ConditionalRecipe { public abstract class CustomCraftingTableRecipe<T> extends AbstractGroupedRecipe<T>
implements ConditionalRecipe<T>, VisualResultRecipe<T>, FunctionalRecipe<T> {
protected final CraftingRecipeCategory category; protected final CraftingRecipeCategory category;
private final CustomRecipeResult<T> visualResult; private final CustomRecipeResult<T> visualResult;
private final Function<PlayerOptionalContext>[] craftingFunctions; private final Function<PlayerOptionalContext>[] craftingFunctions;
@@ -38,7 +36,7 @@ public abstract class CustomCraftingTableRecipe<T> extends AbstractGroupedRecipe
} }
public CraftingRecipeCategory category() { public CraftingRecipeCategory category() {
return category; return this.category;
} }
@Override @Override
@@ -46,31 +44,13 @@ public abstract class CustomCraftingTableRecipe<T> extends AbstractGroupedRecipe
return RecipeType.CRAFTING; return RecipeType.CRAFTING;
} }
@Override
public CustomRecipeResult<T> visualResult() { public CustomRecipeResult<T> visualResult() {
return visualResult; return this.visualResult;
} }
public boolean hasVisualResult() { @Override
return visualResult != null; public Function<PlayerOptionalContext>[] functions() {
} return this.craftingFunctions;
public T assembleVisual(RecipeInput input, ItemBuildContext context) {
if (this.visualResult != null) {
return this.visualResult.buildItemStack(context);
} else {
throw new IllegalStateException("No visual result available");
}
}
public Item<T> buildVisualOrActualResult(ItemBuildContext context) {
if (this.visualResult != null) {
return this.visualResult.buildItem(context);
} else {
return super.result.buildItem(context);
}
}
public Function<PlayerOptionalContext>[] craftingFunctions() {
return craftingFunctions;
} }
} }

View File

@@ -9,6 +9,7 @@ import net.momirealms.craftengine.core.item.recipe.result.CustomRecipeResult;
import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Condition;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
import net.momirealms.craftengine.core.plugin.context.function.Function;
import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException;
import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.BuiltInRegistries;
import net.momirealms.craftengine.core.registry.Registries; import net.momirealms.craftengine.core.registry.Registries;
@@ -22,7 +23,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
public class CustomSmithingTransformRecipe<T> extends AbstractedFixedResultRecipe<T> implements ConditionalRecipe { public class CustomSmithingTransformRecipe<T> extends AbstractedFixedResultRecipe<T>
implements ConditionalRecipe<T>, VisualResultRecipe<T>, FunctionalRecipe<T> {
public static final Serializer<?> SERIALIZER = new Serializer<>(); public static final Serializer<?> SERIALIZER = new Serializer<>();
private final Ingredient<T> base; private final Ingredient<T> base;
private final Ingredient<T> template; private final Ingredient<T> template;
@@ -30,6 +32,8 @@ public class CustomSmithingTransformRecipe<T> extends AbstractedFixedResultRecip
private final boolean mergeComponents; private final boolean mergeComponents;
private final List<ItemDataProcessor> processors; private final List<ItemDataProcessor> processors;
private final Condition<PlayerOptionalContext> condition; private final Condition<PlayerOptionalContext> condition;
private final Function<PlayerOptionalContext>[] smithingFunctions;
private final CustomRecipeResult<T> visualResult;
public CustomSmithingTransformRecipe(Key id, public CustomSmithingTransformRecipe(Key id,
boolean showNotification, boolean showNotification,
@@ -37,8 +41,10 @@ public class CustomSmithingTransformRecipe<T> extends AbstractedFixedResultRecip
@NotNull Ingredient<T> base, @NotNull Ingredient<T> base,
@Nullable Ingredient<T> addition, @Nullable Ingredient<T> addition,
CustomRecipeResult<T> result, CustomRecipeResult<T> result,
@Nullable CustomRecipeResult<T> visualResult,
List<ItemDataProcessor> processors, List<ItemDataProcessor> processors,
boolean mergeComponents, boolean mergeComponents,
Function<PlayerOptionalContext>[] smithingFunctions,
Condition<PlayerOptionalContext> condition Condition<PlayerOptionalContext> condition
) { ) {
super(id, showNotification, result); super(id, showNotification, result);
@@ -48,6 +54,18 @@ public class CustomSmithingTransformRecipe<T> extends AbstractedFixedResultRecip
this.processors = processors; this.processors = processors;
this.mergeComponents = mergeComponents; this.mergeComponents = mergeComponents;
this.condition = condition; this.condition = condition;
this.smithingFunctions = smithingFunctions;
this.visualResult = visualResult;
}
@Override
public Function<PlayerOptionalContext>[] functions() {
return this.smithingFunctions;
}
@Override
public @Nullable CustomRecipeResult<T> visualResult() {
return this.visualResult;
} }
@Override @Override
@@ -150,9 +168,10 @@ public class CustomSmithingTransformRecipe<T> extends AbstractedFixedResultRecip
ResourceConfigUtils.requireNonNullOrThrow(toIngredient(base), "warning.config.recipe.smithing_transform.missing_base"), ResourceConfigUtils.requireNonNullOrThrow(toIngredient(base), "warning.config.recipe.smithing_transform.missing_base"),
toIngredient(addition), toIngredient(addition),
parseResult(arguments), parseResult(arguments),
parseVisualResult(arguments),
ItemDataProcessors.fromMapList(processors), ItemDataProcessors.fromMapList(processors),
mergeComponents, mergeComponents,
conditions(arguments) functions(arguments), conditions(arguments)
); );
} }
@@ -166,8 +185,9 @@ public class CustomSmithingTransformRecipe<T> extends AbstractedFixedResultRecip
toIngredient(VANILLA_RECIPE_HELPER.singleIngredient(json.get("addition"))), toIngredient(VANILLA_RECIPE_HELPER.singleIngredient(json.get("addition"))),
parseResult(VANILLA_RECIPE_HELPER.smithingResult(json.getAsJsonObject("result"))), parseResult(VANILLA_RECIPE_HELPER.smithingResult(json.getAsJsonObject("result"))),
null, null,
null,
true, true,
null null, null
); );
} }
} }

View File

@@ -8,6 +8,7 @@ import net.momirealms.craftengine.core.item.recipe.input.SmithingInput;
import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.context.Condition; import net.momirealms.craftengine.core.plugin.context.Condition;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; 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.Key;
import net.momirealms.craftengine.core.util.MiscUtils; import net.momirealms.craftengine.core.util.MiscUtils;
import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceConfigUtils;
@@ -20,7 +21,8 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
public class CustomSmithingTrimRecipe<T> extends AbstractRecipe<T> implements ConditionalRecipe { public class CustomSmithingTrimRecipe<T> extends AbstractRecipe<T>
implements ConditionalRecipe<T>, FunctionalRecipe<T> {
public static final Serializer<?> SERIALIZER = new Serializer<>(); public static final Serializer<?> SERIALIZER = new Serializer<>();
private final Ingredient<T> base; private final Ingredient<T> base;
private final Ingredient<T> template; private final Ingredient<T> template;
@@ -29,6 +31,7 @@ public class CustomSmithingTrimRecipe<T> extends AbstractRecipe<T> implements Co
private final Key pattern; private final Key pattern;
@Nullable @Nullable
private final Condition<PlayerOptionalContext> condition; private final Condition<PlayerOptionalContext> condition;
private final Function<PlayerOptionalContext>[] smithingFunctions;
public CustomSmithingTrimRecipe(@NotNull Key id, public CustomSmithingTrimRecipe(@NotNull Key id,
boolean showNotification, boolean showNotification,
@@ -36,6 +39,7 @@ public class CustomSmithingTrimRecipe<T> extends AbstractRecipe<T> implements Co
@NotNull Ingredient<T> base, @NotNull Ingredient<T> base,
@NotNull Ingredient<T> addition, @NotNull Ingredient<T> addition,
@Nullable Key pattern, @Nullable Key pattern,
Function<PlayerOptionalContext>[] smithingFunctions,
@Nullable Condition<PlayerOptionalContext> condition @Nullable Condition<PlayerOptionalContext> condition
) { ) {
super(id, showNotification); super(id, showNotification);
@@ -44,11 +48,17 @@ public class CustomSmithingTrimRecipe<T> extends AbstractRecipe<T> implements Co
this.addition = addition; this.addition = addition;
this.pattern = pattern; this.pattern = pattern;
this.condition = condition; this.condition = condition;
this.smithingFunctions = smithingFunctions;
if (pattern == null && VersionHelper.isOrAbove1_21_5()) { if (pattern == null && VersionHelper.isOrAbove1_21_5()) {
throw new IllegalStateException("SmithingTrimRecipe cannot have a null pattern on 1.21.5 and above."); throw new IllegalStateException("SmithingTrimRecipe cannot have a null pattern on 1.21.5 and above.");
} }
} }
@Override
public Function<PlayerOptionalContext>[] functions() {
return this.smithingFunctions;
}
@Override @Override
public boolean canUse(PlayerOptionalContext context) { public boolean canUse(PlayerOptionalContext context) {
if (this.condition != null) return this.condition.test(context); if (this.condition != null) return this.condition.test(context);
@@ -135,6 +145,7 @@ public class CustomSmithingTrimRecipe<T> extends AbstractRecipe<T> implements Co
ResourceConfigUtils.requireNonNullOrThrow(toIngredient(base), "warning.config.recipe.smithing_trim.missing_base"), ResourceConfigUtils.requireNonNullOrThrow(toIngredient(base), "warning.config.recipe.smithing_trim.missing_base"),
ResourceConfigUtils.requireNonNullOrThrow(toIngredient(addition), "warning.config.recipe.smithing_trim.missing_addition"), ResourceConfigUtils.requireNonNullOrThrow(toIngredient(addition), "warning.config.recipe.smithing_trim.missing_addition"),
pattern, pattern,
functions(arguments),
conditions(arguments) conditions(arguments)
); );
} }
@@ -147,6 +158,7 @@ public class CustomSmithingTrimRecipe<T> extends AbstractRecipe<T> implements Co
Objects.requireNonNull(toIngredient(VANILLA_RECIPE_HELPER.singleIngredient(json.get("base")))), Objects.requireNonNull(toIngredient(VANILLA_RECIPE_HELPER.singleIngredient(json.get("base")))),
Objects.requireNonNull(toIngredient(VANILLA_RECIPE_HELPER.singleIngredient(json.get("addition")))), Objects.requireNonNull(toIngredient(VANILLA_RECIPE_HELPER.singleIngredient(json.get("addition")))),
VersionHelper.isOrAbove1_21_5() ? Key.of(json.get("pattern").getAsString()) : null, VersionHelper.isOrAbove1_21_5() ? Key.of(json.get("pattern").getAsString()) : null,
null,
null null
); );
} }

View File

@@ -0,0 +1,13 @@
package net.momirealms.craftengine.core.item.recipe;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.recipe.result.CustomRecipeResult;
public interface FixedResultRecipe<T> extends Recipe<T> {
CustomRecipeResult<T> result();
default T result(ItemBuildContext context) {
return this.result().buildItemStack(context);
}
}

View File

@@ -0,0 +1,10 @@
package net.momirealms.craftengine.core.item.recipe;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
import net.momirealms.craftengine.core.plugin.context.function.Function;
public interface FunctionalRecipe<T> extends Recipe<T> {
Function<PlayerOptionalContext>[] functions();
}

View File

@@ -0,0 +1,33 @@
package net.momirealms.craftengine.core.item.recipe;
import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.ItemBuildContext;
import net.momirealms.craftengine.core.item.recipe.input.RecipeInput;
import net.momirealms.craftengine.core.item.recipe.result.CustomRecipeResult;
import org.jetbrains.annotations.Nullable;
public interface VisualResultRecipe<T> extends FixedResultRecipe<T> {
@Nullable
CustomRecipeResult<T> visualResult();
default boolean hasVisualResult() {
return visualResult() != null;
}
default T assembleVisual(RecipeInput input, ItemBuildContext context) {
CustomRecipeResult<T> result = visualResult();
if (result != null) {
return result.buildItemStack(context);
}
return null;
}
default Item<T> buildVisualOrActualResult(ItemBuildContext context) {
CustomRecipeResult<T> visualResult = visualResult();
if (visualResult != null) {
return visualResult.buildItem(context);
} else {
return this.result().buildItem(context);
}
}
}

View File

@@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.item.recipe.network.legacy;
import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.FriendlyByteBuf; import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.util.VersionHelper;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;

View File

@@ -2,7 +2,6 @@ package net.momirealms.craftengine.core.item.recipe.network.legacy;
import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.FriendlyByteBuf; import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;

View File

@@ -1,7 +1,6 @@
package net.momirealms.craftengine.core.item.recipe.network.legacy; package net.momirealms.craftengine.core.item.recipe.network.legacy;
import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.Item;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.util.FriendlyByteBuf; import net.momirealms.craftengine.core.util.FriendlyByteBuf;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;

View File

@@ -50,7 +50,7 @@ byte_buddy_version=1.17.8
ahocorasick_version=0.6.3 ahocorasick_version=0.6.3
snake_yaml_version=2.5 snake_yaml_version=2.5
anti_grief_version=1.0.2 anti_grief_version=1.0.2
nms_helper_version=1.0.113 nms_helper_version=1.0.114
evalex_version=3.5.0 evalex_version=3.5.0
reactive_streams_version=1.0.4 reactive_streams_version=1.0.4
amazon_awssdk_version=2.34.5 amazon_awssdk_version=2.34.5