diff --git a/Spigot-Server-Patches/0010-Adventure.patch b/Spigot-Server-Patches/0010-Adventure.patch index 60d851ac9..24227cd78 100644 --- a/Spigot-Server-Patches/0010-Adventure.patch +++ b/Spigot-Server-Patches/0010-Adventure.patch @@ -106,10 +106,10 @@ index 0000000000000000000000000000000000000000..a2acd31dce4461338a8baa96e03df36a +} diff --git a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java new file mode 100644 -index 0000000000000000000000000000000000000000..8767c84e6417888cacf1ed76c7e3def73f873d70 +index 0000000000000000000000000000000000000000..aa509a1f382991e0f5683b75b0af4094f84d2844 --- /dev/null +++ b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java -@@ -0,0 +1,218 @@ +@@ -0,0 +1,211 @@ +package io.papermc.paper.adventure; + +import io.papermc.paper.chat.ChatFormatter; @@ -123,8 +123,6 @@ index 0000000000000000000000000000000000000000..8767c84e6417888cacf1ed76c7e3def7 +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TextReplacementConfig; +import net.kyori.adventure.text.event.ClickEvent; -+import net.kyori.adventure.text.format.Style; -+import net.kyori.adventure.text.format.TextDecoration; +import net.minecraft.server.EntityPlayer; +import net.minecraft.server.IChatBaseComponent; +import net.minecraft.server.MinecraftServer; @@ -165,66 +163,80 @@ index 0000000000000000000000000000000000000000..8767c84e6417888cacf1ed76c7e3def7 + this.async = async; + } + -+ @SuppressWarnings("deprecation") ++ @SuppressWarnings("CodeBlock2Expr") + public void process() { -+ final boolean listenersOnSyncEvent = anyListeners(ChatEvent.getHandlerList()); -+ -+ this.processLegacy( ++ this.processingLegacyFirst( + // continuing from AsyncPlayerChatEvent (without PlayerChatEvent) + event -> { -+ final AsyncChatEvent ae = this.createAsync( ++ this.processModern( + legacyFormatter(event.getFormat(), legacyDisplayName((CraftPlayer) event.getPlayer()), event.getMessage()), + event.getRecipients(), -+ PaperAdventure.LEGACY_SECTION_UXRC.deserialize(event.getMessage()) ++ PaperAdventure.LEGACY_SECTION_UXRC.deserialize(event.getMessage()), ++ event.isCancelled() + ); -+ ae.setCancelled(event.isCancelled()); // propagate cancelled state -+ post(ae); -+ if (listenersOnSyncEvent) { -+ this.continueWithSyncFromWhereAsyncLeftOff(ae); -+ } else { -+ this.complete(ae); -+ } + }, + // continuing from AsyncPlayerChatEvent and PlayerChatEvent + event -> { -+ this.queueIfAsyncOrRunImmediately(new Waitable() { -+ @Override -+ protected Void evaluate() { -+ final ChatEvent se = ChatProcessor.this.createSync( -+ legacyFormatter(event.getFormat(), legacyDisplayName((CraftPlayer) event.getPlayer()), event.getMessage()), -+ event.getRecipients(), -+ PaperAdventure.LEGACY_SECTION_UXRC.deserialize(event.getMessage()) -+ ); -+ se.setCancelled(event.isCancelled()); // propagate cancelled state -+ post(se); -+ ChatProcessor.this.complete(se); -+ return null; -+ } -+ }); ++ this.processModern( ++ legacyFormatter(event.getFormat(), legacyDisplayName((CraftPlayer) event.getPlayer()), event.getMessage()), ++ event.getRecipients(), ++ PaperAdventure.LEGACY_SECTION_UXRC.deserialize(event.getMessage()), ++ event.isCancelled() ++ ); + }, + // no legacy events called, all nice and fresh! + () -> { -+ final AsyncChatEvent ae = this.createAsync(ChatFormatter.DEFAULT, new LazyPlayerSet(this.server), Component.text(this.message).replaceText(URL_REPLACEMENT_CONFIG)); -+ post(ae); -+ if (listenersOnSyncEvent) { -+ this.continueWithSyncFromWhereAsyncLeftOff(ae); -+ } else { -+ this.complete(ae); -+ } ++ this.processModern( ++ ChatFormatter.DEFAULT, ++ new LazyPlayerSet(this.server), ++ Component.text(this.message).replaceText(URL_REPLACEMENT_CONFIG), ++ false ++ ); + } + ); + } + -+ private static String legacyDisplayName(final CraftPlayer player) { -+ return player.getDisplayName(); ++ @SuppressWarnings("deprecation") ++ private void processingLegacyFirst( ++ final Consumer continueAfterAsync, ++ final Consumer continueAfterAsyncAndSync, ++ final Runnable modernOnly ++ ) { ++ final boolean listenersOnAsyncEvent = anyListeners(AsyncPlayerChatEvent.getHandlerList()); ++ final boolean listenersOnSyncEvent = anyListeners(PlayerChatEvent.getHandlerList()); ++ if (listenersOnAsyncEvent || listenersOnSyncEvent) { ++ final CraftPlayer player = this.player.getBukkitEntity(); ++ final AsyncPlayerChatEvent ae = new AsyncPlayerChatEvent(this.async, player, this.message, new LazyPlayerSet(this.server)); ++ post(ae); ++ if (listenersOnSyncEvent) { ++ final PlayerChatEvent se = new PlayerChatEvent(player, ae.getMessage(), ae.getFormat(), ae.getRecipients()); ++ se.setCancelled(ae.isCancelled()); // propagate cancelled state ++ this.queueIfAsyncOrRunImmediately(new Waitable() { ++ @Override ++ protected Void evaluate() { ++ post(se); ++ return null; ++ } ++ }); ++ continueAfterAsyncAndSync.accept(se); ++ } else if (!ae.isCancelled()) { ++ continueAfterAsync.accept(ae); ++ } ++ } else { ++ modernOnly.run(); ++ } + } + -+ private static Component displayName(final CraftPlayer player) { -+ return player.displayName(); -+ } -+ -+ private static ChatFormatter legacyFormatter(final String format, final String legacyDisplayName, final String legacyMessage) { -+ return (displayName, message) -> PaperAdventure.LEGACY_SECTION_UXRC.deserialize(String.format(format, legacyDisplayName, legacyMessage)).replaceText(URL_REPLACEMENT_CONFIG); ++ private void processModern(final ChatFormatter formatter, final Set recipients, final Component message, final boolean cancelled) { ++ final AsyncChatEvent ae = this.createAsync(formatter, recipients, message); ++ ae.setCancelled(cancelled); // propagate cancelled state ++ post(ae); ++ final boolean listenersOnSyncEvent = anyListeners(ChatEvent.getHandlerList()); ++ if (listenersOnSyncEvent) { ++ this.continueWithSyncFromWhereAsyncLeftOff(ae); ++ } else { ++ this.complete(ae); ++ } + } + + private void continueWithSyncFromWhereAsyncLeftOff(final AsyncChatEvent ae) { @@ -274,35 +286,16 @@ index 0000000000000000000000000000000000000000..8767c84e6417888cacf1ed76c7e3def7 + return new ChatEvent(this.player.getBukkitEntity(), recipients, formatter, message); + } + -+ @SuppressWarnings("deprecation") -+ public void processLegacy( -+ final Consumer continueAfterAsync, -+ final Consumer continueAfterAsyncAndSync, -+ final Runnable modernOnly -+ ) { -+ final boolean listenersOnAsyncEvent = anyListeners(AsyncPlayerChatEvent.getHandlerList()); -+ final boolean listenersOnSyncEvent = anyListeners(PlayerChatEvent.getHandlerList()); -+ if (listenersOnAsyncEvent || listenersOnSyncEvent) { -+ final CraftPlayer player = this.player.getBukkitEntity(); -+ final AsyncPlayerChatEvent ae = new AsyncPlayerChatEvent(this.async, player, this.message, new LazyPlayerSet(this.server)); -+ post(ae); -+ if (listenersOnSyncEvent) { -+ final PlayerChatEvent se = new PlayerChatEvent(player, ae.getMessage(), ae.getFormat(), ae.getRecipients()); -+ se.setCancelled(ae.isCancelled()); // propagate cancelled state -+ this.queueIfAsyncOrRunImmediately(new Waitable() { -+ @Override -+ protected Void evaluate() { -+ post(se); -+ return null; -+ } -+ }); -+ continueAfterAsyncAndSync.accept(se); -+ } else if (!ae.isCancelled()) { -+ continueAfterAsync.accept(ae); -+ } -+ } else { -+ modernOnly.run(); -+ } ++ private static String legacyDisplayName(final CraftPlayer player) { ++ return player.getDisplayName(); ++ } ++ ++ private static Component displayName(final CraftPlayer player) { ++ return player.displayName(); ++ } ++ ++ private static ChatFormatter legacyFormatter(final String format, final String legacyDisplayName, final String legacyMessage) { ++ return (displayName, message) -> PaperAdventure.LEGACY_SECTION_UXRC.deserialize(String.format(format, legacyDisplayName, legacyMessage)).replaceText(URL_REPLACEMENT_CONFIG); + } + + private void queueIfAsyncOrRunImmediately(final Waitable waitable) { diff --git a/Spigot-Server-Patches/0083-Option-to-use-vanilla-per-world-scoreboard-coloring-.patch b/Spigot-Server-Patches/0083-Option-to-use-vanilla-per-world-scoreboard-coloring-.patch index a9b745c33..1a6fe5f06 100644 --- a/Spigot-Server-Patches/0083-Option-to-use-vanilla-per-world-scoreboard-coloring-.patch +++ b/Spigot-Server-Patches/0083-Option-to-use-vanilla-per-world-scoreboard-coloring-.patch @@ -26,15 +26,10 @@ index db2dddd12f54e6d15916c4cee623676541de37fb..1942f5224aaebb18adb591d6f70a419c + } } diff --git a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java -index 8767c84e6417888cacf1ed76c7e3def73f873d70..7a5ac38c490f5b886a0611b01bd36053bc54a85a 100644 +index aa509a1f382991e0f5683b75b0af4094f84d2844..e8d699b01a3bae60720c81e4427a310e2a2b1640 100644 --- a/src/main/java/io/papermc/paper/adventure/ChatProcessor.java +++ b/src/main/java/io/papermc/paper/adventure/ChatProcessor.java -@@ -11,12 +11,14 @@ import java.util.regex.Pattern; - import net.kyori.adventure.text.Component; - import net.kyori.adventure.text.TextReplacementConfig; - import net.kyori.adventure.text.event.ClickEvent; --import net.kyori.adventure.text.format.Style; --import net.kyori.adventure.text.format.TextDecoration; +@@ -14,7 +14,11 @@ import net.kyori.adventure.text.event.ClickEvent; import net.minecraft.server.EntityPlayer; import net.minecraft.server.IChatBaseComponent; import net.minecraft.server.MinecraftServer; @@ -46,7 +41,7 @@ index 8767c84e6417888cacf1ed76c7e3def73f873d70..7a5ac38c490f5b886a0611b01bd36053 import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.util.LazyPlayerSet; import org.bukkit.craftbukkit.util.Waitable; -@@ -104,10 +106,22 @@ public final class ChatProcessor { +@@ -175,10 +179,22 @@ public final class ChatProcessor { } private static String legacyDisplayName(final CraftPlayer player) {