diff --git a/fabric/src/datagen/java/lgbt/greenhouse/menderman/datagen/MendermanDataGenerator_TagsProvider_Multiver.java b/fabric/src/datagen/java/lgbt/greenhouse/menderman/datagen/MendermanDataGenerator_TagsProvider_Multiver.java new file mode 100644 index 0000000..ae08a6d --- /dev/null +++ b/fabric/src/datagen/java/lgbt/greenhouse/menderman/datagen/MendermanDataGenerator_TagsProvider_Multiver.java @@ -0,0 +1,44 @@ +package lgbt.greenhouse.menderman.datagen; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +import net.minecraft.data.tags.TagAppender; +import net.minecraft.tags.TagKey; + +import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagsProvider; + +final class MendermanDataGenerator_TagsProvider_Multiver { + // MHs for fast non-reflective access + private static final MethodHandle unbound$FabricTagsProvider$builder; + private final MethodHandle FabricTagsProvider$builder; + + static { + try { + MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(FabricTagsProvider.FabricIntrinsicHolderTagsProvider.class, MethodHandles.lookup()); + + unbound$FabricTagsProvider$builder = lookup + .findVirtual( + FabricTagsProvider.FabricIntrinsicHolderTagsProvider.class, + "valueLookupBuilder", + MethodType.methodType(TagAppender.class, TagKey.class) + ); + } catch (NoSuchMethodException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + MendermanDataGenerator_TagsProvider_Multiver(FabricTagsProvider.FabricIntrinsicHolderTagsProvider provider) { + FabricTagsProvider$builder = unbound$FabricTagsProvider$builder.bindTo(provider); + } + + @SuppressWarnings("unchecked") // checked in parameters + public TagAppender builder(TagKey tag) { + try { + return (TagAppender) FabricTagsProvider$builder.invokeExact(tag); + } catch (Throwable e) { + throw new RuntimeException(e); + } + } +}