XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEServerManager

【Java】我的世界XFE服务器管理器

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFEServerManager

Fix reobfuscated legacy command permissions

61c8666
XFE工作室室长 <mail@xfegzs.com>
提交于

代码差异

3 个文件 +54 -7
Modified platform/shared/src/forge-common/java/com/xfestudio/xfeservermanager/platform/forge/ForgePermissionCompat.java +17 -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
Added platform/shared/src/forge-legacy/java/com/xfestudio/xfeservermanager/platform/forge/LegacyForgePermissionBridge.java +17 -0
@@ -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 }
Added platform/shared/src/test/java/com/xfestudio/xfeservermanager/platform/forge/ForgePermissionCompatTest.java +20 -0
@@ -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 }