Folia icon indicating copy to clipboard operation
Folia copied to clipboard

1.21.4 discovey recipe invalid packet

Open ewof opened this issue 1 year ago • 2 comments

Stack trace

[04:57:02 ERROR]: Error sending packet clientbound/minecraft:recipe_book_add (skippable? false)
io.netty.handler.codec.EncoderException: Failed to encode packet 'clientbound/minecraft:recipe_book_add'
        at net.minecraft.network.codec.IdDispatchCodec.encode(IdDispatchCodec.java:53) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.IdDispatchCodec.encode(IdDispatchCodec.java:20) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.PacketEncoder.encode(PacketEncoder.java:26) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.PacketEncoder.encode(PacketEncoder.java:12) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at io.netty.handler.codec.MessageToByteEncoder.write(MessageToByteEncoder.java:107) ~[netty-codec-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:893) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:875) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:984) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:868) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:113) ~[netty-codec-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:893) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:875) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:984) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:868) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.ChannelOutboundHandlerAdapter.write(ChannelOutboundHandlerAdapter.java:113) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at net.minecraft.network.Connection$2.write(Connection.java:819) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:893) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeWrite(AbstractChannelHandlerContext.java:875) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:984) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:868) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.ChannelDuplexHandler.write(ChannelDuplexHandler.java:115) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at ItemJoin.jar/me.RockinChaos.itemjoin.core.utils.protocol.TinyProtocol$PacketInterceptor.write(TinyProtocol.java:480) ~[ItemJoin.jar:?]
        at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:891) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:956) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:982) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:950) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:1000) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:974) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:305) ~[netty-transport-4.1.115.Final.jar:4.1.115.Final]
        at net.minecraft.network.Connection.doSendPacket(Connection.java:540) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.Connection.lambda$sendPacket$13(Connection.java:525) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173) ~[netty-common-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166) ~[netty-common-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:472) ~[netty-common-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:405) ~[netty-transport-classes-epoll-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.115.Final.jar:4.1.115.Final]
        at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.115.Final.jar:4.1.115.Final]
        at java.base/java.lang.Thread.run(Thread.java:1583) ~[?:?]
Caused by: java.lang.RuntimeException: Error encoding component minecraft:equippable
        at net.minecraft.core.component.DataComponentPatch$1.encodeComponent(DataComponentPatch.java:151) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.core.component.DataComponentPatch$1.encode(DataComponentPatch.java:128) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.core.component.DataComponentPatch$1.encode(DataComponentPatch.java:66) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.world.item.ItemStack$1.encode(ItemStack.java:191) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.world.item.ItemStack$1.encode(ItemStack.java:155) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.world.item.ItemStack$2.encode(ItemStack.java:214) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.world.item.ItemStack$2.encode(ItemStack.java:199) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$7.encode(StreamCodec.java:124) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$6.encode(StreamCodec.java:109) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$11.encode(StreamCodec.java:235) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$6.encode(StreamCodec.java:109) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$11.encode(StreamCodec.java:233) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$8.encode(StreamCodec.java:142) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.ByteBufCodecs$21.encode(ByteBufCodecs.java:441) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.ByteBufCodecs$21.encode(ByteBufCodecs.java:423) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$8.encode(StreamCodec.java:142) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$5.encode(StreamCodec.java:90) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$5.encode(StreamCodec.java:80) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        ... 38 more
Caused by: java.lang.NullPointerException: Cannot invoke "java.util.Optional.isPresent()" because "optional" is null
        at net.minecraft.network.codec.ByteBufCodecs$20.encode(ByteBufCodecs.java:389) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.ByteBufCodecs$20.encode(ByteBufCodecs.java:381) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$14.encode(StreamCodec.java:360) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.core.component.DataComponentPatch$1.encodeComponent(DataComponentPatch.java:149) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.core.component.DataComponentPatch$1.encode(DataComponentPatch.java:128) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.core.component.DataComponentPatch$1.encode(DataComponentPatch.java:66) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.world.item.ItemStack$1.encode(ItemStack.java:191) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.world.item.ItemStack$1.encode(ItemStack.java:155) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.world.item.ItemStack$2.encode(ItemStack.java:214) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.world.item.ItemStack$2.encode(ItemStack.java:199) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$7.encode(StreamCodec.java:124) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$6.encode(StreamCodec.java:109) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$11.encode(StreamCodec.java:235) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$6.encode(StreamCodec.java:109) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$11.encode(StreamCodec.java:233) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$8.encode(StreamCodec.java:142) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.ByteBufCodecs$21.encode(ByteBufCodecs.java:441) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.ByteBufCodecs$21.encode(ByteBufCodecs.java:423) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$8.encode(StreamCodec.java:142) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$5.encode(StreamCodec.java:90) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        at net.minecraft.network.codec.StreamCodec$5.encode(StreamCodec.java:80) ~[folia-1.21.4.jar:1.21.4-DEV-d4bc338]
        ... 38 more

Plugin and Datapack List

