Skip to content

Commit 8c86668

Browse files
syldiumMrMicky-FR
andauthored
Add support for 1.20.3 servers (#43)
Co-authored-by: MrMicky <git@mrmicky.fr>
1 parent a9b5019 commit 8c86668

File tree

1 file changed

+47
-4
lines changed

1 file changed

+47
-4
lines changed

src/main/java/fr/mrmicky/fastboard/FastBoardBase.java

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)