Skip to content

Commit 1de2601

Browse files
authored
Fix LimboAPI login injection on Velocity-CTD (DEFAULT_PERMISSION_RESOLVER fallback) (#236)
Velocity-CTD does not expose ConnectedPlayer.DEFAULT_PERMISSIONS (it uses DEFAULT_PERMISSION_RESOLVER instead), which caused LoginTasksQueue static initialization to fail with NoSuchFieldException during player connect. Update LoginTasksQueue to prefer DEFAULT_PERMISSIONS when present (standard Velocity), and when absent, reflect DEFAULT_PERMISSION_RESOLVER and wrap it into a PermissionProvider so PermissionsSetupEvent can still run. This restores LimboAPI login injection compatibility with Velocity-CTD. Co-authored-by: gbpii <gbpii@users.noreply.github.com>
1 parent 6540728 commit 1de2601

1 file changed

Lines changed: 13 additions & 3 deletions

File tree

plugin/src/main/java/net/elytrium/limboapi/injection/login/LoginTasksQueue.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -292,9 +292,19 @@ private void connectToServer(Logger logger, ConnectedPlayer player, MinecraftCon
292292
PROFILE_FIELD = MethodHandles.privateLookupIn(ConnectedPlayer.class, MethodHandles.lookup())
293293
.findSetter(ConnectedPlayer.class, "profile", GameProfile.class);
294294

295-
Field defaultPermissionsField = ConnectedPlayer.class.getDeclaredField("DEFAULT_PERMISSIONS");
296-
defaultPermissionsField.setAccessible(true);
297-
DEFAULT_PERMISSIONS = (PermissionProvider) defaultPermissionsField.get(null);
295+
PermissionProvider defaultPermissions;
296+
try {
297+
Field defaultPermissionsField = ConnectedPlayer.class.getDeclaredField("DEFAULT_PERMISSIONS");
298+
defaultPermissionsField.setAccessible(true);
299+
defaultPermissions = (PermissionProvider) defaultPermissionsField.get(null);
300+
} catch (NoSuchFieldException e) {
301+
Field defaultPermissionResolverField = ConnectedPlayer.class.getDeclaredField("DEFAULT_PERMISSION_RESOLVER");
302+
defaultPermissionResolverField.setAccessible(true);
303+
PermissionFunction defaultResolver = (PermissionFunction) defaultPermissionResolverField.get(null);
304+
// Velocity-CTD does not expose DEFAULT_PERMISSIONS; adapt its resolver to the PermissionProvider contract.
305+
defaultPermissions = subject -> (PermissionFunction) defaultResolver;
306+
}
307+
DEFAULT_PERMISSIONS = defaultPermissions;
298308

299309
SET_PERMISSION_FUNCTION_METHOD = MethodHandles.privateLookupIn(ConnectedPlayer.class, MethodHandles.lookup())
300310
.findVirtual(ConnectedPlayer.class, "setPermissionFunction", MethodType.methodType(void.class, PermissionFunction.class));

0 commit comments

Comments
 (0)