Fixed Registry handling

This commit is contained in:
Frank 2022-10-25 22:45:42 +02:00
parent 73687e3401
commit 95ea99e44d
13 changed files with 289 additions and 75 deletions

View file

@ -26,6 +26,29 @@ repositories {
loom { loom {
accessWidenerPath = file("src/main/resources/bclib.accesswidener") accessWidenerPath = file("src/main/resources/bclib.accesswidener")
runs {
// This adds a new gradle task that runs the datagen API: "gradlew runDatagenClient"
datagenClient {
inherit client
name "Data Generation"
vmArg "-Dfabric-api.datagen"
vmArg "-Dfabric-api.datagen.output-dir=${file("src/main/generated")}"
vmArg "-Dfabric-api.datagen.strict-validation"
runDir "build/datagen"
}
}
}
// Add the datagenned files into the jar.
sourceSets {
main {
resources {
srcDirs += [
'src/main/generated'
]
}
}
} }
dependencies { dependencies {

View file

@ -10,6 +10,7 @@ import net.minecraft.core.Holder;
import net.minecraft.core.MappedRegistry; import net.minecraft.core.MappedRegistry;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.KeyDispatchDataCodec; import net.minecraft.util.KeyDispatchDataCodec;
@ -87,40 +88,37 @@ public class BCLBiomeRegistry {
@ApiStatus.Internal @ApiStatus.Internal
public static Holder<BCLBiome> bootstrap(Registry<BCLBiome> registry) { public static Holder<BCLBiome> bootstrap(Registry<BCLBiome> registry) {
//TODO:1.19.3 Registry is frozen at this point BuiltinRegistries.register(registry, BiomeAPI.SMALL_END_ISLANDS.getBCLBiomeKey(), BiomeAPI.SMALL_END_ISLANDS);
// BuiltinRegistries.register(registry, BiomeAPI.SMALL_END_ISLANDS.getBCLBiomeKey(), BiomeAPI.SMALL_END_ISLANDS); BuiltinRegistries.register(registry, BiomeAPI.END_BARRENS.getBCLBiomeKey(), BiomeAPI.END_BARRENS);
// BuiltinRegistries.register(registry, BiomeAPI.END_BARRENS.getBCLBiomeKey(), BiomeAPI.END_BARRENS); BuiltinRegistries.register(registry, BiomeAPI.END_HIGHLANDS.getBCLBiomeKey(), BiomeAPI.END_HIGHLANDS);
// BuiltinRegistries.register(registry, BiomeAPI.END_HIGHLANDS.getBCLBiomeKey(), BiomeAPI.END_HIGHLANDS); BuiltinRegistries.register(registry, BiomeAPI.END_MIDLANDS.getBCLBiomeKey(), BiomeAPI.END_MIDLANDS);
// BuiltinRegistries.register(registry, BiomeAPI.END_MIDLANDS.getBCLBiomeKey(), BiomeAPI.END_MIDLANDS); BuiltinRegistries.register(registry, BiomeAPI.THE_END.getBCLBiomeKey(), BiomeAPI.THE_END);
// BuiltinRegistries.register(registry, BiomeAPI.THE_END.getBCLBiomeKey(), BiomeAPI.THE_END); BuiltinRegistries.register(
// BuiltinRegistries.register( registry,
// registry, BiomeAPI.BASALT_DELTAS_BIOME.getBCLBiomeKey(),
// BiomeAPI.BASALT_DELTAS_BIOME.getBCLBiomeKey(), BiomeAPI.BASALT_DELTAS_BIOME
// BiomeAPI.BASALT_DELTAS_BIOME );
// ); BuiltinRegistries.register(
// BuiltinRegistries.register( registry,
// registry, BiomeAPI.SOUL_SAND_VALLEY_BIOME.getBCLBiomeKey(),
// BiomeAPI.SOUL_SAND_VALLEY_BIOME.getBCLBiomeKey(), BiomeAPI.SOUL_SAND_VALLEY_BIOME
// BiomeAPI.SOUL_SAND_VALLEY_BIOME );
// ); BuiltinRegistries.register(
// BuiltinRegistries.register( registry,
// registry, BiomeAPI.WARPED_FOREST_BIOME.getBCLBiomeKey(),
// BiomeAPI.WARPED_FOREST_BIOME.getBCLBiomeKey(), BiomeAPI.WARPED_FOREST_BIOME
// BiomeAPI.WARPED_FOREST_BIOME );
// ); BuiltinRegistries.register(
// BuiltinRegistries.register( registry,
// registry, BiomeAPI.CRIMSON_FOREST_BIOME.getBCLBiomeKey(),
// BiomeAPI.CRIMSON_FOREST_BIOME.getBCLBiomeKey(), BiomeAPI.CRIMSON_FOREST_BIOME
// BiomeAPI.CRIMSON_FOREST_BIOME );
// ); BuiltinRegistries.register(
// BuiltinRegistries.register( registry,
// registry, BiomeAPI.NETHER_WASTES_BIOME.getBCLBiomeKey(),
// BiomeAPI.NETHER_WASTES_BIOME.getBCLBiomeKey(), BiomeAPI.NETHER_WASTES_BIOME
// BiomeAPI.NETHER_WASTES_BIOME );
// ); return BuiltinRegistries.register(registry, EMPTY_BIOME.getBCLBiomeKey(), EMPTY_BIOME);
// return BuiltinRegistries.register(registry, EMPTY_BIOME.getBCLBiomeKey(), EMPTY_BIOME);
return Holder.direct(EMPTY_BIOME);
} }
public static BCLBiome get(ResourceLocation loc) { public static BCLBiome get(ResourceLocation loc) {

View file

@ -1,6 +1,9 @@
package org.betterx.bclib.mixin.common; package org.betterx.bclib.mixin.common;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry;
import com.mojang.serialization.Lifecycle; import com.mojang.serialization.Lifecycle;
import net.minecraft.core.MappedRegistry;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.WritableRegistry; import net.minecraft.core.WritableRegistry;
import net.minecraft.data.BuiltinRegistries; import net.minecraft.data.BuiltinRegistries;
@ -27,12 +30,11 @@ public abstract class BuiltinRegistriesMixin {
//this needs to be added BEFORE the WORLD_PRESET-Registry. Otherwise decoding will fail! //this needs to be added BEFORE the WORLD_PRESET-Registry. Otherwise decoding will fail!
@Inject(method = "<clinit>", at = @At(value = "INVOKE", target = "Lnet/minecraft/data/BuiltinRegistries;registerSimple(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/data/BuiltinRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry;", ordinal = 0)) @Inject(method = "<clinit>", at = @At(value = "INVOKE", target = "Lnet/minecraft/data/BuiltinRegistries;registerSimple(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/data/BuiltinRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry;", ordinal = 0))
private static void bcl_registerBuiltin(CallbackInfo ci) { private static void bcl_registerBuiltin(CallbackInfo ci) {
//TODO: 1.19.3 reenable BCLBiomeRegistry.BUILTIN_BCL_BIOMES = internalRegister(
// BCLBiomeRegistry.BUILTIN_BCL_BIOMES = internalRegister( BCLBiomeRegistry.BCL_BIOMES_REGISTRY,
// BCLBiomeRegistry.BCL_BIOMES_REGISTRY, (MappedRegistry) BCLBiomeRegistry.BUILTIN_BCL_BIOMES,
// (MappedRegistry) BCLBiomeRegistry.BUILTIN_BCL_BIOMES, BCLBiomeRegistry::bootstrap,
// BCLBiomeRegistry::bootstrap, Lifecycle.stable()
// Lifecycle.stable() );
// );
} }
} }

View file

@ -1,14 +1,16 @@
package org.betterx.bclib.registry; package org.betterx.bclib.registry;
import org.betterx.bclib.client.gui.screens.WorldSetupScreen;
import org.betterx.worlds.together.worldPreset.client.WorldPresetsClient;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class PresetsRegistryClient { public class PresetsRegistryClient {
public static void onLoad() { public static void onLoad() {
//TODO:1.19.3 Disabled for now WorldPresetsClient.registerCustomizeUI(PresetsRegistry.BCL_WORLD, (createWorldScreen, worldCreationContext) -> {
// WorldPresetsClient.registerCustomizeUI(PresetsRegistry.BCL_WORLD, (createWorldScreen, worldCreationContext) -> { return new WorldSetupScreen(createWorldScreen, worldCreationContext);
// return new WorldSetupScreen(createWorldScreen, worldCreationContext); });
// });
} }
} }

View file

@ -0,0 +1,121 @@
package org.betterx.worlds.together;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry;
import org.betterx.worlds.together.surfaceRules.AssignedSurfaceRule;
import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.Encoder;
import com.mojang.serialization.JsonOps;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.data.CachedOutput;
import net.minecraft.data.DataProvider;
import net.minecraft.data.PackOutput;
import net.minecraft.resources.RegistryDataLoader;
import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceKey;
import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint;
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricBuiltinRegistriesProvider;
import com.google.gson.JsonElement;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class WorldsTogetherDatagen implements DataGeneratorEntrypoint {
@Override
public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) {
fabricDataGenerator.addProvider(FabricBuiltinRegistriesProvider.forCurrentMod()
.apply(fabricDataGenerator));
fabricDataGenerator.addProvider(CustomRegistriesDataProvider::new);
}
public static class CustomRegistriesDataProvider implements DataProvider {
public static final List<RegistryDataLoader.RegistryData<?>> REGISTRIES = List.of(
new RegistryDataLoader.RegistryData<>(BCLBiomeRegistry.BCL_BIOMES_REGISTRY, BCLBiome.CODEC),
new RegistryDataLoader.RegistryData<>(
SurfaceRuleRegistry.SURFACE_RULES_REGISTRY,
AssignedSurfaceRule.CODEC
)
);
private final PackOutput output;
public CustomRegistriesDataProvider(FabricDataGenerator generator) {
this.output = generator.getVanillaPackOutput();
}
@Override
public void run(CachedOutput cachedOutput) {
RegistryAccess.Frozen registryAccess = BuiltinRegistries.createAccess();
RegistryOps<JsonElement> dynamicOps = RegistryOps.create(JsonOps.INSTANCE, registryAccess);
REGISTRIES.forEach(registryData -> this.dumpRegistryCap(
cachedOutput,
registryAccess,
dynamicOps,
(RegistryDataLoader.RegistryData) registryData
));
}
private <T> void dumpRegistryCap(
CachedOutput cachedOutput,
RegistryAccess registryAccess,
DynamicOps<JsonElement> dynamicOps,
RegistryDataLoader.RegistryData<T> registryData
) {
ResourceKey<? extends Registry<T>> resourceKey = registryData.key();
Registry<T> registry = registryAccess.registryOrThrow(resourceKey);
PackOutput.PathProvider pathProvider = this.output.createPathProvider(
PackOutput.Target.DATA_PACK,
resourceKey.location().getPath()
);
for (Map.Entry<ResourceKey<T>, T> entry : registry.entrySet()) {
dumpValue(
pathProvider.json(entry.getKey().location()),
cachedOutput,
dynamicOps,
registryData.elementCodec(),
entry.getValue()
);
}
}
private static <E> void dumpValue(
Path path,
CachedOutput cachedOutput,
DynamicOps<JsonElement> dynamicOps,
Encoder<E> encoder,
E object
) {
try {
Optional<JsonElement> optional = encoder.encodeStart(dynamicOps, object)
.resultOrPartial(string -> WorldsTogether.LOGGER.error(
"Couldn't serialize element {}: {}",
path,
string
));
if (optional.isPresent()) {
DataProvider.saveStable(cachedOutput, optional.get(), path);
}
} catch (IOException iOException) {
WorldsTogether.LOGGER.error("Couldn't save element {}", path, iOException);
}
}
@Override
public String getName() {
return "BCL Registries";
}
}
}

View file

@ -0,0 +1,26 @@
package org.betterx.worlds.together.mixin.common;
import net.minecraft.data.Main;
import org.spongepowered.asm.mixin.Mixin;
@Mixin(Main.class)
public class MainDataMixin {
// @Inject(method = "createStandardGenerator", at = @At("RETURN"))
// private static void wt_createStandardGenerator(
// Path path,
// Collection<Path> collection,
// boolean isClient,
// boolean isServer,
// boolean isDev,
// boolean reports,
// boolean validate,
// WorldVersion worldVersion,
// boolean alwaysGenerate,
// CallbackInfoReturnable<DataGenerator> cir
// ) {
// DataGenerator dataGenerator = cir.getReturnValue();
// dataGenerator.addProvider(isServer, new SurfaceRulesDatapackGenerator(dataGenerator.getVanillaPackOutput()));
// cir.setReturnValue(dataGenerator);
// }
}

View file

@ -1,12 +1,38 @@
package org.betterx.worlds.together.mixin.common; package org.betterx.worlds.together.mixin.common;
import net.minecraft.core.RegistryAccess; import org.betterx.worlds.together.surfaceRules.AssignedSurfaceRule;
import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry;
import net.minecraft.resources.RegistryDataLoader;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(RegistryAccess.class) import java.util.ArrayList;
public interface RegistryAccessMixin { import java.util.List;
@Mixin(RegistryDataLoader.class)
public abstract class RegistryAccessMixin {
@Accessor("WORLDGEN_REGISTRIES")
@Mutable
static void wt_set_WORLDGEN_REGISTRIES(List<RegistryDataLoader.RegistryData<?>> list) {
//SHADOWED
}
@Inject(method = "<clinit>", at = @At("TAIL"))
private static void wt_init(CallbackInfo ci) {
List<RegistryDataLoader.RegistryData<?>> enhanced = new ArrayList(RegistryDataLoader.WORLDGEN_REGISTRIES.size() + 1);
enhanced.addAll(RegistryDataLoader.WORLDGEN_REGISTRIES);
enhanced.add(new RegistryDataLoader.RegistryData<>(
SurfaceRuleRegistry.SURFACE_RULES_REGISTRY,
AssignedSurfaceRule.CODEC
));
wt_set_WORLDGEN_REGISTRIES(enhanced);
}
//TODO: 1.19.3 This will probably be a new kind of DataProvider. //TODO: 1.19.3 This will probably be a new kind of DataProvider.
// @ModifyArg(method = "<clinit>", at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;make(Ljava/util/function/Supplier;)Ljava/lang/Object;")) // @ModifyArg(method = "<clinit>", at = @At(value = "INVOKE", target = "Lnet/minecraft/Util;make(Ljava/util/function/Supplier;)Ljava/lang/Object;"))
// private static Supplier<ImmutableMap<ResourceKey<Registry<?>>, RegistryAccess.RegistryData<?>>> together_addRegistry( // private static Supplier<ImmutableMap<ResourceKey<Registry<?>>, RegistryAccess.RegistryData<?>>> together_addRegistry(

View file

@ -1,9 +1,13 @@
package org.betterx.worlds.together.mixin.common; package org.betterx.worlds.together.mixin.common;
import org.betterx.worlds.together.levelgen.WorldGenUtil;
import org.betterx.worlds.together.worldPreset.WorldPresets;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.presets.WorldPreset; import net.minecraft.world.level.levelgen.presets.WorldPreset;
import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.structure.StructureSet;
@ -12,6 +16,8 @@ import net.minecraft.world.level.levelgen.synth.NormalNoise;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;
@Mixin(net.minecraft.world.level.levelgen.presets.WorldPresets.Bootstrap.class) @Mixin(net.minecraft.world.level.levelgen.presets.WorldPresets.Bootstrap.class)
public abstract class WorldPresetsBootstrapMixin { public abstract class WorldPresetsBootstrapMixin {
@ -43,26 +49,26 @@ public abstract class WorldPresetsBootstrapMixin {
//see WorldPresets.register //see WorldPresets.register
//TODO: 1.19.3 //TODO: 1.19.3
// @ModifyArg(method = "run", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap;registerCustomOverworldPreset(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;)Lnet/minecraft/core/Holder;")) @ModifyArg(method = "run", at = @At(value = "INVOKE", ordinal = 0, target = "Lnet/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap;registerCustomOverworldPreset(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/LevelStem;)Lnet/minecraft/core/Holder;"))
// private LevelStem bcl_getOverworldStem(LevelStem overworldStem) { private LevelStem bcl_getOverworldStem(LevelStem overworldStem) {
// WorldGenUtil.Context netherContext = new WorldGenUtil.Context( WorldGenUtil.Context netherContext = new WorldGenUtil.Context(
// this.biomes, this.biomes,
// this.netherDimensionType, this.netherDimensionType,
// this.structureSets, this.structureSets,
// this.noises, this.noises,
// this.netherNoiseSettings this.netherNoiseSettings
// ); );
// WorldGenUtil.Context endContext = new WorldGenUtil.Context( WorldGenUtil.Context endContext = new WorldGenUtil.Context(
// this.biomes, this.biomes,
// this.endDimensionType, this.endDimensionType,
// this.structureSets, this.structureSets,
// this.noises, this.noises,
// this.endNoiseSettings this.endNoiseSettings
// ); );
//
// WorldPresets.bootstrapPresets(presets, overworldStem, netherContext, endContext); WorldPresets.bootstrapPresets(presets, overworldStem, netherContext, endContext);
//
// return overworldStem; return overworldStem;
// } }
} }

View file

@ -56,6 +56,14 @@ public final class Logger {
LOGGER.error(modPref + message, obj, ex); LOGGER.error(modPref + message, obj, ex);
} }
public void error(String message, Object o1, Object o2, Exception ex) {
LOGGER.error(modPref + message, o1, o2, ex);
}
public void error(String message, Object o1, Object o2) {
LOGGER.error(modPref + message, o1, o2);
}
public void error(String message, Exception ex) { public void error(String message, Exception ex) {
LOGGER.error(modPref + message, ex); LOGGER.error(modPref + message, ex);
} }

View file

@ -16,7 +16,6 @@ import net.minecraft.client.gui.screens.worldselection.WorldGenSettingsComponent
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.data.BuiltinRegistries;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.Tag;
import net.minecraft.resources.RegistryOps; import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
@ -44,7 +43,8 @@ public class WorldBootstrap {
public static RegistryAccess getLastRegistryAccessOrElseBuiltin() { public static RegistryAccess getLastRegistryAccessOrElseBuiltin() {
//TODO: 1.19.3 ther no longer is a general builtin ACCESS //TODO: 1.19.3 ther no longer is a general builtin ACCESS
if (LAST_REGISTRY_ACCESS == null) return BuiltinRegistries.createAccess(); // if (LAST_REGISTRY_ACCESS == null)
// return BuiltinRegistries.;
return LAST_REGISTRY_ACCESS; return LAST_REGISTRY_ACCESS;
} }

View file

@ -31,8 +31,7 @@ public class WorldPresets {
private static ResourceKey<WorldPreset> DEFAULT = net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL; private static ResourceKey<WorldPreset> DEFAULT = net.minecraft.world.level.levelgen.presets.WorldPresets.NORMAL;
public static Holder<WorldPreset> get(RegistryAccess access, ResourceKey<WorldPreset> key) { public static Holder<WorldPreset> get(RegistryAccess access, ResourceKey<WorldPreset> key) {
//TODO: 1.19.3 there is no longer a builtin registry acccess return access
return ((access != null) ? access : BuiltinRegistries.createAccess())
.registryOrThrow(Registry.WORLD_PRESET_REGISTRY) .registryOrThrow(Registry.WORLD_PRESET_REGISTRY)
.getHolderOrThrow(key); .getHolderOrThrow(key);
} }
@ -90,8 +89,7 @@ public class WorldPresets {
for (Map.Entry<ResourceKey<WorldPreset>, PresetBuilder> e : BUILDERS.entrySet()) { for (Map.Entry<ResourceKey<WorldPreset>, PresetBuilder> e : BUILDERS.entrySet()) {
TogetherWorldPreset preset = e.getValue().create(overworldStem, netherContext, endContext); TogetherWorldPreset preset = e.getValue().create(overworldStem, netherContext, endContext);
//TODO: 1.19.3 already frozen BuiltinRegistries.register(presets, e.getKey(), preset);
//BuiltinRegistries.register(presets, e.getKey(), preset);
} }
BUILDERS = null; BUILDERS = null;
} }

View file

@ -35,6 +35,9 @@
], ],
"emi": [ "emi": [
"org.betterx.bclib.integration.emi.EMIPlugin" "org.betterx.bclib.integration.emi.EMIPlugin"
],
"fabric-datagen": [
"org.betterx.worlds.together.WorldsTogetherDatagen"
] ]
}, },
"accessWidener": "bclib.accesswidener", "accessWidener": "bclib.accesswidener",

View file

@ -8,6 +8,7 @@
"BuiltinRegistriesMixin", "BuiltinRegistriesMixin",
"DedicatedServerPropertiesMixin", "DedicatedServerPropertiesMixin",
"DiggerItemAccessor", "DiggerItemAccessor",
"MainDataMixin",
"MainMixin", "MainMixin",
"MinecraftServerMixin", "MinecraftServerMixin",
"MinecraftServerMixinLate", "MinecraftServerMixinLate",