- 18 reflection calls
- Needs the Geyser API
- Breaks on version bumps
// Send chat messageplayer.sendMessage("Welcome!"); // Handling Java vs Bedrock with Reflection NMS & GeyserGeyserApi geyser = GeyserApi.api();if (!geyser.isBedrockPlayer(player.getUniqueId())) { try { // Multi-version NMS Packet via Reflection Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player); Object connection = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer); Class<?> pingClass = Class.forName("net.minecraft.network.protocol.game.ClientboundPingPacket"); Object packet = pingClass.getConstructor(int.class).newInstance(id); connection.getClass().getMethod("send", Class.forName("net.minecraft.network.protocol.Packet")).invoke(connection, packet); openCustomJavaDialog(player, "Confirm Action"); } catch (Exception e) { e.printStackTrace(); }} else { // Bedrock-exclusive Geyser form API GeyserConnection conn = geyser.connectionByUuid(player.getUniqueId()); CustomForm form = SimpleForm.builder().title("Confirm Action").content("Are you sure?").button("Yes").build(); conn.sendForm(form);} void openCustomJavaDialog(Player player, String title) throws Exception { Object nmsPlayer = player.getClass().getMethod("getHandle").invoke(player); Object conn = nmsPlayer.getClass().getField("playerConnection").get(nmsPlayer); Class<?> dialogPacket = Class.forName("net.minecraft.network.protocol.game.ClientboundShowDialogPacket"); Object packet = dialogPacket.getConstructor(String.class).newInstance(title); conn.getClass().getMethod("send", Class.forName("net.minecraft.network.protocol.Packet")).invoke(conn, packet);}// Nightmarish reflection boilerplate & fragile third-party dependencies