diff --git a/src/main/java/com/slyph/cloverchat/CloverChatPlugin.java b/src/main/java/com/slyph/cloverchat/CloverChatPlugin.java index 16437e7..71df73e 100644 --- a/src/main/java/com/slyph/cloverchat/CloverChatPlugin.java +++ b/src/main/java/com/slyph/cloverchat/CloverChatPlugin.java @@ -11,6 +11,7 @@ import com.slyph.cloverchat.feature.messageinspect.MessageAuditService; import com.slyph.cloverchat.feature.proxysync.VelocityProxyChatService; import com.slyph.cloverchat.feature.updatechecker.UpdateCheckerService; +import com.slyph.cloverchat.listener.CardboardChatBridge; import com.slyph.cloverchat.listener.ChatListener; import com.slyph.cloverchat.listener.CommandCooldownListener; import com.slyph.cloverchat.listener.JoinQuitListener; @@ -52,6 +53,7 @@ public final class CloverChatPlugin extends JavaPlugin { private FileConfiguration hoversConfiguration; private FileConfiguration autoMessagesConfiguration; private boolean modernChatBridgeEnabled; + private boolean cardboardCompatibilityMode; private String activeLanguage = DEFAULT_LANGUAGE; @Override @@ -67,9 +69,16 @@ public void onEnable() { velocityProxyChatService = new VelocityProxyChatService(this); ChatListener chatListener = new ChatListener(this); - modernChatBridgeEnabled = new ModernChatBridge(this, chatListener).register(); - if (!modernChatBridgeEnabled) { + cardboardCompatibilityMode = isCardboardServer(); + if (cardboardCompatibilityMode) { + modernChatBridgeEnabled = false; getServer().getPluginManager().registerEvents(chatListener, this); + getServer().getPluginManager().registerEvents(new CardboardChatBridge(chatListener), this); + } else { + modernChatBridgeEnabled = new ModernChatBridge(this, chatListener).register(); + if (!modernChatBridgeEnabled) { + getServer().getPluginManager().registerEvents(chatListener, this); + } } getServer().getPluginManager().registerEvents(new JoinQuitListener(this), this); getServer().getPluginManager().registerEvents(new CommandCooldownListener(this), this); @@ -277,6 +286,18 @@ private String normalizeLanguage(String input) { return normalized; } + private boolean isCardboardServer() { + String serverName = getServer().getName(); + String serverVersion = getServer().getVersion(); + String bukkitVersion = getServer().getBukkitVersion(); + String fingerprint = String.join(" ", + serverName == null ? "" : serverName, + serverVersion == null ? "" : serverVersion, + bukkitVersion == null ? "" : bukkitVersion + ).toLowerCase(Locale.ROOT); + return fingerprint.contains("cardboard"); + } + private void logStartupBanner() { String version = getDescription().getVersion(); String placeholderApiStatus = placeholderApiHooked ? "Подключен" : "Не найден"; @@ -286,6 +307,9 @@ private void logStartupBanner() { String messageInspectorStatus = messageAuditService != null && messageAuditService.isEnabled() ? "Включен" : "Выключен"; String messageInspectorProfile = messageAuditService == null ? "-" : messageAuditService.activeProfileName(); String schedulerMode = compatScheduler != null && compatScheduler.isFolia() ? "Folia" : "Paper/Spigot"; + String chatMode = cardboardCompatibilityMode + ? "AsyncPlayerChatEvent + PlayerChatEvent fallback" + : (modernChatBridgeEnabled ? "AsyncChatEvent (1.19+)" : "AsyncPlayerChatEvent"); getLogger().info(""); getLogger().info(LOG_TOP); @@ -294,7 +318,7 @@ private void logStartupBanner() { getLogger().info(LOG_SEPARATOR); getLogger().info(boxLine("Версия: " + version)); getLogger().info(boxLine("Язык: " + activeLanguage)); - getLogger().info(boxLine("Чат режим: " + (modernChatBridgeEnabled ? "AsyncChatEvent (1.19+)" : "AsyncPlayerChatEvent"))); + getLogger().info(boxLine("Чат режим: " + chatMode)); getLogger().info(boxLine("PlaceholderAPI: " + placeholderApiStatus)); getLogger().info(boxLine("Проверка обновлений: " + updateCheckerStatus)); getLogger().info(boxLine("Автосообщения: " + autoMessagesStatus)); diff --git a/src/main/java/com/slyph/cloverchat/listener/CardboardChatBridge.java b/src/main/java/com/slyph/cloverchat/listener/CardboardChatBridge.java new file mode 100644 index 0000000..f7f184d --- /dev/null +++ b/src/main/java/com/slyph/cloverchat/listener/CardboardChatBridge.java @@ -0,0 +1,31 @@ +package com.slyph.cloverchat.listener; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChatEvent; + +/** + * Cardboard compatibility fallback. + * + * Cardboard's player-chat pipeline first fires AsyncPlayerChatEvent and then, + * when at least one legacy PlayerChatEvent listener is registered, forwards the + * message through PlayerChatEvent before final delivery. Registering this bridge + * gives CloverChat a second interception point on Cardboard builds where the + * AsyncPlayerChatEvent listener is not reached correctly. + */ +@SuppressWarnings("deprecation") +public final class CardboardChatBridge implements Listener { + + private final ChatListener chatListener; + + public CardboardChatBridge(ChatListener chatListener) { + this.chatListener = chatListener; + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPlayerChat(PlayerChatEvent event) { + event.setCancelled(true); + chatListener.handleIncomingChat(event.getPlayer().getUniqueId(), event.getMessage()); + } +}