Changed the fix for PacketPlayOutRecipeUpdateFix

This commit is contained in:
Auxilor
2021-01-21 08:38:28 +00:00
parent f0cd9ae16d
commit 876343facb
7 changed files with 106 additions and 71 deletions

View File

@@ -1,9 +1,9 @@
package com.willfp.eco.proxy.v1_15_R1; package com.willfp.eco.proxy.v1_15_R1;
import com.willfp.eco.proxy.proxies.PacketPlayOutRecipeUpdateFixProxy; 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.IRecipe;
import net.minecraft.server.v1_15_R1.PacketPlayOutRecipeUpdate; import net.minecraft.server.v1_15_R1.PacketPlayOutRecipeUpdate;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@@ -14,33 +14,44 @@ import java.util.List;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy { public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy {
@Override @Override
public List<Object> splitPackets(@NotNull final Object object, public Object splitAndModifyPacket(@NotNull final Object object) {
@NotNull final Player player) {
if (!(object instanceof PacketPlayOutRecipeUpdate)) { if (!(object instanceof PacketPlayOutRecipeUpdate)) {
throw new IllegalArgumentException("Parameter not packet!"); throw new IllegalArgumentException("Parameter not packet!");
} }
PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object; PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object;
List<IRecipe<?>> recipes = new ArrayList<>(); List<IRecipe<?>> recipes = new ArrayList<>();
Field f = null;
try { try {
Field f = oldPacket.getClass().getDeclaredField("a"); f = oldPacket.getClass().getDeclaredField("a");
f.setAccessible(true); f.setAccessible(true);
recipes.addAll((Collection<? extends IRecipe<?>>) f.get(oldPacket)); recipes.addAll((Collection<? extends IRecipe<?>>) f.get(oldPacket));
} catch (IllegalAccessException | NoSuchFieldException e) { } catch (IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace(); e.printStackTrace();
} }
List<Object> splitPackets = new ArrayList<>(); if (f == null) {
List<IRecipe<?>> splitRecipes = new ArrayList<>(); return null;
for (int i = 0; i < recipes.size(); i++) { }
splitRecipes.add(recipes.get(i));
if (i % 100 == 0) { List<IRecipe<?>> externRecipes = new ArrayList<>();
PacketPlayOutRecipeUpdate newPacket = new PacketPlayOutRecipeUpdate(splitRecipes); for (IRecipe<?> recipe : new ArrayList<>(recipes)) {
splitPackets.add(newPacket); if (AbstractEcoPlugin.LOADED_ECO_PLUGINS.contains(recipe.getKey().getNamespace())) {
splitRecipes.clear(); 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);
} }
} }

View File

@@ -1,9 +1,9 @@
package com.willfp.eco.proxy.v1_16_R1; package com.willfp.eco.proxy.v1_16_R1;
import com.willfp.eco.proxy.proxies.PacketPlayOutRecipeUpdateFixProxy; 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.IRecipe;
import net.minecraft.server.v1_16_R1.PacketPlayOutRecipeUpdate; import net.minecraft.server.v1_16_R1.PacketPlayOutRecipeUpdate;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@@ -14,33 +14,44 @@ import java.util.List;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy { public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy {
@Override @Override
public List<Object> splitPackets(@NotNull final Object object, public Object splitAndModifyPacket(@NotNull final Object object) {
@NotNull final Player player) {
if (!(object instanceof PacketPlayOutRecipeUpdate)) { if (!(object instanceof PacketPlayOutRecipeUpdate)) {
throw new IllegalArgumentException("Parameter not packet!"); throw new IllegalArgumentException("Parameter not packet!");
} }
PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object; PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object;
List<IRecipe<?>> recipes = new ArrayList<>(); List<IRecipe<?>> recipes = new ArrayList<>();
Field f = null;
try { try {
Field f = oldPacket.getClass().getDeclaredField("a"); f = oldPacket.getClass().getDeclaredField("a");
f.setAccessible(true); f.setAccessible(true);
recipes.addAll((Collection<? extends IRecipe<?>>) f.get(oldPacket)); recipes.addAll((Collection<? extends IRecipe<?>>) f.get(oldPacket));
} catch (IllegalAccessException | NoSuchFieldException e) { } catch (IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace(); e.printStackTrace();
} }
List<Object> splitPackets = new ArrayList<>(); if (f == null) {
List<IRecipe<?>> splitRecipes = new ArrayList<>(); return null;
for (int i = 0; i < recipes.size(); i++) { }
splitRecipes.add(recipes.get(i));
if (i % 100 == 0) { List<IRecipe<?>> externRecipes = new ArrayList<>();
PacketPlayOutRecipeUpdate newPacket = new PacketPlayOutRecipeUpdate(splitRecipes); for (IRecipe<?> recipe : new ArrayList<>(recipes)) {
splitPackets.add(newPacket); if (AbstractEcoPlugin.LOADED_ECO_PLUGINS.contains(recipe.getKey().getNamespace())) {
splitRecipes.clear(); 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);
} }
} }

View File

@@ -1,9 +1,9 @@
package com.willfp.eco.proxy.v1_16_R2; package com.willfp.eco.proxy.v1_16_R2;
import com.willfp.eco.proxy.proxies.PacketPlayOutRecipeUpdateFixProxy; 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.IRecipe;
import net.minecraft.server.v1_16_R2.PacketPlayOutRecipeUpdate; import net.minecraft.server.v1_16_R2.PacketPlayOutRecipeUpdate;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@@ -14,33 +14,44 @@ import java.util.List;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy { public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy {
@Override @Override
public List<Object> splitPackets(@NotNull final Object object, public Object splitAndModifyPacket(@NotNull final Object object) {
@NotNull final Player player) {
if (!(object instanceof PacketPlayOutRecipeUpdate)) { if (!(object instanceof PacketPlayOutRecipeUpdate)) {
throw new IllegalArgumentException("Parameter not packet!"); throw new IllegalArgumentException("Parameter not packet!");
} }
PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object; PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object;
List<IRecipe<?>> recipes = new ArrayList<>(); List<IRecipe<?>> recipes = new ArrayList<>();
Field f = null;
try { try {
Field f = oldPacket.getClass().getDeclaredField("a"); f = oldPacket.getClass().getDeclaredField("a");
f.setAccessible(true); f.setAccessible(true);
recipes.addAll((Collection<? extends IRecipe<?>>) f.get(oldPacket)); recipes.addAll((Collection<? extends IRecipe<?>>) f.get(oldPacket));
} catch (IllegalAccessException | NoSuchFieldException e) { } catch (IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace(); e.printStackTrace();
} }
List<Object> splitPackets = new ArrayList<>(); if (f == null) {
List<IRecipe<?>> splitRecipes = new ArrayList<>(); return null;
for (int i = 0; i < recipes.size(); i++) { }
splitRecipes.add(recipes.get(i));
if (i % 100 == 0) { List<IRecipe<?>> externRecipes = new ArrayList<>();
PacketPlayOutRecipeUpdate newPacket = new PacketPlayOutRecipeUpdate(splitRecipes); for (IRecipe<?> recipe : new ArrayList<>(recipes)) {
splitPackets.add(newPacket); if (AbstractEcoPlugin.LOADED_ECO_PLUGINS.contains(recipe.getKey().getNamespace())) {
splitRecipes.clear(); 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);
} }
} }

View File

@@ -1,9 +1,9 @@
package com.willfp.eco.proxy.v1_16_R3; package com.willfp.eco.proxy.v1_16_R3;
import com.willfp.eco.proxy.proxies.PacketPlayOutRecipeUpdateFixProxy; 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.IRecipe;
import net.minecraft.server.v1_16_R3.PacketPlayOutRecipeUpdate; import net.minecraft.server.v1_16_R3.PacketPlayOutRecipeUpdate;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@@ -14,33 +14,44 @@ import java.util.List;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy { public final class PacketPlayOutRecipeUpdateFix implements PacketPlayOutRecipeUpdateFixProxy {
@Override @Override
public List<Object> splitPackets(@NotNull final Object object, public Object splitAndModifyPacket(@NotNull final Object object) {
@NotNull final Player player) {
if (!(object instanceof PacketPlayOutRecipeUpdate)) { if (!(object instanceof PacketPlayOutRecipeUpdate)) {
throw new IllegalArgumentException("Parameter not packet!"); throw new IllegalArgumentException("Parameter not packet!");
} }
PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object; PacketPlayOutRecipeUpdate oldPacket = (PacketPlayOutRecipeUpdate) object;
List<IRecipe<?>> recipes = new ArrayList<>(); List<IRecipe<?>> recipes = new ArrayList<>();
Field f = null;
try { try {
Field f = oldPacket.getClass().getDeclaredField("a"); f = oldPacket.getClass().getDeclaredField("a");
f.setAccessible(true); f.setAccessible(true);
recipes.addAll((Collection<? extends IRecipe<?>>) f.get(oldPacket)); recipes.addAll((Collection<? extends IRecipe<?>>) f.get(oldPacket));
} catch (IllegalAccessException | NoSuchFieldException e) { } catch (IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace(); e.printStackTrace();
} }
List<Object> splitPackets = new ArrayList<>(); if (f == null) {
List<IRecipe<?>> splitRecipes = new ArrayList<>(); return null;
for (int i = 0; i < recipes.size(); i++) { }
splitRecipes.add(recipes.get(i));
if (i % 100 == 0) { List<IRecipe<?>> externRecipes = new ArrayList<>();
PacketPlayOutRecipeUpdate newPacket = new PacketPlayOutRecipeUpdate(splitRecipes); for (IRecipe<?> recipe : new ArrayList<>(recipes)) {
splitPackets.add(newPacket); if (AbstractEcoPlugin.LOADED_ECO_PLUGINS.contains(recipe.getKey().getNamespace())) {
splitRecipes.clear(); 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);
} }
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.spigot; 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.PacketAutoRecipe;
import com.willfp.eco.spigot.display.packets.PacketChat; import com.willfp.eco.spigot.display.packets.PacketChat;
import com.willfp.eco.spigot.display.packets.PacketOpenWindowMerchant; 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 DispenserArmorListener());
this.getEventManager().registerListener(new EntityDeathByEntityListeners(this)); this.getEventManager().registerListener(new EntityDeathByEntityListeners(this));
this.getEventManager().registerListener(new RecipeListener(this)); this.getEventManager().registerListener(new RecipeListener(this));
ProtocolLibrary.getProtocolManager().addPacketListener(new PacketPlayOutRecipeUpdateFix(this)); //ProtocolLibrary.getProtocolManager().addPacketListener(new PacketPlayOutRecipeUpdateFix(this));
} }
@Override @Override

View File

@@ -11,7 +11,6 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.List;
public class PacketPlayOutRecipeUpdateFix extends PacketAdapter { public class PacketPlayOutRecipeUpdateFix extends PacketAdapter {
/** /**
@@ -28,16 +27,14 @@ public class PacketPlayOutRecipeUpdateFix extends PacketAdapter {
PacketContainer packet = event.getPacket(); PacketContainer packet = event.getPacket();
Player player = event.getPlayer(); Player player = event.getPlayer();
List<Object> packets = InternalProxyUtils.getProxy(PacketPlayOutRecipeUpdateFixProxy.class).splitPackets(packet.getHandle(), player); Object otherPacket = InternalProxyUtils.getProxy(PacketPlayOutRecipeUpdateFixProxy.class).splitAndModifyPacket(packet.getHandle());
if (packets.size() > 1) { if (otherPacket != null) {
event.setCancelled(true); event.setCancelled(true);
for (Object o : packets) { PacketContainer container = PacketContainer.fromPacket(otherPacket);
PacketContainer container = PacketContainer.fromPacket(o); try {
try { ProtocolLibrary.getProtocolManager().sendServerPacket(player, container);
ProtocolLibrary.getProtocolManager().sendServerPacket(player, container); } catch (InvocationTargetException e) {
} catch (InvocationTargetException e) { e.printStackTrace();
e.printStackTrace();
}
} }
} }
} }

View File

@@ -2,19 +2,14 @@ package com.willfp.eco.proxy.proxies;
import com.willfp.eco.util.proxy.AbstractProxy; import com.willfp.eco.util.proxy.AbstractProxy;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.List;
public interface PacketPlayOutRecipeUpdateFixProxy extends AbstractProxy { public interface PacketPlayOutRecipeUpdateFixProxy extends AbstractProxy {
/** /**
* Split recipe update packet into smaller packets. * Split recipe update packet into smaller packets.
* *
* @param object The packet. * @param object The packet.
* @param player The player. * @return The extra packet for eco recipes.
* @return The packets, split up.
*/ */
List<Object> splitPackets(@NotNull Object object, Object splitAndModifyPacket(@NotNull Object object);
@NotNull Player player);
} }