From 7432b4fb8f6dd97ae19346c0c5e47fd8e1477a40 Mon Sep 17 00:00:00 2001
From: KennyTV <28825609+KennyTV@users.noreply.github.com>
Date: Sun, 12 Jan 2020 10:46:58 +0100
Subject: [PATCH] Fix Java 12 reflection / 1.13 compat
---
pom.xml | 6 ++--
.../listener/EnchantingListener.java | 5 +++-
.../reflection/ReflectionAPI.java | 29 ++++++++++++++++++-
3 files changed, 35 insertions(+), 5 deletions(-)
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) {