Skip to content

Commit f41000f

Browse files
fix(bukkit): restore selector permission bypass on 1.21.1+
Minecraft 1.21.1 added an allowSelectors parameter to EntityArgument's internal parse overload. CraftBukkit consequently moved its existing overridePermissions parameter to a three-argument overload. Prefer that overload when available, while retaining the legacy CraftBukkit overload for older Minecraft versions. Refs #156 Supersedes #163 Co-authored-by: RootBeer <36140389+R00tB33rMan@users.noreply.github.com>
1 parent d374439 commit f41000f

1 file changed

Lines changed: 35 additions & 6 deletions

File tree

cloud-bukkit/src/main/java/org/incendo/cloud/bukkit/parser/selector/SelectorUtils.java

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -107,21 +107,50 @@ public Object apply(
107107
final ArgumentType<Object> type,
108108
final StringReader reader
109109
) throws CommandSyntaxException {
110-
final @Nullable Method specialParse = CraftBukkitReflection.findMethod(
110+
// Minecraft 1.21.1 added allowSelectors to Vanilla's internal parse overload. CraftBukkit moved
111+
// its existing overridePermissions parameter to a new three-argument overload to avoid a collision.
112+
final @Nullable Method parseWithSelectorControl = CraftBukkitReflection.findMethod(
111113
type.getClass(),
112114
"parse",
113115
StringReader.class,
116+
boolean.class,
114117
boolean.class
115118
);
116-
if (specialParse == null) {
117-
return type.parse(reader);
119+
if (parseWithSelectorControl != null) {
120+
return invokeCraftBukkitParse(
121+
parseWithSelectorControl,
122+
type,
123+
reader,
124+
true, // allowSelectors
125+
true // overridePermissions
126+
);
118127
}
119-
try {
120-
return specialParse.invoke(
128+
129+
// Before Minecraft 1.21.1, CraftBukkit's only additional parameter was overridePermissions.
130+
final @Nullable Method parseWithPermissionOverride = CraftBukkitReflection.findMethod(
131+
type.getClass(),
132+
"parse",
133+
StringReader.class,
134+
boolean.class
135+
);
136+
if (parseWithPermissionOverride != null) {
137+
return invokeCraftBukkitParse(
138+
parseWithPermissionOverride,
121139
type,
122140
reader,
123-
true // CraftBukkit overridePermissions param
141+
true // overridePermissions
124142
);
143+
}
144+
return type.parse(reader);
145+
}
146+
147+
private static Object invokeCraftBukkitParse(
148+
final Method method,
149+
final ArgumentType<Object> type,
150+
final Object... arguments
151+
) throws CommandSyntaxException {
152+
try {
153+
return method.invoke(type, arguments);
125154
} catch (final InvocationTargetException ex) {
126155
final Throwable cause = ex.getCause();
127156
if (cause instanceof CommandSyntaxException) {

0 commit comments

Comments
 (0)