From f4499b4cfe19bd645488603f25a9d710dac6835f Mon Sep 17 00:00:00 2001 From: Flowsqy <47575244+Flowsqy@users.noreply.github.com> Date: Wed, 29 Dec 2021 21:40:42 +0100 Subject: [PATCH] Remove useless method in Utils --- .../de/epiceric/shopchest/utils/Utils.java | 270 ++---------------- 1 file changed, 21 insertions(+), 249 deletions(-) diff --git a/plugin/src/main/java/de/epiceric/shopchest/utils/Utils.java b/plugin/src/main/java/de/epiceric/shopchest/utils/Utils.java index ebdd9e1..e8b6355 100644 --- a/plugin/src/main/java/de/epiceric/shopchest/utils/Utils.java +++ b/plugin/src/main/java/de/epiceric/shopchest/utils/Utils.java @@ -1,41 +1,5 @@ package de.epiceric.shopchest.utils; -import java.lang.reflect.Constructor; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Base64; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicInteger; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Chest; -import org.bukkit.block.DoubleChest; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.bukkit.inventory.meta.BookMeta; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.util.Vector; -import org.inventivetalent.reflection.resolver.FieldResolver; -import org.inventivetalent.reflection.resolver.minecraft.NMSClassResolver; - import de.epiceric.shopchest.ShopChest; import de.epiceric.shopchest.config.Placeholder; import de.epiceric.shopchest.language.LanguageUtils; @@ -44,6 +8,27 @@ import de.epiceric.shopchest.language.Replacement; import de.epiceric.shopchest.nms.CustomBookMeta; import de.epiceric.shopchest.nms.JsonBuilder; import de.epiceric.shopchest.shop.Shop; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Chest; +import org.bukkit.block.DoubleChest; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.BookMeta; +import org.bukkit.inventory.meta.ItemMeta; +import org.inventivetalent.reflection.resolver.FieldResolver; +import org.inventivetalent.reflection.resolver.minecraft.NMSClassResolver; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.nio.charset.StandardCharsets; +import java.util.*; public class Utils { static NMSClassResolver nmsClassResolver = new NMSClassResolver(); @@ -347,219 +332,6 @@ public class Utils { jb.sendJson(p); } - /** - * Create a NMS data watcher object to send via a {@code PacketPlayOutEntityMetadata} packet. - * Gravity will be disabled and the custom name will be displayed if available. - * @param customName Custom Name of the entity or {@code null} - * @param nmsItemStack NMS ItemStack or {@code null} if armor stand - */ - public static Object createDataWatcher(String customName, Object nmsItemStack) { - String version = getServerVersion(); - int majorVersion = getMajorVersion(); - - try { - byte entityFlags = nmsItemStack == null ? (byte) 0b100000 : 0; // invisible if armor stand - byte armorStandFlags = nmsItemStack == null ? (byte) 0b10000 : 0; // marker (since 1.8_R2) - - Object dataWatcher = dataWatcherClass.getConstructor(entityClass).newInstance((Object) null); - if (majorVersion < 9) { - if (getRevision() == 1) armorStandFlags = 0; // Marker not supported on 1.8_R1 - - Method a = dataWatcherClass.getMethod("a", int.class, Object.class); - a.invoke(dataWatcher, 0, entityFlags); // flags - a.invoke(dataWatcher, 1, (short) 300); // air ticks (?) - a.invoke(dataWatcher, 3, (byte) (customName != null ? 1 : 0)); // custom name visible - a.invoke(dataWatcher, 2, customName != null ? customName : ""); // custom name - a.invoke(dataWatcher, 4, (byte) 1); // silent - a.invoke(dataWatcher, 10, nmsItemStack == null ? armorStandFlags : nmsItemStack); // item / armor stand flags - } else { - Method register = dataWatcherClass.getMethod("register", dataWatcherObjectClass, Object.class); - String[] dataWatcherObjectFieldNames; - - if ("v1_9_R1".equals(version)) { - dataWatcherObjectFieldNames = new String[] {"ax", "ay", "aA", "az", "aB", null, "c", "a"}; - } else if ("v1_9_R2".equals(version)){ - dataWatcherObjectFieldNames = new String[] {"ay", "az", "aB", "aA", "aC", null, "c", "a"}; - } else if ("v1_10_R1".equals(version)) { - dataWatcherObjectFieldNames = new String[] {"aa", "az", "aB", "aA", "aC", "aD", "c", "a"}; - } else if ("v1_11_R1".equals(version)) { - dataWatcherObjectFieldNames = new String[] {"Z", "az", "aB", "aA", "aC", "aD", "c", "a"}; - } else if ("v1_12_R1".equals(version) || "v1_12_R2".equals(version)) { - dataWatcherObjectFieldNames = new String[] {"Z", "aA", "aC", "aB", "aD", "aE", "c", "a"}; - } else if ("v1_13_R1".equals(version) || "v1_13_R2".equals(version)) { - dataWatcherObjectFieldNames = new String[] {"ac", "aD", "aF", "aE", "aG", "aH", "b", "a"}; - } else if ("v1_14_R1".equals(version)) { - dataWatcherObjectFieldNames = new String[] {"W", "AIR_TICKS", "aA", "az", "aB", "aC", "ITEM", "b"}; - } else if ("v1_15_R1".equals(version)) { - dataWatcherObjectFieldNames = new String[] {"T", "AIR_TICKS", "aA", "az", "aB", "aC", "ITEM", "b"}; - } else if ("v1_16_R1".equals(version)) { - dataWatcherObjectFieldNames = new String[] {"T", "AIR_TICKS", "ay", "ax", "az", "aA", "ITEM", "b"}; - } else if ("v1_16_R2".equals(version) || "v1_16_R3".equals(version)) { - dataWatcherObjectFieldNames = new String[] {"S", "AIR_TICKS", "ar", "aq", "as", "at", "ITEM", "b"}; - } else if ("v1_17_R1".equals(version)) { - dataWatcherObjectFieldNames = new String[] {"Z", "aI", "aK", "aJ", "aL", "aM", "c", "bG"}; - } else { - return null; - } - - Field fEntityFlags = entityClass.getDeclaredField(dataWatcherObjectFieldNames[0]); - Field fAirTicks = entityClass.getDeclaredField(dataWatcherObjectFieldNames[1]); - Field fNameVisible = entityClass.getDeclaredField(dataWatcherObjectFieldNames[2]); - Field fCustomName = entityClass.getDeclaredField(dataWatcherObjectFieldNames[3]); - Field fSilent = entityClass.getDeclaredField(dataWatcherObjectFieldNames[4]); - Field fNoGravity = majorVersion >= 10 ? entityClass.getDeclaredField(dataWatcherObjectFieldNames[5]) : null; - Field fItem = entityItemClass.getDeclaredField(dataWatcherObjectFieldNames[6]); - Field fArmorStandFlags = entityArmorStandClass.getDeclaredField(dataWatcherObjectFieldNames[7]); - - fEntityFlags.setAccessible(true); - fAirTicks.setAccessible(true); - fNameVisible.setAccessible(true); - fCustomName.setAccessible(true); - fSilent.setAccessible(true); - if (majorVersion >= 10) fNoGravity.setAccessible(true); - fItem.setAccessible(true); - fArmorStandFlags.setAccessible(true); - - register.invoke(dataWatcher, fEntityFlags.get(null), entityFlags); - register.invoke(dataWatcher, fAirTicks.get(null), 300); - register.invoke(dataWatcher, fNameVisible.get(null), customName != null); - register.invoke(dataWatcher, fSilent.get(null), true); - if (majorVersion < 13) register.invoke(dataWatcher, fCustomName.get(null), customName != null ? customName : ""); - - if (nmsItemStack != null) { - register.invoke(dataWatcher, fItem.get(null), majorVersion < 11 ? com.google.common.base.Optional.of(nmsItemStack) : nmsItemStack); - } else { - register.invoke(dataWatcher, fArmorStandFlags.get(null), armorStandFlags); - } - - if (majorVersion >= 10) { - register.invoke(dataWatcher, fNoGravity.get(null), true); - if (majorVersion >= 13) { - if (customName != null) { - Object iChatBaseComponent = chatSerializerClass.getMethod("a", String.class).invoke(null, JsonBuilder.parse(customName).toString()); - register.invoke(dataWatcher, fCustomName.get(null), Optional.of(iChatBaseComponent)); - } else { - register.invoke(dataWatcher, fCustomName.get(null), Optional.empty()); - } - } - } - } - return dataWatcher; - } catch (InstantiationException | InvocationTargetException | NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) { - ShopChest.getInstance().getLogger().severe("Failed to create data watcher!"); - ShopChest.getInstance().debug("Failed to create data watcher"); - ShopChest.getInstance().debug(e); - } - return null; - } - - /** - * Get a free entity ID for use in {@link #createPacketSpawnEntity(ShopChest, int, UUID, Location, Vector, EntityType)} - * - * @return The id or {@code -1} if a free entity ID could not be retrieved. - */ - public static int getFreeEntityId() { - try { - Field entityCountField = new FieldResolver(entityClass).resolve("entityCount", "b"); - entityCountField.setAccessible(true); - if (entityCountField.getType() == int.class) { - int id = entityCountField.getInt(null); - entityCountField.setInt(null, id+1); - return id; - } else if (entityCountField.getType() == AtomicInteger.class) { - return ((AtomicInteger) entityCountField.get(null)).incrementAndGet(); - } - - return -1; - } catch (Exception e) { - return -1; - } - } - - /** - * Create a {@code PacketPlayOutSpawnEntity} object. - * Only {@link EntityType#ARMOR_STAND} and {@link EntityType#DROPPED_ITEM} are supported! - */ - public static Object createPacketSpawnEntity(ShopChest plugin, int id, UUID uuid, Location loc, EntityType type) { - try { - Class packetPlayOutSpawnEntityClass = nmsClassResolver.resolveSilent("network.protocol.game.PacketPlayOutSpawnEntity"); - Class entityTypesClass = nmsClassResolver.resolveSilent("world.entity.EntityTypes"); - Class vec3dClass = nmsClassResolver.resolveSilent("world.phys.Vec3D"); - - boolean isPre9 = getMajorVersion() < 9; - boolean isPre14 = getMajorVersion() < 14; - - double y = loc.getY(); - if (type == EntityType.ARMOR_STAND && !getServerVersion().equals("v1_8_R1")) { - // Marker armor stand => lift by normal armor stand height - y += 1.975; - } - - if (getMajorVersion() >= 17) { - // Empty packet constructor does not exist anymore in 1.17+ - Constructor c = packetPlayOutSpawnEntityClass.getConstructor(int.class, UUID.class, double.class, double.class, double.class, - float.class, float.class, entityTypesClass, int.class, vec3dClass); - - Object vec3d = vec3dClass.getField("a").get(null); - Object entityType = entityTypesClass.getField(type == EntityType.ARMOR_STAND ? "c" : "Q").get(null); - - return c.newInstance(id, uuid, loc.getX(), y, loc.getZ(), 0f, 0f, entityType, 0, vec3d); - } - - Object packet = packetPlayOutSpawnEntityClass.getConstructor().newInstance(); - - Field[] fields = new Field[12]; - fields[0] = packetPlayOutSpawnEntityClass.getDeclaredField("a"); // ID - fields[1] = packetPlayOutSpawnEntityClass.getDeclaredField("b"); // UUID (Only 1.9+) - fields[2] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "b" : "c"); // Loc X - fields[3] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "c" : "d"); // Loc Y - fields[4] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "d" : "e"); // Loc Z - fields[5] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "e" : "f"); // Mot X - fields[6] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "f" : "g"); // Mot Y - fields[7] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "g" : "h"); // Mot Z - fields[8] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "h" : "i"); // Pitch - fields[9] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "i" : "j"); // Yaw - fields[10] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "j" : "k"); // Type - fields[11] = packetPlayOutSpawnEntityClass.getDeclaredField(isPre9 ? "k" : "l"); // Data - - for (Field field : fields) { - field.setAccessible(true); - } - - Object entityType = null; - if (!isPre14) { - entityType = entityTypesClass.getField(type == EntityType.ARMOR_STAND ? "ARMOR_STAND" : "ITEM").get(null); - } - - fields[0].set(packet, id); - if (!isPre9) fields[1].set(packet, uuid); - if (isPre9) { - fields[2].set(packet, (int)(loc.getX() * 32)); - fields[3].set(packet, (int)(y * 32)); - fields[4].set(packet, (int)(loc.getZ() * 32)); - } else { - fields[2].set(packet, loc.getX()); - fields[3].set(packet, y); - fields[4].set(packet, loc.getZ()); - } - fields[5].set(packet, 0); - fields[6].set(packet, 0); - fields[7].set(packet, 0); - fields[8].set(packet, 0); - fields[9].set(packet, 0); - if (isPre14) fields[10].set(packet, type == EntityType.ARMOR_STAND ? 78 : 2); - else fields[10].set(packet, entityType); - fields[11].set(packet, 0); - - return packet; - } catch (NoSuchMethodException | NoSuchFieldException | IllegalAccessException | InvocationTargetException | InstantiationException e) { - plugin.getLogger().severe("Failed to create packet to spawn entity!"); - plugin.debug("Failed to create packet to spawn entity!"); - plugin.debug(e); - return null; - } - } - /** * Send a packet to a player * @param plugin An instance of the {@link ShopChest} plugin