|
19 | 19 |
|
20 | 20 | import java.lang.reflect.Array;
|
21 | 21 | import java.lang.reflect.Constructor;
|
| 22 | +import java.lang.reflect.Field; |
22 | 23 | import java.lang.reflect.Method;
|
23 | 24 | import java.lang.reflect.Modifier;
|
24 | 25 | import java.lang.reflect.ParameterizedType;
|
25 | 26 | import java.util.HashMap;
|
26 | 27 | import java.util.List;
|
27 | 28 | import java.util.Map;
|
28 | 29 | import java.util.Optional;
|
| 30 | +import java.util.function.Supplier; |
29 | 31 | import java.util.logging.Level;
|
30 | 32 | import java.util.regex.Matcher;
|
31 | 33 | import java.util.regex.Pattern;
|
@@ -115,6 +117,8 @@ public final class MinecraftReflection {
|
115 | 117 | private static MethodAccessor asCraftMirror = null;
|
116 | 118 | private static MethodAccessor isEmpty = null;
|
117 | 119 |
|
| 120 | + private static boolean isMojangMapped = false; |
| 121 | + |
118 | 122 | private MinecraftReflection() {
|
119 | 123 | // No need to make this constructable.
|
120 | 124 | }
|
@@ -204,6 +208,9 @@ public static String getMinecraftPackage() {
|
204 | 208 | }
|
205 | 209 | }
|
206 | 210 |
|
| 211 | + // for now, we're going to say that it's Mojang mapped if the nms world was renamed to ServerLevel |
| 212 | + isMojangMapped = getNmsWorldClass().getName().contains("ServerLevel"); |
| 213 | + |
207 | 214 | return MINECRAFT_FULL_PACKAGE;
|
208 | 215 | } catch (NoSuchMethodException exception) {
|
209 | 216 | throw new IllegalStateException("Cannot find getHandle() in CraftEntity", exception);
|
@@ -1109,19 +1116,37 @@ public static Class<?> getPlayerInfoDataClass() {
|
1109 | 1116 | }
|
1110 | 1117 | }
|
1111 | 1118 |
|
| 1119 | + static Class<?> getOrInferMinecraftClass(String className, Supplier<Class<?>> supplier) { |
| 1120 | + return getOptionalNMS(className).orElseGet(() -> { |
| 1121 | + Class<?> clazz = supplier.get(); |
| 1122 | + return setMinecraftClass(className, clazz); |
| 1123 | + }); |
| 1124 | + } |
| 1125 | + |
1112 | 1126 | /**
|
1113 | 1127 | * Retrieves the entity use action class in 1.17.
|
1114 | 1128 | *
|
1115 | 1129 | * @return The EntityUseAction class
|
1116 | 1130 | */
|
1117 | 1131 | public static Class<?> getEnumEntityUseActionClass() {
|
1118 |
| - Class<?> packetClass = PacketType.Play.Client.USE_ENTITY.getPacketClass(); |
1119 |
| - FuzzyReflection fuzzyReflection = FuzzyReflection.fromClass(packetClass, true); |
1120 |
| - try { |
1121 |
| - return fuzzyReflection.getFieldByType("^.*(EnumEntityUseAction)").getType(); |
1122 |
| - } catch (IllegalArgumentException ignored) { |
1123 |
| - return fuzzyReflection.getFieldByType("^.*(Action)").getType(); |
1124 |
| - } |
| 1132 | + return getOrInferMinecraftClass("ServerboundInteractPacket.Action", () -> { |
| 1133 | + Class<?> packetClass = PacketType.Play.Client.USE_ENTITY.getPacketClass(); |
| 1134 | + FuzzyReflection fuzzyReflection = FuzzyReflection.fromClass(packetClass, true); |
| 1135 | + |
| 1136 | + Field field = fuzzyReflection.getField(FuzzyFieldContract.newBuilder() |
| 1137 | + .banModifier(Modifier.STATIC) |
| 1138 | + .typeDerivedOf(Object.class) |
| 1139 | + .build()); |
| 1140 | + if (field != null) { |
| 1141 | + return field.getType(); |
| 1142 | + } |
| 1143 | + |
| 1144 | + try { |
| 1145 | + return fuzzyReflection.getFieldByType("^.*(EnumEntityUseAction)").getType(); |
| 1146 | + } catch (IllegalArgumentException ignored) { |
| 1147 | + return fuzzyReflection.getFieldByType("^.*(Action)").getType(); |
| 1148 | + } |
| 1149 | + }); |
1125 | 1150 | }
|
1126 | 1151 |
|
1127 | 1152 | /**
|
@@ -1763,4 +1788,8 @@ public static Class<?> getStreamCodecClass() {
|
1763 | 1788 | public static Optional<Class<?>> getRegistryFriendlyByteBufClass() {
|
1764 | 1789 | return getOptionalNMS("network.RegistryFriendlyByteBuf");
|
1765 | 1790 | }
|
| 1791 | + |
| 1792 | + public static boolean isMojangMapped() { |
| 1793 | + return isMojangMapped; |
| 1794 | + } |
1766 | 1795 | }
|
0 commit comments