diff --git a/src/main/java/net/minestom/server/network/NetworkBuffer.java b/src/main/java/net/minestom/server/network/NetworkBuffer.java index 1ab1a971f..8a7e9d3ac 100644 --- a/src/main/java/net/minestom/server/network/NetworkBuffer.java +++ b/src/main/java/net/minestom/server/network/NetworkBuffer.java @@ -42,7 +42,7 @@ public final class NetworkBuffer { public static final Type BLOCK_POSITION = NetworkBufferTypes.BLOCK_POSITION; public static final Type COMPONENT = NetworkBufferTypes.COMPONENT; public static final Type UUID = NetworkBufferTypes.UUID; - public static final Type ITEM = NetworkBufferTypes.ITEM; + public static final Type<@Nullable ItemStack> ITEM = NetworkBufferTypes.ITEM; public static final Type BYTE_ARRAY = NetworkBufferTypes.BYTE_ARRAY; public static final Type LONG_ARRAY = NetworkBufferTypes.LONG_ARRAY; diff --git a/src/main/java/net/minestom/server/network/packet/server/play/DeclareRecipesPacket.java b/src/main/java/net/minestom/server/network/packet/server/play/DeclareRecipesPacket.java index 33ff8b728..5333a844f 100644 --- a/src/main/java/net/minestom/server/network/packet/server/play/DeclareRecipesPacket.java +++ b/src/main/java/net/minestom/server/network/packet/server/play/DeclareRecipesPacket.java @@ -4,7 +4,9 @@ import net.minestom.server.item.ItemStack; import net.minestom.server.network.NetworkBuffer; import net.minestom.server.network.packet.server.ServerPacket; import net.minestom.server.network.packet.server.ServerPacketIdentifier; +import net.minestom.server.recipe.RecipeCategory; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -27,7 +29,8 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem case "smoking" -> new DeclaredSmokingRecipe(reader); case "campfire_cooking" -> new DeclaredCampfireCookingRecipe(reader); case "stonecutting" -> new DeclaredStonecutterRecipe(reader); - case "smithing" -> new DeclaredSmithingRecipe(reader); + case "smithing_trim" -> new DeclaredSmithingTrimRecipe(reader); + case "smithing_transform" -> new DeclaredSmithingTransformRecipe(reader); default -> throw new UnsupportedOperationException("Unrecognized type: " + type); }; })); @@ -50,23 +53,27 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem public sealed interface DeclaredRecipe extends NetworkBuffer.Writer permits DeclaredShapelessCraftingRecipe, DeclaredShapedCraftingRecipe, DeclaredSmeltingRecipe, DeclaredBlastingRecipe, DeclaredSmokingRecipe, - DeclaredCampfireCookingRecipe, DeclaredStonecutterRecipe, DeclaredSmithingRecipe { + DeclaredCampfireCookingRecipe, DeclaredStonecutterRecipe, + DeclaredSmithingTrimRecipe, DeclaredSmithingTransformRecipe { @NotNull String type(); @NotNull String recipeId(); } - public record DeclaredShapelessCraftingRecipe(String recipeId, String group, - List ingredients, - ItemStack result) implements DeclaredRecipe { + public record DeclaredShapelessCraftingRecipe(@NotNull String recipeId, @NotNull String group, + @NotNull RecipeCategory.Crafting crafting, + @NotNull List ingredients, + @NotNull ItemStack result) implements DeclaredRecipe { private DeclaredShapelessCraftingRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), + reader.readEnum(RecipeCategory.Crafting.class), reader.readCollection(Ingredient::new), reader.read(ITEM)); } @Override public void write(@NotNull NetworkBuffer writer) { writer.write(STRING, group); + writer.writeEnum(RecipeCategory.Crafting.class, crafting); writer.writeCollection(ingredients); writer.write(ITEM, result); } @@ -78,14 +85,15 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem } public record DeclaredShapedCraftingRecipe(@NotNull String recipeId, int width, int height, - @NotNull String group, @NotNull List ingredients, - @NotNull ItemStack result) implements DeclaredRecipe { + @NotNull String group, @NotNull RecipeCategory.Crafting category, + @NotNull List ingredients, + @NotNull ItemStack result, boolean showNotification) implements DeclaredRecipe { public DeclaredShapedCraftingRecipe { ingredients = List.copyOf(ingredients); } private DeclaredShapedCraftingRecipe(DeclaredShapedCraftingRecipe packet) { - this(packet.recipeId, packet.width, packet.height, packet.group, packet.ingredients, packet.result); + this(packet.recipeId, packet.width, packet.height, packet.group, packet.category, packet.ingredients, packet.result, packet.showNotification); } public DeclaredShapedCraftingRecipe(@NotNull NetworkBuffer reader) { @@ -98,12 +106,14 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem int width = reader.read(VAR_INT); int height = reader.read(VAR_INT); String group = reader.read(STRING); + RecipeCategory.Crafting category = reader.readEnum(RecipeCategory.Crafting.class); List ingredients = new ArrayList<>(); for (int slot = 0; slot < width * height; slot++) { ingredients.add(new Ingredient(reader)); } ItemStack result = reader.read(ITEM); - return new DeclaredShapedCraftingRecipe(recipeId, width, height, group, ingredients, result); + boolean showNotification = reader.read(BOOLEAN); + return new DeclaredShapedCraftingRecipe(recipeId, width, height, group, category, ingredients, result, showNotification); } @Override @@ -111,10 +121,12 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem writer.write(VAR_INT, width); writer.write(VAR_INT, height); writer.write(STRING, group); + writer.writeEnum(RecipeCategory.Crafting.class, category); for (Ingredient ingredient : ingredients) { ingredient.write(writer); } writer.write(ITEM, result); + writer.write(BOOLEAN, showNotification); } @Override @@ -124,10 +136,12 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem } public record DeclaredSmeltingRecipe(@NotNull String recipeId, @NotNull String group, - @NotNull Ingredient ingredient, @NotNull ItemStack result, - float experience, int cookingTime) implements DeclaredRecipe { + @NotNull RecipeCategory.Cooking category, @NotNull Ingredient ingredient, + @NotNull ItemStack result, float experience, + int cookingTime) implements DeclaredRecipe { public DeclaredSmeltingRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), + reader.readEnum(RecipeCategory.Cooking.class), new Ingredient(reader), reader.read(ITEM), reader.read(FLOAT), reader.read(VAR_INT)); } @@ -135,6 +149,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem @Override public void write(@NotNull NetworkBuffer writer) { writer.write(STRING, group); + writer.writeEnum(RecipeCategory.Cooking.class, category); writer.write(ingredient); writer.write(ITEM, result); writer.write(FLOAT, experience); @@ -148,10 +163,12 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem } public record DeclaredBlastingRecipe(@NotNull String recipeId, @NotNull String group, - @NotNull Ingredient ingredient, @NotNull ItemStack result, - float experience, int cookingTime) implements DeclaredRecipe { + @NotNull RecipeCategory.Cooking category, @NotNull Ingredient ingredient, + @NotNull ItemStack result, float experience, + int cookingTime) implements DeclaredRecipe { public DeclaredBlastingRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), + reader.readEnum(RecipeCategory.Cooking.class), new Ingredient(reader), reader.read(ITEM), reader.read(FLOAT), reader.read(VAR_INT)); } @@ -159,6 +176,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem @Override public void write(@NotNull NetworkBuffer writer) { writer.write(STRING, group); + writer.writeEnum(RecipeCategory.Cooking.class, category); writer.write(ingredient); writer.write(ITEM, result); writer.write(FLOAT, experience); @@ -172,10 +190,12 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem } public record DeclaredSmokingRecipe(@NotNull String recipeId, @NotNull String group, - @NotNull Ingredient ingredient, @NotNull ItemStack result, - float experience, int cookingTime) implements DeclaredRecipe { + @NotNull RecipeCategory.Cooking category, @NotNull Ingredient ingredient, + @NotNull ItemStack result, float experience, + int cookingTime) implements DeclaredRecipe { public DeclaredSmokingRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), + reader.readEnum(RecipeCategory.Cooking.class), new Ingredient(reader), reader.read(ITEM), reader.read(FLOAT), reader.read(VAR_INT)); } @@ -183,6 +203,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem @Override public void write(@NotNull NetworkBuffer writer) { writer.write(STRING, group); + writer.writeEnum(RecipeCategory.Cooking.class, category); writer.write(ingredient); writer.write(ITEM, result); writer.write(FLOAT, experience); @@ -196,10 +217,12 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem } public record DeclaredCampfireCookingRecipe(@NotNull String recipeId, @NotNull String group, - @NotNull Ingredient ingredient, @NotNull ItemStack result, - float experience, int cookingTime) implements DeclaredRecipe { + @NotNull RecipeCategory.Cooking category, @NotNull Ingredient ingredient, + @NotNull ItemStack result, float experience, + int cookingTime) implements DeclaredRecipe { public DeclaredCampfireCookingRecipe(@NotNull NetworkBuffer reader) { this(reader.read(STRING), reader.read(STRING), + reader.readEnum(RecipeCategory.Cooking.class), new Ingredient(reader), reader.read(ITEM), reader.read(FLOAT), reader.read(VAR_INT)); } @@ -207,6 +230,7 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem @Override public void write(@NotNull NetworkBuffer writer) { writer.write(STRING, group); + writer.writeEnum(RecipeCategory.Cooking.class, category); writer.write(ingredient); writer.write(ITEM, result); writer.write(FLOAT, experience); @@ -239,14 +263,16 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem } } - public record DeclaredSmithingRecipe(String recipeId, Ingredient base, Ingredient addition, - ItemStack result) implements DeclaredRecipe { - public DeclaredSmithingRecipe(@NotNull NetworkBuffer reader) { - this(reader.read(STRING), new Ingredient(reader), new Ingredient(reader), reader.read(ITEM)); + public record DeclaredSmithingTransformRecipe(String recipeId, Ingredient template, + Ingredient base, Ingredient addition, + ItemStack result) implements DeclaredRecipe { + public DeclaredSmithingTransformRecipe(@NotNull NetworkBuffer reader) { + this(reader.read(STRING), new Ingredient(reader), new Ingredient(reader), new Ingredient(reader), reader.read(ITEM)); } @Override public void write(@NotNull NetworkBuffer writer) { + writer.write(template); writer.write(base); writer.write(addition); writer.write(ITEM, result); @@ -254,13 +280,32 @@ public record DeclareRecipesPacket(@NotNull List recipes) implem @Override public @NotNull String type() { - return "smithing"; + return "smithing_transform"; } } - public record Ingredient(@NotNull List items) implements NetworkBuffer.Writer { + public record DeclaredSmithingTrimRecipe(String recipeId, Ingredient template, + Ingredient base, Ingredient addition) implements DeclaredRecipe { + public DeclaredSmithingTrimRecipe(@NotNull NetworkBuffer reader) { + this(reader.read(STRING), new Ingredient(reader), new Ingredient(reader), new Ingredient(reader)); + } + + @Override + public void write(@NotNull NetworkBuffer writer) { + writer.write(template); + writer.write(base); + writer.write(addition); + } + + @Override + public @NotNull String type() { + return "smithing_trim"; + } + } + + public record Ingredient(@Nullable List items) implements NetworkBuffer.Writer { public Ingredient { - items = List.copyOf(items); + items = items == null ? null : List.copyOf(items); } public Ingredient(@NotNull NetworkBuffer reader) { diff --git a/src/main/java/net/minestom/server/recipe/BlastingRecipe.java b/src/main/java/net/minestom/server/recipe/BlastingRecipe.java index 6a6bd4ae7..21f43342a 100644 --- a/src/main/java/net/minestom/server/recipe/BlastingRecipe.java +++ b/src/main/java/net/minestom/server/recipe/BlastingRecipe.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; public abstract class BlastingRecipe extends Recipe { private String group; + private RecipeCategory.Cooking category; private DeclareRecipesPacket.Ingredient ingredient; private ItemStack result; private float experience; @@ -14,12 +15,14 @@ public abstract class BlastingRecipe extends Recipe { protected BlastingRecipe( @NotNull String recipeId, @NotNull String group, + @NotNull RecipeCategory.Cooking category, @NotNull ItemStack result, float experience, int cookingTime ) { super(Type.BLASTING, recipeId); this.group = group; + this.category = category; this.result = result; this.experience = experience; this.cookingTime = cookingTime; @@ -34,8 +37,15 @@ public abstract class BlastingRecipe extends Recipe { this.group = group; } - @NotNull - public DeclareRecipesPacket.Ingredient getIngredient() { + public @NotNull RecipeCategory.Cooking getCategory() { + return category; + } + + public void setCategory(@NotNull RecipeCategory.Cooking category) { + this.category = category; + } + + public @NotNull DeclareRecipesPacket.Ingredient getIngredient() { return ingredient; } diff --git a/src/main/java/net/minestom/server/recipe/CampfireCookingRecipe.java b/src/main/java/net/minestom/server/recipe/CampfireCookingRecipe.java index 9c0d72ad6..fa8764145 100644 --- a/src/main/java/net/minestom/server/recipe/CampfireCookingRecipe.java +++ b/src/main/java/net/minestom/server/recipe/CampfireCookingRecipe.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; public abstract class CampfireCookingRecipe extends Recipe { private String group; + private RecipeCategory.Cooking category; private DeclareRecipesPacket.Ingredient ingredient; private ItemStack result; private float experience; @@ -14,12 +15,14 @@ public abstract class CampfireCookingRecipe extends Recipe { protected CampfireCookingRecipe( @NotNull String recipeId, @NotNull String group, + @NotNull RecipeCategory.Cooking category, @NotNull ItemStack result, float experience, int cookingTime ) { super(Type.CAMPFIRE_COOKING, recipeId); this.group = group; + this.category = category; this.result = result; this.experience = experience; this.cookingTime = cookingTime; @@ -34,6 +37,15 @@ public abstract class CampfireCookingRecipe extends Recipe { this.group = group; } + @NotNull + public RecipeCategory.Cooking getCategory() { + return category; + } + + public void setCategory(@NotNull RecipeCategory.Cooking category) { + this.category = category; + } + @NotNull public DeclareRecipesPacket.Ingredient getIngredient() { return ingredient; diff --git a/src/main/java/net/minestom/server/recipe/Recipe.java b/src/main/java/net/minestom/server/recipe/Recipe.java index 2dc87f18c..75246bd53 100644 --- a/src/main/java/net/minestom/server/recipe/Recipe.java +++ b/src/main/java/net/minestom/server/recipe/Recipe.java @@ -32,7 +32,8 @@ public abstract class Recipe { SMOKING, CAMPFIRE_COOKING, STONECUTTING, - SMITHING + SMITHING_TRANSFORM, + SMITHING_TRIM } } diff --git a/src/main/java/net/minestom/server/recipe/RecipeCategory.java b/src/main/java/net/minestom/server/recipe/RecipeCategory.java new file mode 100644 index 000000000..fa1c0ac21 --- /dev/null +++ b/src/main/java/net/minestom/server/recipe/RecipeCategory.java @@ -0,0 +1,11 @@ +package net.minestom.server.recipe; + +public interface RecipeCategory { + enum Cooking { + FOOD, BLOCKS, MISC + } + + enum Crafting { + BUILDING, REDSTONE, EQUIPMENT, MISC + } +} diff --git a/src/main/java/net/minestom/server/recipe/RecipeManager.java b/src/main/java/net/minestom/server/recipe/RecipeManager.java index a5b004e03..ba23a3523 100644 --- a/src/main/java/net/minestom/server/recipe/RecipeManager.java +++ b/src/main/java/net/minestom/server/recipe/RecipeManager.java @@ -50,6 +50,7 @@ public class RecipeManager { new DeclareRecipesPacket.DeclaredShapelessCraftingRecipe( shapelessRecipe.getRecipeId(), shapelessRecipe.getGroup(), + shapelessRecipe.getCategory(), shapelessRecipe.getIngredients(), shapelessRecipe.getResult())); } @@ -61,8 +62,10 @@ public class RecipeManager { shapedRecipe.getWidth(), shapedRecipe.getHeight(), shapedRecipe.getGroup(), + shapedRecipe.getCategory(), shapedRecipe.getIngredients(), - shapedRecipe.getResult())); + shapedRecipe.getResult(), + shapedRecipe.getShowNotification())); } case SMELTING -> { SmeltingRecipe smeltingRecipe = (SmeltingRecipe) recipe; @@ -70,6 +73,7 @@ public class RecipeManager { new DeclareRecipesPacket.DeclaredSmeltingRecipe( smeltingRecipe.getRecipeId(), smeltingRecipe.getGroup(), + smeltingRecipe.getCategory(), smeltingRecipe.getIngredient(), smeltingRecipe.getResult(), smeltingRecipe.getExperience(), @@ -81,6 +85,7 @@ public class RecipeManager { new DeclareRecipesPacket.DeclaredBlastingRecipe( blastingRecipe.getRecipeId(), blastingRecipe.getGroup(), + blastingRecipe.getCategory(), blastingRecipe.getIngredient(), blastingRecipe.getResult(), blastingRecipe.getExperience(), @@ -92,6 +97,7 @@ public class RecipeManager { new DeclareRecipesPacket.DeclaredSmokingRecipe( smokingRecipe.getRecipeId(), smokingRecipe.getGroup(), + smokingRecipe.getCategory(), smokingRecipe.getIngredient(), smokingRecipe.getResult(), smokingRecipe.getExperience(), @@ -103,6 +109,7 @@ public class RecipeManager { new DeclareRecipesPacket.DeclaredCampfireCookingRecipe( campfireCookingRecipe.getRecipeId(), campfireCookingRecipe.getGroup(), + campfireCookingRecipe.getCategory(), campfireCookingRecipe.getIngredient(), campfireCookingRecipe.getResult(), campfireCookingRecipe.getExperience(), @@ -117,14 +124,24 @@ public class RecipeManager { stonecuttingRecipe.getIngredient(), stonecuttingRecipe.getResult())); } - case SMITHING -> { - SmithingRecipe smithingRecipe = (SmithingRecipe) recipe; + case SMITHING_TRANSFORM -> { + SmithingTransformRecipe smithingTransformRecipe = (SmithingTransformRecipe) recipe; recipesCache.add( - new DeclareRecipesPacket.DeclaredSmithingRecipe( - smithingRecipe.getRecipeId(), - smithingRecipe.getBaseIngredient(), - smithingRecipe.getAdditionIngredient(), - smithingRecipe.getResult())); + new DeclareRecipesPacket.DeclaredSmithingTransformRecipe( + smithingTransformRecipe.getRecipeId(), + smithingTransformRecipe.getTemplate(), + smithingTransformRecipe.getBaseIngredient(), + smithingTransformRecipe.getAdditionIngredient(), + smithingTransformRecipe.getResult())); + } + case SMITHING_TRIM -> { + SmithingTrimRecipe smithingTrimRecipe = (SmithingTrimRecipe) recipe; + recipesCache.add( + new DeclareRecipesPacket.DeclaredSmithingTrimRecipe( + smithingTrimRecipe.getRecipeId(), + smithingTrimRecipe.getTemplate(), + smithingTrimRecipe.getBaseIngredient(), + smithingTrimRecipe.getAdditionIngredient())); } } } diff --git a/src/main/java/net/minestom/server/recipe/ShapedRecipe.java b/src/main/java/net/minestom/server/recipe/ShapedRecipe.java index f8f66c99d..5fb9ce295 100644 --- a/src/main/java/net/minestom/server/recipe/ShapedRecipe.java +++ b/src/main/java/net/minestom/server/recipe/ShapedRecipe.java @@ -13,21 +13,26 @@ public abstract class ShapedRecipe extends Recipe { private final int width; private final int height; private String group; + private RecipeCategory.Crafting category; private final List ingredients; private ItemStack result; + private boolean showNotification; protected ShapedRecipe(@NotNull String recipeId, int width, int height, @NotNull String group, + @NotNull RecipeCategory.Crafting category, @Nullable List ingredients, - @NotNull ItemStack result) { + @NotNull ItemStack result, boolean showNotification) { super(Type.SHAPED, recipeId); this.width = width; this.height = height; this.group = group; + this.category = category; this.ingredients = Objects.requireNonNullElseGet(ingredients, LinkedList::new); this.result = result; + this.showNotification = showNotification; } public int getWidth() { @@ -47,6 +52,15 @@ public abstract class ShapedRecipe extends Recipe { this.group = group; } + @NotNull + public RecipeCategory.Crafting getCategory() { + return category; + } + + public void setCategory(@NotNull RecipeCategory.Crafting category) { + this.category = category; + } + public void addIngredient(DeclareRecipesPacket.Ingredient ingredient) { if (ingredients.size() + 1 > width * height) { throw new IndexOutOfBoundsException("You cannot add more ingredients than width*height"); @@ -68,4 +82,12 @@ public abstract class ShapedRecipe extends Recipe { public void setResult(@NotNull ItemStack result) { this.result = result; } + + public boolean getShowNotification() { + return showNotification; + } + + public void setShowNotification(boolean showNotification) { + this.showNotification = showNotification; + } } diff --git a/src/main/java/net/minestom/server/recipe/ShapelessRecipe.java b/src/main/java/net/minestom/server/recipe/ShapelessRecipe.java index 28ca42ab2..343b74ece 100644 --- a/src/main/java/net/minestom/server/recipe/ShapelessRecipe.java +++ b/src/main/java/net/minestom/server/recipe/ShapelessRecipe.java @@ -11,17 +11,20 @@ import java.util.Objects; public abstract class ShapelessRecipe extends Recipe { private String group; + private RecipeCategory.Crafting category; private final List ingredients; private ItemStack result; protected ShapelessRecipe( @NotNull String recipeId, @NotNull String group, + @NotNull RecipeCategory.Crafting category, @Nullable List ingredients, @NotNull ItemStack result ) { super(Type.SHAPELESS, recipeId); this.group = group; + this.category = category; this.ingredients = Objects.requireNonNullElseGet(ingredients, LinkedList::new); this.result = result; } @@ -35,6 +38,15 @@ public abstract class ShapelessRecipe extends Recipe { this.group = group; } + @NotNull + public RecipeCategory.Crafting getCategory() { + return category; + } + + public void setCategory(@NotNull RecipeCategory.Crafting category) { + this.category = category; + } + public void addIngredient(DeclareRecipesPacket.Ingredient ingredient) { ingredients.add(ingredient); } diff --git a/src/main/java/net/minestom/server/recipe/SmeltingRecipe.java b/src/main/java/net/minestom/server/recipe/SmeltingRecipe.java index 6ba216f1c..c01aaee52 100644 --- a/src/main/java/net/minestom/server/recipe/SmeltingRecipe.java +++ b/src/main/java/net/minestom/server/recipe/SmeltingRecipe.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; public abstract class SmeltingRecipe extends Recipe { private String group; + private RecipeCategory.Cooking category; private DeclareRecipesPacket.Ingredient ingredient; private ItemStack result; private float experience; @@ -14,12 +15,14 @@ public abstract class SmeltingRecipe extends Recipe { protected SmeltingRecipe( @NotNull String recipeId, @NotNull String group, + @NotNull RecipeCategory.Cooking category, @NotNull ItemStack result, float experience, int cookingTime ) { super(Type.SMELTING, recipeId); this.group = group; + this.category = category; this.result = result; this.experience = experience; this.cookingTime = cookingTime; @@ -34,8 +37,15 @@ public abstract class SmeltingRecipe extends Recipe { this.group = group; } - @NotNull - public DeclareRecipesPacket.Ingredient getIngredient() { + public @NotNull RecipeCategory.Cooking getCategory() { + return category; + } + + public void setCategory(@NotNull RecipeCategory.Cooking category) { + this.category = category; + } + + public @NotNull DeclareRecipesPacket.Ingredient getIngredient() { return ingredient; } diff --git a/src/main/java/net/minestom/server/recipe/SmithingRecipe.java b/src/main/java/net/minestom/server/recipe/SmithingTransformRecipe.java similarity index 73% rename from src/main/java/net/minestom/server/recipe/SmithingRecipe.java rename to src/main/java/net/minestom/server/recipe/SmithingTransformRecipe.java index 76cb7eee6..b5eecf824 100644 --- a/src/main/java/net/minestom/server/recipe/SmithingRecipe.java +++ b/src/main/java/net/minestom/server/recipe/SmithingTransformRecipe.java @@ -4,23 +4,35 @@ import net.minestom.server.item.ItemStack; import net.minestom.server.network.packet.server.play.DeclareRecipesPacket; import org.jetbrains.annotations.NotNull; -public abstract class SmithingRecipe extends Recipe { +public abstract class SmithingTransformRecipe extends Recipe { + private DeclareRecipesPacket.Ingredient template; private DeclareRecipesPacket.Ingredient baseIngredient; private DeclareRecipesPacket.Ingredient additionIngredient; private ItemStack result; - protected SmithingRecipe( + protected SmithingTransformRecipe( @NotNull String recipeId, + @NotNull DeclareRecipesPacket.Ingredient template, @NotNull DeclareRecipesPacket.Ingredient baseIngredient, @NotNull DeclareRecipesPacket.Ingredient additionIngredient, @NotNull ItemStack result ) { - super(Type.SMITHING, recipeId); + super(Type.SMITHING_TRANSFORM, recipeId); + this.template = template; this.baseIngredient = baseIngredient; this.additionIngredient = additionIngredient; this.result = result; } + @NotNull + public DeclareRecipesPacket.Ingredient getTemplate() { + return template; + } + + public void setTemplate(@NotNull DeclareRecipesPacket.Ingredient template) { + this.template = template; + } + @NotNull public DeclareRecipesPacket.Ingredient getBaseIngredient() { return baseIngredient; diff --git a/src/main/java/net/minestom/server/recipe/SmithingTrimRecipe.java b/src/main/java/net/minestom/server/recipe/SmithingTrimRecipe.java new file mode 100644 index 000000000..f1b61dec9 --- /dev/null +++ b/src/main/java/net/minestom/server/recipe/SmithingTrimRecipe.java @@ -0,0 +1,50 @@ +package net.minestom.server.recipe; + +import net.minestom.server.item.ItemStack; +import net.minestom.server.network.packet.server.play.DeclareRecipesPacket; +import org.jetbrains.annotations.NotNull; + +public abstract class SmithingTrimRecipe extends Recipe { + private DeclareRecipesPacket.Ingredient template; + private DeclareRecipesPacket.Ingredient baseIngredient; + private DeclareRecipesPacket.Ingredient additionIngredient; + + protected SmithingTrimRecipe( + @NotNull String recipeId, + @NotNull DeclareRecipesPacket.Ingredient template, + @NotNull DeclareRecipesPacket.Ingredient baseIngredient, + @NotNull DeclareRecipesPacket.Ingredient additionIngredient + ) { + super(Type.SMITHING_TRIM, recipeId); + this.template = template; + this.baseIngredient = baseIngredient; + this.additionIngredient = additionIngredient; + } + + @NotNull + public DeclareRecipesPacket.Ingredient getTemplate() { + return template; + } + + public void setTemplate(@NotNull DeclareRecipesPacket.Ingredient template) { + this.template = template; + } + + @NotNull + public DeclareRecipesPacket.Ingredient getBaseIngredient() { + return baseIngredient; + } + + public void setBaseIngredient(@NotNull DeclareRecipesPacket.Ingredient baseIngredient) { + this.baseIngredient = baseIngredient; + } + + @NotNull + public DeclareRecipesPacket.Ingredient getAdditionIngredient() { + return additionIngredient; + } + + public void setAdditionIngredient(@NotNull DeclareRecipesPacket.Ingredient additionIngredient) { + this.additionIngredient = additionIngredient; + } +} diff --git a/src/main/java/net/minestom/server/recipe/SmokingRecipe.java b/src/main/java/net/minestom/server/recipe/SmokingRecipe.java index 278dc8457..928b61efa 100644 --- a/src/main/java/net/minestom/server/recipe/SmokingRecipe.java +++ b/src/main/java/net/minestom/server/recipe/SmokingRecipe.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; public abstract class SmokingRecipe extends Recipe { private String group; + private RecipeCategory.Cooking category; private DeclareRecipesPacket.Ingredient ingredient; private ItemStack result; private float experience; @@ -14,12 +15,14 @@ public abstract class SmokingRecipe extends Recipe { protected SmokingRecipe( @NotNull String recipeId, @NotNull String group, + @NotNull RecipeCategory.Cooking category, @NotNull ItemStack result, float experience, int cookingTime ) { super(Type.SMOKING, recipeId); this.group = group; + this.category = category; this.result = result; this.experience = experience; this.cookingTime = cookingTime; @@ -34,6 +37,15 @@ public abstract class SmokingRecipe extends Recipe { this.group = group; } + @NotNull + public RecipeCategory.Cooking getCategory() { + return category; + } + + public void setCategory(@NotNull RecipeCategory.Cooking category) { + this.category = category; + } + @NotNull public DeclareRecipesPacket.Ingredient getIngredient() { return ingredient; diff --git a/src/test/java/net/minestom/server/network/PacketWriteReadTest.java b/src/test/java/net/minestom/server/network/PacketWriteReadTest.java index c7f7661e6..16fb92661 100644 --- a/src/test/java/net/minestom/server/network/PacketWriteReadTest.java +++ b/src/test/java/net/minestom/server/network/PacketWriteReadTest.java @@ -22,6 +22,7 @@ import net.minestom.server.network.packet.server.login.SetCompressionPacket; import net.minestom.server.network.packet.server.play.*; import net.minestom.server.network.packet.server.play.DeclareRecipesPacket.Ingredient; import net.minestom.server.network.packet.server.status.PongPacket; +import net.minestom.server.recipe.RecipeCategory; import net.minestom.server.utils.crypto.KeyUtils; import org.apache.commons.net.util.Base64; import org.jglrxavpok.hephaistos.nbt.NBT; @@ -91,6 +92,7 @@ public class PacketWriteReadTest { List.of(new DeclareRecipesPacket.DeclaredShapelessCraftingRecipe( "minecraft:sticks", "sticks", + RecipeCategory.Crafting.MISC, List.of(new Ingredient(List.of(ItemStack.of(Material.OAK_PLANKS)))), ItemStack.of(Material.STICK) ), @@ -99,10 +101,35 @@ public class PacketWriteReadTest { 1, 2, "", + RecipeCategory.Crafting.MISC, List.of(new Ingredient(List.of(ItemStack.of(Material.COAL))), new Ingredient(List.of(ItemStack.of(Material.STICK)))), - ItemStack.of(Material.TORCH) - )))); + ItemStack.of(Material.TORCH), + true + ), + new DeclareRecipesPacket.DeclaredBlastingRecipe( + "minecraft:coal", + "forging", + RecipeCategory.Cooking.MISC, + new Ingredient(List.of(ItemStack.of(Material.COAL))), + ItemStack.of(Material.IRON_INGOT), + 5, + 5 + ), + new DeclareRecipesPacket.DeclaredSmithingTransformRecipe( + "minecraft:iron_to_diamond", + new Ingredient(List.of(ItemStack.of(Material.COAST_ARMOR_TRIM_SMITHING_TEMPLATE))), + new Ingredient(List.of(ItemStack.of(Material.DIAMOND))), + new Ingredient(List.of(ItemStack.of(Material.IRON_INGOT))), + ItemStack.of(Material.DIAMOND) + ), + new DeclareRecipesPacket.DeclaredSmithingTrimRecipe( + "minecraft:iron_to_coast", + new Ingredient(List.of(ItemStack.of(Material.IRON_INGOT))), + new Ingredient(List.of(ItemStack.of(Material.COAST_ARMOR_TRIM_SMITHING_TEMPLATE))), + new Ingredient(List.of(ItemStack.of(Material.COAL))) + ) + ))); SERVER_PACKETS.add(new DestroyEntitiesPacket(List.of(5, 5, 5))); SERVER_PACKETS.add(new DisconnectPacket(COMPONENT));