From 41881dbb7d54a3347e75154e62933fc8548be0e9 Mon Sep 17 00:00:00 2001 From: szumielxd <43210079+szumielxd@users.noreply.github.com> Date: Wed, 24 Jul 2024 14:31:49 +0200 Subject: [PATCH] Fixed missing 'string' field in Skript 2.8 --- .../java/com/btk5h/skriptdb/SkriptUtil.java | 98 +++++++++++-------- 1 file changed, 58 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/btk5h/skriptdb/SkriptUtil.java b/src/main/java/com/btk5h/skriptdb/SkriptUtil.java index 86075cb..c95da2e 100644 --- a/src/main/java/com/btk5h/skriptdb/SkriptUtil.java +++ b/src/main/java/com/btk5h/skriptdb/SkriptUtil.java @@ -10,52 +10,70 @@ import java.util.Optional; public class SkriptUtil { - private static final Field STRING; - private static final Field EXPR; + private static final Field STRING; + private static final Field EXPR; - static { - Field _FIELD = null; - try { - _FIELD = VariableString.class.getDeclaredField("string"); - _FIELD.setAccessible(true); - } catch (NoSuchFieldException e) { - Skript.error("Skript's 'string' field could not be resolved."); - e.printStackTrace(); - } - STRING = _FIELD; + static { + STRING = tryGetOldStringField() + .or(() -> tryGetNewStringField()) + .orElseGet(() -> { + Skript.error("Skript's 'string' field could not be resolved."); + return null; + }); - try { - Optional> expressionInfo = Arrays.stream(VariableString.class.getDeclaredClasses()) - .filter(cls -> cls.getSimpleName().equals("ExpressionInfo")) - .findFirst(); - if (expressionInfo.isPresent()) { - Class expressionInfoClass = expressionInfo.get(); - _FIELD = expressionInfoClass.getDeclaredField("expr"); - _FIELD.setAccessible(true); - } else { - Skript.error("Skript's 'ExpressionInfo' class could not be resolved."); - } - } catch (NoSuchFieldException e) { - e.printStackTrace(); - Skript.error("Skript's 'expr' field could not be resolved."); + Field f = null; + try { + Optional> expressionInfo = Arrays.stream(VariableString.class.getDeclaredClasses()) + .filter(cls -> cls.getSimpleName().equals("ExpressionInfo")) + .findFirst(); + if (expressionInfo.isPresent()) { + Class expressionInfoClass = expressionInfo.get(); + f = expressionInfoClass.getDeclaredField("expr"); + f.setAccessible(true); + } else { + Skript.error("Skript's 'ExpressionInfo' class could not be resolved."); + } + } catch (NoSuchFieldException e) { + e.printStackTrace(); + Skript.error("Skript's 'expr' field could not be resolved."); + } + EXPR = f; } - EXPR = _FIELD; - } - public static Object[] getTemplateString(VariableString vs) { - try { - return (Object[]) STRING.get(vs); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); + public static Object[] getTemplateString(VariableString vs) { + try { + return (Object[]) STRING.get(vs); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } } - } - public static Expression getExpressionFromInfo(Object o) { - try { - return (Expression) EXPR.get(o); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); + public static Expression getExpressionFromInfo(Object o) { + try { + return (Expression) EXPR.get(o); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + private static Optional tryGetOldStringField() { + try { + Field f = VariableString.class.getDeclaredField("string"); + f.setAccessible(true); + return Optional.of(f); + } catch (NoSuchFieldException e) { + return Optional.empty(); + } + } + + private static Optional tryGetNewStringField() { + try { + Field f = VariableString.class.getDeclaredField("strings"); + f.setAccessible(true); + return Optional.of(f); + } catch (NoSuchFieldException e) { + return Optional.empty(); + } } - } }