Skip to content

Commit 2e28bfa

Browse files
committed
Fix CH loading on server versions prior to MC 1.12
1 parent 8a87e0c commit 2e28bfa

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed

src/main/java/com/laytonsmith/abstraction/bukkit/BukkitMCServer.java

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
import org.bukkit.command.CommandSender;
3636
import org.bukkit.command.SimpleCommandMap;
3737
import org.bukkit.entity.Player;
38+
import org.bukkit.event.Event;
3839
import org.bukkit.event.inventory.InventoryType;
39-
import org.bukkit.event.server.BroadcastMessageEvent;
4040
import org.bukkit.inventory.InventoryHolder;
4141
import org.bukkit.inventory.Recipe;
4242

@@ -254,19 +254,27 @@ public void broadcastMessage(String message, Set<MCCommandSender> recipients) {
254254
*/
255255
private int bukkitBroadcastMessage(String message, Set<CommandSender> recipients) {
256256

257-
// Fire a BroadcastMessageEvent for this broadcast.
258-
BroadcastMessageEvent broadcastMessageEvent = new BroadcastMessageEvent(message, recipients);
259-
this.s.getPluginManager().callEvent(broadcastMessageEvent);
257+
try {
258+
// Fire a BroadcastMessageEvent for this broadcast.
259+
// We have to use reflection to prevent the entire plugin from failing to load if not on MC 1.12+
260+
Class broadcastMessageClass = Class.forName("org.bukkit.event.server.BroadcastMessageEvent");
261+
Event broadcastMessageEvent = (Event) ReflectionUtils.newInstance(broadcastMessageClass,
262+
new Class[]{String.class, Set.class},
263+
new Object[]{message, recipients});
264+
this.s.getPluginManager().callEvent(broadcastMessageEvent);
265+
266+
// Return if the event was cancelled.
267+
if((Boolean) ReflectionUtils.invokeMethod(broadcastMessageEvent, "isCancelled")) {
268+
return 0;
269+
}
260270

261-
// Return if the event was cancelled.
262-
if(broadcastMessageEvent.isCancelled()) {
263-
return 0;
271+
// Get the possibly modified message and recipients.
272+
message = (String) ReflectionUtils.invokeMethod(broadcastMessageEvent, "getMessage");
273+
recipients = (Set<CommandSender>) ReflectionUtils.invokeMethod(broadcastMessageEvent, "getRecipients"); // This returns the same reference, but breaks less likely.
274+
} catch (ClassNotFoundException ex) {
275+
// probably prior to 1.12
264276
}
265277

266-
// Get the possibly modified message and recipients.
267-
message = broadcastMessageEvent.getMessage();
268-
recipients = broadcastMessageEvent.getRecipients(); // This returns the same reference, but breaks less likely.
269-
270278
// Perform the actual broadcast to all remaining recipients.
271279
for(CommandSender recipient : recipients) {
272280
recipient.sendMessage(message);

0 commit comments

Comments
 (0)