diff --git a/src/main/java/com/minelittlepony/unicopia/forgebullshit/RegistryLockSpinner.java b/src/main/java/com/minelittlepony/unicopia/forgebullshit/RegistryLockSpinner.java index 2648c782..9f3fbbf3 100644 --- a/src/main/java/com/minelittlepony/unicopia/forgebullshit/RegistryLockSpinner.java +++ b/src/main/java/com/minelittlepony/unicopia/forgebullshit/RegistryLockSpinner.java @@ -1,11 +1,14 @@ package com.minelittlepony.unicopia.forgebullshit; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import net.minecraft.util.registry.RegistryNamespaced; +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; import net.minecraftforge.registries.ILockableRegistry; -public class RegistryLockSpinner { +public final class RegistryLockSpinner { public static void unlock(RegistryNamespaced registry) { if (registry instanceof ILockableRegistry) { @@ -21,15 +24,32 @@ public class RegistryLockSpinner { } public static void commit(RegistryNamespaced registry, V from, V to, Class inClass) { - registry.register(registry.getIDForObject(from), registry.getNameForObject(from), to); + Field modifieres = null; + try { + modifieres = Field.class.getDeclaredField("modifiers"); + modifieres.setAccessible(true); + } catch (NoSuchFieldException | SecurityException e1) { + e1.printStackTrace(); + } + for (Field i : inClass.getDeclaredFields()) { try { if (i.get(null) == from) { + i.setAccessible(true); + + if (Modifier.isFinal(i.getModifiers())) { + if (modifieres == null) { + continue; + } + + modifieres.setInt(i, i.getModifiers() & ~Modifier.FINAL); + } + i.set(null, to); } - } catch (IllegalArgumentException | IllegalAccessException e) { + } catch (IllegalArgumentException | IllegalAccessException | SecurityException e) { e.printStackTrace(); } }