From 69850d82c83c71fbdbfcd156150a7b7cff179d3f Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Thu, 26 Aug 2021 13:12:52 -0700 Subject: [PATCH] Fix NoClassDefFoundError on < 1.12 with Discord execute command (#4478) --- .../providers/BukkitSenderProvider.java | 30 ++++---------- .../ModernCommandSenderSpigotCreator.java | 40 +++++++++++++++++++ 2 files changed, 47 insertions(+), 23 deletions(-) create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernCommandSenderSpigotCreator.java diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSenderProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSenderProvider.java index 9496f9091..4228a67b7 100644 --- a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSenderProvider.java +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/BukkitSenderProvider.java @@ -1,7 +1,5 @@ package net.ess3.provider.providers; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Server; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; @@ -60,27 +58,13 @@ public class BukkitSenderProvider implements CommandSender { @Override public Spigot spigot() { - return new Spigot() { - @Override - public void sendMessage(BaseComponent component) { - BukkitSenderProvider.this.sendMessage(component.toLegacyText()); - } - - @Override - public void sendMessage(BaseComponent... components) { - sendMessage(new TextComponent(components)); - } - - @Override - public void sendMessage(UUID sender, BaseComponent... components) { - sendMessage(components); - } - - @Override - public void sendMessage(UUID sender, BaseComponent component) { - sendMessage(component); - } - }; + try { + Class.forName("org.bukkit.command.CommandSender$Spigot"); + return ModernCommandSenderSpigotCreator.stupidDumbHackToMakeTheJvmHappy(this); + } catch (ClassNotFoundException ignored) { + //noinspection ConstantConditions + return null; + } } @Override diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernCommandSenderSpigotCreator.java b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernCommandSenderSpigotCreator.java new file mode 100644 index 000000000..5a4c43b14 --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/providers/ModernCommandSenderSpigotCreator.java @@ -0,0 +1,40 @@ +package net.ess3.provider.providers; + +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.command.CommandSender; + +import java.util.UUID; + +public final class ModernCommandSenderSpigotCreator { + private ModernCommandSenderSpigotCreator() { + } + + /** + * The JVM will FOR SOME REASON try to load inner classes even BEFORE THE CODE WHICH REFERENCE THEM IS CALLED. + * This dumbass hack postpones the class lookup to until we know for sure the class exists. + */ + public static CommandSender.Spigot stupidDumbHackToMakeTheJvmHappy(BukkitSenderProvider provider) { + return new CommandSender.Spigot() { + @Override + public void sendMessage(BaseComponent component) { + provider.sendMessage(component.toLegacyText()); + } + + @Override + public void sendMessage(BaseComponent... components) { + sendMessage(new TextComponent(components)); + } + + @Override + public void sendMessage(UUID sender, BaseComponent... components) { + sendMessage(components); + } + + @Override + public void sendMessage(UUID sender, BaseComponent component) { + sendMessage(component); + } + }; + } +}