diff --git a/pom.xml b/pom.xml index a72aceb..60ccac2 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ org.projectlombok lombok - 1.16.18 + 1.18.10 provided @@ -42,7 +42,7 @@ us.myles viaversion - 2.1.3 + 2.2.2 provided @@ -50,7 +50,7 @@ org.spigotmc spigot-api - 1.12.2-R0.1-SNAPSHOT + 1.15.1-R0.1-SNAPSHOT provided diff --git a/src/main/java/de/gerrygames/viarewind/legacysupport/listener/EnchantingListener.java b/src/main/java/de/gerrygames/viarewind/legacysupport/listener/EnchantingListener.java index 3ac65dc..b5b19f4 100644 --- a/src/main/java/de/gerrygames/viarewind/legacysupport/listener/EnchantingListener.java +++ b/src/main/java/de/gerrygames/viarewind/legacysupport/listener/EnchantingListener.java @@ -13,13 +13,16 @@ import us.myles.ViaVersion.api.Via; public class EnchantingListener implements Listener { + private final boolean newMaterialNames = Material.getMaterial("LAPIS_LAZULI") != null; + private final Material lapisMaterial = newMaterialNames ? Material.LAPIS_LAZULI : Material.getMaterial("INK_SACK"); + @EventHandler public void onInventoryOpen(InventoryOpenEvent e) { if (!(e.getInventory() instanceof EnchantingInventory)) return; Player player = (Player) e.getPlayer(); if (Via.getAPI().getPlayerVersion(player)>5) return; PlayerInventory playerInventory = player.getInventory(); - ItemStack lapis = new ItemStack(Material.INK_SACK, 1, (short) 4); + ItemStack lapis = newMaterialNames ? new ItemStack(lapisMaterial) : new ItemStack(lapisMaterial, 1, (short) 4); int amount = 0; for (int i = 0; i fields = new HashMap<>(); private static Map methods = new HashMap<>(); + private static boolean staticFinalModificationBlocked; + + static { + try { + Field.class.getDeclaredField("modifiers"); + } catch (NoSuchFieldException ex) { + staticFinalModificationBlocked = true; + } + } public static Field getField(Class clazz, String fieldname) { String key = clazz.getName() + ":" + fieldname; @@ -41,7 +50,25 @@ public class ReflectionAPI { public static void setFieldNotFinal(Field field) { int modifiers = field.getModifiers(); if (!Modifier.isFinal(modifiers)) return; - setValuePrintException(Field.class, field, "modifiers", modifiers & ~Modifier.FINAL); + + if (staticFinalModificationBlocked) { + try { + Method getDeclaredFields0 = Class.class.getDeclaredMethod("getDeclaredFields0", boolean.class); + getDeclaredFields0.setAccessible(true); + Field[] fields = (Field[]) getDeclaredFields0.invoke(Field.class, false); + for (Field classField : fields) { + if ("modifiers".equals(classField.getName())) { + classField.setAccessible(true); + classField.set(field, modifiers & ~Modifier.FINAL); + break; + } + } + } catch (ReflectiveOperationException ex) { + ex.printStackTrace(); + } + } else { + setValuePrintException(Field.class, field, "modifiers", modifiers & ~Modifier.FINAL); + } } public static Constructor getEmptyConstructor(Class clazz) {