broken-arrow

update inventory

Oct 30th, 2021 (edited)
194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.94 KB | None | 0 0
  1.  
  2. import lombok.SneakyThrows;
  3. import net.kyori.adventure.text.Component;
  4. import net.kyori.adventure.text.minimessage.MiniMessage;
  5. import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
  6. import org.bukkit.Bukkit;
  7. import org.bukkit.Material;
  8. import org.bukkit.entity.Player;
  9.  
  10. import java.lang.reflect.Constructor;
  11. import java.lang.reflect.Field;
  12. import java.lang.reflect.InvocationTargetException;
  13. import java.lang.reflect.Method;
  14.  
  15. public class UpdateTittleContainers {
  16.  
  17.     static Class<?> packetclass;
  18.     static Method handle;
  19.     static Field playerConnection;
  20.     static Class<?> packetConnectionClass;
  21.     static Class<?> chatBaseCompenent;
  22.     static Class<?> chatCompenentSubClass;
  23.     static Class<?> containersClass;
  24.     static Class<?> containerClass;
  25.     static Constructor<?> packetConstructor;
  26.  
  27.    
  28.     @SneakyThrows
  29.     public static void update(Player p, String title, Material container, int inventorySize) {
  30.  
  31.         if (p != null)
  32.             if (Bukkit.getServer().getClass().getPackageName().split("\\.")[3].startsWith("v1_17")) {
  33.                 loadNmsClasses1_17();
  34.                 updateInventory1_17(p, title, container, inventorySize);
  35.             } else {
  36.                 try {
  37.                     loadNmsClasses();
  38.                     updateInventory1_16AndLower(p, title, container, inventorySize);
  39.                 } catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InstantiationException | InvocationTargetException e) {
  40.                     e.printStackTrace();
  41.                 }
  42.             }
  43.     }
  44.  
  45.  
  46.     private static void loadNmsClasses() throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException {
  47.  
  48.         if (packetclass == null)
  49.             packetclass = Class.forName(versionCheckNms("Packet"));
  50.         if (handle == null)
  51.             handle = Class.forName(versionCheckBukkit("entity.CraftPlayer")).getMethod("getHandle");
  52.         if (playerConnection == null)
  53.             playerConnection = Class.forName(versionCheckNms("EntityPlayer")).getField("playerConnection");
  54.         if (packetConnectionClass == null)
  55.             packetConnectionClass = Class.forName(versionCheckNms("PlayerConnection"));
  56.         if (chatBaseCompenent == null)
  57.             chatBaseCompenent = Class.forName(versionCheckNms("IChatBaseComponent"));
  58.         if (containersClass == null)
  59.             containersClass = Class.forName(versionCheckNms("Containers"));
  60.         if (containerClass == null)
  61.             containerClass = Class.forName(versionCheckNms("Container"));
  62.         if (chatCompenentSubClass == null)
  63.             chatCompenentSubClass = Class.forName(versionCheckNms("IChatBaseComponent$ChatSerializer"));
  64.         if (packetConstructor == null)
  65.             packetConstructor = Class.forName(versionCheckNms("PacketPlayOutOpenWindow")).getConstructor(int.class, containersClass, chatBaseCompenent);
  66.     }
  67.  
  68.     private static void loadNmsClasses1_17() throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException {
  69.  
  70.         if (packetclass == null)
  71.             packetclass = Class.forName("net.minecraft.network.protocol.Packet");
  72.         if (handle == null)
  73.             handle = Class.forName(versionCheckBukkit("entity.CraftPlayer")).getMethod("getHandle");
  74.         if (playerConnection == null)
  75.             playerConnection = Class.forName("net.minecraft.server.level.EntityPlayer").getField("b");
  76.         if (packetConnectionClass == null)
  77.             packetConnectionClass = Class.forName("net.minecraft.server.network.PlayerConnection");
  78.         if (chatBaseCompenent == null)
  79.             chatBaseCompenent = Class.forName("net.minecraft.network.chat.IChatBaseComponent");
  80.         if (containersClass == null)
  81.             containersClass = Class.forName("net.minecraft.world.inventory.Containers");
  82.         if (containerClass == null)
  83.             containerClass = Class.forName("net.minecraft.world.inventory.Container");
  84.         if (chatCompenentSubClass == null)
  85.             chatCompenentSubClass = Class.forName("net.minecraft.network.chat.IChatBaseComponent$ChatSerializer");
  86.         if (packetConstructor == null)
  87.             packetConstructor = Class.forName("net.minecraft.network.protocol.game.PacketPlayOutOpenWindow").getConstructor(int.class, containersClass, chatBaseCompenent);
  88.     }
  89.  
  90.     private static void updateInventory1_16AndLower(Player p, String title, Material container, int inventorySize) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, NoSuchFieldException, InstantiationException {
  91.  
  92.         //Component message = MiniMessage.get().parse(title);
  93.  
  94.         Object player = p.getClass().getMethod("getHandle").invoke(p);
  95.         Object activeContainer = player.getClass().getField("activeContainer").get(player);
  96.         Object windowId = activeContainer.getClass().getField("windowId").get(activeContainer);
  97.  
  98.         //Method declaredMethodChat = chatCompenentSubClass.getMethod("a", String.class);
  99.         Method declaredMethodChat = chatCompenentSubClass.getMethod("b", String.class);
  100.         Object inventoryTittle = declaredMethodChat.invoke(null, "'" + title + "'");
  101.         //Object inventoryTittle = declaredMethodChat.invoke(null, GsonComponentSerializer.gson().serialize(message));
  102.  
  103.  
  104.         //System.out.println("mess " + mess);
  105.         //System.out.println("mess serilazed  " + GsonComponentSerializer.gson().serialize(mess));
  106.         //Object inventoryTittle = IChatBaseComponent.ChatSerializer.a("{\"color\":\"#873600\",\"text\":\"Link/Suction I\"}");
  107.         //Object inventoryTittle = IChatBaseComponent.ChatSerializer.a(GsonComponentSerializer.gson().serialize(mess));
  108.  
  109.         Object inventoryType = null;
  110.         if (container == Material.HOPPER)
  111.             inventoryType = containersClass.getField("HOPPER").get(null);
  112.         if (container == Material.CHEST)
  113.             if (inventorySize % 9 == 0)
  114.                 inventoryType = containersClass.getField("GENERIC_9X" + inventorySize / 9).get(null);
  115.             else
  116.                 inventoryType = containersClass.getField("GENERIC_9X3").get(null);
  117.  
  118.         Object methods = packetConstructor.newInstance(windowId, inventoryType, inventoryTittle);
  119.  
  120.         Object handles = handle.invoke(p);
  121.         Object playerconect = playerConnection.get(handles);
  122.         Method packet1 = packetConnectionClass.getMethod("sendPacket", packetclass);
  123.  
  124.         packet1.invoke(playerconect, methods);
  125.         player.getClass().getMethod("updateInventory", containerClass).invoke(player, activeContainer);
  126.  
  127.     }
  128.  
  129.     private static void updateInventory1_17(Player p, String title, Material container, int inventorySize) throws NoSuchMethodException, NoSuchFieldException, InvocationTargetException, IllegalAccessException, InstantiationException {
  130.  
  131.         Component message = MiniMessage.get().parse(title);
  132.  
  133.         Object player = p.getClass().getMethod("getHandle").invoke(p);
  134.         Object activeContainer = player.getClass().getField("bV").get(player);
  135.         Object windowId = activeContainer.getClass().getField("j").get(activeContainer);
  136.  
  137.         Method declaredMethodChat = chatCompenentSubClass.getMethod("a", String.class);
  138.         Object inventoryTittle = declaredMethodChat.invoke(null, GsonComponentSerializer.gson().serialize(message));
  139.  
  140.         Object inventoryType;
  141.         String fieldName = "c";
  142.         if (container == Material.HOPPER)
  143.             fieldName = "p";
  144.         if (container == Material.CHEST)
  145.             if (inventorySize / 9 == 1)
  146.                 fieldName = "a";
  147.             else if (inventorySize / 9 == 2)
  148.                 fieldName = "b";
  149.             else if (inventorySize / 9 == 3)
  150.                 fieldName = "c";
  151.             else if (inventorySize / 9 == 4)
  152.                 fieldName = "d";
  153.             else if (inventorySize / 9 == 5)
  154.                 fieldName = "e";
  155.             else if (inventorySize / 9 == 6)
  156.                 fieldName = "f";
  157.             else
  158.                 fieldName = "c";
  159.  
  160.         inventoryType = containersClass.getField(fieldName).get(null);
  161.         Object methods = packetConstructor.newInstance(windowId, inventoryType, inventoryTittle);
  162.  
  163.         Object handles = handle.invoke(p);
  164.         Object playerconect = playerConnection.get(handles);
  165.         Method packet1 = packetConnectionClass.getMethod("sendPacket", packetclass);
  166.  
  167.         packet1.invoke(playerconect, methods);
  168.         player.getClass().getMethod("initMenu", containerClass).invoke(player, activeContainer);
  169.     }
  170.  
  171.     private static String versionCheckNms(String clazzName) {
  172.  
  173.         return "net.minecraft.server." + Bukkit.getServer().getClass().getPackageName().split("\\.")[3] + "." + clazzName;
  174.     }
  175.  
  176.     private static String versionCheckBukkit(String clazzName) {
  177.  
  178.         return "org.bukkit.craftbukkit." + Bukkit.getServer().getClass().getPackageName().split("\\.")[3] + "." + clazzName;
  179.     }
  180.    
  181. }
  182.  
Add Comment
Please, Sign In to add comment