[04:59:39 INFO]: Server Plugins (70):
[04:59:39 INFO]: Paper Plugins:
[04:59:39 INFO]:  - help, MvndiAchievements, MvndiBattle, MvndiCombat, MvndiCore, MvndiCrafting, MvndiEquipment, MvndiHolders, MvndiHunters, MvndiMisc
[04:59:39 INFO]:  MvndiMMO, MvndiMounts, MvndiPlayers, MvndiRPG, MvndiStats, MvndiTowny, MvndiUI, TownyWaypoints
[04:59:39 INFO]: Bukkit Plugins:
[04:59:39 INFO]:  - Backuper, BetterGUI, BetterHud, BetterRTP, BigDoors, BreweryX, BukkitGreentext, ChatFilter, ChestShop, ChestShop-towny
[04:59:39 INFO]:  Chunky, ChunkyBorder, CommandBlocker, DarkerNights, FarmControl, FlagsH, FreedomChat, HeadDrop, HexNicks, iConomyUnlocked
[04:59:39 INFO]:  InventoryRollbackPlus, InvSeePlusPlus, ItemJoin, LiteBans, LuckPerms, MapTowny, MinecraftSSH, MvndiBanHooks, MvndiChisel, MvndiGUI
[04:59:39 INFO]:  MvndiMenus, MvndiMobs, MvndiSiege, OPItemsRemover, packetevents, PlaceholderAPI, PotionEffectsRemover, SiegeWar, SmoothTimber, spark
[04:59:39 INFO]:  squaremap, SuperVanish, TAB, Towny, TownyBlockGlitch, TownyChat, TownyMenus, TownyResources, UltimateAdvancementAPI, Vault
[04:59:39 INFO]:  VoidWorldGenerator, ZAutoBroadcast

player gets kicked and cant join server

no datapacks

Actions to reproduce (if known)

this is the method in our plugin that causes out (if the discover recipes line is commented out then players can join)

    @org.bukkit.event.EventHandler(priority = EventPriority.LOW)
    public void onPlayerJoin(PlayerJoinEvent e) {
        RecipeManager.setCraftMenuView(e.getPlayer(), CraftMenuView.NONE);
        e.getPlayer().discoverRecipes(recipe_manager.getVanillaRecipes());
    }

Folia version

This server is running Folia version 1.21.4-DEV-dev/1.21.4@d4bc338 (2024-12-05T04:54:20Z) (Implementing API version 1.21.4-R0.1-SNAPSHOT)

Other

it doesnt happen on bb4fb5334e7f7231c86c6ef9951d3eb24db9e6ea

ewof avatar Dec 05 '24 05:12 ewof

I really don't know what that code is doing. You are using some library and haven't said what it is.

I've run /recipe give searchndstroy * on https://github.com/PaperMC/Folia/commit/94d65c398cf3015bafcaf46a09b2ea42cec66d24 locally and it works.

I am going to need code that I can run to look at this further.

Spottedleaf avatar Dec 08 '24 23:12 Spottedleaf

sorry the guy who wrote this disappeared awhile ago, when i first looked at it after seeing the crash stack trace i guess i skimmed it and just assumed it was mostly bukkit api my bad get vanilla recipes is just a getter

    public ArrayList<NamespacedKey> getVanillaRecipes() { return this.vanilla_recipes; }

this is the only function that adds to vanilla_recipes

    private void loadVanillaRecipe(String recipe_name, ItemStack result, HashMap<Character, RecipeItem> dictionary) {
        NamespacedKey recipe_key = new NamespacedKey(plugin, recipe_name);

        // TODO really sloppy, only works with one ingredient shapeless
        if (config.contains(recipe_name + ".shapeless")) {
            ShapelessRecipe recipe = new ShapelessRecipe(recipe_key, result);
            ArrayList<RecipeItem> dict_items = new ArrayList<>(dictionary.values());
            ItemStack itemStack = dict_items.get(0).getItemStack(1);
            recipe.addIngredient(config.getInt(recipe_name + ".shapeless"), itemStack);

            addRecipe(recipe, recipe_key);
            return;
        }
        if (result.getType() == Material.AIR)
            return;
        ShapedRecipe recipe = new ShapedRecipe(recipe_key, result);
        // Add 1, 2 or 3 lines.
        try {
            if (config.getString(recipe_name + ".recipe.shape.bottom") != null) {
                recipe.shape(config.getString(recipe_name + ".recipe.shape.top"), config.getString(recipe_name + ".recipe.shape.middle"),
                        config.getString(recipe_name + ".recipe.shape.bottom"));
            } else if (config.getString(recipe_name + ".recipe.shape.middle") != null) {
                recipe.shape(config.getString(recipe_name + ".recipe.shape.top"), config.getString(recipe_name + ".recipe.shape.middle"));
            } else {
                recipe.shape(config.getString(recipe_name + ".recipe.shape.top"));
            }
    
        } catch (Exception e) {
            MvndiCrafting.getInstance().getLogger().info("Error loading vanilla recipe " + recipe_name);
        }
        for (Character c : dictionary.keySet()) {
            try {
                recipe.setIngredient(c, dictionary.get(c).getRecipeChoice());
            } catch (Exception e) {
                MvndiCrafting.getInstance().getLogger().info("Error loading vanilla recipe ingrediant " + dictionary.get(c).getID() + " in " + recipe_name);
            }
        }

        this.vanilla_recipes.add(recipe_key);
        addRecipe(recipe, recipe_key);
    }

addRecipe on the last line is

    private void addRecipe(Recipe recipe, NamespacedKey key) {
        if (Bukkit.getServer().getRecipe(key) != null)
            Bukkit.getServer().removeRecipe(key);
        Bukkit.getServer().addRecipe(recipe);
    }

it reads from a config that looks like

gunpowder:
  category: Parts
  item:
    type: minecraft
    id: gunpowder
  quantity: 1
  recipe:
    shape:
      top: " R "
      middle: "RDR"
      bottom: " R "
    R:
      type: minecraft
      id: redstone
    D:
      type: minecraft
      id: charcoal

ewof avatar Dec 08 '24 23:12 ewof