Skip to content

Commit a1eca91

Browse files
committed
initial 26.2 support
1 parent 6bdabc7 commit a1eca91

11 files changed

Lines changed: 168 additions & 145 deletions

File tree

implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/PacketAdapterLoader.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,26 @@ private PacketAdapterLoader() {
1515

1616
public static @NotNull PacketAdapterProvider loadPacketAdapter(Plugin plugin) throws NoPacketAdapterAvailableException {
1717
Class<?> nmsClass = findAndLoadImplementationClass();
18+
boolean swallowException = false;
1819
if (nmsClass == null) {
19-
throw new NoPacketAdapterAvailableException();
20+
// Hide from relocation checkers
21+
String property = "net.mega".concat("vex.scoreboardlibrary.dontSwallowUntestedLoadException");
22+
23+
swallowException = !System.getProperty(property, "").equalsIgnoreCase("true");
24+
nmsClass = tryLoadModern();
25+
if (nmsClass == null) {
26+
throw new NoPacketAdapterAvailableException();
27+
}
2028
}
2129

2230
try {
2331
return (PacketAdapterProvider) nmsClass.getConstructors()[0].newInstance(plugin);
24-
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
32+
} catch (InstantiationException | IllegalAccessException e) {
33+
throw new RuntimeException("couldn't initialize packet adapter", e);
34+
} catch (InvocationTargetException e) {
35+
if (swallowException) {
36+
throw new NoPacketAdapterAvailableException();
37+
}
2538
throw new RuntimeException("couldn't initialize packet adapter", e);
2639
}
2740
}
@@ -119,14 +132,9 @@ private PacketAdapterLoader() {
119132
case "26.1":
120133
case "26.1.1":
121134
case "26.1.2":
135+
case "26.2":
122136
return tryLoadModern();
123137
default:
124-
// Hide from relocation checkers
125-
String property = "net.mega".concat("vex.scoreboardlibrary.forceModern");
126-
if (System.getProperty(property, "").equalsIgnoreCase("true")) {
127-
return tryLoadModern();
128-
}
129-
130138
return null;
131139
}
132140
}

implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/packetAdapter/modern/PacketAccessors.java

