diff --git a/build.gradle b/build.gradle index 83888c8..a11f95f 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group = 'com.springwater.easybot' -version = '2.1.3' +version = '2.1.4' repositories { mavenCentral() @@ -68,11 +68,11 @@ dependencies { compileOnly("me.clip:placeholderapi:2.11.6") compileOnly("com.github.MilkBowl:VaultAPI:1.7") compileOnly("net.kyori:adventure-api:4.17.0") - compileOnly("net.kyori:adventure-text-serializer-legacy:4.17.0") compileOnly("org.geysermc.api:base-api:1.0.1") compileOnly("org.geysermc.floodgate:api:2.1.1-SNAPSHOT") compileOnly("org.eclipse.jetty.websocket:websocket-api:9.4.58.v20250814") + implementation("net.kyori:adventure-text-serializer-legacy:4.17.0") implementation("net.kyori:adventure-text-serializer-plain:4.17.0") implementation("org.glavo:rcon-java:2.0.2") diff --git a/src/main/java/com/springwater/easybot/Easybot.java b/src/main/java/com/springwater/easybot/Easybot.java index b6f6e63..4bc1b89 100644 --- a/src/main/java/com/springwater/easybot/Easybot.java +++ b/src/main/java/com/springwater/easybot/Easybot.java @@ -1,5 +1,6 @@ package com.springwater.easybot; +import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.springwater.easybot.api.CommandApi; import com.springwater.easybot.bridge.BridgeBehavior; import com.springwater.easybot.bridge.BridgeClient; @@ -23,6 +24,8 @@ import java.lang.reflect.Method; import java.util.Objects; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; public final class Easybot extends JavaPlugin implements Listener { public static Easybot instance; @@ -44,6 +47,13 @@ public static CommandApi getCommandApi() { return commandApi; } + public static final ExecutorService EXECUTOR = Executors.newCachedThreadPool( + new ThreadFactoryBuilder() + .setNameFormat("EasyBot Task Executor - %d") + .setDaemon(true) + .build() + ); + @Override public void onEnable() { saveDefaultConfig(); diff --git a/src/main/java/com/springwater/easybot/event/BukkitSideMessageSyncEvents.java b/src/main/java/com/springwater/easybot/event/BukkitSideMessageSyncEvents.java index 7f9714a..43f9084 100644 --- a/src/main/java/com/springwater/easybot/event/BukkitSideMessageSyncEvents.java +++ b/src/main/java/com/springwater/easybot/event/BukkitSideMessageSyncEvents.java @@ -16,7 +16,7 @@ public static void syncMessage(AsyncPlayerChatEvent event){ if(FakePlayerUtils.isFake(event.getPlayer())) return; if(!event.isCancelled()){ PlayerInfoWithRaw playerInfo = BridgeUtils.buildPlayerInfoFull(event.getPlayer()); - new Thread(() -> Easybot.getClient().syncMessage(playerInfo, event.getMessage(), false), "EasyBotThread-SyncMessage(BukkitSide)").start(); + Easybot.EXECUTOR.execute(() -> Easybot.getClient().syncMessage(playerInfo, event.getMessage(), false)); } } } \ No newline at end of file diff --git a/src/main/java/com/springwater/easybot/event/PaperSideMessageSyncEvents.java b/src/main/java/com/springwater/easybot/event/PaperSideMessageSyncEvents.java index db96e17..e47abe6 100644 --- a/src/main/java/com/springwater/easybot/event/PaperSideMessageSyncEvents.java +++ b/src/main/java/com/springwater/easybot/event/PaperSideMessageSyncEvents.java @@ -18,7 +18,7 @@ public static void syncMessage(AsyncChatEvent event){ if(!event.isCancelled()){ PlayerInfoWithRaw playerInfo = BridgeUtils.buildPlayerInfoFull(event.getPlayer()); String message = PlainTextComponentSerializer.plainText().serialize(event.message()); - new Thread(() -> Easybot.getClient().syncMessage(playerInfo,message , false), "EasyBotThread-SyncMessage(PaperSide)").start(); + Easybot.EXECUTOR.execute(() -> Easybot.getClient().syncMessage(playerInfo,message , false)); } } } \ No newline at end of file diff --git a/src/main/java/com/springwater/easybot/event/PlayerChatMessageSyncEvents.java b/src/main/java/com/springwater/easybot/event/PlayerChatMessageSyncEvents.java index 0873b08..8fa36cf 100644 --- a/src/main/java/com/springwater/easybot/event/PlayerChatMessageSyncEvents.java +++ b/src/main/java/com/springwater/easybot/event/PlayerChatMessageSyncEvents.java @@ -16,7 +16,7 @@ public static void syncMessage(PlayerChannelChatEvent event){ if(FakePlayerUtils.isFake(event.getPlayer())) return; if(!event.isCancelled()){ PlayerInfoWithRaw playerInfo = BridgeUtils.buildPlayerInfoFull(event.getPlayer()); - new Thread(() -> Easybot.getClient().syncMessage(playerInfo, event.getOriginalMessage(), false), "EasyBotThread-SyncMessage(PlayerChat)").start(); + Easybot.EXECUTOR.execute(() -> Easybot.getClient().syncMessage(playerInfo, event.getOriginalMessage(), false)); } } } diff --git a/src/main/java/com/springwater/easybot/event/PlayerDeathSyncEvents.java b/src/main/java/com/springwater/easybot/event/PlayerDeathSyncEvents.java index 57a6c9b..c9c31a1 100644 --- a/src/main/java/com/springwater/easybot/event/PlayerDeathSyncEvents.java +++ b/src/main/java/com/springwater/easybot/event/PlayerDeathSyncEvents.java @@ -4,6 +4,8 @@ import com.springwater.easybot.bridge.packet.PlayerInfoWithRaw; import com.springwater.easybot.utils.BridgeUtils; import com.springwater.easybot.utils.FakePlayerUtils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import org.bukkit.block.Block; import org.bukkit.entity.Arrow; import org.bukkit.entity.Entity; @@ -16,22 +18,38 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.PlayerDeathEvent; +import java.lang.reflect.Method; + public class PlayerDeathSyncEvents implements Listener { + + private final boolean hasModernMessageApi; + + public PlayerDeathSyncEvents(){ + boolean modernMessageApi = false; + try { + PlayerDeathEvent.class.getMethod("deathMessage"); + modernMessageApi = true; + } catch (NoSuchMethodException | NoClassDefFoundError ignored) { + } + this.hasModernMessageApi = modernMessageApi; + } + public String getKiller(Player player) { EntityDamageEvent lastDamageCause = player.getLastDamageCause(); if (lastDamageCause instanceof EntityDamageByEntityEvent) { Entity damager = ((EntityDamageByEntityEvent) lastDamageCause).getDamager(); - if(damager instanceof Arrow){ + if (damager instanceof Arrow) { Arrow arrow = (Arrow) damager; - if(arrow.getShooter() instanceof Entity){ + if (arrow.getShooter() instanceof Entity) { return ((Entity) arrow.getShooter()).getName(); } return "箭"; } + //noinspection ConstantValue return damager != null ? damager.getName() : "一股神秘的力量"; } else if (lastDamageCause instanceof EntityDamageByBlockEvent) { Block damager = ((EntityDamageByBlockEvent) lastDamageCause).getDamager(); - return damager != null ? damager.getState().getData().getItemType().name() : "一股神秘的力量"; + return damager != null ? damager.getState().getType().name() : "一股神秘的力量"; } else { return "一股神秘的力量"; } @@ -39,19 +57,28 @@ public String getKiller(Player player) { @EventHandler(priority = EventPriority.LOWEST) public void onPlayerDeath(PlayerDeathEvent event) { - if(Easybot.instance.getConfig().getBoolean("skip_options.skip_death")) return; - if(FakePlayerUtils.isFake(event.getPlayer())) return; + if (Easybot.instance.getConfig().getBoolean("skip_options.skip_death")) return; + if (FakePlayerUtils.isFake(event.getEntity())) return; PlayerInfoWithRaw playerInfo = BridgeUtils.buildPlayerInfoFull(event.getEntity()); - String deathMessage = event.getDeathMessage(); - if(deathMessage == null){ + String deathMessage; + + if(hasModernMessageApi) { + Component component = event.deathMessage(); + deathMessage = LegacyComponentSerializer.legacySection().serializeOrNull(component); + }else{ + //noinspection deprecation + deathMessage = event.getDeathMessage(); + } + + if (deathMessage == null) { deathMessage = event.getEntity().getName() + " died"; } final String message = deathMessage; String killer = getKiller(event.getEntity()); - new Thread(() -> { + Easybot.EXECUTOR.execute(() -> { Easybot .getClient() .syncDeathMessage(playerInfo, message, killer); - }, "EasyBotThread-SyncPlayerDeath").start(); + }); } } diff --git a/src/main/java/com/springwater/easybot/event/PlayerJoinExitEvents.java b/src/main/java/com/springwater/easybot/event/PlayerJoinExitEvents.java index 85776b9..aa85674 100644 --- a/src/main/java/com/springwater/easybot/event/PlayerJoinExitEvents.java +++ b/src/main/java/com/springwater/easybot/event/PlayerJoinExitEvents.java @@ -16,7 +16,7 @@ public void onPlayerJoin(PlayerJoinEvent event) { if(Easybot.instance.getConfig().getBoolean("skip_options.skip_join")) return; if(FakePlayerUtils.isFake(event.getPlayer())) return; PlayerInfoWithRaw playerInfo = BridgeUtils.buildPlayerInfoFull(event.getPlayer()); - new Thread(() -> Easybot.getClient().syncEnterExit(playerInfo, true), "EasyBotThread-SyncPlayerJoinMessage").start(); + Easybot.EXECUTOR.execute(() -> Easybot.getClient().syncEnterExit(playerInfo, true)); } @EventHandler(priority = EventPriority.LOWEST) @@ -24,6 +24,6 @@ public void onPlayerQuit(PlayerQuitEvent event) { if(Easybot.instance.getConfig().getBoolean("skip_options.skip_quit")) return; if(FakePlayerUtils.isFake(event.getPlayer())) return; PlayerInfoWithRaw playerInfo = BridgeUtils.buildPlayerInfoFull(event.getPlayer()); - new Thread(() -> Easybot.getClient().syncEnterExit(playerInfo, false), "EasyBotThread-SyncPlayerExitMessage").start(); + Easybot.EXECUTOR.execute(() -> Easybot.getClient().syncEnterExit(playerInfo, false)); } } diff --git a/src/main/java/com/springwater/easybot/event/RedisChatMessageSyncEvents.java b/src/main/java/com/springwater/easybot/event/RedisChatMessageSyncEvents.java index 813cc32..df408d4 100644 --- a/src/main/java/com/springwater/easybot/event/RedisChatMessageSyncEvents.java +++ b/src/main/java/com/springwater/easybot/event/RedisChatMessageSyncEvents.java @@ -21,7 +21,7 @@ public static void syncMessage(AsyncRedisChatMessageEvent event){ if(FakePlayerUtils.isFake(player)) return; PlayerInfoWithRaw playerInfo = BridgeUtils.buildPlayerInfoFull(player); String message = PlainTextComponentSerializer.plainText().serialize(event.getContent()); - new Thread(() -> Easybot.getClient().syncMessage(playerInfo, message, false), "EasyBotThread-SyncMessage(PlayerChat)").start(); + Easybot.EXECUTOR.execute(() -> Easybot.getClient().syncMessage(playerInfo, message, false)); } } }