mirror of
https://github.com/Minestom/Minestom.git
synced 2024-06-28 23:44:58 +02:00
fix: do not allow writing air in declare recipes packet (added ItemStack.STRICT_NETWORK_TYPE to represent this)
This commit is contained in:
parent
1cb848d1b9
commit
0400af8013
|
@ -140,6 +140,22 @@ public class Main {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
MinecraftServer.getRecipeManager().addRecipe(ironBlockRecipe);
|
MinecraftServer.getRecipeManager().addRecipe(ironBlockRecipe);
|
||||||
|
// var recipe = new ShapelessRecipe(
|
||||||
|
// "minestom:test2", "abc",
|
||||||
|
// RecipeCategory.Crafting.MISC,
|
||||||
|
// List.of(
|
||||||
|
// new DeclareRecipesPacket.Ingredient(List.of(ItemStack.AIR))
|
||||||
|
// ),
|
||||||
|
// ItemStack.builder(Material.GOLD_BLOCK)
|
||||||
|
// .set(ItemComponent.CUSTOM_NAME, Component.text("abc"))
|
||||||
|
// .build()
|
||||||
|
// ) {
|
||||||
|
// @Override
|
||||||
|
// public boolean shouldShow(@NotNull Player player) {
|
||||||
|
// return true;
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
// MinecraftServer.getRecipeManager().addRecipe(recipe);
|
||||||
|
|
||||||
PlayerInit.init();
|
PlayerInit.init();
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ public sealed interface ItemStack extends TagReadable, ItemComponentMap, HoverEv
|
||||||
@NotNull ItemStack AIR = ItemStack.of(Material.AIR);
|
@NotNull ItemStack AIR = ItemStack.of(Material.AIR);
|
||||||
|
|
||||||
@NotNull NetworkBuffer.Type<ItemStack> NETWORK_TYPE = ItemStackImpl.NETWORK_TYPE;
|
@NotNull NetworkBuffer.Type<ItemStack> NETWORK_TYPE = ItemStackImpl.NETWORK_TYPE;
|
||||||
|
@NotNull NetworkBuffer.Type<ItemStack> STRICT_NETWORK_TYPE = ItemStackImpl.STRICT_NETWORK_TYPE;
|
||||||
@NotNull BinaryTagSerializer<ItemStack> NBT_TYPE = ItemStackImpl.NBT_TYPE;
|
@NotNull BinaryTagSerializer<ItemStack> NBT_TYPE = ItemStackImpl.NBT_TYPE;
|
||||||
|
|
||||||
@Contract(value = "_ -> new", pure = true)
|
@Contract(value = "_ -> new", pure = true)
|
||||||
|
|
|
@ -37,6 +37,13 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component
|
||||||
return new ItemStackImpl(material, amount, components);
|
return new ItemStackImpl(material, amount, components);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
static final NetworkBuffer.Type<ItemStack> STRICT_NETWORK_TYPE = NETWORK_TYPE.map(itemStack -> {
|
||||||
|
Check.argCondition(itemStack.amount() == 0 || itemStack.isAir(), "ItemStack cannot be empty");
|
||||||
|
return itemStack;
|
||||||
|
}, itemStack -> {
|
||||||
|
Check.argCondition(itemStack.amount() == 0 || itemStack.isAir(), "ItemStack cannot be empty");
|
||||||
|
return itemStack;
|
||||||
|
});
|
||||||
static final BinaryTagSerializer<ItemStack> NBT_TYPE = BinaryTagSerializer.COMPOUND.map(ItemStackImpl::fromCompound, ItemStackImpl::toCompound);
|
static final BinaryTagSerializer<ItemStack> NBT_TYPE = BinaryTagSerializer.COMPOUND.map(ItemStackImpl::fromCompound, ItemStackImpl::toCompound);
|
||||||
|
|
||||||
static ItemStack create(Material material, int amount, ItemComponentPatch components) {
|
static ItemStack create(Material material, int amount, ItemComponentPatch components) {
|
||||||
|
|
|
@ -71,7 +71,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
private DeclaredShapelessCraftingRecipe(@NotNull NetworkBuffer reader) {
|
private DeclaredShapelessCraftingRecipe(@NotNull NetworkBuffer reader) {
|
||||||
this(reader.read(STRING), reader.read(STRING),
|
this(reader.read(STRING), reader.read(STRING),
|
||||||
reader.readEnum(RecipeCategory.Crafting.class),
|
reader.readEnum(RecipeCategory.Crafting.class),
|
||||||
reader.readCollection(Ingredient::new, MAX_INGREDIENTS), reader.read(ItemStack.NETWORK_TYPE));
|
reader.readCollection(Ingredient::new, MAX_INGREDIENTS), reader.read(ItemStack.STRICT_NETWORK_TYPE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -79,7 +79,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
writer.write(STRING, group);
|
writer.write(STRING, group);
|
||||||
writer.writeEnum(RecipeCategory.Crafting.class, crafting);
|
writer.writeEnum(RecipeCategory.Crafting.class, crafting);
|
||||||
writer.writeCollection(ingredients);
|
writer.writeCollection(ingredients);
|
||||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -105,7 +105,6 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
}
|
}
|
||||||
|
|
||||||
private static DeclaredShapedCraftingRecipe read(@NotNull NetworkBuffer reader) {
|
private static DeclaredShapedCraftingRecipe read(@NotNull NetworkBuffer reader) {
|
||||||
|
|
||||||
String recipeId = reader.read(STRING);
|
String recipeId = reader.read(STRING);
|
||||||
String group = reader.read(STRING);
|
String group = reader.read(STRING);
|
||||||
RecipeCategory.Crafting category = reader.readEnum(RecipeCategory.Crafting.class);
|
RecipeCategory.Crafting category = reader.readEnum(RecipeCategory.Crafting.class);
|
||||||
|
@ -115,7 +114,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
for (int slot = 0; slot < width * height; slot++) {
|
for (int slot = 0; slot < width * height; slot++) {
|
||||||
ingredients.add(new Ingredient(reader));
|
ingredients.add(new Ingredient(reader));
|
||||||
}
|
}
|
||||||
ItemStack result = reader.read(ItemStack.NETWORK_TYPE);
|
ItemStack result = reader.read(ItemStack.STRICT_NETWORK_TYPE);
|
||||||
boolean showNotification = reader.read(BOOLEAN);
|
boolean showNotification = reader.read(BOOLEAN);
|
||||||
return new DeclaredShapedCraftingRecipe(recipeId, group, category, width, height, ingredients, result, showNotification);
|
return new DeclaredShapedCraftingRecipe(recipeId, group, category, width, height, ingredients, result, showNotification);
|
||||||
}
|
}
|
||||||
|
@ -129,7 +128,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
for (Ingredient ingredient : ingredients) {
|
for (Ingredient ingredient : ingredients) {
|
||||||
ingredient.write(writer);
|
ingredient.write(writer);
|
||||||
}
|
}
|
||||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||||
writer.write(BOOLEAN, showNotification);
|
writer.write(BOOLEAN, showNotification);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +145,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
public DeclaredSmeltingRecipe(@NotNull NetworkBuffer reader) {
|
public DeclaredSmeltingRecipe(@NotNull NetworkBuffer reader) {
|
||||||
this(reader.read(STRING), reader.read(STRING),
|
this(reader.read(STRING), reader.read(STRING),
|
||||||
reader.readEnum(RecipeCategory.Cooking.class),
|
reader.readEnum(RecipeCategory.Cooking.class),
|
||||||
new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE),
|
new Ingredient(reader), reader.read(ItemStack.STRICT_NETWORK_TYPE),
|
||||||
reader.read(FLOAT), reader.read(VAR_INT));
|
reader.read(FLOAT), reader.read(VAR_INT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,7 +154,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
writer.write(STRING, group);
|
writer.write(STRING, group);
|
||||||
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
||||||
writer.write(ingredient);
|
writer.write(ingredient);
|
||||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||||
writer.write(FLOAT, experience);
|
writer.write(FLOAT, experience);
|
||||||
writer.write(VAR_INT, cookingTime);
|
writer.write(VAR_INT, cookingTime);
|
||||||
}
|
}
|
||||||
|
@ -173,7 +172,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
public DeclaredBlastingRecipe(@NotNull NetworkBuffer reader) {
|
public DeclaredBlastingRecipe(@NotNull NetworkBuffer reader) {
|
||||||
this(reader.read(STRING), reader.read(STRING),
|
this(reader.read(STRING), reader.read(STRING),
|
||||||
reader.readEnum(RecipeCategory.Cooking.class),
|
reader.readEnum(RecipeCategory.Cooking.class),
|
||||||
new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE),
|
new Ingredient(reader), reader.read(ItemStack.STRICT_NETWORK_TYPE),
|
||||||
reader.read(FLOAT), reader.read(VAR_INT));
|
reader.read(FLOAT), reader.read(VAR_INT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,7 +181,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
writer.write(STRING, group);
|
writer.write(STRING, group);
|
||||||
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
||||||
writer.write(ingredient);
|
writer.write(ingredient);
|
||||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||||
writer.write(FLOAT, experience);
|
writer.write(FLOAT, experience);
|
||||||
writer.write(VAR_INT, cookingTime);
|
writer.write(VAR_INT, cookingTime);
|
||||||
}
|
}
|
||||||
|
@ -200,7 +199,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
public DeclaredSmokingRecipe(@NotNull NetworkBuffer reader) {
|
public DeclaredSmokingRecipe(@NotNull NetworkBuffer reader) {
|
||||||
this(reader.read(STRING), reader.read(STRING),
|
this(reader.read(STRING), reader.read(STRING),
|
||||||
reader.readEnum(RecipeCategory.Cooking.class),
|
reader.readEnum(RecipeCategory.Cooking.class),
|
||||||
new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE),
|
new Ingredient(reader), reader.read(ItemStack.STRICT_NETWORK_TYPE),
|
||||||
reader.read(FLOAT), reader.read(VAR_INT));
|
reader.read(FLOAT), reader.read(VAR_INT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,7 +208,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
writer.write(STRING, group);
|
writer.write(STRING, group);
|
||||||
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
||||||
writer.write(ingredient);
|
writer.write(ingredient);
|
||||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||||
writer.write(FLOAT, experience);
|
writer.write(FLOAT, experience);
|
||||||
writer.write(VAR_INT, cookingTime);
|
writer.write(VAR_INT, cookingTime);
|
||||||
}
|
}
|
||||||
|
@ -227,7 +226,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
public DeclaredCampfireCookingRecipe(@NotNull NetworkBuffer reader) {
|
public DeclaredCampfireCookingRecipe(@NotNull NetworkBuffer reader) {
|
||||||
this(reader.read(STRING), reader.read(STRING),
|
this(reader.read(STRING), reader.read(STRING),
|
||||||
reader.readEnum(RecipeCategory.Cooking.class),
|
reader.readEnum(RecipeCategory.Cooking.class),
|
||||||
new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE),
|
new Ingredient(reader), reader.read(ItemStack.STRICT_NETWORK_TYPE),
|
||||||
reader.read(FLOAT), reader.read(VAR_INT));
|
reader.read(FLOAT), reader.read(VAR_INT));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,7 +235,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
writer.write(STRING, group);
|
writer.write(STRING, group);
|
||||||
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
||||||
writer.write(ingredient);
|
writer.write(ingredient);
|
||||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||||
writer.write(FLOAT, experience);
|
writer.write(FLOAT, experience);
|
||||||
writer.write(VAR_INT, cookingTime);
|
writer.write(VAR_INT, cookingTime);
|
||||||
}
|
}
|
||||||
|
@ -251,14 +250,14 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
Ingredient ingredient, ItemStack result) implements DeclaredRecipe {
|
Ingredient ingredient, ItemStack result) implements DeclaredRecipe {
|
||||||
public DeclaredStonecutterRecipe(@NotNull NetworkBuffer reader) {
|
public DeclaredStonecutterRecipe(@NotNull NetworkBuffer reader) {
|
||||||
this(reader.read(STRING), reader.read(STRING),
|
this(reader.read(STRING), reader.read(STRING),
|
||||||
new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE));
|
new Ingredient(reader), reader.read(ItemStack.STRICT_NETWORK_TYPE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(@NotNull NetworkBuffer writer) {
|
public void write(@NotNull NetworkBuffer writer) {
|
||||||
writer.write(STRING, group);
|
writer.write(STRING, group);
|
||||||
writer.write(ingredient);
|
writer.write(ingredient);
|
||||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -271,7 +270,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
Ingredient base, Ingredient addition,
|
Ingredient base, Ingredient addition,
|
||||||
ItemStack result) implements DeclaredRecipe {
|
ItemStack result) implements DeclaredRecipe {
|
||||||
public DeclaredSmithingTransformRecipe(@NotNull NetworkBuffer reader) {
|
public DeclaredSmithingTransformRecipe(@NotNull NetworkBuffer reader) {
|
||||||
this(reader.read(STRING), new Ingredient(reader), new Ingredient(reader), new Ingredient(reader), reader.read(ItemStack.NETWORK_TYPE));
|
this(reader.read(STRING), new Ingredient(reader), new Ingredient(reader), new Ingredient(reader), reader.read(ItemStack.STRICT_NETWORK_TYPE));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -279,7 +278,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
writer.write(template);
|
writer.write(template);
|
||||||
writer.write(base);
|
writer.write(base);
|
||||||
writer.write(addition);
|
writer.write(addition);
|
||||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -313,11 +312,11 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
||||||
}
|
}
|
||||||
|
|
||||||
public Ingredient(@NotNull NetworkBuffer reader) {
|
public Ingredient(@NotNull NetworkBuffer reader) {
|
||||||
this(reader.readCollection(ItemStack.NETWORK_TYPE, MAX_INGREDIENTS));
|
this(reader.readCollection(ItemStack.STRICT_NETWORK_TYPE, MAX_INGREDIENTS));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void write(@NotNull NetworkBuffer writer) {
|
public void write(@NotNull NetworkBuffer writer) {
|
||||||
writer.writeCollection(ItemStack.NETWORK_TYPE, items);
|
writer.writeCollection(ItemStack.STRICT_NETWORK_TYPE, items);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,7 +58,7 @@ public class RecipeManager {
|
||||||
default -> throw new IllegalStateException("Unhandled recipe type : " + recipe.type);
|
default -> throw new IllegalStateException("Unhandled recipe type : " + recipe.type);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return new DeclareRecipesPacket(List.of());
|
return new DeclareRecipesPacket(entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
package net.minestom.server.network.packet;
|
||||||
|
|
||||||
|
import net.minestom.server.item.ItemStack;
|
||||||
|
import net.minestom.server.item.Material;
|
||||||
|
import net.minestom.server.network.NetworkBuffer;
|
||||||
|
import net.minestom.server.network.packet.server.play.DeclareRecipesPacket;
|
||||||
|
import net.minestom.server.recipe.RecipeCategory;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
|
|
||||||
|
public class DeclareRecipesPacketTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void cannotWriteAirIngredient() {
|
||||||
|
var packet = new DeclareRecipesPacket(List.of(
|
||||||
|
new DeclareRecipesPacket.DeclaredShapelessCraftingRecipe(
|
||||||
|
"recipe1", "group1", RecipeCategory.Crafting.BUILDING,
|
||||||
|
List.of(new DeclareRecipesPacket.Ingredient(List.of(ItemStack.AIR))),
|
||||||
|
ItemStack.of(Material.DIAMOND)
|
||||||
|
)
|
||||||
|
));
|
||||||
|
|
||||||
|
assertThrows(IllegalArgumentException.class, () -> NetworkBuffer.makeArray(packet::write));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user