Minestom/src/main/java/net/minestom/server/network/packet/server/play/DeclareRecipesPacket.java

323 lines
13 KiB
Java
Raw Normal View History

2020-04-24 03:25:58 +02:00
package net.minestom.server.network.packet.server.play;
2020-03-29 20:58:30 +02:00
2020-04-24 03:25:58 +02:00
import net.minestom.server.item.ItemStack;
2022-10-29 11:02:22 +02:00
import net.minestom.server.network.NetworkBuffer;
2020-04-24 03:25:58 +02:00
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;
2020-03-29 20:58:30 +02:00
2022-10-29 11:02:22 +02:00
import java.util.ArrayList;
2021-11-30 17:49:41 +01:00
import java.util.List;
2020-03-29 20:58:30 +02:00
2022-10-29 11:02:22 +02:00
import static net.minestom.server.network.NetworkBuffer.*;
2024-03-19 17:42:06 +01:00
public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implements ServerPacket.Play {
public static final int MAX_RECIPES = Short.MAX_VALUE;
public static final int MAX_INGREDIENTS = 128;
2021-11-30 17:49:41 +01:00
public DeclareRecipesPacket {
recipes = List.copyOf(recipes);
2021-04-02 18:13:02 +02:00
}
2020-03-29 20:58:30 +02:00
2022-10-29 11:02:22 +02:00
public DeclareRecipesPacket(@NotNull NetworkBuffer reader) {
this(reader.readCollection(r -> {
final String type = r.read(STRING);
2021-11-30 17:49:41 +01:00
return switch (type) {
case "crafting_shapeless" -> new DeclaredShapelessCraftingRecipe(reader);
case "crafting_shaped" -> new DeclaredShapedCraftingRecipe(reader);
case "smelting" -> new DeclaredSmeltingRecipe(reader);
case "blasting" -> new DeclaredBlastingRecipe(reader);
case "smoking" -> new DeclaredSmokingRecipe(reader);
case "campfire_cooking" -> new DeclaredCampfireCookingRecipe(reader);
case "stonecutting" -> new DeclaredStonecutterRecipe(reader);
case "smithing_trim" -> new DeclaredSmithingTrimRecipe(reader);
case "smithing_transform" -> new DeclaredSmithingTransformRecipe(reader);
2021-11-30 17:49:41 +01:00
default -> throw new UnsupportedOperationException("Unrecognized type: " + type);
};
}, MAX_RECIPES));
2020-03-29 20:58:30 +02:00
}
@Override
2022-10-29 11:02:22 +02:00
public void write(@NotNull NetworkBuffer writer) {
writer.writeCollection(recipes, (bWriter, recipe) -> {
bWriter.write(STRING, recipe.type());
bWriter.write(STRING, recipe.recipeId());
2022-01-02 06:14:19 +01:00
bWriter.write(recipe);
});
}
2020-03-29 20:58:30 +02:00
@Override
2024-03-19 17:42:06 +01:00
public int playId() {
return ServerPacketIdentifier.DECLARE_RECIPES;
2020-03-29 20:58:30 +02:00
}
2022-10-29 11:02:22 +02:00
public sealed interface DeclaredRecipe extends NetworkBuffer.Writer
2021-11-30 17:49:41 +01:00
permits DeclaredShapelessCraftingRecipe, DeclaredShapedCraftingRecipe,
DeclaredSmeltingRecipe, DeclaredBlastingRecipe, DeclaredSmokingRecipe,
DeclaredCampfireCookingRecipe, DeclaredStonecutterRecipe,
DeclaredSmithingTrimRecipe, DeclaredSmithingTransformRecipe {
2021-11-30 17:49:41 +01:00
@NotNull String type();
2021-11-30 17:49:41 +01:00
@NotNull String recipeId();
}
2020-03-29 20:58:30 +02:00
public record DeclaredShapelessCraftingRecipe(@NotNull String recipeId, @NotNull String group,
@NotNull RecipeCategory.Crafting crafting,
@NotNull List<Ingredient> ingredients,
@NotNull ItemStack result) implements DeclaredRecipe {
2022-10-29 11:02:22 +02:00
private DeclaredShapelessCraftingRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING),
reader.readEnum(RecipeCategory.Crafting.class),
reader.readCollection(Ingredient::new, MAX_INGREDIENTS), reader.read(ITEM));
}
@Override
2022-10-29 11:02:22 +02:00
public void write(@NotNull NetworkBuffer writer) {
writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Crafting.class, crafting);
2022-10-29 11:02:22 +02:00
writer.writeCollection(ingredients);
writer.write(ITEM, result);
}
@Override
2021-11-30 17:49:41 +01:00
public @NotNull String type() {
return "crafting_shapeless";
}
}
2020-03-29 20:58:30 +02:00
public record DeclaredShapedCraftingRecipe(@NotNull String recipeId,
@NotNull String group, @NotNull RecipeCategory.Crafting category,
int width, int height, @NotNull List<Ingredient> ingredients,
@NotNull ItemStack result, boolean showNotification) implements DeclaredRecipe {
2021-11-30 17:49:41 +01:00
public DeclaredShapedCraftingRecipe {
ingredients = List.copyOf(ingredients);
}
2020-03-29 20:58:30 +02:00
2022-01-02 07:15:22 +01:00
private DeclaredShapedCraftingRecipe(DeclaredShapedCraftingRecipe packet) {
this(packet.recipeId, packet.group, packet.category, packet.width, packet.height, packet.ingredients, packet.result, packet.showNotification);
2022-01-02 07:15:22 +01:00
}
2022-10-29 11:02:22 +02:00
public DeclaredShapedCraftingRecipe(@NotNull NetworkBuffer reader) {
2022-01-02 07:15:22 +01:00
this(read(reader));
}
2022-10-29 11:02:22 +02:00
private static DeclaredShapedCraftingRecipe read(@NotNull NetworkBuffer reader) {
2022-01-02 07:15:22 +01:00
2022-10-29 11:02:22 +02:00
String recipeId = reader.read(STRING);
String group = reader.read(STRING);
RecipeCategory.Crafting category = reader.readEnum(RecipeCategory.Crafting.class);
int width = reader.read(VAR_INT);
int height = reader.read(VAR_INT);
2022-01-02 07:15:22 +01:00
List<Ingredient> ingredients = new ArrayList<>();
for (int slot = 0; slot < width * height; slot++) {
ingredients.add(new Ingredient(reader));
}
2022-10-29 11:02:22 +02:00
ItemStack result = reader.read(ITEM);
boolean showNotification = reader.read(BOOLEAN);
return new DeclaredShapedCraftingRecipe(recipeId, group, category, width, height, ingredients, result, showNotification);
}
@Override
2022-10-29 11:02:22 +02:00
public void write(@NotNull NetworkBuffer writer) {
writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Crafting.class, category);
writer.write(VAR_INT, width);
writer.write(VAR_INT, height);
2022-01-02 06:14:19 +01:00
for (Ingredient ingredient : ingredients) {
ingredient.write(writer);
}
2022-10-29 11:02:22 +02:00
writer.write(ITEM, result);
writer.write(BOOLEAN, showNotification);
}
@Override
2021-11-30 17:49:41 +01:00
public @NotNull String type() {
return "crafting_shaped";
}
}
2020-03-29 20:58:30 +02:00
2021-11-30 17:49:41 +01:00
public record DeclaredSmeltingRecipe(@NotNull String recipeId, @NotNull String group,
@NotNull RecipeCategory.Cooking category, @NotNull Ingredient ingredient,
@NotNull ItemStack result, float experience,
int cookingTime) implements DeclaredRecipe {
2022-10-29 11:02:22 +02:00
public DeclaredSmeltingRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING),
reader.readEnum(RecipeCategory.Cooking.class),
2022-10-29 11:02:22 +02:00
new Ingredient(reader), reader.read(ITEM),
reader.read(FLOAT), reader.read(VAR_INT));
}
@Override
2022-10-29 11:02:22 +02:00
public void write(@NotNull NetworkBuffer writer) {
writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Cooking.class, category);
2021-11-30 17:49:41 +01:00
writer.write(ingredient);
2022-10-29 11:02:22 +02:00
writer.write(ITEM, result);
writer.write(FLOAT, experience);
writer.write(VAR_INT, cookingTime);
}
@Override
2021-11-30 17:49:41 +01:00
public @NotNull String type() {
return "smelting";
}
}
2020-03-29 20:58:30 +02:00
2021-11-30 17:49:41 +01:00
public record DeclaredBlastingRecipe(@NotNull String recipeId, @NotNull String group,
@NotNull RecipeCategory.Cooking category, @NotNull Ingredient ingredient,
@NotNull ItemStack result, float experience,
int cookingTime) implements DeclaredRecipe {
2022-10-29 11:02:22 +02:00
public DeclaredBlastingRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING),
reader.readEnum(RecipeCategory.Cooking.class),
2022-10-29 11:02:22 +02:00
new Ingredient(reader), reader.read(ITEM),
reader.read(FLOAT), reader.read(VAR_INT));
}
@Override
2022-10-29 11:02:22 +02:00
public void write(@NotNull NetworkBuffer writer) {
writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Cooking.class, category);
2021-11-30 17:49:41 +01:00
writer.write(ingredient);
2022-10-29 11:02:22 +02:00
writer.write(ITEM, result);
writer.write(FLOAT, experience);
writer.write(VAR_INT, cookingTime);
}
@Override
2021-11-30 17:49:41 +01:00
public @NotNull String type() {
return "blasting";
}
}
2021-11-30 17:49:41 +01:00
public record DeclaredSmokingRecipe(@NotNull String recipeId, @NotNull String group,
@NotNull RecipeCategory.Cooking category, @NotNull Ingredient ingredient,
@NotNull ItemStack result, float experience,
int cookingTime) implements DeclaredRecipe {
2022-10-29 11:02:22 +02:00
public DeclaredSmokingRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING),
reader.readEnum(RecipeCategory.Cooking.class),
2022-10-29 11:02:22 +02:00
new Ingredient(reader), reader.read(ITEM),
reader.read(FLOAT), reader.read(VAR_INT));
}
@Override
2022-10-29 11:02:22 +02:00
public void write(@NotNull NetworkBuffer writer) {
writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Cooking.class, category);
2021-11-30 17:49:41 +01:00
writer.write(ingredient);
2022-10-29 11:02:22 +02:00
writer.write(ITEM, result);
writer.write(FLOAT, experience);
writer.write(VAR_INT, cookingTime);
}
@Override
2021-11-30 17:49:41 +01:00
public @NotNull String type() {
return "smoking";
}
}
2021-11-30 17:49:41 +01:00
public record DeclaredCampfireCookingRecipe(@NotNull String recipeId, @NotNull String group,
@NotNull RecipeCategory.Cooking category, @NotNull Ingredient ingredient,
@NotNull ItemStack result, float experience,
int cookingTime) implements DeclaredRecipe {
2022-10-29 11:02:22 +02:00
public DeclaredCampfireCookingRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING),
reader.readEnum(RecipeCategory.Cooking.class),
2022-10-29 11:02:22 +02:00
new Ingredient(reader), reader.read(ITEM),
reader.read(FLOAT), reader.read(VAR_INT));
}
@Override
2022-10-29 11:02:22 +02:00
public void write(@NotNull NetworkBuffer writer) {
writer.write(STRING, group);
writer.writeEnum(RecipeCategory.Cooking.class, category);
2021-11-30 17:49:41 +01:00
writer.write(ingredient);
2022-10-29 11:02:22 +02:00
writer.write(ITEM, result);
writer.write(FLOAT, experience);
writer.write(VAR_INT, cookingTime);
}
@Override
2021-11-30 17:49:41 +01:00
public @NotNull String type() {
return "campfire_cooking";
}
}
2021-11-30 17:49:41 +01:00
public record DeclaredStonecutterRecipe(String recipeId, String group,
Ingredient ingredient, ItemStack result) implements DeclaredRecipe {
2022-10-29 11:02:22 +02:00
public DeclaredStonecutterRecipe(@NotNull NetworkBuffer reader) {
this(reader.read(STRING), reader.read(STRING),
new Ingredient(reader), reader.read(ITEM));
}
@Override
2022-10-29 11:02:22 +02:00
public void write(@NotNull NetworkBuffer writer) {
writer.write(STRING, group);
2021-11-30 17:49:41 +01:00
writer.write(ingredient);
2022-10-29 11:02:22 +02:00
writer.write(ITEM, result);
}
@Override
2021-11-30 17:49:41 +01:00
public @NotNull String type() {
return "stonecutting";
}
}
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
2022-10-29 11:02:22 +02:00
public void write(@NotNull NetworkBuffer writer) {
writer.write(template);
2021-11-30 17:49:41 +01:00
writer.write(base);
writer.write(addition);
2022-10-29 11:02:22 +02:00
writer.write(ITEM, result);
2020-03-29 20:58:30 +02:00
}
@Override
2021-11-30 17:49:41 +01:00
public @NotNull String type() {
return "smithing_transform";
}
}
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";
}
2020-03-29 20:58:30 +02:00
}
public record Ingredient(@Nullable List<ItemStack> items) implements NetworkBuffer.Writer {
2021-11-30 17:49:41 +01:00
public Ingredient {
items = items == null ? null : List.copyOf(items);
2021-11-30 17:49:41 +01:00
}
2020-03-29 20:58:30 +02:00
2022-10-29 11:02:22 +02:00
public Ingredient(@NotNull NetworkBuffer reader) {
this(reader.readCollection(ITEM, MAX_INGREDIENTS));
2020-03-29 20:58:30 +02:00
}
2022-10-29 11:02:22 +02:00
public void write(@NotNull NetworkBuffer writer) {
writer.writeCollection(ITEM, items);
}
2020-03-29 20:58:30 +02:00
}
}