From 968cef7a1297d41fd42151dcade7aca78b85e008 Mon Sep 17 00:00:00 2001 From: NEZNAMY Date: Sun, 19 Jan 2025 13:48:39 +0100 Subject: [PATCH] [Scoreboard & Nametags] Add a config option to enforce <1.13 limits even for 1.13+ players (#1412, #1413) --- .../platforms/bukkit/scoreboard/packet/PacketScoreboard.java | 2 +- .../platforms/bukkit/scoreboard/packet/TeamPacketData.java | 3 ++- .../main/java/me/neznamy/tab/shared/config/files/Config.java | 1 + .../tab/shared/features/scoreboard/lines/LongLine.java | 5 +++-- .../shared/features/scoreboard/lines/StableDynamicLine.java | 3 ++- shared/src/main/resources/config/config.yml | 2 ++ 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/scoreboard/packet/PacketScoreboard.java b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/scoreboard/packet/PacketScoreboard.java index 174c6ac94..bc49cde06 100644 --- a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/scoreboard/packet/PacketScoreboard.java +++ b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/scoreboard/packet/PacketScoreboard.java @@ -221,7 +221,7 @@ private Object newObjective(@NonNull Objective objective) { // 1.5 - 1.12.2 Object nmsObjective = newScoreboardObjective.newInstance(emptyScoreboard, objective.getName(), IScoreboardCriteria_dummy); String title = objective.getTitle().toLegacyText(); - if (player.getVersion().getMinorVersion() < 13) { + if (player.getVersion().getMinorVersion() < 13 || TAB.getInstance().getConfiguration().getConfig().isPacketEventsCompensation()) { title = cutTo(title, Limitations.SCOREBOARD_TITLE_PRE_1_13); } ScoreboardObjective_setDisplayName.invoke(nmsObjective, title); diff --git a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/scoreboard/packet/TeamPacketData.java b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/scoreboard/packet/TeamPacketData.java index a9d9b1b69..4605420ca 100644 --- a/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/scoreboard/packet/TeamPacketData.java +++ b/bukkit/src/main/java/me/neznamy/tab/platforms/bukkit/scoreboard/packet/TeamPacketData.java @@ -6,6 +6,7 @@ import me.neznamy.tab.platforms.bukkit.nms.BukkitReflection; import me.neznamy.tab.shared.Limitations; import me.neznamy.tab.shared.ProtocolVersion; +import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.platform.decorators.SafeScoreboard; import me.neznamy.tab.shared.platform.decorators.SafeScoreboard.Team; import me.neznamy.tab.shared.platform.Scoreboard; @@ -230,7 +231,7 @@ private void updateTeamData(@NonNull Team team, @NotNull ProtocolVersion clientV } else { String prefix = team.getPrefix().toLegacyText(); String suffix = team.getSuffix().toLegacyText(); - if (clientVersion.getMinorVersion() < 13) { + if (clientVersion.getMinorVersion() < 13 || TAB.getInstance().getConfiguration().getConfig().isPacketEventsCompensation()) { prefix = SafeScoreboard.cutTo(prefix, Limitations.TEAM_PREFIX_SUFFIX_PRE_1_13); suffix = SafeScoreboard.cutTo(suffix, Limitations.TEAM_PREFIX_SUFFIX_PRE_1_13); } diff --git a/shared/src/main/java/me/neznamy/tab/shared/config/files/Config.java b/shared/src/main/java/me/neznamy/tab/shared/config/files/Config.java index 64ddb9102..e8bb5e813 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/config/files/Config.java +++ b/shared/src/main/java/me/neznamy/tab/shared/config/files/Config.java @@ -62,6 +62,7 @@ public class Config { @NotNull private final String serverName = getSecretOption("server-name", "N/A"); private final int permissionRefreshInterval = config.getInt("permission-refresh-interval", 1000); private final boolean enableRedisHook = config.getBoolean("enable-redisbungee-support", true); + private final boolean packetEventsCompensation = config.getBoolean("compensate-for-packetevents-bug", false); /** If enabled, groups are assigned via permissions instead of permission plugin */ private final boolean groupsByPermissions = config.getBoolean("assign-groups-by-permissions", false); diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/lines/LongLine.java b/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/lines/LongLine.java index a300b34eb..591b89b08 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/lines/LongLine.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/lines/LongLine.java @@ -3,6 +3,7 @@ import lombok.NonNull; import me.neznamy.tab.shared.Limitations; import me.neznamy.tab.shared.Property; +import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.platform.TabPlayer; import me.neznamy.tab.shared.features.scoreboard.ScoreboardImpl; import org.jetbrains.annotations.NotNull; @@ -35,7 +36,7 @@ public void refresh(@NotNull TabPlayer refreshed, boolean force) { if (refreshed.scoreboardData.activeScoreboard != parent) return; //player has different scoreboard displayed Property lineProperty = refreshed.scoreboardData.lineProperties.get(this); if (lineProperty.update()) { - if (refreshed.getVersion().getMinorVersion() >= 13) { + if (refreshed.getVersion().getMinorVersion() >= 13 && !TAB.getInstance().getConfiguration().getConfig().isPacketEventsCompensation()) { updateTeam(refreshed, lineProperty.get(), ""); } else { removeLine(refreshed, refreshed.scoreboardData.lineNameProperties.get(this).get()); @@ -55,7 +56,7 @@ public void register(@NonNull TabPlayer p) { p.scoreboardData.lineProperties.put(this, new Property(this, p, text)); getScoreRefresher().registerProperties(p); String value = p.scoreboardData.lineProperties.get(this).get(); - if (p.getVersion().getMinorVersion() >= 13) { + if (p.getVersion().getMinorVersion() >= 13 && !TAB.getInstance().getConfiguration().getConfig().isPacketEventsCompensation()) { addLine(p, playerName, value, ""); p.scoreboardData.lineNameProperties.put(this, new Property(this, p, playerName)); } else { diff --git a/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/lines/StableDynamicLine.java b/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/lines/StableDynamicLine.java index e6b6b8c40..0579e4d8e 100644 --- a/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/lines/StableDynamicLine.java +++ b/shared/src/main/java/me/neznamy/tab/shared/features/scoreboard/lines/StableDynamicLine.java @@ -3,6 +3,7 @@ import lombok.NonNull; import me.neznamy.tab.shared.Limitations; import me.neznamy.tab.shared.Property; +import me.neznamy.tab.shared.TAB; import me.neznamy.tab.shared.chat.EnumChatFormat; import me.neznamy.tab.shared.features.scoreboard.ScoreboardImpl; import me.neznamy.tab.shared.platform.TabPlayer; @@ -107,7 +108,7 @@ private String[] replaceText(TabPlayer p, boolean force, boolean suppressToggle) * @return array of 2 elements for prefix and suffix */ private String[] split(@NonNull TabPlayer p, @NonNull String text) { - if (p.getVersion().getMinorVersion() >= 13) return new String[] {text, ""}; + if (p.getVersion().getMinorVersion() >= 13 && !TAB.getInstance().getConfiguration().getConfig().isPacketEventsCompensation()) return new String[] {text, ""}; int charLimit = Limitations.TEAM_PREFIX_SUFFIX_PRE_1_13; if (text.length() > charLimit) { StringBuilder prefix = new StringBuilder(text); diff --git a/shared/src/main/resources/config/config.yml b/shared/src/main/resources/config/config.yml index 2feb757a5..0e3b41452 100644 --- a/shared/src/main/resources/config/config.yml +++ b/shared/src/main/resources/config/config.yml @@ -250,6 +250,8 @@ per-world-playerlist: - paintball - bedwars +compensate-for-packetevents-bug: false + ##################################################################### # PROXY ONLY - THE FOLLOWING SECTION IS ONLY FOR PROXY INSTALLATION # #####################################################################