From bfaa99e5dd79f4df1d7ae68389fe06bcc52202f5 Mon Sep 17 00:00:00 2001 From: SBDeveloper Date: Thu, 30 Jun 2022 19:26:51 +0200 Subject: [PATCH] :recycle: Improved the API --- API/pom.xml | 29 ++++++++ .../mapreflectionapi/MapReflectionAPI.java | 14 ++-- .../mapreflectionapi/api/MapManager.java | 9 ++- .../mapreflectionapi/api/MapWrapper.java | 14 +++- .../api/events/MapInteractEvent.java | 2 + .../listeners/PacketListener.java | 27 ++----- .../mapreflectionapi/util/ReflectionUtil.java | 54 ++++++++++++++ .../nms/MapWrapper_v1_12_R1.java | 40 ++++++----- .../nms/PacketListener_v1_12_R1.java | 3 + .../nms/MapWrapper_v1_13_R2.java | 39 +++++----- .../nms/PacketListener_v1_13_R2.java | 3 + .../nms/MapWrapper_v1_14_R1.java | 39 +++++----- .../nms/PacketListener_v1_14_R1.java | 3 + .../nms/MapWrapper_v1_15_R1.java | 40 ++++++----- .../nms/PacketListener_v1_15_R1.java | 3 + .../nms/MapWrapper_v1_16_R3.java | 39 +++++----- .../nms/PacketListener_v1_16_R3.java | 3 + NMS-v1_17_R1/pom.xml | 71 +++++++------------ .../nms/MapSender_v1_17_R1.java | 2 +- .../nms/MapWrapper_v1_17_R1.java | 46 ++++++------ .../nms/PacketListener_v1_17_R1.java | 19 ++--- NMS-v1_18_R2/pom.xml | 71 +++++++------------ .../nms/MapSender_v1_18_R2.java | 4 +- .../nms/MapWrapper_v1_18_R2.java | 48 +++++++------ .../nms/PacketListener_v1_18_R2.java | 21 +++--- NMS-v1_19_R1/pom.xml | 71 +++++++------------ .../nms/MapSender_v1_19_R1.java | 2 +- .../nms/MapWrapper_v1_19_R1.java | 48 +++++++------ .../nms/PacketListener_v1_19_R1.java | 21 +++--- 29 files changed, 444 insertions(+), 341 deletions(-) create mode 100644 API/src/main/java/tech/sbdevelopment/mapreflectionapi/util/ReflectionUtil.java diff --git a/API/pom.xml b/API/pom.xml index 8ff91cc..ac17197 100644 --- a/API/pom.xml +++ b/API/pom.xml @@ -1,4 +1,27 @@ + + @@ -62,6 +85,12 @@ + + + src/main/resources + true + + diff --git a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/MapReflectionAPI.java b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/MapReflectionAPI.java index 69abbdc..e12d932 100644 --- a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/MapReflectionAPI.java +++ b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/MapReflectionAPI.java @@ -61,15 +61,19 @@ public class MapReflectionAPI extends JavaPlugin { return; } - getLogger().info("Initializing the packet handler..."); - packetListener = PacketListener.construct(); + try { + packetListener = PacketListener.construct(this); + } catch (IllegalStateException e) { + getLogger().log(Level.SEVERE, e.getMessage(), e); + Bukkit.getPluginManager().disablePlugin(this); + return; + } packetListener.init(this); - getLogger().info("Initializing the map manager..."); try { - mapManager = new MapManager(); + mapManager = new MapManager(this); } catch (IllegalStateException e) { - e.printStackTrace(); + getLogger().log(Level.SEVERE, e.getMessage(), e); Bukkit.getPluginManager().disablePlugin(this); return; } diff --git a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapManager.java b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapManager.java index c24c582..26d1e5a 100644 --- a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapManager.java +++ b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapManager.java @@ -26,6 +26,7 @@ package tech.sbdevelopment.mapreflectionapi.api; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.Nullable; import tech.sbdevelopment.mapreflectionapi.exceptions.MapLimitExceededException; @@ -41,10 +42,12 @@ public class MapManager { private final List MANAGED_MAPS = new CopyOnWriteArrayList<>(); private final Class wrapperClass; - public MapManager() throws IllegalStateException { + 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)) { @@ -53,7 +56,7 @@ public class MapManager { throw new IllegalStateException("Plugin corrupted! Detected invalid MapWrapper class."); } } catch (Exception ex) { - throw new IllegalStateException("This Spigot version is not supported! Contact the developer to get support."); + throw new IllegalStateException("This Spigot version (" + version + ") is not supported! Contact the developer to get support."); } } @@ -72,7 +75,7 @@ public class MapManager { private MapWrapper wrapNewImage(ArrayImage image) { try { - MapWrapper wrapper = (MapWrapper) wrapperClass.getDeclaredConstructor().newInstance(); + MapWrapper wrapper = (MapWrapper) wrapperClass.getDeclaredConstructor(ArrayImage.class).newInstance(image); MANAGED_MAPS.add(wrapper); return wrapper; } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | diff --git a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java index baac909..e797653 100644 --- a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java +++ b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/MapWrapper.java @@ -23,8 +23,16 @@ package tech.sbdevelopment.mapreflectionapi.api; -public interface MapWrapper { - MapController getController(); +public abstract class MapWrapper { + protected ArrayImage content; - ArrayImage getContent(); + public MapWrapper(ArrayImage image) { + this.content = image; + } + + public abstract MapController getController(); + + public ArrayImage getContent() { + return content; + } } diff --git a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/events/MapInteractEvent.java b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/events/MapInteractEvent.java index e43a75e..327c762 100644 --- a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/events/MapInteractEvent.java +++ b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/api/events/MapInteractEvent.java @@ -85,6 +85,8 @@ public class MapInteractEvent extends Event implements Cancellable { } public ItemFrame getFrame() { + if (getMapWrapper() == null) return null; + if (frame == null) { frame = getMapWrapper().getController().getItemFrameById(player.getWorld(), entityID); } diff --git a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java index 62a47be..6079a40 100644 --- a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java +++ b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/listeners/PacketListener.java @@ -31,26 +31,25 @@ import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.util.Vector; -import tech.sbdevelopment.mapreflectionapi.api.MapWrapper; - -import java.lang.reflect.Field; public abstract class PacketListener implements Listener { protected JavaPlugin plugin; - public static PacketListener construct() { + public static PacketListener construct(JavaPlugin plugin) throws IllegalStateException { String packageName = Bukkit.getServer().getClass().getPackage().getName(); String version = packageName.substring(packageName.lastIndexOf('.') + 1); + plugin.getLogger().info("Initializing the packet handler for Minecraft version " + version + "..."); + try { - final Class clazz = Class.forName("tech.sbdevelopment.mapreflectionapi.nms.MapWrapper_" + version); - if (MapWrapper.class.isAssignableFrom(clazz)) { + final Class clazz = Class.forName("tech.sbdevelopment.mapreflectionapi.nms.PacketListener_" + version); + if (PacketListener.class.isAssignableFrom(clazz)) { return (PacketListener) clazz.getDeclaredConstructor().newInstance(); } else { - throw new IllegalStateException("Plugin corrupted! Detected invalid MapWrapper class."); + throw new IllegalStateException("Plugin corrupted! Detected invalid PacketListener class."); } } catch (Exception ex) { - throw new IllegalStateException("This Spigot version is not supported! Contact the developer to get support."); + throw new IllegalStateException("This Minecraft version (" + version + ") is not supported! Contact the developer to get support."); } } @@ -83,16 +82,4 @@ public abstract class PacketListener implements Listener { return false; } } - - protected Object getField(Object packet, String field) throws NoSuchFieldException, IllegalAccessException { - Field f = packet.getClass().getDeclaredField(field); - f.setAccessible(true); - return f.get(packet); - } - - protected void setField(Object packet, String field, Object value) throws NoSuchFieldException, IllegalAccessException { - Field f = packet.getClass().getDeclaredField(field); - f.setAccessible(true); - f.set(packet, value); - } } diff --git a/API/src/main/java/tech/sbdevelopment/mapreflectionapi/util/ReflectionUtil.java b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/util/ReflectionUtil.java new file mode 100644 index 0000000..9c508a7 --- /dev/null +++ b/API/src/main/java/tech/sbdevelopment/mapreflectionapi/util/ReflectionUtil.java @@ -0,0 +1,54 @@ +/* + * This file is part of MapReflectionAPI. + * Copyright (c) 2022 inventivetalent / SBDevelopment - All Rights Reserved + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package tech.sbdevelopment.mapreflectionapi.util; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +public class ReflectionUtil { + public static Object getField(Object packet, String field) throws NoSuchFieldException, IllegalAccessException { + Field f = packet.getClass().getDeclaredField(field); + f.setAccessible(true); + return f.get(packet); + } + + public static Object getField(Class clazz, String field) throws NoSuchFieldException, IllegalAccessException { + Field f = clazz.getDeclaredField(field); + f.setAccessible(true); + return f.get(null); + } + + public static void setField(Object packet, String field, Object value) throws NoSuchFieldException, IllegalAccessException { + Field f = packet.getClass().getDeclaredField(field); + f.setAccessible(true); + f.set(packet, value); + } + + public static Object getValue(Object packet, String method) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { + Method m = packet.getClass().getDeclaredMethod(method, null); + m.setAccessible(true); + return m.invoke(packet, null); + } +} diff --git a/NMS-v1_12_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_12_R1.java b/NMS-v1_12_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_12_R1.java index 9573a46..6a38063 100644 --- a/NMS-v1_12_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_12_R1.java +++ b/NMS-v1_12_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_12_R1.java @@ -41,13 +41,12 @@ import tech.sbdevelopment.mapreflectionapi.api.MapController; import tech.sbdevelopment.mapreflectionapi.api.MapWrapper; import tech.sbdevelopment.mapreflectionapi.exceptions.MapLimitExceededException; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; -public class MapWrapper_v1_12_R1 implements MapWrapper { - protected ArrayImage content; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; +public class MapWrapper_v1_12_R1 extends MapWrapper { protected MapController controller = new MapController() { private final Map viewers = new HashMap<>(); @@ -140,7 +139,7 @@ public class MapWrapper_v1_12_R1 implements MapWrapper { net.minecraft.server.v1_12_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); PacketPlayOutSetSlot packet = new PacketPlayOutSetSlot(windowId, slot, nmsStack); - ((EntityPlayer) player).playerConnection.sendPacket(packet); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } @Override @@ -222,23 +221,32 @@ public class MapWrapper_v1_12_R1 implements MapWrapper { private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) { net.minecraft.server.v1_12_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); - nmsStack.getTag().setInt("map", mapId); + if (nmsStack.getTag() == null) nmsStack.setTag(new NBTTagCompound()); //No orCreate on 1.12.2! + nmsStack.getTag().setInt("map", mapId); //getTag putInt - DataWatcher watcher = new DataWatcher(null); - watcher.set(DataWatcher.a(EntityItemFrame.class, DataWatcherRegistry.f), nmsStack); + PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, new DataWatcher(null), true); - PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, watcher, true); - ((EntityPlayer) player).playerConnection.sendPacket(packet); + try { + List> list = new ArrayList<>(); + DataWatcherObject dataWatcherObject = (DataWatcherObject) getField(EntityItemFrame.class, "c"); + DataWatcher.Item dataWatcherItem = new DataWatcher.Item<>(dataWatcherObject, nmsStack); + list.add(dataWatcherItem); + setField(packet, "b", list); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } }; + public MapWrapper_v1_12_R1(ArrayImage image) { + super(image); + } + @Override public MapController getController() { return controller; } - - @Override - public ArrayImage getContent() { - return content; - } } diff --git a/NMS-v1_12_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_12_R1.java b/NMS-v1_12_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_12_R1.java index 0230c11..1bb0a0a 100644 --- a/NMS-v1_12_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_12_R1.java +++ b/NMS-v1_12_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_12_R1.java @@ -38,6 +38,9 @@ import tech.sbdevelopment.mapreflectionapi.listeners.PacketListener; import java.util.concurrent.TimeUnit; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; + public class PacketListener_v1_12_R1 extends PacketListener { @Override protected void injectPlayer(Player p) { diff --git a/NMS-v1_13_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_13_R2.java b/NMS-v1_13_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_13_R2.java index 76ca636..9878916 100644 --- a/NMS-v1_13_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_13_R2.java +++ b/NMS-v1_13_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_13_R2.java @@ -41,13 +41,12 @@ import tech.sbdevelopment.mapreflectionapi.api.MapController; import tech.sbdevelopment.mapreflectionapi.api.MapWrapper; import tech.sbdevelopment.mapreflectionapi.exceptions.MapLimitExceededException; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; -public class MapWrapper_v1_13_R2 implements MapWrapper { - protected ArrayImage content; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; +public class MapWrapper_v1_13_R2 extends MapWrapper { protected MapController controller = new MapController() { private final Map viewers = new HashMap<>(); @@ -140,7 +139,7 @@ public class MapWrapper_v1_13_R2 implements MapWrapper { net.minecraft.server.v1_13_R2.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); PacketPlayOutSetSlot packet = new PacketPlayOutSetSlot(windowId, slot, nmsStack); - ((EntityPlayer) player).playerConnection.sendPacket(packet); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } @Override @@ -222,23 +221,31 @@ public class MapWrapper_v1_13_R2 implements MapWrapper { private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) { net.minecraft.server.v1_13_R2.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); - nmsStack.getOrCreateTag().setInt("map", mapId); + nmsStack.getOrCreateTag().setInt("map", mapId); //getOrCreateTag putInt - DataWatcher watcher = new DataWatcher(null); - watcher.set(DataWatcher.a(EntityItemFrame.class, DataWatcherRegistry.g), nmsStack); + PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, new DataWatcher(null), true); - PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, watcher, true); - ((EntityPlayer) player).playerConnection.sendPacket(packet); + try { + List> list = new ArrayList<>(); + DataWatcherObject dataWatcherObject = (DataWatcherObject) getField(EntityItemFrame.class, "e"); + DataWatcher.Item dataWatcherItem = new DataWatcher.Item<>(dataWatcherObject, nmsStack); + list.add(dataWatcherItem); + setField(packet, "b", list); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } }; + public MapWrapper_v1_13_R2(ArrayImage image) { + super(image); + } + @Override public MapController getController() { return controller; } - - @Override - public ArrayImage getContent() { - return content; - } } diff --git a/NMS-v1_13_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_13_R2.java b/NMS-v1_13_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_13_R2.java index a24bc24..684f970 100644 --- a/NMS-v1_13_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_13_R2.java +++ b/NMS-v1_13_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_13_R2.java @@ -38,6 +38,9 @@ import tech.sbdevelopment.mapreflectionapi.listeners.PacketListener; import java.util.concurrent.TimeUnit; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; + public class PacketListener_v1_13_R2 extends PacketListener { @Override protected void injectPlayer(Player p) { diff --git a/NMS-v1_14_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_14_R1.java b/NMS-v1_14_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_14_R1.java index 39ef453..8699978 100644 --- a/NMS-v1_14_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_14_R1.java +++ b/NMS-v1_14_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_14_R1.java @@ -41,13 +41,12 @@ import tech.sbdevelopment.mapreflectionapi.api.MapController; import tech.sbdevelopment.mapreflectionapi.api.MapWrapper; import tech.sbdevelopment.mapreflectionapi.exceptions.MapLimitExceededException; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; -public class MapWrapper_v1_14_R1 implements MapWrapper { - protected ArrayImage content; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; +public class MapWrapper_v1_14_R1 extends MapWrapper { protected MapController controller = new MapController() { private final Map viewers = new HashMap<>(); @@ -140,7 +139,7 @@ public class MapWrapper_v1_14_R1 implements MapWrapper { net.minecraft.server.v1_14_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); PacketPlayOutSetSlot packet = new PacketPlayOutSetSlot(windowId, slot, nmsStack); - ((EntityPlayer) player).playerConnection.sendPacket(packet); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } @Override @@ -222,23 +221,31 @@ public class MapWrapper_v1_14_R1 implements MapWrapper { private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) { net.minecraft.server.v1_14_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); - nmsStack.getOrCreateTag().setInt("map", mapId); + nmsStack.getOrCreateTag().setInt("map", mapId); //getOrCreateTag putInt - DataWatcher watcher = new DataWatcher(null); - watcher.set(DataWatcher.a(EntityItemFrame.class, DataWatcherRegistry.g), nmsStack); + PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, new DataWatcher(null), true); - PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, watcher, true); - ((EntityPlayer) player).playerConnection.sendPacket(packet); + try { + List> list = new ArrayList<>(); + DataWatcherObject dataWatcherObject = (DataWatcherObject) getField(EntityItemFrame.class, "ITEM"); + DataWatcher.Item dataWatcherItem = new DataWatcher.Item<>(dataWatcherObject, nmsStack); + list.add(dataWatcherItem); + setField(packet, "b", list); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } }; + public MapWrapper_v1_14_R1(ArrayImage image) { + super(image); + } + @Override public MapController getController() { return controller; } - - @Override - public ArrayImage getContent() { - return content; - } } diff --git a/NMS-v1_14_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_14_R1.java b/NMS-v1_14_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_14_R1.java index 2704c65..a1c9e6a 100644 --- a/NMS-v1_14_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_14_R1.java +++ b/NMS-v1_14_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_14_R1.java @@ -38,6 +38,9 @@ import tech.sbdevelopment.mapreflectionapi.listeners.PacketListener; import java.util.concurrent.TimeUnit; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; + public class PacketListener_v1_14_R1 extends PacketListener { @Override protected void injectPlayer(Player p) { diff --git a/NMS-v1_15_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_15_R1.java b/NMS-v1_15_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_15_R1.java index 01c8f0c..c6d7412 100644 --- a/NMS-v1_15_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_15_R1.java +++ b/NMS-v1_15_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_15_R1.java @@ -41,12 +41,12 @@ import tech.sbdevelopment.mapreflectionapi.api.MapController; import tech.sbdevelopment.mapreflectionapi.api.MapWrapper; import tech.sbdevelopment.mapreflectionapi.exceptions.MapLimitExceededException; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; -public class MapWrapper_v1_15_R1 implements MapWrapper { - protected ArrayImage content; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; + +public class MapWrapper_v1_15_R1 extends MapWrapper { protected MapController controller = new MapController() { private final Map viewers = new HashMap<>(); @@ -140,7 +140,7 @@ public class MapWrapper_v1_15_R1 implements MapWrapper { net.minecraft.server.v1_15_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); PacketPlayOutSetSlot packet = new PacketPlayOutSetSlot(windowId, slot, nmsStack); - ((EntityPlayer) player).playerConnection.sendPacket(packet); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } @Override @@ -222,23 +222,31 @@ public class MapWrapper_v1_15_R1 implements MapWrapper { private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) { net.minecraft.server.v1_15_R1.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); - nmsStack.getOrCreateTag().setInt("map", mapId); + nmsStack.getOrCreateTag().setInt("map", mapId); //getOrCreateTag putInt - DataWatcher watcher = new DataWatcher(null); - watcher.set(DataWatcher.a(EntityItemFrame.class, DataWatcherRegistry.g), nmsStack); + PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, new DataWatcher(null), true); - PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, watcher, true); - ((EntityPlayer) player).playerConnection.sendPacket(packet); + try { + List> list = new ArrayList<>(); + DataWatcherObject dataWatcherObject = (DataWatcherObject) getField(EntityItemFrame.class, "ITEM"); + DataWatcher.Item dataWatcherItem = new DataWatcher.Item<>(dataWatcherObject, nmsStack); + list.add(dataWatcherItem); + setField(packet, "b", list); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } }; + public MapWrapper_v1_15_R1(ArrayImage image) { + super(image); + } + @Override public MapController getController() { return controller; } - - @Override - public ArrayImage getContent() { - return content; - } } diff --git a/NMS-v1_15_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_15_R1.java b/NMS-v1_15_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_15_R1.java index ed08894..b34bf35 100644 --- a/NMS-v1_15_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_15_R1.java +++ b/NMS-v1_15_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_15_R1.java @@ -38,6 +38,9 @@ import tech.sbdevelopment.mapreflectionapi.listeners.PacketListener; import java.util.concurrent.TimeUnit; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; + public class PacketListener_v1_15_R1 extends PacketListener { @Override protected void injectPlayer(Player p) { diff --git a/NMS-v1_16_R3/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_16_R3.java b/NMS-v1_16_R3/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_16_R3.java index 04ab721..0e8d77a 100644 --- a/NMS-v1_16_R3/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_16_R3.java +++ b/NMS-v1_16_R3/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_16_R3.java @@ -41,13 +41,12 @@ import tech.sbdevelopment.mapreflectionapi.api.MapController; import tech.sbdevelopment.mapreflectionapi.api.MapWrapper; import tech.sbdevelopment.mapreflectionapi.exceptions.MapLimitExceededException; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; -public class MapWrapper_v1_16_R3 implements MapWrapper { - protected ArrayImage content; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; +public class MapWrapper_v1_16_R3 extends MapWrapper { protected MapController controller = new MapController() { private final Map viewers = new HashMap<>(); @@ -140,7 +139,7 @@ public class MapWrapper_v1_16_R3 implements MapWrapper { net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); PacketPlayOutSetSlot packet = new PacketPlayOutSetSlot(windowId, slot, nmsStack); - ((EntityPlayer) player).playerConnection.sendPacket(packet); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } @Override @@ -222,23 +221,31 @@ public class MapWrapper_v1_16_R3 implements MapWrapper { private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) { net.minecraft.server.v1_16_R3.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); - nmsStack.getOrCreateTag().setInt("map", mapId); + nmsStack.getOrCreateTag().setInt("map", mapId); //getOrCreateTag putInt - DataWatcher watcher = new DataWatcher(null); - watcher.set(DataWatcher.a(EntityItemFrame.class, DataWatcherRegistry.g), nmsStack); + PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, new DataWatcher(null), true); - PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, watcher, true); - ((EntityPlayer) player).playerConnection.sendPacket(packet); + try { + List> list = new ArrayList<>(); + DataWatcherObject dataWatcherObject = (DataWatcherObject) getField(EntityItemFrame.class, "ITEM"); + DataWatcher.Item dataWatcherItem = new DataWatcher.Item<>(dataWatcherObject, nmsStack); + list.add(dataWatcherItem); + setField(packet, "b", list); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } }; + public MapWrapper_v1_16_R3(ArrayImage image) { + super(image); + } + @Override public MapController getController() { return controller; } - - @Override - public ArrayImage getContent() { - return content; - } } diff --git a/NMS-v1_16_R3/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_16_R3.java b/NMS-v1_16_R3/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_16_R3.java index c6b74cd..d4ab81a 100644 --- a/NMS-v1_16_R3/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_16_R3.java +++ b/NMS-v1_16_R3/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_16_R3.java @@ -38,6 +38,9 @@ import tech.sbdevelopment.mapreflectionapi.listeners.PacketListener; import java.util.concurrent.TimeUnit; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; + public class PacketListener_v1_16_R3 extends PacketListener { @Override protected void injectPlayer(Player p) { diff --git a/NMS-v1_17_R1/pom.xml b/NMS-v1_17_R1/pom.xml index 3728e19..b36444c 100644 --- a/NMS-v1_17_R1/pom.xml +++ b/NMS-v1_17_R1/pom.xml @@ -1,4 +1,27 @@ + + @@ -26,43 +49,6 @@ ${jdk.version} - - net.md-5 - specialsource-maven-plugin - 1.2.3 - - - package - - remap - - remap-obf - - org.spigotmc:minecraft-server:${NMSVersion}:txt:maps-mojang - true - org.spigotmc:spigot:${NMSVersion}:jar:remapped-mojang - - true - remapped-obf - - - - package - - remap - - remap-spigot - - - ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - - org.spigotmc:minecraft-server:${NMSVersion}:csrg:maps-spigot - org.spigotmc:spigot:${NMSVersion}:jar:remapped-obf - - - - - org.apache.maven.plugins maven-deploy-plugin @@ -76,18 +62,11 @@ - org.spigotmc - minecraft-server + org.bukkit + craftbukkit ${NMSVersion} provided - - org.spigotmc - spigot - ${NMSVersion} - remapped-mojang - provided - tech.sbdevelopment MapReflectionAPI-API diff --git a/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_17_R1.java b/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_17_R1.java index aa1f7f5..c639def 100644 --- a/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_17_R1.java +++ b/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_17_R1.java @@ -99,7 +99,7 @@ public class MapSender_v1_17_R1 { updateData ); - ((CraftPlayer) player).getHandle().connection.send(packet); + ((CraftPlayer) player).getHandle().b.sendPacket(packet); //connection send() } catch (Exception e) { e.printStackTrace(); } diff --git a/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_17_R1.java b/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_17_R1.java index a0d74e0..6481d83 100644 --- a/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_17_R1.java +++ b/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_17_R1.java @@ -26,8 +26,7 @@ package tech.sbdevelopment.mapreflectionapi.nms; import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; import net.minecraft.network.protocol.game.PacketPlayOutSetSlot; import net.minecraft.network.syncher.DataWatcher; -import net.minecraft.network.syncher.DataWatcherRegistry; -import net.minecraft.server.level.EntityPlayer; +import net.minecraft.network.syncher.DataWatcherObject; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.decoration.EntityItemFrame; import org.bukkit.*; @@ -45,13 +44,12 @@ import tech.sbdevelopment.mapreflectionapi.api.MapController; import tech.sbdevelopment.mapreflectionapi.api.MapWrapper; import tech.sbdevelopment.mapreflectionapi.exceptions.MapLimitExceededException; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; -public class MapWrapper_v1_17_R1 implements MapWrapper { - protected ArrayImage content; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; +public class MapWrapper_v1_17_R1 extends MapWrapper { protected MapController controller = new MapController() { private final Map viewers = new HashMap<>(); @@ -138,14 +136,14 @@ public class MapWrapper_v1_17_R1 implements MapWrapper { } CraftPlayer craftPlayer = (CraftPlayer) player; - int windowId = craftPlayer.getHandle().inventoryMenu.containerId; - int stateId = craftPlayer.getHandle().inventoryMenu.getStateId(); + int windowId = craftPlayer.getHandle().bU.j; //inventoryMenu containerId + int stateId = craftPlayer.getHandle().bU.getStateId(); //inventoryMenu getStateId() ItemStack stack = new ItemStack(Material.MAP, 1); net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); PacketPlayOutSetSlot packet = new PacketPlayOutSetSlot(windowId, stateId, slot, nmsStack); - ((EntityPlayer) player).connection.sendPacket(packet); + ((CraftPlayer) player).getHandle().b.sendPacket(packet); } @Override @@ -226,23 +224,31 @@ public class MapWrapper_v1_17_R1 implements MapWrapper { private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) { net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); - nmsStack.getOrCreateTag().setInt("map", mapId); + nmsStack.getOrCreateTag().setInt("map", mapId); //getOrCreateTag putInt - DataWatcher watcher = new DataWatcher(null); - watcher.set(DataWatcher.a(EntityItemFrame.class, DataWatcherRegistry.ITEM_STACK), nmsStack); + PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, new DataWatcher(null), true); - PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, watcher, true); - ((EntityPlayer) player).connection.sendPacket(packet); + try { + List> list = new ArrayList<>(); + DataWatcherObject dataWatcherObject = (DataWatcherObject) getField(EntityItemFrame.class, "ao"); + DataWatcher.Item dataWatcherItem = new DataWatcher.Item<>(dataWatcherObject, nmsStack); + list.add(dataWatcherItem); + setField(packet, "b", list); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + ((CraftPlayer) player).getHandle().b.sendPacket(packet); } }; + public MapWrapper_v1_17_R1(ArrayImage image) { + super(image); + } + @Override public MapController getController() { return controller; } - - @Override - public ArrayImage getContent() { - return content; - } } \ No newline at end of file diff --git a/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_17_R1.java b/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_17_R1.java index a04fb53..f9450d9 100644 --- a/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_17_R1.java +++ b/NMS-v1_17_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_17_R1.java @@ -43,6 +43,8 @@ import tech.sbdevelopment.mapreflectionapi.listeners.PacketListener; import java.util.concurrent.TimeUnit; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.*; + public class PacketListener_v1_17_R1 extends PacketListener { @Override protected void injectPlayer(Player p) { @@ -51,7 +53,7 @@ public class PacketListener_v1_17_R1 extends PacketListener { //On send packet public void write(ChannelHandlerContext ctx, Object packet, ChannelPromise promise) throws Exception { if (packet instanceof PacketPlayOutMap packetPlayOutMap) { - int id = packetPlayOutMap.b(); + int id = (int) getField(packetPlayOutMap, "a"); if (id < 0) { //It's one of our maps, invert ID and let through! @@ -76,13 +78,14 @@ public class PacketListener_v1_17_R1 extends PacketListener { public void channelRead(ChannelHandlerContext ctx, Object packet) throws Exception { if (packet instanceof PacketPlayInUseEntity packetPlayInUseEntity) { int entityId = (int) getField(packetPlayInUseEntity, "a"); //entityId - Enum action = (Enum) getField(packetPlayInUseEntity, "b"); //action - EnumHand hand = (EnumHand) getField(action, "a"); //hand + Object action = getField(packetPlayInUseEntity, "b"); //action + Enum actionEnum = (Enum) getValue(action, "a"); //action type + EnumHand hand = hasField(action, "a") ? (EnumHand) getField(action, "a") : null; //hand Vec3D pos = hasField(action, "b") ? (Vec3D) getField(action, "b") : null; //pos if (Bukkit.getScheduler().callSyncMethod(plugin, () -> { boolean async = !plugin.getServer().isPrimaryThread(); - MapInteractEvent event = new MapInteractEvent(p, entityId, action.ordinal(), pos != null ? vec3DToVector(pos) : null, hand != null ? hand.ordinal() : 0, async); + MapInteractEvent event = new MapInteractEvent(p, entityId, actionEnum.ordinal(), pos != null ? vec3DToVector(pos) : null, hand != null ? hand.ordinal() : 0, async); if (event.getFrame() != null && event.getMapWrapper() != null) { Bukkit.getPluginManager().callEvent(event); return event.isCancelled(); @@ -105,19 +108,19 @@ public class PacketListener_v1_17_R1 extends PacketListener { } }; - ChannelPipeline pipeline = ((CraftPlayer) p).getHandle().connection.connection.channel.pipeline(); + ChannelPipeline pipeline = ((CraftPlayer) p).getHandle().b.a.k.pipeline(); //connection connection channel pipeline.addBefore("packet_handler", p.getName(), channelDuplexHandler); } @Override public void removePlayer(Player p) { - Channel channel = ((CraftPlayer) p).getHandle().connection.connection.channel; + Channel channel = ((CraftPlayer) p).getHandle().b.a.k; //connection connection channel channel.eventLoop().submit(() -> channel.pipeline().remove(p.getName())); } @Override protected Vector vec3DToVector(Object vec3d) { if (!(vec3d instanceof Vec3D vec3dObj)) return new Vector(0, 0, 0); - return new Vector(vec3dObj.x, vec3dObj.y, vec3dObj.z); + return new Vector(vec3dObj.b, vec3dObj.c, vec3dObj.d); //x, y, z } -} +} \ No newline at end of file diff --git a/NMS-v1_18_R2/pom.xml b/NMS-v1_18_R2/pom.xml index f362dd5..d3f7388 100644 --- a/NMS-v1_18_R2/pom.xml +++ b/NMS-v1_18_R2/pom.xml @@ -1,4 +1,27 @@ + + @@ -26,43 +49,6 @@ ${jdk.version} - - net.md-5 - specialsource-maven-plugin - 1.2.3 - - - package - - remap - - remap-obf - - org.spigotmc:minecraft-server:${NMSVersion}:txt:maps-mojang - true - org.spigotmc:spigot:${NMSVersion}:jar:remapped-mojang - - true - remapped-obf - - - - package - - remap - - remap-spigot - - - ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - - org.spigotmc:minecraft-server:${NMSVersion}:csrg:maps-spigot - org.spigotmc:spigot:${NMSVersion}:jar:remapped-obf - - - - - org.apache.maven.plugins maven-deploy-plugin @@ -76,18 +62,11 @@ - org.spigotmc - minecraft-server + org.bukkit + craftbukkit ${NMSVersion} provided - - org.spigotmc - spigot - ${NMSVersion} - remapped-mojang - provided - tech.sbdevelopment MapReflectionAPI-API diff --git a/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_18_R2.java b/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_18_R2.java index 6747a83..dae512a 100644 --- a/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_18_R2.java +++ b/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_18_R2.java @@ -99,7 +99,7 @@ public class MapSender_v1_18_R2 { updateData ); - ((CraftPlayer) player).getHandle().connection.send(packet); + ((CraftPlayer) player).getHandle().b.a(packet); //connection send() } catch (Exception e) { e.printStackTrace(); } @@ -108,4 +108,4 @@ public class MapSender_v1_18_R2 { record QueuedMap(int id, ArrayImage image, Player player) { } -} +} \ No newline at end of file diff --git a/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_18_R2.java b/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_18_R2.java index 74aa8a3..910f9ba 100644 --- a/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_18_R2.java +++ b/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_18_R2.java @@ -26,8 +26,7 @@ package tech.sbdevelopment.mapreflectionapi.nms; import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; import net.minecraft.network.protocol.game.PacketPlayOutSetSlot; import net.minecraft.network.syncher.DataWatcher; -import net.minecraft.network.syncher.DataWatcherRegistry; -import net.minecraft.server.level.EntityPlayer; +import net.minecraft.network.syncher.DataWatcherObject; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.decoration.EntityItemFrame; import org.bukkit.*; @@ -45,13 +44,12 @@ import tech.sbdevelopment.mapreflectionapi.api.MapController; import tech.sbdevelopment.mapreflectionapi.api.MapWrapper; import tech.sbdevelopment.mapreflectionapi.exceptions.MapLimitExceededException; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; -public class MapWrapper_v1_18_R2 implements MapWrapper { - protected ArrayImage content; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; +public class MapWrapper_v1_18_R2 extends MapWrapper { protected MapController controller = new MapController() { private final Map viewers = new HashMap<>(); @@ -138,14 +136,14 @@ public class MapWrapper_v1_18_R2 implements MapWrapper { } CraftPlayer craftPlayer = (CraftPlayer) player; - int windowId = craftPlayer.getHandle().inventoryMenu.containerId; - int stateId = craftPlayer.getHandle().inventoryMenu.getStateId(); + int windowId = craftPlayer.getHandle().bU.j; //inventoryMenu containerId + int stateId = craftPlayer.getHandle().bU.j(); //inventoryMenu getStateId() ItemStack stack = new ItemStack(Material.MAP, 1); net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); PacketPlayOutSetSlot packet = new PacketPlayOutSetSlot(windowId, stateId, slot, nmsStack); - ((EntityPlayer) player).connection.send(packet); + ((CraftPlayer) player).getHandle().b.a(packet); } @Override @@ -216,7 +214,7 @@ public class MapWrapper_v1_18_R2 implements MapWrapper { public ItemFrame getItemFrameById(World world, int entityId) { CraftWorld craftWorld = (CraftWorld) world; - Entity entity = craftWorld.getHandle().getEntity(entityId); + Entity entity = craftWorld.getHandle().a(entityId); if (entity == null) return null; if (entity instanceof ItemFrame) return (ItemFrame) entity; @@ -226,23 +224,31 @@ public class MapWrapper_v1_18_R2 implements MapWrapper { private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) { net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); - nmsStack.getOrCreateTag().putInt("map", mapId); + nmsStack.u().a("map", mapId); //getOrCreateTag putInt - DataWatcher watcher = new DataWatcher(null); - watcher.set(DataWatcher.defineId(EntityItemFrame.class, DataWatcherRegistry.ITEM_STACK), nmsStack); + PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, new DataWatcher(null), true); - PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, watcher, true); - ((EntityPlayer) player).connection.send(packet); + try { + List> list = new ArrayList<>(); + DataWatcherObject dataWatcherObject = (DataWatcherObject) getField(EntityItemFrame.class, "ao"); + DataWatcher.Item dataWatcherItem = new DataWatcher.Item<>(dataWatcherObject, nmsStack); + list.add(dataWatcherItem); + setField(packet, "b", list); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + ((CraftPlayer) player).getHandle().b.a(packet); } }; + public MapWrapper_v1_18_R2(ArrayImage image) { + super(image); + } + @Override public MapController getController() { return controller; } - - @Override - public ArrayImage getContent() { - return content; - } } diff --git a/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_18_R2.java b/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_18_R2.java index 290ccc9..93a9b85 100644 --- a/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_18_R2.java +++ b/NMS-v1_18_R2/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_18_R2.java @@ -43,6 +43,8 @@ import tech.sbdevelopment.mapreflectionapi.listeners.PacketListener; import java.util.concurrent.TimeUnit; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.*; + public class PacketListener_v1_18_R2 extends PacketListener { @Override protected void injectPlayer(Player p) { @@ -51,7 +53,7 @@ public class PacketListener_v1_18_R2 extends PacketListener { //On send packet public void write(ChannelHandlerContext ctx, Object packet, ChannelPromise promise) throws Exception { if (packet instanceof PacketPlayOutMap packetPlayOutMap) { - int id = packetPlayOutMap.getMapId(); + int id = (int) getField(packetPlayOutMap, "a"); if (id < 0) { //It's one of our maps, invert ID and let through! @@ -76,13 +78,14 @@ public class PacketListener_v1_18_R2 extends PacketListener { public void channelRead(ChannelHandlerContext ctx, Object packet) throws Exception { if (packet instanceof PacketPlayInUseEntity packetPlayInUseEntity) { int entityId = (int) getField(packetPlayInUseEntity, "a"); //entityId - Enum action = (Enum) getField(packetPlayInUseEntity, "b"); //action - EnumHand hand = (EnumHand) getField(action, "a"); //hand + Object action = getField(packetPlayInUseEntity, "b"); //action + Enum actionEnum = (Enum) getValue(action, "a"); //action type + EnumHand hand = hasField(action, "a") ? (EnumHand) getField(action, "a") : null; //hand Vec3D pos = hasField(action, "b") ? (Vec3D) getField(action, "b") : null; //pos if (Bukkit.getScheduler().callSyncMethod(plugin, () -> { boolean async = !plugin.getServer().isPrimaryThread(); - MapInteractEvent event = new MapInteractEvent(p, entityId, action.ordinal(), pos != null ? vec3DToVector(pos) : null, hand != null ? hand.ordinal() : 0, async); + MapInteractEvent event = new MapInteractEvent(p, entityId, actionEnum.ordinal(), pos != null ? vec3DToVector(pos) : null, hand != null ? hand.ordinal() : 0, async); if (event.getFrame() != null && event.getMapWrapper() != null) { Bukkit.getPluginManager().callEvent(event); return event.isCancelled(); @@ -90,8 +93,8 @@ public class PacketListener_v1_18_R2 extends PacketListener { return false; }).get(1, TimeUnit.SECONDS)) return; } else if (packet instanceof PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot) { - int slot = packetPlayInSetCreativeSlot.getSlotNum(); - ItemStack item = packetPlayInSetCreativeSlot.getItem(); + int slot = packetPlayInSetCreativeSlot.b(); + ItemStack item = packetPlayInSetCreativeSlot.c(); boolean async = !plugin.getServer().isPrimaryThread(); CreateInventoryMapUpdateEvent event = new CreateInventoryMapUpdateEvent(p, slot, CraftItemStack.asBukkitCopy(item), async); @@ -105,19 +108,19 @@ public class PacketListener_v1_18_R2 extends PacketListener { } }; - ChannelPipeline pipeline = ((CraftPlayer) p).getHandle().connection.connection.channel.pipeline(); + ChannelPipeline pipeline = ((CraftPlayer) p).getHandle().b.a.m.pipeline(); //connection connection channel pipeline.addBefore("packet_handler", p.getName(), channelDuplexHandler); } @Override public void removePlayer(Player p) { - Channel channel = ((CraftPlayer) p).getHandle().connection.connection.channel; + Channel channel = ((CraftPlayer) p).getHandle().b.a.m; //connection connection channel channel.eventLoop().submit(() -> channel.pipeline().remove(p.getName())); } @Override protected Vector vec3DToVector(Object vec3d) { if (!(vec3d instanceof Vec3D vec3dObj)) return new Vector(0, 0, 0); - return new Vector(vec3dObj.x, vec3dObj.y, vec3dObj.z); + return new Vector(vec3dObj.b, vec3dObj.c, vec3dObj.d); //x, y, z } } diff --git a/NMS-v1_19_R1/pom.xml b/NMS-v1_19_R1/pom.xml index 4574f51..6fe4d53 100644 --- a/NMS-v1_19_R1/pom.xml +++ b/NMS-v1_19_R1/pom.xml @@ -1,4 +1,27 @@ + + @@ -26,43 +49,6 @@ ${jdk.version} - - net.md-5 - specialsource-maven-plugin - 1.2.3 - - - package - - remap - - remap-obf - - org.spigotmc:minecraft-server:${NMSVersion}:txt:maps-mojang - true - org.spigotmc:spigot:${NMSVersion}:jar:remapped-mojang - - true - remapped-obf - - - - package - - remap - - remap-spigot - - - ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar - - org.spigotmc:minecraft-server:${NMSVersion}:csrg:maps-spigot - org.spigotmc:spigot:${NMSVersion}:jar:remapped-obf - - - - - org.apache.maven.plugins maven-deploy-plugin @@ -76,18 +62,11 @@ - org.spigotmc - minecraft-server + org.bukkit + craftbukkit ${NMSVersion} provided - - org.spigotmc - spigot - ${NMSVersion} - remapped-mojang - provided - tech.sbdevelopment MapReflectionAPI-API diff --git a/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_19_R1.java b/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_19_R1.java index 9fb9ce4..3d420c0 100644 --- a/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_19_R1.java +++ b/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapSender_v1_19_R1.java @@ -99,7 +99,7 @@ public class MapSender_v1_19_R1 { updateData ); - ((CraftPlayer) player).getHandle().connection.send(packet); + ((CraftPlayer) player).getHandle().b.a(packet); //connection send() } catch (Exception e) { e.printStackTrace(); } diff --git a/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_19_R1.java b/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_19_R1.java index 93a5f03..f9a33d7 100644 --- a/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_19_R1.java +++ b/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/MapWrapper_v1_19_R1.java @@ -26,8 +26,7 @@ package tech.sbdevelopment.mapreflectionapi.nms; import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; import net.minecraft.network.protocol.game.PacketPlayOutSetSlot; import net.minecraft.network.syncher.DataWatcher; -import net.minecraft.network.syncher.DataWatcherRegistry; -import net.minecraft.server.level.EntityPlayer; +import net.minecraft.network.syncher.DataWatcherObject; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.decoration.EntityItemFrame; import org.bukkit.*; @@ -45,13 +44,12 @@ import tech.sbdevelopment.mapreflectionapi.api.MapController; import tech.sbdevelopment.mapreflectionapi.api.MapWrapper; import tech.sbdevelopment.mapreflectionapi.exceptions.MapLimitExceededException; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; -public class MapWrapper_v1_19_R1 implements MapWrapper { - protected ArrayImage content; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.getField; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.setField; +public class MapWrapper_v1_19_R1 extends MapWrapper { protected MapController controller = new MapController() { private final Map viewers = new HashMap<>(); @@ -138,14 +136,14 @@ public class MapWrapper_v1_19_R1 implements MapWrapper { } CraftPlayer craftPlayer = (CraftPlayer) player; - int windowId = craftPlayer.getHandle().inventoryMenu.containerId; - int stateId = craftPlayer.getHandle().inventoryMenu.getStateId(); + int windowId = craftPlayer.getHandle().bT.j; //inventoryMenu containerId + int stateId = craftPlayer.getHandle().bT.j(); //inventoryMenu getStateId() ItemStack stack = new ItemStack(Material.MAP, 1); net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); PacketPlayOutSetSlot packet = new PacketPlayOutSetSlot(windowId, stateId, slot, nmsStack); - ((EntityPlayer) player).connection.send(packet); + ((CraftPlayer) player).getHandle().b.a(packet); } @Override @@ -216,7 +214,7 @@ public class MapWrapper_v1_19_R1 implements MapWrapper { public ItemFrame getItemFrameById(World world, int entityId) { CraftWorld craftWorld = (CraftWorld) world; - Entity entity = craftWorld.getHandle().getEntity(entityId); + Entity entity = craftWorld.getHandle().a(entityId); if (entity == null) return null; if (entity instanceof ItemFrame) return (ItemFrame) entity; @@ -226,23 +224,31 @@ public class MapWrapper_v1_19_R1 implements MapWrapper { private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) { net.minecraft.world.item.ItemStack nmsStack = CraftItemStack.asNMSCopy(stack); - nmsStack.getOrCreateTag().putInt("map", mapId); + nmsStack.v().a("map", mapId); //getOrCreateTag putInt - DataWatcher watcher = new DataWatcher(null); - watcher.set(DataWatcher.defineId(EntityItemFrame.class, DataWatcherRegistry.ITEM_STACK), nmsStack); + PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, new DataWatcher(null), true); - PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata(entityId, watcher, true); - ((EntityPlayer) player).connection.send(packet); + try { + List> list = new ArrayList<>(); + DataWatcherObject dataWatcherObject = (DataWatcherObject) getField(EntityItemFrame.class, "ao"); + DataWatcher.Item dataWatcherItem = new DataWatcher.Item<>(dataWatcherObject, nmsStack); + list.add(dataWatcherItem); + setField(packet, "b", list); + } catch (Exception e) { + e.printStackTrace(); + return; + } + + ((CraftPlayer) player).getHandle().b.a(packet); } }; + public MapWrapper_v1_19_R1(ArrayImage image) { + super(image); + } + @Override public MapController getController() { return controller; } - - @Override - public ArrayImage getContent() { - return content; - } } diff --git a/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_19_R1.java b/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_19_R1.java index a175fdf..99bcac2 100644 --- a/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_19_R1.java +++ b/NMS-v1_19_R1/src/main/java/tech/sbdevelopment/mapreflectionapi/nms/PacketListener_v1_19_R1.java @@ -43,6 +43,8 @@ import tech.sbdevelopment.mapreflectionapi.listeners.PacketListener; import java.util.concurrent.TimeUnit; +import static tech.sbdevelopment.mapreflectionapi.util.ReflectionUtil.*; + public class PacketListener_v1_19_R1 extends PacketListener { @Override protected void injectPlayer(Player p) { @@ -51,7 +53,7 @@ public class PacketListener_v1_19_R1 extends PacketListener { //On send packet public void write(ChannelHandlerContext ctx, Object packet, ChannelPromise promise) throws Exception { if (packet instanceof PacketPlayOutMap packetPlayOutMap) { - int id = packetPlayOutMap.getMapId(); + int id = (int) getField(packetPlayOutMap, "a"); if (id < 0) { //It's one of our maps, invert ID and let through! @@ -76,13 +78,14 @@ public class PacketListener_v1_19_R1 extends PacketListener { public void channelRead(ChannelHandlerContext ctx, Object packet) throws Exception { if (packet instanceof PacketPlayInUseEntity packetPlayInUseEntity) { int entityId = (int) getField(packetPlayInUseEntity, "a"); //entityId - Enum action = (Enum) getField(packetPlayInUseEntity, "b"); //action - EnumHand hand = (EnumHand) getField(action, "a"); //hand + Object action = getField(packetPlayInUseEntity, "b"); //action + Enum actionEnum = (Enum) getValue(action, "a"); //action type + EnumHand hand = hasField(action, "a") ? (EnumHand) getField(action, "a") : null; //hand Vec3D pos = hasField(action, "b") ? (Vec3D) getField(action, "b") : null; //pos if (Bukkit.getScheduler().callSyncMethod(plugin, () -> { boolean async = !plugin.getServer().isPrimaryThread(); - MapInteractEvent event = new MapInteractEvent(p, entityId, action.ordinal(), pos != null ? vec3DToVector(pos) : null, hand != null ? hand.ordinal() : 0, async); + MapInteractEvent event = new MapInteractEvent(p, entityId, actionEnum.ordinal(), pos != null ? vec3DToVector(pos) : null, hand != null ? hand.ordinal() : 0, async); if (event.getFrame() != null && event.getMapWrapper() != null) { Bukkit.getPluginManager().callEvent(event); return event.isCancelled(); @@ -90,8 +93,8 @@ public class PacketListener_v1_19_R1 extends PacketListener { return false; }).get(1, TimeUnit.SECONDS)) return; } else if (packet instanceof PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot) { - int slot = packetPlayInSetCreativeSlot.getSlotNum(); - ItemStack item = packetPlayInSetCreativeSlot.getItem(); + int slot = packetPlayInSetCreativeSlot.b(); + ItemStack item = packetPlayInSetCreativeSlot.c(); boolean async = !plugin.getServer().isPrimaryThread(); CreateInventoryMapUpdateEvent event = new CreateInventoryMapUpdateEvent(p, slot, CraftItemStack.asBukkitCopy(item), async); @@ -105,19 +108,19 @@ public class PacketListener_v1_19_R1 extends PacketListener { } }; - ChannelPipeline pipeline = ((CraftPlayer) p).getHandle().connection.connection.channel.pipeline(); + ChannelPipeline pipeline = ((CraftPlayer) p).getHandle().b.b.m.pipeline(); //connection connection channel pipeline.addBefore("packet_handler", p.getName(), channelDuplexHandler); } @Override public void removePlayer(Player p) { - Channel channel = ((CraftPlayer) p).getHandle().connection.connection.channel; + Channel channel = ((CraftPlayer) p).getHandle().b.b.m; //connection connection channel channel.eventLoop().submit(() -> channel.pipeline().remove(p.getName())); } @Override protected Vector vec3DToVector(Object vec3d) { if (!(vec3d instanceof Vec3D vec3dObj)) return new Vector(0, 0, 0); - return new Vector(vec3dObj.x, vec3dObj.y, vec3dObj.z); + return new Vector(vec3dObj.c, vec3dObj.d, vec3dObj.e); //x, y, z } }