From 2e28bfa80880c07aea9f645cb2c32781fb3cc088 Mon Sep 17 00:00:00 2001 From: PseudoKnight Date: Sat, 21 Jul 2018 18:25:36 -0700 Subject: [PATCH] Fix CH loading on server versions prior to MC 1.12 --- .../abstraction/bukkit/BukkitMCServer.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCServer.java b/src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCServer.java index 371f1d84e..a619b9727 100644 --- a/src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCServer.java +++ b/src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCServer.java @@ -35,8 +35,8 @@ import org.bukkit.command.CommandSender; import org.bukkit.command.SimpleCommandMap; import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.inventory.InventoryType; -import org.bukkit.event.server.BroadcastMessageEvent; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.Recipe; @@ -254,19 +254,27 @@ public void broadcastMessage(String message, Set recipients) { */ private int bukkitBroadcastMessage(String message, Set recipients) { - // Fire a BroadcastMessageEvent for this broadcast. - BroadcastMessageEvent broadcastMessageEvent = new BroadcastMessageEvent(message, recipients); - this.s.getPluginManager().callEvent(broadcastMessageEvent); + try { + // Fire a BroadcastMessageEvent for this broadcast. + // We have to use reflection to prevent the entire plugin from failing to load if not on MC 1.12+ + Class broadcastMessageClass = Class.forName("org.bukkit.event.server.BroadcastMessageEvent"); + Event broadcastMessageEvent = (Event) ReflectionUtils.newInstance(broadcastMessageClass, + new Class[]{String.class, Set.class}, + new Object[]{message, recipients}); + this.s.getPluginManager().callEvent(broadcastMessageEvent); + + // Return if the event was cancelled. + if((Boolean) ReflectionUtils.invokeMethod(broadcastMessageEvent, "isCancelled")) { + return 0; + } - // Return if the event was cancelled. - if(broadcastMessageEvent.isCancelled()) { - return 0; + // Get the possibly modified message and recipients. + message = (String) ReflectionUtils.invokeMethod(broadcastMessageEvent, "getMessage"); + recipients = (Set) ReflectionUtils.invokeMethod(broadcastMessageEvent, "getRecipients"); // This returns the same reference, but breaks less likely. + } catch (ClassNotFoundException ex) { + // probably prior to 1.12 } - // Get the possibly modified message and recipients. - message = broadcastMessageEvent.getMessage(); - recipients = broadcastMessageEvent.getRecipients(); // This returns the same reference, but breaks less likely. - // Perform the actual broadcast to all remaining recipients. for(CommandSender recipient : recipients) { recipient.sendMessage(message);