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:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user