mirror of https://github.com/Minestom/Minestom.git
fix: do not allow writing air in declare recipes packet (added ItemStack.STRICT_NETWORK_TYPE to represent this)
This commit is contained in:
parent
ebe8d2f8c1
commit
aaafd1617d
|
@ -141,6 +141,22 @@ public class Main {
|
|||
}
|
||||
};
|
||||
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();
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@ public sealed interface ItemStack extends TagReadable, ItemComponentMap, HoverEv
|
|||
@NotNull ItemStack AIR = ItemStack.of(Material.AIR);
|
||||
|
||||
@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;
|
||||
|
||||
@Contract(value = "_ -> new", pure = true)
|
||||
|
|
|
@ -37,6 +37,13 @@ record ItemStackImpl(Material material, int amount, ItemComponentPatch component
|
|||
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 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) {
|
||||
this(reader.read(STRING), reader.read(STRING),
|
||||
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
|
||||
|
@ -79,7 +79,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
writer.write(STRING, group);
|
||||
writer.writeEnum(RecipeCategory.Crafting.class, crafting);
|
||||
writer.writeCollection(ingredients);
|
||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
||||
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -105,7 +105,6 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
}
|
||||
|
||||
private static DeclaredShapedCraftingRecipe read(@NotNull NetworkBuffer reader) {
|
||||
|
||||
String recipeId = reader.read(STRING);
|
||||
String group = reader.read(STRING);
|
||||
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++) {
|
||||
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);
|
||||
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) {
|
||||
ingredient.write(writer);
|
||||
}
|
||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
||||
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||
writer.write(BOOLEAN, showNotification);
|
||||
}
|
||||
|
||||
|
@ -146,7 +145,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
public DeclaredSmeltingRecipe(@NotNull NetworkBuffer reader) {
|
||||
this(reader.read(STRING), reader.read(STRING),
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -155,7 +154,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
writer.write(STRING, group);
|
||||
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
||||
writer.write(ingredient);
|
||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
||||
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||
writer.write(FLOAT, experience);
|
||||
writer.write(VAR_INT, cookingTime);
|
||||
}
|
||||
|
@ -173,7 +172,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
public DeclaredBlastingRecipe(@NotNull NetworkBuffer reader) {
|
||||
this(reader.read(STRING), reader.read(STRING),
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -182,7 +181,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
writer.write(STRING, group);
|
||||
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
||||
writer.write(ingredient);
|
||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
||||
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||
writer.write(FLOAT, experience);
|
||||
writer.write(VAR_INT, cookingTime);
|
||||
}
|
||||
|
@ -200,7 +199,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
public DeclaredSmokingRecipe(@NotNull NetworkBuffer reader) {
|
||||
this(reader.read(STRING), reader.read(STRING),
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -209,7 +208,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
writer.write(STRING, group);
|
||||
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
||||
writer.write(ingredient);
|
||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
||||
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||
writer.write(FLOAT, experience);
|
||||
writer.write(VAR_INT, cookingTime);
|
||||
}
|
||||
|
@ -227,7 +226,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
public DeclaredCampfireCookingRecipe(@NotNull NetworkBuffer reader) {
|
||||
this(reader.read(STRING), reader.read(STRING),
|
||||
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));
|
||||
}
|
||||
|
||||
|
@ -236,7 +235,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
writer.write(STRING, group);
|
||||
writer.writeEnum(RecipeCategory.Cooking.class, category);
|
||||
writer.write(ingredient);
|
||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
||||
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||
writer.write(FLOAT, experience);
|
||||
writer.write(VAR_INT, cookingTime);
|
||||
}
|
||||
|
@ -251,14 +250,14 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
Ingredient ingredient, ItemStack result) implements DeclaredRecipe {
|
||||
public DeclaredStonecutterRecipe(@NotNull NetworkBuffer reader) {
|
||||
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
|
||||
public void write(@NotNull NetworkBuffer writer) {
|
||||
writer.write(STRING, group);
|
||||
writer.write(ingredient);
|
||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
||||
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -271,7 +270,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
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(ItemStack.NETWORK_TYPE));
|
||||
this(reader.read(STRING), new Ingredient(reader), new Ingredient(reader), new Ingredient(reader), reader.read(ItemStack.STRICT_NETWORK_TYPE));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -279,7 +278,7 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
writer.write(template);
|
||||
writer.write(base);
|
||||
writer.write(addition);
|
||||
writer.write(ItemStack.NETWORK_TYPE, result);
|
||||
writer.write(ItemStack.STRICT_NETWORK_TYPE, result);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -313,11 +312,11 @@ public record DeclareRecipesPacket(@NotNull List<DeclaredRecipe> recipes) implem
|
|||
}
|
||||
|
||||
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) {
|
||||
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);
|
||||
});
|
||||
}
|
||||
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