Lines changed: 72 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.megavex.scoreboardlibrary.api.team.enums.CollisionRule;
66
import net.megavex.scoreboardlibrary.api.team.enums.NameTagVisibility;
77
import net.megavex.scoreboardlibrary.implementation.commons.LegacyFormatUtil;
8+
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
89
import net.megavex.scoreboardlibrary.implementation.packetAdapter.util.reflect.*;
910
import org.bukkit.Bukkit;
1011
import org.jetbrains.annotations.NotNull;
@@ -17,7 +18,7 @@ public final class PacketAccessors {
1718
private PacketAccessors() {
1819
}
1920

20-
public static final boolean IS_1_17_OR_ABOVE, IS_1_20_2_OR_ABOVE, IS_1_20_3_OR_ABOVE, IS_1_20_5_OR_ABOVE, IS_1_21_5_OR_ABOVE, IS_1_21_6_OR_ABOVE;
21+
public static final boolean IS_1_17_OR_ABOVE, IS_1_20_2_OR_ABOVE, IS_1_20_3_OR_ABOVE, IS_1_20_5_OR_ABOVE, IS_1_21_5_OR_ABOVE, IS_1_21_6_OR_ABOVE, IS_26_2_OR_ABOVE;
2122
private static final String OLD_NMS_VERSION_STRING;
2223

2324
static {
@@ -74,6 +75,14 @@ private PacketAccessors() {
7475
} catch (ClassNotFoundException ignored) {
7576
}
7677
IS_1_21_6_OR_ABOVE = is1_21_6OrAbove;
78+
79+
boolean is26_2OrAbove = false;
80+
try {
81+
Class.forName("net.minecraft.world.scores.TeamColor");
82+
is26_2OrAbove = true;
83+
} catch (ClassNotFoundException ignored) {
84+
}
85+
IS_26_2_OR_ABOVE = is26_2OrAbove;
7786
}
7887

7988
public static final Class<?> PKT_CLASS,
@@ -93,7 +102,7 @@ private PacketAccessors() {
93102
OBJECTIVE_CLASS,
94103
TEAM_VISIBILITY_CLASS,
95104
TEAM_COLLISION_RULE_CLASS,
96-
CHAT_FORMATTING_CLASS,
105+
TEAM_COLOR_OR_CHAT_FORMATTING_CLASS,
97106
OBJECTIVE_CRITERIA_RENDER_TYPE_CLASS,
98107
DATA_RESULT_CLASS,
99108
DYNAMIC_OPS_CLASS,
@@ -121,7 +130,7 @@ private PacketAccessors() {
121130
OBJECTIVE_CLASS = ReflectUtil.getClassOrThrow("net.minecraft.world.scores.Objective", "net.minecraft.world.scores.ScoreboardObjective", oldSpigotClassName("ScoreboardObjective"));
122131
TEAM_VISIBILITY_CLASS = ReflectUtil.getClassOrThrow("net.minecraft.world.scores.Team$Visibility", "net.minecraft.world.scores.ScoreboardTeamBase$EnumNameTagVisibility", oldSpigotClassName("ScoreboardTeamBase$EnumNameTagVisibility"));
123132
TEAM_COLLISION_RULE_CLASS = ReflectUtil.getClassOrThrow("net.minecraft.world.scores.Team$CollisionRule", "net.minecraft.world.scores.ScoreboardTeamBase$EnumTeamPush", oldSpigotClassName("ScoreboardTeamBase$EnumTeamPush"));
124-
CHAT_FORMATTING_CLASS = ReflectUtil.getClassOrThrow("net.minecraft.ChatFormatting", "net.minecraft.EnumChatFormat", oldSpigotClassName("EnumChatFormat"));
133+
TEAM_COLOR_OR_CHAT_FORMATTING_CLASS = ReflectUtil.getClassOrThrow("net.minecraft.world.scores.TeamColor", "net.minecraft.ChatFormatting", "net.minecraft.EnumChatFormat", oldSpigotClassName("EnumChatFormat"));
125134
OBJECTIVE_CRITERIA_RENDER_TYPE_CLASS = ReflectUtil.getClassOrThrow("net.minecraft.world.scores.criteria.ObjectiveCriteria$RenderType", "net.minecraft.world.scores.criteria.IScoreboardCriteria$EnumScoreboardHealthDisplay", oldSpigotClassName("IScoreboardCriteria$EnumScoreboardHealthDisplay"));
126135
DATA_RESULT_CLASS = ReflectUtil.getOptionalClass("com.mojang.serialization.DataResult");
127136
DYNAMIC_OPS_CLASS = ReflectUtil.getOptionalClass("com.mojang.serialization.DynamicOps");
@@ -181,14 +190,14 @@ private PacketAccessors() {
181190
public static final Map<NamedTextColor, Object> NMS_CHAT_FORMATTING_MAP = new HashMap<>();
182191

183192
static {
184-
Object[] chatFormattings = CHAT_FORMATTING_CLASS.getEnumConstants();
185-
FieldAccessor<Object, Object> charField = ReflectUtil.findFieldUnchecked(CHAT_FORMATTING_CLASS, 0, char.class);
193+
Object[] chatFormattings = TEAM_COLOR_OR_CHAT_FORMATTING_CLASS.getEnumConstants();
194+
FieldAccessor<Object, Object> nameField = ReflectUtil.findFieldUnchecked(TEAM_COLOR_OR_CHAT_FORMATTING_CLASS, 0, String.class);
186195

187196
outer:
188197
for (NamedTextColor color : NamedTextColor.NAMES.values()) {
189198
char c = LegacyFormatUtil.getChar(color);
190199
for (Object chatFormatting : chatFormattings) {
191-
if (c == (char) charField.get(chatFormatting)) {
200+
if (color.toString().equalsIgnoreCase((String) nameField.get(chatFormatting))) {
192201
NMS_CHAT_FORMATTING_MAP.put(color, chatFormatting);
193202
continue outer;
194203
}
@@ -217,7 +226,7 @@ private PacketAccessors() {
217226

218227
// --- OBJECTIVES ---
219228

220-
public static final PacketConstructor<?> OBJECTIVE_PACKET_CONSTRUCTOR =
229+
public static final ConstructorAccessor<?> OBJECTIVE_PACKET_CONSTRUCTOR =
221230
ReflectUtil.getEmptyConstructor(SET_OBJECTIVE_PKT_CLASS);
222231
public static final FieldAccessor<Object, String> OBJECTIVE_NAME_FIELD =
223232
ReflectUtil.findFieldUnchecked(SET_OBJECTIVE_PKT_CLASS, 0, String.class);
@@ -257,7 +266,7 @@ private PacketAccessors() {
257266

258267
// --- TEAMS ---
259268

260-
public static final PacketConstructor<?> PARAMETERS_CONSTRUCTOR;
269+
public static final ConstructorAccessor<?> PARAMETERS_CONSTRUCTOR; // full record constructor on 26.2+, empty constructor for below
261270
public static final ConstructorAccessor<?> TEAM_PACKET_CONSTRUCTOR;
262271

263272
public static final FieldAccessor<Object, String> TEAM_NAME_FIELD;
@@ -275,7 +284,21 @@ private PacketAccessors() {
275284
public static final FieldAccessor<Object, Integer> OPTIONS_FIELD;
276285

277286
static {
278-
if (IS_1_17_OR_ABOVE) {
287+
if (IS_26_2_OR_ABOVE) {
288+
PARAMETERS_CONSTRUCTOR = ReflectUtil.findConstructor(TEAM_PARAMETERS_PKT_CLASS, COMPONENT_CLASS, COMPONENT_CLASS, COMPONENT_CLASS, TEAM_VISIBILITY_CLASS, TEAM_COLLISION_RULE_CLASS, Optional.class, byte.class);
289+
TEAM_PACKET_CONSTRUCTOR = ReflectUtil.findConstructor(SET_PLAYER_TEAM_PKT_CLASS, String.class, int.class, Optional.class, Collection.class); // same as below
290+
291+
TEAM_NAME_FIELD = null;
292+
TEAM_MODE_FIELD = null;
293+
TEAM_ENTRIES_FIELD = null;
294+
DISPLAY_NAME_FIELD = null;
295+
PREFIX_FIELD = null;
296+
SUFFIX_FIELD = null;
297+
NAME_TAG_VISIBILITY_FIELD = null;
298+
COLLISION_RULE_FIELD = null;
299+
COLOR_FIELD = null;
300+
OPTIONS_FIELD = null;
301+
} else if (IS_1_17_OR_ABOVE) {
279302
assert TEAM_PARAMETERS_PKT_CLASS != null;
280303
PARAMETERS_CONSTRUCTOR = ReflectUtil.getEmptyConstructor(TEAM_PARAMETERS_PKT_CLASS);
281304
TEAM_PACKET_CONSTRUCTOR = ReflectUtil.findConstructor(SET_PLAYER_TEAM_PKT_CLASS, String.class, int.class, Optional.class, Collection.class);
@@ -296,7 +319,7 @@ private PacketAccessors() {
296319
COLLISION_RULE_FIELD = ReflectUtil.findFieldUnchecked(TEAM_PARAMETERS_PKT_CLASS, 1, String.class);
297320
}
298321

299-
COLOR_FIELD = ReflectUtil.findFieldUnchecked(TEAM_PARAMETERS_PKT_CLASS, 0, CHAT_FORMATTING_CLASS);
322+
COLOR_FIELD = ReflectUtil.findFieldUnchecked(TEAM_PARAMETERS_PKT_CLASS, 0, TEAM_COLOR_OR_CHAT_FORMATTING_CLASS);
300323
OPTIONS_FIELD = ReflectUtil.findFieldUnchecked(TEAM_PARAMETERS_PKT_CLASS, 0, int.class);
301324
} else {
302325
PARAMETERS_CONSTRUCTOR = null;
@@ -313,7 +336,7 @@ private PacketAccessors() {
313336
NAME_TAG_VISIBILITY_FIELD = ReflectUtil.findFieldUnchecked(SET_PLAYER_TEAM_PKT_CLASS, 1, String.class);
314337
COLLISION_RULE_FIELD = ReflectUtil.findFieldUnchecked(SET_PLAYER_TEAM_PKT_CLASS, 2, String.class);
315338

316-
COLOR_FIELD = ReflectUtil.findFieldUnchecked(SET_PLAYER_TEAM_PKT_CLASS, 0, CHAT_FORMATTING_CLASS);
339+
COLOR_FIELD = ReflectUtil.findFieldUnchecked(SET_PLAYER_TEAM_PKT_CLASS, 0, TEAM_COLOR_OR_CHAT_FORMATTING_CLASS);
317340
OPTIONS_FIELD = ReflectUtil.findFieldUnchecked(SET_PLAYER_TEAM_PKT_CLASS, 1, int.class);
318341
}
319342
}
@@ -348,6 +371,44 @@ public static Object collisionRule(CollisionRule value) {
348371
}
349372
}
350373

374+
public static Object createTeamParameters(Object displayName, Object playerPrefix, Object playerSuffix, ImmutableTeamProperties<?> otherProps) {
375+
if (IS_26_2_OR_ABOVE){
376+
Object chatFormattingColor = null;
377+
if (otherProps.playerColor() != null) {
378+
chatFormattingColor = PacketAccessors.NMS_CHAT_FORMATTING_MAP.get(otherProps.playerColor());
379+
}
380+
Object nmsNameTagVisibility = PacketAccessors.nameTagVisibility(otherProps.nameTagVisibility());
381+
Object nmsCollisionRule = PacketAccessors.collisionRule(otherProps.collisionRule());
382+
return PARAMETERS_CONSTRUCTOR.invoke(displayName, playerPrefix, playerSuffix, nmsNameTagVisibility, nmsCollisionRule, Optional.ofNullable(chatFormattingColor), (byte) otherProps.packOptions());
383+
}
384+
385+
Object parameters = PARAMETERS_CONSTRUCTOR.invoke();
386+
setupOldTeamPropertiesFields(parameters, displayName, playerPrefix, playerSuffix, otherProps);
387+
return parameters;
388+
}
389+
390+
public static void setupOldTeamPropertiesFields(Object teamPacket, Object displayName, Object playerPrefix, Object playerSuffix, ImmutableTeamProperties<?> otherProps) {
391+
Object nmsNameTagVisibility;
392+
Object nmsCollisionRule;
393+
if (IS_1_21_5_OR_ABOVE) {
394+
nmsNameTagVisibility = PacketAccessors.nameTagVisibility(otherProps.nameTagVisibility());
395+
nmsCollisionRule = PacketAccessors.collisionRule(otherProps.collisionRule());
396+
} else {
397+
nmsNameTagVisibility = otherProps.nameTagVisibility().key();
398+
nmsCollisionRule = otherProps.collisionRule().key();
399+
}
400+
401+
Object chatFormattingColor = PacketAccessors.NMS_CHAT_FORMATTING_MAP.get(otherProps.playerColor() != null ? otherProps.playerColor() : NamedTextColor.WHITE);
402+
403+
DISPLAY_NAME_FIELD.set(teamPacket, displayName);
404+
PREFIX_FIELD.set(teamPacket, playerPrefix);
405+
SUFFIX_FIELD.set(teamPacket, playerSuffix);
406+
NAME_TAG_VISIBILITY_FIELD.set(teamPacket, nmsNameTagVisibility);
407+
COLLISION_RULE_FIELD.set(teamPacket, nmsCollisionRule);
408+
COLOR_FIELD.set(teamPacket, chatFormattingColor);
409+
OPTIONS_FIELD.set(teamPacket, otherProps.packOptions());
410+
}
411+
351412
public static @NotNull Object fromAdventureComponent(@NotNull Component component) {
352413
return Objects.requireNonNull(PacketAccessors.ADVENTURE_COMPONENT_CONSTRUCTOR).invoke(component);
353414
}

implementation/src/main/java/net/megavex/scoreboardlibrary/implementation/packetAdapter/modern/team/AbstractTeamsPacketAdapterImpl.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.team;
22

33
import net.kyori.adventure.text.Component;
4-
import net.kyori.adventure.text.format.NamedTextColor;
54
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
65
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAccessors;
76
import net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.PacketAdapterProviderImpl;
@@ -11,11 +10,9 @@
1110
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamsPacketAdapter;
1211
import org.bukkit.entity.Player;
1312
import org.jetbrains.annotations.NotNull;
14-
import org.jetbrains.annotations.UnknownNullability;
1513

1614
import java.util.Collection;
1715
import java.util.Collections;
18-
import java.util.Locale;
1916
import java.util.Optional;
2017

2118
public abstract class AbstractTeamsPacketAdapterImpl implements TeamsPacketAdapter {
@@ -84,19 +81,5 @@ public void sendEntries(@NotNull EntriesPacketType packetType, @NotNull Collecti
8481
provider.packetSender().sendPacket(players, packet);
8582
}
8683
}
87-
88-
protected void fillParameters(@NotNull Object parameters, @UnknownNullability Locale locale) {
89-
if (PacketAccessors.IS_1_21_5_OR_ABOVE) {
90-
PacketAccessors.NAME_TAG_VISIBILITY_FIELD.set(parameters, PacketAccessors.nameTagVisibility(properties.nameTagVisibility()));
91-
PacketAccessors.COLLISION_RULE_FIELD.set(parameters, PacketAccessors.collisionRule(properties.collisionRule()));
92-
} else {
93-
PacketAccessors.NAME_TAG_VISIBILITY_FIELD.set(parameters, properties.nameTagVisibility().key());
94-
PacketAccessors.COLLISION_RULE_FIELD.set(parameters, properties.collisionRule().key());
95-
}
96-
97-
Object color = PacketAccessors.NMS_CHAT_FORMATTING_MAP.get(properties.playerColor() != null ? properties.playerColor() : NamedTextColor.WHITE);
98-
PacketAccessors.COLOR_FIELD.set(parameters, color);
99-
PacketAccessors.OPTIONS_FIELD.set(parameters, properties.packOptions());
100-
}
10184
}
10285
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package net.megavex.scoreboardlibrary.implementation.packetAdapter.modern.team;
22

3-
import com.google.common.collect.ImmutableList;
43
import net.kyori.adventure.text.Component;
54
import net.megavex.scoreboardlibrary.implementation.packetAdapter.ImmutableTeamProperties;
65
import net.megavex.scoreboardlibrary.implementation.packetAdapter.PropertiesPacketType;
@@ -10,10 +9,9 @@
109
import net.megavex.scoreboardlibrary.implementation.packetAdapter.team.TeamDisplayPacketAdapter;
1110
import org.bukkit.entity.Player;
1211
import org.jetbrains.annotations.NotNull;
13-
import org.jetbrains.annotations.UnknownNullability;
1412

13+
import java.util.ArrayList;
1514
import java.util.Collection;
16-
import java.util.Locale;
1715
import java.util.Optional;
1816

1917
public final class PaperTeamsPacketAdapterImpl extends AbstractTeamsPacketAdapterImpl {
@@ -27,80 +25,47 @@ public PaperTeamsPacketAdapterImpl(PacketAdapterProviderImpl provider, @NotNull
2725
}
2826

2927
private class TeamDisplayPacketAdapterImpl extends AbstractTeamsPacketAdapterImpl.TeamDisplayPacketAdapterImpl {
30-
private final Object parameters;
31-
private Object createPacket = null;
32-
private Object updatePacket = null;
33-
3428
public TeamDisplayPacketAdapterImpl(@NotNull ImmutableTeamProperties<Component> properties) {
3529
super(properties);
36-
if (PacketAccessors.IS_1_17_OR_ABOVE) {
37-
this.parameters = PacketAccessors.PARAMETERS_CONSTRUCTOR.invoke();
38-
} else {
39-
this.parameters = null;
40-
}
4130
}
4231

4332
@Override
4433
public void updateTeamPackets() {
45-
if (parameters != null) {
46-
fillParameters(parameters, null);
47-
}
48-
createPacket = null;
49-
updatePacket = null;
5034
}
5135

5236
@Override
5337
public void sendProperties(@NotNull PropertiesPacketType packetType, @NotNull Collection<Player> players) {
54-
if (createPacket == null || updatePacket == null) {
55-
Collection<String> entries = ImmutableList.copyOf(properties.syncedEntries());
56-
if (parameters != null) {
57-
createPacket = PacketAccessors.TEAM_PACKET_CONSTRUCTOR.invoke(
58-
teamName,
59-
TeamConstants.MODE_CREATE,
60-
Optional.of(parameters),
61-
entries
62-
);
38+
Collection<String> entries = new ArrayList<>(properties.syncedEntries());
6339

64-
updatePacket = PacketAccessors.TEAM_PACKET_CONSTRUCTOR.invoke(
65-
teamName,
66-
TeamConstants.MODE_UPDATE,
67-
Optional.of(parameters),
68-
entries
69-
);
70-
} else {
71-
assert PacketAccessors.TEAM_NAME_FIELD != null;
72-
assert PacketAccessors.TEAM_MODE_FIELD != null;
40+
Object displayName = PacketAccessors.fromAdventureComponent(properties.displayName());
41+
Object prefix = PacketAccessors.fromAdventureComponent(properties.prefix());
42+
Object suffix = PacketAccessors.fromAdventureComponent(properties.suffix());
7343

74-
createPacket = PacketAccessors.TEAM_PACKET_CONSTRUCTOR.invoke();
75-
PacketAccessors.TEAM_NAME_FIELD.set(createPacket, teamName);
76-
PacketAccessors.TEAM_MODE_FIELD.set(createPacket, TeamConstants.MODE_CREATE);
77-
PacketAccessors.TEAM_ENTRIES_FIELD.set(createPacket, entries);
78-
fillParameters(createPacket, null);
44+
Object packet;
45+
if (PacketAccessors.IS_1_17_OR_ABOVE) {
46+
assert PacketAccessors.PARAMETERS_CONSTRUCTOR != null;
47+
Object parameters = PacketAccessors.createTeamParameters(displayName, prefix, suffix, properties);
7948

80-
updatePacket = PacketAccessors.TEAM_PACKET_CONSTRUCTOR.invoke();
81-
PacketAccessors.TEAM_NAME_FIELD.set(updatePacket, teamName);
82-
PacketAccessors.TEAM_MODE_FIELD.set(updatePacket, TeamConstants.MODE_UPDATE);
83-
PacketAccessors.TEAM_ENTRIES_FIELD.set(updatePacket, entries);
84-
fillParameters(updatePacket, null);
85-
}
86-
}
49+
packet = PacketAccessors.TEAM_PACKET_CONSTRUCTOR.invoke(
50+
teamName,
51+
TeamConstants.mode(packetType),
52+
Optional.of(parameters),
53+
entries
54+
);
55+
} else {
56+
assert PacketAccessors.TEAM_NAME_FIELD != null;
57+
assert PacketAccessors.TEAM_MODE_FIELD != null;
58+
assert PacketAccessors.TEAM_ENTRIES_FIELD != null;
59+
60+
packet = PacketAccessors.TEAM_PACKET_CONSTRUCTOR.invoke();
61+
PacketAccessors.TEAM_NAME_FIELD.set(packet, teamName);
62+
PacketAccessors.TEAM_MODE_FIELD.set(packet, TeamConstants.mode(packetType));
63+
PacketAccessors.TEAM_ENTRIES_FIELD.set(packet, entries);
8764

88-
switch (packetType) {
89-
case CREATE:
90-
provider.packetSender().sendPacket(players, createPacket);
91-
break;
92-
case UPDATE:
93-
provider.packetSender().sendPacket(players, updatePacket);
94-
break;
65+
PacketAccessors.setupOldTeamPropertiesFields(packet, displayName, prefix, suffix, properties);
9566
}
96-
}
9767

98-
@Override
99-
protected void fillParameters(@NotNull Object parameters, @UnknownNullability Locale locale) {
100-
super.fillParameters(parameters, locale);
101-
PacketAccessors.DISPLAY_NAME_FIELD.set(parameters, PacketAccessors.fromAdventureComponent(properties.displayName()));
102-
PacketAccessors.PREFIX_FIELD.set(parameters, PacketAccessors.fromAdventureComponent(properties.prefix()));
103-
PacketAccessors.SUFFIX_FIELD.set(parameters, PacketAccessors.fromAdventureComponent(properties.suffix()));
68+
provider.packetSender().sendPacket(players, packet);
10469
}
10570
}
10671
}

0 commit comments

Comments
 (0)