From 336cdc3716dbb9b2ebd2f3a7cd9ad420754a25df Mon Sep 17 00:00:00 2001 From: Auxilor Date: Sat, 28 May 2022 12:31:55 +0100 Subject: [PATCH] Added recipe packet splitting --- .../spigot/proxy/v1_17_R1/RecipePacket.kt | 18 +++++++++++++ .../spigot/proxy/v1_18_R1/RecipePacket.kt | 18 +++++++++++++ .../spigot/proxy/v1_18_R2/RecipePacket.kt | 18 +++++++++++++ .../eco/internal/spigot/EcoSpigotPlugin.kt | 4 ++- .../spigot/recipes/RecipePacketFixer.kt | 27 +++++++++++++++++++ .../spigot/proxy/RecipePacketProxy.kt | 5 ++++ 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/RecipePacket.kt create mode 100644 eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/RecipePacket.kt create mode 100644 eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/RecipePacket.kt create mode 100644 eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/RecipePacketFixer.kt create mode 100644 eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/RecipePacketProxy.kt diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/RecipePacket.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/RecipePacket.kt new file mode 100644 index 00000000..ad1d35de --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/RecipePacket.kt @@ -0,0 +1,18 @@ +package com.willfp.eco.internal.spigot.proxy.v1_17_R1 + +import com.willfp.eco.internal.spigot.proxy.RecipePacketProxy +import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket + +class RecipePacket : RecipePacketProxy { + override fun splitPacket(packet: Any): List { + packet as ClientboundUpdateRecipesPacket + + val packets = mutableListOf() + + for (list in packet.recipes.chunked(64)) { + packets.add(ClientboundUpdateRecipesPacket(list)) + } + + return packets + } +} diff --git a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/RecipePacket.kt b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/RecipePacket.kt new file mode 100644 index 00000000..214e0f1a --- /dev/null +++ b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/RecipePacket.kt @@ -0,0 +1,18 @@ +package com.willfp.eco.internal.spigot.proxy.v1_18_R1 + +import com.willfp.eco.internal.spigot.proxy.RecipePacketProxy +import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket + +class RecipePacket : RecipePacketProxy { + override fun splitPacket(packet: Any): List { + packet as ClientboundUpdateRecipesPacket + + val packets = mutableListOf() + + for (list in packet.recipes.chunked(64)) { + packets.add(ClientboundUpdateRecipesPacket(list)) + } + + return packets + } +} diff --git a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/RecipePacket.kt b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/RecipePacket.kt new file mode 100644 index 00000000..5ac39f23 --- /dev/null +++ b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/RecipePacket.kt @@ -0,0 +1,18 @@ +package com.willfp.eco.internal.spigot.proxy.v1_18_R2 + +import com.willfp.eco.internal.spigot.proxy.RecipePacketProxy +import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket + +class RecipePacket : RecipePacketProxy { + override fun splitPacket(packet: Any): List { + packet as ClientboundUpdateRecipesPacket + + val packets = mutableListOf() + + for (list in packet.recipes.chunked(64)) { + packets.add(ClientboundUpdateRecipesPacket(list)) + } + + return packets + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt index 071f22cc..7c501d18 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt @@ -115,6 +115,7 @@ import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy import com.willfp.eco.internal.spigot.proxy.SkullProxy import com.willfp.eco.internal.spigot.proxy.TPSProxy import com.willfp.eco.internal.spigot.recipes.CraftingRecipeListener +import com.willfp.eco.internal.spigot.recipes.RecipePacketFixer import com.willfp.eco.internal.spigot.recipes.StackedRecipeListener import com.willfp.eco.internal.spigot.recipes.listeners.ComplexInComplex import com.willfp.eco.internal.spigot.recipes.listeners.ComplexInVanilla @@ -344,7 +345,8 @@ abstract class EcoSpigotPlugin : EcoPlugin() { PacketSetSlot(this), PacketWindowItems(this), PacketHeldWindowItems(this), - PacketOpenWindowMerchant(this) + PacketOpenWindowMerchant(this), + RecipePacketFixer(this) ) } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/RecipePacketFixer.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/RecipePacketFixer.kt new file mode 100644 index 00000000..a39690cc --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/recipes/RecipePacketFixer.kt @@ -0,0 +1,27 @@ +package com.willfp.eco.internal.spigot.recipes + +import com.comphenix.protocol.PacketType +import com.comphenix.protocol.ProtocolLibrary +import com.comphenix.protocol.events.PacketContainer +import com.comphenix.protocol.events.PacketEvent +import com.willfp.eco.core.AbstractPacketAdapter +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.internal.spigot.proxy.RecipePacketProxy +import org.bukkit.entity.Player + +class RecipePacketFixer( + plugin: EcoPlugin +) : AbstractPacketAdapter( + plugin, + PacketType.Play.Server.RECIPE_UPDATE, + false +) { + override fun onSend(packet: PacketContainer, player: Player, event: PacketEvent) { + val nmsPackets = this.getPlugin().getProxy(RecipePacketProxy::class.java).splitPacket(packet.handle) + + for (nmsPacket in nmsPackets) { + val protocolLibPacket = PacketContainer.fromPacket(nmsPacket) + ProtocolLibrary.getProtocolManager().sendServerPacket(player, protocolLibPacket, false) + } + } +} diff --git a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/RecipePacketProxy.kt b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/RecipePacketProxy.kt new file mode 100644 index 00000000..c0b37500 --- /dev/null +++ b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/RecipePacketProxy.kt @@ -0,0 +1,5 @@ +package com.willfp.eco.internal.spigot.proxy + +interface RecipePacketProxy { + fun splitPacket(packet: Any): List +} \ No newline at end of file