Fixed 1.18.1 NMS problems, closes #4

This commit is contained in:
SBDeveloper 2022-07-29 14:58:12 +02:00
parent 49e7fefe5f
commit 15148becab
2 changed files with 51 additions and 3 deletions

View file

@ -255,7 +255,18 @@ public class MapWrapper {
private void sendItemFramePacket(Player player, int entityId, ItemStack stack, int mapId) {
Object nmsStack = ReflectionUtil.callMethod(craftStackClass, "asNMSCopy", stack);
Object nbtObject = ReflectionUtil.callMethod(nmsStack, ReflectionUtil.supports(19) ? "v" : ReflectionUtil.supports(18) ? "u" : ReflectionUtil.supports(13) ? "getOrCreateTag" : "getTag");
String nbtObjectName;
if (ReflectionUtil.supports(19)) { //1.19
nbtObjectName = "v";
} else if (ReflectionUtil.supports(18)) { //1.18
nbtObjectName = ReflectionUtil.VER_MINOR == 1 ? "t" : "u"; //1.18.1 = t, 1.18(.2) = u
} else if (ReflectionUtil.supports(13)) { //1.13 - 1.17
nbtObjectName = "getOrCreateTag";
} else { //1.12
nbtObjectName = "getTag";
}
Object nbtObject = ReflectionUtil.callMethod(nmsStack, nbtObjectName);
if (!ReflectionUtil.supports(13) && nbtObject == null) { //1.12 has no getOrCreate, call create if null!
Object tagCompound = ReflectionUtil.callConstructor(tagCompoundClass);
@ -271,9 +282,23 @@ public class MapWrapper {
true
);
List list = new ArrayList<>();
Object dataWatcherObject = ReflectionUtil.getDeclaredField(entityItemFrameClass, ReflectionUtil.supports(17) ? "ao" : ReflectionUtil.supports(14) ? "ITEM" : ReflectionUtil.supports(13) ? "e" : "c");
String dataWatcherObjectName;
if (ReflectionUtil.supports(19)) { //1.19, same as 1.17 and 1.18(.2)
dataWatcherObjectName = "ao";
} else if (ReflectionUtil.supports(18)) { //1.18
dataWatcherObjectName = ReflectionUtil.VER_MINOR == 1 ? "ap" : "ao"; //1.18.1 = ap, 1.18(.2) = ao
} else if (ReflectionUtil.supports(17)) { //1.17
dataWatcherObjectName = "ao";
} else if (ReflectionUtil.supports(14)) { //1.14 - 1.16
dataWatcherObjectName = "ITEM";
} else if (ReflectionUtil.supports(13)) { //1.13
dataWatcherObjectName = "e";
} else { //1.12
dataWatcherObjectName = "c";
}
Object dataWatcherObject = ReflectionUtil.getDeclaredField(entityItemFrameClass, dataWatcherObjectName);
Object dataWatcherItem = ReflectionUtil.callFirstConstructor(dataWatcherItemClass, dataWatcherObject, nmsStack);
List list = new ArrayList<>();
list.add(dataWatcherItem);
ReflectionUtil.setDeclaredField(packet, "b", list);

View file

@ -105,6 +105,13 @@ public class ReflectionUtil {
* @since 4.0.0
*/
public static final int VER = Integer.parseInt(VERSION.substring(1).split("_")[1]);
/**
* The raw minor version number.
* E.g. {@code v1_18_R2} to {@code 2}
*
* @since 4.0.0
*/
public static final int VER_MINOR = toInt(VERSION.substring(1).split("_")[2].substring(1), 0);
/**
* Mojang remapped their NMS in 1.17 https://www.spigotmc.org/threads/spigot-bungeecord-1-17.510208/#post-4184317
*/
@ -183,6 +190,18 @@ public class ReflectionUtil {
return VER >= version;
}
/**
* Checks whether the server version is equal or greater than the given version.
*
* @param major the major version to compare the server version with.
* @param minor the minor version to compare the server version with.
* @return true if the version is equal or newer, otherwise false.
* @since 4.0.0
*/
public static boolean supports(int major, int minor) {
return VER >= major && VER_MINOR >= minor;
}
private static Class<?> wrapperToPrimitive(Class<?> clazz) {
if (clazz == Boolean.class) return boolean.class;
if (clazz == Integer.class) return int.class;
@ -483,4 +502,8 @@ public class ReflectionUtil {
return this.version == 0 ? handle : this.handle;
}
}
private static int toInt(String string, int def) {
return string.isBlank() ? def : Integer.parseInt(string);
}
}