Skip to content

Commit 177e5ea

Browse files
authored
Add support for Minecraft 1.20.5 (#50)
1 parent cb1a893 commit 177e5ea

File tree

5 files changed

+31
-11
lines changed

5 files changed

+31
-11
lines changed

.github/workflows/build.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@ jobs:
1212

1313
strategy:
1414
matrix:
15-
java-version: [8, 11, 17]
15+
java-version: [8, 11, 17, 21]
1616

1717
steps:
1818
- name: Checkout repository
19-
uses: actions/checkout@v2
19+
uses: actions/checkout@v4
2020

2121
- name: Setup JDK ${{ matrix.java-version }}
22-
uses: actions/setup-java@v2
22+
uses: actions/setup-java@v4
2323
with:
2424
distribution: 'temurin'
2525
java-version: ${{ matrix.java-version }}

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ Lightweight packet-based scoreboard API for Bukkit plugins, with 1.7.10 to 1.20.
5959
<dependency>
6060
<groupId>fr.mrmicky</groupId>
6161
<artifactId>fastboard</artifactId>
62-
<version>2.1.0</version>
62+
<version>2.1.1</version>
6363
</dependency>
6464
</dependencies>
6565
```
@@ -79,7 +79,7 @@ repositories {
7979
}
8080
8181
dependencies {
82-
implementation 'fr.mrmicky:fastboard:2.1.0'
82+
implementation 'fr.mrmicky:fastboard:2.1.1'
8383
}
8484
8585
shadowJar {

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>fr.mrmicky</groupId>
88
<artifactId>fastboard</artifactId>
9-
<version>2.1.0</version>
9+
<version>2.1.1</version>
1010

1111
<name>FastBoard</name>
1212
<description>Lightweight packet-based scoreboard API for Bukkit plugins.</description>
@@ -52,7 +52,7 @@
5252
<dependency>
5353
<groupId>org.spigotmc</groupId>
5454
<artifactId>spigot-api</artifactId>
55-
<version>1.16.1-R0.1-SNAPSHOT</version>
55+
<version>1.16.5-R0.1-SNAPSHOT</version>
5656
<scope>provided</scope>
5757
</dependency>
5858
<dependency>

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
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
*/
4848
public 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 {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,14 @@ static Class<?> innerClass(Class<?> parentClass, Predicate<Class<?>> classPredic
119119
throw new ClassNotFoundException("No class in " + parentClass.getCanonicalName() + " matches the predicate.");
120120
}
121121

122+
static Optional<MethodHandle> optionalConstructor(Class<?> declaringClass, MethodHandles.Lookup lookup, MethodType type) throws IllegalAccessException {
123+
try {
124+
return Optional.of(lookup.findConstructor(declaringClass, type));
125+
} catch (NoSuchMethodException e) {
126+
return Optional.empty();
127+
}
128+
}
129+
122130
public static PacketConstructor findPacketConstructor(Class<?> packetClass, MethodHandles.Lookup lookup) throws Exception {
123131
try {
124132
MethodHandle constructor = lookup.findConstructor(packetClass, VOID_METHOD_TYPE);

0 commit comments

Comments
 (0)