返回提交历史
Modified
platform/shared/src/forge-common/java/com/xfestudio/xfeservermanager/platform/forge/ForgePermissionCompat.java
+17
-7
Added
platform/shared/src/forge-legacy/java/com/xfestudio/xfeservermanager/platform/forge/LegacyForgePermissionBridge.java
+17
-0
Added
platform/shared/src/test/java/com/xfestudio/xfeservermanager/platform/forge/ForgePermissionCompatTest.java
+20
-0
XFEstudio/XFEServerManager
Fix reobfuscated legacy command permissions
61c8666
代码差异
3 个文件
+54
-7
@@ -8,8 +8,10 @@ import java.lang.reflect.Method;
8
8
9
9
/** Bridges the integer permission model (through 1.21.1) and 1.21.11's PermissionSet model. */
10
10
final class ForgePermissionCompat {
11
private static final Method LEGACY_HAS = method("hasPermission", int.class);
12
private static final Method LEGACY_WITH = method("withPermission", int.class);
11
// The legacy source-set bridge uses direct Minecraft calls, which ForgeGradle reobfuscates
12
// correctly for a production server. Reflect only our own stable class/method names here.
13
private static final Method LEGACY_HAS = legacyBridgeMethod("hasPermission");
14
private static final Method LEGACY_WITH = legacyBridgeMethod("withPermission");
13
15
private static final Method MODERN_WITH = modernWithPermission();
14
16
15
17
private ForgePermissionCompat() {
@@ -22,7 +24,7 @@ final class ForgePermissionCompat {
22
24
}
23
25
try {
24
26
if (LEGACY_HAS != null) {
25
return (boolean) LEGACY_HAS.invoke(source, level);
27
return (boolean) LEGACY_HAS.invoke(null, source, level);
26
28
}
27
29
Class<?> permissionType = Class.forName("net.minecraft.server.permissions.Permission");
28
30
Class<?> permissionSetType = Class.forName("net.minecraft.server.permissions.PermissionSet");
@@ -46,7 +48,7 @@ final class ForgePermissionCompat {
46
48
int bounded = Math.max(0, Math.min(level, 4));
47
49
try {
48
50
if (LEGACY_WITH != null) {
49
return (CommandSourceStack) LEGACY_WITH.invoke(source, bounded);
51
return (CommandSourceStack) LEGACY_WITH.invoke(null, source, bounded);
50
52
}
51
53
if (MODERN_WITH == null) {
52
54
throw new NoSuchMethodException("CommandSourceStack.withPermission");
@@ -68,11 +70,19 @@ final class ForgePermissionCompat {
68
70
}
69
71
}
70
72
71
private static Method method(String name, Class<?> parameter) {
73
static boolean legacyBridgeAvailable() {
74
return LEGACY_HAS != null && LEGACY_WITH != null;
75
}
76
77
private static Method legacyBridgeMethod(String name) {
72
78
try {
73
return CommandSourceStack.class.getMethod(name, parameter);
74
} catch (NoSuchMethodException ignored) {
79
Class<?> bridge = Class.forName(
80
"com.xfestudio.xfeservermanager.platform.forge.LegacyForgePermissionBridge");
81
return bridge.getMethod(name, CommandSourceStack.class, int.class);
82
} catch (ClassNotFoundException modernPlatform) {
75
83
return null;
84
} catch (NoSuchMethodException invalidBridge) {
85
throw new ExceptionInInitializerError(invalidBridge);
76
86
}
77
87
}
78
88
@@ -0,0 +1,17 @@
1
package com.xfestudio.xfeservermanager.platform.forge;
2
3
import net.minecraft.commands.CommandSourceStack;
4
5
/** Direct legacy permission calls that ForgeGradle can safely reobfuscate for production. */
6
public final class LegacyForgePermissionBridge {
7
private LegacyForgePermissionBridge() {
8
}
9
10
public static boolean hasPermission(CommandSourceStack source, int level) {
11
return source.hasPermission(level);
12
}
13
14
public static CommandSourceStack withPermission(CommandSourceStack source, int level) {
15
return source.withPermission(level);
16
}
17
}
@@ -0,0 +1,20 @@
1
package com.xfestudio.xfeservermanager.platform.forge;
2
3
import static org.junit.jupiter.api.Assertions.assertEquals;
4
5
import org.junit.jupiter.api.Test;
6
7
class ForgePermissionCompatTest {
8
@Test
9
void resolvesTheVersionSpecificBridgeExactlyWhenItIsOnThePlatformClasspath() {
10
boolean legacyBridgePresent;
11
try {
12
Class.forName("com.xfestudio.xfeservermanager.platform.forge.LegacyForgePermissionBridge");
13
legacyBridgePresent = true;
14
} catch (ClassNotFoundException modernPlatform) {
15
legacyBridgePresent = false;
16
}
17
18
assertEquals(legacyBridgePresent, ForgePermissionCompat.legacyBridgeAvailable());
19
}
20
}