From 198c8ed4cd78194b6f543183d60a476f1848d477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20Dasc=C4=83lu?= Date: Fri, 17 Feb 2023 20:14:10 +0100 Subject: [PATCH 01/25] fix prefix and suffix length --- .../spigot/sidebar/EightPlayerList.java | 14 +++++++------- .../spigot/sidebar/EighteenPlayerList.java | 2 +- .../spigot/sidebar/TwelvePlayerList.java | 16 ++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/sidebar-eight/src/main/java/com/andrei1058/spigot/sidebar/EightPlayerList.java b/sidebar-eight/src/main/java/com/andrei1058/spigot/sidebar/EightPlayerList.java index 1c278da..ee55155 100644 --- a/sidebar-eight/src/main/java/com/andrei1058/spigot/sidebar/EightPlayerList.java +++ b/sidebar-eight/src/main/java/com/andrei1058/spigot/sidebar/EightPlayerList.java @@ -49,8 +49,8 @@ public String getPrefix() { t = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t); } - if (t.length() > 32) { - t = t.substring(0, 32); + if (t.length() > 16) { + t = t.substring(0, 16); } return t; } @@ -68,8 +68,8 @@ public String getSuffix() { t = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t); } - if (t.length() > 32) { - t = t.substring(0, 32); + if (t.length() > 16) { + t = t.substring(0, 16); } return t; } @@ -85,7 +85,7 @@ public EnumNameTagVisibility getNameTagVisibility() { } @Override - public void add(Player player) { + public void add(@NotNull Player player) { PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = new PacketPlayOutScoreboardTeam( this, Collections.singleton(player.getName()), 3 ); @@ -98,7 +98,7 @@ public void sendCreateToPlayer(Player player) { ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packetPlayOutScoreboardTeam); } - public void remove(Player player) { + public void remove(@NotNull Player player) { // send 4: remove entities from team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = new PacketPlayOutScoreboardTeam( this, Collections.singleton(player.getName()), 4 @@ -107,7 +107,7 @@ public void remove(Player player) { } @Override - public void sendUserCreateToReceivers(Player player) { + public void sendUserCreateToReceivers(@NotNull Player player) { // send 3: add entities to team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = new PacketPlayOutScoreboardTeam( this, Collections.singleton(player.getName()), 3 diff --git a/sidebar-eighteen/src/main/java/com/andrei1058/spigot/sidebar/EighteenPlayerList.java b/sidebar-eighteen/src/main/java/com/andrei1058/spigot/sidebar/EighteenPlayerList.java index 4830566..0344909 100644 --- a/sidebar-eighteen/src/main/java/com/andrei1058/spigot/sidebar/EighteenPlayerList.java +++ b/sidebar-eighteen/src/main/java/com/andrei1058/spigot/sidebar/EighteenPlayerList.java @@ -115,7 +115,7 @@ public EnumNameTagVisibility j() { } @Override - public void add(Player player) { + public void add(@NotNull Player player) { PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.a ); diff --git a/sidebar-twelve/src/main/java/com/andrei1058/spigot/sidebar/TwelvePlayerList.java b/sidebar-twelve/src/main/java/com/andrei1058/spigot/sidebar/TwelvePlayerList.java index f71acd2..fd7672f 100644 --- a/sidebar-twelve/src/main/java/com/andrei1058/spigot/sidebar/TwelvePlayerList.java +++ b/sidebar-twelve/src/main/java/com/andrei1058/spigot/sidebar/TwelvePlayerList.java @@ -59,8 +59,8 @@ public String getPrefix() { t = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t); } - if (t.length() > 32) { - t = t.substring(0, 32); + if (t.length() > 16) { + t = t.substring(0, 16); } return t; } @@ -78,8 +78,8 @@ public String getSuffix() { t = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t); } - if (t.length() > 32) { - t = t.substring(0, 32); + if (t.length() > 16) { + t = t.substring(0, 16); } return t; } @@ -95,7 +95,7 @@ public EnumNameTagVisibility getNameTagVisibility() { } @Override - public void add(Player player) { + public void add(@NotNull Player player) { PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = new PacketPlayOutScoreboardTeam( this, Collections.singleton(player.getName()), 3 ); @@ -108,7 +108,7 @@ public void sendCreateToPlayer(Player player) { ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packetPlayOutScoreboardTeam); } - public void remove(Player player) { + public void remove(@NotNull Player player) { // send 4: remove entities from team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = new PacketPlayOutScoreboardTeam( this, Collections.singleton(player.getName()), 4 @@ -117,7 +117,7 @@ public void remove(Player player) { } @Override - public void sendUserCreateToReceivers(Player player) { + public void sendUserCreateToReceivers(@NotNull Player player) { // send 3: add entities to team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = new PacketPlayOutScoreboardTeam( this, Collections.singleton(player.getName()), 3 @@ -152,7 +152,7 @@ public void setSubject(@javax.annotation.Nullable Player papiSubject) { } @Override - public void setPushingRule(PushingRule rule) { + public void setPushingRule(@NotNull PushingRule rule) { switch (rule) { case NEVER: this.pushingRule = EnumTeamPush.NEVER; From 9decf181b15f9a1815f51433961bd348bb25ad64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20Dasc=C4=83lu?= Date: Fri, 17 Feb 2023 20:32:59 +0100 Subject: [PATCH 02/25] fix prefix and suffix length --- .../andrei1058/spigot/sidebar/SeventeenPlayerList.java | 8 ++++---- .../com/andrei1058/spigot/sidebar/SixteenPlayerList.java | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sidebar-seventeen/src/main/java/com/andrei1058/spigot/sidebar/SeventeenPlayerList.java b/sidebar-seventeen/src/main/java/com/andrei1058/spigot/sidebar/SeventeenPlayerList.java index e73c5c1..ce9fa4e 100644 --- a/sidebar-seventeen/src/main/java/com/andrei1058/spigot/sidebar/SeventeenPlayerList.java +++ b/sidebar-seventeen/src/main/java/com/andrei1058/spigot/sidebar/SeventeenPlayerList.java @@ -63,8 +63,8 @@ public IChatBaseComponent getPrefix() { t = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t); } - if (t.length() > 32) { - t = t.substring(0, 32); + if (t.length() > 16) { + t = t.substring(0, 16); } return new ChatComponentText(t); } @@ -82,8 +82,8 @@ public IChatBaseComponent getSuffix() { t = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t); } - if (t.length() > 32) { - t = t.substring(0, 32); + if (t.length() > 16) { + t = t.substring(0, 16); } return new ChatComponentText(t); } diff --git a/sidebar-sixteen/src/main/java/com/andrei1058/spigot/sidebar/SixteenPlayerList.java b/sidebar-sixteen/src/main/java/com/andrei1058/spigot/sidebar/SixteenPlayerList.java index 0c0b774..cf851c4 100644 --- a/sidebar-sixteen/src/main/java/com/andrei1058/spigot/sidebar/SixteenPlayerList.java +++ b/sidebar-sixteen/src/main/java/com/andrei1058/spigot/sidebar/SixteenPlayerList.java @@ -59,8 +59,8 @@ public IChatBaseComponent getPrefix() { t = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t); } - if (t.length() > 32) { - t = t.substring(0, 32); + if (t.length() > 16) { + t = t.substring(0, 16); } return new ChatComponentText(t); } @@ -78,8 +78,8 @@ public IChatBaseComponent getSuffix() { t = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t); } - if (t.length() > 32) { - t = t.substring(0, 32); + if (t.length() > 16) { + t = t.substring(0, 16); } return new ChatComponentText(t); } From 4877a0d833872d6486713be43b9d63fb45ab7b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20Dasc=C4=83lu?= Date: Fri, 17 Feb 2023 22:35:42 +0100 Subject: [PATCH 03/25] fix bw #662 --- .../com/andrei1058/spigot/sidebar/NineteenPlayerList.java | 4 ++-- .../java/com/andrei1058/spigot/sidebar/NineteenSidebar.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sidebar-nineteen/src/main/java/com/andrei1058/spigot/sidebar/NineteenPlayerList.java b/sidebar-nineteen/src/main/java/com/andrei1058/spigot/sidebar/NineteenPlayerList.java index eca484f..beadc9d 100644 --- a/sidebar-nineteen/src/main/java/com/andrei1058/spigot/sidebar/NineteenPlayerList.java +++ b/sidebar-nineteen/src/main/java/com/andrei1058/spigot/sidebar/NineteenPlayerList.java @@ -114,7 +114,7 @@ public EnumNameTagVisibility j() { } @Override - public void add(Player player) { + public void add(@NotNull Player player) { PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.a ); @@ -127,7 +127,7 @@ public void sendCreateToPlayer(Player player) { ((CraftPlayer) player).getHandle().b.a(packetPlayOutScoreboardTeam); } - public void remove(Player player) { + public void remove(@NotNull Player player) { // send 4: remove entities from team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.b diff --git a/sidebar-nineteen/src/main/java/com/andrei1058/spigot/sidebar/NineteenSidebar.java b/sidebar-nineteen/src/main/java/com/andrei1058/spigot/sidebar/NineteenSidebar.java index 03250fb..50db6e4 100644 --- a/sidebar-nineteen/src/main/java/com/andrei1058/spigot/sidebar/NineteenSidebar.java +++ b/sidebar-nineteen/src/main/java/com/andrei1058/spigot/sidebar/NineteenSidebar.java @@ -180,7 +180,7 @@ public int getScoreAmount() { @Override public void setScoreAmount(int score) { - this.score = score; + this.b(score); } @Override From 684d894b20fe283605d5329bcfad9fad381ef4d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20Dasc=C4=83lu?= Date: Sat, 25 Feb 2023 01:05:53 +0100 Subject: [PATCH 04/25] check identifier length --- .../com/andrei1058/spigot/sidebar/WrappedSidebar.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java index e16cc6b..aff49c7 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java @@ -273,9 +273,15 @@ public void showPlayersHealth(SidebarLine displayName, boolean list) { } } + /** + * @param identifier char limit is 16. + */ @Override - public PlayerTab playerTabCreate(String identifier, @Nullable Player player, SidebarLine prefix, SidebarLine suffix, + public PlayerTab playerTabCreate(@NotNull String identifier, @Nullable Player player, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule) { + if (identifier.length() > 16) { + throw new RuntimeException("Char limit exceeded"); + } VersionedTabGroup tab = SidebarManager.getInstance().getSidebarProvider().createPlayerTab( this, identifier, prefix, suffix, pushingRule, PlayerTab.NameTagVisibility.ALWAYS ); From e04956933766d743b26e6a4c906334b5b9a54bcc Mon Sep 17 00:00:00 2001 From: "J.T. McQuigg" Date: Sun, 25 Jun 2023 10:09:22 -0400 Subject: [PATCH 05/25] Add 1_20_R1 Support (#28) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix prefix and suffix length (#17) * Fix length (#18) * fix prefix and suffix length * fix prefix and suffix length * fix team score issue on 1.19 (#19) * fix prefix and suffix length * fix prefix and suffix length * fix bw #662 * Fix for #21 (#23) * Fix papi not formatting on first join * fixup! Fix papi not formatting on first join * clean up --------- Co-authored-by: Andrei Dascălu * Structure rework and added support for 1.19_R3 (#26) Co-authored-by: ItzCodex * fix class visibility (#27) * Add 1_20_R1 Support Signed-off-by: Joseph T. McQuigg --------- Signed-off-by: Joseph T. McQuigg Co-authored-by: Andrei Dascălu Co-authored-by: MrCeasar Co-authored-by: Tom <72739475+Tom18314@users.noreply.github.com> Co-authored-by: ItzCodex --- README.md | 1 + pom.xml | 5 +- sidebar-base/pom.xml | 2 +- sidebar-v1_20_R1/pom.xml | 55 +++ .../sidebar/v1_20_R1/PlayerListImpl.java | 199 +++++++++++ .../spigot/sidebar/v1_20_R1/ProviderImpl.java | 63 ++++ .../spigot/sidebar/v1_20_R1/SidebarImpl.java | 333 ++++++++++++++++++ 7 files changed, 655 insertions(+), 3 deletions(-) create mode 100644 sidebar-v1_20_R1/pom.xml create mode 100644 sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/PlayerListImpl.java create mode 100644 sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/ProviderImpl.java create mode 100644 sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java diff --git a/README.md b/README.md index a615df4..81ee37f 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ This project is divided in several modules: - `sidebar-v_1_18_R1` provides support for 1.18.2 (R2) - `sidebar-v_1_19_R2` provides support for 1.19.2 (R2) - `sidebar-v_1_19_R3` provides support for 1.19.4 (R3) +- `sidebar-v_1_20_R1` provides support for 1.20 (R1) ### IMPORTANT It is really important to call Sidebar#remove(player) when a player leaves the server to avoid memory leaks. diff --git a/pom.xml b/pom.xml index 422e65b..27d79e8 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,7 @@ 0.4-SNAPSHOT sidebar-base + sidebar-v1_20_R1 sidebar-v1_19_R3 sidebar-v1_19_R2 sidebar-v1_18_R2 @@ -37,7 +38,7 @@ org.jetbrains annotations - 23.0.0 + 24.0.1 @@ -47,7 +48,7 @@ org.apache.maven.wagon wagon-ftp - 3.5.2 + 3.5.3 diff --git a/sidebar-base/pom.xml b/sidebar-base/pom.xml index 20e59f5..11453ab 100644 --- a/sidebar-base/pom.xml +++ b/sidebar-base/pom.xml @@ -27,7 +27,7 @@ me.clip placeholderapi - 2.11.2 + 2.11.3 provided diff --git a/sidebar-v1_20_R1/pom.xml b/sidebar-v1_20_R1/pom.xml new file mode 100644 index 0000000..2263e65 --- /dev/null +++ b/sidebar-v1_20_R1/pom.xml @@ -0,0 +1,55 @@ + + + + sidebar-pom + com.andrei1058.spigot.sidebar + 0.4-SNAPSHOT + + 4.0.0 + + sidebar-v1_20_R1 + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 17 + 17 + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + + + + + nms + https://repo.codemc.io/repository/nms/ + + + + + + com.andrei1058.spigot.sidebar + sidebar-base + ${project.version} + provided + + + org.spigotmc + spigot + 1.20-R0.1-SNAPSHOT + provided + + + \ No newline at end of file diff --git a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/PlayerListImpl.java b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/PlayerListImpl.java new file mode 100644 index 0000000..e885940 --- /dev/null +++ b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/PlayerListImpl.java @@ -0,0 +1,199 @@ +package com.andrei1058.spigot.sidebar.v1_20_R1; + +import com.andrei1058.spigot.sidebar.*; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.chat.IChatMutableComponent; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; +import net.minecraft.world.scores.ScoreboardTeam; +import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; + +public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { + + private EnumTeamPush pushingRule; + private final SidebarLine prefix; + private final SidebarLine suffix; + private final WrappedSidebar sidebar; + private final String id; + private EnumNameTagVisibility nameTagVisibility = EnumNameTagVisibility.a; + private Player papiSubject = null; + + public PlayerListImpl(@NotNull WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, + PushingRule pushingRule, NameTagVisibility nameTagVisibility) { + super(null, identifier); + this.suffix = suffix; + this.prefix = prefix; + this.sidebar = sidebar; + this.setPushingRule(pushingRule); + this.setNameTagVisibility(nameTagVisibility); + this.id = identifier; + } + + @Override + public void b(@Nullable IChatBaseComponent var0) { + } + + @Override + public EnumTeamPush l() { + return pushingRule; + } + + @Override + public IChatMutableComponent d() { + return IChatBaseComponent.b(id); + } + + @Override + public IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(prefix.getLine() + var0 + suffix.getLine()); + } + + public String b() { + return getIdentifier(); + } + + @Override + public IChatBaseComponent e() { + String t = prefix.getLine(); + for (PlaceholderProvider placeholderProvider : sidebar.getPlaceholders()) { + if (t.contains(placeholderProvider.getPlaceholder())) { + t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); + } + } + if (null != getSubject()) { + t = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t); + } + + if (t.length() > 32) { + t = t.substring(0, 32); + } + return IChatBaseComponent.b(t); + } + + @Override + public void c(@Nullable IChatBaseComponent var0) { + } + + @Override + public IChatBaseComponent f() { + String t = suffix.getLine(); + for (PlaceholderProvider placeholderProvider : sidebar.getPlaceholders()) { + if (t.contains(placeholderProvider.getPlaceholder())) { + t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); + } + } + + if (null != getSubject()) { + t = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t); + } + + if (t.length() > 32) { + t = t.substring(0, 32); + } + return IChatBaseComponent.b(t); + } + + @Override + public void a(boolean b) { + } + + @Override + public void b(boolean b) { + } + + @Override + public void a(EnumNameTagVisibility enumNameTagVisibility) { + nameTagVisibility = enumNameTagVisibility; + } + + @Override + public EnumNameTagVisibility j() { + return nameTagVisibility; + } + + @Override + public void add(@NotNull Player player) { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), PacketPlayOutScoreboardTeam.a.a + ); + sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); + } + + @Override + public void sendCreateToPlayer(Player player) { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(this, true); + ((CraftPlayer) player).getHandle().c.a(packetPlayOutScoreboardTeam); + } + + public void remove(@NotNull Player player) { + // send 4: remove entities from team + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), PacketPlayOutScoreboardTeam.a.b + ); + sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); + } + + @Override + public void sendUserCreateToReceivers(Player player) { + // send 3: add entities to team + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), PacketPlayOutScoreboardTeam.a.a + ); + sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); + } + + public void sendUpdateToReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(this, false); + sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); + } + + @Override + public void sendRemoveToReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(this); + sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); + } + + @Override + public String getIdentifier() { + return id; + } + + @Override + public void setSubject(@Nullable Player papiSubject) { + this.papiSubject = papiSubject; + } + + @Override + public @org.jetbrains.annotations.Nullable Player getSubject() { + return papiSubject; + } + + @Override + public void setPushingRule(@NotNull PushingRule rule) { + switch (rule) { + case NEVER -> this.pushingRule = EnumTeamPush.b; + case ALWAYS -> this.pushingRule = EnumTeamPush.a; + case PUSH_OTHER_TEAMS -> this.pushingRule = EnumTeamPush.c; + case PUSH_OWN_TEAM -> this.pushingRule = EnumTeamPush.d; + } + if (null != this.id) { + sendUpdateToReceivers(); + } + } + + @Override + public void setNameTagVisibility(@NotNull NameTagVisibility nameTagVisibility) { + switch (nameTagVisibility) { + case NEVER -> this.nameTagVisibility = EnumNameTagVisibility.b; + case ALWAYS -> this.nameTagVisibility = EnumNameTagVisibility.a; + case HIDE_FOR_OTHER_TEAMS -> this.nameTagVisibility = EnumNameTagVisibility.c; + case HIDE_FOR_OWN_TEAM -> this.nameTagVisibility = EnumNameTagVisibility.d; + } + if (null != id){ + sendUpdateToReceivers(); + } + } +} diff --git a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/ProviderImpl.java b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/ProviderImpl.java new file mode 100644 index 0000000..f4881b5 --- /dev/null +++ b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/ProviderImpl.java @@ -0,0 +1,63 @@ +package com.andrei1058.spigot.sidebar.v1_20_R1; + +import com.andrei1058.spigot.sidebar.*; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.protocol.game.PacketPlayOutPlayerListHeaderFooter; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardScore; +import net.minecraft.server.ScoreboardServer; +import net.minecraft.server.network.PlayerConnection; +import net.minecraft.world.scores.ScoreboardObjective; +import net.minecraft.world.scores.criteria.IScoreboardCriteria; +import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +@SuppressWarnings("unused") +public class ProviderImpl extends SidebarProvider { + + private static SidebarProvider instance; + + @Override + public Sidebar createSidebar(SidebarLine title, Collection lines, Collection placeholderProviders) { + return new SidebarImpl(title, lines, placeholderProviders); + } + + @Override + public SidebarObjective createObjective(@NotNull WrappedSidebar sidebar, String name, boolean health, SidebarLine title, int type) { + return ((SidebarImpl)sidebar).createObjective(name, health ? IScoreboardCriteria.f : IScoreboardCriteria.a, title, type); + } + + @Override + public ScoreLine createScoreLine(WrappedSidebar sidebar, SidebarLine line, int score, String color) { + return ((SidebarImpl)sidebar).createScore(line, score, color); + } + + public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int score) { + if (sidebar.getHealthObjective() == null) return; + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.a, ((ScoreboardObjective)sidebar.getHealthObjective()).b(), playerName, score + ); + for (Player player : sidebar.getReceivers()) { + PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().c; + playerConnection.a(packetPlayOutScoreboardScore); + } + } + + @Override + public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, + PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility tagVisibility) { + return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, tagVisibility); + } + + @Override + public void sendHeaderFooter(Player player, String header, String footer) { + PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter(IChatBaseComponent.b(header), IChatBaseComponent.b(footer)); + ((CraftPlayer)player).getHandle().c.a(packet); + } + + public static SidebarProvider getInstance() { + return null == instance ? instance = new ProviderImpl() : instance; + } +} diff --git a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java new file mode 100644 index 0000000..f92bc9b --- /dev/null +++ b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java @@ -0,0 +1,333 @@ +package com.andrei1058.spigot.sidebar.v1_20_R1; + +import com.andrei1058.spigot.sidebar.*; +import net.minecraft.EnumChatFormat; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.chat.IChatMutableComponent; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardDisplayObjective; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardObjective; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardScore; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; +import net.minecraft.server.ScoreboardServer; +import net.minecraft.server.network.PlayerConnection; +import net.minecraft.world.scores.ScoreboardObjective; +import net.minecraft.world.scores.ScoreboardScore; +import net.minecraft.world.scores.ScoreboardTeam; +import net.minecraft.world.scores.criteria.IScoreboardCriteria; +import org.bukkit.ChatColor; +import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; + +public class SidebarImpl extends WrappedSidebar { + + public SidebarImpl(@NotNull SidebarLine title, @NotNull Collection lines, Collection placeholderProvider) { + super(title, lines, placeholderProvider); + } + + public ScoreLine createScore(SidebarLine line, int score, String color) { + return new SidebarImpl.NarniaScoreLine(line, score, color); + } + + public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreboardCriteria, SidebarLine title, int type) { + return new NarniaSidebarObjective(name, iScoreboardCriteria, title, type); + } + + protected class NarniaSidebarObjective extends ScoreboardObjective implements SidebarObjective { + + private SidebarLine displayName; + private final int type; + + public NarniaSidebarObjective(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { + super(null, name, criteria, IChatBaseComponent.b(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a); + this.displayName = displayName; + this.type = type; + } + + @Override + public void setTitle(SidebarLine title) { + this.displayName = title; + this.sendUpdate(); + } + + @Override + public void sendCreate(Player player) { + this.sendCreate(((CraftPlayer) player).getHandle().c); + } + + @Override + public void sendRemove(Player player) { + this.sendRemove(((CraftPlayer) player).getHandle().c); + } + + @Override + public String getName() { + return this.b(); + } + + @Override + public IChatBaseComponent d() { + String t = displayName.getLine(); + if (t.length() > 32) { + t = t.substring(0, 32); + } + return IChatBaseComponent.b(t); + } + + @Override + public void a(IChatBaseComponent var0) { + } + + @Override + public IChatBaseComponent e() { + return IChatBaseComponent.b((this.d().toString())); + + } + + @Override + public void a(IScoreboardCriteria.EnumScoreboardHealthDisplay var0) { + } + + private void sendCreate(@NotNull PlayerConnection playerConnection) { + PacketPlayOutScoreboardObjective packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 0); + playerConnection.a(packetPlayOutScoreboardObjective); + PacketPlayOutScoreboardDisplayObjective packetPlayOutScoreboardDisplayObjective = new PacketPlayOutScoreboardDisplayObjective(type, this); + playerConnection.a(packetPlayOutScoreboardDisplayObjective); + if (b().equalsIgnoreCase("health")) { + PacketPlayOutScoreboardDisplayObjective packetPlayOutScoreboardDisplayObjective2 = new PacketPlayOutScoreboardDisplayObjective(0, this); + playerConnection.a(packetPlayOutScoreboardDisplayObjective2); + } + } + + // must be called when updating the name + public void sendUpdate() { + PacketPlayOutScoreboardObjective packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 2); + getReceivers().forEach(player -> ((CraftPlayer) player).getHandle().c.a(packetPlayOutScoreboardObjective)); + } + + public void sendRemove(@NotNull PlayerConnection playerConnection) { + PacketPlayOutScoreboardObjective packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 1); + playerConnection.a(packetPlayOutScoreboardObjective); + } + } + + public class NarniaScoreLine extends ScoreboardScore implements ScoreLine, Comparable { + + private int score; + private String prefix = " ", suffix = ""; + private final TeamLine team; + private SidebarLine text; + + public NarniaScoreLine(@NotNull SidebarLine text, int score, @NotNull String color) { + super(null, (ScoreboardObjective) getSidebarObjective(), color); + this.score = score; + this.text = text; + this.team = new TeamLine(color); + + if (checkHasPlaceholders(text)) { + String content = text.getLine(); + for (PlaceholderProvider pp : getPlaceholders()) { + if (content.contains(pp.getPlaceholder())) { + content = content.replace(pp.getPlaceholder(), pp.getReplacement()); + } + } + //noinspection ResultOfMethodCallIgnored + setContent(content); + } else { + //noinspection ResultOfMethodCallIgnored + setContent(text.getLine()); + } + } + + @Override + public SidebarLine getLine() { + return text; + } + + @Override + public void setLine(SidebarLine line) { + this.text = line; + } + + @Override + public int getScoreAmount() { + return score; + } + + @Override + public void setScoreAmount(int score) { + this.b(score); + } + + @Override + public void sendCreateToAllReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team, true); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().c.a(packetPlayOutScoreboardTeam)); + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.a,getSidebarObjective().getName(), this.getColor(), this.getScoreAmount() + ); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().c.a(packetPlayOutScoreboardScore)); + } + + @Override + public void sendCreate(Player player) { + PlayerConnection conn = ((CraftPlayer) player).getHandle().c; + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team, true); + conn.a(packetPlayOutScoreboardTeam); + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.a, getSidebarObjective().getName(), this.getColor(), this.getScoreAmount() + ); + conn.a(packetPlayOutScoreboardScore); + } + + @Override + public void sendRemove(Player player) { + PlayerConnection conn = ((CraftPlayer) player).getHandle().c; + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team); + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.b, getSidebarObjective().getName(), this.getColor(), this.getScoreAmount() + ); + conn.a(packetPlayOutScoreboardTeam); + conn.a(packetPlayOutScoreboardScore); + } + + public void sendRemoveToAllReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().c.a(packetPlayOutScoreboardTeam)); + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.b, getSidebarObjective().getName(), this.getColor(), this.getScoreAmount() + ); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().c.a(packetPlayOutScoreboardScore)); + } + + public void sendUpdate(Player player) { + PacketPlayOutScoreboardTeam packetTeamUpdate = PacketPlayOutScoreboardTeam.a(team, false); + ((CraftPlayer) player).getHandle().c.a(packetTeamUpdate); + } + + @Contract(pure = true) + public boolean setContent(@NotNull String content) { + if (!getReceivers().isEmpty()) { + content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getReceivers().get(0), content); + } + var oldPrefix = this.prefix; + var oldSuffix = this.suffix; + + if (content.length() > 16) { + this.prefix = content.substring(0, 16); + if (this.prefix.charAt(15) == ChatColor.COLOR_CHAR) { + this.prefix = content.substring(0, 15); + setSuffix(content.substring(15)); + } else { + setSuffix(content.substring(16)); + } + } else { + this.prefix = content; + this.suffix = ""; + } + return !oldPrefix.equals(this.prefix) || !oldSuffix.equals(this.suffix); + } + + public void setSuffix(@NotNull String secondPart) { + if (secondPart.isEmpty()) { + this.suffix = ""; + return; + } + secondPart = ChatColor.getLastColors(this.prefix) + secondPart; + this.suffix = secondPart.length() > 16 ? secondPart.substring(0, 16) : secondPart; + } + + public void sendUpdateToAllReceivers() { + PacketPlayOutScoreboardTeam packetTeamUpdate = PacketPlayOutScoreboardTeam.a(team, false); + getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetTeamUpdate)); + } + + public int compareTo(@NotNull ScoreLine o) { + return Integer.compare(score, o.getScoreAmount()); + } + + @Override + public void b(int score) { + this.score = score; + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.a, ((ScoreboardObjective) getSidebarObjective()).b(), e(), score + ); + getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardScore)); + } + + @Override + public int b() { + return score; + } + + public void c() { + } + + @Override + public void a(int i) { + } + + @Override + public void a() { + } + + public String getColor() { + return team.b().charAt(0) == ChatColor.COLOR_CHAR ? team.b() : ChatColor.COLOR_CHAR + team.b(); + } + + private class TeamLine extends ScoreboardTeam { + + public TeamLine(String color) { + super(null, color); + g().add(color); + } + + @Override + public IChatBaseComponent e() { + return IChatBaseComponent.b(prefix); + } + + @Override + public void b(@Nullable IChatBaseComponent var0) { + } + + @Override + public void c(@Nullable IChatBaseComponent var0) { + } + + @Override + public IChatBaseComponent f() { + return IChatBaseComponent.b(suffix); + } + + @Override + public void a(boolean var0) { + } + + @Override + public void b(boolean var0) { + } + + @Override + public void a(EnumNameTagVisibility var0) { + } + + @Override + public void a(EnumTeamPush var0) { + } + + @Override + public void a(EnumChatFormat var0) { + } + + @Override + public IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(prefix + var0 + suffix); + } + } + } +} From 48408c69a9e039fec7940e0a737280adef80863f Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sat, 14 Oct 2023 12:21:33 +0200 Subject: [PATCH 06/25] fix first line getting skipped --- .../com/andrei1058/spigot/sidebar/WrappedSidebar.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java index 78a886b..76f26e5 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java @@ -60,6 +60,9 @@ public void addPlaceholder(PlaceholderProvider placeholderProvider) { for (ScoreLine line : lines) { SidebarLine.markHasPlaceholders(line.getLine(), placeholder); } + if (null != this.sidebarObjective) { + SidebarLine.markHasPlaceholders(this.sidebarObjective.getTitle(), getPlaceholders()); + } } /** @@ -136,10 +139,13 @@ private String applyLinePlaceholders(@NotNull SidebarLine line) { } public ScoreLine applyPlaceholders(@NotNull ScoreLine line) { - String content = line.getLine().getLine(); + String content = null; if (line.getLine().isInternalPlaceholders()) { content = applyLinePlaceholders(line.getLine()); } + if (null == content) { + content = line.getLine().getLine(); + } if (line.getLine().isPapiPlaceholders()) { content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders( getReceivers().size() > 1 ? null : getReceivers().getFirst(), content From a80969b08a9f96aed9e9398d2d8c6163fbf39a63 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sat, 14 Oct 2023 12:42:00 +0200 Subject: [PATCH 07/25] fix placeholders being registered after title, fix first line getting skipped --- .../com/andrei1058/spigot/sidebar/SidebarObjective.java | 2 ++ .../java/com/andrei1058/spigot/sidebar/WrappedSidebar.java | 7 +++++-- .../andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java | 5 +++++ .../andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java | 5 +++++ .../andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java | 5 +++++ .../andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java | 5 +++++ .../andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java | 5 +++++ .../andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java | 5 +++++ .../andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java | 5 +++++ .../com/andrei1058/spigot/sidebar/v1_8_R3/SidebarImpl.java | 7 ++++++- 10 files changed, 48 insertions(+), 3 deletions(-) diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarObjective.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarObjective.java index 1383580..4151cc4 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarObjective.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarObjective.java @@ -6,6 +6,8 @@ public interface SidebarObjective { void setTitle(SidebarLine title); + SidebarLine getTitle(); + void sendCreate(Player player); void sendUpdate(); diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java index 76f26e5..36d7263 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java @@ -36,10 +36,10 @@ public WrappedSidebar(@NotNull SidebarLine title, @NotNull Collection 1 ? null : getReceivers().getFirst(), content diff --git a/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java b/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java index ed5c149..f4db0a8 100644 --- a/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java +++ b/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java @@ -53,6 +53,11 @@ public void setTitle(SidebarLine title) { this.sendUpdate(); } + @Override + public SidebarLine getTitle() { + return displayName; + } + @Override public void sendCreate(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; diff --git a/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java b/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java index 39fe6a9..f45d462 100644 --- a/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java +++ b/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java @@ -48,6 +48,11 @@ public void setTitle(SidebarLine title) { this.sendUpdate(); } + @Override + public SidebarLine getTitle() { + return displayName; + } + @Override public void sendCreate(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; diff --git a/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java b/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java index aa31696..b803b47 100644 --- a/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java +++ b/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java @@ -61,6 +61,11 @@ public void setTitle(SidebarLine title) { this.sendUpdate(); } + @Override + public SidebarLine getTitle() { + return displayName; + } + @Override public void sendCreate(Player player) { diff --git a/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java b/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java index b474814..f15a46d 100644 --- a/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java +++ b/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java @@ -57,6 +57,11 @@ public void setTitle(SidebarLine title) { this.sendUpdate(); } + @Override + public SidebarLine getTitle() { + return displayName; + } + @Override public void sendCreate(Player player) { this.sendCreate(((CraftPlayer) player).getHandle().b); diff --git a/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java b/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java index 9162f99..683d93d 100644 --- a/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java +++ b/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java @@ -56,6 +56,11 @@ public void setTitle(SidebarLine title) { this.sendUpdate(); } + @Override + public SidebarLine getTitle() { + return displayName; + } + @Override public void sendCreate(Player player) { this.sendCreate(((CraftPlayer) player).getHandle().b); diff --git a/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java b/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java index 8da5f24..6b26a1d 100644 --- a/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java +++ b/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java @@ -56,6 +56,11 @@ public void setTitle(SidebarLine title) { this.sendUpdate(); } + @Override + public SidebarLine getTitle() { + return displayName; + } + @Override public void sendCreate(Player player) { this.sendCreate(((CraftPlayer) player).getHandle().b); diff --git a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java index 6039055..88eba6c 100644 --- a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java +++ b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java @@ -56,6 +56,11 @@ public void setTitle(SidebarLine title) { this.sendUpdate(); } + @Override + public SidebarLine getTitle() { + return displayName; + } + @Override public void sendCreate(Player player) { this.sendCreate(((CraftPlayer) player).getHandle().c); diff --git a/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/SidebarImpl.java b/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/SidebarImpl.java index b4cc2f7..bf722c4 100644 --- a/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/SidebarImpl.java +++ b/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/SidebarImpl.java @@ -53,6 +53,11 @@ public void setTitle(SidebarLine title) { this.sendUpdate(); } + @Override + public SidebarLine getTitle() { + return displayName; + } + @Override public void sendCreate(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; @@ -74,7 +79,7 @@ public void sendRemove(Player player) { @Override public String getDisplayName() { - String t = parsePlaceholders(displayName); + String t = parsePlaceholders(getTitle()); if (t.length() > 16) { t = t.substring(0, 16); From 8971c2be4e9910be159fabbf9f6e16f2a8e10529 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sun, 15 Oct 2023 14:39:50 +0200 Subject: [PATCH 08/25] fix placeholders being registered after title, fix first line getting skipped --- pom.xml | 2 +- sidebar-base/pom.xml | 2 +- .../andrei1058/spigot/sidebar/ScoreLine.java | 9 +- .../andrei1058/spigot/sidebar/Sidebar.java | 10 +- .../spigot/sidebar/SidebarLine.java | 39 +++++- .../spigot/sidebar/SidebarManager.java | 2 +- .../spigot/sidebar/SidebarObjective.java | 7 + .../spigot/sidebar/SidebarProvider.java | 2 +- .../spigot/sidebar/TabHeaderFooter.java | 12 +- .../spigot/sidebar/VersionedTabGroup.java | 7 + .../spigot/sidebar/WrappedSidebar.java | 130 +++++++++++------- sidebar-v1_12_R1/pom.xml | 2 +- .../sidebar/v1_12_R1/PlayerListImpl.java | 64 +++------ .../spigot/sidebar/v1_12_R1/ProviderImpl.java | 3 +- .../spigot/sidebar/v1_12_R1/SidebarImpl.java | 48 ++++--- sidebar-v1_16_R1/pom.xml | 2 +- .../sidebar/v1_16_R1/PlayerListImpl.java | 70 ++++------ .../spigot/sidebar/v1_16_R1/ProviderImpl.java | 3 +- .../spigot/sidebar/v1_16_R1/SidebarImpl.java | 86 +++++++----- sidebar-v1_17_R1/pom.xml | 2 +- .../sidebar/v1_17_R1/PlayerListImpl.java | 71 ++++------ .../spigot/sidebar/v1_17_R1/ProviderImpl.java | 3 +- .../spigot/sidebar/v1_17_R1/SidebarImpl.java | 88 +++++++----- sidebar-v1_18_R2/pom.xml | 2 +- .../sidebar/v1_18_R2/PlayerListImpl.java | 70 ++++------ .../spigot/sidebar/v1_18_R2/ProviderImpl.java | 3 +- .../spigot/sidebar/v1_18_R2/SidebarImpl.java | 86 +++++++----- sidebar-v1_19_R2/pom.xml | 2 +- .../sidebar/v1_19_R2/PlayerListImpl.java | 67 ++++----- .../spigot/sidebar/v1_19_R2/ProviderImpl.java | 3 +- .../spigot/sidebar/v1_19_R2/SidebarImpl.java | 74 +++++----- sidebar-v1_19_R3/pom.xml | 2 +- .../sidebar/v1_19_R3/PlayerListImpl.java | 69 ++++------ .../spigot/sidebar/v1_19_R3/ProviderImpl.java | 3 +- .../spigot/sidebar/v1_19_R3/SidebarImpl.java | 80 ++++++----- sidebar-v1_20_R1/pom.xml | 2 +- .../sidebar/v1_20_R1/PlayerListImpl.java | 66 ++++----- .../spigot/sidebar/v1_20_R1/ProviderImpl.java | 3 +- .../spigot/sidebar/v1_20_R1/SidebarImpl.java | 74 ++++++---- sidebar-v1_8_R3/pom.xml | 2 +- .../sidebar/v1_8_R3/PlayerListImpl.java | 65 +++------ .../spigot/sidebar/v1_8_R3/ProviderImpl.java | 3 +- .../spigot/sidebar/v1_8_R3/SidebarImpl.java | 61 ++++---- 43 files changed, 716 insertions(+), 685 deletions(-) diff --git a/pom.xml b/pom.xml index dec7a2e..bb45454 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.andrei1058.spigot.sidebar sidebar-pom pom - 23.10.1-SNAPSHOT + 23.10.2-SNAPSHOT sidebar-base sidebar-v1_20_R1 diff --git a/sidebar-base/pom.xml b/sidebar-base/pom.xml index 53c0c20..bb72d07 100644 --- a/sidebar-base/pom.xml +++ b/sidebar-base/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 23.10.1-SNAPSHOT + 23.10.2-SNAPSHOT 4.0.0 diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/ScoreLine.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/ScoreLine.java index aace424..e695d82 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/ScoreLine.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/ScoreLine.java @@ -19,7 +19,7 @@ public interface ScoreLine extends Comparable { /** * @return if content has been changed */ - boolean setContent(String content); + boolean setContent(SidebarLine line); void sendUpdateToAllReceivers(); @@ -31,4 +31,11 @@ public interface ScoreLine extends Comparable { void sendRemove(Player player); String getColor(); + + /** + * Refresh contents in case of placeholders etc. + * Used for triggering refresh a single time and then send the data to all receivers. + * @return true if different from previous state. + */ + boolean refreshContent(); } diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/Sidebar.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/Sidebar.java index c0496f7..e033530 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/Sidebar.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/Sidebar.java @@ -3,8 +3,7 @@ import org.bukkit.entity.Player; import org.jetbrains.annotations.Nullable; -import java.util.LinkedList; -import java.util.List; +import java.util.Collection; public interface Sidebar { @@ -36,8 +35,9 @@ public interface Sidebar { void setTitle(SidebarLine title); /** - * Refresh scoreboard placeholders. + * Refresh scoreboard placeholders where line is not animated. * Can be used async. + * Does not refresh instances of {@link SidebarLineAnimated}, use {@link #refreshAnimatedLines()} instead. */ @SuppressWarnings("unused") void refreshPlaceholders(); @@ -99,7 +99,7 @@ public interface Sidebar { * * @return placeholder providers list. */ - List getPlaceholders(); + Collection getPlaceholders(); /** * Update player health if shown with {@link #showPlayersHealth(SidebarLine, boolean)}. @@ -160,7 +160,7 @@ PlayerTab playerTabCreate( SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, - @Nullable LinkedList placeholders + @Nullable Collection placeholders ); /** diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarLine.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarLine.java index 27bcbab..2b91211 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarLine.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarLine.java @@ -1,8 +1,11 @@ package com.andrei1058.spigot.sidebar; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -import java.util.List; +import java.util.Collection; public abstract class SidebarLine { @@ -36,7 +39,7 @@ public boolean isHasPlaceholders() { /** * Search for placeholders and mark line as placeholder dependent. */ - public static void markHasPlaceholders(@NotNull SidebarLine text, List placeholders) { + public static void markHasPlaceholders(@NotNull SidebarLine text, Collection placeholders) { if (text.isPapiPlaceholders() && text.isInternalPlaceholders()) { return; } @@ -67,6 +70,38 @@ public static void markHasPlaceholders(@NotNull SidebarLine text, List placeholders) { + return getTrimReplacePlaceholders(this.getLine(), papiSubject, limit, placeholders); + } + + public static @NotNull String getTrimReplacePlaceholders(String scope, @Nullable Player papiSubject, @Nullable Integer limit, Collection placeholders) { + String t = scope; + if (null != placeholders) { + for (PlaceholderProvider placeholderProvider : placeholders) { + if (t.contains(placeholderProvider.getPlaceholder())) { + t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); + } + } + } + if (null != papiSubject) { + t = ChatColor.translateAlternateColorCodes('&', + SidebarManager.getInstance().getPapiSupport().replacePlaceholders(papiSubject, t) + ); + } + + if (null != limit && t.length() > limit) { + t = t.substring(0, limit); + } + return t; + } + /** * @return if line is PAPI dependent. */ diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarManager.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarManager.java index e0301db..4d2c901 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarManager.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarManager.java @@ -86,7 +86,7 @@ public static SidebarManager init() { public Sidebar createSidebar( SidebarLine title, @NotNull Collection lines, - List placeholderProviders) { + Collection placeholderProviders) { lines.forEach(sidebarLine -> SidebarLine.markHasPlaceholders(sidebarLine, placeholderProviders)); return sidebarProvider.createSidebar(title, lines, placeholderProviders); } diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarObjective.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarObjective.java index 4151cc4..7af158a 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarObjective.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarObjective.java @@ -15,4 +15,11 @@ public interface SidebarObjective { void sendRemove(Player player); String getName(); + + /** + * Refresh contents in case of placeholders etc. + * Used for triggering refresh a single time and then send the data to all receivers. + * @return true if different from previous state. + */ + boolean refreshTitle(); } diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarProvider.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarProvider.java index fffa802..80c1853 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarProvider.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarProvider.java @@ -33,7 +33,7 @@ public abstract VersionedTabGroup createPlayerTab( SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility nameTagVisibility, - @Nullable LinkedList placeholders + @Nullable Collection placeholders ); diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/TabHeaderFooter.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/TabHeaderFooter.java index f7dcf74..9984076 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/TabHeaderFooter.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/TabHeaderFooter.java @@ -3,7 +3,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.LinkedList; +import java.util.concurrent.ConcurrentLinkedQueue; import static com.andrei1058.spigot.sidebar.SidebarLine.markHasPlaceholders; @@ -11,7 +13,7 @@ public class TabHeaderFooter { private LinkedList header; private LinkedList footer; - private LinkedList placeholders; + private Collection placeholders; /** * Create a new tab context. @@ -23,7 +25,7 @@ public class TabHeaderFooter { public TabHeaderFooter( LinkedList header, LinkedList footer, - @Nullable LinkedList placeholders + @Nullable Collection placeholders ) { this.header = header; this.footer = footer; @@ -31,7 +33,7 @@ public TabHeaderFooter( } @NotNull - public LinkedList getPlaceholders() { + public Collection getPlaceholders() { return placeholders; } @@ -43,9 +45,9 @@ public LinkedList getFooter() { return footer; } - public void setPlaceholders(@Nullable LinkedList placeholders) { + public void setPlaceholders(@Nullable Collection placeholders) { if (null == placeholders) { - this.placeholders = new LinkedList<>(); + this.placeholders = new ConcurrentLinkedQueue<>(); return; } diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/VersionedTabGroup.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/VersionedTabGroup.java index c3294ff..c655a2f 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/VersionedTabGroup.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/VersionedTabGroup.java @@ -16,4 +16,11 @@ public interface VersionedTabGroup extends PlayerTab { // private void sendRemoveToReceivers(); + + /** + * Refresh contents in case of placeholders etc. + * Used for triggering refresh a single time and then send the data to all receivers. + * @return true if different from previous state. + */ + boolean refreshContent(); } diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java index 36d7263..fbef835 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/WrappedSidebar.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.concurrent.ConcurrentLinkedQueue; public class WrappedSidebar implements Sidebar { @@ -14,7 +15,7 @@ public class WrappedSidebar implements Sidebar { // who is receiving this sidebar private final LinkedList receivers = new LinkedList<>(); // placeholders for sidebar lines - private final LinkedList placeholderProviders = new LinkedList<>(); + private final Collection placeholderProviders = new ConcurrentLinkedQueue<>(); // chat colors used for line indexing - private final LinkedList availableColors = new LinkedList<>(); // sidebar lines objective @@ -37,9 +38,13 @@ public WrappedSidebar(@NotNull SidebarLine title, @NotNull Collection placeholder = List.of(placeholderProvider); + ConcurrentLinkedQueue placeholder = new ConcurrentLinkedQueue<>(); + placeholder.add(placeholderProvider); for (ScoreLine line : lines) { SidebarLine.markHasPlaceholders(line.getLine(), placeholder); } if (null != this.sidebarObjective) { - SidebarLine.markHasPlaceholders(this.sidebarObjective.getTitle(), getPlaceholders()); + SidebarLine.markHasPlaceholders(this.sidebarObjective.getTitle(), placeholder); } } @@ -94,9 +102,11 @@ public void addLine(SidebarLine sidebarLine) { if (availableColors.isEmpty()) return; scoreOffsetIncrease(this.lines); String color = availableColors.removeFirst(); + SidebarLine.markHasPlaceholders(sidebarLine, getPlaceholders()); ScoreLine s = SidebarManager.getInstance().getSidebarProvider().createScoreLine( this, sidebarLine, score == 0 ? score : score - 1, color ); + s.refreshContent(); s.sendCreateToAllReceivers(); this.lines.add(s); order(); @@ -114,7 +124,7 @@ public void setLine(SidebarLine sidebarLine, int line) { @Override public void add(Player player) { sidebarObjective.sendCreate(player); - this.lines.forEach(line -> applyPlaceholders(line).sendCreate(player)); + this.lines.forEach(line -> line.sendCreate(player)); if (healthObjective != null) { healthObjective.sendCreate(player); this.tabView.forEach(tab -> tab.sendCreateToPlayer(player)); @@ -125,64 +135,72 @@ public void add(Player player) { @Override public void refreshPlaceholders() { for (ScoreLine line : this.lines) { - applyPlaceholders(line).sendUpdateToAllReceivers(); + if (!(line.getLine() instanceof SidebarLineAnimated)) { + if (line.refreshContent()) { + line.sendUpdateToAllReceivers(); + } + } } } // refresh placeholders for the given line before sending it - private String applyLinePlaceholders(@NotNull SidebarLine line) { - String content = line.getLine(); - for (PlaceholderProvider pp : this.placeholderProviders) { - content = content.replace(pp.getPlaceholder(), pp.getReplacement()); - } - return content; - } - - public ScoreLine applyPlaceholders(@NotNull ScoreLine line) { - String content = null; - if (line.getLine().isInternalPlaceholders()) { - content = applyLinePlaceholders(line.getLine()); - } - if (null == content) { - content = line.getLine().getLine(); - } - if (line.getLine().isPapiPlaceholders()) { - content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders( - getReceivers().size() > 1 ? null : getReceivers().getFirst(), content - ); - } - line.setContent(content); - - return line; - } - - public String parsePlaceholders(@NotNull SidebarLine line) { - String content = null; - if (line.isInternalPlaceholders()) { - content = applyLinePlaceholders(line); - } - if (null == content) { - content = line.getLine(); - } - if (line.isPapiPlaceholders()) { - content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders( - getReceivers().size() > 1 ? null : getReceivers().getFirst(), content - ); - } - - return content; - } +// private String applyLinePlaceholders(@NotNull SidebarLine line) { +// String content = line.getLine(); +// for (PlaceholderProvider pp : this.placeholderProviders) { +// content = content.replace(pp.getPlaceholder(), pp.getReplacement()); +// } +// return content; +// } + +// public ScoreLine applyPlaceholders(@NotNull ScoreLine line) { +// String content = null; +// if (line.getLine().isInternalPlaceholders()) { +// content = applyLinePlaceholders(line.getLine()); +// } +// if (null == content) { +// content = line.getLine().getLine(); +// } +// if (line.getLine().isPapiPlaceholders()) { +// content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders( +// getReceivers().size() > 1 ? null : getReceivers().getFirst(), content +// ); +// } +// line.setContent(content); +// +// return line; +// } + +// public String parsePlaceholders(@NotNull SidebarLine line) { +// String content = null; +// if (line.isInternalPlaceholders()) { +// content = applyLinePlaceholders(line); +// } +// if (null == content) { +// content = line.getLine(); +// } +// if (line.isPapiPlaceholders()) { +// content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders( +// getReceivers().size() > 1 ? null : getReceivers().getFirst(), content +// ); +// } +// +// return content; +// } @Override public void refreshTitle() { - this.sidebarObjective.sendUpdate(); + if (this.sidebarObjective.refreshTitle()) { + this.sidebarObjective.sendUpdate(); + } } @Override public void refreshAnimatedLines() { for (ScoreLine line : lines) { if (line.getLine() instanceof SidebarLineAnimated) { - applyPlaceholders(line).sendUpdateToAllReceivers(); + if (line.refreshContent()) { + line.sendUpdateToAllReceivers(); + } } } } @@ -225,8 +243,8 @@ public void removePlaceholder(String placeholder) { } @Override - public List getPlaceholders() { - return Collections.unmodifiableList(placeholderProviders); + public Collection getPlaceholders() { + return placeholderProviders; } @Override @@ -278,6 +296,7 @@ public void showPlayersHealth(SidebarLine displayName, boolean list) { healthObjective = SidebarManager.getInstance().getSidebarProvider().createObjective( this, list ? "health" : "health2", true, displayName, 2 ); + healthObjective.refreshTitle(); this.receivers.forEach(receiver -> healthObjective.sendCreate(receiver)); } else { healthObjective.sendUpdate(); @@ -294,7 +313,7 @@ public PlayerTab playerTabCreate( SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, - @Nullable LinkedList placeholders + @Nullable Collection placeholders ) { if (identifier.length() > 16) { @@ -304,6 +323,7 @@ public PlayerTab playerTabCreate( this, identifier, prefix, suffix, pushingRule, PlayerTab.NameTagVisibility.ALWAYS, placeholders ); + tab.refreshContent(); // send tab create to sidebar receivers getReceivers().forEach(tab::sendCreateToPlayer); if (null != player) { @@ -334,7 +354,11 @@ public void removeTabs() { @Override public void playerTabRefreshAnimation() { - this.tabView.forEach(VersionedTabGroup::sendUpdateToReceivers); + for (VersionedTabGroup tab : this.tabView) { + if (tab.refreshContent()) { + tab.sendUpdateToReceivers(); + } + } } @Override diff --git a/sidebar-v1_12_R1/pom.xml b/sidebar-v1_12_R1/pom.xml index b180380..f78e85e 100644 --- a/sidebar-v1_12_R1/pom.xml +++ b/sidebar-v1_12_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 23.10.1-SNAPSHOT + 23.10.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/PlayerListImpl.java b/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/PlayerListImpl.java index a33868f..fa49f9c 100644 --- a/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/PlayerListImpl.java +++ b/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/PlayerListImpl.java @@ -3,29 +3,30 @@ import com.andrei1058.spigot.sidebar.*; import net.minecraft.server.v1_12_R1.PacketPlayOutScoreboardTeam; import net.minecraft.server.v1_12_R1.ScoreboardTeam; -import net.md_5.bungee.api.ChatColor; import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.Collections; -import java.util.LinkedList; public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { private EnumTeamPush pushingRule; private final SidebarLine prefix; + private String prefixString = ""; private final SidebarLine suffix; + private String suffixString = ""; private final WrappedSidebar sidebar; private final String id; private EnumNameTagVisibility nameTagVisibility; private Player papiSubject = null; - private final LinkedList placeholders; + private final Collection placeholders; public PlayerListImpl(@NotNull WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PushingRule pushingRule, NameTagVisibility nameTagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { super(null, identifier); this.suffix = suffix; this.prefix = prefix; @@ -51,52 +52,17 @@ public void setCollisionRule(EnumTeamPush enumTeamPush) { @Override public String getFormattedName(String var0) { - return prefix.getLine().concat(var0).concat(suffix.getLine()); + return getPrefix().concat(var0).concat(getSuffix()); } @Override public String getPrefix() { - String t = prefix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 16) { - t = t.substring(0, 16); - } - return t; + return prefixString; } @Override public String getSuffix() { - String t = suffix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 16) { - t = t.substring(0, 16); - } - return t; + return suffixString; } @Override @@ -151,6 +117,20 @@ public void sendRemoveToReceivers() { sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().playerConnection.sendPacket(packetPlayOutScoreboardTeam)); } + @Override + public boolean refreshContent() { + String newPrefix = this.prefix.getTrimReplacePlaceholders(getSubject(), 16, this.placeholders); + String newSuffix = this.suffix.getTrimReplacePlaceholders(getSubject(), 16, this.placeholders); + + if (newPrefix.equals(prefixString) && newSuffix.equals(suffixString)) { + return false; + } + + this.prefixString = newPrefix; + this.suffixString = newSuffix; + return true; + } + @Override public String getIdentifier() { return id; diff --git a/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/ProviderImpl.java b/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/ProviderImpl.java index 6520321..4956d62 100644 --- a/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/ProviderImpl.java +++ b/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/ProviderImpl.java @@ -10,6 +10,7 @@ import java.lang.reflect.Field; import java.util.Collection; import java.util.LinkedList; +import java.util.concurrent.ConcurrentLinkedQueue; @SuppressWarnings("unused") public class ProviderImpl extends SidebarProvider { @@ -72,7 +73,7 @@ public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int sc @Override public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility nameTagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, nameTagVisibility, placeholders); } diff --git a/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java b/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java index f4db0a8..9e2622e 100644 --- a/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java +++ b/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java @@ -32,12 +32,12 @@ public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreb protected class NarniaSidebarObjective extends ScoreboardObjective implements SidebarObjective { private SidebarLine displayName; + private String displayNameString = ""; private final int type; public NarniaSidebarObjective(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { super(null, name, criteria); this.displayName = displayName; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); this.type = type; } @@ -49,8 +49,6 @@ public IScoreboardCriteria.EnumScoreboardHealthDisplay e() { @Override public void setTitle(SidebarLine title) { this.displayName = title; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); - this.sendUpdate(); } @Override @@ -78,13 +76,24 @@ public void sendRemove(Player player) { } @Override - public String getDisplayName() { - String t = parsePlaceholders(displayName); + public boolean refreshTitle() { + String newTitle = displayName.getTrimReplacePlaceholders( + getReceivers().size() == 1 ? getReceivers().getFirst() : null, + 16, + getPlaceholders() + ); - if (t.length() > 16) { - t = t.substring(0, 16); + if (newTitle.equals(getDisplayName())) { + return false; } - return t; + + this.displayNameString = newTitle; + return true; + } + + @Override + public String getDisplayName() { + return displayNameString; } @@ -110,12 +119,6 @@ public BucharestScoreLine(@NotNull SidebarLine text, int score, @NotNull String this.score = score; this.text = text; this.team = new TeamLine(color); - - - SidebarLine.markHasPlaceholders(text, getPlaceholders()); - - //noinspection ResultOfMethodCallIgnored - setContent(parsePlaceholders(text)); } @Override @@ -181,10 +184,12 @@ public void sendUpdate(Player player) { } @Contract(pure = true) - public boolean setContent(@NotNull String content) { - if (!getReceivers().isEmpty()) { - content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getReceivers().get(0), content); - } + public boolean setContent(@NotNull SidebarLine line) { + String content = line.getTrimReplacePlaceholders( + getReceivers().size() == 1 ? getReceivers().getFirst() : null, + null, + getPlaceholders() + ); var oldPrefix = this.prefix; var oldSuffix = this.suffix; @@ -245,6 +250,11 @@ public String getColor() { return team.getName().charAt(0) == ChatColor.COLOR_CHAR ? team.getName() : ChatColor.COLOR_CHAR + team.getName(); } + @Override + public boolean refreshContent() { + return setContent(getLine()); + } + private class TeamLine extends ScoreboardTeam { public TeamLine(String color) { @@ -291,7 +301,7 @@ public void setColor(EnumChatFormat var0) { } @Override - public String getFormattedName(String var0) { + public @NotNull String getFormattedName(String var0) { return prefix.concat(var0).concat(suffix); } } diff --git a/sidebar-v1_16_R1/pom.xml b/sidebar-v1_16_R1/pom.xml index 1a9927e..be9a90d 100644 --- a/sidebar-v1_16_R1/pom.xml +++ b/sidebar-v1_16_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 23.10.1-SNAPSHOT + 23.10.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/PlayerListImpl.java b/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/PlayerListImpl.java index b310156..f790752 100644 --- a/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/PlayerListImpl.java +++ b/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/PlayerListImpl.java @@ -2,28 +2,29 @@ import com.andrei1058.spigot.sidebar.*; import net.minecraft.server.v1_16_R3.*; -import net.md_5.bungee.api.ChatColor; import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.Collections; -import java.util.LinkedList; public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { private EnumTeamPush pushingRule; private final SidebarLine prefix; + private ChatComponentText prefixString = new ChatComponentText(""); private final SidebarLine suffix; + private ChatComponentText suffixString = new ChatComponentText(""); private final WrappedSidebar sidebar; private final String id; private ScoreboardTeamBase.EnumNameTagVisibility nameTagVisibility; private Player papiSubject = null; - private final LinkedList placeholders; + private final Collection placeholders; public PlayerListImpl(@NotNull WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PushingRule pushingRule, NameTagVisibility nameTagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { super(null, identifier); this.suffix = suffix; this.prefix = prefix; @@ -50,52 +51,17 @@ public IChatMutableComponent d() { @Override public IChatMutableComponent getFormattedName(IChatBaseComponent var0) { - return new ChatComponentText(prefix.getLine() + var0 + suffix.getLine()); + return new ChatComponentText(prefixString.h() + var0 + suffixString.h()); } @Override public IChatBaseComponent getPrefix() { - String t = prefix.getLine(); - if (null != placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 16) { - t = t.substring(0, 16); - } - return new ChatComponentText(t); + return this.prefixString; } @Override public IChatBaseComponent getSuffix() { - String t = suffix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 16) { - t = t.substring(0, 16); - } - return new ChatComponentText(t); + return this.suffixString; } @Override @@ -109,7 +75,7 @@ public ScoreboardTeamBase.EnumNameTagVisibility getNameTagVisibility() { } @Override - public void add(Player player) { + public void add(@NotNull Player player) { PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = new PacketPlayOutScoreboardTeam( this, Collections.singleton(player.getName()), 3 ); @@ -122,7 +88,7 @@ public void sendCreateToPlayer(Player player) { ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packetPlayOutScoreboardTeam); } - public void remove(Player player) { + public void remove(@NotNull Player player) { // send 4: remove entities from team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = new PacketPlayOutScoreboardTeam( this, Collections.singleton(player.getName()), 4 @@ -131,7 +97,7 @@ public void remove(Player player) { } @Override - public void sendUserCreateToReceivers(Player player) { + public void sendUserCreateToReceivers(@NotNull Player player) { // send 3: add entities to team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = new PacketPlayOutScoreboardTeam( this, Collections.singleton(player.getName()), 3 @@ -150,6 +116,20 @@ public void sendRemoveToReceivers() { sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().playerConnection.sendPacket(packetPlayOutScoreboardTeam)); } + @Override + public boolean refreshContent() { + String newPrefix = this.prefix.getTrimReplacePlaceholders(getSubject(), 16, this.placeholders); + String newSuffix = this.suffix.getTrimReplacePlaceholders(getSubject(), 16, this.placeholders); + + if (newPrefix.equals(prefixString.h()) && newSuffix.equals(suffixString.h())) { + return false; + } + + this.prefixString = new ChatComponentText(newPrefix); + this.suffixString = new ChatComponentText(newSuffix); + return true; + } + @Override public String getIdentifier() { return id; diff --git a/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/ProviderImpl.java b/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/ProviderImpl.java index 971d6a2..8821759 100644 --- a/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/ProviderImpl.java +++ b/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/ProviderImpl.java @@ -8,7 +8,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.LinkedList; @SuppressWarnings("unused") public class ProviderImpl extends SidebarProvider { @@ -44,7 +43,7 @@ public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int sc @Override public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility nameTagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, nameTagVisibility, placeholders); } diff --git a/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java b/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java index f45d462..940f81b 100644 --- a/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java +++ b/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java @@ -32,20 +32,18 @@ public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreb protected class NarniaSidebarObjective extends ScoreboardObjective implements SidebarObjective { private SidebarLine displayName; + private ChatComponentText displayNameString = new ChatComponentText(""); private final int type; public NarniaSidebarObjective(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { super(null, name, criteria, new ChatComponentText(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.INTEGER); this.displayName = displayName; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); this.type = type; } @Override public void setTitle(SidebarLine title) { this.displayName = title; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); - this.sendUpdate(); } @Override @@ -73,13 +71,24 @@ public void sendRemove(Player player) { } @Override - public IChatBaseComponent getDisplayName() { - String t = parsePlaceholders(displayName); + public boolean refreshTitle() { + String newTitle = displayName.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + ); - if (t.length() > 32) { - t = t.substring(0, 32); + if (displayNameString.h().equals(newTitle)) { + return false; } - return new ChatComponentText(t); + + this.displayNameString = new ChatComponentText(newTitle); + return true; + } + + @Override + public IChatBaseComponent getDisplayName() { + return displayNameString; } @@ -102,7 +111,8 @@ public void sendUpdate() { public class BucharestScoreLine extends ScoreboardScore implements ScoreLine, Comparable { private int score; - private String prefix = " ", suffix = ""; + private ChatComponentText prefixComponent = new ChatComponentText(""); + private ChatComponentText suffixComponent = new ChatComponentText(""); private final TeamLine team; private SidebarLine text; @@ -111,12 +121,6 @@ public BucharestScoreLine(@NotNull SidebarLine text, int score, @NotNull String this.score = score; this.text = text; this.team = new TeamLine(color); - - - SidebarLine.markHasPlaceholders(text, getPlaceholders()); - - //noinspection ResultOfMethodCallIgnored - setContent(parsePlaceholders(text)); } @Override @@ -188,35 +192,37 @@ public void sendUpdate(Player player) { } @Contract(pure = true) - public boolean setContent(@NotNull String content) { - if (!getReceivers().isEmpty()) { - content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getReceivers().get(0), content); - } - var oldPrefix = this.prefix; - var oldSuffix = this.suffix; + public boolean setContent(@NotNull SidebarLine line) { + String content = line.getTrimReplacePlaceholders( + getReceivers().size() == 1 ? getReceivers().getFirst() : null, + null, + getPlaceholders() + ); + var oldPrefix = this.prefixComponent.h(); + var oldSuffix = this.suffixComponent.h(); if (content.length() > 32) { - this.prefix = content.substring(0, 32); - if (this.prefix.charAt(31) == ChatColor.COLOR_CHAR) { - this.prefix = content.substring(0, 31); + this.prefixComponent = new ChatComponentText(content.substring(0, 32)); + if (this.prefixComponent.h().charAt(31) == ChatColor.COLOR_CHAR) { + this.prefixComponent = new ChatComponentText(content.substring(0, 31)); setSuffix(content.substring(31)); } else { setSuffix(content.substring(32)); } } else { - this.prefix = content; - this.suffix = ""; + this.prefixComponent = new ChatComponentText(content); + this.suffixComponent = new ChatComponentText(""); } - return !oldPrefix.equals(this.prefix) || !oldSuffix.equals(this.suffix); + return !oldPrefix.equals(this.prefixComponent.h()) || !oldSuffix.equals(this.suffixComponent.h()); } public void setSuffix(@NotNull String secondPart) { if (secondPart.isEmpty()) { - this.suffix = ""; + this.suffixComponent = new ChatComponentText(""); return; } - secondPart = org.bukkit.ChatColor.getLastColors(this.prefix) + secondPart; - this.suffix = secondPart.length() > 32 ? secondPart.substring(0, 32) : secondPart; + secondPart = org.bukkit.ChatColor.getLastColors(this.prefixComponent.h()) + secondPart; + this.suffixComponent = new ChatComponentText(secondPart.length() > 32 ? secondPart.substring(0, 32) : secondPart); } public void sendUpdateToAllReceivers() { @@ -257,6 +263,11 @@ public String getColor() { return team.getName().charAt(0) == ChatColor.COLOR_CHAR ? team.getName() : ChatColor.COLOR_CHAR + team.getName(); } + @Override + public boolean refreshContent() { + return setContent(getLine()); + } + private class TeamLine extends ScoreboardTeam { public TeamLine(String color) { @@ -264,9 +275,10 @@ public TeamLine(String color) { getPlayerNameSet().add(color); } + @Contract(value = " -> new", pure = true) @Override - public IChatBaseComponent getPrefix() { - return new ChatComponentText(prefix); + public @NotNull IChatBaseComponent getPrefix() { + return prefixComponent; } @Override @@ -277,9 +289,10 @@ public void setPrefix(@Nullable IChatBaseComponent var0) { public void setSuffix(@Nullable IChatBaseComponent var0) { } + @Contract(value = " -> new", pure = true) @Override - public IChatBaseComponent getSuffix() { - return new ChatComponentText(suffix); + public @NotNull IChatBaseComponent getSuffix() { + return suffixComponent; } @Override @@ -302,9 +315,10 @@ public void setCollisionRule(EnumTeamPush var0) { public void setColor(EnumChatFormat var0) { } + @Contract(value = "_ -> new", pure = true) @Override - public IChatMutableComponent getFormattedName(IChatBaseComponent var0) { - return new ChatComponentText(prefix + var0 + suffix); + public @NotNull IChatMutableComponent getFormattedName(IChatBaseComponent var0) { + return new ChatComponentText(prefixComponent.h() + var0 + suffixComponent.h()); } } } diff --git a/sidebar-v1_17_R1/pom.xml b/sidebar-v1_17_R1/pom.xml index efc1031..515d7dd 100644 --- a/sidebar-v1_17_R1/pom.xml +++ b/sidebar-v1_17_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 23.10.1-SNAPSHOT + 23.10.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/PlayerListImpl.java b/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/PlayerListImpl.java index 475328f..54ce034 100644 --- a/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/PlayerListImpl.java +++ b/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/PlayerListImpl.java @@ -7,27 +7,28 @@ import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; import net.minecraft.world.scores.ScoreboardTeam; import net.minecraft.world.scores.ScoreboardTeamBase; -import net.md_5.bungee.api.ChatColor; import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.LinkedList; +import java.util.Collection; public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { private final SidebarLine prefix; + private ChatComponentText prefixComponent; private final SidebarLine suffix; + private ChatComponentText suffixComponent; private final WrappedSidebar sidebar; private final String id; private ScoreboardTeamBase.EnumNameTagVisibility nameTagVisibility; private Player papiSubject = null; private EnumTeamPush pushingRule; - private final LinkedList placeholders; + private final Collection placeholders; public PlayerListImpl(@NotNull WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PushingRule pushingRule, NameTagVisibility nameTagVisibility, - @org.jetbrains.annotations.Nullable LinkedList placeholders) { + @org.jetbrains.annotations.Nullable Collection placeholders) { super(null, identifier); this.suffix = suffix; this.prefix = prefix; @@ -54,52 +55,17 @@ public IChatMutableComponent d() { @Override public IChatMutableComponent getFormattedName(IChatBaseComponent var0) { - return new ChatComponentText(prefix.getLine() + var0 + suffix.getLine()); + return new ChatComponentText(prefixComponent.h() + var0 + suffixComponent.h()); } @Override public IChatBaseComponent getPrefix() { - String t = prefix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 16) { - t = t.substring(0, 16); - } - return new ChatComponentText(t); + return prefixComponent; } @Override public IChatBaseComponent getSuffix() { - String t = suffix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 16) { - t = t.substring(0, 16); - } - return new ChatComponentText(t); + return suffixComponent; } @Override @@ -113,7 +79,7 @@ public ScoreboardTeamBase.EnumNameTagVisibility getNameTagVisibility() { } @Override - public void add(Player player) { + public void add(@NotNull Player player) { PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.a ); @@ -126,7 +92,7 @@ public void sendCreateToPlayer(Player player) { ((CraftPlayer) player).getHandle().b.sendPacket(packetPlayOutScoreboardTeam); } - public void remove(Player player) { + public void remove(@NotNull Player player) { // send 4: remove entities from team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.b @@ -135,7 +101,7 @@ public void remove(Player player) { } @Override - public void sendUserCreateToReceivers(Player player) { + public void sendUserCreateToReceivers(@NotNull Player player) { // send 3: add entities to team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.a @@ -154,6 +120,21 @@ public void sendRemoveToReceivers() { sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().b.sendPacket(packetPlayOutScoreboardTeam)); } + @Override + public boolean refreshContent() { + String newPrefix = this.prefix.getTrimReplacePlaceholders(getSubject(), 16, this.placeholders); + String newSuffix = this.suffix.getTrimReplacePlaceholders(getSubject(), 16, this.placeholders); + + if (newPrefix.equals(prefixComponent.h()) && newSuffix.equals(suffixComponent.h())) { + return false; + } + + this.prefixComponent = new ChatComponentText(newPrefix); + this.suffixComponent = new ChatComponentText(newSuffix); + + return true; + } + @Override public String getIdentifier() { return id; diff --git a/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/ProviderImpl.java b/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/ProviderImpl.java index 26b46ec..fe1fcf0 100644 --- a/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/ProviderImpl.java +++ b/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/ProviderImpl.java @@ -15,6 +15,7 @@ import java.util.Collection; import java.util.LinkedList; +import java.util.concurrent.ConcurrentLinkedQueue; @SuppressWarnings("unused") public class ProviderImpl extends SidebarProvider { @@ -50,7 +51,7 @@ public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int sc @Override public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility nameTagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, nameTagVisibility, placeholders); } diff --git a/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java b/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java index b803b47..98ad1c3 100644 --- a/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java +++ b/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java @@ -45,20 +45,18 @@ public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreb protected class NarniaSidebarObjective extends ScoreboardObjective implements SidebarObjective { private SidebarLine displayName; + private ChatComponentText displayNameComponent; private final int type; public NarniaSidebarObjective(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { super(null, name, criteria, new ChatComponentText(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a); this.displayName = displayName; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); this.type = type; } @Override public void setTitle(SidebarLine title) { this.displayName = title; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); - this.sendUpdate(); } @Override @@ -84,17 +82,28 @@ public void sendCreate(Player player) { @Override public void sendRemove(Player player) { PacketPlayOutScoreboardObjective packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 1); - ((CraftPlayer)player).getHandle().b.sendPacket(packetPlayOutScoreboardObjective); + ((CraftPlayer) player).getHandle().b.sendPacket(packetPlayOutScoreboardObjective); } @Override - public IChatBaseComponent getDisplayName() { - String t = parsePlaceholders(displayName); + public boolean refreshTitle() { + String newTitle = displayName.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + 32, + getPlaceholders() + ); - if (t.length() > 32) { - t = t.substring(0, 32); + if (newTitle.equals(displayNameComponent.h())) { + return false; } - return new ChatComponentText(t); + + this.displayNameComponent = new ChatComponentText(newTitle); + return true; + } + + @Override + public IChatBaseComponent getDisplayName() { + return displayNameComponent; } @@ -117,7 +126,8 @@ public void sendUpdate() { public class NarniaScoreLine extends ScoreboardScore implements ScoreLine, Comparable { private int score; - private String prefix = " ", suffix = ""; + private ChatComponentText prefixComponent = new ChatComponentText(""); + private ChatComponentText suffixComponent = new ChatComponentText(""); private final TeamLine team; private SidebarLine text; @@ -126,12 +136,6 @@ public NarniaScoreLine(@NotNull SidebarLine text, int score, @NotNull String col this.score = score; this.text = text; this.team = new TeamLine(color); - - - SidebarLine.markHasPlaceholders(text, getPlaceholders()); - - //noinspection ResultOfMethodCallIgnored - setContent(parsePlaceholders(text)); } @Override @@ -201,35 +205,37 @@ public void sendUpdate(Player player) { } @Contract(pure = true) - public boolean setContent(@NotNull String content) { - if (!getReceivers().isEmpty()) { - content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getReceivers().get(0), content); - } - var oldPrefix = this.prefix; - var oldSuffix = this.suffix; + public boolean setContent(@NotNull SidebarLine line) { + String content = line.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + ); + var oldPrefix = this.prefixComponent.h(); + var oldSuffix = this.suffixComponent.h(); if (content.length() > 32) { - this.prefix = content.substring(0, 32); - if (this.prefix.charAt(31) == ChatColor.COLOR_CHAR) { - this.prefix = content.substring(0, 31); + this.prefixComponent = new ChatComponentText(content.substring(0, 32)); + if (this.prefixComponent.h().charAt(31) == ChatColor.COLOR_CHAR) { + this.prefixComponent = new ChatComponentText(content.substring(0, 31)); setSuffix(content.substring(31)); } else { setSuffix(content.substring(32)); } } else { - this.prefix = content; - this.suffix = ""; + this.prefixComponent = new ChatComponentText(content); + this.suffixComponent = new ChatComponentText(""); } - return !oldPrefix.equals(this.prefix) || !oldSuffix.equals(this.suffix); + return !oldPrefix.equals(this.prefixComponent.h()) || !oldSuffix.equals(this.suffixComponent.h()); } public void setSuffix(@NotNull String secondPart) { if (secondPart.isEmpty()) { - this.suffix = ""; + this.suffixComponent = new ChatComponentText(""); return; } - secondPart = org.bukkit.ChatColor.getLastColors(this.prefix) + secondPart; - this.suffix = secondPart.length() > 32 ? secondPart.substring(0, 32) : secondPart; + secondPart = org.bukkit.ChatColor.getLastColors(this.prefixComponent.h()) + secondPart; + this.suffixComponent = new ChatComponentText(secondPart.length() > 32 ? secondPart.substring(0, 32) : secondPart); } public void sendUpdateToAllReceivers() { @@ -270,6 +276,11 @@ public String getColor() { return team.getName().charAt(0) == ChatColor.COLOR_CHAR ? team.getName() : ChatColor.COLOR_CHAR + team.getName(); } + @Override + public boolean refreshContent() { + return setContent(getLine()); + } + private class TeamLine extends ScoreboardTeam { public TeamLine(String color) { @@ -277,9 +288,10 @@ public TeamLine(String color) { getPlayerNameSet().add(color); } + @Contract(value = " -> new", pure = true) @Override - public IChatBaseComponent getPrefix() { - return new ChatComponentText(prefix); + public @NotNull IChatBaseComponent getPrefix() { + return prefixComponent; } @Override @@ -290,9 +302,10 @@ public void setPrefix(@Nullable IChatBaseComponent var0) { public void setSuffix(@Nullable IChatBaseComponent var0) { } + @Contract(value = " -> new", pure = true) @Override - public IChatBaseComponent getSuffix() { - return new ChatComponentText(suffix); + public @NotNull IChatBaseComponent getSuffix() { + return suffixComponent; } @Override @@ -315,9 +328,10 @@ public void setCollisionRule(EnumTeamPush var0) { public void setColor(EnumChatFormat var0) { } + @Contract(value = "_ -> new", pure = true) @Override - public IChatMutableComponent getFormattedName(IChatBaseComponent var0) { - return new ChatComponentText(prefix + var0 + suffix); + public @NotNull IChatMutableComponent getFormattedName(IChatBaseComponent var0) { + return new ChatComponentText(prefixComponent.h() + var0 + suffixComponent.h()); } } } diff --git a/sidebar-v1_18_R2/pom.xml b/sidebar-v1_18_R2/pom.xml index 86d9d81..9319963 100644 --- a/sidebar-v1_18_R2/pom.xml +++ b/sidebar-v1_18_R2/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 23.10.1-SNAPSHOT + 23.10.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/PlayerListImpl.java b/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/PlayerListImpl.java index bf23ab3..ec26ad9 100644 --- a/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/PlayerListImpl.java +++ b/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/PlayerListImpl.java @@ -6,27 +6,29 @@ import net.minecraft.network.chat.IChatMutableComponent; import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; import net.minecraft.world.scores.ScoreboardTeam; -import net.md_5.bungee.api.ChatColor; import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.LinkedList; +import java.util.Collection; public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { private EnumTeamPush pushingRule; private final SidebarLine prefix; + private ChatComponentText prefixComponent = new ChatComponentText(""); private final SidebarLine suffix; + private ChatComponentText suffixComponent = new ChatComponentText(""); private final WrappedSidebar sidebar; private final String id; private EnumNameTagVisibility nameTagVisibility = EnumNameTagVisibility.a; private Player papiSubject = null; - private final LinkedList placeholders; + private final Collection placeholders; + public PlayerListImpl(@NotNull WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PushingRule pushingRule, NameTagVisibility nameTagVisibility, - @org.jetbrains.annotations.Nullable LinkedList placeholders) { + @org.jetbrains.annotations.Nullable Collection placeholders) { super(null, identifier); this.suffix = suffix; this.prefix = prefix; @@ -62,24 +64,7 @@ public String b() { @Override public IChatBaseComponent e() { - String t = prefix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 32) { - t = t.substring(0, 32); - } - return new ChatComponentText(t); + return prefixComponent; } @Override @@ -88,25 +73,7 @@ public void c(@Nullable IChatBaseComponent var0) { @Override public IChatBaseComponent f() { - String t = suffix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 32) { - t = t.substring(0, 32); - } - return new ChatComponentText(t); + return suffixComponent; } @Override @@ -141,7 +108,7 @@ public void sendCreateToPlayer(Player player) { ((CraftPlayer) player).getHandle().b.a(packetPlayOutScoreboardTeam); } - public void remove(Player player) { + public void remove(@NotNull Player player) { // send 4: remove entities from team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.b @@ -150,7 +117,7 @@ public void remove(Player player) { } @Override - public void sendUserCreateToReceivers(Player player) { + public void sendUserCreateToReceivers(@NotNull Player player) { // send 3: add entities to team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.a @@ -169,6 +136,21 @@ public void sendRemoveToReceivers() { sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().b.a(packetPlayOutScoreboardTeam)); } + @Override + public boolean refreshContent() { + String newPrefix = this.prefix.getTrimReplacePlaceholders(getSubject(), 32, this.placeholders); + String newSuffix = this.suffix.getTrimReplacePlaceholders(getSubject(), 32, this.placeholders); + + if (newPrefix.equals(this.prefixComponent.h()) && newSuffix.equals(this.suffixComponent.h())) { + return false; + } + + this.prefixComponent = new ChatComponentText(newPrefix); + this.suffixComponent = new ChatComponentText(newSuffix); + + return true; + } + @Override public String getIdentifier() { return id; @@ -205,7 +187,7 @@ public void setNameTagVisibility(@NotNull NameTagVisibility nameTagVisibility) { case HIDE_FOR_OTHER_TEAMS -> this.nameTagVisibility = EnumNameTagVisibility.c; case HIDE_FOR_OWN_TEAM -> this.nameTagVisibility = EnumNameTagVisibility.d; } - if (null != id){ + if (null != id) { sendUpdateToReceivers(); } } diff --git a/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/ProviderImpl.java b/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/ProviderImpl.java index 96ea94d..7582a57 100644 --- a/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/ProviderImpl.java +++ b/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/ProviderImpl.java @@ -15,6 +15,7 @@ import java.util.Collection; import java.util.LinkedList; +import java.util.concurrent.ConcurrentLinkedQueue; @SuppressWarnings("unused") public class ProviderImpl extends SidebarProvider { @@ -50,7 +51,7 @@ public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int sc @Override public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility tagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, tagVisibility, placeholders); } diff --git a/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java b/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java index f15a46d..486f6e9 100644 --- a/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java +++ b/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java @@ -41,20 +41,18 @@ public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreb protected class NarniaSidebarObjective extends ScoreboardObjective implements SidebarObjective { private SidebarLine displayName; + private ChatComponentText displayNameComp; private final int type; public NarniaSidebarObjective(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { super(null, name, criteria, new ChatComponentText(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a); this.displayName = displayName; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); this.type = type; } @Override public void setTitle(SidebarLine title) { this.displayName = title; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); - this.sendUpdate(); } @Override @@ -78,13 +76,24 @@ public String getName() { } @Override - public IChatBaseComponent d() { - String t = parsePlaceholders(displayName); + public boolean refreshTitle() { + String newTitle = displayName.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + 32, + getPlaceholders() + ); - if (t.length() > 32) { - t = t.substring(0, 32); + if (newTitle.equals(this.displayNameComp.h())) { + return false; } - return new ChatComponentText(t); + + this.displayNameComp = new ChatComponentText(newTitle); + return true; + } + + @Override + public IChatBaseComponent d() { + return displayNameComp; } @Override @@ -126,7 +135,8 @@ public void sendRemove(@NotNull PlayerConnection playerConnection) { public class NarniaScoreLine extends ScoreboardScore implements ScoreLine, Comparable { private int score; - private String prefix = " ", suffix = ""; + private ChatComponentText prefixComp = new ChatComponentText(""); + private ChatComponentText suffixComp = new ChatComponentText(""); private final TeamLine team; private SidebarLine text; @@ -135,12 +145,6 @@ public NarniaScoreLine(@NotNull SidebarLine text, int score, @NotNull String col this.score = score; this.text = text; this.team = new TeamLine(color); - - - SidebarLine.markHasPlaceholders(text, getPlaceholders()); - - //noinspection ResultOfMethodCallIgnored - setContent(parsePlaceholders(text)); } @Override @@ -210,34 +214,36 @@ public void sendUpdate(Player player) { } @Contract(pure = true) - public boolean setContent(@NotNull String content) { - if (!getReceivers().isEmpty()) { - content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getReceivers().get(0), content); - } - var oldPrefix = this.prefix; - var oldSuffix = this.suffix; + public boolean setContent(@NotNull SidebarLine line) { + String content = line.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + ); + var oldPrefix = this.prefixComp.h(); + var oldSuffix = this.suffixComp.h(); if (content.length() > 64) { - this.prefix = content.substring(0, 64); - if (this.prefix.charAt(63) == ChatColor.COLOR_CHAR) { - this.prefix = content.substring(0, 63); + this.prefixComp = new ChatComponentText(content.substring(0, 64)); + if (this.prefixComp.h().charAt(63) == ChatColor.COLOR_CHAR) { + this.prefixComp = new ChatComponentText(content.substring(0, 63)); setSuffix(content.substring(63)); } else { setSuffix(content.substring(64)); } } else { - this.prefix = content; - this.suffix = ""; + this.prefixComp = new ChatComponentText(content); + this.suffixComp = new ChatComponentText(""); } - return !oldPrefix.equals(this.prefix) || !oldSuffix.equals(this.suffix); + return !oldPrefix.equals(this.prefixComp.h()) || !oldSuffix.equals(this.suffixComp.h()); } public void setSuffix(@NotNull String secondPart) { if (secondPart.isEmpty()) { - this.suffix = ""; + this.suffixComp = new ChatComponentText(""); return; } - secondPart = org.bukkit.ChatColor.getLastColors(this.prefix) + secondPart; - this.suffix = secondPart.length() > 64 ? secondPart.substring(0, 64) : secondPart; + secondPart = org.bukkit.ChatColor.getLastColors(this.prefixComp.h()) + secondPart; + this.suffixComp = new ChatComponentText(secondPart.length() > 64 ? secondPart.substring(0, 64) : secondPart); } public void sendUpdateToAllReceivers() { @@ -278,6 +284,11 @@ public String getColor() { return team.b().charAt(0) == ChatColor.COLOR_CHAR ? team.b() : ChatColor.COLOR_CHAR + team.b(); } + @Override + public boolean refreshContent() { + return setContent(getLine()); + } + private class TeamLine extends ScoreboardTeam { public TeamLine(String color) { @@ -285,9 +296,10 @@ public TeamLine(String color) { g().add(color); } + @Contract(value = " -> new", pure = true) @Override - public IChatBaseComponent e() { - return new ChatComponentText(prefix); + public @NotNull IChatBaseComponent e() { + return prefixComp; } @Override @@ -298,9 +310,10 @@ public void b(@Nullable IChatBaseComponent var0) { public void c(@Nullable IChatBaseComponent var0) { } + @Contract(value = " -> new", pure = true) @Override - public IChatBaseComponent f() { - return new ChatComponentText(suffix); + public @NotNull IChatBaseComponent f() { + return suffixComp; } @Override @@ -323,9 +336,10 @@ public void a(EnumTeamPush var0) { public void a(EnumChatFormat var0) { } + @Contract(value = "_ -> new", pure = true) @Override - public IChatMutableComponent d(IChatBaseComponent var0) { - return new ChatComponentText(prefix + var0 + suffix); + public @NotNull IChatMutableComponent d(IChatBaseComponent var0) { + return new ChatComponentText(prefixComp.h() + var0 + suffixComp.h()); } } } diff --git a/sidebar-v1_19_R2/pom.xml b/sidebar-v1_19_R2/pom.xml index 7f8dda1..2613bc0 100644 --- a/sidebar-v1_19_R2/pom.xml +++ b/sidebar-v1_19_R2/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 23.10.1-SNAPSHOT + 23.10.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/PlayerListImpl.java b/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/PlayerListImpl.java index dda6215..eb8a9c3 100644 --- a/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/PlayerListImpl.java +++ b/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/PlayerListImpl.java @@ -5,27 +5,29 @@ import net.minecraft.network.chat.IChatMutableComponent; import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; import net.minecraft.world.scores.ScoreboardTeam; -import net.md_5.bungee.api.ChatColor; import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.LinkedList; +import java.util.Collection; public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { private EnumTeamPush pushingRule; private final SidebarLine prefix; + private IChatMutableComponent prefixComp = IChatBaseComponent.b(""); private final SidebarLine suffix; + private IChatBaseComponent suffixComp = IChatBaseComponent.b(""); private final WrappedSidebar sidebar; private final String id; private EnumNameTagVisibility nameTagVisibility = EnumNameTagVisibility.a; private Player papiSubject = null; - private final LinkedList placeholders; + private final Collection placeholders; + public PlayerListImpl(@NotNull WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PushingRule pushingRule, NameTagVisibility nameTagVisibility, - @org.jetbrains.annotations.Nullable LinkedList placeholders) { + @org.jetbrains.annotations.Nullable Collection placeholders) { super(null, identifier); this.suffix = suffix; this.prefix = prefix; @@ -61,24 +63,7 @@ public String b() { @Override public IChatBaseComponent e() { - String t = prefix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 32) { - t = t.substring(0, 32); - } - return IChatBaseComponent.b(t); + return prefixComp; } @Override @@ -87,25 +72,7 @@ public void c(@Nullable IChatBaseComponent var0) { @Override public IChatBaseComponent f() { - String t = suffix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 32) { - t = t.substring(0, 32); - } - return IChatBaseComponent.b(t); + return suffixComp; } @Override @@ -149,7 +116,7 @@ public void remove(@NotNull Player player) { } @Override - public void sendUserCreateToReceivers(Player player) { + public void sendUserCreateToReceivers(@NotNull Player player) { // send 3: add entities to team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.a @@ -168,6 +135,20 @@ public void sendRemoveToReceivers() { sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().b.a(packetPlayOutScoreboardTeam)); } + @Override + public boolean refreshContent() { + String newPrefix = prefix.getTrimReplacePlaceholders(getSubject(), 32, this.placeholders); + String newSuffix = suffix.getTrimReplacePlaceholders(getSubject(), 32, this.placeholders); + + if (newPrefix.equals(prefixComp.getString()) && newSuffix.equals(suffixComp.getString())) { + return false; + } + + this.prefixComp = IChatBaseComponent.b(newPrefix); + this.suffixComp = IChatBaseComponent.b(newSuffix); + return true; + } + @Override public String getIdentifier() { return id; @@ -204,7 +185,7 @@ public void setNameTagVisibility(@NotNull NameTagVisibility nameTagVisibility) { case HIDE_FOR_OTHER_TEAMS -> this.nameTagVisibility = EnumNameTagVisibility.c; case HIDE_FOR_OWN_TEAM -> this.nameTagVisibility = EnumNameTagVisibility.d; } - if (null != id){ + if (null != id) { sendUpdateToReceivers(); } } diff --git a/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/ProviderImpl.java b/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/ProviderImpl.java index 61fde22..b6d3e0e 100644 --- a/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/ProviderImpl.java +++ b/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/ProviderImpl.java @@ -15,6 +15,7 @@ import java.util.Collection; import java.util.LinkedList; +import java.util.concurrent.ConcurrentLinkedQueue; @SuppressWarnings("unused") public class ProviderImpl extends SidebarProvider { @@ -50,7 +51,7 @@ public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int sc @Override public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility tagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, tagVisibility, placeholders); } diff --git a/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java b/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java index 683d93d..4ab180a 100644 --- a/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java +++ b/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java @@ -40,20 +40,18 @@ public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreb protected class NarniaSidebarObjective extends ScoreboardObjective implements SidebarObjective { private SidebarLine displayName; + private IChatMutableComponent displayNameComp; private final int type; public NarniaSidebarObjective(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { super(null, name, criteria, IChatBaseComponent.b(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a); this.displayName = displayName; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); this.type = type; } @Override public void setTitle(SidebarLine title) { this.displayName = title; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); - this.sendUpdate(); } @Override @@ -77,13 +75,23 @@ public String getName() { } @Override - public IChatBaseComponent d() { - String t = parsePlaceholders(displayName); + public boolean refreshTitle() { + String newTitle = displayName.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + 32, + getPlaceholders() + ); - if (t.length() > 32) { - t = t.substring(0, 32); + if (newTitle.equals(this.displayNameComp.getString())) { + return false; } - return IChatBaseComponent.b(t); + this.displayNameComp = IChatBaseComponent.d(newTitle); + return true; + } + + @Override + public IChatBaseComponent d() { + return displayNameComp; } @Override @@ -92,7 +100,7 @@ public void a(IChatBaseComponent var0) { @Override public IChatBaseComponent e() { - return IChatBaseComponent.b((this.d().toString())); + return d(); } @@ -126,7 +134,7 @@ public void sendRemove(@NotNull PlayerConnection playerConnection) { public class NarniaScoreLine extends ScoreboardScore implements ScoreLine, Comparable { private int score; - private String prefix = " ", suffix = ""; + private IChatMutableComponent prefix = IChatBaseComponent.b(""), suffix = IChatBaseComponent.b(""); private final TeamLine team; private SidebarLine text; @@ -135,12 +143,6 @@ public NarniaScoreLine(@NotNull SidebarLine text, int score, @NotNull String col this.score = score; this.text = text; this.team = new TeamLine(color); - - - SidebarLine.markHasPlaceholders(text, getPlaceholders()); - - //noinspection ResultOfMethodCallIgnored - setContent(parsePlaceholders(text)); } @Override @@ -210,35 +212,37 @@ public void sendUpdate(Player player) { } @Contract(pure = true) - public boolean setContent(@NotNull String content) { - if (!getReceivers().isEmpty()) { - content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getReceivers().get(0), content); - } + public boolean setContent(@NotNull SidebarLine line) { + String content = line.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + ); var oldPrefix = this.prefix; var oldSuffix = this.suffix; if (content.length() > 16) { - this.prefix = content.substring(0, 16); - if (this.prefix.charAt(15) == ChatColor.COLOR_CHAR) { - this.prefix = content.substring(0, 15); + this.prefix = IChatBaseComponent.b(content.substring(0, 16)); + if (this.prefix.getString().charAt(15) == ChatColor.COLOR_CHAR) { + this.prefix = IChatBaseComponent.b(content.substring(0, 15)); setSuffix(content.substring(15)); } else { setSuffix(content.substring(16)); } } else { - this.prefix = content; - this.suffix = ""; + this.prefix = IChatBaseComponent.b(content); + this.suffix = IChatBaseComponent.b(""); } return !oldPrefix.equals(this.prefix) || !oldSuffix.equals(this.suffix); } public void setSuffix(@NotNull String secondPart) { if (secondPart.isEmpty()) { - this.suffix = ""; + this.suffix = IChatBaseComponent.b(""); return; } - secondPart = org.bukkit.ChatColor.getLastColors(this.prefix) + secondPart; - this.suffix = secondPart.length() > 16 ? secondPart.substring(0, 16) : secondPart; + secondPart = org.bukkit.ChatColor.getLastColors(this.prefix.getString()) + secondPart; + this.suffix = IChatBaseComponent.b(secondPart.length() > 16 ? secondPart.substring(0, 16) : secondPart); } public void sendUpdateToAllReceivers() { @@ -279,6 +283,11 @@ public String getColor() { return team.b().charAt(0) == ChatColor.COLOR_CHAR ? team.b() : ChatColor.COLOR_CHAR + team.b(); } + @Override + public boolean refreshContent() { + return setContent(getLine()); + } + private class TeamLine extends ScoreboardTeam { public TeamLine(String color) { @@ -288,7 +297,7 @@ public TeamLine(String color) { @Override public IChatBaseComponent e() { - return IChatBaseComponent.b(prefix); + return prefix; } @Override @@ -301,7 +310,7 @@ public void c(@Nullable IChatBaseComponent var0) { @Override public IChatBaseComponent f() { - return IChatBaseComponent.b(suffix); + return suffix; } @Override @@ -324,9 +333,10 @@ public void a(EnumTeamPush var0) { public void a(EnumChatFormat var0) { } + @Contract("_ -> new") @Override - public IChatMutableComponent d(IChatBaseComponent var0) { - return IChatBaseComponent.b(prefix + var0 + suffix); + public @NotNull IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(prefix.getString() + var0 + suffix.getString()); } } } diff --git a/sidebar-v1_19_R3/pom.xml b/sidebar-v1_19_R3/pom.xml index 58c1bb2..a436ee5 100644 --- a/sidebar-v1_19_R3/pom.xml +++ b/sidebar-v1_19_R3/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 23.10.1-SNAPSHOT + 23.10.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/PlayerListImpl.java b/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/PlayerListImpl.java index 113dd39..5357ae7 100644 --- a/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/PlayerListImpl.java +++ b/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/PlayerListImpl.java @@ -5,27 +5,29 @@ import net.minecraft.network.chat.IChatMutableComponent; import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; import net.minecraft.world.scores.ScoreboardTeam; -import net.md_5.bungee.api.ChatColor; import org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.LinkedList; +import java.util.Collection; public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { private EnumTeamPush pushingRule; private final SidebarLine prefix; + private IChatMutableComponent prefixComp = IChatBaseComponent.b(""); private final SidebarLine suffix; + private IChatMutableComponent suffixComp = IChatBaseComponent.b(""); private final WrappedSidebar sidebar; private final String id; private EnumNameTagVisibility nameTagVisibility = EnumNameTagVisibility.a; private Player papiSubject = null; - private final LinkedList placeholders; + private final Collection placeholders; + public PlayerListImpl(@NotNull WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PushingRule pushingRule, NameTagVisibility nameTagVisibility, - @org.jetbrains.annotations.Nullable LinkedList placeholders) { + @org.jetbrains.annotations.Nullable Collection placeholders) { super(null, identifier); this.suffix = suffix; this.prefix = prefix; @@ -52,7 +54,7 @@ public IChatMutableComponent d() { @Override public IChatMutableComponent d(IChatBaseComponent var0) { - return IChatBaseComponent.b(prefix.getLine() + var0 + suffix.getLine()); + return IChatBaseComponent.b(prefixComp.getString() + var0 + suffixComp.getString()); } public String b() { @@ -61,24 +63,7 @@ public String b() { @Override public IChatBaseComponent e() { - String t = prefix.getLine(); - if (null != placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 32) { - t = t.substring(0, 32); - } - return IChatBaseComponent.b(t); + return prefixComp; } @Override @@ -87,25 +72,7 @@ public void c(@Nullable IChatBaseComponent var0) { @Override public IChatBaseComponent f() { - String t = suffix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 32) { - t = t.substring(0, 32); - } - return IChatBaseComponent.b(t); + return suffixComp; } @Override @@ -149,7 +116,7 @@ public void remove(@NotNull Player player) { } @Override - public void sendUserCreateToReceivers(Player player) { + public void sendUserCreateToReceivers(@NotNull Player player) { // send 3: add entities to team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.a @@ -168,6 +135,20 @@ public void sendRemoveToReceivers() { sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().b.a(packetPlayOutScoreboardTeam)); } + @Override + public boolean refreshContent() { + var newPrefix = prefix.getTrimReplacePlaceholders(getSubject(), 32, this.placeholders); + var newSuffix = suffix.getTrimReplacePlaceholders(getSubject(), 32, this.placeholders); + + if (newPrefix.equals(prefixComp.getString()) && newSuffix.equals(suffixComp.getString())) { + return false; + } + + this.prefixComp = IChatBaseComponent.b(newPrefix); + this.suffixComp = IChatBaseComponent.b(newSuffix); + return true; + } + @Override public String getIdentifier() { return id; @@ -204,7 +185,7 @@ public void setNameTagVisibility(@NotNull NameTagVisibility nameTagVisibility) { case HIDE_FOR_OTHER_TEAMS -> this.nameTagVisibility = EnumNameTagVisibility.c; case HIDE_FOR_OWN_TEAM -> this.nameTagVisibility = EnumNameTagVisibility.d; } - if (null != id){ + if (null != id) { sendUpdateToReceivers(); } } diff --git a/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/ProviderImpl.java b/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/ProviderImpl.java index 6a6c07f..63c7f97 100644 --- a/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/ProviderImpl.java +++ b/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/ProviderImpl.java @@ -15,6 +15,7 @@ import java.util.Collection; import java.util.LinkedList; +import java.util.concurrent.ConcurrentLinkedQueue; @SuppressWarnings("unused") public class ProviderImpl extends SidebarProvider { @@ -50,7 +51,7 @@ public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int sc @Override public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility tagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, tagVisibility, placeholders); } diff --git a/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java b/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java index 6b26a1d..6d15aa8 100644 --- a/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java +++ b/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java @@ -40,20 +40,18 @@ public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreb protected class NarniaSidebarObjective extends ScoreboardObjective implements SidebarObjective { private SidebarLine displayName; + private IChatMutableComponent displayNameComp = IChatBaseComponent.b(""); private final int type; public NarniaSidebarObjective(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { super(null, name, criteria, IChatBaseComponent.b(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a); this.displayName = displayName; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); this.type = type; } @Override public void setTitle(SidebarLine title) { this.displayName = title; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); - this.sendUpdate(); } @Override @@ -77,13 +75,23 @@ public String getName() { } @Override - public IChatBaseComponent d() { - String t = parsePlaceholders(displayName); + public boolean refreshTitle() { + var newTitle = displayName.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + 32, + getPlaceholders() + ); - if (t.length() > 32) { - t = t.substring(0, 32); + if (newTitle.equals(displayNameComp.getString())) { + return false; } - return IChatBaseComponent.b(t); + this.displayNameComp = IChatBaseComponent.b(newTitle); + return true; + } + + @Override + public IChatBaseComponent d() { + return displayNameComp; } @Override @@ -92,7 +100,7 @@ public void a(IChatBaseComponent var0) { @Override public IChatBaseComponent e() { - return IChatBaseComponent.b((this.d().toString())); + return d(); } @@ -126,7 +134,7 @@ public void sendRemove(@NotNull PlayerConnection playerConnection) { public class NarniaScoreLine extends ScoreboardScore implements ScoreLine, Comparable { private int score; - private String prefix = " ", suffix = ""; + private IChatMutableComponent prefix = IChatBaseComponent.b(""), suffix = IChatBaseComponent.b(""); private final TeamLine team; private SidebarLine text; @@ -135,12 +143,6 @@ public NarniaScoreLine(@NotNull SidebarLine text, int score, @NotNull String col this.score = score; this.text = text; this.team = new TeamLine(color); - - - SidebarLine.markHasPlaceholders(text, getPlaceholders()); - - //noinspection ResultOfMethodCallIgnored - setContent(parsePlaceholders(text)); } @Override @@ -210,35 +212,37 @@ public void sendUpdate(Player player) { } @Contract(pure = true) - public boolean setContent(@NotNull String content) { - if (!getReceivers().isEmpty()) { - content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getReceivers().get(0), content); - } + public boolean setContent(@NotNull SidebarLine line) { + String content = line.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + ); var oldPrefix = this.prefix; var oldSuffix = this.suffix; if (content.length() > 16) { - this.prefix = content.substring(0, 16); - if (this.prefix.charAt(15) == ChatColor.COLOR_CHAR) { - this.prefix = content.substring(0, 15); + this.prefix = IChatBaseComponent.b(content.substring(0, 16)); + if (this.prefix.getString().charAt(15) == ChatColor.COLOR_CHAR) { + this.prefix = IChatBaseComponent.b(content.substring(0, 15)); setSuffix(content.substring(15)); } else { setSuffix(content.substring(16)); } } else { - this.prefix = content; - this.suffix = ""; + this.prefix = IChatBaseComponent.b(content); + this.suffix = IChatBaseComponent.b(""); } return !oldPrefix.equals(this.prefix) || !oldSuffix.equals(this.suffix); } public void setSuffix(@NotNull String secondPart) { if (secondPart.isEmpty()) { - this.suffix = ""; + this.suffix = IChatBaseComponent.b(""); return; } - secondPart = org.bukkit.ChatColor.getLastColors(this.prefix) + secondPart; - this.suffix = secondPart.length() > 16 ? secondPart.substring(0, 16) : secondPart; + secondPart = org.bukkit.ChatColor.getLastColors(this.prefix.getString()) + secondPart; + this.suffix = IChatBaseComponent.b(secondPart.length() > 16 ? secondPart.substring(0, 16) : secondPart); } public void sendUpdateToAllReceivers() { @@ -279,6 +283,11 @@ public String getColor() { return team.b().charAt(0) == ChatColor.COLOR_CHAR ? team.b() : ChatColor.COLOR_CHAR + team.b(); } + @Override + public boolean refreshContent() { + return setContent(getLine()); + } + private class TeamLine extends ScoreboardTeam { public TeamLine(String color) { @@ -286,9 +295,10 @@ public TeamLine(String color) { g().add(color); } + @Contract(value = " -> new", pure = true) @Override - public IChatBaseComponent e() { - return IChatBaseComponent.b(prefix); + public @NotNull IChatBaseComponent e() { + return prefix; } @Override @@ -299,9 +309,10 @@ public void b(@Nullable IChatBaseComponent var0) { public void c(@Nullable IChatBaseComponent var0) { } + @Contract(value = " -> new", pure = true) @Override - public IChatBaseComponent f() { - return IChatBaseComponent.b(suffix); + public @NotNull IChatBaseComponent f() { + return suffix; } @Override @@ -324,9 +335,10 @@ public void a(EnumTeamPush var0) { public void a(EnumChatFormat var0) { } + @Contract(value = "_ -> new", pure = true) @Override - public IChatMutableComponent d(IChatBaseComponent var0) { - return IChatBaseComponent.b(prefix + var0 + suffix); + public @NotNull IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(prefix.getString() + var0 + suffix.getString()); } } } diff --git a/sidebar-v1_20_R1/pom.xml b/sidebar-v1_20_R1/pom.xml index 4e93532..6b7546e 100644 --- a/sidebar-v1_20_R1/pom.xml +++ b/sidebar-v1_20_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 23.10.1-SNAPSHOT + 23.10.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/PlayerListImpl.java b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/PlayerListImpl.java index 36e2bd0..edce4aa 100644 --- a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/PlayerListImpl.java +++ b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/PlayerListImpl.java @@ -5,24 +5,25 @@ import net.minecraft.network.chat.IChatMutableComponent; import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; import net.minecraft.world.scores.ScoreboardTeam; -import net.md_5.bungee.api.ChatColor; import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -import java.util.LinkedList; +import java.util.Collection; public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { private EnumTeamPush pushingRule; private final SidebarLine prefix; + private IChatMutableComponent prefixComp = IChatBaseComponent.b(""); private final SidebarLine suffix; + private IChatMutableComponent suffixComp = IChatBaseComponent.b(""); private final WrappedSidebar sidebar; private final String id; private EnumNameTagVisibility nameTagVisibility = EnumNameTagVisibility.a; private Player papiSubject = null; - private final LinkedList placeholders; + private final Collection placeholders; public PlayerListImpl( @NotNull WrappedSidebar sidebar, @@ -31,7 +32,7 @@ public PlayerListImpl( SidebarLine suffix, PushingRule pushingRule, NameTagVisibility nameTagVisibility, - @Nullable LinkedList placeholders + @Nullable Collection placeholders ) { super(null, identifier); this.suffix = suffix; @@ -59,7 +60,7 @@ public IChatMutableComponent d() { @Override public IChatMutableComponent d(IChatBaseComponent var0) { - return IChatBaseComponent.b(prefix.getLine() + var0 + suffix.getLine()); + return IChatBaseComponent.b(prefixComp.getString() + var0 + suffixComp.getString()); } public String b() { @@ -68,24 +69,7 @@ public String b() { @Override public IChatBaseComponent e() { - String t = prefix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 256) { - t = t.substring(0, 256); - } - return IChatBaseComponent.b(t); + return prefixComp; } @Override @@ -94,25 +78,7 @@ public void c(@Nullable IChatBaseComponent var0) { @Override public IChatBaseComponent f() { - String t = suffix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 256) { - t = t.substring(0, 256); - } - return IChatBaseComponent.b(t); + return suffixComp; } @Override @@ -156,7 +122,7 @@ public void remove(@NotNull Player player) { } @Override - public void sendUserCreateToReceivers(Player player) { + public void sendUserCreateToReceivers(@NotNull Player player) { // send 3: add entities to team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( this, player.getName(), PacketPlayOutScoreboardTeam.a.a @@ -175,6 +141,20 @@ public void sendRemoveToReceivers() { sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); } + @Override + public boolean refreshContent() { + var newPrefix = prefix.getTrimReplacePlaceholders(getSubject(), 256, this.placeholders); + var newSuffix = suffix.getTrimReplacePlaceholders(getSubject(), 256, this.placeholders); + + if (newPrefix.equals(prefixComp.getString()) && newSuffix.equals(suffixComp.getString())) { + return false; + } + + this.prefixComp = IChatBaseComponent.b(newPrefix); + this.suffixComp = IChatBaseComponent.b(newSuffix); + return true; + } + @Override public String getIdentifier() { return id; diff --git a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/ProviderImpl.java b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/ProviderImpl.java index f6ec22b..bcae236 100644 --- a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/ProviderImpl.java +++ b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/ProviderImpl.java @@ -15,6 +15,7 @@ import java.util.Collection; import java.util.LinkedList; +import java.util.concurrent.ConcurrentLinkedQueue; @SuppressWarnings("unused") public class ProviderImpl extends SidebarProvider { @@ -50,7 +51,7 @@ public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int sc @Override public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility tagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, tagVisibility, placeholders); } diff --git a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java index 88eba6c..66ca114 100644 --- a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java +++ b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java @@ -40,20 +40,18 @@ public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreb protected class NarniaSidebarObjective extends ScoreboardObjective implements SidebarObjective { private SidebarLine displayName; + private IChatMutableComponent displayNameComp = IChatBaseComponent.b(""); private final int type; public NarniaSidebarObjective(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { super(null, name, criteria, IChatBaseComponent.b(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a); this.displayName = displayName; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); this.type = type; } @Override public void setTitle(SidebarLine title) { this.displayName = title; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); - this.sendUpdate(); } @Override @@ -77,13 +75,23 @@ public String getName() { } @Override - public IChatBaseComponent d() { - String t = parsePlaceholders(displayName); + public boolean refreshTitle() { + var newTitle = displayName.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + 256, + getPlaceholders() + ); - if (t.length() > 256) { - t = t.substring(0, 256); + if (newTitle.equals(displayNameComp.getString())) { + return false; } - return IChatBaseComponent.b(t); + this.displayNameComp = IChatBaseComponent.b(newTitle); + return true; + } + + @Override + public IChatBaseComponent d() { + return displayNameComp; } @Override @@ -126,7 +134,7 @@ public void sendRemove(@NotNull PlayerConnection playerConnection) { public class NarniaScoreLine extends ScoreboardScore implements ScoreLine, Comparable { private int score; - private String prefix = " ", suffix = ""; + private IChatMutableComponent prefix = IChatBaseComponent.b(""), suffix = IChatBaseComponent.b(""); private final TeamLine team; private SidebarLine text; @@ -135,11 +143,6 @@ public NarniaScoreLine(@NotNull SidebarLine text, int score, @NotNull String col this.score = score; this.text = text; this.team = new TeamLine(color); - - SidebarLine.markHasPlaceholders(text, getPlaceholders()); - - //noinspection ResultOfMethodCallIgnored - setContent(parsePlaceholders(text)); } @Override @@ -209,32 +212,37 @@ public void sendUpdate(Player player) { } @Contract(pure = true) - public boolean setContent(@NotNull String content) { + public boolean setContent(@NotNull SidebarLine line) { var oldPrefix = this.prefix; var oldSuffix = this.suffix; + String content = line.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + ); if (content.length() > 256) { - this.prefix = content.substring(0, 256); - if (this.prefix.charAt(255) == ChatColor.COLOR_CHAR) { - this.prefix = content.substring(0, 255); + this.prefix = IChatBaseComponent.b(content.substring(0, 256)); + if (this.prefix.getString().charAt(255) == ChatColor.COLOR_CHAR) { + this.prefix = IChatBaseComponent.b(content.substring(0, 255)); setSuffix(content.substring(255)); } else { setSuffix(content.substring(256)); } } else { - this.prefix = content; - this.suffix = ""; + this.prefix = IChatBaseComponent.b(content); + this.suffix = IChatBaseComponent.b(""); } return !oldPrefix.equals(this.prefix) || !oldSuffix.equals(this.suffix); } public void setSuffix(@NotNull String secondPart) { if (secondPart.isEmpty()) { - this.suffix = ""; + this.suffix = IChatBaseComponent.b(""); return; } - secondPart = org.bukkit.ChatColor.getLastColors(this.prefix) + secondPart; - this.suffix = secondPart.length() > 256 ? secondPart.substring(0, 256) : secondPart; + secondPart = org.bukkit.ChatColor.getLastColors(this.prefix.getString()) + secondPart; + this.suffix = IChatBaseComponent.b(secondPart.length() > 256 ? secondPart.substring(0, 256) : secondPart); } public void sendUpdateToAllReceivers() { @@ -275,6 +283,11 @@ public String getColor() { return team.b().charAt(0) == ChatColor.COLOR_CHAR ? team.b() : ChatColor.COLOR_CHAR + team.b(); } + @Override + public boolean refreshContent() { + return setContent(getLine()); + } + private class TeamLine extends ScoreboardTeam { public TeamLine(String color) { @@ -282,9 +295,10 @@ public TeamLine(String color) { g().add(color); } + @Contract(value = " -> new", pure = true) @Override - public IChatBaseComponent e() { - return IChatBaseComponent.b(prefix); + public @NotNull IChatBaseComponent e() { + return prefix; } @Override @@ -295,9 +309,10 @@ public void b(@Nullable IChatBaseComponent var0) { public void c(@Nullable IChatBaseComponent var0) { } + @Contract(value = " -> new", pure = true) @Override - public IChatBaseComponent f() { - return IChatBaseComponent.b(suffix); + public @NotNull IChatBaseComponent f() { + return suffix; } @Override @@ -320,9 +335,10 @@ public void a(EnumTeamPush var0) { public void a(EnumChatFormat var0) { } + @Contract(value = "_ -> new", pure = true) @Override - public IChatMutableComponent d(IChatBaseComponent var0) { - return IChatBaseComponent.b(prefix + var0 + suffix); + public @NotNull IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(prefix.getString() + var0 + suffix.getString()); } } } diff --git a/sidebar-v1_8_R3/pom.xml b/sidebar-v1_8_R3/pom.xml index f222dee..b5ba8bc 100644 --- a/sidebar-v1_8_R3/pom.xml +++ b/sidebar-v1_8_R3/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 23.10.1-SNAPSHOT + 23.10.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/PlayerListImpl.java b/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/PlayerListImpl.java index aa4e316..13d0bbc 100644 --- a/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/PlayerListImpl.java +++ b/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/PlayerListImpl.java @@ -1,7 +1,6 @@ package com.andrei1058.spigot.sidebar.v1_8_R3; import com.andrei1058.spigot.sidebar.*; -import net.md_5.bungee.api.ChatColor; import net.minecraft.server.v1_8_R3.PacketPlayOutScoreboardTeam; import net.minecraft.server.v1_8_R3.ScoreboardTeam; import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; @@ -9,22 +8,24 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.Collections; -import java.util.LinkedList; public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { private final SidebarLine prefix; + public String prefixString = ""; private final SidebarLine suffix; + public String suffixString = ""; private final WrappedSidebar sidebar; private final String id; private EnumNameTagVisibility nameTagVisibility; private Player papiSubject = null; - private final LinkedList placeholders; + private final Collection placeholders; public PlayerListImpl(@NotNull WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PushingRule pushingRule, NameTagVisibility nameTagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { super(null, identifier); this.suffix = suffix; this.prefix = prefix; @@ -41,53 +42,17 @@ public void setPrefix(String var0) { @Override public String getFormattedName(String var0) { - return prefix.getLine().concat(var0).concat(suffix.getLine()); + return getPrefix().concat(var0).concat(getSuffix()); } @Override public String getPrefix() { - String t = prefix.getLine(); - - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 16) { - t = t.substring(0, 16); - } - return t; + return prefixString; } @Override public String getSuffix() { - String t = suffix.getLine(); - if (null != this.placeholders) { - for (PlaceholderProvider placeholderProvider : this.placeholders) { - if (t.contains(placeholderProvider.getPlaceholder())) { - t = t.replace(placeholderProvider.getPlaceholder(), placeholderProvider.getReplacement()); - } - } - } - - if (null != getSubject()) { - t = ChatColor.translateAlternateColorCodes('&', - SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getSubject(), t) - ); - } - - if (t.length() > 16) { - t = t.substring(0, 16); - } - return t; + return suffixString; } @Override @@ -142,6 +107,20 @@ public void sendRemoveToReceivers() { sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().playerConnection.sendPacket(packetPlayOutScoreboardTeam)); } + @Override + public boolean refreshContent() { + String newPrefix = prefix.getTrimReplacePlaceholders(getSubject(), 16, this.placeholders); + String newSuffix = suffix.getTrimReplacePlaceholders(getSubject(), 16, this.placeholders); + + if (newPrefix.equals(prefixString) && newSuffix.equals(suffixString)) { + return false; + } + + this.prefixString = newPrefix; + this.suffixString = newSuffix; + return true; + } + @Override public String getIdentifier() { return id; diff --git a/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/ProviderImpl.java b/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/ProviderImpl.java index d1f0191..927d3f7 100644 --- a/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/ProviderImpl.java +++ b/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/ProviderImpl.java @@ -9,7 +9,6 @@ import java.lang.reflect.Field; import java.util.Collection; -import java.util.LinkedList; @SuppressWarnings("unused") public class ProviderImpl extends SidebarProvider { @@ -72,7 +71,7 @@ public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int sc @Override public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility nameTagVisibility, - @Nullable LinkedList placeholders) { + @Nullable Collection placeholders) { return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, nameTagVisibility, placeholders); } diff --git a/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/SidebarImpl.java b/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/SidebarImpl.java index bf722c4..8a6b8ef 100644 --- a/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/SidebarImpl.java +++ b/sidebar-v1_8_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_8_R3/SidebarImpl.java @@ -32,13 +32,14 @@ public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreb protected class NarniaSidebarObjective extends ScoreboardObjective implements SidebarObjective { private SidebarLine displayName; + private String displayNameString = ""; + private final int type; public NarniaSidebarObjective(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { super(null, name, criteria); this.displayName = displayName; this.type = type; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); } @Override @@ -49,8 +50,6 @@ public IScoreboardCriteria.EnumScoreboardHealthDisplay e() { @Override public void setTitle(SidebarLine title) { this.displayName = title; - SidebarLine.markHasPlaceholders(this.displayName, getPlaceholders()); - this.sendUpdate(); } @Override @@ -78,13 +77,24 @@ public void sendRemove(Player player) { } @Override - public String getDisplayName() { - String t = parsePlaceholders(getTitle()); - - if (t.length() > 16) { - t = t.substring(0, 16); + public boolean refreshTitle() { + String newTitleString = getTitle().getTrimReplacePlaceholders( + getReceivers().size() == 1 ? getReceivers().getFirst() : null, + 16, + getPlaceholders() + ); + + if (this.getDisplayName().equals(newTitleString)){ + return false; } - return t; + + this.displayNameString = newTitleString; + return true; + } + + @Override + public String getDisplayName() { + return this.displayNameString; } @@ -103,29 +113,23 @@ public class BucharestScoreLine extends ScoreboardScore implements ScoreLine, Co private int score; private String prefix = " ", suffix = ""; private final TeamLine team; - private SidebarLine text; + private SidebarLine content; public BucharestScoreLine(@NotNull SidebarLine text, int score, @NotNull String color) { super(null, (ScoreboardObjective) getSidebarObjective(), color); this.score = score; - this.text = text; + this.content = text; this.team = new TeamLine(color); - - - SidebarLine.markHasPlaceholders(text, getPlaceholders()); - - //noinspection ResultOfMethodCallIgnored - setContent(parsePlaceholders(text)); } @Override public SidebarLine getLine() { - return text; + return content; } @Override public void setLine(SidebarLine line) { - this.text = line; + this.content = line; } @Override @@ -179,10 +183,12 @@ public void sendUpdate(Player player) { } @Contract(pure = true) - public boolean setContent(@NotNull String content) { - if (!getReceivers().isEmpty()) { - content = SidebarManager.getInstance().getPapiSupport().replacePlaceholders(getReceivers().get(0), content); - } + public boolean setContent(@NotNull SidebarLine line) { + String content = line.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + ); String oldPrefix = this.prefix; String oldSuffix = this.suffix; if (content.length() > 16) { @@ -246,6 +252,11 @@ public String getColor() { return team.getName().charAt(0) == ChatColor.COLOR_CHAR ? team.getName() : ChatColor.COLOR_CHAR + team.getName(); } + @Override + public boolean refreshContent() { + return setContent(this.getLine()); + } + private class TeamLine extends ScoreboardTeam { public TeamLine(String color) { @@ -284,8 +295,8 @@ public void setNameTagVisibility(EnumNameTagVisibility var0) { } @Override - public String getFormattedName(String var0) { - return prefix.concat(var0).concat(suffix); + public @NotNull String getFormattedName(String var0) { + return getPrefix().concat(var0).concat(getSuffix()); } } } From fb58396743af4f3e6918e4854ee34b199f076f8c Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sat, 28 Oct 2023 13:22:24 +0200 Subject: [PATCH 09/25] clean up --- .../com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java | 5 ----- .../com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java | 5 ----- .../com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java | 5 ----- .../com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java | 5 ----- .../com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java | 5 ----- .../com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java | 5 ----- .../com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java | 5 ----- 7 files changed, 35 deletions(-) diff --git a/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java b/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java index cefbae3..9e2622e 100644 --- a/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java +++ b/sidebar-v1_12_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_12_R1/SidebarImpl.java @@ -56,11 +56,6 @@ public SidebarLine getTitle() { return displayName; } - @Override - public SidebarLine getTitle() { - return displayName; - } - @Override public void sendCreate(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; diff --git a/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java b/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java index 3996b4c..940f81b 100644 --- a/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java +++ b/sidebar-v1_16_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_16_R1/SidebarImpl.java @@ -51,11 +51,6 @@ public SidebarLine getTitle() { return displayName; } - @Override - public SidebarLine getTitle() { - return displayName; - } - @Override public void sendCreate(Player player) { PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().playerConnection; diff --git a/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java b/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java index 176b3aa..98ad1c3 100644 --- a/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java +++ b/sidebar-v1_17_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_17_R1/SidebarImpl.java @@ -64,11 +64,6 @@ public SidebarLine getTitle() { return displayName; } - @Override - public SidebarLine getTitle() { - return displayName; - } - @Override public void sendCreate(Player player) { diff --git a/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java b/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java index c61365d..486f6e9 100644 --- a/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java +++ b/sidebar-v1_18_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_18_R2/SidebarImpl.java @@ -60,11 +60,6 @@ public SidebarLine getTitle() { return displayName; } - @Override - public SidebarLine getTitle() { - return displayName; - } - @Override public void sendCreate(Player player) { this.sendCreate(((CraftPlayer) player).getHandle().b); diff --git a/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java b/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java index f1ce3ee..4ab180a 100644 --- a/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java +++ b/sidebar-v1_19_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R2/SidebarImpl.java @@ -59,11 +59,6 @@ public SidebarLine getTitle() { return displayName; } - @Override - public SidebarLine getTitle() { - return displayName; - } - @Override public void sendCreate(Player player) { this.sendCreate(((CraftPlayer) player).getHandle().b); diff --git a/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java b/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java index b25c4dd..6d15aa8 100644 --- a/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java +++ b/sidebar-v1_19_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_19_R3/SidebarImpl.java @@ -59,11 +59,6 @@ public SidebarLine getTitle() { return displayName; } - @Override - public SidebarLine getTitle() { - return displayName; - } - @Override public void sendCreate(Player player) { this.sendCreate(((CraftPlayer) player).getHandle().b); diff --git a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java index 46d9a3e..66ca114 100644 --- a/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java +++ b/sidebar-v1_20_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R1/SidebarImpl.java @@ -59,11 +59,6 @@ public SidebarLine getTitle() { return displayName; } - @Override - public SidebarLine getTitle() { - return displayName; - } - @Override public void sendCreate(Player player) { this.sendCreate(((CraftPlayer) player).getHandle().c); From 7e659496f95756b3e5ae4a10b567cea4e66ce2f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20Dasc=C4=83lu?= Date: Sat, 28 Oct 2023 20:09:54 +0200 Subject: [PATCH 10/25] clean up (#37) From 2e9384b14000f1245e50fe95eb48712260820f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20Dasc=C4=83lu?= Date: Sat, 28 Oct 2023 20:14:01 +0200 Subject: [PATCH 11/25] Add 1.20 R2 support (#38) * clean up * add 1.20 R2 support --- pom.xml | 3 +- sidebar-v1_20_R2/pom.xml | 55 +++ .../sidebar/v1_20_R2/PlayerListImpl.java | 198 ++++++++++ .../spigot/sidebar/v1_20_R2/ProviderImpl.java | 65 ++++ .../spigot/sidebar/v1_20_R2/SidebarImpl.java | 347 ++++++++++++++++++ 5 files changed, 667 insertions(+), 1 deletion(-) create mode 100644 sidebar-v1_20_R2/pom.xml create mode 100644 sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/PlayerListImpl.java create mode 100644 sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/ProviderImpl.java create mode 100644 sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/SidebarImpl.java diff --git a/pom.xml b/pom.xml index bb45454..df9649d 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,7 @@ 23.10.2-SNAPSHOT sidebar-base + sidebar-v1_20_R2 sidebar-v1_20_R1 sidebar-v1_19_R3 sidebar-v1_19_R2 @@ -31,7 +32,7 @@ org.spigotmc spigot-api - 1.15.2-R0.1-SNAPSHOT + 1.12.2-R0.1-SNAPSHOT provided diff --git a/sidebar-v1_20_R2/pom.xml b/sidebar-v1_20_R2/pom.xml new file mode 100644 index 0000000..e2cc5ad --- /dev/null +++ b/sidebar-v1_20_R2/pom.xml @@ -0,0 +1,55 @@ + + + + sidebar-pom + com.andrei1058.spigot.sidebar + 23.10.2-SNAPSHOT + + 4.0.0 + + sidebar-v1_20_R2 + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 17 + 17 + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + + + + + nms + https://repo.codemc.io/repository/nms/ + + + + + + com.andrei1058.spigot.sidebar + sidebar-base + ${project.version} + provided + + + org.spigotmc + spigot + 1.20.2-R0.1-SNAPSHOT + provided + + + \ No newline at end of file diff --git a/sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/PlayerListImpl.java b/sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/PlayerListImpl.java new file mode 100644 index 0000000..c3a1ba1 --- /dev/null +++ b/sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/PlayerListImpl.java @@ -0,0 +1,198 @@ +package com.andrei1058.spigot.sidebar.v1_20_R2; + +import com.andrei1058.spigot.sidebar.*; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.chat.IChatMutableComponent; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; +import net.minecraft.world.scores.ScoreboardTeam; +import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.Collection; + +public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { + + private EnumTeamPush pushingRule; + private final SidebarLine prefix; + private IChatMutableComponent prefixComp = IChatBaseComponent.b(""); + private final SidebarLine suffix; + private IChatMutableComponent suffixComp = IChatBaseComponent.b(""); + private final WrappedSidebar sidebar; + private final String id; + private EnumNameTagVisibility nameTagVisibility = EnumNameTagVisibility.a; + private Player papiSubject = null; + private final Collection placeholders; + + public PlayerListImpl( + @NotNull WrappedSidebar sidebar, + String identifier, + SidebarLine prefix, + SidebarLine suffix, + PushingRule pushingRule, + NameTagVisibility nameTagVisibility, + @Nullable Collection placeholders + ) { + super(null, identifier); + this.suffix = suffix; + this.prefix = prefix; + this.sidebar = sidebar; + this.setPushingRule(pushingRule); + this.setNameTagVisibility(nameTagVisibility); + this.id = identifier; + this.placeholders = placeholders; + } + + @Override + public void b(@Nullable IChatBaseComponent var0) { + } + + @Override + public EnumTeamPush l() { + return pushingRule; + } + + @Override + public IChatMutableComponent d() { + return IChatBaseComponent.b(id); + } + + @Override + public IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(prefixComp.getString() + var0 + suffixComp.getString()); + } + + public String b() { + return getIdentifier(); + } + + @Override + public IChatBaseComponent e() { + return prefixComp; + } + + @Override + public void c(@Nullable IChatBaseComponent var0) { + } + + @Override + public IChatBaseComponent f() { + return suffixComp; + } + + @Override + public void a(boolean b) { + } + + @Override + public void b(boolean b) { + } + + @Override + public void a(EnumNameTagVisibility enumNameTagVisibility) { + nameTagVisibility = enumNameTagVisibility; + } + + @Override + public EnumNameTagVisibility j() { + return nameTagVisibility; + } + + @Override + public void add(@NotNull Player player) { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), PacketPlayOutScoreboardTeam.a.a + ); + sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); + } + + @Override + public void sendCreateToPlayer(Player player) { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(this, true); + ((CraftPlayer) player).getHandle().c.a(packetPlayOutScoreboardTeam); + } + + public void remove(@NotNull Player player) { + // send 4: remove entities from team + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), PacketPlayOutScoreboardTeam.a.b + ); + sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); + } + + @Override + public void sendUserCreateToReceivers(@NotNull Player player) { + // send 3: add entities to team + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), PacketPlayOutScoreboardTeam.a.a + ); + sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); + } + + public void sendUpdateToReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(this, false); + sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); + } + + @Override + public void sendRemoveToReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(this); + sidebar.getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardTeam)); + } + + @Override + public boolean refreshContent() { + var newPrefix = prefix.getTrimReplacePlaceholders(getSubject(), 256, this.placeholders); + var newSuffix = suffix.getTrimReplacePlaceholders(getSubject(), 256, this.placeholders); + + if (newPrefix.equals(prefixComp.getString()) && newSuffix.equals(suffixComp.getString())) { + return false; + } + + this.prefixComp = IChatBaseComponent.b(newPrefix); + this.suffixComp = IChatBaseComponent.b(newSuffix); + return true; + } + + @Override + public String getIdentifier() { + return id; + } + + @Override + public void setSubject(@Nullable Player papiSubject) { + this.papiSubject = papiSubject; + } + + @Override + public @org.jetbrains.annotations.Nullable Player getSubject() { + return papiSubject; + } + + @Override + public void setPushingRule(@NotNull PushingRule rule) { + switch (rule) { + case NEVER -> this.pushingRule = EnumTeamPush.b; + case ALWAYS -> this.pushingRule = EnumTeamPush.a; + case PUSH_OTHER_TEAMS -> this.pushingRule = EnumTeamPush.c; + case PUSH_OWN_TEAM -> this.pushingRule = EnumTeamPush.d; + } + if (null != this.id) { + sendUpdateToReceivers(); + } + } + + @Override + public void setNameTagVisibility(@NotNull NameTagVisibility nameTagVisibility) { + switch (nameTagVisibility) { + case NEVER -> this.nameTagVisibility = EnumNameTagVisibility.b; + case ALWAYS -> this.nameTagVisibility = EnumNameTagVisibility.a; + case HIDE_FOR_OTHER_TEAMS -> this.nameTagVisibility = EnumNameTagVisibility.c; + case HIDE_FOR_OWN_TEAM -> this.nameTagVisibility = EnumNameTagVisibility.d; + } + if (null != id){ + sendUpdateToReceivers(); + } + } +} diff --git a/sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/ProviderImpl.java b/sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/ProviderImpl.java new file mode 100644 index 0000000..c1485f5 --- /dev/null +++ b/sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/ProviderImpl.java @@ -0,0 +1,65 @@ +package com.andrei1058.spigot.sidebar.v1_20_R2; + +import com.andrei1058.spigot.sidebar.*; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.protocol.game.PacketPlayOutPlayerListHeaderFooter; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardScore; +import net.minecraft.server.ScoreboardServer; +import net.minecraft.server.network.PlayerConnection; +import net.minecraft.world.scores.ScoreboardObjective; +import net.minecraft.world.scores.criteria.IScoreboardCriteria; +import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; + +@SuppressWarnings("unused") +public class ProviderImpl extends SidebarProvider { + + private static SidebarProvider instance; + + @Override + public Sidebar createSidebar(SidebarLine title, Collection lines, Collection placeholderProviders) { + return new SidebarImpl(title, lines, placeholderProviders); + } + + @Override + public SidebarObjective createObjective(@NotNull WrappedSidebar sidebar, String name, boolean health, SidebarLine title, int type) { + return ((SidebarImpl)sidebar).createObjective(name, health ? IScoreboardCriteria.f : IScoreboardCriteria.a, title, type); + } + + @Override + public ScoreLine createScoreLine(WrappedSidebar sidebar, SidebarLine line, int score, String color) { + return ((SidebarImpl)sidebar).createScore(line, score, color); + } + + public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int score) { + if (sidebar.getHealthObjective() == null) return; + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.a, ((ScoreboardObjective)sidebar.getHealthObjective()).b(), playerName, score + ); + for (Player player : sidebar.getReceivers()) { + PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().c; + playerConnection.a(packetPlayOutScoreboardScore); + } + } + + @Override + public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, + PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility tagVisibility, + @Nullable Collection placeholders) { + return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, tagVisibility, placeholders); + } + + @Override + public void sendHeaderFooter(Player player, String header, String footer) { + PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter(IChatBaseComponent.b(header), IChatBaseComponent.b(footer)); + ((CraftPlayer)player).getHandle().c.a(packet); + } + + public static SidebarProvider getInstance() { + return null == instance ? instance = new ProviderImpl() : instance; + } +} diff --git a/sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/SidebarImpl.java b/sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/SidebarImpl.java new file mode 100644 index 0000000..e57f152 --- /dev/null +++ b/sidebar-v1_20_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_20_R2/SidebarImpl.java @@ -0,0 +1,347 @@ +package com.andrei1058.spigot.sidebar.v1_20_R2; + +import com.andrei1058.spigot.sidebar.*; +import net.minecraft.EnumChatFormat; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.chat.IChatMutableComponent; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardDisplayObjective; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardObjective; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardScore; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; +import net.minecraft.server.ScoreboardServer; +import net.minecraft.server.network.PlayerConnection; +import net.minecraft.world.scores.DisplaySlot; +import net.minecraft.world.scores.ScoreboardObjective; +import net.minecraft.world.scores.ScoreboardScore; +import net.minecraft.world.scores.ScoreboardTeam; +import net.minecraft.world.scores.criteria.IScoreboardCriteria; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; + +public class SidebarImpl extends WrappedSidebar { + + public SidebarImpl(@NotNull SidebarLine title, @NotNull Collection lines, Collection placeholderProvider) { + super(title, lines, placeholderProvider); + } + + public ScoreLine createScore(SidebarLine line, int score, String color) { + return new SidebarImpl.NarniaScoreLine(line, score, color); + } + + public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreboardCriteria, SidebarLine title, int type) { + return new NarniaSidebarObjective(name, iScoreboardCriteria, title, type); + } + + protected class NarniaSidebarObjective extends ScoreboardObjective implements SidebarObjective { + + private SidebarLine displayName; + private IChatMutableComponent displayNameComp = IChatBaseComponent.b(""); + private final DisplaySlot type; + + public NarniaSidebarObjective(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { + super(null, name, criteria, IChatBaseComponent.b(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a); + this.displayName = displayName; + this.type = DisplaySlot.values()[type]; + } + + @Override + public void setTitle(SidebarLine title) { + this.displayName = title; + } + + @Override + public SidebarLine getTitle() { + return displayName; + } + + @Override + public void sendCreate(Player player) { + this.sendCreate(((CraftPlayer) player).getHandle().c); + } + + @Override + public void sendRemove(Player player) { + this.sendRemove(((CraftPlayer) player).getHandle().c); + } + + @Override + public String getName() { + return this.b(); + } + + @Override + public boolean refreshTitle() { + var newTitle = displayName.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + 256, + getPlaceholders() + ); + + if (newTitle.equals(displayNameComp.getString())) { + return false; + } + this.displayNameComp = IChatBaseComponent.b(newTitle); + return true; + } + + @Override + public IChatBaseComponent d() { + return displayNameComp; + } + + @Override + public void a(IChatBaseComponent var0) { + } + + @Override + public IChatBaseComponent e() { + return IChatBaseComponent.b((this.d().toString())); + + } + + @Override + public void a(IScoreboardCriteria.EnumScoreboardHealthDisplay var0) { + } + + private void sendCreate(@NotNull PlayerConnection playerConnection) { + var packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 0); + playerConnection.a(packetPlayOutScoreboardObjective); + var packetPlayOutScoreboardDisplayObjective = new PacketPlayOutScoreboardDisplayObjective(type, this); + playerConnection.a(packetPlayOutScoreboardDisplayObjective); + + if (b().equalsIgnoreCase("health")) { + var packetPlayOutScoreboardDisplayObjective2 = new PacketPlayOutScoreboardDisplayObjective(DisplaySlot.a, this); + playerConnection.a(packetPlayOutScoreboardDisplayObjective2); + } + } + + // must be called when updating the name + public void sendUpdate() { + PacketPlayOutScoreboardObjective packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 2); + getReceivers().forEach(player -> ((CraftPlayer) player).getHandle().c.a(packetPlayOutScoreboardObjective)); + } + + public void sendRemove(@NotNull PlayerConnection playerConnection) { + PacketPlayOutScoreboardObjective packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 1); + playerConnection.a(packetPlayOutScoreboardObjective); + } + } + + public class NarniaScoreLine extends ScoreboardScore implements ScoreLine, Comparable { + + private int score; + private IChatMutableComponent prefix = IChatBaseComponent.b(""), suffix = IChatBaseComponent.b(""); + private final TeamLine team; + private SidebarLine text; + + public NarniaScoreLine(@NotNull SidebarLine text, int score, @NotNull String color) { + super(null, (ScoreboardObjective) getSidebarObjective(), color); + this.score = score; + this.text = text; + this.team = new TeamLine(color); + } + + @Override + public SidebarLine getLine() { + return text; + } + + @Override + public void setLine(SidebarLine line) { + this.text = line; + } + + @Override + public int getScoreAmount() { + return score; + } + + @Override + public void setScoreAmount(int score) { + this.b(score); + } + + @Override + public void sendCreateToAllReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team, true); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().c.a(packetPlayOutScoreboardTeam)); + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.a,getSidebarObjective().getName(), this.getColor(), this.getScoreAmount() + ); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().c.a(packetPlayOutScoreboardScore)); + } + + @Override + public void sendCreate(Player player) { + PlayerConnection conn = ((CraftPlayer) player).getHandle().c; + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team, true); + conn.a(packetPlayOutScoreboardTeam); + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.a, getSidebarObjective().getName(), this.getColor(), this.getScoreAmount() + ); + conn.a(packetPlayOutScoreboardScore); + } + + @Override + public void sendRemove(Player player) { + PlayerConnection conn = ((CraftPlayer) player).getHandle().c; + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team); + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.b, getSidebarObjective().getName(), this.getColor(), this.getScoreAmount() + ); + conn.a(packetPlayOutScoreboardTeam); + conn.a(packetPlayOutScoreboardScore); + } + + public void sendRemoveToAllReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().c.a(packetPlayOutScoreboardTeam)); + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.b, getSidebarObjective().getName(), this.getColor(), this.getScoreAmount() + ); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().c.a(packetPlayOutScoreboardScore)); + } + + public void sendUpdate(Player player) { + PacketPlayOutScoreboardTeam packetTeamUpdate = PacketPlayOutScoreboardTeam.a(team, false); + ((CraftPlayer) player).getHandle().c.a(packetTeamUpdate); + } + + @Contract(pure = true) + public boolean setContent(@NotNull SidebarLine line) { + var oldPrefix = this.prefix; + var oldSuffix = this.suffix; + String content = line.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + ); + + if (content.length() > 256) { + this.prefix = IChatBaseComponent.b(content.substring(0, 256)); + if (this.prefix.getString().charAt(255) == ChatColor.COLOR_CHAR) { + this.prefix = IChatBaseComponent.b(content.substring(0, 255)); + setSuffix(content.substring(255)); + } else { + setSuffix(content.substring(256)); + } + } else { + this.prefix = IChatBaseComponent.b(content); + this.suffix = IChatBaseComponent.b(""); + } + return !oldPrefix.equals(this.prefix) || !oldSuffix.equals(this.suffix); + } + + public void setSuffix(@NotNull String secondPart) { + if (secondPart.isEmpty()) { + this.suffix = IChatBaseComponent.b(""); + return; + } + secondPart = org.bukkit.ChatColor.getLastColors(this.prefix.getString()) + secondPart; + this.suffix = IChatBaseComponent.b(secondPart.length() > 256 ? secondPart.substring(0, 256) : secondPart); + } + + public void sendUpdateToAllReceivers() { + PacketPlayOutScoreboardTeam packetTeamUpdate = PacketPlayOutScoreboardTeam.a(team, false); + getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetTeamUpdate)); + } + + public int compareTo(@NotNull ScoreLine o) { + return Integer.compare(score, o.getScoreAmount()); + } + + @Override + public void b(int score) { + this.score = score; + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + ScoreboardServer.Action.a, ((ScoreboardObjective) getSidebarObjective()).b(), e(), score + ); + getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.a(packetPlayOutScoreboardScore)); + } + + @Override + public int b() { + return score; + } + + public void c() { + } + + @Override + public void a(int i) { + } + + @Override + public void a() { + } + + public String getColor() { + return team.b().charAt(0) == ChatColor.COLOR_CHAR ? team.b() : ChatColor.COLOR_CHAR + team.b(); + } + + @Override + public boolean refreshContent() { + return setContent(getLine()); + } + + private class TeamLine extends ScoreboardTeam { + + public TeamLine(String color) { + super(null, color); + g().add(color); + } + + @Contract(value = " -> new", pure = true) + @Override + public @NotNull IChatBaseComponent e() { + return prefix; + } + + @Override + public void b(@Nullable IChatBaseComponent var0) { + } + + @Override + public void c(@Nullable IChatBaseComponent var0) { + } + + @Contract(value = " -> new", pure = true) + @Override + public @NotNull IChatBaseComponent f() { + return suffix; + } + + @Override + public void a(boolean var0) { + } + + @Override + public void b(boolean var0) { + } + + @Override + public void a(EnumNameTagVisibility var0) { + } + + @Override + public void a(EnumTeamPush var0) { + } + + @Override + public void a(EnumChatFormat var0) { + } + + @Contract(value = "_ -> new", pure = true) + @Override + public @NotNull IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(prefix.getString() + var0 + suffix.getString()); + } + } + } +} From 8a909293d63a41b40e7d7e6d78776daf7361b82b Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Mon, 10 Feb 2025 19:32:59 +0100 Subject: [PATCH 12/25] workflow update --- .github/workflows/compile_snapshot.yml | 2 +- .github/workflows/deploy.yml | 2 +- .github/workflows/deploy_snapshot.yml | 2 +- pom.xml | 4 ++++ 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/compile_snapshot.yml b/.github/workflows/compile_snapshot.yml index 541730a..0135b4f 100644 --- a/.github/workflows/compile_snapshot.yml +++ b/.github/workflows/compile_snapshot.yml @@ -19,7 +19,7 @@ jobs: uses: actions/setup-java@v4 with: java-version: '21' - distribution: 'adopt' + distribution: 'temurin' - name: Deploy snapshot with Maven env: MVN_REPO_USER: ${{ secrets.MVN_REPO_USER }} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 8214a94..9130d03 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -16,7 +16,7 @@ jobs: uses: actions/setup-java@v4 with: java-version: '21' - distribution: 'adopt' + distribution: 'temurin' - name: Deploy with Maven env: MVN_REPO_USER: ${{ secrets.MVN_REPO_USER }} diff --git a/.github/workflows/deploy_snapshot.yml b/.github/workflows/deploy_snapshot.yml index 17487bf..2e05684 100644 --- a/.github/workflows/deploy_snapshot.yml +++ b/.github/workflows/deploy_snapshot.yml @@ -17,7 +17,7 @@ jobs: uses: actions/setup-java@v4 with: java-version: '21' - distribution: 'adopt' + distribution: 'temurin' - name: Deploy snapshot with Maven env: MVN_REPO_USER: ${{ secrets.MVN_REPO_USER }} diff --git a/pom.xml b/pom.xml index 9388c5c..82e1df2 100644 --- a/pom.xml +++ b/pom.xml @@ -30,6 +30,10 @@ spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + placeholderapi + https://repo.extendedclip.com/content/repositories/placeholderapi/ + From d9a1d2fb192951c72b91ad92974f8c87c3833f3a Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Mon, 10 Feb 2025 19:59:12 +0100 Subject: [PATCH 13/25] papi version update --- sidebar-base/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sidebar-base/pom.xml b/sidebar-base/pom.xml index 2506779..2836c6d 100644 --- a/sidebar-base/pom.xml +++ b/sidebar-base/pom.xml @@ -27,7 +27,7 @@ me.clip placeholderapi - 2.11.3 + 2.11.6 provided From 87ee90a0a84083935f67c68ef1918378820f4bf2 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Mon, 10 Feb 2025 20:19:26 +0100 Subject: [PATCH 14/25] skip docs --- sidebar-cmn1/pom.xml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/sidebar-cmn1/pom.xml b/sidebar-cmn1/pom.xml index b5d6f5f..2d1796f 100644 --- a/sidebar-cmn1/pom.xml +++ b/sidebar-cmn1/pom.xml @@ -40,4 +40,24 @@ provided + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 20 + 20 + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + \ No newline at end of file From f068373ccdd202aaad64fa69e39cdd592ccf0777 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Mon, 10 Feb 2025 20:50:11 +0100 Subject: [PATCH 15/25] version update --- pom.xml | 2 +- sidebar-base/pom.xml | 2 +- sidebar-cmn1/pom.xml | 2 +- sidebar-v1_12_R1/pom.xml | 2 +- sidebar-v1_16_R3/pom.xml | 2 +- sidebar-v1_17_R1/pom.xml | 2 +- sidebar-v1_18_R2/pom.xml | 2 +- sidebar-v1_19_R2/pom.xml | 2 +- sidebar-v1_19_R3/pom.xml | 2 +- sidebar-v1_20_R1/pom.xml | 2 +- sidebar-v1_20_R2/pom.xml | 2 +- sidebar-v1_20_R3/pom.xml | 2 +- sidebar-v1_20_R4/pom.xml | 2 +- sidebar-v1_21_R1/pom.xml | 2 +- sidebar-v1_8_R3/pom.xml | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/pom.xml b/pom.xml index 82e1df2..7bc8aa4 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.andrei1058.spigot.sidebar sidebar-pom pom - 25.2 + 25.2.1-SNAPSHOT sidebar-base sidebar-v1_21_R1 diff --git a/sidebar-base/pom.xml b/sidebar-base/pom.xml index 2836c6d..faa2152 100644 --- a/sidebar-base/pom.xml +++ b/sidebar-base/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-cmn1/pom.xml b/sidebar-cmn1/pom.xml index 2d1796f..bf5f25b 100644 --- a/sidebar-cmn1/pom.xml +++ b/sidebar-cmn1/pom.xml @@ -6,7 +6,7 @@ com.andrei1058.spigot.sidebar sidebar-pom - 25.2 + 25.2.1-SNAPSHOT sidebar-cmn1 diff --git a/sidebar-v1_12_R1/pom.xml b/sidebar-v1_12_R1/pom.xml index dfc9a3b..318a733 100644 --- a/sidebar-v1_12_R1/pom.xml +++ b/sidebar-v1_12_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_16_R3/pom.xml b/sidebar-v1_16_R3/pom.xml index 56e973c..5cfa2fc 100644 --- a/sidebar-v1_16_R3/pom.xml +++ b/sidebar-v1_16_R3/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_17_R1/pom.xml b/sidebar-v1_17_R1/pom.xml index 6ebf3e4..f40da2d 100644 --- a/sidebar-v1_17_R1/pom.xml +++ b/sidebar-v1_17_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_18_R2/pom.xml b/sidebar-v1_18_R2/pom.xml index 9d2165d..084f4af 100644 --- a/sidebar-v1_18_R2/pom.xml +++ b/sidebar-v1_18_R2/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_19_R2/pom.xml b/sidebar-v1_19_R2/pom.xml index 266b2c4..f105f7c 100644 --- a/sidebar-v1_19_R2/pom.xml +++ b/sidebar-v1_19_R2/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_19_R3/pom.xml b/sidebar-v1_19_R3/pom.xml index 832fd39..52d1c5e 100644 --- a/sidebar-v1_19_R3/pom.xml +++ b/sidebar-v1_19_R3/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_20_R1/pom.xml b/sidebar-v1_20_R1/pom.xml index fe7688c..1d0de9f 100644 --- a/sidebar-v1_20_R1/pom.xml +++ b/sidebar-v1_20_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_20_R2/pom.xml b/sidebar-v1_20_R2/pom.xml index cbbffe7..fafd146 100644 --- a/sidebar-v1_20_R2/pom.xml +++ b/sidebar-v1_20_R2/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_20_R3/pom.xml b/sidebar-v1_20_R3/pom.xml index 8d5dac1..e3f3d80 100644 --- a/sidebar-v1_20_R3/pom.xml +++ b/sidebar-v1_20_R3/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_20_R4/pom.xml b/sidebar-v1_20_R4/pom.xml index 3407a5d..a8ee94b 100644 --- a/sidebar-v1_20_R4/pom.xml +++ b/sidebar-v1_20_R4/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_21_R1/pom.xml b/sidebar-v1_21_R1/pom.xml index 8ddd317..1aff02b 100644 --- a/sidebar-v1_21_R1/pom.xml +++ b/sidebar-v1_21_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_8_R3/pom.xml b/sidebar-v1_8_R3/pom.xml index f388adc..2b73d21 100644 --- a/sidebar-v1_8_R3/pom.xml +++ b/sidebar-v1_8_R3/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2 + 25.2.1-SNAPSHOT 4.0.0 From f76352527810037ae5c25576cfab5a432d531132 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Mon, 10 Feb 2025 21:06:34 +0100 Subject: [PATCH 16/25] expose --- .../java/com/andrei1058/spigot/sidebar/PAPIAdapter.java | 2 +- .../java/com/andrei1058/spigot/sidebar/SidebarManager.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/PAPIAdapter.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/PAPIAdapter.java index a0e7eda..aedcd08 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/PAPIAdapter.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/PAPIAdapter.java @@ -7,7 +7,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -class PAPIAdapter implements PAPISupport { +public class PAPIAdapter implements PAPISupport { @Override public String replacePlaceholders(Player p, String s) { return PlaceholderAPI.setPlaceholders(p, s); diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarManager.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarManager.java index eca3a30..91f2bfc 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarManager.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/SidebarManager.java @@ -16,7 +16,7 @@ public class SidebarManager { private static SidebarManager instance; - private final SidebarProvider sidebarProvider; + private SidebarProvider sidebarProvider; private PAPISupport papiSupport = new PAPISupport() { @Override public String replacePlaceholders(Player p, String s) { @@ -155,6 +155,10 @@ public SidebarProvider getSidebarProvider() { return sidebarProvider; } + public void setSidebarProvider(SidebarProvider sidebarProvider) { + this.sidebarProvider = sidebarProvider; + } + public static SidebarManager getInstance() { return instance; } From b7029a762edfe33fa737964a33847fb21fdbf6c1 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sun, 23 Feb 2025 21:58:10 +0100 Subject: [PATCH 17/25] version string update --- pom.xml | 40 ++++++++++++++++++++-------------------- sidebar-base/pom.xml | 2 +- sidebar-cmn1/pom.xml | 2 +- sidebar-v1_12_R1/pom.xml | 2 +- sidebar-v1_16_R3/pom.xml | 2 +- sidebar-v1_17_R1/pom.xml | 2 +- sidebar-v1_18_R2/pom.xml | 2 +- sidebar-v1_19_R2/pom.xml | 2 +- sidebar-v1_19_R3/pom.xml | 2 +- sidebar-v1_20_R1/pom.xml | 2 +- sidebar-v1_20_R2/pom.xml | 2 +- sidebar-v1_20_R3/pom.xml | 2 +- sidebar-v1_20_R4/pom.xml | 2 +- sidebar-v1_21_R1/pom.xml | 2 +- sidebar-v1_8_R3/pom.xml | 2 +- 15 files changed, 34 insertions(+), 34 deletions(-) diff --git a/pom.xml b/pom.xml index 7bc8aa4..eec68a9 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.andrei1058.spigot.sidebar sidebar-pom pom - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT sidebar-base sidebar-v1_21_R1 @@ -52,24 +52,24 @@ - - - - org.apache.maven.wagon - wagon-ftp - 3.5.3 - - - + + + + + + + + + - - - ftp-repo - ftp://andrei1058.dev/releases - - - ftp-repo - ftp://andrei1058.dev/snapshots - - + + + + + + + + + + \ No newline at end of file diff --git a/sidebar-base/pom.xml b/sidebar-base/pom.xml index faa2152..35d3b1b 100644 --- a/sidebar-base/pom.xml +++ b/sidebar-base/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-cmn1/pom.xml b/sidebar-cmn1/pom.xml index bf5f25b..3377fab 100644 --- a/sidebar-cmn1/pom.xml +++ b/sidebar-cmn1/pom.xml @@ -6,7 +6,7 @@ com.andrei1058.spigot.sidebar sidebar-pom - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT sidebar-cmn1 diff --git a/sidebar-v1_12_R1/pom.xml b/sidebar-v1_12_R1/pom.xml index 318a733..66f4bf4 100644 --- a/sidebar-v1_12_R1/pom.xml +++ b/sidebar-v1_12_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_16_R3/pom.xml b/sidebar-v1_16_R3/pom.xml index 5cfa2fc..00ddbad 100644 --- a/sidebar-v1_16_R3/pom.xml +++ b/sidebar-v1_16_R3/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_17_R1/pom.xml b/sidebar-v1_17_R1/pom.xml index f40da2d..1f89053 100644 --- a/sidebar-v1_17_R1/pom.xml +++ b/sidebar-v1_17_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_18_R2/pom.xml b/sidebar-v1_18_R2/pom.xml index 084f4af..da71b32 100644 --- a/sidebar-v1_18_R2/pom.xml +++ b/sidebar-v1_18_R2/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_19_R2/pom.xml b/sidebar-v1_19_R2/pom.xml index f105f7c..9f5d9cb 100644 --- a/sidebar-v1_19_R2/pom.xml +++ b/sidebar-v1_19_R2/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_19_R3/pom.xml b/sidebar-v1_19_R3/pom.xml index 52d1c5e..373e756 100644 --- a/sidebar-v1_19_R3/pom.xml +++ b/sidebar-v1_19_R3/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_20_R1/pom.xml b/sidebar-v1_20_R1/pom.xml index 1d0de9f..846b61b 100644 --- a/sidebar-v1_20_R1/pom.xml +++ b/sidebar-v1_20_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_20_R2/pom.xml b/sidebar-v1_20_R2/pom.xml index fafd146..4677e62 100644 --- a/sidebar-v1_20_R2/pom.xml +++ b/sidebar-v1_20_R2/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_20_R3/pom.xml b/sidebar-v1_20_R3/pom.xml index e3f3d80..d18573f 100644 --- a/sidebar-v1_20_R3/pom.xml +++ b/sidebar-v1_20_R3/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_20_R4/pom.xml b/sidebar-v1_20_R4/pom.xml index a8ee94b..cde30c7 100644 --- a/sidebar-v1_20_R4/pom.xml +++ b/sidebar-v1_20_R4/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_21_R1/pom.xml b/sidebar-v1_21_R1/pom.xml index 1aff02b..dd1ddfb 100644 --- a/sidebar-v1_21_R1/pom.xml +++ b/sidebar-v1_21_R1/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 diff --git a/sidebar-v1_8_R3/pom.xml b/sidebar-v1_8_R3/pom.xml index 2b73d21..5a74fbe 100644 --- a/sidebar-v1_8_R3/pom.xml +++ b/sidebar-v1_8_R3/pom.xml @@ -5,7 +5,7 @@ sidebar-pom com.andrei1058.spigot.sidebar - 25.2.1-SNAPSHOT + 25.2.2-SNAPSHOT 4.0.0 From e1eca63db54619651b70a8b50d58163478d14623 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sun, 23 Feb 2025 21:58:34 +0100 Subject: [PATCH 18/25] fix paper support (remapping issue I guess) --- .../main/java/com/andrei1058/spigot/sidebar/PAPIAdapter.java | 3 +++ .../com/andrei1058/spigot/sidebar/v1_21_R1/SidebarImpl.java | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/PAPIAdapter.java b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/PAPIAdapter.java index aedcd08..d3caca8 100644 --- a/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/PAPIAdapter.java +++ b/sidebar-base/src/main/java/com/andrei1058/spigot/sidebar/PAPIAdapter.java @@ -8,6 +8,9 @@ import java.util.regex.Pattern; public class PAPIAdapter implements PAPISupport { + + public PAPIAdapter() {} + @Override public String replacePlaceholders(Player p, String s) { return PlaceholderAPI.setPlaceholders(p, s); diff --git a/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/SidebarImpl.java b/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/SidebarImpl.java index dbc512c..3764ab8 100644 --- a/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/SidebarImpl.java +++ b/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/SidebarImpl.java @@ -42,11 +42,13 @@ protected class SidebarObjectiveImpl extends ScoreboardObjective implements Side private SidebarLine displayName; private IChatMutableComponent displayNameComp = IChatBaseComponent.b(" "); private final DisplaySlot type; + private final String internalName; public SidebarObjectiveImpl(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { super(null, name, criteria, IChatBaseComponent.b(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a, false, null); this.displayName = displayName; this.type = DisplaySlot.values()[type]; + this.internalName = name; } @Override @@ -71,7 +73,7 @@ public void sendRemove(Player player) { @Override public String getName() { - return this.b(); + return internalName; } @Override From 5c0dc9c31db0ae570df3e3b655bc3472bcf92ee4 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Thu, 27 Feb 2025 00:11:17 +0100 Subject: [PATCH 19/25] clean up --- .../spigot/sidebar/v1_21_R1/PlayerListImpl.java | 2 +- .../andrei1058/spigot/sidebar/v1_21_R1/SidebarImpl.java | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/PlayerListImpl.java b/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/PlayerListImpl.java index fed800b..2d67f4b 100644 --- a/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/PlayerListImpl.java +++ b/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/PlayerListImpl.java @@ -65,7 +65,7 @@ public void sendCreateToPlayer(Player player) { public void sendUserCreateToReceivers(@NotNull Player player) { // send 3: add entities to team PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( - this, player.getName(), (PacketPlayOutScoreboardTeam.a) cachedScoreboardActionA); + this, player.getName(), cachedScoreboardActionA); handle.getSidebar().getReceivers().forEach( r -> sendPacket(r, packetPlayOutScoreboardTeam) ); diff --git a/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/SidebarImpl.java b/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/SidebarImpl.java index 3764ab8..4b9dfc3 100644 --- a/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/SidebarImpl.java +++ b/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/SidebarImpl.java @@ -40,15 +40,13 @@ public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreb protected class SidebarObjectiveImpl extends ScoreboardObjective implements SidebarObjective { private SidebarLine displayName; - private IChatMutableComponent displayNameComp = IChatBaseComponent.b(" "); + private IChatMutableComponent displayNameComp = IChatBaseComponent.b(""); private final DisplaySlot type; - private final String internalName; public SidebarObjectiveImpl(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { super(null, name, criteria, IChatBaseComponent.b(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a, false, null); this.displayName = displayName; this.type = DisplaySlot.values()[type]; - this.internalName = name; } @Override @@ -73,7 +71,7 @@ public void sendRemove(Player player) { @Override public String getName() { - return internalName; + return super.b(); } @Override @@ -229,6 +227,7 @@ public void sendCreate(Player player) { @Override public void sendRemove(Player player) { PlayerConnection conn = ((CraftPlayer) player).getHandle().c; + // var1=1 means remove PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team); var resetScore = new ClientboundResetScorePacket(team.b(), getSidebarObjective().getName()); conn.b(resetScore); @@ -243,6 +242,7 @@ public void sendRemoveToAllReceivers() { } public void sendUpdate(Player player) { + // false=2 is for update packet, true=0 for create PacketPlayOutScoreboardTeam packetTeamUpdate = PacketPlayOutScoreboardTeam.a(team, false); ((CraftPlayer) player).getHandle().c.b(packetTeamUpdate); } @@ -282,6 +282,7 @@ public void setSuffix(@NotNull String secondPart) { } public void sendUpdateToAllReceivers() { + // false=2 is for update packet, true=0 for create PacketPlayOutScoreboardTeam packetTeamUpdate = PacketPlayOutScoreboardTeam.a(team, false); getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().c.b(packetTeamUpdate)); } From 4e626144a80fa3c881d23ae5648f211b6baf5596 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sun, 2 Mar 2025 15:23:44 +0100 Subject: [PATCH 20/25] fix tab prefix-suffix --- .../sidebar/v1_21_R1/PlayerListImpl.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/PlayerListImpl.java b/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/PlayerListImpl.java index 2d67f4b..711e5c9 100644 --- a/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/PlayerListImpl.java +++ b/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/PlayerListImpl.java @@ -2,11 +2,16 @@ import com.andrei1058.spigot.sidebar.*; import dev.andrei1058.spigot.sidebar.cmn1.PlayerListImplCmn1; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.chat.IChatMutableComponent; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; import net.minecraft.world.scores.ScoreboardTeam; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer; import org.bukkit.entity.Player; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -150,13 +155,25 @@ private static Object getScoreboardAction(String action) { if (action.equals(name)) { return obj; } - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ex) { - //Bukkit.getConsoleSender().sendMessage(ChatColor.RED+"Could not find ENUM"); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { } } - } catch (Exception exception) { -// exception.printStackTrace(); + } catch (Exception ignored) { } throw new RuntimeException("Something went wrong... please report this to SidebarLib by andrei1058"); } + + public @NotNull IChatBaseComponent e() { + return handle.getPrefixComp(); + } + + public @NotNull IChatBaseComponent f() { + return handle.getSuffixComp(); + } + + @Contract(value = "_ -> new", pure = true) + @Override + public @NotNull IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(handle.getPrefixComp().toString() + var0.getString() + handle.getSuffixComp().toString()); + } } From 9863a9c98b8ed9106b01d176cf9a96124e9d04bd Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sun, 2 Mar 2025 15:27:02 +0100 Subject: [PATCH 21/25] enable distribution management back --- pom.xml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index eec68a9..5358137 100644 --- a/pom.xml +++ b/pom.xml @@ -52,24 +52,24 @@ - - - - - - - - - + + + + org.apache.maven.wagon + wagon-ftp + 3.5.3 + + + - - - - - - - - - - + + + ftp-repo + ftp://andrei1058.dev/releases + + + ftp-repo + ftp://andrei1058.dev/snapshots + + \ No newline at end of file From ce0abfc38e7dfcf7e1d853cc16336a6c42dea61f Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sun, 2 Mar 2025 17:47:48 +0100 Subject: [PATCH 22/25] fix health not getting updated --- .../com/andrei1058/spigot/sidebar/v1_21_R1/ProviderImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/ProviderImpl.java b/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/ProviderImpl.java index 72a05fb..09af5d2 100644 --- a/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/ProviderImpl.java +++ b/sidebar-v1_21_R1/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R1/ProviderImpl.java @@ -37,8 +37,8 @@ public ScoreLine createScoreLine(WrappedSidebar sidebar, SidebarLine line, int s public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int score) { if (sidebar.getHealthObjective() == null) return; PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( - sidebar.getHealthObjective().getName(), playerName, + sidebar.getHealthObjective().getName(), score, Optional.empty(), Optional.empty() From 548531a38316c96fdb09d1e2cc50557659f4e62b Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sun, 2 Mar 2025 20:31:13 +0100 Subject: [PATCH 23/25] add 1.21.3 support --- pom.xml | 1 + sidebar-v1_21_R2/pom.xml | 61 +++ .../sidebar/v1_21_R2/PlayerListImpl.java | 177 +++++++++ .../spigot/sidebar/v1_21_R2/ProviderImpl.java | 66 ++++ .../spigot/sidebar/v1_21_R2/SidebarImpl.java | 362 ++++++++++++++++++ 5 files changed, 667 insertions(+) create mode 100644 sidebar-v1_21_R2/pom.xml create mode 100644 sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/PlayerListImpl.java create mode 100644 sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/ProviderImpl.java create mode 100644 sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/SidebarImpl.java diff --git a/pom.xml b/pom.xml index 5358137..257face 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,7 @@ 25.2.2-SNAPSHOT sidebar-base + sidebar-v1_21_R2 sidebar-v1_21_R1 sidebar-v1_20_R4 sidebar-v1_20_R3 diff --git a/sidebar-v1_21_R2/pom.xml b/sidebar-v1_21_R2/pom.xml new file mode 100644 index 0000000..c86cc31 --- /dev/null +++ b/sidebar-v1_21_R2/pom.xml @@ -0,0 +1,61 @@ + + + + sidebar-pom + com.andrei1058.spigot.sidebar + 25.2.2-SNAPSHOT + + 4.0.0 + + sidebar-v1_21_R2 + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 20 + 20 + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + + + + + nms + https://repo.codemc.io/repository/nms/ + + + + + + com.andrei1058.spigot.sidebar + sidebar-base + ${project.version} + provided + + + org.spigotmc + spigot + 1.21.3-R0.1-SNAPSHOT + provided + + + com.andrei1058.spigot.sidebar + sidebar-cmn1 + ${project.version} + compile + + + \ No newline at end of file diff --git a/sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/PlayerListImpl.java b/sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/PlayerListImpl.java new file mode 100644 index 0000000..889bbd9 --- /dev/null +++ b/sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/PlayerListImpl.java @@ -0,0 +1,177 @@ +package com.andrei1058.spigot.sidebar.v1_21_R2; + +import com.andrei1058.spigot.sidebar.*; +import dev.andrei1058.spigot.sidebar.cmn1.PlayerListImplCmn1; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.chat.IChatMutableComponent; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; +import net.minecraft.world.scores.ScoreboardTeam; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collection; + +@SuppressWarnings("unused") +public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { + + private static PacketPlayOutScoreboardTeam.a cachedScoreboardActionA; + private static PacketPlayOutScoreboardTeam.a cachedScoreboardActionB; + + private final PlayerListImplCmn1 handle; + + public PlayerListImpl( + @NotNull WrappedSidebar sidebar, + String identifier, + SidebarLine prefix, + SidebarLine suffix, + PlayerTab.PushingRule pushingRule, + PlayerTab.NameTagVisibility nameTagVisibility, + @Nullable Collection placeholders + ) { + super(null, identifier); + handle = new PlayerListImplCmn1( + sidebar, + identifier, + prefix, + suffix, + pushingRule, + nameTagVisibility, + placeholders + ); + + if (null == cachedScoreboardActionA) { + cachedScoreboardActionA = (PacketPlayOutScoreboardTeam.a) getScoreboardAction("ADD"); + if (null == cachedScoreboardActionA){ + cachedScoreboardActionA = (PacketPlayOutScoreboardTeam.a) getScoreboardAction("a"); + } + } + if (null == cachedScoreboardActionB) { + cachedScoreboardActionB = (PacketPlayOutScoreboardTeam.a) getScoreboardAction("REMOVE"); + if (null == cachedScoreboardActionB) { + cachedScoreboardActionB = (PacketPlayOutScoreboardTeam.a) getScoreboardAction("b"); + } + } + } + + @Override + public void sendCreateToPlayer(Player player) { + sendPacket(player, PacketPlayOutScoreboardTeam.a(this, true)); + } + + @Override + public void sendUserCreateToReceivers(@NotNull Player player) { + // send 3: add entities to team + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), cachedScoreboardActionA); + handle.getSidebar().getReceivers().forEach( + r -> sendPacket(r, packetPlayOutScoreboardTeam) + ); + } + + @Override + public void sendUpdateToReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(this, false); + handle.getSidebar().getReceivers().forEach(r -> sendPacket(r, packetPlayOutScoreboardTeam)); + } + + @Override + public void sendRemoveToReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(this); + handle.getSidebar().getReceivers().forEach(r -> sendPacket(r, packetPlayOutScoreboardTeam)); + } + + @Override + public boolean refreshContent() { + return handle.refreshContent(); + } + + private void sendPacket(Player player, Packet packet) { + ((CraftPlayer) player).getHandle().f.b(packet); + } + + @Override + public void add(@NotNull Player player) { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), cachedScoreboardActionA + ); + handle.getSidebar().getReceivers().forEach(r -> sendPacket(r, packetPlayOutScoreboardTeam)); + } + + @Override + public void remove(@NotNull Player player) { + // send 4: remove entities from team + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), cachedScoreboardActionB + ); + handle.getSidebar().getReceivers().forEach(r -> sendPacket(r, packetPlayOutScoreboardTeam)); + } + + @Override + public void setSubject(@Nullable Player player) { + this.handle.setPapiSubject(player); + } + + @Override + public @Nullable Player getSubject() { + return this.handle.getPapiSubject(); + } + + @Override + public void setPushingRule(@NotNull PushingRule rule) { + this.handle.setPushingRule(this.handle.toNmsPushing(rule)); + if (null != this.handle.getId()) { + sendUpdateToReceivers(); + } + } + + @Override + public void setNameTagVisibility(@NotNull NameTagVisibility nameTagVisibility) { + this.handle.setNameTagVisibility(this.handle.toNmsTagVisibility(nameTagVisibility)); + if (null != this.handle.getId()){ + sendUpdateToReceivers(); + } + } + + @Override + public String getIdentifier() { + return handle.getId(); + } + + private static Object getScoreboardAction(String action) { + try { + Class cls = Class.forName("net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam$a"); + for (Object obj : cls.getEnumConstants()) { + try { + Method m = cls.getMethod("name"); + String name = (String) m.invoke(obj); + if (action.equals(name)) { + return obj; + } + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { + } + } + } catch (Exception ignored) { + } + throw new RuntimeException("Something went wrong... please report this to SidebarLib by andrei1058"); + } + + public @NotNull IChatBaseComponent e() { + return handle.getPrefixComp(); + } + + public @NotNull IChatBaseComponent f() { + return handle.getSuffixComp(); + } + + @Contract(value = "_ -> new", pure = true) + @Override + public @NotNull IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(handle.getPrefixComp().toString() + var0.getString() + handle.getSuffixComp().toString()); + } +} diff --git a/sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/ProviderImpl.java b/sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/ProviderImpl.java new file mode 100644 index 0000000..840c33d --- /dev/null +++ b/sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/ProviderImpl.java @@ -0,0 +1,66 @@ +package com.andrei1058.spigot.sidebar.v1_21_R2; + +import com.andrei1058.spigot.sidebar.*; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.protocol.game.PacketPlayOutPlayerListHeaderFooter; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardScore; +import net.minecraft.server.network.PlayerConnection; +import net.minecraft.world.scores.criteria.IScoreboardCriteria; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Optional; + +@SuppressWarnings("unused") +public class ProviderImpl extends SidebarProvider { + private static SidebarProvider instance; + + @Override + public Sidebar createSidebar(SidebarLine title, Collection lines, Collection placeholderProviders) { + return new SidebarImpl(title, lines, placeholderProviders); + } + + @Override + public SidebarObjective createObjective(@NotNull WrappedSidebar sidebar, String name, boolean health, SidebarLine title, int type) { + return ((SidebarImpl)sidebar).createObjective(name, health ? IScoreboardCriteria.f : IScoreboardCriteria.b, title, type); + } + + @Override + public ScoreLine createScoreLine(WrappedSidebar sidebar, SidebarLine line, int score, String color) { + return ((SidebarImpl)sidebar).createScore(line, score, color); + } + + @Override + public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int score) { + if (sidebar.getHealthObjective() == null) return; + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + playerName, + sidebar.getHealthObjective().getName(), + score, + Optional.empty(), + Optional.empty() + ); + for (Player player : sidebar.getReceivers()) { + PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().f; + playerConnection.b(packetPlayOutScoreboardScore); + } + } + + @Override + public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility nameTagVisibility, @Nullable Collection placeholders) { + return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, nameTagVisibility, placeholders); + } + + @Override + public void sendHeaderFooter(Player player, String header, String footer) { + PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter(IChatBaseComponent.b(header), IChatBaseComponent.b(footer)); + ((CraftPlayer)player).getHandle().f.b(packet); + } + + public static SidebarProvider getInstance() { + return null == instance ? instance = new ProviderImpl() : instance; + } +} diff --git a/sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/SidebarImpl.java b/sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/SidebarImpl.java new file mode 100644 index 0000000..f804701 --- /dev/null +++ b/sidebar-v1_21_R2/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R2/SidebarImpl.java @@ -0,0 +1,362 @@ +package com.andrei1058.spigot.sidebar.v1_21_R2; + +import com.andrei1058.spigot.sidebar.*; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.EnumChatFormat; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.chat.IChatMutableComponent; +import net.minecraft.network.chat.numbers.FixedFormat; +import net.minecraft.network.protocol.game.*; +import net.minecraft.server.network.PlayerConnection; +import net.minecraft.world.scores.DisplaySlot; +import net.minecraft.world.scores.ScoreboardObjective; +import net.minecraft.world.scores.ScoreboardScore; +import net.minecraft.world.scores.ScoreboardTeam; +import net.minecraft.world.scores.criteria.IScoreboardCriteria; +import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Optional; + +@SuppressWarnings("unused") +public class SidebarImpl extends WrappedSidebar { + + public SidebarImpl(@NotNull SidebarLine title, @NotNull Collection lines, Collection placeholderProvider) { + super(title, lines, placeholderProvider); + } + + public ScoreLine createScore(SidebarLine line, int score, String color) { + return new SidebarImpl.ScoreLineImpl(line, score, color); + } + + public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreboardCriteria, SidebarLine title, int type) { + return new SidebarObjectiveImpl(name, iScoreboardCriteria, title, type); + } + + protected class SidebarObjectiveImpl extends ScoreboardObjective implements SidebarObjective { + + private SidebarLine displayName; + private IChatMutableComponent displayNameComp = IChatBaseComponent.b(""); + private final DisplaySlot type; + + public SidebarObjectiveImpl(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { + super(null, name, criteria, IChatBaseComponent.b(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a, false, null); + this.displayName = displayName; + this.type = DisplaySlot.values()[type]; + } + + @Override + public void setTitle(SidebarLine title) { + this.displayName = title; + } + + @Override + public SidebarLine getTitle() { + return displayName; + } + + @Override + public void sendCreate(Player player) { + this.sendCreate(((CraftPlayer) player).getHandle().f); + } + + @Override + public void sendRemove(Player player) { + this.sendRemove(((CraftPlayer) player).getHandle().f); + } + + @Override + public String getName() { + return super.b(); + } + + @Override + public boolean refreshTitle() { + var newTitle = displayName.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + 256, + getPlaceholders() + ); + + if (newTitle.equals(displayNameComp.getString())) { + return false; + } + this.displayNameComp = IChatBaseComponent.b(newTitle); + return true; + } + + @Override + public IChatBaseComponent d() { + return displayNameComp; + } + + @Override + public void a(IChatBaseComponent var0) { + } + + @Override + public IChatBaseComponent g() { + return IChatBaseComponent.b((this.d().toString())); + + } + + @Override + public void a(IScoreboardCriteria.EnumScoreboardHealthDisplay var0) { + } + + private void sendCreate(@NotNull PlayerConnection playerConnection) { + var packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 0); + playerConnection.b(packetPlayOutScoreboardObjective); + var packetPlayOutScoreboardDisplayObjective = new PacketPlayOutScoreboardDisplayObjective(type, this); + playerConnection.b(packetPlayOutScoreboardDisplayObjective); + + if (b().equalsIgnoreCase("health")) { + var packetPlayOutScoreboardDisplayObjective2 = new PacketPlayOutScoreboardDisplayObjective(DisplaySlot.a, this); + playerConnection.b(packetPlayOutScoreboardDisplayObjective2); + } + } + + // must be called when updating the name + public void sendUpdate() { + PacketPlayOutScoreboardObjective packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 2); + getReceivers().forEach(player -> ((CraftPlayer) player).getHandle().f.b(packetPlayOutScoreboardObjective)); + } + + public void sendRemove(@NotNull PlayerConnection playerConnection) { + PacketPlayOutScoreboardObjective packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 1); + playerConnection.b(packetPlayOutScoreboardObjective); + } + } + + + public class ScoreLineImpl extends ScoreboardScore implements ScoreLine, Comparable { + + private int score; + private IChatMutableComponent prefix = IChatBaseComponent.b(" "), suffix = IChatBaseComponent.b(" "); + private final TeamLine team; + private SidebarLine text; + private final String color; + + public ScoreLineImpl(@NotNull SidebarLine text, int score, @NotNull String color) { +// super(null, (ScoreboardObjective) getSidebarObjective(), color); + this.score = score; + this.text = text; + this.team = new TeamLine(color); + this.color = color; + } + + @Override + public void a(int score) { + this.score = score; + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + getColor(), + getSidebarObjective().getName(), + score, + Optional.empty(), + Optional.of(new FixedFormat(IChatBaseComponent.b(text.getTrimReplacePlaceholdersScore( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + )))) + ); + getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().f.b(packetPlayOutScoreboardScore)); + } + + @Override + public SidebarLine getLine() { + return text; + } + + @Override + public void setLine(SidebarLine line) { + this.text = line; + } + + @Override + public int getScoreAmount() { + return score; + } + + @Override + public void setScoreAmount(int score) { + this.a(score); + } + + @Override + public void sendCreateToAllReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team, true); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().f.b(packetPlayOutScoreboardTeam)); + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + this.getColor(), + getSidebarObjective().getName(), + this.getScoreAmount(), + Optional.empty(), + Optional.of(new FixedFormat(IChatBaseComponent.b(text.getTrimReplacePlaceholdersScore( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + )))) + ); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().f.b(packetPlayOutScoreboardScore)); + } + + @Override + public void sendCreate(Player player) { + PlayerConnection conn = ((CraftPlayer) player).getHandle().f; + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team, true); + conn.b(packetPlayOutScoreboardTeam); + + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + this.getColor(), + getSidebarObjective().getName(), + this.getScoreAmount(), + Optional.empty(), + Optional.of(new FixedFormat(IChatBaseComponent.b(text.getTrimReplacePlaceholdersScore( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + )))) + ); + conn.b(packetPlayOutScoreboardScore); + } + + @Override + public void sendRemove(Player player) { + PlayerConnection conn = ((CraftPlayer) player).getHandle().f; + // var1=1 means remove + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team); + var resetScore = new ClientboundResetScorePacket(team.b(), getSidebarObjective().getName()); + conn.b(resetScore); + conn.b(packetPlayOutScoreboardTeam); + } + + public void sendRemoveToAllReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team); + var resetScore = new ClientboundResetScorePacket(team.b(), getSidebarObjective().getName()); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().f.b(resetScore)); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().f.b(packetPlayOutScoreboardTeam)); + } + + public void sendUpdate(Player player) { + // false=2 is for update packet, true=0 for create + PacketPlayOutScoreboardTeam packetTeamUpdate = PacketPlayOutScoreboardTeam.a(team, false); + ((CraftPlayer) player).getHandle().f.b(packetTeamUpdate); + } + + @Contract(pure = true) + public boolean setContent(@NotNull SidebarLine line) { + var oldPrefix = this.prefix; + var oldSuffix = this.suffix; + String content = line.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + ); + + if (content.length() > 256) { + this.prefix = IChatBaseComponent.b(content.substring(0, 256)); + if (this.prefix.getString().charAt(255) == ChatColor.COLOR_CHAR) { + this.prefix = IChatBaseComponent.b(content.substring(0, 255)); + setSuffix(content.substring(255)); + } else { + setSuffix(content.substring(256)); + } + } else { + this.prefix = IChatBaseComponent.b(content); + this.suffix = IChatBaseComponent.b(""); + } + return !oldPrefix.equals(this.prefix) || !oldSuffix.equals(this.suffix); + } + + public void setSuffix(@NotNull String secondPart) { + if (secondPart.isEmpty()) { + this.suffix = IChatBaseComponent.b(""); + return; + } + secondPart = org.bukkit.ChatColor.getLastColors(this.prefix.getString()) + secondPart; + this.suffix = IChatBaseComponent.b(secondPart.length() > 256 ? secondPart.substring(0, 256) : secondPart); + } + + public void sendUpdateToAllReceivers() { + // false=2 is for update packet, true=0 for create + PacketPlayOutScoreboardTeam packetTeamUpdate = PacketPlayOutScoreboardTeam.a(team, false); + getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().f.b(packetTeamUpdate)); + } + + public int compareTo(@NotNull ScoreLine o) { + return Integer.compare(score, o.getScoreAmount()); + } + + @Override + public int a() { + return score; + } + + public String getColor() { + return color.charAt(0) == ChatColor.COLOR_CHAR ? color : ChatColor.COLOR_CHAR + color; + } + + @Override + public boolean refreshContent() { + return setContent(getLine()); + } + + private class TeamLine extends ScoreboardTeam { + + public TeamLine(String color) { + super(null, color); + g().add(color); + } + + @Contract(value = " -> new", pure = true) + @Override + public @NotNull IChatBaseComponent e() { + return prefix; + } + + @Override + public void b(@Nullable IChatBaseComponent var0) { + } + + @Override + public void c(@Nullable IChatBaseComponent var0) { + } + + @Contract(value = " -> new", pure = true) + @Override + public @NotNull IChatBaseComponent f() { + return suffix; + } + + @Override + public void a(boolean var0) { + } + + @Override + public void b(boolean var0) { + } + + @Override + public void a(EnumNameTagVisibility var0) { + } + + @Override + public void a(EnumTeamPush var0) { + } + + @Override + public void a(EnumChatFormat var0) { + } + + @Contract(value = "_ -> new", pure = true) + @Override + public @NotNull IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(prefix.getString() + var0.getString() + suffix.getString()); + } + } + } +} From 40a5f9d47866589e4dc71c6fa6c07fb250be9cc1 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sun, 2 Mar 2025 20:58:17 +0100 Subject: [PATCH 24/25] add 1.21.4 support --- README.md | 4 +- pom.xml | 1 + sidebar-v1_21_R3/pom.xml | 61 +++ .../sidebar/v1_21_R3/PlayerListImpl.java | 177 +++++++++ .../spigot/sidebar/v1_21_R3/ProviderImpl.java | 66 ++++ .../spigot/sidebar/v1_21_R3/SidebarImpl.java | 362 ++++++++++++++++++ 6 files changed, 670 insertions(+), 1 deletion(-) create mode 100644 sidebar-v1_21_R3/pom.xml create mode 100644 sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/PlayerListImpl.java create mode 100644 sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/ProviderImpl.java create mode 100644 sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/SidebarImpl.java diff --git a/README.md b/README.md index c036fc1..b3843ad 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,9 @@ This project is divided in several modules: - `sidebar-v_1_20_R2` provides support for 1.20.2 (R2) - `sidebar-v_1_20_R3` provides support for 1.20.3 (R3) - `sidebar-v_1_20_R4` provides support for 1.20.4 (R4). Requires `sidebar-v_1_20_R3`. -- `sidebar-v_1_21_R1` provides support for 1.21.1 (R1). Requires `sidebar-cmn1`. +- `sidebar-v_1_21_R1` provides support for 1.21 and 1.21.1 (R1). Requires `sidebar-cmn1`. +- `sidebar-v_1_21_R2` provides support for 1.21.3 (R2). Requires `sidebar-cmn1`. +- `sidebar-v_1_21_R3` provides support for 1.21.4 (R3). Requires `sidebar-cmn1`. ### IMPORTANT It is really important to call Sidebar#remove(player) when a player leaves the server to avoid memory leaks. diff --git a/pom.xml b/pom.xml index 257face..6ed6368 100644 --- a/pom.xml +++ b/pom.xml @@ -10,6 +10,7 @@ 25.2.2-SNAPSHOT sidebar-base + sidebar-v1_21_R3 sidebar-v1_21_R2 sidebar-v1_21_R1 sidebar-v1_20_R4 diff --git a/sidebar-v1_21_R3/pom.xml b/sidebar-v1_21_R3/pom.xml new file mode 100644 index 0000000..31e6fdb --- /dev/null +++ b/sidebar-v1_21_R3/pom.xml @@ -0,0 +1,61 @@ + + + + sidebar-pom + com.andrei1058.spigot.sidebar + 25.2.2-SNAPSHOT + + 4.0.0 + + sidebar-v1_21_R3 + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 20 + 20 + + + + org.apache.maven.plugins + maven-javadoc-plugin + + true + + + + + + + + nms + https://repo.codemc.io/repository/nms/ + + + + + + com.andrei1058.spigot.sidebar + sidebar-base + ${project.version} + provided + + + org.spigotmc + spigot + 1.21.4-R0.1-SNAPSHOT + provided + + + com.andrei1058.spigot.sidebar + sidebar-cmn1 + ${project.version} + compile + + + \ No newline at end of file diff --git a/sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/PlayerListImpl.java b/sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/PlayerListImpl.java new file mode 100644 index 0000000..96b7e3f --- /dev/null +++ b/sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/PlayerListImpl.java @@ -0,0 +1,177 @@ +package com.andrei1058.spigot.sidebar.v1_21_R3; + +import com.andrei1058.spigot.sidebar.*; +import dev.andrei1058.spigot.sidebar.cmn1.PlayerListImplCmn1; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.chat.IChatMutableComponent; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam; +import net.minecraft.world.scores.ScoreboardTeam; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collection; + +@SuppressWarnings("unused") +public class PlayerListImpl extends ScoreboardTeam implements VersionedTabGroup { + + private static PacketPlayOutScoreboardTeam.a cachedScoreboardActionA; + private static PacketPlayOutScoreboardTeam.a cachedScoreboardActionB; + + private final PlayerListImplCmn1 handle; + + public PlayerListImpl( + @NotNull WrappedSidebar sidebar, + String identifier, + SidebarLine prefix, + SidebarLine suffix, + PlayerTab.PushingRule pushingRule, + PlayerTab.NameTagVisibility nameTagVisibility, + @Nullable Collection placeholders + ) { + super(null, identifier); + handle = new PlayerListImplCmn1( + sidebar, + identifier, + prefix, + suffix, + pushingRule, + nameTagVisibility, + placeholders + ); + + if (null == cachedScoreboardActionA) { + cachedScoreboardActionA = (PacketPlayOutScoreboardTeam.a) getScoreboardAction("ADD"); + if (null == cachedScoreboardActionA){ + cachedScoreboardActionA = (PacketPlayOutScoreboardTeam.a) getScoreboardAction("a"); + } + } + if (null == cachedScoreboardActionB) { + cachedScoreboardActionB = (PacketPlayOutScoreboardTeam.a) getScoreboardAction("REMOVE"); + if (null == cachedScoreboardActionB) { + cachedScoreboardActionB = (PacketPlayOutScoreboardTeam.a) getScoreboardAction("b"); + } + } + } + + @Override + public void sendCreateToPlayer(Player player) { + sendPacket(player, PacketPlayOutScoreboardTeam.a(this, true)); + } + + @Override + public void sendUserCreateToReceivers(@NotNull Player player) { + // send 3: add entities to team + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), cachedScoreboardActionA); + handle.getSidebar().getReceivers().forEach( + r -> sendPacket(r, packetPlayOutScoreboardTeam) + ); + } + + @Override + public void sendUpdateToReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(this, false); + handle.getSidebar().getReceivers().forEach(r -> sendPacket(r, packetPlayOutScoreboardTeam)); + } + + @Override + public void sendRemoveToReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(this); + handle.getSidebar().getReceivers().forEach(r -> sendPacket(r, packetPlayOutScoreboardTeam)); + } + + @Override + public boolean refreshContent() { + return handle.refreshContent(); + } + + private void sendPacket(Player player, Packet packet) { + ((CraftPlayer) player).getHandle().f.b(packet); + } + + @Override + public void add(@NotNull Player player) { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), cachedScoreboardActionA + ); + handle.getSidebar().getReceivers().forEach(r -> sendPacket(r, packetPlayOutScoreboardTeam)); + } + + @Override + public void remove(@NotNull Player player) { + // send 4: remove entities from team + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a( + this, player.getName(), cachedScoreboardActionB + ); + handle.getSidebar().getReceivers().forEach(r -> sendPacket(r, packetPlayOutScoreboardTeam)); + } + + @Override + public void setSubject(@Nullable Player player) { + this.handle.setPapiSubject(player); + } + + @Override + public @Nullable Player getSubject() { + return this.handle.getPapiSubject(); + } + + @Override + public void setPushingRule(@NotNull PushingRule rule) { + this.handle.setPushingRule(this.handle.toNmsPushing(rule)); + if (null != this.handle.getId()) { + sendUpdateToReceivers(); + } + } + + @Override + public void setNameTagVisibility(@NotNull NameTagVisibility nameTagVisibility) { + this.handle.setNameTagVisibility(this.handle.toNmsTagVisibility(nameTagVisibility)); + if (null != this.handle.getId()){ + sendUpdateToReceivers(); + } + } + + @Override + public String getIdentifier() { + return handle.getId(); + } + + private static Object getScoreboardAction(String action) { + try { + Class cls = Class.forName("net.minecraft.network.protocol.game.PacketPlayOutScoreboardTeam$a"); + for (Object obj : cls.getEnumConstants()) { + try { + Method m = cls.getMethod("name"); + String name = (String) m.invoke(obj); + if (action.equals(name)) { + return obj; + } + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException ignored) { + } + } + } catch (Exception ignored) { + } + throw new RuntimeException("Something went wrong... please report this to SidebarLib by andrei1058"); + } + + public @NotNull IChatBaseComponent e() { + return handle.getPrefixComp(); + } + + public @NotNull IChatBaseComponent f() { + return handle.getSuffixComp(); + } + + @Contract(value = "_ -> new", pure = true) + @Override + public @NotNull IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(handle.getPrefixComp().toString() + var0.getString() + handle.getSuffixComp().toString()); + } +} diff --git a/sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/ProviderImpl.java b/sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/ProviderImpl.java new file mode 100644 index 0000000..2e3766e --- /dev/null +++ b/sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/ProviderImpl.java @@ -0,0 +1,66 @@ +package com.andrei1058.spigot.sidebar.v1_21_R3; + +import com.andrei1058.spigot.sidebar.*; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.protocol.game.PacketPlayOutPlayerListHeaderFooter; +import net.minecraft.network.protocol.game.PacketPlayOutScoreboardScore; +import net.minecraft.server.network.PlayerConnection; +import net.minecraft.world.scores.criteria.IScoreboardCriteria; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Optional; + +@SuppressWarnings("unused") +public class ProviderImpl extends SidebarProvider { + private static SidebarProvider instance; + + @Override + public Sidebar createSidebar(SidebarLine title, Collection lines, Collection placeholderProviders) { + return new SidebarImpl(title, lines, placeholderProviders); + } + + @Override + public SidebarObjective createObjective(@NotNull WrappedSidebar sidebar, String name, boolean health, SidebarLine title, int type) { + return ((SidebarImpl)sidebar).createObjective(name, health ? IScoreboardCriteria.f : IScoreboardCriteria.b, title, type); + } + + @Override + public ScoreLine createScoreLine(WrappedSidebar sidebar, SidebarLine line, int score, String color) { + return ((SidebarImpl)sidebar).createScore(line, score, color); + } + + @Override + public void sendScore(@NotNull WrappedSidebar sidebar, String playerName, int score) { + if (sidebar.getHealthObjective() == null) return; + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + playerName, + sidebar.getHealthObjective().getName(), + score, + Optional.empty(), + Optional.empty() + ); + for (Player player : sidebar.getReceivers()) { + PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().f; + playerConnection.b(packetPlayOutScoreboardScore); + } + } + + @Override + public VersionedTabGroup createPlayerTab(WrappedSidebar sidebar, String identifier, SidebarLine prefix, SidebarLine suffix, PlayerTab.PushingRule pushingRule, PlayerTab.NameTagVisibility nameTagVisibility, @Nullable Collection placeholders) { + return new PlayerListImpl(sidebar, identifier, prefix, suffix, pushingRule, nameTagVisibility, placeholders); + } + + @Override + public void sendHeaderFooter(Player player, String header, String footer) { + PacketPlayOutPlayerListHeaderFooter packet = new PacketPlayOutPlayerListHeaderFooter(IChatBaseComponent.b(header), IChatBaseComponent.b(footer)); + ((CraftPlayer)player).getHandle().f.b(packet); + } + + public static SidebarProvider getInstance() { + return null == instance ? instance = new ProviderImpl() : instance; + } +} diff --git a/sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/SidebarImpl.java b/sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/SidebarImpl.java new file mode 100644 index 0000000..cd88882 --- /dev/null +++ b/sidebar-v1_21_R3/src/main/java/com/andrei1058/spigot/sidebar/v1_21_R3/SidebarImpl.java @@ -0,0 +1,362 @@ +package com.andrei1058.spigot.sidebar.v1_21_R3; + +import com.andrei1058.spigot.sidebar.*; +import net.md_5.bungee.api.ChatColor; +import net.minecraft.EnumChatFormat; +import net.minecraft.network.chat.IChatBaseComponent; +import net.minecraft.network.chat.IChatMutableComponent; +import net.minecraft.network.chat.numbers.FixedFormat; +import net.minecraft.network.protocol.game.*; +import net.minecraft.server.network.PlayerConnection; +import net.minecraft.world.scores.DisplaySlot; +import net.minecraft.world.scores.ScoreboardObjective; +import net.minecraft.world.scores.ScoreboardScore; +import net.minecraft.world.scores.ScoreboardTeam; +import net.minecraft.world.scores.criteria.IScoreboardCriteria; +import org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.Optional; + +@SuppressWarnings("unused") +public class SidebarImpl extends WrappedSidebar { + + public SidebarImpl(@NotNull SidebarLine title, @NotNull Collection lines, Collection placeholderProvider) { + super(title, lines, placeholderProvider); + } + + public ScoreLine createScore(SidebarLine line, int score, String color) { + return new SidebarImpl.ScoreLineImpl(line, score, color); + } + + public SidebarObjective createObjective(String name, IScoreboardCriteria iScoreboardCriteria, SidebarLine title, int type) { + return new SidebarObjectiveImpl(name, iScoreboardCriteria, title, type); + } + + protected class SidebarObjectiveImpl extends ScoreboardObjective implements SidebarObjective { + + private SidebarLine displayName; + private IChatMutableComponent displayNameComp = IChatBaseComponent.b(""); + private final DisplaySlot type; + + public SidebarObjectiveImpl(String name, IScoreboardCriteria criteria, SidebarLine displayName, int type) { + super(null, name, criteria, IChatBaseComponent.b(name), IScoreboardCriteria.EnumScoreboardHealthDisplay.a, false, null); + this.displayName = displayName; + this.type = DisplaySlot.values()[type]; + } + + @Override + public void setTitle(SidebarLine title) { + this.displayName = title; + } + + @Override + public SidebarLine getTitle() { + return displayName; + } + + @Override + public void sendCreate(Player player) { + this.sendCreate(((CraftPlayer) player).getHandle().f); + } + + @Override + public void sendRemove(Player player) { + this.sendRemove(((CraftPlayer) player).getHandle().f); + } + + @Override + public String getName() { + return super.b(); + } + + @Override + public boolean refreshTitle() { + var newTitle = displayName.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + 256, + getPlaceholders() + ); + + if (newTitle.equals(displayNameComp.getString())) { + return false; + } + this.displayNameComp = IChatBaseComponent.b(newTitle); + return true; + } + + @Override + public IChatBaseComponent d() { + return displayNameComp; + } + + @Override + public void a(IChatBaseComponent var0) { + } + + @Override + public IChatBaseComponent g() { + return IChatBaseComponent.b((this.d().toString())); + + } + + @Override + public void a(IScoreboardCriteria.EnumScoreboardHealthDisplay var0) { + } + + private void sendCreate(@NotNull PlayerConnection playerConnection) { + var packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 0); + playerConnection.b(packetPlayOutScoreboardObjective); + var packetPlayOutScoreboardDisplayObjective = new PacketPlayOutScoreboardDisplayObjective(type, this); + playerConnection.b(packetPlayOutScoreboardDisplayObjective); + + if (b().equalsIgnoreCase("health")) { + var packetPlayOutScoreboardDisplayObjective2 = new PacketPlayOutScoreboardDisplayObjective(DisplaySlot.a, this); + playerConnection.b(packetPlayOutScoreboardDisplayObjective2); + } + } + + // must be called when updating the name + public void sendUpdate() { + PacketPlayOutScoreboardObjective packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 2); + getReceivers().forEach(player -> ((CraftPlayer) player).getHandle().f.b(packetPlayOutScoreboardObjective)); + } + + public void sendRemove(@NotNull PlayerConnection playerConnection) { + PacketPlayOutScoreboardObjective packetPlayOutScoreboardObjective = new PacketPlayOutScoreboardObjective(this, 1); + playerConnection.b(packetPlayOutScoreboardObjective); + } + } + + + public class ScoreLineImpl extends ScoreboardScore implements ScoreLine, Comparable { + + private int score; + private IChatMutableComponent prefix = IChatBaseComponent.b(" "), suffix = IChatBaseComponent.b(" "); + private final TeamLine team; + private SidebarLine text; + private final String color; + + public ScoreLineImpl(@NotNull SidebarLine text, int score, @NotNull String color) { +// super(null, (ScoreboardObjective) getSidebarObjective(), color); + this.score = score; + this.text = text; + this.team = new TeamLine(color); + this.color = color; + } + + @Override + public void a(int score) { + this.score = score; + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + getColor(), + getSidebarObjective().getName(), + score, + Optional.empty(), + Optional.of(new FixedFormat(IChatBaseComponent.b(text.getTrimReplacePlaceholdersScore( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + )))) + ); + getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().f.b(packetPlayOutScoreboardScore)); + } + + @Override + public SidebarLine getLine() { + return text; + } + + @Override + public void setLine(SidebarLine line) { + this.text = line; + } + + @Override + public int getScoreAmount() { + return score; + } + + @Override + public void setScoreAmount(int score) { + this.a(score); + } + + @Override + public void sendCreateToAllReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team, true); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().f.b(packetPlayOutScoreboardTeam)); + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + this.getColor(), + getSidebarObjective().getName(), + this.getScoreAmount(), + Optional.empty(), + Optional.of(new FixedFormat(IChatBaseComponent.b(text.getTrimReplacePlaceholdersScore( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + )))) + ); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().f.b(packetPlayOutScoreboardScore)); + } + + @Override + public void sendCreate(Player player) { + PlayerConnection conn = ((CraftPlayer) player).getHandle().f; + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team, true); + conn.b(packetPlayOutScoreboardTeam); + + PacketPlayOutScoreboardScore packetPlayOutScoreboardScore = new PacketPlayOutScoreboardScore( + this.getColor(), + getSidebarObjective().getName(), + this.getScoreAmount(), + Optional.empty(), + Optional.of(new FixedFormat(IChatBaseComponent.b(text.getTrimReplacePlaceholdersScore( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + )))) + ); + conn.b(packetPlayOutScoreboardScore); + } + + @Override + public void sendRemove(Player player) { + PlayerConnection conn = ((CraftPlayer) player).getHandle().f; + // var1=1 means remove + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team); + var resetScore = new ClientboundResetScorePacket(team.b(), getSidebarObjective().getName()); + conn.b(resetScore); + conn.b(packetPlayOutScoreboardTeam); + } + + public void sendRemoveToAllReceivers() { + PacketPlayOutScoreboardTeam packetPlayOutScoreboardTeam = PacketPlayOutScoreboardTeam.a(team); + var resetScore = new ClientboundResetScorePacket(team.b(), getSidebarObjective().getName()); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().f.b(resetScore)); + getReceivers().forEach(p -> ((CraftPlayer) p).getHandle().f.b(packetPlayOutScoreboardTeam)); + } + + public void sendUpdate(Player player) { + // false=2 is for update packet, true=0 for create + PacketPlayOutScoreboardTeam packetTeamUpdate = PacketPlayOutScoreboardTeam.a(team, false); + ((CraftPlayer) player).getHandle().f.b(packetTeamUpdate); + } + + @Contract(pure = true) + public boolean setContent(@NotNull SidebarLine line) { + var oldPrefix = this.prefix; + var oldSuffix = this.suffix; + String content = line.getTrimReplacePlaceholders( + getReceivers().isEmpty() ? null : getReceivers().getFirst(), + null, + getPlaceholders() + ); + + if (content.length() > 256) { + this.prefix = IChatBaseComponent.b(content.substring(0, 256)); + if (this.prefix.getString().charAt(255) == ChatColor.COLOR_CHAR) { + this.prefix = IChatBaseComponent.b(content.substring(0, 255)); + setSuffix(content.substring(255)); + } else { + setSuffix(content.substring(256)); + } + } else { + this.prefix = IChatBaseComponent.b(content); + this.suffix = IChatBaseComponent.b(""); + } + return !oldPrefix.equals(this.prefix) || !oldSuffix.equals(this.suffix); + } + + public void setSuffix(@NotNull String secondPart) { + if (secondPart.isEmpty()) { + this.suffix = IChatBaseComponent.b(""); + return; + } + secondPart = org.bukkit.ChatColor.getLastColors(this.prefix.getString()) + secondPart; + this.suffix = IChatBaseComponent.b(secondPart.length() > 256 ? secondPart.substring(0, 256) : secondPart); + } + + public void sendUpdateToAllReceivers() { + // false=2 is for update packet, true=0 for create + PacketPlayOutScoreboardTeam packetTeamUpdate = PacketPlayOutScoreboardTeam.a(team, false); + getReceivers().forEach(r -> ((CraftPlayer) r).getHandle().f.b(packetTeamUpdate)); + } + + public int compareTo(@NotNull ScoreLine o) { + return Integer.compare(score, o.getScoreAmount()); + } + + @Override + public int a() { + return score; + } + + public String getColor() { + return color.charAt(0) == ChatColor.COLOR_CHAR ? color : ChatColor.COLOR_CHAR + color; + } + + @Override + public boolean refreshContent() { + return setContent(getLine()); + } + + private class TeamLine extends ScoreboardTeam { + + public TeamLine(String color) { + super(null, color); + g().add(color); + } + + @Contract(value = " -> new", pure = true) + @Override + public @NotNull IChatBaseComponent e() { + return prefix; + } + + @Override + public void b(@Nullable IChatBaseComponent var0) { + } + + @Override + public void c(@Nullable IChatBaseComponent var0) { + } + + @Contract(value = " -> new", pure = true) + @Override + public @NotNull IChatBaseComponent f() { + return suffix; + } + + @Override + public void a(boolean var0) { + } + + @Override + public void b(boolean var0) { + } + + @Override + public void a(EnumNameTagVisibility var0) { + } + + @Override + public void a(EnumTeamPush var0) { + } + + @Override + public void a(EnumChatFormat var0) { + } + + @Contract(value = "_ -> new", pure = true) + @Override + public @NotNull IChatMutableComponent d(IChatBaseComponent var0) { + return IChatBaseComponent.b(prefix.getString() + var0.getString() + suffix.getString()); + } + } + } +} From e0dbdb5d8222e87bba61087ddb3c1cacccb389a0 Mon Sep 17 00:00:00 2001 From: andrei1058 Date: Sun, 23 Mar 2025 13:42:26 +0100 Subject: [PATCH 25/25] allow javadocs --- sidebar-cmn1/pom.xml | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/sidebar-cmn1/pom.xml b/sidebar-cmn1/pom.xml index 3377fab..e01a7f0 100644 --- a/sidebar-cmn1/pom.xml +++ b/sidebar-cmn1/pom.xml @@ -40,24 +40,4 @@ provided - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 20 - 20 - - - - org.apache.maven.plugins - maven-javadoc-plugin - - true - - - - \ No newline at end of file