From ab8903da16dba88b84bd5ebea901b5df84d41662 Mon Sep 17 00:00:00 2001 From: "./slyph" <118862741+slyphmp4@users.noreply.github.com> Date: Sat, 22 Aug 2026 17:18:18 +0300 Subject: [PATCH 1/3] fix: use legacy chat event on Cardboard --- .../slyph/cloverchat/CloverChatPlugin.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/slyph/cloverchat/CloverChatPlugin.java b/src/main/java/com/slyph/cloverchat/CloverChatPlugin.java index 16437e7..58461e1 100644 --- a/src/main/java/com/slyph/cloverchat/CloverChatPlugin.java +++ b/src/main/java/com/slyph/cloverchat/CloverChatPlugin.java @@ -52,6 +52,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 +68,15 @@ 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); + } 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 +284,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 +305,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 (Cardboard compatibility)" + : (modernChatBridgeEnabled ? "AsyncChatEvent (1.19+)" : "AsyncPlayerChatEvent"); getLogger().info(""); getLogger().info(LOG_TOP); @@ -294,7 +316,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)); From 0d4705ef1ac8cc467486a8b20f592601951f7926 Mon Sep 17 00:00:00 2001 From: "./slyph" <118862741+slyphmp4@users.noreply.github.com> Date: Sat, 22 Aug 2026 17:28:29 +0300 Subject: [PATCH 2/3] fix: add Cardboard PlayerChatEvent fallback --- .../listener/CardboardChatBridge.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/com/slyph/cloverchat/listener/CardboardChatBridge.java 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()); + } +} From fdf69f99bd49db2f55625b1420c1ecc0651c02a9 Mon Sep 17 00:00:00 2001 From: "./slyph" <118862741+slyphmp4@users.noreply.github.com> Date: Sat, 22 Aug 2026 17:29:15 +0300 Subject: [PATCH 3/3] fix: register Cardboard legacy chat fallback --- src/main/java/com/slyph/cloverchat/CloverChatPlugin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/slyph/cloverchat/CloverChatPlugin.java b/src/main/java/com/slyph/cloverchat/CloverChatPlugin.java index 58461e1..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; @@ -72,6 +73,7 @@ public void onEnable() { 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) { @@ -306,7 +308,7 @@ private void logStartupBanner() { String messageInspectorProfile = messageAuditService == null ? "-" : messageAuditService.activeProfileName(); String schedulerMode = compatScheduler != null && compatScheduler.isFolia() ? "Folia" : "Paper/Spigot"; String chatMode = cardboardCompatibilityMode - ? "AsyncPlayerChatEvent (Cardboard compatibility)" + ? "AsyncPlayerChatEvent + PlayerChatEvent fallback" : (modernChatBridgeEnabled ? "AsyncChatEvent (1.19+)" : "AsyncPlayerChatEvent"); getLogger().info("");