diff --git a/fabric-api-base/src/testmod/java/net/fabricmc/fabric/test/base/FabricApiBaseGameTest.java b/fabric-api-base/src/testmod/java/net/fabricmc/fabric/test/base/FabricApiBaseGameTest.java index 8f283a7c1f..8eb1d9e394 100644 --- a/fabric-api-base/src/testmod/java/net/fabricmc/fabric/test/base/FabricApiBaseGameTest.java +++ b/fabric-api-base/src/testmod/java/net/fabricmc/fabric/test/base/FabricApiBaseGameTest.java @@ -18,11 +18,8 @@ import org.spongepowered.asm.mixin.MixinEnvironment; -import net.minecraft.test.GameTest; import net.minecraft.test.TestContext; -//import net.fabricmc.fabric.api.gametest.v1.FabricGameTest; - public class FabricApiBaseGameTest { // TODO 22w42a //@GameTest(templateName = FabricGameTest.EMPTY_STRUCTURE) diff --git a/fabric-biome-api-v1/build.gradle b/fabric-biome-api-v1/build.gradle index 543bd160bb..cda88ad9b1 100644 --- a/fabric-biome-api-v1/build.gradle +++ b/fabric-biome-api-v1/build.gradle @@ -7,5 +7,6 @@ loom { testDependencies(project, [ ':fabric-api-base', - ':fabric-resource-loader-v0' + ':fabric-resource-loader-v0', + ':fabric-registry-sync-v0' ]) diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java index 08e12bc8c6..52dabae314 100644 --- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java +++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java @@ -36,7 +36,6 @@ import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; -import net.minecraft.world.level.LevelProperties; import net.fabricmc.fabric.api.biome.v1.BiomeModificationContext; import net.fabricmc.fabric.api.biome.v1.BiomeSelectionContext; @@ -103,7 +102,7 @@ private List getSortedModifiers() { } @SuppressWarnings("ConstantConditions") - public void finalizeWorldGen(DynamicRegistryManager impl, LevelProperties levelProperties) { + public void finalizeWorldGen(DynamicRegistryManager impl) { Stopwatch sw = Stopwatch.createStarted(); // Now that we apply biome modifications inside the MinecraftServer constructor, we should only ever do @@ -134,7 +133,7 @@ public void finalizeWorldGen(DynamicRegistryManager impl, LevelProperties levelP // Make a copy of the biome to allow selection contexts to see it unmodified, // But do so only once it's known anything wants to modify the biome at all - BiomeSelectionContext context = new BiomeSelectionContextImpl(impl, levelProperties, key, biome); + BiomeSelectionContext context = new BiomeSelectionContextImpl(impl, key, biome); BiomeModificationContextImpl modificationContext = null; for (ModifierRecord modifier : sortedModifiers) { diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeSelectionContextImpl.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeSelectionContextImpl.java index 77ee51a1ab..2581f30e7d 100644 --- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeSelectionContextImpl.java +++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeSelectionContextImpl.java @@ -30,21 +30,18 @@ import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.PlacedFeature; import net.minecraft.world.gen.structure.Structure; -import net.minecraft.world.level.LevelProperties; import net.fabricmc.fabric.api.biome.v1.BiomeSelectionContext; @ApiStatus.Internal public class BiomeSelectionContextImpl implements BiomeSelectionContext { private final DynamicRegistryManager dynamicRegistries; - private final LevelProperties levelProperties; private final RegistryKey key; private final Biome biome; private final RegistryEntry entry; - public BiomeSelectionContextImpl(DynamicRegistryManager dynamicRegistries, LevelProperties levelProperties, RegistryKey key, Biome biome) { + public BiomeSelectionContextImpl(DynamicRegistryManager dynamicRegistries, RegistryKey key, Biome biome) { this.dynamicRegistries = dynamicRegistries; - this.levelProperties = levelProperties; this.key = key; this.biome = biome; this.entry = dynamicRegistries.get(Registry.BIOME_KEY).getEntry(this.key).orElseThrow(); @@ -96,13 +93,13 @@ public Optional> getStructureKey(Structure structure) { @Override public boolean canGenerateIn(RegistryKey dimensionKey) { - DimensionOptions dimension = levelProperties.getGeneratorOptions().getDimensions().get(dimensionKey); + DimensionOptions dimension = dynamicRegistries.get(Registry.DIMENSION_KEY).get(dimensionKey); if (dimension == null) { return false; } - return dimension.getChunkGenerator().getBiomeSource().getBiomes().stream().anyMatch(entry -> entry.value() == biome); + return dimension.chunkGenerator().getBiomeSource().getBiomes().stream().anyMatch(entry -> entry.value() == biome); } @Override diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/MinecraftServerMixin.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/MinecraftServerMixin.java index 06411dda2a..299afecff6 100644 --- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/MinecraftServerMixin.java +++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/MinecraftServerMixin.java @@ -16,7 +16,6 @@ package net.fabricmc.fabric.mixin.biome; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -27,25 +26,24 @@ import net.minecraft.server.WorldGenerationProgressListener; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.Registry; -import net.minecraft.world.SaveProperties; +import net.minecraft.world.dimension.DimensionOptions; import net.fabricmc.fabric.impl.biome.NetherBiomeData; @Mixin(MinecraftServer.class) public class MinecraftServerMixin { @Shadow - @Final - protected SaveProperties saveProperties; - - @Shadow - @Final - private DynamicRegistryManager.Immutable registryManager; + private DynamicRegistryManager.Immutable getRegistryManager() { + throw new AssertionError(); + } @Inject(method = "createWorlds", at = @At("HEAD")) private void addNetherBiomes(WorldGenerationProgressListener worldGenerationProgressListener, CallbackInfo ci) { // This is the last point where we can safely modify worldgen related things // plus, this is server-side only, and DRM is easily accessible // please blame Mojang for using dynamic registry - this.saveProperties.getGeneratorOptions().getDimensions().stream().forEach(dimensionOptions -> NetherBiomeData.modifyBiomeSource(this.registryManager.get(Registry.BIOME_KEY), dimensionOptions.getChunkGenerator().getBiomeSource())); + Registry registry = getRegistryManager().get(Registry.DIMENSION_KEY); + + registry.stream().forEach(dimensionOptions -> NetherBiomeData.modifyBiomeSource(getRegistryManager().get(Registry.BIOME_KEY), dimensionOptions.chunkGenerator().getBiomeSource())); } } diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/modification/MinecraftServerMixin.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/modification/MinecraftServerMixin.java index 326e6e5258..8acfc053a6 100644 --- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/modification/MinecraftServerMixin.java +++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/modification/MinecraftServerMixin.java @@ -45,6 +45,6 @@ private void finalizeWorldGen(CallbackInfo ci) { throw new RuntimeException("Incompatible SaveProperties passed to MinecraftServer: " + saveProperties); } - BiomeModificationImpl.INSTANCE.finalizeWorldGen(getRegistryManager(), levelProperties); + BiomeModificationImpl.INSTANCE.finalizeWorldGen(getRegistryManager()); } } diff --git a/fabric-registry-sync-v0/build.gradle b/fabric-registry-sync-v0/build.gradle index 8f2bdc1fe4..0b8474ae92 100644 --- a/fabric-registry-sync-v0/build.gradle +++ b/fabric-registry-sync-v0/build.gradle @@ -1,6 +1,10 @@ archivesBaseName = "fabric-registry-sync-v0" version = getSubprojectVersion(project) +loom { + accessWidenerPath = file("src/main/resources/fabric-registry-sync-v0.accesswidener") +} + moduleDependencies(project, [ 'fabric-api-base', 'fabric-networking-api-v1' diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/FabricRegistryBuilder.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/FabricRegistryBuilder.java index 5eb5037679..88e21093c0 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/FabricRegistryBuilder.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/api/event/registry/FabricRegistryBuilder.java @@ -64,7 +64,7 @@ public static > FabricRegistryBuilder from * @return An instance of FabricRegistryBuilder */ public static FabricRegistryBuilder> createSimple(Class type, Identifier registryId) { - return from(new SimpleRegistry(RegistryKey.ofRegistry(registryId), Lifecycle.stable(), null)); + return from(new SimpleRegistry(RegistryKey.ofRegistry(registryId), Lifecycle.stable(), false)); } /** @@ -76,7 +76,7 @@ public static FabricRegistryBuilder> createSimple(Class * @return An instance of FabricRegistryBuilder */ public static FabricRegistryBuilder> createDefaulted(Class type, Identifier registryId, Identifier defaultId) { - return from(new DefaultedRegistry(defaultId.toString(), RegistryKey.ofRegistry(registryId), Lifecycle.stable(), null)); + return from(new DefaultedRegistry(defaultId.toString(), RegistryKey.ofRegistry(registryId), Lifecycle.stable(), false)); } private final R registry; diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/BootstrapMixin.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/BootstrapMixin.java index 5fa8e5e75e..8c7239556c 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/BootstrapMixin.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/BootstrapMixin.java @@ -29,6 +29,7 @@ import net.minecraft.fluid.Fluids; import net.minecraft.item.Items; import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.SimpleRegistry; import net.minecraft.world.biome.BiomeKeys; import net.fabricmc.fabric.impl.registry.sync.RegistrySyncManager; @@ -64,6 +65,12 @@ private static void initialize(CallbackInfo info) { @Redirect(method = "initialize", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/Registry;freezeRegistries()V")) private static void skipFreeze() { - // Don't freeze + Registry.freezeRegistries(); + + ((SimpleRegistry) Registry.REGISTRIES).frozen = false; + + for (Registry registry : Registry.REGISTRIES) { + ((SimpleRegistry) registry).frozen = false; + } } } diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/BuiltinRegistriesMixin.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/BuiltinRegistriesMixin.java new file mode 100644 index 0000000000..8470c68c3c --- /dev/null +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/BuiltinRegistriesMixin.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package net.fabricmc.fabric.mixin.registry.sync; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.SimpleRegistry; + +@Mixin(BuiltinRegistries.class) +public class BuiltinRegistriesMixin { + @Inject(method = "", at = @At("TAIL")) + private static void unfreezeBultinRegistries(CallbackInfo ci) { + ((SimpleRegistry) BuiltinRegistries.REGISTRIES).frozen = false; + + for (Registry registry : BuiltinRegistries.REGISTRIES) { + ((SimpleRegistry) registry).frozen = false; + } + } +} diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MinecraftServerMixin.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MinecraftServerMixin.java index 28e13cefd4..9504ff0168 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MinecraftServerMixin.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/MinecraftServerMixin.java @@ -25,7 +25,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.server.MinecraftServer; +import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.SimpleRegistry; import net.fabricmc.api.EnvType; import net.fabricmc.fabric.impl.registry.sync.trackers.vanilla.BlockInitTracker; @@ -41,6 +43,11 @@ private void beforeSetupServer(CallbackInfo info) { if (FabricLoader.getInstance().getEnvironmentType() == EnvType.SERVER) { // Freeze the registries on the server FABRIC_LOGGER.debug("Freezing registries"); + BuiltinRegistries.REGISTRIES.freeze(); + for (Registry registry : BuiltinRegistries.REGISTRIES) { + ((SimpleRegistry) registry).freeze(); + } + Registry.freezeRegistries(); BlockInitTracker.postFreeze(); } diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/RegistryMixin.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/RegistryMixin.java index 6cfe63f3b1..0624ecfda2 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/RegistryMixin.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/RegistryMixin.java @@ -21,8 +21,12 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.SimpleRegistry; import net.fabricmc.fabric.api.event.registry.RegistryAttribute; import net.fabricmc.fabric.api.event.registry.RegistryAttributeHolder; diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SimpleRegistryMixin.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SimpleRegistryMixin.java index 7db32106a4..6b57689286 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SimpleRegistryMixin.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/SimpleRegistryMixin.java @@ -155,7 +155,14 @@ private void add(RegistryKey> registryKey, V entry, Li } @Inject(method = "set", at = @At("RETURN")) - private void set(int rawId, RegistryKey> registryKey, V entry, Lifecycle lifecycle, CallbackInfoReturnable info) { + private void set(int rawId, RegistryKey> registryKey, V entry, Lifecycle lifecycle, CallbackInfoReturnable> info) { + // We need to restore the 1.19 behavior of binding the value to references immediately. + // Unfrozen registries cannot be interacted with otherwise, because the references would throw when + // trying to access their values. + if (info.getReturnValue() instanceof RegistryEntry.Reference reference) { + reference.method_45918(entry); + + } onChange(registryKey); } diff --git a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/class_7780Mixin.java b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/class_7780Mixin.java index e40b7c5610..b7bea40923 100644 --- a/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/class_7780Mixin.java +++ b/fabric-registry-sync-v0/src/main/java/net/fabricmc/fabric/mixin/registry/sync/class_7780Mixin.java @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2016, 2017, 2018, 2019 FabricMC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package net.fabricmc.fabric.mixin.registry.sync; import java.util.List; diff --git a/fabric-registry-sync-v0/src/main/resources/fabric-registry-sync-v0.accesswidener b/fabric-registry-sync-v0/src/main/resources/fabric-registry-sync-v0.accesswidener new file mode 100644 index 0000000000..5099af172c --- /dev/null +++ b/fabric-registry-sync-v0/src/main/resources/fabric-registry-sync-v0.accesswidener @@ -0,0 +1,4 @@ +accessWidener v2 named + +accessible field net/minecraft/util/registry/SimpleRegistry frozen Z +accessible method net/minecraft/util/registry/RegistryEntry$Reference method_45918 (Ljava/lang/Object;)V diff --git a/fabric-registry-sync-v0/src/main/resources/fabric-registry-sync-v0.mixins.json b/fabric-registry-sync-v0/src/main/resources/fabric-registry-sync-v0.mixins.json index aa23ba48ff..cb4fc621e6 100644 --- a/fabric-registry-sync-v0/src/main/resources/fabric-registry-sync-v0.mixins.json +++ b/fabric-registry-sync-v0/src/main/resources/fabric-registry-sync-v0.mixins.json @@ -6,6 +6,7 @@ "DebugChunkGeneratorAccessor", "RegistryAccessor", "BootstrapMixin", + "BuiltinRegistriesMixin", "ChunkSerializerMixin", "DynamicRegistryManagerMixin", "IdListMixin", diff --git a/fabric-registry-sync-v0/src/main/resources/fabric.mod.json b/fabric-registry-sync-v0/src/main/resources/fabric.mod.json index fe36dd055f..be43f19de3 100644 --- a/fabric-registry-sync-v0/src/main/resources/fabric.mod.json +++ b/fabric-registry-sync-v0/src/main/resources/fabric.mod.json @@ -36,6 +36,7 @@ "net.fabricmc.fabric.impl.registry.sync.FabricRegistryClientInit" ] }, + "accessWidener": "fabric-registry-sync-v0.accesswidener", "custom": { "fabric-api:module-lifecycle": "stable" } diff --git a/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java b/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java index 386bb29745..df836d7f5b 100644 --- a/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java +++ b/fabric-registry-sync-v0/src/testmod/java/net/fabricmc/fabric/test/registry/sync/RegistrySyncTest.java @@ -145,13 +145,13 @@ private void testBuiltInRegistrySync() { // Force-Initialize the dynamic registry manager, doing this in a Mod initializer would cause // further registrations into BuiltInRegistries to _NOT_ propagate into DynamicRegistryManager.BUILTIN - checkFeature(DynamicRegistryManager.createAndLoad(), f1Id); + checkFeature(DynamicRegistryManager.of(Registry.REGISTRIES), f1Id); ConfiguredFeature cf2 = new ConfiguredFeature<>(Feature.DESERT_WELL, DefaultFeatureConfig.INSTANCE); Identifier f2Id = new Identifier("registry_sync", "f2"); Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, f2Id, cf2); - DynamicRegistryManager impl2 = DynamicRegistryManager.createAndLoad(); + DynamicRegistryManager impl2 = DynamicRegistryManager.of(Registry.REGISTRIES); checkFeature(impl2, f1Id); checkFeature(impl2, f2Id); } diff --git a/fabric-resource-loader-v0/src/main/resources/fabric-resource-loader-v0.accesswidener b/fabric-resource-loader-v0/src/main/resources/fabric-resource-loader-v0.accesswidener index fb968e1bfa..a60e57afe3 100644 --- a/fabric-resource-loader-v0/src/main/resources/fabric-resource-loader-v0.accesswidener +++ b/fabric-resource-loader-v0/src/main/resources/fabric-resource-loader-v0.accesswidener @@ -1,5 +1,4 @@ accessWidener v2 named -accessible class net/minecraft/resource/NamespaceResourceManager$class_7682 accessible field net/minecraft/resource/NamespaceResourceManager type Lnet/minecraft/resource/ResourceType; accessible method net/minecraft/resource/NamespaceResourceManager getMetadataPath (Lnet/minecraft/util/Identifier;)Lnet/minecraft/util/Identifier; accessible method net/minecraft/resource/NamespaceResourceManager loadMetadata (Lnet/minecraft/resource/InputSupplier;)Lnet/minecraft/resource/metadata/ResourceMetadata; diff --git a/settings.gradle b/settings.gradle index 09bb81cf8a..81fdfd6fb3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -14,12 +14,12 @@ rootProject.name = "fabric-api" include 'fabric-api-base' //include 'fabric-api-lookup-api-v1' -//include 'fabric-biome-api-v1' +include 'fabric-biome-api-v1' //include 'fabric-blockrenderlayer-v1' include 'fabric-command-api-v2' //include 'fabric-content-registries-v0' include 'fabric-crash-report-info-v1' -include 'fabric-data-generation-api-v1' +//include 'fabric-data-generation-api-v1' //include 'fabric-dimensions-v1' //include 'fabric-entity-events-v1' //include 'fabric-events-interaction-v0'