Эти исключения возникали ещё на этапе считывания импортов:
Код:
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
Чтобы их избежать вынес все действия в отдельные классы, 1:
PHP:
package ink.anh.anhmine.utils.chat;
import org.bukkit.entity.Player;
public class MessagePlainText {
private static boolean allright;
public static boolean message(Player player, String privateMessage) {
player.sendMessage(privateMessage);
allright = true;
return allright;
}
}
2:
PHP:
package ink.anh.anhmine.utils.chat;
import org.bukkit.entity.Player;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.chat.hover.content.Text;
public class MessageMD_5 {
private static boolean allright;
public static boolean message(Player player, String hoverMessage, String privateMessage, String copyText) {
TextComponent message = new TextComponent(hoverMessage);
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text(privateMessage)));
message.setClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, copyText));
player.spigot().sendMessage(message);
allright = true;
return allright;
}
}
3:
PHP:
package ink.anh.anhmine.utils.chat;
import org.bukkit.entity.Player;
import ink.anh.anhmine.AnhMine;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
public class MessageAdventure {
private static boolean allright;
public static boolean message(Player player, String hoverMessage, String privateMessage, String copyText) {
BukkitAudiences adventure = BukkitAudiences.create(AnhMine.getInstance());
Component message = Component.text(hoverMessage)
.hoverEvent(net.kyori.adventure.text.event.HoverEvent.showText(Component.text(privateMessage)))
.clickEvent(net.kyori.adventure.text.event.ClickEvent.copyToClipboard(copyText));
adventure.sender(player).sendMessage(message);
allright = true;
return allright;
}
}
и потому, что в Paper нет класса
net.kyori.adventure.platform.bukkit.BukkitAudiences пришлось сделать 4-й:
PHP:
package ink.anh.anhmine.utils.chat;
import org.bukkit.entity.Player;
import ink.anh.anhmine.AnhMine;
import net.kyori.adventure.text.Component;
public class MessagePaper {
private static boolean allright;
public static boolean message(Player player, String hoverMessage, String privateMessage, String copyText) {
Component message = Component.text(hoverMessage)
.hoverEvent(net.kyori.adventure.text.event.HoverEvent.showText(Component.text(privateMessage)))
.clickEvent(net.kyori.adventure.text.event.ClickEvent.copyToClipboard(copyText));
player.sendMessage(message);
allright = true;
return allright;
}
}
Соответственно и это:
PHP:
package ink.anh.anhmine.utils.chat;
public enum MessagesFramework {
PLAIN_TEXT,
ADVENTURE,
PAPER,
MD_5;
public static MessagesFramework getFramework() {
if (isClassPresent("net.kyori.adventure.text.Component") && isClassPresent("net.kyori.adventure.platform.bukkit.BukkitAudiences")) {
return MessagesFramework.ADVENTURE;
}else if (isClassPresent("net.kyori.adventure.text.Component")) {
return MessagesFramework.PAPER;
}else if (isClassPresent("net.md_5.bungee.api.chat.BaseComponent")) {
return MessagesFramework.MD_5;
}else {
return MessagesFramework.PLAIN_TEXT;
}
}
private static boolean isClassPresent(String className) {
try {
Class.forName(className);
return true;
} catch (NoClassDefFoundError | ClassNotFoundException e) {
return false;
}
}
}
вызываются классы отсюда:
PHP:
if (AnhMine.getMessFrame() == MessagesFramework.ADVENTURE) {
return MessageAdventure.message(player, hoverMessage, privateMessage, copyText);
}else if (AnhMine.getMessFrame() == MessagesFramework.PAPER) {
return MessagePaper.message(player, hoverMessage, privateMessage, copyText);
}else if (AnhMine.getMessFrame() == MessagesFramework.MD_5) {
return MessageMD_5.message(player, hoverMessage, privateMessage, copyText);
}else {
return MessagePlainText.message(player, privateMessage);
}
Тестировал на Spigot и Paper. И вот тут мне нужно ещё разобраться как лучше сделать, ведь в Paper вылезло исключение:
Код:
java.lang.Error: Unresolved compilation problem:
The method sendMessage(String) in the type CommandSender is not applicable for the arguments (Component)
at ink.anh.anhmine.utils.chat.MessagePaper.message(MessagePaper.java:17) ~[AnhMine.jar:?]
at ink.anh.anhmine.cmd.anh.CmdNewWallet.execCmdNewWalletRun(CmdNewWallet.java:141) ~[AnhMine.jar:?]
at ink.anh.anhmine.cmd.anh.CmdNewWallet.lambda$0(CmdNewWallet.java:56) ~[AnhMine.jar:?]
at org.bukkit.craftbukkit.v1_17_R1.scheduler.CraftTask.run(CraftTask.java:101) ~[patched_1.17.1.jar:git-Paper-411]
at org.bukkit.craftbukkit.v1_17_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57) ~[patched_1.17.1.jar:git-Paper-411]
at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22) ~[patched_1.17.1.jar:git-Paper-411]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[?:?]
Нужно узнать способ как отправить sendMessage() игроку с поддержкой Audience?