diff --git a/src/main/java/de/diddiz/LogBlock/util/Reflections.java b/src/main/java/de/diddiz/LogBlock/util/Reflections.java index 5c50cc2..83f820d 100644 --- a/src/main/java/de/diddiz/LogBlock/util/Reflections.java +++ b/src/main/java/de/diddiz/LogBlock/util/Reflections.java @@ -12,24 +12,49 @@ public class Reflections { public static boolean isSignWaxed(Sign sign) { try { if (FIELD_CraftBlockEntityState_snapshot == null) { - FIELD_CraftBlockEntityState_snapshot = sign.getClass().getSuperclass().getDeclaredField("snapshot"); - FIELD_CraftBlockEntityState_snapshot.setAccessible(true); + Class superClass = sign.getClass().getSuperclass(); + while (superClass != null) { + try { + FIELD_CraftBlockEntityState_snapshot = superClass.getDeclaredField("snapshot"); + FIELD_CraftBlockEntityState_snapshot.setAccessible(true); + break; + } catch (NoSuchFieldException ignored) { + } + superClass = superClass.getSuperclass(); + } + } + if (FIELD_CraftBlockEntityState_snapshot == null) { + LogBlock.getInstance().getLogger().log(Level.SEVERE, "Reflections: Sign field 'snapshot' not found"); + return false; } Object snapshot = FIELD_CraftBlockEntityState_snapshot.get(sign); if (snapshot == null) { + LogBlock.getInstance().getLogger().log(Level.SEVERE, "Reflections: Sign snapshot is null?"); return false; } if (FIELD_SignBlockEntity_isWaxed == null) { - for (Field f : snapshot.getClass().getDeclaredFields()) { - if (f.getType() == boolean.class) { - FIELD_SignBlockEntity_isWaxed = f; - FIELD_SignBlockEntity_isWaxed.setAccessible(true); + Class snapshotClass = snapshot.getClass(); + while (snapshotClass != null) { + for (Field f : snapshotClass.getDeclaredFields()) { + if (f.getType() == boolean.class) { + FIELD_SignBlockEntity_isWaxed = f; + FIELD_SignBlockEntity_isWaxed.setAccessible(true); + break; + } } + if (FIELD_SignBlockEntity_isWaxed != null) { + break; + } + snapshotClass = snapshotClass.getSuperclass(); } } - return FIELD_SignBlockEntity_isWaxed != null && FIELD_SignBlockEntity_isWaxed.getBoolean(snapshot); - } catch (SecurityException | NoSuchFieldException | IllegalArgumentException | IllegalAccessException e) { - LogBlock.getInstance().getLogger().log(Level.SEVERE, "Sign.isWaxed reflection failed", e); + if (FIELD_SignBlockEntity_isWaxed == null) { + LogBlock.getInstance().getLogger().log(Level.SEVERE, "Reflections: Sign field 'isWaxed' not found"); + return false; + } + return FIELD_SignBlockEntity_isWaxed.getBoolean(snapshot); + } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) { + LogBlock.getInstance().getLogger().log(Level.SEVERE, "Reflections: Sign.isWaxed reflection failed", e); } return false; }