From c6cf6c2c3bbf47929fd858a1430c248f5aa8f827 Mon Sep 17 00:00:00 2001 From: SBDeveloper Date: Fri, 1 Jul 2022 12:29:59 +0200 Subject: [PATCH] :zap: Moved class definitions out of methods --- .../mapreflectionapi/api/MapManager.java | 25 +++---------------- .../mapreflectionapi/api/MapSender.java | 13 +++++----- .../mapreflectionapi/api/MapWrapper.java | 22 +++++++--------- 3 files changed, 19 insertions(+), 41 deletions(-) diff --git a/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapManager.java b/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapManager.java index f661e5c..920737c 100644 --- a/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapManager.java +++ b/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapManager.java @@ -31,7 +31,6 @@ import org.jetbrains.annotations.Nullable; import tech.sbdevelopment.mapreflectionapi.exceptions.MapLimitExceededException; import java.awt.image.BufferedImage; -import java.lang.reflect.InvocationTargetException; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -40,24 +39,12 @@ import java.util.concurrent.CopyOnWriteArrayList; public class MapManager { protected final Set OCCUPIED_IDS = new HashSet<>(); private final List MANAGED_MAPS = new CopyOnWriteArrayList<>(); - private final Class wrapperClass; public MapManager(JavaPlugin plugin) throws IllegalStateException { String packageName = Bukkit.getServer().getClass().getPackage().getName(); String version = packageName.substring(packageName.lastIndexOf('.') + 1); plugin.getLogger().info("Initializing the map manager for Minecraft version " + version + "..."); - - try { - final Class clazz = Class.forName("tech.sbdevelopment.mapreflectionapi.nms.MapWrapper_" + version); - if (MapWrapper.class.isAssignableFrom(clazz)) { - wrapperClass = clazz; - } else { - throw new IllegalStateException("Plugin corrupted! Detected invalid MapWrapper class."); - } - } catch (Exception ex) { - throw new IllegalStateException("This Spigot version (" + version + ") is not supported! Contact the developer to get support."); - } } @Nullable @@ -74,15 +61,9 @@ public class MapManager { } private MapWrapper wrapNewImage(ArrayImage image) { - try { - MapWrapper wrapper = (MapWrapper) wrapperClass.getDeclaredConstructor(ArrayImage.class).newInstance(image); - MANAGED_MAPS.add(wrapper); - return wrapper; - } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | - InvocationTargetException e) { - e.printStackTrace(); - return null; - } + MapWrapper wrapper = new MapWrapper(image); + MANAGED_MAPS.add(wrapper); + return wrapper; } public void unwrapImage(MapWrapper wrapper) { diff --git a/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapSender.java b/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapSender.java index 89fef87..ce2b72e 100644 --- a/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapSender.java +++ b/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapSender.java @@ -63,6 +63,9 @@ public class MapSender { }, 0, 2); } + private static final Class packetPlayOutMapClass = ReflectionUtils.getNMSClass("network.protocol.game", "PacketPlayOutMap"); + private static final Class worldMapData = ReflectionUtils.supports(17) ? ReflectionUtils.getNMSClass("world.level.saveddata.maps", "WorldMap") : null; + public static void sendMap(final int id0, final ArrayImage content, final Player player) { if (player == null || !player.isOnline()) { List toRemove = new ArrayList<>(); @@ -79,12 +82,10 @@ public class MapSender { return; } - Class packetClass = ReflectionUtils.getNMSClass("network.protocol.game", "PacketPlayOutMap"); final int id = -id0; Object packet; if (ReflectionUtils.supports(17)) { //1.17+ - Class worldMapClass = ReflectionUtils.getNMSClass("world.level.saveddata.maps", "WorldMap"); - Object updateData = ReflectionUtil.callConstructor(worldMapClass, + Object updateData = ReflectionUtil.callConstructor(worldMapData, content.minX, //X pos content.minY, //Y pos content.maxX, //X size (2nd X pos) @@ -92,7 +93,7 @@ public class MapSender { content.array //Data ); - packet = ReflectionUtil.callConstructor(packetClass, + packet = ReflectionUtil.callConstructor(packetPlayOutMapClass, id, //ID (byte) 0, //Scale false, //Show icons @@ -100,7 +101,7 @@ public class MapSender { updateData ); } else if (ReflectionUtils.supports(14)) { //1.16-1.14 - packet = ReflectionUtil.callConstructor(packetClass, + packet = ReflectionUtil.callConstructor(packetPlayOutMapClass, id, //ID (byte) 0, //Scale false, //Tracking position @@ -113,7 +114,7 @@ public class MapSender { content.maxY //Y size (2nd Y pos) ); } else { //1.13- - packet = ReflectionUtil.callConstructor(packetClass, + packet = ReflectionUtil.callConstructor(packetPlayOutMapClass, id, //ID (byte) 0, //Scale false, //??? diff --git a/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java b/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java index 41f460d..c626fae 100644 --- a/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java +++ b/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java @@ -43,6 +43,15 @@ public class MapWrapper { this.content = image; } + private static final Class craftStackClass = ReflectionUtils.getCraftClass("CraftItemStack"); + private static final Class setSlotPacketClass = ReflectionUtils.getNMSClass("network.protocol.game", "PacketPlayOutSetSlot"); + private static final Class tagCompoundClass = ReflectionUtils.getCraftClass("NBTTagCompound"); + private static final Class entityClass = ReflectionUtils.getNMSClass("world.entity", "Entity"); + private static final Class dataWatcherClass = ReflectionUtils.getNMSClass("network.syncher", "DataWatcher"); + private static final Class entityMetadataPacketClass = ReflectionUtils.getNMSClass("network.protocol.game", "PacketPlayOutEntityMetadata"); + private static final Class entityItemFrameClass = ReflectionUtils.getNMSClass("world.entity.decoration", "EntityItemFrame"); + private static final Class dataWatcherItemClass = ReflectionUtils.getNMSClass("network.syncher", "DataWatcher$Item"); + protected MapController controller = new MapController() { private final Map viewers = new HashMap<>(); @@ -134,10 +143,8 @@ public class MapWrapper { ItemStack stack = new ItemStack(ReflectionUtils.supports(13) ? Material.FILLED_MAP : Material.MAP, 1); - Class craftStackClass = ReflectionUtils.getCraftClass("CraftItemStack"); Object nmsStack = ReflectionUtil.callMethod(craftStackClass, "asNMSCopy", stack); - Class setSlotPacketClass = ReflectionUtils.getNMSClass("network.protocol.game", "PacketPlayOutSetSlot"); Object packet; if (ReflectionUtils.supports(17)) { //1.17+ int stateId = (int) ReflectionUtil.callMethod(inventoryMenu, ReflectionUtils.supports(18) ? "j" : "getStateId"); @@ -240,26 +247,17 @@ public class MapWrapper { } private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) { - Class craftStackClass = ReflectionUtils.getCraftClass("CraftItemStack"); Object nmsStack = ReflectionUtil.callMethod(craftStackClass, "asNMSCopy", stack); - Object nbtObject = ReflectionUtil.callMethod(nmsStack, ReflectionUtils.supports(19) ? "v" : ReflectionUtils.supports(18) ? "u" : ReflectionUtils.supports(13) ? "getOrCreateTag" : "getTag"); if (!ReflectionUtils.supports(13) && nbtObject == null) { //1.12 has no getOrCreate, call create if null! - Class tagCompoundClass = ReflectionUtils.getCraftClass("NBTTagCompound"); Object tagCompound = ReflectionUtil.callConstructor(tagCompoundClass); - ReflectionUtil.callMethod(nbtObject, "setTag", tagCompound); } ReflectionUtil.callMethod(nbtObject, ReflectionUtils.supports(18) ? "a" : "setInt", "map", mapId); - - Class entityClass = ReflectionUtils.getNMSClass("world.entity", "Entity"); - - Class dataWatcherClass = ReflectionUtils.getNMSClass("network.syncher", "DataWatcher"); Object dataWatcher = ReflectionUtil.callConstructor(dataWatcherClass, entityClass.cast(null)); - Class entityMetadataPacketClass = ReflectionUtils.getNMSClass("network.protocol.game", "PacketPlayOutEntityMetadata"); Object packet = ReflectionUtil.callConstructor(entityMetadataPacketClass, entityId, dataWatcher, //dummy watcher! @@ -267,9 +265,7 @@ public class MapWrapper { ); List list = new ArrayList<>(); - Class entityItemFrameClass = ReflectionUtils.getNMSClass("world.entity.decoration", "EntityItemFrame"); Object dataWatcherObject = ReflectionUtil.getDeclaredField(entityItemFrameClass, ReflectionUtils.supports(17) ? "ao" : ReflectionUtils.supports(14) ? "ITEM" : ReflectionUtils.supports(13) ? "e" : "c"); - Class dataWatcherItemClass = ReflectionUtils.getNMSClass("network.syncher", "DataWatcher$Item"); Object dataWatcherItem = ReflectionUtil.callConstructor(dataWatcherItemClass, dataWatcherObject, nmsStack); list.add(dataWatcherItem); ReflectionUtil.setDeclaredField(packet, "b", list);