diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/forge_registry_alloc/ForgeRegistryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/forge_registry_alloc/ForgeRegistryMixin.java new file mode 100644 index 00000000..920136ae --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/forge_registry_alloc/ForgeRegistryMixin.java @@ -0,0 +1,65 @@ +package org.embeddedt.modernfix.forge.mixin.perf.forge_registry_alloc; + +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.registries.ForgeRegistry; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Locale; +import java.util.Map; + +@Mixin(value = ForgeRegistry.class, remap = false) +public abstract class ForgeRegistryMixin { + @Shadow @Final private Map> delegatesByName; + + @Shadow @Final private Map> delegatesByValue; + + /** + * @author embeddedt + * @reason stop allocating so many unneeded objects. stop. + */ + @Overwrite + public Holder.Reference getDelegateOrThrow(ResourceLocation location) { + Holder.Reference holder = delegatesByName.get(location); + + if (holder == null) { + throw new IllegalArgumentException(String.format(Locale.ENGLISH, "No delegate exists for location %s", location)); + } + + return holder; + } + + /** + * @author embeddedt + * @reason see above + */ + @Overwrite + public Holder.Reference getDelegateOrThrow(ResourceKey rkey) { + Holder.Reference holder = delegatesByName.get(rkey.location()); + + if (holder == null) { + throw new IllegalArgumentException(String.format(Locale.ENGLISH, "No delegate exists for key %s", rkey)); + } + + return holder; + } + + /** + * @author embeddedt + * @reason see above + */ + @Overwrite + public Holder.Reference getDelegateOrThrow(V value) { + Holder.Reference holder = delegatesByValue.get(value); + + if (holder == null) { + throw new IllegalArgumentException(String.format(Locale.ENGLISH, "No delegate exists for value %s", value)); + } + + return holder; + } +}