Solved help with reflection

Discussion in 'Plugin Development' started by The_Spaceman, Aug 16, 2017.

Thread Status:
Not open for further replies.
  1. Offline

    The_Spaceman

    hey there, this will open a book for a player

    non reflection code
    Code:
    private void openBook(ItemStack book, Player p) {
        int slot = p.getInventory().getHeldItemSlot();
        ItemStack old = p.getInventory().getItem(slot);
        p.getInventory().setItem(slot, book);
        ByteBuf buf = Unpooled.buffer(256);
        buf.setByte(0, (byte) 0);
        buf.writerIndex(1);
        PacketPlayOutCustomPayload packet = new PacketPlayOutCustomPayload("MC|BOpen", new
        PacketDataSerializer(buf));
        ((CraftPlayer) p).getHandle().playerConnection.sendPacket(packet);
        p.getInventory().setItem(slot, old);
    }
    
    the reflection code
    Code:
    private void book(ItemStack book, Player player) {
    
        int slot = player.getInventory().getHeldItemSlot();
        ItemStack old = player.getInventory().getItem(slot);
        player.getInventory().setItem(slot, book);
        ByteBuf buf = Unpooled.buffer(256);
        buf.setByte(0, (byte) 0);
        buf.writerIndex(1);
        try {
             //get minecraft server version
            String version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
            //get player handle
            Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player);
            //get player connection
            Object connection = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer);
            //get the PacketDataSerializer
            classClass<?> packetDataSerializer = Class.forName("net.minecraft.server." + version +
            ".PacketDataSerializer");
            Constructor<?> packetDataSerializerConstructor = packetDataSerializer.getConstructor(ByteBuf.class);
            Class<?> packetPlayOutCustomPayload = Class.forName("net.minecraft.server." + version +
            ".PacketPlayOutCustomPayload");
            Constructor packetPlayOutCustomPayloadConstructor =
            packetPlayOutCustomPayload.getConstructor(String.class, Class.forName("net.minecraft.server." +
            version + ".PacketDataSerializer"));
            connection.getClass().getMethod("sendPacket", Class.forName("net.minecraft.server." + version +
            ".Packet")).invoke(connection, packetPlayOutCustomPayloadConstructor.newInstance("MC|BOpen",
            packetDataSerializerConstructor.newInstance(buf)));
        } catch (Exception ex) {
             player.getInventory().addItem(book);
        }
        player.getInventory().setItem(slot, old);
    }
    
     
    Last edited: Aug 16, 2017
Thread Status:
Not open for further replies.

Share This Page