Skip to content

Commit a8d4dc1

Browse files
authored
fix: properly convert adventure components into bungee basecomponents (#1307)
### Motivation When converting between adventure components and bungeecord basecomponents we loose some styling features like the hover & clickevent. ### Modification Added the adventure-text-serializer-bungeecord lib to handle the conversion between the components. ### Result All features provided in the adventure component get passed into the BaseComponent. ### Other Fixes #1216
1 parent ec24887 commit a8d4dc1

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

gradle/libs.versions.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ adventure = "4.13.1"
7171
modlauncher = "8.1.3"
7272
npcLib = "3.0.0-beta5"
7373
placeholderApi = "2.11.3"
74+
adventure-serializer-bungee = "4.3.0"
7475

7576
# fabric platform special dependencies
7677
minecraft = "1.20"
@@ -170,6 +171,7 @@ waterdogpe = { group = "dev.waterdog.waterdogpe", name = "waterdog", version.ref
170171
adventureApi = { group = "net.kyori", name = "adventure-api", version.ref = "adventure" }
171172
adventureSerializerGson = { group = "net.kyori", name = "adventure-text-serializer-gson", version.ref = "adventure" }
172173
adventureSerializerLegacy = { group = "net.kyori", name = "adventure-text-serializer-legacy", version.ref = "adventure" }
174+
adventureSerializerBungee = { group = "net.kyori", name = "adventure-text-serializer-bungeecord", version.ref = "adventure-serializer-bungee" }
173175

174176
# platform extensions
175177
vault = { group = "com.github.MilkBowl", name = "VaultAPI", version.ref = "vault" }

modules/bridge/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ dependencies {
3838

3939
"runtimeImpl"(libs.bundles.adventure)
4040
"runtimeImpl"(projects.ext.adventureHelper)
41+
"runtimeImpl"(libs.adventureSerializerBungee)
4142

4243
// processing
4344
"annotationProcessor"(libs.aerogelAuto)

modules/bridge/src/main/java/eu/cloudnetservice/modules/bridge/platform/bungeecord/BungeeCordDirectPlayerExecutor.java

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,6 @@
1616

1717
package eu.cloudnetservice.modules.bridge.platform.bungeecord;
1818

19-
import static net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection;
20-
import static net.md_5.bungee.api.chat.TextComponent.fromLegacyText;
21-
2219
import eu.cloudnetservice.common.tuple.Tuple2;
2320
import eu.cloudnetservice.modules.bridge.platform.PlatformBridgeManagement;
2421
import eu.cloudnetservice.modules.bridge.platform.PlatformPlayerExecutorAdapter;
@@ -29,14 +26,20 @@
2926
import java.util.function.Supplier;
3027
import lombok.NonNull;
3128
import net.kyori.adventure.text.Component;
29+
import net.kyori.adventure.text.serializer.bungeecord.BungeeComponentSerializer;
3230
import net.md_5.bungee.api.ProxyServer;
31+
import net.md_5.bungee.api.chat.BaseComponent;
3332
import net.md_5.bungee.api.connection.ProxiedPlayer;
3433
import net.md_5.bungee.api.event.ServerConnectEvent.Reason;
3534
import net.md_5.bungee.api.plugin.PluginManager;
3635
import org.jetbrains.annotations.Nullable;
3736

3837
final class BungeeCordDirectPlayerExecutor extends PlatformPlayerExecutorAdapter<ProxiedPlayer> {
3938

39+
// the first minecraft version to support hex colors
40+
// https://minecraft.fandom.com/wiki/Java_Edition_1.16
41+
private static final int PROTOCOL_VERSION_1_16 = 735;
42+
4043
private final ProxyServer proxyServer;
4144
private final PluginManager pluginManager;
4245
private final PlatformBridgeManagement<ProxiedPlayer, ?> management;
@@ -107,14 +110,14 @@ public void connectToTask(@NonNull String task, @NonNull ServerSelectorType sele
107110

108111
@Override
109112
public void kick(@NonNull Component message) {
110-
this.forEach(player -> player.disconnect(fromLegacyText(legacySection().serialize(message))));
113+
this.forEach(player -> player.disconnect(this.convertComponent(message, player)));
111114
}
112115

113116
@Override
114117
protected void sendTitle(@NonNull Component title, @NonNull Component subtitle, int fadeIn, int stay, int fadeOut) {
115118
this.forEach(player -> this.proxyServer.createTitle()
116-
.title(fromLegacyText(legacySection().serialize(title)))
117-
.subTitle(fromLegacyText(legacySection().serialize(subtitle)))
119+
.title(this.convertComponent(title, player))
120+
.subTitle(this.convertComponent(subtitle, player))
118121
.fadeIn(fadeIn)
119122
.stay(stay)
120123
.fadeOut(fadeOut)
@@ -125,7 +128,7 @@ protected void sendTitle(@NonNull Component title, @NonNull Component subtitle,
125128
public void sendChatMessage(@NonNull Component message, @Nullable String permission) {
126129
this.forEach(player -> {
127130
if (permission == null || player.hasPermission(permission)) {
128-
player.sendMessage(fromLegacyText(legacySection().serialize(message)));
131+
player.sendMessage(this.convertComponent(message, player));
129132
}
130133
});
131134
}
@@ -143,4 +146,13 @@ public void spoofCommandExecution(@NonNull String command, boolean redirectToSer
143146
}
144147
});
145148
}
149+
150+
private @NonNull BaseComponent[] convertComponent(@NonNull Component component, @NonNull ProxiedPlayer player) {
151+
// check if we have to use legacy colors because the client is on an old version
152+
if (player.getPendingConnection().getVersion() < PROTOCOL_VERSION_1_16) {
153+
return BungeeComponentSerializer.legacy().serialize(component);
154+
} else {
155+
return BungeeComponentSerializer.get().serialize(component);
156+
}
157+
}
146158
}

0 commit comments

Comments
 (0)