From 5b9a2ae7edf236430ce21adfb92dd9ce2a4bb92b Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Fri, 19 Dec 2025 11:20:25 +0800 Subject: [PATCH] Fix spigot compatibility with adventure component in PlayerAdvancementDoneEvent --- .../listeners/AdvancementDonePaperHelper.java | 53 +++++++++++++++++++ .../listeners/SilentGrantsListener.java | 35 ++---------- 2 files changed, 58 insertions(+), 30 deletions(-) create mode 100644 src/main/java/org/mvplugins/multiverse/inventories/listeners/AdvancementDonePaperHelper.java diff --git a/src/main/java/org/mvplugins/multiverse/inventories/listeners/AdvancementDonePaperHelper.java b/src/main/java/org/mvplugins/multiverse/inventories/listeners/AdvancementDonePaperHelper.java new file mode 100644 index 00000000..b3c4becd --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/inventories/listeners/AdvancementDonePaperHelper.java @@ -0,0 +1,53 @@ +package org.mvplugins.multiverse.inventories.listeners; + +import com.dumptruckman.minecraft.util.Logging; +import github.scarsz.discordsrv.DiscordSRV; +import github.scarsz.discordsrv.api.Subscribe; +import github.scarsz.discordsrv.api.events.AchievementMessagePreProcessEvent; +import org.bukkit.event.player.PlayerAdvancementDoneEvent; + +/** + * Spigot is old and outdated, so we have this separate class to handle Paper-specific + * advancement done event features that uses adventure text components. + */ +final class AdvancementDonePaperHelper { + + private static AdvancementDonePaperHelper instance; + + static AdvancementDonePaperHelper getInstance() { + if (instance == null) { + instance = new AdvancementDonePaperHelper(); + } + return instance; + } + + private AdvancementDonePaperHelper() { + } + + void registerDiscordSrvHook() { + Logging.fine("Registering DiscordSRV advancement grant hook."); + DiscordSRV.api.subscribe(new DiscordSrvHook()); + } + + void handleAdvancementDoneEventSuppression(PlayerAdvancementDoneEvent event) { + Logging.finest("Suppressing advancement done message for player %s due to share handling.", + event.getPlayer().getName()); + event.message(net.kyori.adventure.text.Component.text("mvinv:suppressed")); + } + + private static class DiscordSrvHook { + @Subscribe + public void onAchievementMessage(AchievementMessagePreProcessEvent event) { + if (!(event.getTriggeringBukkitEvent() instanceof PlayerAdvancementDoneEvent advancementEvent)) { + return; + } + if (net.kyori.adventure.text.Component.EQUALS.test( + advancementEvent.message(), + net.kyori.adventure.text.Component.text("mvinv:suppressed"))) { + Logging.finest("Suppressing DiscordSRV advancement message for player %s due to share handling.", + advancementEvent.getPlayer().getName()); + event.setCancelled(true); + } + } + } +} diff --git a/src/main/java/org/mvplugins/multiverse/inventories/listeners/SilentGrantsListener.java b/src/main/java/org/mvplugins/multiverse/inventories/listeners/SilentGrantsListener.java index 4fb98fca..ce3fce3c 100644 --- a/src/main/java/org/mvplugins/multiverse/inventories/listeners/SilentGrantsListener.java +++ b/src/main/java/org/mvplugins/multiverse/inventories/listeners/SilentGrantsListener.java @@ -1,9 +1,6 @@ package org.mvplugins.multiverse.inventories.listeners; import com.dumptruckman.minecraft.util.Logging; -import github.scarsz.discordsrv.DiscordSRV; -import github.scarsz.discordsrv.api.Subscribe; -import github.scarsz.discordsrv.api.events.AchievementMessagePreProcessEvent; import org.bukkit.Bukkit; import org.bukkit.event.player.PlayerAdvancementDoneEvent; import org.bukkit.event.player.PlayerRecipeDiscoverEvent; @@ -32,9 +29,9 @@ final class SilentGrantsListener implements MVInvListener { this.hasPlayerAdvancementDoneMessageMethod = ReflectHelper.getMethod( PlayerAdvancementDoneEvent.class,"message") != null; - if (Bukkit.getPluginManager().isPluginEnabled("DiscordSRV")) { + if (hasPlayerAdvancementDoneMessageMethod && Bukkit.getPluginManager().isPluginEnabled("DiscordSRV")) { Logging.fine("Registering DiscordSRV advancement grant hook."); - DiscordSRV.api.subscribe(new DiscordSrvHook()); + AdvancementDonePaperHelper.getInstance().registerDiscordSrvHook(); } } @@ -58,37 +55,15 @@ void onPlayerAdvancementDone(PlayerAdvancementDoneEvent event) { return; } if (playerShareHandlingState.isHandlingSharable(event.getPlayer(), Sharables.ADVANCEMENTS)) { - Logging.finest("Suppressing advancement done message for player %s due to share handling.", - event.getPlayer().getName()); - event.message(net.kyori.adventure.text.Component.text("mvinv:suppressed")); + AdvancementDonePaperHelper.getInstance().handleAdvancementDoneEventSuppression(event); } } @EventMethod void onPluginEnable(PluginEnableEvent event) { - if (event.getPlugin().getName().equals("DiscordSRV")) { + if (hasPlayerAdvancementDoneMessageMethod && event.getPlugin().getName().equals("DiscordSRV")) { Logging.fine("Registering DiscordSRV advancement grant hook."); - DiscordSRV.api.subscribe(new DiscordSrvHook()); - } - } - - private class DiscordSrvHook { - @Subscribe - public void onAchievementMessage(AchievementMessagePreProcessEvent event) { - if (!(event.getTriggeringBukkitEvent() instanceof PlayerAdvancementDoneEvent advancementEvent)) { - return; - } - if (!hasPlayerAdvancementDoneMessageMethod) { - // paper does not have the method to suppress notifications - return; - } - if (net.kyori.adventure.text.Component.EQUALS.test( - advancementEvent.message(), - net.kyori.adventure.text.Component.text("mvinv:suppressed"))) { - Logging.finest("Suppressing DiscordSRV advancement message for player %s due to share handling.", - advancementEvent.getPlayer().getName()); - event.setCancelled(true); - } + AdvancementDonePaperHelper.getInstance().registerDiscordSrvHook(); } } }