fix: do not allow writing air in declare recipes packet (added ItemStack.STRICT_NETWORK_TYPE to represent this)

This commit is contained in:
mworzala 2024-04-23 18:19:13 -04:00
parent ebe8d2f8c1
commit aaafd1617d
No known key found for this signature in database
GPG Key ID: B148F922E64797C7
6 changed files with 71 additions and 20 deletions

View File

@ -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();

View File

@ -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)

View File

@ -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) {

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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));
}
}