4343 * The project is on <a href="https://github.com/MrMicky-FR/FastBoard">GitHub</a>.
4444 *
4545 * @author MrMicky
46- * @version 2.1.0
46+ * @version 2.1.1
4747 */
4848public abstract class FastBoardBase <T > {
4949
@@ -67,6 +67,7 @@ public abstract class FastBoardBase<T> {
6767 private static final FastReflection .PacketConstructor PACKET_SB_SERIALIZABLE_TEAM ;
6868 private static final MethodHandle PACKET_SB_SET_SCORE ;
6969 private static final MethodHandle PACKET_SB_RESET_SCORE ;
70+ private static final boolean SCORE_OPTIONAL_COMPONENTS ;
7071 // Scoreboard enums
7172 private static final Class <?> DISPLAY_SLOT_TYPE ;
7273 private static final Class <?> ENUM_SB_HEALTH_DISPLAY ;
@@ -128,17 +129,23 @@ public abstract class FastBoardBase<T> {
128129 MethodHandle packetSbResetScore = null ;
129130 MethodHandle fixedFormatConstructor = null ;
130131 Object blankNumberFormat = null ;
132+ boolean scoreOptionalComponents = false ;
131133
132134 if (numberFormat .isPresent ()) { // 1.20.3
133135 Class <?> blankFormatClass = FastReflection .nmsClass ("network.chat.numbers" , "BlankFormat" );
134136 Class <?> fixedFormatClass = FastReflection .nmsClass ("network.chat.numbers" , "FixedFormat" );
135137 Class <?> resetScoreClass = FastReflection .nmsClass (gameProtocolPackage , "ClientboundResetScorePacket" );
136- MethodType setScoreType = MethodType .methodType (void .class , String .class , String .class , int .class , CHAT_COMPONENT_CLASS , numberFormat .get ());
138+ MethodType scoreType = MethodType .methodType (void .class , String .class , String .class , int .class , CHAT_COMPONENT_CLASS , numberFormat .get ());
139+ MethodType scoreTypeOptional = MethodType .methodType (void .class , String .class , String .class , int .class , Optional .class , Optional .class );
137140 MethodType removeScoreType = MethodType .methodType (void .class , String .class , String .class );
138141 MethodType fixedFormatType = MethodType .methodType (void .class , CHAT_COMPONENT_CLASS );
139142 Optional <Field > blankField = Arrays .stream (blankFormatClass .getFields ()).filter (f -> f .getType () == blankFormatClass ).findAny ();
143+ // Fields are of type Optional in 1.20.5+
144+ Optional <MethodHandle > optionalScorePacket = FastReflection .optionalConstructor (packetSbScoreClass , lookup , scoreTypeOptional );
140145 fixedFormatConstructor = lookup .findConstructor (fixedFormatClass , fixedFormatType );
141- packetSbSetScore = lookup .findConstructor (packetSbScoreClass , setScoreType );
146+ packetSbSetScore = optionalScorePacket .isPresent () ? optionalScorePacket .get ()
147+ : lookup .findConstructor (packetSbScoreClass , scoreType );
148+ scoreOptionalComponents = optionalScorePacket .isPresent ();
142149 packetSbResetScore = lookup .findConstructor (resetScoreClass , removeScoreType );
143150 blankNumberFormat = blankField .isPresent () ? blankField .get ().get (null ) : null ;
144151 } else if (VersionType .V1_17 .isHigherOrEqual ()) {
@@ -155,6 +162,7 @@ public abstract class FastBoardBase<T> {
155162 PACKET_SB_SERIALIZABLE_TEAM = sbTeamClass == null ? null : FastReflection .findPacketConstructor (sbTeamClass , lookup );
156163 FIXED_NUMBER_FORMAT = fixedFormatConstructor ;
157164 BLANK_NUMBER_FORMAT = blankNumberFormat ;
165+ SCORE_OPTIONAL_COMPONENTS = scoreOptionalComponents ;
158166
159167 for (Class <?> clazz : Arrays .asList (packetSbObjClass , packetSbDisplayObjClass , packetSbScoreClass , packetSbTeamClass , sbTeamClass )) {
160168 if (clazz == null ) {
@@ -623,6 +631,7 @@ protected void sendObjectivePacket(ObjectiveMode mode) throws Throwable {
623631
624632 if (mode != ObjectiveMode .REMOVE ) {
625633 setComponentField (packet , this .title , 1 );
634+ setField (packet , Optional .class , Optional .empty ()); // Number format for 1.20.5+, previously nullable
626635
627636 if (VersionType .V1_8 .isHigherOrEqual ()) {
628637 setField (packet , ENUM_SB_HEALTH_DISPLAY , ENUM_SB_HEALTH_DISPLAY_INTEGER );
@@ -688,8 +697,11 @@ private void sendModernScorePacket(int score, ScoreboardAction action) throws Th
688697 Object format = scoreFormat != null
689698 ? FIXED_NUMBER_FORMAT .invoke (toMinecraftComponent (scoreFormat ))
690699 : BLANK_NUMBER_FORMAT ;
700+ Object scorePacket = SCORE_OPTIONAL_COMPONENTS
701+ ? PACKET_SB_SET_SCORE .invoke (objName , this .id , score , Optional .empty (), Optional .of (format ))
702+ : PACKET_SB_SET_SCORE .invoke (objName , this .id , score , null , format );
691703
692- sendPacket (PACKET_SB_SET_SCORE . invoke ( objName , this . id , score , null , format ) );
704+ sendPacket (scorePacket );
693705 }
694706
695707 protected void sendTeamPacket (int score , TeamMode mode ) throws Throwable {
0 commit comments