@@ -70,9 +70,10 @@ public abstract class FastBoardBase<T> {
7070 // Scoreboard packets
7171 private static final FastReflection .PacketConstructor PACKET_SB_OBJ ;
7272 private static final FastReflection .PacketConstructor PACKET_SB_DISPLAY_OBJ ;
73- private static final FastReflection .PacketConstructor PACKET_SB_SCORE ;
7473 private static final FastReflection .PacketConstructor PACKET_SB_TEAM ;
7574 private static final FastReflection .PacketConstructor PACKET_SB_SERIALIZABLE_TEAM ;
75+ private static final MethodHandle PACKET_SB_SET_SCORE ;
76+ private static final MethodHandle PACKET_SB_RESET_SCORE ;
7677 // Scoreboard enums
7778 private static final Class <?> DISPLAY_SLOT_TYPE ;
7879 private static final Class <?> ENUM_SB_HEALTH_DISPLAY ;
@@ -116,7 +117,6 @@ public abstract class FastBoardBase<T> {
116117 )
117118 .filter (m -> m .getParameterCount () == 1 && m .getParameterTypes ()[0 ] == packetClass )
118119 .findFirst ().orElseThrow (NoSuchMethodException ::new );
119-
120120 Optional <Class <?>> displaySlotEnum = FastReflection .nmsOptionalClass ("world.scores" , "DisplaySlot" );
121121 CHAT_COMPONENT_CLASS = FastReflection .nmsClass ("network.chat" , "IChatBaseComponent" );
122122 CHAT_FORMAT_ENUM = FastReflection .nmsClass (null , "EnumChatFormat" );
@@ -128,7 +128,27 @@ public abstract class FastBoardBase<T> {
128128 SEND_PACKET = lookup .unreflect (sendPacketMethod );
129129 PACKET_SB_OBJ = FastReflection .findPacketConstructor (packetSbObjClass , lookup );
130130 PACKET_SB_DISPLAY_OBJ = FastReflection .findPacketConstructor (packetSbDisplayObjClass , lookup );
131- PACKET_SB_SCORE = FastReflection .findPacketConstructor (packetSbScoreClass , lookup );
131+
132+ Optional <Class <?>> numberFormat = FastReflection .nmsOptionalClass ("network.chat.numbers" , "NumberFormat" );
133+ MethodHandle packetSbSetScore ;
134+ MethodHandle packetSbResetScore = null ;
135+
136+ if (numberFormat .isPresent ()) { // 1.20.3
137+ Class <?> resetScoreClass = FastReflection .nmsClass (gameProtocolPackage , "ClientboundResetScorePacket" );
138+ MethodType setScoreType = MethodType .methodType (void .class , String .class , String .class , int .class , CHAT_COMPONENT_CLASS , numberFormat .get ());
139+ MethodType removeScoreType = MethodType .methodType (void .class , String .class , String .class );
140+ packetSbSetScore = lookup .findConstructor (packetSbScoreClass , setScoreType );
141+ packetSbResetScore = lookup .findConstructor (resetScoreClass , removeScoreType );
142+ } else if (VersionType .V1_17 .isHigherOrEqual ()) {
143+ Class <?> enumSbAction = FastReflection .nmsClass ("server" , "ScoreboardServer$Action" );
144+ MethodType scoreType = MethodType .methodType (void .class , enumSbAction , String .class , String .class , int .class );
145+ packetSbSetScore = lookup .findConstructor (packetSbScoreClass , scoreType );
146+ } else {
147+ packetSbSetScore = lookup .findConstructor (packetSbScoreClass , MethodType .methodType (void .class ));
148+ }
149+
150+ PACKET_SB_SET_SCORE = packetSbSetScore ;
151+ PACKET_SB_RESET_SCORE = packetSbResetScore ;
132152 PACKET_SB_TEAM = FastReflection .findPacketConstructor (packetSbTeamClass , lookup );
133153 PACKET_SB_SERIALIZABLE_TEAM = sbTeamClass == null ? null : FastReflection .findPacketConstructor (sbTeamClass , lookup );
134154
@@ -470,7 +490,12 @@ protected void sendDisplayObjectivePacket() throws Throwable {
470490 }
471491
472492 protected void sendScorePacket (int score , ScoreboardAction action ) throws Throwable {
473- Object packet = PACKET_SB_SCORE .invoke ();
493+ if (VersionType .V1_17 .isHigherOrEqual ()) {
494+ sendModernScorePacket (score , action );
495+ return ;
496+ }
497+
498+ Object packet = PACKET_SB_SET_SCORE .invoke ();
474499
475500 setField (packet , String .class , COLOR_CODES [score ], 0 ); // Player Name
476501
@@ -490,6 +515,24 @@ protected void sendScorePacket(int score, ScoreboardAction action) throws Throwa
490515 sendPacket (packet );
491516 }
492517
518+ private void sendModernScorePacket (int score , ScoreboardAction action ) throws Throwable {
519+ String objName = COLOR_CODES [score ];
520+ Object enumAction = action == ScoreboardAction .REMOVE
521+ ? ENUM_SB_ACTION_REMOVE : ENUM_SB_ACTION_CHANGE ;
522+
523+ if (PACKET_SB_RESET_SCORE == null ) { // Pre 1.20.3
524+ sendPacket (PACKET_SB_SET_SCORE .invoke (enumAction , this .id , objName , score ));
525+ return ;
526+ }
527+
528+ if (action == ScoreboardAction .REMOVE ) {
529+ sendPacket (PACKET_SB_RESET_SCORE .invoke (objName , this .id ));
530+ return ;
531+ }
532+
533+ sendPacket (PACKET_SB_SET_SCORE .invoke (objName , this .id , score , null , null ));
534+ }
535+
493536 protected void sendTeamPacket (int score , TeamMode mode ) throws Throwable {
494537 sendTeamPacket (score , mode , null , null );
495538 }
0 commit comments