diff --git a/eco-core/core-nms/v1_15_R1/src/main/java/com/willfp/eco/proxy/v1_15_R1/PacketPlayOutRecipeUpdateFix.java b/eco-core/core-nms/v1_15_R1/src/main/java/com/willfp/eco/proxy/v1_15_R1/PacketPlayOutRecipeUpdateFix.java index 2114377b..98d9a90e 100644 --- a/eco-core/core-nms/v1_15_R1/src/main/java/com/willfp/eco/proxy/v1_15_R1/PacketPlayOutRecipeUpdateFix.java +++ b/eco-core/core-nms/v1_15_R1/src/main/java/com/willfp/eco/proxy/v1_15_R1/PacketPlayOutRecipeUpdateFix.java @@ -1,9 +1,9 @@ package com.willfp.eco.proxy.v1_15_R1; import com.willfp.eco.proxy.proxies.PacketPlayOutRecipeUpdateFixProxy; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; import net.minecraft.server.v1_15_R1.IRecipe; import net.minecraft.server.v1_15_R1.PacketPlayOutRecipeUpdate; -import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; @@ -14,33 +14,44 @@ import java.util.List; @SuppressWarnings("unchecked") public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy { @Override - public List splitPackets(@NotNull final Object object, - @NotNull final Player player) { + public Object splitAndModifyPacket(@NotNull final Object object) { if (!(object instanceof PacketPlayOutRecipeUpdate)) { throw new IllegalArgumentException("Parameter not packet!"); } PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object; List> recipes = new ArrayList<>(); + Field f = null; try { - Field f = oldPacket.getClass().getDeclaredField("a"); + f = oldPacket.getClass().getDeclaredField("a"); f.setAccessible(true); recipes.addAll((Collection>) f.get(oldPacket)); } catch (IllegalAccessException | NoSuchFieldException e) { e.printStackTrace(); } - List splitPackets = new ArrayList<>(); - List> splitRecipes = new ArrayList<>(); - for (int i = 0; i < recipes.size(); i++) { - splitRecipes.add(recipes.get(i)); - if (i % 100 == 0) { - PacketPlayOutRecipeUpdate newPacket = new PacketPlayOutRecipeUpdate(splitRecipes); - splitPackets.add(newPacket); - splitRecipes.clear(); + if (f == null) { + return null; + } + + List> externRecipes = new ArrayList<>(); + for (IRecipe recipe : new ArrayList<>(recipes)) { + if (AbstractEcoPlugin.LOADED_ECO_PLUGINS.contains(recipe.getKey().getNamespace())) { + externRecipes.add(recipe); + recipes.remove(recipe); } } - return splitPackets; + if (externRecipes.isEmpty()) { + return null; + } + + try { + f.set(object, recipes); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + return new PacketPlayOutRecipeUpdate(externRecipes); } } diff --git a/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/eco/proxy/v1_16_R1/PacketPlayOutRecipeUpdateFix.java b/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/eco/proxy/v1_16_R1/PacketPlayOutRecipeUpdateFix.java index 6f061a6b..7d27bc47 100644 --- a/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/eco/proxy/v1_16_R1/PacketPlayOutRecipeUpdateFix.java +++ b/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/eco/proxy/v1_16_R1/PacketPlayOutRecipeUpdateFix.java @@ -1,9 +1,9 @@ package com.willfp.eco.proxy.v1_16_R1; import com.willfp.eco.proxy.proxies.PacketPlayOutRecipeUpdateFixProxy; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; import net.minecraft.server.v1_16_R1.IRecipe; import net.minecraft.server.v1_16_R1.PacketPlayOutRecipeUpdate; -import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; @@ -14,33 +14,44 @@ import java.util.List; @SuppressWarnings("unchecked") public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy { @Override - public List splitPackets(@NotNull final Object object, - @NotNull final Player player) { + public Object splitAndModifyPacket(@NotNull final Object object) { if (!(object instanceof PacketPlayOutRecipeUpdate)) { throw new IllegalArgumentException("Parameter not packet!"); } PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object; List> recipes = new ArrayList<>(); + Field f = null; try { - Field f = oldPacket.getClass().getDeclaredField("a"); + f = oldPacket.getClass().getDeclaredField("a"); f.setAccessible(true); recipes.addAll((Collection>) f.get(oldPacket)); } catch (IllegalAccessException | NoSuchFieldException e) { e.printStackTrace(); } - List splitPackets = new ArrayList<>(); - List> splitRecipes = new ArrayList<>(); - for (int i = 0; i < recipes.size(); i++) { - splitRecipes.add(recipes.get(i)); - if (i % 100 == 0) { - PacketPlayOutRecipeUpdate newPacket = new PacketPlayOutRecipeUpdate(splitRecipes); - splitPackets.add(newPacket); - splitRecipes.clear(); + if (f == null) { + return null; + } + + List> externRecipes = new ArrayList<>(); + for (IRecipe recipe : new ArrayList<>(recipes)) { + if (AbstractEcoPlugin.LOADED_ECO_PLUGINS.contains(recipe.getKey().getNamespace())) { + externRecipes.add(recipe); + recipes.remove(recipe); } } - return splitPackets; + if (externRecipes.isEmpty()) { + return null; + } + + try { + f.set(object, recipes); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + return new PacketPlayOutRecipeUpdate(externRecipes); } } diff --git a/eco-core/core-nms/v1_16_R2/src/main/java/com/willfp/eco/proxy/v1_16_R2/PacketPlayOutRecipeUpdateFix.java b/eco-core/core-nms/v1_16_R2/src/main/java/com/willfp/eco/proxy/v1_16_R2/PacketPlayOutRecipeUpdateFix.java index abb6ac00..2efd88b1 100644 --- a/eco-core/core-nms/v1_16_R2/src/main/java/com/willfp/eco/proxy/v1_16_R2/PacketPlayOutRecipeUpdateFix.java +++ b/eco-core/core-nms/v1_16_R2/src/main/java/com/willfp/eco/proxy/v1_16_R2/PacketPlayOutRecipeUpdateFix.java @@ -1,9 +1,9 @@ package com.willfp.eco.proxy.v1_16_R2; import com.willfp.eco.proxy.proxies.PacketPlayOutRecipeUpdateFixProxy; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; import net.minecraft.server.v1_16_R2.IRecipe; import net.minecraft.server.v1_16_R2.PacketPlayOutRecipeUpdate; -import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; @@ -14,33 +14,44 @@ import java.util.List; @SuppressWarnings("unchecked") public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy { @Override - public List splitPackets(@NotNull final Object object, - @NotNull final Player player) { + public Object splitAndModifyPacket(@NotNull final Object object) { if (!(object instanceof PacketPlayOutRecipeUpdate)) { throw new IllegalArgumentException("Parameter not packet!"); } PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object; List> recipes = new ArrayList<>(); + Field f = null; try { - Field f = oldPacket.getClass().getDeclaredField("a"); + f = oldPacket.getClass().getDeclaredField("a"); f.setAccessible(true); recipes.addAll((Collection>) f.get(oldPacket)); } catch (IllegalAccessException | NoSuchFieldException e) { e.printStackTrace(); } - List splitPackets = new ArrayList<>(); - List> splitRecipes = new ArrayList<>(); - for (int i = 0; i < recipes.size(); i++) { - splitRecipes.add(recipes.get(i)); - if (i % 100 == 0) { - PacketPlayOutRecipeUpdate newPacket = new PacketPlayOutRecipeUpdate(splitRecipes); - splitPackets.add(newPacket); - splitRecipes.clear(); + if (f == null) { + return null; + } + + List> externRecipes = new ArrayList<>(); + for (IRecipe recipe : new ArrayList<>(recipes)) { + if (AbstractEcoPlugin.LOADED_ECO_PLUGINS.contains(recipe.getKey().getNamespace())) { + externRecipes.add(recipe); + recipes.remove(recipe); } } - return splitPackets; + if (externRecipes.isEmpty()) { + return null; + } + + try { + f.set(object, recipes); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + return new PacketPlayOutRecipeUpdate(externRecipes); } } diff --git a/eco-core/core-nms/v1_16_R3/src/main/java/com/willfp/eco/proxy/v1_16_R3/PacketPlayOutRecipeUpdateFix.java b/eco-core/core-nms/v1_16_R3/src/main/java/com/willfp/eco/proxy/v1_16_R3/PacketPlayOutRecipeUpdateFix.java index 3366a7e0..68f9a41b 100644 --- a/eco-core/core-nms/v1_16_R3/src/main/java/com/willfp/eco/proxy/v1_16_R3/PacketPlayOutRecipeUpdateFix.java +++ b/eco-core/core-nms/v1_16_R3/src/main/java/com/willfp/eco/proxy/v1_16_R3/PacketPlayOutRecipeUpdateFix.java @@ -1,9 +1,9 @@ package com.willfp.eco.proxy.v1_16_R3; import com.willfp.eco.proxy.proxies.PacketPlayOutRecipeUpdateFixProxy; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; import net.minecraft.server.v1_16_R3.IRecipe; import net.minecraft.server.v1_16_R3.PacketPlayOutRecipeUpdate; -import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; @@ -14,33 +14,44 @@ import java.util.List; @SuppressWarnings("unchecked") public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy { @Override - public List splitPackets(@NotNull final Object object, - @NotNull final Player player) { + public Object splitAndModifyPacket(@NotNull final Object object) { if (!(object instanceof PacketPlayOutRecipeUpdate)) { throw new IllegalArgumentException("Parameter not packet!"); } PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object; List> recipes = new ArrayList<>(); + Field f = null; try { - Field f = oldPacket.getClass().getDeclaredField("a"); + f = oldPacket.getClass().getDeclaredField("a"); f.setAccessible(true); recipes.addAll((Collection>) f.get(oldPacket)); } catch (IllegalAccessException | NoSuchFieldException e) { e.printStackTrace(); } - List splitPackets = new ArrayList<>(); - List> splitRecipes = new ArrayList<>(); - for (int i = 0; i < recipes.size(); i++) { - splitRecipes.add(recipes.get(i)); - if (i % 100 == 0) { - PacketPlayOutRecipeUpdate newPacket = new PacketPlayOutRecipeUpdate(splitRecipes); - splitPackets.add(newPacket); - splitRecipes.clear(); + if (f == null) { + return null; + } + + List> externRecipes = new ArrayList<>(); + for (IRecipe recipe : new ArrayList<>(recipes)) { + if (AbstractEcoPlugin.LOADED_ECO_PLUGINS.contains(recipe.getKey().getNamespace())) { + externRecipes.add(recipe); + recipes.remove(recipe); } } - return splitPackets; + if (externRecipes.isEmpty()) { + return null; + } + + try { + f.set(object, recipes); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + + return new PacketPlayOutRecipeUpdate(externRecipes); } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/EcoPlugin.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/EcoPlugin.java index 55c3d7e6..5391427f 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/EcoPlugin.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/EcoPlugin.java @@ -1,6 +1,5 @@ package com.willfp.eco.spigot; -import com.comphenix.protocol.ProtocolLibrary; import com.willfp.eco.spigot.display.packets.PacketAutoRecipe; import com.willfp.eco.spigot.display.packets.PacketChat; import com.willfp.eco.spigot.display.packets.PacketOpenWindowMerchant; @@ -58,7 +57,7 @@ public class EcoPlugin extends AbstractEcoPlugin { this.getEventManager().registerListener(new DispenserArmorListener()); this.getEventManager().registerListener(new EntityDeathByEntityListeners(this)); this.getEventManager().registerListener(new RecipeListener(this)); - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketPlayOutRecipeUpdateFix(this)); + //ProtocolLibrary.getProtocolManager().addPacketListener(new PacketPlayOutRecipeUpdateFix(this)); } @Override diff --git a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/PacketPlayOutRecipeUpdateFix.java b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/PacketPlayOutRecipeUpdateFix.java index 880d2e39..4f5aa0fb 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/PacketPlayOutRecipeUpdateFix.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/eco/spigot/PacketPlayOutRecipeUpdateFix.java @@ -11,7 +11,6 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.lang.reflect.InvocationTargetException; -import java.util.List; public class PacketPlayOutRecipeUpdateFix extends PacketAdapter { /** @@ -28,16 +27,14 @@ public class PacketPlayOutRecipeUpdateFix extends PacketAdapter { PacketContainer packet = event.getPacket(); Player player = event.getPlayer(); - List packets = InternalProxyUtils.getProxy(PacketPlayOutRecipeUpdateFixProxy.class).splitPackets(packet.getHandle(), player); - if (packets.size() > 1) { + Object otherPacket = InternalProxyUtils.getProxy(PacketPlayOutRecipeUpdateFixProxy.class).splitAndModifyPacket(packet.getHandle()); + if (otherPacket != null) { event.setCancelled(true); - for (Object o : packets) { - PacketContainer container = PacketContainer.fromPacket(o); - try { - ProtocolLibrary.getProtocolManager().sendServerPacket(player, container); - } catch (InvocationTargetException e) { - e.printStackTrace(); - } + PacketContainer container = PacketContainer.fromPacket(otherPacket); + try { + ProtocolLibrary.getProtocolManager().sendServerPacket(player, container); + } catch (InvocationTargetException e) { + e.printStackTrace(); } } } diff --git a/eco-core/core-proxy/src/main/java/com/willfp/eco/proxy/proxies/PacketPlayOutRecipeUpdateFixProxy.java b/eco-core/core-proxy/src/main/java/com/willfp/eco/proxy/proxies/PacketPlayOutRecipeUpdateFixProxy.java index 1b8f847a..8f844f00 100644 --- a/eco-core/core-proxy/src/main/java/com/willfp/eco/proxy/proxies/PacketPlayOutRecipeUpdateFixProxy.java +++ b/eco-core/core-proxy/src/main/java/com/willfp/eco/proxy/proxies/PacketPlayOutRecipeUpdateFixProxy.java @@ -2,19 +2,14 @@ package com.willfp.eco.proxy.proxies; import com.willfp.eco.util.proxy.AbstractProxy; -import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.util.List; - public interface PacketPlayOutRecipeUpdateFixProxy extends AbstractProxy { /** * Split recipe update packet into smaller packets. * * @param object The packet. - * @param player The player. - * @return The packets, split up. + * @return The extra packet for eco recipes. */ - List splitPackets(@NotNull Object object, - @NotNull Player player); + Object splitAndModifyPacket(@NotNull Object object); }