diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/kubatech/api/helpers/ReflectionHelper.java | 205 | ||||
-rw-r--r-- | src/main/java/kubatech/tileentity/gregtech/multiblock/MTEExtremeEntityCrusher.java | 8 |
2 files changed, 3 insertions, 210 deletions
diff --git a/src/main/java/kubatech/api/helpers/ReflectionHelper.java b/src/main/java/kubatech/api/helpers/ReflectionHelper.java deleted file mode 100644 index 5c5bb1070e..0000000000 --- a/src/main/java/kubatech/api/helpers/ReflectionHelper.java +++ /dev/null @@ -1,205 +0,0 @@ -/* - * spotless:off - * KubaTech - Gregtech Addon - * Copyright (C) 2022 - 2024 kuba6000 - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see <https://www.gnu.org/licenses/>. - * spotless:on - */ - -package kubatech.api.helpers; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.net.JarURLConnection; -import java.net.URL; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Objects; -import java.util.jar.JarFile; -import java.util.stream.Collectors; - -import net.minecraft.launchwrapper.Launch; - -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.tree.ClassNode; - -public class ReflectionHelper { - - private static class _FieldsMethods { - - final HashMap<String, Field> fields = new HashMap<>(); - final HashMap<String, Method> methods = new HashMap<>(); - } - - private static final HashMap<String, _FieldsMethods> classes = new HashMap<>(); - - @SuppressWarnings("unchecked") - public static <T> T getField(Object obj, String fieldName, T defaultvalue) { - Class<?> cl = obj.getClass(); - String clName = cl.getName(); - HashMap<String, Field> classmap = classes.computeIfAbsent(clName, s -> new _FieldsMethods()).fields; - try { - if (classmap.containsKey(fieldName)) { - Field f = classmap.get(fieldName); - if (f == null) return defaultvalue; - return (T) f.get(obj); - } - boolean exceptionDetected; - Field f = null; - do { - exceptionDetected = false; - try { - f = cl.getDeclaredField(fieldName); - f.setAccessible(true); - } catch (Exception ex) { - exceptionDetected = true; - cl = cl.getSuperclass(); - } - } while (exceptionDetected && !cl.equals(Object.class)); - classmap.put(fieldName, f); - if (f == null) return defaultvalue; - return (T) f.get(obj); - } catch (Exception ex) { - return defaultvalue; - } - } - - public static <T> boolean setField(Object obj, String fieldName, T value) { - Class<?> cl = obj.getClass(); - String clName = cl.getName(); - HashMap<String, Field> classmap = classes.computeIfAbsent(clName, s -> new _FieldsMethods()).fields; - try { - if (classmap.containsKey(fieldName)) { - Field f = classmap.get(fieldName); - if (f == null) return false; - f.set(obj, value); - return true; - } - boolean exceptionDetected; - Field f = null; - do { - exceptionDetected = false; - try { - f = cl.getDeclaredField(fieldName); - f.setAccessible(true); - } catch (Exception ex) { - exceptionDetected = true; - cl = cl.getSuperclass(); - } - } while (exceptionDetected && !cl.equals(Object.class)); - classmap.put(fieldName, f); - if (f == null) return false; - f.set(obj, value); - return true; - } catch (Exception ex) { - return false; - } - } - - public static <T> T getField(Object obj, String fieldName) { - return getField(obj, fieldName, null); - } - - @SuppressWarnings("unchecked") - public static <T> T callMethod(Object obj, String methodName, T defaultValue, Object... args) { - Class<?> cl = obj.getClass(); - String clName = cl.getName(); - HashMap<String, Method> classmap = classes.computeIfAbsent(clName, s -> new _FieldsMethods()).methods; - StringBuilder builder = new StringBuilder(methodName); - Class<?>[] argsTypes = new Class<?>[args.length]; - for (int i = 0; i < args.length; i++) { - Class<?> arg = args[i].getClass(); - builder.append(";") - .append(arg.getSimpleName()); - argsTypes[i] = arg; - } - String methodNameUnique = builder.toString(); - try { - if (classmap.containsKey(methodNameUnique)) { - Method m = classmap.get(methodNameUnique); - if (m == null) return defaultValue; - return (T) m.invoke(obj, args); - } - boolean exceptionDetected; - Method m = null; - do { - exceptionDetected = false; - try { - m = cl.getDeclaredMethod(methodName, argsTypes); - m.setAccessible(true); - } catch (Exception ex) { - exceptionDetected = true; - cl = cl.getSuperclass(); - } - } while (exceptionDetected && !cl.equals(Object.class)); - classmap.put(methodNameUnique, m); - if (m == null) return defaultValue; - return (T) m.invoke(obj, args); - } catch (Exception ex) { - return defaultValue; - } - } - - /** - * Gets all classes in a specific package path, works only for jar files. - * - * @param packageName The package name - * @return The class nodes - */ - public static Collection<ClassNode> getClasses(String packageName) throws IOException { - ClassLoader classLoader = Thread.currentThread() - .getContextClassLoader(); - assert classLoader != null; - String packagePath = packageName.replace('.', '/'); - URL resource = classLoader.getResource(packagePath); - if (resource == null) throw new FileNotFoundException(); - if (!resource.getProtocol() - .equals("jar")) return Collections.emptySet(); - try (JarFile jar = ((JarURLConnection) resource.openConnection()).getJarFile()) { - return jar.stream() - .filter( - j -> !j.isDirectory() && j.getName() - .startsWith(packagePath) - && j.getName() - .endsWith(".class")) - .map(j -> { - try { - String name = j.getName(); - URL jarResource = Launch.classLoader.getResource(name); - if (jarResource == null) return null; - byte[] bytes; - try (InputStream is = jarResource.openStream()) { - bytes = new byte[(int) j.getSize()]; - if (is.read(bytes) != bytes.length) return null; - if (is.available() > 0) return null; - } - - ClassNode cn = new ClassNode(); - ClassReader cr = new ClassReader(bytes); - cr.accept(cn, 0); - - return cn; - } catch (IOException ignored) {} - return null; - }) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - } - } -} diff --git a/src/main/java/kubatech/tileentity/gregtech/multiblock/MTEExtremeEntityCrusher.java b/src/main/java/kubatech/tileentity/gregtech/multiblock/MTEExtremeEntityCrusher.java index 07a3c3deb1..7268f9f3cd 100644 --- a/src/main/java/kubatech/tileentity/gregtech/multiblock/MTEExtremeEntityCrusher.java +++ b/src/main/java/kubatech/tileentity/gregtech/multiblock/MTEExtremeEntityCrusher.java @@ -122,7 +122,6 @@ import gregtech.api.render.TextureFactory; import gregtech.api.util.GTUtility; import gregtech.api.util.MultiblockTooltipBuilder; import kubatech.Tags; -import kubatech.api.helpers.ReflectionHelper; import kubatech.api.implementations.KubaTechGTMultiBlockBase; import kubatech.api.tileentity.CustomTileEntityPacketHandler; import kubatech.api.utils.ModUtils; @@ -433,8 +432,7 @@ public class MTEExtremeEntityCrusher extends KubaTechGTMultiBlockBase<MTEExtreme if (this.mMaxProgresstime == 0) return; if (event.mrs.equals(masterStoneRitual) && event.ritualKey.equals(WellOfSufferingRitualName)) { Rituals ritual = Rituals.ritualMap.get(WellOfSufferingRitualName); - if (ritual != null && ritual.effect instanceof RitualEffectWellOfSuffering) { - RitualEffectWellOfSuffering effect = (RitualEffectWellOfSuffering) ritual.effect; + if (ritual != null && ritual.effect instanceof RitualEffectWellOfSuffering effect) { event.setCanceled(true); // we will handle that String owner = event.mrs.getOwner(); int currentEssence = SoulNetworkHandler.getCurrentEssence(owner); @@ -463,12 +461,12 @@ public class MTEExtremeEntityCrusher extends KubaTechGTMultiBlockBase<MTEExtreme * (effect.canDrainReagent( event.mrs, ReagentRegistry.offensaReagent, - ReflectionHelper.getField(effect, "offensaDrain", 3), + RitualEffectWellOfSuffering.offensaDrain, true) ? 2 : 1) * (effect.canDrainReagent( event.mrs, ReagentRegistry.tenebraeReagent, - ReflectionHelper.getField(effect, "tennebraeDrain", 5), + RitualEffectWellOfSuffering.tennebraeDrain, true) ? 2 : 1), true); |