88import com .github .retrooper .packetevents .protocol .player .TextureProperty ;
99import com .github .retrooper .packetevents .protocol .player .UserProfile ;
1010import com .github .retrooper .packetevents .wrapper .play .server .WrapperPlayServerPlayerInfoUpdate ;
11+ import com .github .retrooper .packetevents .wrapper .play .server .WrapperPlayServerTeams ;
12+ import java .util .ArrayList ;
1113import java .util .List ;
1214import java .util .Map ;
1315import net .kyori .adventure .text .serializer .legacy .LegacyComponentSerializer ;
@@ -23,7 +25,11 @@ public class PacketManipulations {
2325 public PacketManipulations () {
2426 Packets .register (
2527 PacketListenerPriority .LOWEST ,
26- Map .of (PacketType .Play .Server .PLAYER_INFO_UPDATE , this ::handlePlayerInfo ));
28+ Map .of (
29+ PacketType .Play .Server .PLAYER_INFO_UPDATE ,
30+ this ::handlePlayerInfo ,
31+ PacketType .Play .Server .TEAMS ,
32+ this ::handleScoreboardTeam ));
2733 }
2834
2935 private void handlePlayerInfo (@ NonNull PacketSendEvent event ) {
@@ -34,7 +40,7 @@ private void handlePlayerInfo(@NonNull PacketSendEvent event) {
3440 List <WrapperPlayServerPlayerInfoUpdate .PlayerInfo > entries = wrapper .getEntries ();
3541 for (WrapperPlayServerPlayerInfoUpdate .PlayerInfo entry : entries ) {
3642 Player player = Bukkit .getPlayer (entry .getProfileId ());
37- if (player == null || player .equals (viewer ) || ! player . isOnline () ) continue ;
43+ if (player == null || player .equals (viewer )) continue ;
3844
3945 String playerDisplayName = PLAYER_UTILS .getPlayerDisplayName (player , viewer );
4046 String playerName = PLAYER_UTILS .getPlayerName (player , viewer );
@@ -59,4 +65,30 @@ private void handlePlayerInfo(@NonNull PacketSendEvent event) {
5965
6066 if (modified ) event .markForReEncode (true );
6167 }
68+
69+ private void handleScoreboardTeam (@ NonNull PacketSendEvent event ) {
70+ Player viewer = event .getPlayer ();
71+ WrapperPlayServerTeams wrapper = new WrapperPlayServerTeams (event );
72+
73+ List <String > players = new ArrayList <>(wrapper .getPlayers ());
74+ if (players .isEmpty ()) return ;
75+
76+ boolean modified = false ;
77+ for (String name : players ) {
78+ Player player = Bukkit .getPlayerExact (name );
79+
80+ if (player == null || player .equals (viewer )) continue ;
81+
82+ String playerName = PLAYER_UTILS .getPlayerName (player , viewer );
83+ if (StringUtils .isBlank (playerName ) || playerName .equals (name )) continue ;
84+
85+ players .set (players .indexOf (name ), playerName );
86+ modified = true ;
87+ }
88+
89+ if (modified ) {
90+ wrapper .setPlayers (players );
91+ event .markForReEncode (true );
92+ }
93+ }
6294}
0 commit comments