[Changes] Build for 1.19.3-pre3

This commit is contained in:
Frank 2022-11-30 01:40:42 +01:00
parent 0dcb7809b8
commit 7b726d958d
96 changed files with 1315 additions and 1198 deletions

@ -1 +1 @@
Subproject commit 5707d247a5dd6103c8f2f9550e73b86ebf694e78 Subproject commit 7bcd9178ccd4ea8b67d01ce1307d5a2bb3e7834e

View file

@ -1,15 +1,16 @@
# Done to increase the memory available to gradle. # Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx8G org.gradle.jvmargs=-Xmx8G
#Modrinth #Modrinth
modrinth_versions=["22w45a"] modrinth_versions=["1.19.3-pre3"]
release_channel=release #`release`, `beta` or `alpha` #`release`, `beta` or `alpha`
release_channel=release
#Loom #Loom
loom_version=1.0-SNAPSHOT loom_version=1.0-SNAPSHOT
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/versions.html # check these on https://fabricmc.net/versions.html
minecraft_version=1.19.3-pre2 minecraft_version=1.19.3-pre3
loader_version=0.14.10 loader_version=0.14.10
fabric_version=0.67.3+1.19.3 fabric_version=0.68.0+1.19.3
# Mod Properties # Mod Properties
mod_version=2.1.3 mod_version=2.1.3
maven_group=org.betterx.bclib maven_group=org.betterx.bclib

View file

@ -6,10 +6,7 @@ import org.betterx.bclib.api.v2.generator.BCLibEndBiomeSource;
import org.betterx.bclib.api.v2.generator.BCLibNetherBiomeSource; import org.betterx.bclib.api.v2.generator.BCLibNetherBiomeSource;
import org.betterx.bclib.api.v2.generator.GeneratorOptions; import org.betterx.bclib.api.v2.generator.GeneratorOptions;
import org.betterx.bclib.api.v2.levelgen.LevelGenEvents; import org.betterx.bclib.api.v2.levelgen.LevelGenEvents;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeBuilder;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry;
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI;
import org.betterx.bclib.api.v2.levelgen.structures.TemplatePiece; import org.betterx.bclib.api.v2.levelgen.structures.TemplatePiece;
import org.betterx.bclib.api.v2.levelgen.surface.rules.Conditions; import org.betterx.bclib.api.v2.levelgen.surface.rules.Conditions;
import org.betterx.bclib.api.v2.poi.PoiManager; import org.betterx.bclib.api.v2.poi.PoiManager;
@ -28,8 +25,6 @@ import org.betterx.worlds.together.util.Logger;
import org.betterx.worlds.together.world.WorldConfig; import org.betterx.worlds.together.world.WorldConfig;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Blocks;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.ModInitializer; import net.fabricmc.api.ModInitializer;
@ -45,84 +40,11 @@ public class BCLib implements ModInitializer {
.getModContainer("nullscape") .getModContainer("nullscape")
.isPresent(); .isPresent();
private static void registerTestBiomes() {
if (true && isDevEnvironment()) {
BCLBiome theYellow = BCLBiomeBuilder
.start(makeID("the_yellow"))
.precipitation(Biome.Precipitation.NONE)
.temperature(1.0f)
.wetness(1.0f)
.fogColor(0xFFFF00)
.waterColor(0x777700)
.waterFogColor(0xFFFF00)
.skyColor(0xAAAA00)
.addNetherClimateParamater(-1, 1)
.surface(Blocks.YELLOW_CONCRETE)
.build();
BiomeAPI.registerEndLandBiome(theYellow);
BCLBiome theBlue = BCLBiomeBuilder
.start(makeID("the_blue"))
.precipitation(Biome.Precipitation.NONE)
.temperature(1.0f)
.wetness(1.0f)
.fogColor(0x0000FF)
.waterColor(0x000077)
.waterFogColor(0x0000FF)
.skyColor(0x0000AA)
.addNetherClimateParamater(-1, 1)
.surface(Blocks.LIGHT_BLUE_CONCRETE)
.build();
BiomeAPI.registerEndLandBiome(theBlue);
BCLBiome theGray = BCLBiomeBuilder
.start(makeID("the_gray"))
.precipitation(Biome.Precipitation.NONE)
.temperature(1.0f)
.wetness(1.0f)
.fogColor(0xFFFFFF)
.waterColor(0x777777)
.waterFogColor(0xFFFFFF)
.skyColor(0xAAAAAA)
.addNetherClimateParamater(-1, 1)
.surface(Blocks.GRAY_CONCRETE)
.build();
BiomeAPI.registerEndVoidBiome(theGray);
BCLBiome theOrange = BCLBiomeBuilder
.start(makeID("the_orange"))
.precipitation(Biome.Precipitation.NONE)
.temperature(1.0f)
.wetness(1.0f)
.fogColor(0xFF7700)
.waterColor(0x773300)
.waterFogColor(0xFF7700)
.skyColor(0xAA7700)
.addNetherClimateParamater(-1, 1.1f)
.surface(Blocks.ORANGE_CONCRETE)
.build();
BiomeAPI.registerNetherBiome(theOrange);
BCLBiome thePurple = BCLBiomeBuilder
.start(makeID("the_purple"))
.precipitation(Biome.Precipitation.NONE)
.temperature(1.0f)
.wetness(1.0f)
.fogColor(0xFF00FF)
.waterColor(0x770077)
.waterFogColor(0xFF00FF)
.skyColor(0xAA00AA)
.addNetherClimateParamater(-1.1f, 1)
.surface(Blocks.PURPLE_CONCRETE)
.build();
BiomeAPI.registerNetherBiome(thePurple);
}
}
private void onDatagen() { private void onDatagen() {
registerTestBiomes();
} }
@Override @Override
public void onInitialize() { public void onInitialize() {
WorldsTogether.onInitialize(); WorldsTogether.onInitialize();

View file

@ -1,140 +0,0 @@
package org.betterx.bclib;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry;
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeData;
import org.betterx.worlds.together.WorldsTogether;
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.core.registries.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.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricBuiltinRegistriesProvider;
import com.google.gson.JsonElement;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
public class BCLibDatagen implements DataGeneratorEntrypoint {
@Override
public void onInitializeDataGenerator(FabricDataGenerator dataGenerator) {
final FabricDataGenerator.Pack pack = dataGenerator.createPack();
pack.addProvider(FabricBuiltinRegistriesProvider.forCurrentMod());
pack.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, BiomeData.CODEC),
new RegistryDataLoader.RegistryData<>(
SurfaceRuleRegistry.SURFACE_RULES_REGISTRY,
AssignedSurfaceRule.CODEC
)
);
private final PackOutput output;
public CustomRegistriesDataProvider(FabricDataOutput generator) {
this.output = generator;
}
@Override
public CompletableFuture<?> run(CachedOutput cachedOutput) {
RegistryAccess.Frozen registryAccess = BuiltInRegistries.createAccess();
RegistryOps<JsonElement> dynamicOps = RegistryOps.create(JsonOps.INSTANCE, registryAccess);
final List<CompletableFuture<?>> futures = new ArrayList<>();
for (RegistryDataLoader.RegistryData<?> registryData : REGISTRIES) {
futures.add(this.dumpRegistryCapFuture(
cachedOutput,
registryAccess,
dynamicOps,
(RegistryDataLoader.RegistryData) registryData
));
}
return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new));
}
private <T> CompletableFuture dumpRegistryCapFuture(
CachedOutput cachedOutput,
RegistryAccess registryAccess,
DynamicOps<JsonElement> dynamicOps,
RegistryDataLoader.RegistryData<T> registryData
) {
return CompletableFuture.runAsync(() -> dumpRegistryCap(
cachedOutput,
registryAccess,
dynamicOps,
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
) {
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);
}
}
@Override
public String getName() {
return "BCL Registries";
}
}
}

View file

@ -7,7 +7,8 @@ import org.betterx.bclib.api.v2.generator.GeneratorOptions;
import org.betterx.bclib.api.v2.levelgen.LevelGenUtil; import org.betterx.bclib.api.v2.levelgen.LevelGenUtil;
import org.betterx.bclib.config.Configs; import org.betterx.bclib.config.Configs;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.HolderLookup;
import net.minecraft.data.registries.VanillaRegistries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtOps;
import net.minecraft.nbt.Tag; import net.minecraft.nbt.Tag;
@ -41,7 +42,7 @@ final class BiomeSourcePatch extends ForcedLevelPatch {
final CompoundTag worldGenSettings = root.getCompound("Data").getCompound("WorldGenSettings"); final CompoundTag worldGenSettings = root.getCompound("Data").getCompound("WorldGenSettings");
final CompoundTag dimensions = worldGenSettings.getCompound("dimensions"); final CompoundTag dimensions = worldGenSettings.getCompound("dimensions");
final RegistryAccess registryAccess = BuiltinRegistries.createAccess(); final HolderLookup.Provider registryAccess = VanillaRegistries.createLookup();
final RegistryOps<Tag> registryOps = RegistryOps.create(NbtOps.INSTANCE, registryAccess); final RegistryOps<Tag> registryOps = RegistryOps.create(NbtOps.INSTANCE, registryAccess);
@ -82,7 +83,7 @@ final class BiomeSourcePatch extends ForcedLevelPatch {
private boolean checkDimension( private boolean checkDimension(
CompoundTag worldGenSettings, CompoundTag worldGenSettings,
CompoundTag dimensions, CompoundTag dimensions,
RegistryAccess registryAccess, HolderLookup.Provider registryAccess,
RegistryOps<Tag> registryOps, RegistryOps<Tag> registryOps,
ResourceKey<LevelStem> dimensionKey ResourceKey<LevelStem> dimensionKey
) { ) {

View file

@ -3,6 +3,7 @@ package org.betterx.bclib.api.v2;
import org.betterx.bclib.api.v2.datafixer.DataFixerAPI; import org.betterx.bclib.api.v2.datafixer.DataFixerAPI;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
@ -106,7 +107,7 @@ public class LifeCycleAPI {
)); ));
final long seed = world.getSeed(); final long seed = world.getSeed();
final Registry<Biome> biomeRegistry = world.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); final Registry<Biome> biomeRegistry = world.registryAccess().registryOrThrow(Registries.BIOME);
onLoadLevelBiomes.forEach(c -> c.onLoad(world, seed, biomeRegistry)); onLoadLevelBiomes.forEach(c -> c.onLoad(world, seed, biomeRegistry));
} }

View file

@ -21,6 +21,7 @@ import org.betterx.worlds.together.tag.v3.MineableTags;
import org.betterx.worlds.together.tag.v3.TagManager; import org.betterx.worlds.together.tag.v3.TagManager;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;

View file

@ -7,6 +7,7 @@ import org.betterx.bclib.items.complex.EquipmentSet;
import net.minecraft.advancements.*; import net.minecraft.advancements.*;
import net.minecraft.advancements.critereon.*; import net.minecraft.advancements.critereon.*;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.data.recipes.RecipeBuilder; import net.minecraft.data.recipes.RecipeBuilder;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;

View file

@ -9,7 +9,7 @@ import org.betterx.worlds.together.world.BiomeSourceWithNoiseRelatedSettings;
import org.betterx.worlds.together.world.BiomeSourceWithSeed; import org.betterx.worlds.together.world.BiomeSourceWithSeed;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.HolderGetter;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.BiomeSource;
@ -23,13 +23,13 @@ import java.util.Set;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public abstract class BCLBiomeSource extends BiomeSource implements BiomeSourceWithSeed, MergeableBiomeSource<BCLBiomeSource>, BiomeSourceWithNoiseRelatedSettings, BiomeSourceFromRegistry<BCLBiomeSource> { public abstract class BCLBiomeSource extends BiomeSource implements BiomeSourceWithSeed, MergeableBiomeSource<BCLBiomeSource>, BiomeSourceWithNoiseRelatedSettings, BiomeSourceFromRegistry<BCLBiomeSource> {
protected final Registry<Biome> biomeRegistry; protected final HolderGetter<Biome> biomeRegistry;
private int registryModificationCounter; private int registryModificationCounter;
protected long currentSeed; protected long currentSeed;
protected int maxHeight; protected int maxHeight;
private static List<Holder<Biome>> preInit( private static List<Holder<Biome>> preInit(
Registry<Biome> biomeRegistry, HolderGetter<Biome> biomeRegistry,
List<Holder<Biome>> biomes List<Holder<Biome>> biomes
) { ) {
biomes = biomes.stream().sorted(Comparator.comparing(holder -> holder.unwrapKey() biomes = biomes.stream().sorted(Comparator.comparing(holder -> holder.unwrapKey()
@ -41,7 +41,7 @@ public abstract class BCLBiomeSource extends BiomeSource implements BiomeSourceW
} }
protected BCLBiomeSource( protected BCLBiomeSource(
Registry<Biome> biomeRegistry, HolderGetter<Biome> biomeRegistry,
List<Holder<Biome>> list, List<Holder<Biome>> list,
long seed long seed
) { ) {
@ -103,15 +103,16 @@ public abstract class BCLBiomeSource extends BiomeSource implements BiomeSourceW
} }
protected static List<Holder<Biome>> getBiomes( protected static List<Holder<Biome>> getBiomes(
Registry<Biome> biomeRegistry, HolderGetter<Biome> biomeRegistry,
List<String> exclude, List<String> exclude,
List<String> include, List<String> include,
BCLibNetherBiomeSource.ValidBiomePredicate test BCLibNetherBiomeSource.ValidBiomePredicate test
) { ) {
return biomeRegistry.stream() //TODO: 1.19.3 restore this code
return List.of();/*biomeRegistry.stream()
.filter(biome -> biomeRegistry.getResourceKey(biome).isPresent()) .filter(biome -> biomeRegistry.getResourceKey(biome).isPresent())
.map(biome -> (Holder<Biome>) biomeRegistry.getOrCreateHolderOrThrow( .map(biome -> (Holder<Biome>) biomeRegistry.getHolderOrThrow(
biomeRegistry.getResourceKey(biome).get()) biomeRegistry.getResourceKey(biome).get())
) )
.filter(biome -> { .filter(biome -> {
@ -122,7 +123,7 @@ public abstract class BCLBiomeSource extends BiomeSource implements BiomeSourceW
return test.isValid(biome, location); return test.isValid(biome, location);
}) })
.toList(); .toList();*/
} }
@Override @Override
@ -135,7 +136,8 @@ public abstract class BCLBiomeSource extends BiomeSource implements BiomeSourceW
this.setMaxHeight(generator.noiseSettings().height()); this.setMaxHeight(generator.noiseSettings().height());
} }
public Registry<Biome> getBiomeRegistry() { @Override
public HolderGetter<Biome> getBiomeRegistry() {
return biomeRegistry; return biomeRegistry;
} }
} }

View file

@ -15,13 +15,13 @@ import org.betterx.worlds.together.world.BiomeSourceWithNoiseRelatedSettings;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.HolderGetter;
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.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.data.worldgen.SurfaceRuleData; import net.minecraft.data.worldgen.SurfaceRuleData;
import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeGenerationSettings; import net.minecraft.world.level.biome.BiomeGenerationSettings;
import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.BiomeSource;
@ -31,8 +31,6 @@ import net.minecraft.world.level.chunk.ChunkGenerator;
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.dimension.LevelStem;
import net.minecraft.world.level.levelgen.*; import net.minecraft.world.level.levelgen.*;
import net.minecraft.world.level.levelgen.structure.StructureSet;
import net.minecraft.world.level.levelgen.synth.NormalNoise;
import com.google.common.base.Suppliers; import com.google.common.base.Suppliers;
@ -43,11 +41,6 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
public static final Codec<BCLChunkGenerator> CODEC = RecordCodecBuilder public static final Codec<BCLChunkGenerator> CODEC = RecordCodecBuilder
.create((RecordCodecBuilder.Instance<BCLChunkGenerator> builderInstance) -> { .create((RecordCodecBuilder.Instance<BCLChunkGenerator> builderInstance) -> {
final RecordCodecBuilder<BCLChunkGenerator, Registry<NormalNoise.NoiseParameters>> noiseGetter = RegistryOps
.retrieveRegistry(
Registry.NOISE_REGISTRY)
.forGetter(
BCLChunkGenerator::getNoises);
RecordCodecBuilder<BCLChunkGenerator, BiomeSource> biomeSourceCodec = BiomeSource.CODEC RecordCodecBuilder<BCLChunkGenerator, BiomeSource> biomeSourceCodec = BiomeSource.CODEC
.fieldOf("biome_source") .fieldOf("biome_source")
@ -58,26 +51,22 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
.forGetter((BCLChunkGenerator generator) -> generator.generatorSettings()); .forGetter((BCLChunkGenerator generator) -> generator.generatorSettings());
return NoiseBasedChunkGenerator return builderInstance.group(biomeSourceCodec, settingsCodec)
.commonCodec(builderInstance) .apply(builderInstance, builderInstance.stable(BCLChunkGenerator::new));
.and(builderInstance.group(noiseGetter, biomeSourceCodec, settingsCodec))
.apply(builderInstance, builderInstance.stable(BCLChunkGenerator::new));
}); });
protected static final NoiseSettings NETHER_NOISE_SETTINGS_AMPLIFIED = NoiseSettings.create(0, 256, 1, 4); protected static final NoiseSettings NETHER_NOISE_SETTINGS_AMPLIFIED = NoiseSettings.create(0, 256, 1, 4);
public static final ResourceKey<NoiseGeneratorSettings> AMPLIFIED_NETHER = ResourceKey.create( public static final ResourceKey<NoiseGeneratorSettings> AMPLIFIED_NETHER = ResourceKey.create(
Registry.NOISE_GENERATOR_SETTINGS_REGISTRY, Registries.NOISE_SETTINGS,
BCLib.makeID("amplified_nether") BCLib.makeID("amplified_nether")
); );
public final BiomeSource initialBiomeSource; public final BiomeSource initialBiomeSource;
public BCLChunkGenerator( public BCLChunkGenerator(
Registry<StructureSet> registry,
Registry<NormalNoise.NoiseParameters> registry2,
BiomeSource biomeSource, BiomeSource biomeSource,
Holder<NoiseGeneratorSettings> holder Holder<NoiseGeneratorSettings> holder
) { ) {
super(registry, registry2, biomeSource, holder); super(biomeSource, holder);
initialBiomeSource = biomeSource; initialBiomeSource = biomeSource;
if (biomeSource instanceof BiomeSourceWithNoiseRelatedSettings bcl) { if (biomeSource instanceof BiomeSourceWithNoiseRelatedSettings bcl) {
bcl.onLoadGeneratorSettings(holder.value()); bcl.onLoadGeneratorSettings(holder.value());
@ -131,14 +120,6 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
return CODEC; return CODEC;
} }
private Registry<NormalNoise.NoiseParameters> getNoises() {
if (this instanceof NoiseGeneratorSettingsProvider p) {
return p.bclib_getNoises();
}
return null;
}
@Override @Override
public String toString() { public String toString() {
return "BCLib - Chunk Generator (" + Integer.toHexString(hashCode()) + ")"; return "BCLib - Chunk Generator (" + Integer.toHexString(hashCode()) + ")";
@ -150,18 +131,6 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
public void appendFeaturesPerStep() { public void appendFeaturesPerStep() {
} }
public static RandomState createRandomState(ServerLevel level, ChunkGenerator generator) {
if (generator instanceof NoiseBasedChunkGenerator noiseBasedChunkGenerator) {
return RandomState.create(
noiseBasedChunkGenerator.generatorSettings().value(),
level.registryAccess().registryOrThrow(Registry.NOISE_REGISTRY),
level.getSeed()
);
} else {
return RandomState.create(level.registryAccess(), NoiseGeneratorSettings.OVERWORLD, level.getSeed());
}
}
@Override @Override
public Registry<LevelStem> enforceGeneratorInWorldGenSettings( public Registry<LevelStem> enforceGeneratorInWorldGenSettings(
RegistryAccess access, RegistryAccess access,
@ -184,8 +153,6 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
} }
referenceGenerator = new BCLChunkGenerator( referenceGenerator = new BCLChunkGenerator(
generator.bclib_getStructureSetsRegistry(),
noiseProvider.bclib_getNoises(),
bs, bs,
buildGeneratorSettings( buildGeneratorSettings(
referenceProvider.bclib_getNoiseGeneratorSettingHolders(), referenceProvider.bclib_getNoiseGeneratorSettingHolders(),
@ -234,14 +201,16 @@ public class BCLChunkGenerator extends NoiseBasedChunkGenerator implements Resto
} }
public static NoiseGeneratorSettings amplifiedNether() { public static NoiseGeneratorSettings amplifiedNether(BootstapContext<NoiseGeneratorSettings> bootstapContext) {
HolderGetter<DensityFunction> densityGetter = bootstapContext.lookup(Registries.DENSITY_FUNCTION);
return new NoiseGeneratorSettings( return new NoiseGeneratorSettings(
NETHER_NOISE_SETTINGS_AMPLIFIED, NETHER_NOISE_SETTINGS_AMPLIFIED,
Blocks.NETHERRACK.defaultBlockState(), Blocks.NETHERRACK.defaultBlockState(),
Blocks.LAVA.defaultBlockState(), Blocks.LAVA.defaultBlockState(),
NoiseRouterData.noNewCaves( NoiseRouterData.noNewCaves(
BuiltinRegistries.DENSITY_FUNCTION, densityGetter,
NoiseRouterData.slideNetherLike(BuiltinRegistries.DENSITY_FUNCTION, 0, 256) bootstapContext.lookup(Registries.NOISE),
NoiseRouterData.slideNetherLike(densityGetter, 0, 256)
), ),
SurfaceRuleData.nether(), SurfaceRuleData.nether(),
List.of(), List.of(),

View file

@ -13,10 +13,9 @@ import org.betterx.worlds.together.biomesource.ReloadableBiomeSource;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.Holder; import net.minecraft.core.*;
import net.minecraft.core.QuartPos; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries;
import net.minecraft.core.SectionPos;
import net.minecraft.resources.RegistryOps; import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -38,8 +37,7 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi
public static Codec<BCLibEndBiomeSource> CODEC public static Codec<BCLibEndBiomeSource> CODEC
= RecordCodecBuilder.create((instance) -> instance.group( = RecordCodecBuilder.create((instance) -> instance.group(
RegistryOps RegistryOps
.retrieveRegistry(Registry.BIOME_REGISTRY) .retrieveElement(Registries.BIOME),
.forGetter((theEndBiomeSource) -> theEndBiomeSource.biomeRegistry),
Codec Codec
.LONG .LONG
.fieldOf("seed") .fieldOf("seed")
@ -70,16 +68,24 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi
private BCLEndBiomeSourceConfig config; private BCLEndBiomeSourceConfig config;
public BCLibEndBiomeSource(Registry<Biome> biomeRegistry, long seed, BCLEndBiomeSourceConfig config) { private BCLibEndBiomeSource(
Holder.Reference<Registry<Biome>> registryReference,
long seed,
BCLEndBiomeSourceConfig bclEndBiomeSourceConfig
) {
this(registryReference.value().asLookup(), seed, bclEndBiomeSourceConfig);
}
private BCLibEndBiomeSource(HolderGetter<Biome> biomeRegistry, long seed, BCLEndBiomeSourceConfig config) {
this(biomeRegistry, seed, config, true); this(biomeRegistry, seed, config, true);
} }
public BCLibEndBiomeSource(Registry<Biome> biomeRegistry, BCLEndBiomeSourceConfig config) { public BCLibEndBiomeSource(HolderGetter<Biome> biomeRegistry, BCLEndBiomeSourceConfig config) {
this(biomeRegistry, 0, config, false); this(biomeRegistry, 0, config, false);
} }
private BCLibEndBiomeSource( private BCLibEndBiomeSource(
Registry<Biome> biomeRegistry, HolderGetter<Biome> biomeRegistry,
long seed, long seed,
BCLEndBiomeSourceConfig config, BCLEndBiomeSourceConfig config,
boolean initMaps boolean initMaps
@ -88,7 +94,7 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi
} }
private BCLibEndBiomeSource( private BCLibEndBiomeSource(
Registry<Biome> biomeRegistry, HolderGetter<Biome> biomeRegistry,
List<Holder<Biome>> list, List<Holder<Biome>> list,
long seed, long seed,
BCLEndBiomeSourceConfig config, BCLEndBiomeSourceConfig config,
@ -105,6 +111,7 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi
} }
} }
@NotNull @NotNull
private void rebuildBiomePickers() { private void rebuildBiomePickers() {
var includeMap = Configs.BIOMES_CONFIG.getBiomeIncludeMap(); var includeMap = Configs.BIOMES_CONFIG.getBiomeIncludeMap();
@ -243,8 +250,8 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi
return new BCLibEndBiomeSource( return new BCLibEndBiomeSource(
this.biomeRegistry, this.biomeRegistry,
datapackBiomes.stream() datapackBiomes.stream()
.filter(b -> b.isValidInRegistry(biomeRegistry) && b.unwrapKey() .filter(b -> b.unwrapKey()
.orElse(null) != BCLBiomeRegistry.EMPTY_BIOME.getBiomeKey()) .orElse(null) != BCLBiomeRegistry.EMPTY_BIOME.getBiomeKey())
.toList(), .toList(),
this.currentSeed, this.currentSeed,
this.config, this.config,
@ -252,7 +259,7 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi
); );
} }
private static List<Holder<Biome>> getNonVanillaBiomes(Registry<Biome> biomeRegistry) { private static List<Holder<Biome>> getNonVanillaBiomes(HolderGetter<Biome> biomeRegistry) {
return getBiomes( return getBiomes(
biomeRegistry, biomeRegistry,
Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.END), Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.END),
@ -261,7 +268,7 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi
); );
} }
private static List<Holder<Biome>> getBiomes(Registry<Biome> biomeRegistry) { private static List<Holder<Biome>> getBiomes(HolderGetter<Biome> biomeRegistry) {
return getBiomes( return getBiomes(
biomeRegistry, biomeRegistry,
Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.END), Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.END),
@ -293,7 +300,7 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi
} }
public static void register() { public static void register() {
Registry.register(Registry.BIOME_SOURCE, BCLib.makeID("end_biome_source"), CODEC); Registry.register(BuiltInRegistries.BIOME_SOURCE, BCLib.makeID("end_biome_source"), CODEC);
} }
@Override @Override

View file

@ -16,7 +16,10 @@ import org.betterx.worlds.together.biomesource.ReloadableBiomeSource;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.RegistryOps; import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BiomeTags; import net.minecraft.tags.BiomeTags;
@ -33,9 +36,7 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc
public static final Codec<BCLibNetherBiomeSource> CODEC = RecordCodecBuilder public static final Codec<BCLibNetherBiomeSource> CODEC = RecordCodecBuilder
.create(instance -> instance .create(instance -> instance
.group( .group(
RegistryOps RegistryOps.retrieveElement(Registries.BIOME),
.retrieveRegistry(Registry.BIOME_REGISTRY)
.forGetter(source -> source.biomeRegistry),
Codec Codec
.LONG .LONG
.fieldOf("seed") .fieldOf("seed")
@ -55,16 +56,26 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc
private BiomePicker biomePicker; private BiomePicker biomePicker;
private BCLNetherBiomeSourceConfig config; private BCLNetherBiomeSourceConfig config;
public BCLibNetherBiomeSource(Registry<Biome> biomeRegistry, BCLNetherBiomeSourceConfig config) {
private BCLibNetherBiomeSource(
Holder.Reference<Registry<Biome>> registryReference,
long seed,
BCLNetherBiomeSourceConfig bclNetherBiomeSourceConfig
) {
this(registryReference.value().asLookup(), seed, bclNetherBiomeSourceConfig);
}
public BCLibNetherBiomeSource(HolderGetter<Biome> biomeRegistry, BCLNetherBiomeSourceConfig config) {
this(biomeRegistry, 0, config, false); this(biomeRegistry, 0, config, false);
} }
public BCLibNetherBiomeSource(Registry<Biome> biomeRegistry, long seed, BCLNetherBiomeSourceConfig config) { private BCLibNetherBiomeSource(HolderGetter<Biome> biomeRegistry, long seed, BCLNetherBiomeSourceConfig config) {
this(biomeRegistry, seed, config, true); this(biomeRegistry, seed, config, true);
} }
private BCLibNetherBiomeSource( private BCLibNetherBiomeSource(
Registry<Biome> biomeRegistry, HolderGetter<Biome> biomeRegistry,
long seed, long seed,
BCLNetherBiomeSourceConfig config, BCLNetherBiomeSourceConfig config,
boolean initMaps boolean initMaps
@ -73,7 +84,7 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc
} }
private BCLibNetherBiomeSource( private BCLibNetherBiomeSource(
Registry<Biome> biomeRegistry, HolderGetter<Biome> biomeRegistry,
List<Holder<Biome>> list, List<Holder<Biome>> list,
long seed, long seed,
BCLNetherBiomeSourceConfig config, BCLNetherBiomeSourceConfig config,
@ -126,8 +137,8 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc
return new BCLibNetherBiomeSource( return new BCLibNetherBiomeSource(
this.biomeRegistry, this.biomeRegistry,
datapackBiomes.stream() datapackBiomes.stream()
.filter(b -> b.isValidInRegistry(biomeRegistry) && b.unwrapKey() .filter(b -> b.unwrapKey()
.orElse(null) != BCLBiomeRegistry.EMPTY_BIOME.getBiomeKey()) .orElse(null) != BCLBiomeRegistry.EMPTY_BIOME.getBiomeKey())
.toList(), .toList(),
this.currentSeed, this.currentSeed,
config, config,
@ -135,7 +146,7 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc
); );
} }
private static List<Holder<Biome>> getNonVanillaBiomes(Registry<Biome> biomeRegistry) { private static List<Holder<Biome>> getNonVanillaBiomes(HolderGetter<Biome> biomeRegistry) {
List<String> include = Configs.BIOMES_CONFIG.getIncludeMatching(BiomeAPI.BiomeType.NETHER); List<String> include = Configs.BIOMES_CONFIG.getIncludeMatching(BiomeAPI.BiomeType.NETHER);
List<String> exclude = Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.NETHER); List<String> exclude = Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.NETHER);
@ -143,7 +154,7 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc
} }
private static List<Holder<Biome>> getBiomes(Registry<Biome> biomeRegistry) { private static List<Holder<Biome>> getBiomes(HolderGetter<Biome> biomeRegistry) {
List<String> include = Configs.BIOMES_CONFIG.getIncludeMatching(BiomeAPI.BiomeType.NETHER); List<String> include = Configs.BIOMES_CONFIG.getIncludeMatching(BiomeAPI.BiomeType.NETHER);
List<String> exclude = Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.NETHER); List<String> exclude = Configs.BIOMES_CONFIG.getExcludeMatching(BiomeAPI.BiomeType.NETHER);
@ -170,7 +181,7 @@ public class BCLibNetherBiomeSource extends BCLBiomeSource implements BiomeSourc
} }
public static void register() { public static void register() {
Registry.register(Registry.BIOME_SOURCE, BCLib.makeID("nether_biome_source"), CODEC); Registry.register(BuiltInRegistries.BIOME_SOURCE, BCLib.makeID("nether_biome_source"), CODEC);
} }

View file

@ -4,7 +4,7 @@ import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome;
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI; import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI;
import org.betterx.bclib.interfaces.BiomeMap; import org.betterx.bclib.interfaces.BiomeMap;
import net.minecraft.core.Registry; import net.minecraft.core.HolderGetter;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.BiomeSource;
@ -84,7 +84,7 @@ public abstract class BiomeDecider {
* @param predicate A predicate that decides if a given Biome can be provided by this decider * @param predicate A predicate that decides if a given Biome can be provided by this decider
*/ */
protected BiomeDecider( protected BiomeDecider(
Registry<Biome> biomeRegistry, BiomePredicate predicate HolderGetter<Biome> biomeRegistry, BiomePredicate predicate
) { ) {
this.predicate = predicate; this.predicate = predicate;
this.map = null; this.map = null;

View file

@ -6,7 +6,8 @@ import org.betterx.bclib.util.WeighTree;
import org.betterx.bclib.util.WeightedList; import org.betterx.bclib.util.WeightedList;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.HolderGetter;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.WorldgenRandom;
@ -20,17 +21,17 @@ import java.util.Objects;
public class BiomePicker { public class BiomePicker {
private final Map<BCLBiome, ActualBiome> all = new HashMap<>(); private final Map<BCLBiome, ActualBiome> all = new HashMap<>();
public final Registry<Biome> biomeRegistry; public final HolderGetter<Biome> biomeRegistry;
private final List<ActualBiome> biomes = Lists.newArrayList(); private final List<ActualBiome> biomes = Lists.newArrayList();
private final List<String> allowedBiomes; private final List<String> allowedBiomes;
public final ActualBiome fallbackBiome; public final ActualBiome fallbackBiome;
private WeighTree<ActualBiome> tree; private WeighTree<ActualBiome> tree;
public BiomePicker(Registry<Biome> biomeRegistry) { public BiomePicker(HolderGetter<Biome> biomeRegistry) {
this(biomeRegistry, null); this(biomeRegistry, null);
} }
public BiomePicker(Registry<Biome> biomeRegistry, List<Holder<Biome>> allowedBiomes) { public BiomePicker(HolderGetter<Biome> biomeRegistry, List<Holder<Biome>> allowedBiomes) {
this.biomeRegistry = biomeRegistry; this.biomeRegistry = biomeRegistry;
this.allowedBiomes = allowedBiomes != null ? allowedBiomes this.allowedBiomes = allowedBiomes != null ? allowedBiomes
.stream() .stream()
@ -104,9 +105,13 @@ public class BiomePicker {
all.put(bclBiome, this); all.put(bclBiome, this);
this.bclBiome = bclBiome; this.bclBiome = bclBiome;
this.key = biomeRegistry.getResourceKey(biomeRegistry.get(bclBiome.getID())).orElse(null); //TODO: 1.19.3 is it ok to build the key?
this.biome = key != null ? biomeRegistry.getOrCreateHolderOrThrow(key) : null; this.key = ResourceKey.create(
this.isValid = key != null && biome != null && biome.isBound(); Registries.BIOME,
bclBiome.getID()
);//biomeRegistry.getResourceKey(biomeRegistry.get(bclBiome.getID())).orElse(null);
this.biome = key != null ? biomeRegistry.getOrThrow(key) : null;
this.isValid = key != null && biome != null && biome.isBound() && biomeRegistry.get(key).isPresent();
bclBiome.forEachSubBiome((b, w) -> { bclBiome.forEachSubBiome((b, w) -> {
if (isAllowed(b)) if (isAllowed(b))
subbiomes.add(create(b), w); subbiomes.add(create(b), w);

View file

@ -2,7 +2,7 @@ package org.betterx.bclib.api.v2.generator;
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI; import org.betterx.bclib.api.v2.levelgen.biomes.BiomeAPI;
import net.minecraft.core.Registry; import net.minecraft.core.HolderGetter;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
public abstract class TypeBiomeDecider extends BiomeDecider { public abstract class TypeBiomeDecider extends BiomeDecider {
@ -12,7 +12,7 @@ public abstract class TypeBiomeDecider extends BiomeDecider {
this(null, assignedType); this(null, assignedType);
} }
protected TypeBiomeDecider(Registry<Biome> biomeRegistry, BiomeAPI.BiomeType assignedType) { protected TypeBiomeDecider(HolderGetter<Biome> biomeRegistry, BiomeAPI.BiomeType assignedType) {
super(biomeRegistry, (biome) -> biome.getIntendedType().is(assignedType)); super(biomeRegistry, (biome) -> biome.getIntendedType().is(assignedType));
this.assignedType = assignedType; this.assignedType = assignedType;
} }

View file

@ -17,6 +17,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.core.registries.Registries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
@ -41,8 +42,6 @@ public class LevelGenUtil {
return new LevelStem( return new LevelStem(
context.dimension, context.dimension,
new BCLChunkGenerator( new BCLChunkGenerator(
context.structureSets,
context.noiseParameters,
netherSource, netherSource,
context.generatorSettings context.generatorSettings
) )
@ -54,8 +53,6 @@ public class LevelGenUtil {
return new LevelStem( return new LevelStem(
context.dimension, context.dimension,
new BCLChunkGenerator( new BCLChunkGenerator(
context.structureSets,
context.noiseParameters,
endSource, endSource,
context.generatorSettings context.generatorSettings
) )
@ -70,7 +67,7 @@ public class LevelGenUtil {
Registry<LevelStem> dimensionRegistry, Registry<LevelStem> dimensionRegistry,
ChunkGenerator generator ChunkGenerator generator
) { ) {
Registry<DimensionType> dimensionTypeRegistry = registryAccess.registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); Registry<DimensionType> dimensionTypeRegistry = registryAccess.registryOrThrow(Registries.DIMENSION_TYPE);
Registry<LevelStem> newDimensions = withDimension( Registry<LevelStem> newDimensions = withDimension(
dimensionKey, dimensionKey,
dimensionTypeKey, dimensionTypeKey,
@ -91,7 +88,7 @@ public class LevelGenUtil {
LevelStem levelStem = inputDimensions.get(dimensionKey); LevelStem levelStem = inputDimensions.get(dimensionKey);
Holder<DimensionType> dimensionType = levelStem == null Holder<DimensionType> dimensionType = levelStem == null
? dimensionTypeRegistry.getOrCreateHolderOrThrow(dimensionTypeKey) ? dimensionTypeRegistry.getHolderOrThrow(dimensionTypeKey)
: levelStem.type(); : levelStem.type();
return withDimension(dimensionKey, inputDimensions, new LevelStem(dimensionType, generator)); return withDimension(dimensionKey, inputDimensions, new LevelStem(dimensionType, generator));
} }
@ -102,7 +99,7 @@ public class LevelGenUtil {
LevelStem levelStem LevelStem levelStem
) { ) {
MappedRegistry<LevelStem> writableRegistry = new MappedRegistry<>( MappedRegistry<LevelStem> writableRegistry = new MappedRegistry<>(
Registry.LEVEL_STEM_REGISTRY, Registries.LEVEL_STEM,
Lifecycle.experimental() Lifecycle.experimental()
); );
writableRegistry.register( writableRegistry.register(

View file

@ -8,6 +8,7 @@ import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.Registries;
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;
@ -175,7 +176,7 @@ public class BCLBiome extends BCLBiomeSettings implements BiomeData {
super(terrainHeight, fogDensity, genChance, edgeSize, vertical, edge.map(BiomeAPI::getBiome).orElse(null)); super(terrainHeight, fogDensity, genChance, edgeSize, vertical, edge.map(BiomeAPI::getBiome).orElse(null));
biomeToRegister = null; biomeToRegister = null;
this.biomeID = biomeID; this.biomeID = biomeID;
this.biomeKey = ResourceKey.create(Registry.BIOME_REGISTRY, biomeID); this.biomeKey = ResourceKey.create(Registries.BIOME, biomeID);
this.biomeParent = biomeParent.orElse(null); this.biomeParent = biomeParent.orElse(null);
if (parameterPoints.isPresent()) this.parameterPoints.addAll(parameterPoints.get()); if (parameterPoints.isPresent()) this.parameterPoints.addAll(parameterPoints.get());
this.setIntendedType(intendedType.map(t -> BiomeAPI.BiomeType.create(t)).orElse(BiomeAPI.BiomeType.NONE)); this.setIntendedType(intendedType.map(t -> BiomeAPI.BiomeType.create(t)).orElse(BiomeAPI.BiomeType.NONE));
@ -196,7 +197,7 @@ public class BCLBiome extends BCLBiomeSettings implements BiomeData {
* @param biomeID {@link ResourceLocation} biome ID. * @param biomeID {@link ResourceLocation} biome ID.
*/ */
protected BCLBiome(ResourceLocation biomeID) { protected BCLBiome(ResourceLocation biomeID) {
this(ResourceKey.create(Registry.BIOME_REGISTRY, biomeID), null); this(ResourceKey.create(Registries.BIOME, biomeID), null);
} }
@ -232,7 +233,7 @@ public class BCLBiome extends BCLBiomeSettings implements BiomeData {
* @param defaults The Settings for this Biome or null if you want to apply the defaults * @param defaults The Settings for this Biome or null if you want to apply the defaults
*/ */
protected BCLBiome(ResourceLocation biomeID, Biome biomeToRegister, BCLBiomeSettings defaults) { protected BCLBiome(ResourceLocation biomeID, Biome biomeToRegister, BCLBiomeSettings defaults) {
this(ResourceKey.create(Registry.BIOME_REGISTRY, biomeID), biomeToRegister, defaults); this(ResourceKey.create(Registries.BIOME, biomeID), biomeToRegister, defaults);
} }
/** /**

View file

@ -15,7 +15,9 @@ import org.betterx.worlds.together.tag.v3.TagManager;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.HolderSet; import net.minecraft.core.HolderSet;
import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BiomeDefaultFeatures; import net.minecraft.data.worldgen.BiomeDefaultFeatures;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.Music; import net.minecraft.sounds.Music;
@ -42,13 +44,96 @@ import net.fabricmc.fabric.api.biome.v1.BiomeModifications;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
public class BCLBiomeBuilder { public class BCLBiomeBuilder {
public record Context(BootstapContext<Biome> bootstrapContext) {
public BCLBiomeBuilder start(ResourceLocation biomeID) {
return BCLBiomeBuilder.start(this, biomeID);
}
}
public static final class PreparedBiome<T extends BCLBiome> {
private final T biome;
private final Context context;
private PreparedBiome(T biome, Context context) {
this.biome = biome;
this.context = context;
}
public T registerEndLandBiome() {
BiomeAPI.registerEndLandBiome(context.bootstrapContext, biome);
return this.biome;
}
public T registerEndVoidBiome() {
BiomeAPI.registerEndVoidBiome(context.bootstrapContext, biome);
return this.biome;
}
public T registerEndBarrensBiome(BCLBiome highlandBiome) {
BiomeAPI.registerEndBarrensBiome(context.bootstrapContext, highlandBiome, biome);
return this.biome;
}
public T registerEndCenterBiome() {
BiomeAPI.registerEndCenterBiome(context.bootstrapContext, biome);
return this.biome;
}
public T registerNetherBiome() {
BiomeAPI.registerNetherBiome(context.bootstrapContext, biome);
return this.biome;
}
public T registerSubBiome(BCLBiome parent) {
BiomeAPI.registerSubBiome(context.bootstrapContext, parent, biome);
return this.biome;
}
public T registerSubBiome(BCLBiome parent, BiomeAPI.BiomeType dim) {
BiomeAPI.registerSubBiome(context.bootstrapContext, parent, biome, dim);
return this.biome;
}
public T register(BiomeAPI.BiomeType dim) {
BiomeAPI.registerBuiltinBiomeAndOverrideIntendedDimension(context.bootstrapContext, biome, dim);
return this.biome;
}
public BCLBiome biome() {
return biome;
}
public Context context() {
return context;
}
@Override
public boolean equals(Object obj) {
if (obj == this) return true;
if (obj == null || obj.getClass() != this.getClass()) return false;
PreparedBiome that = (PreparedBiome) obj;
return Objects.equals(this.biome, that.biome) &&
Objects.equals(this.context, that.context);
}
@Override
public int hashCode() {
return Objects.hash(biome, context);
}
@Override
public String toString() {
return "Registry[" +
"biome=" + biome + ", " +
"context=" + context + ']';
}
}
@FunctionalInterface @FunctionalInterface
public interface BiomeSupplier<T> extends TriFunction<ResourceLocation, Biome, BCLBiomeSettings, T> { public interface BiomeSupplier<T> extends TriFunction<ResourceLocation, Biome, BCLBiomeSettings, T> {
} }
@ -68,6 +153,7 @@ public class BCLBiomeBuilder {
private SurfaceRules.RuleSource surfaceRule; private SurfaceRules.RuleSource surfaceRule;
private Precipitation precipitation; private Precipitation precipitation;
private ResourceLocation biomeID; private ResourceLocation biomeID;
private Context builderContext;
private final Set<TagKey<Biome>> tags = Sets.newHashSet(); private final Set<TagKey<Biome>> tags = Sets.newHashSet();
@ -91,7 +177,10 @@ public class BCLBiomeBuilder {
* @param biomeID {@link ResourceLocation} biome identifier. * @param biomeID {@link ResourceLocation} biome identifier.
* @return prepared {@link BCLBiomeBuilder} instance. * @return prepared {@link BCLBiomeBuilder} instance.
*/ */
public static BCLBiomeBuilder start(ResourceLocation biomeID) { private static BCLBiomeBuilder start(
Context ctx,
ResourceLocation biomeID
) {
INSTANCE.biomeID = biomeID; INSTANCE.biomeID = biomeID;
INSTANCE.precipitation = Precipitation.NONE; INSTANCE.precipitation = Precipitation.NONE;
INSTANCE.generationSettings = null; INSTANCE.generationSettings = null;
@ -109,6 +198,7 @@ public class BCLBiomeBuilder {
INSTANCE.parameters.clear(); INSTANCE.parameters.clear();
INSTANCE.tags.clear(); INSTANCE.tags.clear();
INSTANCE.biomeType = null; INSTANCE.biomeType = null;
INSTANCE.builderContext = ctx;
return INSTANCE; return INSTANCE;
} }
@ -498,7 +588,7 @@ public class BCLBiomeBuilder {
* @param music {@link SoundEvent} to use. * @param music {@link SoundEvent} to use.
* @return same {@link BCLBiomeBuilder} instance. * @return same {@link BCLBiomeBuilder} instance.
*/ */
public BCLBiomeBuilder music(SoundEvent music) { public BCLBiomeBuilder music(Holder<SoundEvent> music) {
return music(new Music(music, 600, 2400, true)); return music(new Music(music, 600, 2400, true));
} }
@ -508,7 +598,7 @@ public class BCLBiomeBuilder {
* @param loopSound {@link SoundEvent} to use as a loop. * @param loopSound {@link SoundEvent} to use as a loop.
* @return same {@link BCLBiomeBuilder} instance. * @return same {@link BCLBiomeBuilder} instance.
*/ */
public BCLBiomeBuilder loop(SoundEvent loopSound) { public BCLBiomeBuilder loop(Holder<SoundEvent> loopSound) {
getEffects().ambientLoopSound(loopSound); getEffects().ambientLoopSound(loopSound);
return this; return this;
} }
@ -522,7 +612,7 @@ public class BCLBiomeBuilder {
* @param soundPositionOffset offset in sound. * @param soundPositionOffset offset in sound.
* @return same {@link BCLBiomeBuilder} instance. * @return same {@link BCLBiomeBuilder} instance.
*/ */
public BCLBiomeBuilder mood(SoundEvent mood, int tickDelay, int blockSearchExtent, float soundPositionOffset) { public BCLBiomeBuilder mood(Holder<SoundEvent> mood, int tickDelay, int blockSearchExtent, float soundPositionOffset) {
getEffects().ambientMoodSound(new AmbientMoodSettings(mood, tickDelay, blockSearchExtent, soundPositionOffset)); getEffects().ambientMoodSound(new AmbientMoodSettings(mood, tickDelay, blockSearchExtent, soundPositionOffset));
return this; return this;
} }
@ -533,7 +623,7 @@ public class BCLBiomeBuilder {
* @param mood {@link SoundEvent} to use as a mood. * @param mood {@link SoundEvent} to use as a mood.
* @return same {@link BCLBiomeBuilder} instance. * @return same {@link BCLBiomeBuilder} instance.
*/ */
public BCLBiomeBuilder mood(SoundEvent mood) { public BCLBiomeBuilder mood(Holder<SoundEvent> mood) {
return mood(mood, 6000, 8, 2.0F); return mood(mood, 6000, 8, 2.0F);
} }
@ -544,7 +634,7 @@ public class BCLBiomeBuilder {
* @param intensity sound intensity. Default is 0.0111F. * @param intensity sound intensity. Default is 0.0111F.
* @return same {@link BCLBiomeBuilder} instance. * @return same {@link BCLBiomeBuilder} instance.
*/ */
public BCLBiomeBuilder additions(SoundEvent additions, float intensity) { public BCLBiomeBuilder additions(Holder<SoundEvent> additions, float intensity) {
getEffects().ambientAdditionsSound(new AmbientAdditionsSettings(additions, intensity)); getEffects().ambientAdditionsSound(new AmbientAdditionsSettings(additions, intensity));
return this; return this;
} }
@ -555,7 +645,7 @@ public class BCLBiomeBuilder {
* @param additions {@link SoundEvent} to use. * @param additions {@link SoundEvent} to use.
* @return same {@link BCLBiomeBuilder} instance. * @return same {@link BCLBiomeBuilder} instance.
*/ */
public BCLBiomeBuilder additions(SoundEvent additions) { public BCLBiomeBuilder additions(Holder<SoundEvent> additions) {
return additions(additions, 0.0111F); return additions(additions, 0.0111F);
} }
@ -838,8 +928,12 @@ public class BCLBiomeBuilder {
* @return new or same {@link BiomeGenerationSettings.Builder} instance. * @return new or same {@link BiomeGenerationSettings.Builder} instance.
*/ */
private BiomeGenerationSettings.Builder getGeneration() { private BiomeGenerationSettings.Builder getGeneration() {
if (generationSettings == null) { if (generationSettings == null) {
generationSettings = new BiomeGenerationSettings.Builder(); generationSettings = new BiomeGenerationSettings.Builder(
builderContext.bootstrapContext.lookup(Registries.PLACED_FEATURE),
builderContext.bootstrapContext.lookup(Registries.CONFIGURED_CARVER)
);
} }
return generationSettings; return generationSettings;
} }
@ -849,8 +943,8 @@ public class BCLBiomeBuilder {
* *
* @return created {@link BCLBiome} instance. * @return created {@link BCLBiome} instance.
*/ */
public BCLBiome build() { public PreparedBiome<BCLBiome> build() {
return build((BiomeSupplier<BCLBiome>) BCLBiome::new); return build(BCLBiome::new);
} }
@ -860,7 +954,7 @@ public class BCLBiomeBuilder {
* @param biomeConstructor {@link BiomeSupplier} biome constructor. * @param biomeConstructor {@link BiomeSupplier} biome constructor.
* @return created {@link BCLBiome} instance. * @return created {@link BCLBiome} instance.
*/ */
public <T extends BCLBiome> T build(BiomeSupplier<T> biomeConstructor) { public <T extends BCLBiome> PreparedBiome<T> build(BiomeSupplier<T> biomeConstructor) {
BiomeBuilder builder = new BiomeBuilder() BiomeBuilder builder = new BiomeBuilder()
.precipitation(precipitation) .precipitation(precipitation)
.temperature(temperature) .temperature(temperature)
@ -893,6 +987,6 @@ public class BCLBiomeBuilder {
//carvers.forEach(cfg -> BiomeAPI.addBiomeCarver(biome, cfg.second, cfg.first)); //carvers.forEach(cfg -> BiomeAPI.addBiomeCarver(biome, cfg.second, cfg.first));
return res; return new PreparedBiome<>(res, builderContext);
} }
} }

View file

@ -6,10 +6,10 @@ import org.betterx.worlds.together.world.event.WorldBootstrap;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.Lifecycle; import com.mojang.serialization.Lifecycle;
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.core.registries.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;
@ -26,11 +26,11 @@ public class BCLBiomeRegistry {
public static final ResourceKey<Registry<Codec<? extends BCLBiome>>> BCL_BIOME_CODEC_REGISTRY = public static final ResourceKey<Registry<Codec<? extends BCLBiome>>> BCL_BIOME_CODEC_REGISTRY =
createRegistryKey(WorldsTogether.makeID("worldgen/betterx/biome_codec")); createRegistryKey(WorldsTogether.makeID("worldgen/betterx/biome_codec"));
public static Registry<Codec<? extends BCLBiome>> BIOME_CODECS = Registry.registerSimple( public static Registry<Codec<? extends BCLBiome>> BIOME_CODECS = BuiltInRegistries.registerSimple(
BCL_BIOME_CODEC_REGISTRY, BCL_BIOME_CODEC_REGISTRY,
BCLBiomeRegistry::bootstrapCodecs BCLBiomeRegistry::bootstrapCodecs
); );
public static Registry<BCLBiome> BUILTIN_BCL_BIOMES = new MappedRegistry<>( public static MappedRegistry<BCLBiome> BUILTIN_BCL_BIOMES = new MappedRegistry<>(
BCL_BIOMES_REGISTRY, BCL_BIOMES_REGISTRY,
Lifecycle.stable() Lifecycle.stable()
); );
@ -95,38 +95,38 @@ public class BCLBiomeRegistry {
@ApiStatus.Internal @ApiStatus.Internal
public static Holder<BCLBiome> bootstrap(Registry<BCLBiome> registry) { public static BCLBiome bootstrap(Registry<BCLBiome> registry) {
BuiltinRegistries.register(registry, BiomeAPI.SMALL_END_ISLANDS.getBCLBiomeKey(), BiomeAPI.SMALL_END_ISLANDS); Registry.register(registry, BiomeAPI.SMALL_END_ISLANDS.getBCLBiomeKey(), BiomeAPI.SMALL_END_ISLANDS);
BuiltinRegistries.register(registry, BiomeAPI.END_BARRENS.getBCLBiomeKey(), BiomeAPI.END_BARRENS); Registry.register(registry, BiomeAPI.END_BARRENS.getBCLBiomeKey(), BiomeAPI.END_BARRENS);
BuiltinRegistries.register(registry, BiomeAPI.END_HIGHLANDS.getBCLBiomeKey(), BiomeAPI.END_HIGHLANDS); Registry.register(registry, BiomeAPI.END_HIGHLANDS.getBCLBiomeKey(), BiomeAPI.END_HIGHLANDS);
BuiltinRegistries.register(registry, BiomeAPI.END_MIDLANDS.getBCLBiomeKey(), BiomeAPI.END_MIDLANDS); Registry.register(registry, BiomeAPI.END_MIDLANDS.getBCLBiomeKey(), BiomeAPI.END_MIDLANDS);
BuiltinRegistries.register(registry, BiomeAPI.THE_END.getBCLBiomeKey(), BiomeAPI.THE_END); Registry.register(registry, BiomeAPI.THE_END.getBCLBiomeKey(), BiomeAPI.THE_END);
BuiltinRegistries.register( Registry.register(
registry, registry,
BiomeAPI.BASALT_DELTAS_BIOME.getBCLBiomeKey(), BiomeAPI.BASALT_DELTAS_BIOME.getBCLBiomeKey(),
BiomeAPI.BASALT_DELTAS_BIOME BiomeAPI.BASALT_DELTAS_BIOME
); );
BuiltinRegistries.register( Registry.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( Registry.register(
registry, registry,
BiomeAPI.WARPED_FOREST_BIOME.getBCLBiomeKey(), BiomeAPI.WARPED_FOREST_BIOME.getBCLBiomeKey(),
BiomeAPI.WARPED_FOREST_BIOME BiomeAPI.WARPED_FOREST_BIOME
); );
BuiltinRegistries.register( Registry.register(
registry, registry,
BiomeAPI.CRIMSON_FOREST_BIOME.getBCLBiomeKey(), BiomeAPI.CRIMSON_FOREST_BIOME.getBCLBiomeKey(),
BiomeAPI.CRIMSON_FOREST_BIOME BiomeAPI.CRIMSON_FOREST_BIOME
); );
BuiltinRegistries.register( Registry.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 Registry.register(registry, EMPTY_BIOME.getBCLBiomeKey(), EMPTY_BIOME);
} }
public static BCLBiome get(ResourceLocation loc) { public static BCLBiome get(ResourceLocation loc) {

View file

@ -14,10 +14,10 @@ import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.HolderSet; import net.minecraft.core.HolderSet;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BiomeTags; import net.minecraft.tags.BiomeTags;
@ -56,6 +56,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public class BiomeAPI { public class BiomeAPI {
/** /**
* Register {@link BCLBiome} instance and its {@link Biome} if necessary. * Register {@link BCLBiome} instance and its {@link Biome} if necessary.
* *
@ -63,17 +64,14 @@ public class BiomeAPI {
* @param dim The Dimension fo rthis Biome * @param dim The Dimension fo rthis Biome
* @return {@link BCLBiome} * @return {@link BCLBiome}
*/ */
public static BCLBiome registerBuiltinBiomeAndOverrideIntendedDimension(BCLBiome bclbiome, BiomeType dim) { static BCLBiome registerBuiltinBiomeAndOverrideIntendedDimension(
return registerBiomeAndOverrideIntendedDimension(bclbiome, dim, Registries.BIOME); BootstapContext<Biome> bootstrapContext,
}
static BCLBiome registerBiomeAndOverrideIntendedDimension(
BCLBiome bclbiome, BCLBiome bclbiome,
BiomeType dim, BiomeType dim
Registry<Biome> registryOrNull
) { ) {
bclbiome._setIntendedType(dim); bclbiome._setIntendedType(dim);
return registerBiome(bclbiome, registryOrNull); return registerBiome(bootstrapContext, bclbiome);
} }
public static class BiomeType { public static class BiomeType {
@ -290,16 +288,22 @@ public class BiomeAPI {
* @param bclbiome {@link BCLBiome} * @param bclbiome {@link BCLBiome}
* @return {@link BCLBiome} * @return {@link BCLBiome}
*/ */
static BCLBiome registerBiome(BCLBiome bclbiome, Registry<Biome> registryOrNull) { static BCLBiome registerBiome(BootstapContext<Biome> bootstrapContext, BCLBiome bclbiome) {
BiomeType dim = bclbiome.getIntendedType(); HolderGetter<Biome> registryOrNull = bootstrapContext.lookup(Registries.BIOME);
if (registryOrNull != null if (registryOrNull != null
&& bclbiome.biomeToRegister != null && bclbiome.biomeToRegister != null
&& registryOrNull.get(bclbiome.getID()) == null) { //TODO: 1.19.3 this was a ResourceLocation lookup, is this a valid test?
Registry.register(registryOrNull, bclbiome.getBiomeKey(), bclbiome.biomeToRegister); && registryOrNull.get(bclbiome.getBiomeKey()).map(v -> v.isBound()).orElse(false) == false) {
bootstrapContext.register(bclbiome.getBiomeKey(), bclbiome.biomeToRegister);
BCLBiomeRegistry.register(null, bclbiome); BCLBiomeRegistry.register(null, bclbiome);
} }
return finishBiomeRegistration(bclbiome);
}
static BCLBiome finishBiomeRegistration(BCLBiome bclbiome) {
BiomeType dim = bclbiome.getIntendedType();
if (dim != null && dim.is(BiomeType.NETHER)) { if (dim != null && dim.is(BiomeType.NETHER)) {
TagManager.BIOMES.add(BiomeTags.IS_NETHER, bclbiome.getBiomeKey()); TagManager.BIOMES.add(BiomeTags.IS_NETHER, bclbiome.getBiomeKey());
TagManager.BIOMES.add(CommonBiomeTags.IN_NETHER, bclbiome.getBiomeKey()); TagManager.BIOMES.add(CommonBiomeTags.IN_NETHER, bclbiome.getBiomeKey());
@ -313,16 +317,27 @@ public class BiomeAPI {
return bclbiome; return bclbiome;
} }
public static BCLBiome registerSubBiome(BCLBiome parent, BCLBiome subBiome) { static BCLBiome registerSubBiome(
BootstapContext<Biome> bootstrapContext,
BCLBiome parent,
BCLBiome subBiome
) {
return registerSubBiome( return registerSubBiome(
bootstrapContext,
parent, parent,
subBiome, subBiome,
parent.getIntendedType() parent.getIntendedType()
); );
} }
public static BCLBiome registerSubBiome(BCLBiome parent, Biome subBiome, float genChance) { static BCLBiome registerSubBiome(
BootstapContext<Biome> bootstrapContext,
BCLBiome parent,
Biome subBiome,
float genChance
) {
return registerSubBiome( return registerSubBiome(
bootstrapContext,
parent, parent,
subBiome, subBiome,
genChance, genChance,
@ -330,16 +345,27 @@ public class BiomeAPI {
); );
} }
public static BCLBiome registerSubBiome(BCLBiome parent, BCLBiome subBiome, BiomeType dim) { static BCLBiome registerSubBiome(
registerBuiltinBiomeAndOverrideIntendedDimension(subBiome, dim); BootstapContext<Biome> bootstrapContext,
BCLBiome parent,
BCLBiome subBiome,
BiomeType dim
) {
registerBuiltinBiomeAndOverrideIntendedDimension(bootstrapContext, subBiome, dim);
parent.addSubBiome(subBiome); parent.addSubBiome(subBiome);
return subBiome; return subBiome;
} }
public static BCLBiome registerSubBiome(BCLBiome parent, Biome biome, float genChance, BiomeType dim) { static BCLBiome registerSubBiome(
BootstapContext<Biome> bootstrapContext,
BCLBiome parent,
Biome biome,
float genChance,
BiomeType dim
) {
BCLBiome subBiome = new BCLBiome(biome, VanillaBiomeSettings.createVanilla().setGenChance(genChance).build()); BCLBiome subBiome = new BCLBiome(biome, VanillaBiomeSettings.createVanilla().setGenChance(genChance).build());
return registerSubBiome(parent, subBiome, dim); return registerSubBiome(bootstrapContext, parent, subBiome, dim);
} }
/** /**
@ -349,8 +375,8 @@ public class BiomeAPI {
* @param biome {@link BCLBiome} * @param biome {@link BCLBiome}
* @return {@link BCLBiome} * @return {@link BCLBiome}
*/ */
public static BCLBiome registerEndLandBiome(BCLBiome biome) { static BCLBiome registerEndLandBiome(BootstapContext<Biome> bootstrapContext, BCLBiome biome) {
registerBuiltinBiomeAndOverrideIntendedDimension(biome, BiomeType.BCL_END_LAND); registerBuiltinBiomeAndOverrideIntendedDimension(bootstrapContext, biome, BiomeType.BCL_END_LAND);
float weight = biome.getGenChance(); float weight = biome.getGenChance();
ResourceKey<Biome> key = biome.getBiomeKey(); ResourceKey<Biome> key = biome.getBiomeKey();
@ -373,8 +399,8 @@ public class BiomeAPI {
* @param biome {@link BCLBiome} * @param biome {@link BCLBiome}
* @return {@link BCLBiome} * @return {@link BCLBiome}
*/ */
public static BCLBiome registerEndVoidBiome(BCLBiome biome) { static BCLBiome registerEndVoidBiome(BootstapContext<Biome> bootstrapContext, BCLBiome biome) {
registerBuiltinBiomeAndOverrideIntendedDimension(biome, BiomeType.BCL_END_VOID); registerBuiltinBiomeAndOverrideIntendedDimension(bootstrapContext, biome, BiomeType.BCL_END_VOID);
float weight = biome.getGenChance(); float weight = biome.getGenChance();
ResourceKey<Biome> key = biome.getBiomeKey(); ResourceKey<Biome> key = biome.getBiomeKey();
@ -392,8 +418,8 @@ public class BiomeAPI {
* @param biome {@link BCLBiome} * @param biome {@link BCLBiome}
* @return {@link BCLBiome} * @return {@link BCLBiome}
*/ */
public static BCLBiome registerEndCenterBiome(BCLBiome biome) { static BCLBiome registerEndCenterBiome(BootstapContext<Biome> bootstrapContext, BCLBiome biome) {
registerBuiltinBiomeAndOverrideIntendedDimension(biome, BiomeType.BCL_END_CENTER); registerBuiltinBiomeAndOverrideIntendedDimension(bootstrapContext, biome, BiomeType.BCL_END_CENTER);
float weight = biome.getGenChance(); float weight = biome.getGenChance();
ResourceKey<Biome> key = biome.getBiomeKey(); ResourceKey<Biome> key = biome.getBiomeKey();
@ -411,8 +437,12 @@ public class BiomeAPI {
* @param biome {@link BCLBiome} * @param biome {@link BCLBiome}
* @return {@link BCLBiome} * @return {@link BCLBiome}
*/ */
public static BCLBiome registerEndBarrensBiome(BCLBiome highlandBiome, BCLBiome biome) { static BCLBiome registerEndBarrensBiome(
registerBuiltinBiomeAndOverrideIntendedDimension(biome, BiomeType.BCL_END_BARRENS); BootstapContext<Biome> bootstrapContext,
BCLBiome highlandBiome,
BCLBiome biome
) {
registerBuiltinBiomeAndOverrideIntendedDimension(bootstrapContext, biome, BiomeType.BCL_END_BARRENS);
float weight = biome.getGenChance(); float weight = biome.getGenChance();
ResourceKey<Biome> key = biome.getBiomeKey(); ResourceKey<Biome> key = biome.getBiomeKey();
@ -431,8 +461,8 @@ public class BiomeAPI {
* @param bclBiome {@link BCLBiome} * @param bclBiome {@link BCLBiome}
* @return {@link BCLBiome} * @return {@link BCLBiome}
*/ */
public static BCLBiome registerNetherBiome(BCLBiome bclBiome) { static BCLBiome registerNetherBiome(BootstapContext<Biome> bootstrapContext, BCLBiome bclBiome) {
registerBuiltinBiomeAndOverrideIntendedDimension(bclBiome, BiomeType.BCL_NETHER); registerBuiltinBiomeAndOverrideIntendedDimension(bootstrapContext, bclBiome, BiomeType.BCL_NETHER);
ResourceKey<Biome> key = bclBiome.getBiomeKey(); ResourceKey<Biome> key = bclBiome.getBiomeKey();
if (!bclBiome.isEdgeBiome()) { if (!bclBiome.isEdgeBiome()) {
@ -451,7 +481,7 @@ public class BiomeAPI {
BCLBiome endBiome = InternalBiomeAPI.CLIENT.get(biome); BCLBiome endBiome = InternalBiomeAPI.CLIENT.get(biome);
if (endBiome == null) { if (endBiome == null) {
ResourceLocation id = WorldBootstrap.getLastRegistryAccessOrElseBuiltin() ResourceLocation id = WorldBootstrap.getLastRegistryAccessOrElseBuiltin()
.registryOrThrow(Registry.BIOME_REGISTRY) .registryOrThrow(Registries.BIOME)
.getKey(biome); .getKey(biome);
endBiome = id == null endBiome = id == null
? BCLBiomeRegistry.EMPTY_BIOME ? BCLBiomeRegistry.EMPTY_BIOME
@ -473,9 +503,8 @@ public class BiomeAPI {
Optional<ResourceKey<Biome>> key = InternalBiomeAPI.biomeRegistry.getResourceKey(biome); Optional<ResourceKey<Biome>> key = InternalBiomeAPI.biomeRegistry.getResourceKey(biome);
if (key.isPresent()) return key.get(); if (key.isPresent()) return key.get();
} }
return BuiltInRegistries.BIOME
.getResourceKey(biome) return null;
.orElseGet(null);
} }
/** /**
@ -490,7 +519,9 @@ public class BiomeAPI {
id = InternalBiomeAPI.biomeRegistry.getKey(biome); id = InternalBiomeAPI.biomeRegistry.getKey(biome);
} }
if (id == null) { if (id == null) {
id = BuiltinRegistries.BIOME.getKey(biome); final ResourceKey key = getBiomeKey(biome);
if (key != null)
id = key.location();
} }
if (id == null) { if (id == null) {
@ -531,7 +562,8 @@ public class BiomeAPI {
if (InternalBiomeAPI.biomeRegistry != null) { if (InternalBiomeAPI.biomeRegistry != null) {
key = InternalBiomeAPI.biomeRegistry.getResourceKey(biome); key = InternalBiomeAPI.biomeRegistry.getResourceKey(biome);
} else { } else {
key = BuiltinRegistries.BIOME.getResourceKey(biome); ResourceKey<Biome> kkey = getBiomeKey(biome);
key = kkey == null ? Optional.empty() : Optional.of(kkey);
} }
return getBiomeHolder(key.orElseThrow()); return getBiomeHolder(key.orElseThrow());
@ -539,13 +571,13 @@ public class BiomeAPI {
public static Holder<Biome> getBiomeHolder(ResourceKey<Biome> biomeKey) { public static Holder<Biome> getBiomeHolder(ResourceKey<Biome> biomeKey) {
if (InternalBiomeAPI.biomeRegistry != null) { if (InternalBiomeAPI.biomeRegistry != null) {
return InternalBiomeAPI.biomeRegistry.getOrCreateHolderOrThrow(biomeKey); return InternalBiomeAPI.biomeRegistry.getHolderOrThrow(biomeKey);
} }
return BuiltinRegistries.BIOME.getOrCreateHolderOrThrow(biomeKey); return null;//InternalBiomeAPI.BUILTIN_BIOMES.get(biomeKey).orElse(null);
} }
public static Holder<Biome> getBiomeHolder(ResourceLocation biome) { public static Holder<Biome> getBiomeHolder(ResourceLocation biome) {
return getBiomeHolder(ResourceKey.create(Registry.BIOME_REGISTRY, biome)); return getBiomeHolder(ResourceKey.create(Registries.BIOME, biome));
} }
/** /**
@ -591,7 +623,7 @@ public class BiomeAPI {
public static Holder<Biome> getFromRegistry(ResourceLocation biomeID) { public static Holder<Biome> getFromRegistry(ResourceLocation biomeID) {
if (InternalBiomeAPI.biomeRegistry != null) if (InternalBiomeAPI.biomeRegistry != null)
return InternalBiomeAPI.biomeRegistry.getHolder(ResourceKey.create(Registry.BIOME_REGISTRY, biomeID)) return InternalBiomeAPI.biomeRegistry.getHolder(ResourceKey.create(Registries.BIOME, biomeID))
.orElseThrow(); .orElseThrow();
return getFromBuiltinRegistry(biomeID); return getFromBuiltinRegistry(biomeID);
} }
@ -605,12 +637,12 @@ public class BiomeAPI {
@Nullable @Nullable
public static Holder<Biome> getFromBuiltinRegistry(ResourceLocation biomeID) { public static Holder<Biome> getFromBuiltinRegistry(ResourceLocation biomeID) {
return BuiltinRegistries.BIOME.getHolder(ResourceKey.create(Registry.BIOME_REGISTRY, biomeID)).orElse(null); return null;
} }
@Nullable @Nullable
public static Holder<Biome> getFromBuiltinRegistry(ResourceKey<Biome> key) { public static Holder<Biome> getFromBuiltinRegistry(ResourceKey<Biome> key) {
return BuiltinRegistries.BIOME.getHolder(key).orElse(null); return null;
} }

View file

@ -2,11 +2,12 @@ package org.betterx.bclib.api.v2.levelgen.biomes;
import org.betterx.bclib.BCLib; import org.betterx.bclib.BCLib;
import org.betterx.bclib.config.Configs; import org.betterx.bclib.config.Configs;
import org.betterx.bclib.mixin.common.BiomeGenerationSettingsAccessor;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
@ -56,34 +57,13 @@ public class InternalBiomeAPI {
static final Map<Biome, BCLBiome> CLIENT = Maps.newHashMap(); static final Map<Biome, BCLBiome> CLIENT = Maps.newHashMap();
static final Map<Holder<PlacedFeature>, Integer> FEATURE_ORDER = Maps.newHashMap(); static final Map<Holder<PlacedFeature>, Integer> FEATURE_ORDER = Maps.newHashMap();
static final Map<Registry<Biome>, AtomicInteger> BIOME_ADDITIONS = Maps.newHashMap(); static final Map<HolderGetter<Biome>, AtomicInteger> BIOME_ADDITIONS = Maps.newHashMap();
static final MutableInt FEATURE_ORDER_ID = new MutableInt(0); static final MutableInt FEATURE_ORDER_ID = new MutableInt(0);
static final Map<ResourceKey<LevelStem>, List<BiConsumer<ResourceLocation, Holder<Biome>>>> MODIFICATIONS = Maps.newHashMap(); static final Map<ResourceKey<LevelStem>, List<BiConsumer<ResourceLocation, Holder<Biome>>>> MODIFICATIONS = Maps.newHashMap();
static final Map<ResourceKey, List<BiConsumer<ResourceLocation, Holder<Biome>>>> TAG_ADDERS = Maps.newHashMap(); static final Map<ResourceKey, List<BiConsumer<ResourceLocation, Holder<Biome>>>> TAG_ADDERS = Maps.newHashMap();
static Registry<Biome> biomeRegistry; static Registry<Biome> biomeRegistry;
static RegistryAccess registryAccess; static RegistryAccess registryAccess;
static void initFeatureOrder() {
if (!FEATURE_ORDER.isEmpty()) {
return;
}
BuiltinRegistries.BIOME
.entrySet()
.stream()
.filter(entry -> entry
.getKey()
.location()
.getNamespace()
.equals("minecraft"))
.map(Map.Entry::getValue)
.map(biome -> (BiomeGenerationSettingsAccessor) biome.getGenerationSettings())
.map(BiomeGenerationSettingsAccessor::bclib_getFeatures)
.forEach(stepFeatureSuppliers -> stepFeatureSuppliers.forEach(step -> step.forEach(feature -> {
FEATURE_ORDER.computeIfAbsent(feature, f -> FEATURE_ORDER_ID.getAndIncrement());
})));
}
public static RegistryAccess worldRegistryAccess() { public static RegistryAccess worldRegistryAccess() {
return registryAccess; return registryAccess;
} }
@ -96,7 +76,7 @@ public class InternalBiomeAPI {
public static void initRegistry(RegistryAccess access) { public static void initRegistry(RegistryAccess access) {
if (access != registryAccess) { if (access != registryAccess) {
registryAccess = access; registryAccess = access;
Registry<Biome> biomeRegistry = access.registry(Registry.BIOME_REGISTRY).orElse(null); Registry<Biome> biomeRegistry = access.registry(Registries.BIOME).orElse(null);
if (biomeRegistry != InternalBiomeAPI.biomeRegistry) { if (biomeRegistry != InternalBiomeAPI.biomeRegistry) {
InternalBiomeAPI.biomeRegistry = biomeRegistry; InternalBiomeAPI.biomeRegistry = biomeRegistry;
@ -274,7 +254,8 @@ public class InternalBiomeAPI {
static { static {
DynamicRegistrySetupCallback.EVENT.register(registryManager -> { DynamicRegistrySetupCallback.EVENT.register(registryManager -> {
Optional<? extends Registry<Biome>> oBiomeRegistry = registryManager.registry(Registry.BIOME_REGISTRY); Optional<? extends Registry<Biome>> oBiomeRegistry = registryManager.asDynamicRegistryManager()
.registry(Registries.BIOME);
if (oBiomeRegistry.isPresent()) { if (oBiomeRegistry.isPresent()) {
RegistryEntryAddedCallback RegistryEntryAddedCallback
.event(oBiomeRegistry.get()) .event(oBiomeRegistry.get())
@ -304,21 +285,11 @@ public class InternalBiomeAPI {
* @param registry The registry you want to check * @param registry The registry you want to check
* @return The current number of additions since the world creation was started * @return The current number of additions since the world creation was started
*/ */
public static int getBiomeRegistryModificationCount(Registry<Biome> registry) { public static int getBiomeRegistryModificationCount(HolderGetter<Biome> registry) {
if (registry == null) return 0; if (registry == null) return 0;
return BIOME_ADDITIONS.computeIfAbsent(registry, reg -> new AtomicInteger(0)).get(); return BIOME_ADDITIONS.computeIfAbsent(registry, reg -> new AtomicInteger(0)).get();
} }
public static boolean registryContainsBound(ResourceKey<Biome> key) {
Registry<Biome> reg = biomeRegistry;
if (reg == null) reg = BuiltinRegistries.BIOME;
if (reg.containsKey(key)) {
return reg.getOrCreateHolderOrThrow(key).isBound();
}
return false;
}
public static void registerBCLBiomeData(BCLBiome biome) { public static void registerBCLBiomeData(BCLBiome biome) {
try { try {
BCLBiomeRegistry.register(registryAccess, biome); BCLBiomeRegistry.register(registryAccess, biome);
@ -336,7 +307,7 @@ public class InternalBiomeAPI {
*/ */
public static BCLBiome registerBuiltinBiome(BCLBiome bclbiome) { public static BCLBiome registerBuiltinBiome(BCLBiome bclbiome) {
return BiomeAPI.registerBiome(bclbiome, BuiltinRegistries.BIOME); return BiomeAPI.finishBiomeRegistration(bclbiome);
} }
} }

View file

@ -1,11 +1,14 @@
package org.betterx.bclib.api.v2.levelgen.structures; package org.betterx.bclib.api.v2.levelgen.structures;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeBuilder; import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeBuilder;
import org.betterx.bclib.mixin.common.StructuresAccessor;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import net.minecraft.core.*; import net.minecraft.core.BlockPos;
import net.minecraft.data.worldgen.StructureSets; import net.minecraft.core.Holder;
import net.minecraft.core.HolderSet;
import net.minecraft.core.QuartPos;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
@ -39,7 +42,8 @@ public class BCLStructure<S extends Structure> {
private static HolderSet<Biome> biomes(TagKey<Biome> tagKey) { private static HolderSet<Biome> biomes(TagKey<Biome> tagKey) {
return BuiltinRegistries.BIOME.getOrCreateTag(tagKey); //TODO:1.19.3 Refactor
return null; //BuiltInRegistries.BIOME.getOrCreateTag(tagKey);
} }
private static Structure.StructureSettings structure( private static Structure.StructureSettings structure(
@ -60,10 +64,12 @@ public class BCLStructure<S extends Structure> {
} }
private static <S extends Structure> StructureType<S> registerStructureType( private static <S extends Structure> StructureType<S> registerStructureType(
BootstapContext<StructureType<?>> bootstrapContext,
ResourceLocation id, ResourceLocation id,
Codec<S> codec Codec<S> codec
) { ) {
return Registry.register(Registry.STRUCTURE_TYPES, id, () -> codec); final ResourceKey<StructureType<?>> key = ResourceKey.create(Registries.STRUCTURE_TYPE, id);
return (StructureType<S>) bootstrapContext.register(key, () -> (Codec<Structure>) codec).value();
} }
protected BCLStructure( protected BCLStructure(
@ -79,15 +85,18 @@ public class BCLStructure<S extends Structure> {
this.featureStep = step; this.featureStep = step;
this.STRUCTURE_CODEC = codec; this.STRUCTURE_CODEC = codec;
this.spreadConfig = placement; this.spreadConfig = placement;
this.structureKey = ResourceKey.create(Registry.STRUCTURE_REGISTRY, id); this.structureKey = ResourceKey.create(Registries.STRUCTURE, id);
this.structureSetKey = ResourceKey.create(Registry.STRUCTURE_SET_REGISTRY, id); this.structureSetKey = ResourceKey.create(Registries.STRUCTURE_SET, id);
this.structureType = registerStructureType(id, STRUCTURE_CODEC); //TODO:1.19.3 Refactor
this.structureType = null; //registerStructureType(id, STRUCTURE_CODEC);
this.biomeTag = biomeTag; this.biomeTag = biomeTag;
this.baseStructure = structureBuilder.apply(structure(this.biomeTag, featureStep, terrainAdjustment)); this.baseStructure = structureBuilder.apply(structure(this.biomeTag, featureStep, terrainAdjustment));
this.structure = StructuresAccessor.callRegister(structureKey, this.baseStructure); //TODO:1.19.3 Refactor
StructureSets.register(structureSetKey, this.structure, spreadConfig); this.structure = null; //StructuresAccessor.callRegister(structureKey, this.baseStructure);
//TODO:1.19.3 Refactor
//StructureSets.register(structureSetKey, this.structure, spreadConfig);
} }
/** /**

View file

@ -3,6 +3,7 @@ package org.betterx.bclib.api.v2.levelgen.structures;
import org.betterx.worlds.together.tag.v3.TagManager; import org.betterx.worlds.together.tag.v3.TagManager;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
@ -16,6 +17,10 @@ import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement
import java.util.function.Function; import java.util.function.Function;
public class BCLStructureBuilder<S extends Structure> { public class BCLStructureBuilder<S extends Structure> {
public record Context(BootstapContext<Structure> bootstrapContext) {
}
private static final BCLStructureBuilder INSTANCE = new BCLStructureBuilder(); private static final BCLStructureBuilder INSTANCE = new BCLStructureBuilder();
private ResourceLocation structureID; private ResourceLocation structureID;

View file

@ -4,9 +4,8 @@ import org.betterx.bclib.BCLib;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.BlockPos.MutableBlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.Registry;
import net.minecraft.core.Vec3i; import net.minecraft.core.Vec3i;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
@ -104,7 +103,8 @@ public class StructureNBT {
CompoundTag nbttagcompound = NbtIo.readCompressed(stream); CompoundTag nbttagcompound = NbtIo.readCompressed(stream);
StructureTemplate template = new StructureTemplate(); StructureTemplate template = new StructureTemplate();
template.load(HolderLookup.forRegistry(Registry.BLOCK), nbttagcompound);
template.load(BuiltInRegistries.BLOCK.asLookup(), nbttagcompound);
return template; return template;
} }

View file

@ -1,7 +1,6 @@
package org.betterx.bclib.api.v2.levelgen.structures; package org.betterx.bclib.api.v2.levelgen.structures;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag; import net.minecraft.nbt.ListTag;
@ -120,7 +119,7 @@ public class StructureWorld {
BlockState[] states = new BlockState[map2.size()]; BlockState[] states = new BlockState[map2.size()];
for (int i = 0; i < states.length; i++) { for (int i = 0; i < states.length; i++) {
states[i] = NbtUtils.readBlockState( states[i] = NbtUtils.readBlockState(
HolderLookup.forRegistry(BuiltInRegistries.BLOCK), BuiltInRegistries.BLOCK.asLookup(),
(CompoundTag) map2.get(i) (CompoundTag) map2.get(i)
); );
} }

View file

@ -10,6 +10,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.Vec3i; import net.minecraft.core.Vec3i;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
@ -40,7 +41,7 @@ public class TemplatePiece extends TemplateStructurePiece {
private static StructurePieceType setFullContextPieceId(StructurePieceType structurePieceType, String id) { private static StructurePieceType setFullContextPieceId(StructurePieceType structurePieceType, String id) {
return Registry.register(Registry.STRUCTURE_PIECE, BCLib.makeID(id), structurePieceType); return Registry.register(BuiltInRegistries.STRUCTURE_PIECE, BCLib.makeID(id), structurePieceType);
} }
private static StructurePieceType setTemplatePieceId( private static StructurePieceType setTemplatePieceId(

View file

@ -5,6 +5,7 @@ import org.betterx.bclib.interfaces.NumericProvider;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.valueproviders.UniformFloat; import net.minecraft.util.valueproviders.UniformFloat;
import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.SurfaceRules;
@ -71,7 +72,7 @@ public class Conditions {
public static final NumericProvider NETHER_NOISE = new NetherNoiseCondition(); public static final NumericProvider NETHER_NOISE = new NetherNoiseCondition();
public static void register(ResourceLocation location, Codec<? extends SurfaceRules.ConditionSource> codec) { public static void register(ResourceLocation location, Codec<? extends SurfaceRules.ConditionSource> codec) {
Registry.register(Registry.CONDITION, location, codec); Registry.register(BuiltInRegistries.MATERIAL_CONDITION, location, codec);
} }
public static void registerNumeric(ResourceLocation location, Codec<? extends NumericProvider> codec) { public static void registerNumeric(ResourceLocation location, Codec<? extends NumericProvider> codec) {
@ -85,6 +86,6 @@ public class Conditions {
register(BCLib.makeID("volume_threshold_condition"), VolumeThresholdCondition.CODEC); register(BCLib.makeID("volume_threshold_condition"), VolumeThresholdCondition.CODEC);
register(BCLib.makeID("rough_noise_condition"), RoughNoiseCondition.CODEC); register(BCLib.makeID("rough_noise_condition"), RoughNoiseCondition.CODEC);
Registry.register(Registry.RULE, "bclib_switch_rule", SwitchRuleSource.CODEC); Registry.register(BuiltInRegistries.MATERIAL_RULE, "bclib_switch_rule", SwitchRuleSource.CODEC);
} }
} }

View file

@ -6,7 +6,7 @@ import org.betterx.bclib.noise.Noises;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.util.KeyDispatchDataCodec; import net.minecraft.util.KeyDispatchDataCodec;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
@ -18,7 +18,7 @@ import net.minecraft.world.level.levelgen.synth.NormalNoise;
public class RoughNoiseCondition implements SurfaceRules.ConditionSource { public class RoughNoiseCondition implements SurfaceRules.ConditionSource {
public static final Codec<RoughNoiseCondition> CODEC = RecordCodecBuilder.create(instance -> instance public static final Codec<RoughNoiseCondition> CODEC = RecordCodecBuilder.create(instance -> instance
.group( .group(
ResourceKey.codec(Registry.NOISE_REGISTRY).fieldOf("noise").forGetter(o -> o.noise), ResourceKey.codec(Registries.NOISE).fieldOf("noise").forGetter(o -> o.noise),
Codec.DOUBLE.fieldOf("min_threshold").forGetter(o -> o.minThreshold), Codec.DOUBLE.fieldOf("min_threshold").forGetter(o -> o.minThreshold),
Codec.DOUBLE.fieldOf("max_threshold").forGetter(o -> o.maxThreshold), Codec.DOUBLE.fieldOf("max_threshold").forGetter(o -> o.maxThreshold),
FloatProvider.CODEC.fieldOf("roughness").forGetter(o -> o.roughness) FloatProvider.CODEC.fieldOf("roughness").forGetter(o -> o.roughness)

View file

@ -4,7 +4,8 @@ import org.betterx.bclib.api.v2.levelgen.biomes.InternalBiomeAPI;
import org.betterx.worlds.together.tag.v3.CommonPoiTags; import org.betterx.worlds.together.tag.v3.CommonPoiTags;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
@ -23,13 +24,19 @@ public class PoiManager {
int maxTickets, int maxTickets,
int validRanges int validRanges
) { ) {
ResourceKey<PoiType> key = ResourceKey.create(Registry.POINT_OF_INTEREST_TYPE_REGISTRY, location); ResourceKey<PoiType> key = ResourceKey.create(Registries.POINT_OF_INTEREST_TYPE, location);
PoiType type = PoiTypes.register(Registry.POINT_OF_INTEREST_TYPE, key, matchingStates, maxTickets, validRanges); PoiType type = PoiTypes.register(
BuiltInRegistries.POINT_OF_INTEREST_TYPE,
key,
matchingStates,
maxTickets,
validRanges
);
return new BCLPoiType(key, type, matchingStates, maxTickets, validRanges); return new BCLPoiType(key, type, matchingStates, maxTickets, validRanges);
} }
public static void setTag(ResourceKey<PoiType> type, TagKey<Block> tag) { public static void setTag(ResourceKey<PoiType> type, TagKey<Block> tag) {
var oHolder = Registry.POINT_OF_INTEREST_TYPE.getHolder(type); var oHolder = BuiltInRegistries.POINT_OF_INTEREST_TYPE.getHolder(type);
if (oHolder.isPresent()) { if (oHolder.isPresent()) {
setTag(oHolder.get().value(), tag); setTag(oHolder.get().value(), tag);
didAddTagFor(oHolder.get(), tag); didAddTagFor(oHolder.get(), tag);

View file

@ -5,8 +5,8 @@ import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.BonemealableBlock; import net.minecraft.world.level.block.BonemealableBlock;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -18,7 +18,7 @@ public interface BonemealNyliumLike extends BonemealableBlock {
BCLConfigureFeature<? extends Feature<?>, ?> getCoverFeature(); BCLConfigureFeature<? extends Feature<?>, ?> getCoverFeature();
default boolean isValidBonemealTarget( default boolean isValidBonemealTarget(
BlockGetter blockGetter, LevelReader blockGetter,
BlockPos blockPos, BlockPos blockPos,
BlockState blockState, BlockState blockState,
boolean bl boolean bl

View file

@ -3,7 +3,7 @@ package org.betterx.bclib.api.v3.bonemeal;
import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature; import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.Feature;
@ -19,7 +19,7 @@ public class FeatureSpreader implements BonemealNyliumLike {
@Override @Override
public boolean isValidBonemealTarget( public boolean isValidBonemealTarget(
BlockGetter blockGetter, LevelReader blockGetter,
BlockPos blockPos, BlockPos blockPos,
BlockState blockState, BlockState blockState,
boolean bl boolean bl

View file

@ -38,12 +38,12 @@ public class BCLConfigureFeature<F extends Feature<FC>, FC extends FeatureConfig
} }
public BCLPlacedFeatureBuilder<F, FC> place() { public BCLPlacedFeatureBuilder<F, FC> place(BCLPlacedFeatureBuilder.Context ctx) {
return place(this.id); return place(ctx, this.id);
} }
public BCLPlacedFeatureBuilder<F, FC> place(ResourceLocation id) { public BCLPlacedFeatureBuilder<F, FC> place(BCLPlacedFeatureBuilder.Context ctx, ResourceLocation id) {
return BCLPlacedFeatureBuilder.place(id, this); return BCLPlacedFeatureBuilder.place(ctx, id, this);
} }
static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLConfigureFeature<F, FC> create(Holder<ConfiguredFeature<FC, F>> registeredFeature) { static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLConfigureFeature<F, FC> create(Holder<ConfiguredFeature<FC, F>> registeredFeature) {

View file

@ -6,6 +6,7 @@ import org.betterx.bclib.api.v3.levelgen.features.features.*;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.Feature;
@ -99,6 +100,6 @@ public class BCLFeature<F extends Feature<FC>, FC extends FeatureConfiguration>
ResourceLocation location, ResourceLocation location,
F feature F feature
) { ) {
return Registry.register(Registry.FEATURE, location, feature); return Registry.register(BuiltInRegistries.FEATURE, location, feature);
} }
} }

View file

@ -17,7 +17,9 @@ import org.betterx.bclib.util.Triple;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.random.SimpleWeightedRandomList; import net.minecraft.util.random.SimpleWeightedRandomList;
import net.minecraft.util.valueproviders.ConstantInt; import net.minecraft.util.valueproviders.ConstantInt;
@ -39,188 +41,198 @@ import java.util.Collection;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.function.BiFunction;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends FeatureConfiguration> { public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends FeatureConfiguration> {
@FunctionalInterface
public interface HolderBuilder<F extends Feature<FC>, FC extends FeatureConfiguration> {
Holder<ConfiguredFeature<FC, F>> apply(
Context ctx,
ResourceLocation id,
ConfiguredFeature<FC, F> feature
);
}
public record Context(BootstapContext<ConfiguredFeature<?, ?>> bootstrapContext) {
/**
* Starts a new {@link BCLFeature} builder.
*
* @param featureID {@link ResourceLocation} feature identifier.
* @param feature {@link Feature} to construct.
* @return {@link BCLFeatureBuilder} instance.
*/
public <F extends Feature<FC>, FC extends FeatureConfiguration> WithConfiguration<F, FC> start(
ResourceLocation featureID,
F feature
) {
return new WithConfiguration<>(this, featureID, feature);
}
public ForSimpleBlock start(
ResourceLocation featureID,
Block block
) {
return start(featureID, BlockStateProvider.simple(block));
}
public ForSimpleBlock start(
ResourceLocation featureID,
BlockState state
) {
return start(featureID, BlockStateProvider.simple(state));
}
public ForSimpleBlock start(
ResourceLocation featureID,
BlockStateProvider provider
) {
return new ForSimpleBlock(
this,
featureID,
(SimpleBlockFeature) Feature.SIMPLE_BLOCK,
provider
);
}
public WeightedBlock startWeighted(ResourceLocation featureID) {
return new WeightedBlock(
this,
featureID,
(SimpleBlockFeature) Feature.SIMPLE_BLOCK
);
}
public WeightedBlockPatch startWeightedRandomPatch(ResourceLocation featureID) {
return new WeightedBlockPatch(
this,
featureID,
(RandomPatchFeature) Feature.RANDOM_PATCH
);
}
public WeightedBlockPatch startBonemealPatch(
ResourceLocation featureID
) {
return startWeightedRandomPatch(featureID).likeDefaultBonemeal();
}
public RandomPatch startRandomPatch(
ResourceLocation featureID,
Holder<PlacedFeature> featureToPlace
) {
return new RandomPatch(
this,
featureID,
(RandomPatchFeature) Feature.RANDOM_PATCH,
featureToPlace
);
}
public AsRandomSelect startRandomSelect(
ResourceLocation featureID
) {
return new AsRandomSelect(
this,
featureID,
(RandomSelectorFeature) Feature.RANDOM_SELECTOR
);
}
public AsMultiPlaceRandomSelect startRandomSelect(
ResourceLocation featureID,
AsMultiPlaceRandomSelect.Placer placementModFunction
) {
return new AsMultiPlaceRandomSelect(
this,
featureID,
(RandomSelectorFeature) Feature.RANDOM_SELECTOR,
placementModFunction
);
}
public NetherForrestVegetation startNetherVegetation(
ResourceLocation featureID
) {
return new NetherForrestVegetation(
this,
featureID,
(NetherForestVegetationFeature) Feature.NETHER_FOREST_VEGETATION
);
}
public NetherForrestVegetation startBonemealNetherVegetation(ResourceLocation featureID) {
return new NetherForrestVegetation(
this,
featureID,
(NetherForestVegetationFeature) Feature.NETHER_FOREST_VEGETATION
).spreadHeight(1).spreadWidth(3);
}
public WithTemplates startWithTemplates(ResourceLocation featureID) {
return new WithTemplates(
this,
featureID,
(TemplateFeature<TemplateFeatureConfig>) BCLFeature.TEMPLATE
);
}
public AsBlockColumn<BlockColumnFeature> startColumn(ResourceLocation featureID) {
return new AsBlockColumn<>(
this,
featureID,
(BlockColumnFeature) Feature.BLOCK_COLUMN
);
}
public AsPillar startPillar(
ResourceLocation featureID,
PillarFeatureConfig.KnownTransformers transformer
) {
return new AsPillar(
this,
featureID,
(PillarFeature) BCLFeature.PILLAR,
transformer
);
}
public AsSequence startSequence(ResourceLocation featureID) {
return new AsSequence(
this,
featureID,
(SequenceFeature) BCLFeature.SEQUENCE
);
}
public AsOre startOre(ResourceLocation featureID) {
return new AsOre(
this,
featureID,
(OreFeature) Feature.ORE
);
}
public FacingBlock startFacing(ResourceLocation featureID) {
return new FacingBlock(
this,
featureID,
(PlaceBlockFeature<PlaceFacingBlockConfig>) BCLFeature.PLACE_BLOCK
);
}
}
protected final ResourceLocation featureID; protected final ResourceLocation featureID;
private final F feature; private final F feature;
private BCLFeatureBuilder(ResourceLocation featureID, F feature) { protected final Context ctx;
private BCLFeatureBuilder(Context ctx, ResourceLocation featureID, F feature) {
this.featureID = featureID; this.featureID = featureID;
this.feature = feature; this.feature = feature;
this.ctx = ctx;
} }
/**
* Starts a new {@link BCLFeature} builder.
*
* @param featureID {@link ResourceLocation} feature identifier.
* @param feature {@link Feature} to construct.
* @return {@link BCLFeatureBuilder} instance.
*/
public static <F extends Feature<FC>, FC extends FeatureConfiguration> WithConfiguration<F, FC> start(
ResourceLocation featureID,
F feature
) {
return new WithConfiguration<>(featureID, feature);
}
public static ForSimpleBlock start(
ResourceLocation featureID,
Block block
) {
return start(featureID, BlockStateProvider.simple(block));
}
public static ForSimpleBlock start(
ResourceLocation featureID,
BlockState state
) {
return start(featureID, BlockStateProvider.simple(state));
}
public static ForSimpleBlock start(
ResourceLocation featureID,
BlockStateProvider provider
) {
return new ForSimpleBlock(
featureID,
(SimpleBlockFeature) Feature.SIMPLE_BLOCK,
provider
);
}
public static WeightedBlock startWeighted(
ResourceLocation featureID
) {
return new WeightedBlock(
featureID,
(SimpleBlockFeature) Feature.SIMPLE_BLOCK
);
}
public static WeightedBlockPatch startWeightedRandomPatch(
ResourceLocation featureID
) {
return new WeightedBlockPatch(
featureID,
(RandomPatchFeature) Feature.RANDOM_PATCH
);
}
public static WeightedBlockPatch startBonemealPatch(
ResourceLocation featureID
) {
return startWeightedRandomPatch(featureID).likeDefaultBonemeal();
}
public static RandomPatch startRandomPatch(
ResourceLocation featureID,
Holder<PlacedFeature> featureToPlace
) {
return new RandomPatch(
featureID,
(RandomPatchFeature) Feature.RANDOM_PATCH,
featureToPlace
);
}
public static AsRandomSelect startRandomSelect(
ResourceLocation featureID
) {
return new AsRandomSelect(
featureID,
(RandomSelectorFeature) Feature.RANDOM_SELECTOR
);
}
public static AsMultiPlaceRandomSelect startRandomSelect(
ResourceLocation featureID,
AsMultiPlaceRandomSelect.Placer placementModFunction
) {
return new AsMultiPlaceRandomSelect(
featureID,
(RandomSelectorFeature) Feature.RANDOM_SELECTOR,
placementModFunction
);
}
public static NetherForrestVegetation startNetherVegetation(
ResourceLocation featureID
) {
return new NetherForrestVegetation(
featureID,
(NetherForestVegetationFeature) Feature.NETHER_FOREST_VEGETATION
);
}
public static NetherForrestVegetation startBonemealNetherVegetation(
ResourceLocation featureID
) {
return new NetherForrestVegetation(
featureID,
(NetherForestVegetationFeature) Feature.NETHER_FOREST_VEGETATION
).spreadHeight(1).spreadWidth(3);
}
public static WithTemplates startWithTemplates(
ResourceLocation featureID
) {
return new WithTemplates(
featureID,
(TemplateFeature<TemplateFeatureConfig>) org.betterx.bclib.api.v3.levelgen.features.BCLFeature.TEMPLATE
);
}
public static AsBlockColumn<BlockColumnFeature> startColumn(
ResourceLocation featureID
) {
return new AsBlockColumn<>(
featureID,
(BlockColumnFeature) Feature.BLOCK_COLUMN
);
}
public static AsPillar startPillar(
ResourceLocation featureID,
PillarFeatureConfig.KnownTransformers transformer
) {
return new AsPillar(
featureID,
(PillarFeature) BCLFeature.PILLAR,
transformer
);
}
public static AsSequence startSequence(
ResourceLocation featureID
) {
return new AsSequence(
featureID,
(SequenceFeature) BCLFeature.SEQUENCE
);
}
public static AsOre startOre(
ResourceLocation featureID
) {
return new AsOre(
featureID,
(OreFeature) Feature.ORE
);
}
public static FacingBlock startFacing(
ResourceLocation featureID
) {
return new FacingBlock(
featureID,
(PlaceBlockFeature<PlaceFacingBlockConfig>) BCLFeature.PLACE_BLOCK
);
}
/** /**
* Internally used by the builder. Normally you should not have to call this method directly as it is * Internally used by the builder. Normally you should not have to call this method directly as it is
@ -233,25 +245,23 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
* @return The Holder for the new Feature * @return The Holder for the new Feature
*/ */
public static <F extends Feature<FC>, FC extends FeatureConfiguration> Holder<ConfiguredFeature<FC, F>> register( public static <F extends Feature<FC>, FC extends FeatureConfiguration> Holder<ConfiguredFeature<FC, F>> register(
Context ctx,
ResourceLocation id, ResourceLocation id,
ConfiguredFeature<FC, F> cFeature ConfiguredFeature<FC, F> cFeature
) { ) {
return (Holder<ConfiguredFeature<FC, F>>) (Object) BuiltInRegistries.register( ResourceKey<ConfiguredFeature<?, ?>> key = ResourceKey.create(Registries.CONFIGURED_FEATURE, id);
BuiltInRegistries.CONFIGURED_FEATURE, return (Holder<ConfiguredFeature<FC, F>>) (Object) ctx.bootstrapContext.register(key, cFeature);
id,
cFeature
);
} }
public abstract FC createConfiguration(); public abstract FC createConfiguration();
protected BCLConfigureFeature<F, FC> buildAndRegister(BiFunction<ResourceLocation, ConfiguredFeature<FC, F>, Holder<ConfiguredFeature<FC, F>>> holderBuilder) { protected BCLConfigureFeature<F, FC> buildAndRegister(HolderBuilder<F, FC> holderBuilder) {
FC config = createConfiguration(); FC config = createConfiguration();
if (config == null) { if (config == null) {
throw new IllegalStateException("Feature configuration for " + featureID + " can not be null!"); throw new IllegalStateException("Feature configuration for " + featureID + " can not be null!");
} }
ConfiguredFeature<FC, F> cFeature = new ConfiguredFeature<>(feature, config); ConfiguredFeature<FC, F> cFeature = new ConfiguredFeature<>(feature, config);
Holder<ConfiguredFeature<FC, F>> holder = holderBuilder.apply(featureID, cFeature); Holder<ConfiguredFeature<FC, F>> holder = holderBuilder.apply(this.ctx, featureID, cFeature);
return new BCLConfigureFeature<>(featureID, holder, true); return new BCLConfigureFeature<>(featureID, holder, true);
} }
@ -260,12 +270,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
} }
public BCLConfigureFeature<F, FC> build() { public BCLConfigureFeature<F, FC> build() {
return buildAndRegister((id, cFeature) -> Holder.direct(cFeature)); return buildAndRegister((ctx, id, cFeature) -> Holder.direct(cFeature));
} }
public BCLInlinePlacedBuilder<F, FC> inlinePlace() { public BCLInlinePlacedBuilder<F, FC> inlinePlace() {
BCLConfigureFeature<F, FC> f = build(); BCLConfigureFeature<F, FC> f = build();
return BCLInlinePlacedBuilder.place(f); return BCLInlinePlacedBuilder.place(ctx, f);
} }
public Holder<PlacedFeature> inlinePlace(BCLInlinePlacedBuilder<F, FC> placer) { public Holder<PlacedFeature> inlinePlace(BCLInlinePlacedBuilder<F, FC> placer) {
@ -278,8 +288,8 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
private int size = 6; private int size = 6;
private float discardChanceOnAirExposure = 0; private float discardChanceOnAirExposure = 0;
private AsOre(ResourceLocation featureID, OreFeature feature) { private AsOre(Context ctx, ResourceLocation featureID, OreFeature feature) {
super(featureID, feature); super(ctx, featureID, feature);
} }
public AsOre add(Block containedIn, Block ore) { public AsOre add(Block containedIn, Block ore) {
@ -328,11 +338,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
private BlockPredicate allowedPlacement = BlockPredicate.ONLY_IN_AIR_PREDICATE; private BlockPredicate allowedPlacement = BlockPredicate.ONLY_IN_AIR_PREDICATE;
private AsPillar( private AsPillar(
ResourceLocation featureID, @NotNull Context ctx,
PillarFeature feature, @NotNull ResourceLocation featureID,
PillarFeatureConfig.KnownTransformers transformer @NotNull PillarFeature feature,
@NotNull PillarFeatureConfig.KnownTransformers transformer
) { ) {
super(featureID, feature); super(ctx, featureID, feature);
this.transformer = transformer; this.transformer = transformer;
} }
@ -403,8 +414,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
public static class AsSequence extends BCLFeatureBuilder<SequenceFeature, SequenceFeatureConfig> { public static class AsSequence extends BCLFeatureBuilder<SequenceFeature, SequenceFeatureConfig> {
private final List<Holder<PlacedFeature>> features = new LinkedList<>(); private final List<Holder<PlacedFeature>> features = new LinkedList<>();
private AsSequence(ResourceLocation featureID, SequenceFeature feature) { private AsSequence(
super(featureID, feature); @NotNull Context ctx,
@NotNull ResourceLocation featureID,
@NotNull SequenceFeature feature
) {
super(ctx, featureID, feature);
} }
@ -429,8 +444,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
private BlockPredicate allowedPlacement = BlockPredicate.ONLY_IN_AIR_PREDICATE; private BlockPredicate allowedPlacement = BlockPredicate.ONLY_IN_AIR_PREDICATE;
private boolean prioritizeTip = false; private boolean prioritizeTip = false;
private AsBlockColumn(ResourceLocation featureID, FF feature) { private AsBlockColumn(
super(featureID, feature); @NotNull Context ctx,
@NotNull ResourceLocation featureID,
@NotNull FF feature
) {
super(ctx, featureID, feature);
} }
public AsBlockColumn<FF> add(int height, Block block) { public AsBlockColumn<FF> add(int height, Block block) {
@ -541,8 +560,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
public static class WithTemplates extends BCLFeatureBuilder<TemplateFeature<TemplateFeatureConfig>, TemplateFeatureConfig> { public static class WithTemplates extends BCLFeatureBuilder<TemplateFeature<TemplateFeatureConfig>, TemplateFeatureConfig> {
private final List<StructureWorldNBT> templates = new LinkedList<>(); private final List<StructureWorldNBT> templates = new LinkedList<>();
private WithTemplates(ResourceLocation featureID, TemplateFeature<TemplateFeatureConfig> feature) { private WithTemplates(
super(featureID, feature); @NotNull Context ctx,
@NotNull ResourceLocation featureID,
@NotNull TemplateFeature<TemplateFeatureConfig> feature
) {
super(ctx, featureID, feature);
} }
public WithTemplates add( public WithTemplates add(
@ -567,8 +590,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
private int spreadWidth = 8; private int spreadWidth = 8;
private int spreadHeight = 4; private int spreadHeight = 4;
private NetherForrestVegetation(ResourceLocation featureID, NetherForestVegetationFeature feature) { private NetherForrestVegetation(
super(featureID, feature); @NotNull Context ctx,
@NotNull ResourceLocation featureID,
@NotNull NetherForestVegetationFeature feature
) {
super(ctx, featureID, feature);
} }
public NetherForrestVegetation spreadWidth(int v) { public NetherForrestVegetation spreadWidth(int v) {
@ -634,11 +661,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
private int ySpread = 3; private int ySpread = 3;
private RandomPatch( private RandomPatch(
@NotNull Context ctx,
@NotNull ResourceLocation featureID, @NotNull ResourceLocation featureID,
@NotNull RandomPatchFeature feature, @NotNull RandomPatchFeature feature,
@NotNull Holder<PlacedFeature> featureToPlace @NotNull Holder<PlacedFeature> featureToPlace
) { ) {
super(featureID, feature); super(ctx, featureID, feature);
this.featureToPlace = featureToPlace; this.featureToPlace = featureToPlace;
} }
@ -678,8 +706,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
public static class WithConfiguration<F extends Feature<FC>, FC extends FeatureConfiguration> extends BCLFeatureBuilder<F, FC> { public static class WithConfiguration<F extends Feature<FC>, FC extends FeatureConfiguration> extends BCLFeatureBuilder<F, FC> {
private FC configuration; private FC configuration;
private WithConfiguration(@NotNull ResourceLocation featureID, @NotNull F feature) { private WithConfiguration(
super(featureID, feature); @NotNull Context ctx,
@NotNull ResourceLocation featureID,
@NotNull F feature
) {
super(ctx, featureID, feature);
} }
public WithConfiguration<F, FC> configuration(FC config) { public WithConfiguration<F, FC> configuration(FC config) {
@ -709,8 +741,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
private int count = 0; private int count = 0;
private List<Direction> directions = PlaceFacingBlockConfig.HORIZONTAL; private List<Direction> directions = PlaceFacingBlockConfig.HORIZONTAL;
private FacingBlock(ResourceLocation featureID, PlaceBlockFeature<PlaceFacingBlockConfig> feature) { private FacingBlock(
super(featureID, feature); @NotNull Context ctx,
@NotNull ResourceLocation featureID,
@NotNull PlaceBlockFeature<PlaceFacingBlockConfig> feature
) {
super(ctx, featureID, feature);
} }
@ -784,11 +820,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
private final BlockStateProvider provider; private final BlockStateProvider provider;
private ForSimpleBlock( private ForSimpleBlock(
@NotNull Context ctx,
@NotNull ResourceLocation featureID, @NotNull ResourceLocation featureID,
@NotNull SimpleBlockFeature feature, @NotNull SimpleBlockFeature feature,
@NotNull BlockStateProvider provider @NotNull BlockStateProvider provider
) { ) {
super(featureID, feature); super(ctx, featureID, feature);
this.provider = provider; this.provider = provider;
} }
@ -806,8 +843,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
private int xzSpread = 7; private int xzSpread = 7;
private int ySpread = 3; private int ySpread = 3;
protected WeightedBlockPatch(@NotNull ResourceLocation featureID, @NotNull RandomPatchFeature feature) { protected WeightedBlockPatch(
super(featureID, feature); @NotNull Context ctx,
@NotNull ResourceLocation featureID,
@NotNull RandomPatchFeature feature
) {
super(ctx, featureID, feature);
} }
public WeightedBlockPatch isEmpty() { public WeightedBlockPatch isEmpty() {
@ -862,7 +903,7 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
@Override @Override
public RandomPatchConfiguration createConfiguration() { public RandomPatchConfiguration createConfiguration() {
BCLInlinePlacedBuilder<Feature<SimpleBlockConfiguration>, SimpleBlockConfiguration> blockFeature = BCLFeatureBuilder BCLInlinePlacedBuilder<Feature<SimpleBlockConfiguration>, SimpleBlockConfiguration> blockFeature = ctx
.start( .start(
new ResourceLocation(featureID.getNamespace(), "tmp_" + featureID.getPath()), new ResourceLocation(featureID.getNamespace(), "tmp_" + featureID.getPath()),
Feature.SIMPLE_BLOCK Feature.SIMPLE_BLOCK
@ -879,10 +920,11 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
public static class WeightedBlock extends WeightedBaseBlock<SimpleBlockFeature, SimpleBlockConfiguration, WeightedBlock> { public static class WeightedBlock extends WeightedBaseBlock<SimpleBlockFeature, SimpleBlockConfiguration, WeightedBlock> {
private WeightedBlock( private WeightedBlock(
@NotNull Context ctx,
@NotNull ResourceLocation featureID, @NotNull ResourceLocation featureID,
@NotNull SimpleBlockFeature feature @NotNull SimpleBlockFeature feature
) { ) {
super(featureID, feature); super(ctx, featureID, feature);
} }
@Override @Override
@ -923,10 +965,11 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
SimpleWeightedRandomList.Builder<BlockState> stateBuilder = SimpleWeightedRandomList.builder(); SimpleWeightedRandomList.Builder<BlockState> stateBuilder = SimpleWeightedRandomList.builder();
protected WeightedBaseBlock( protected WeightedBaseBlock(
@NotNull Context ctx,
@NotNull ResourceLocation featureID, @NotNull ResourceLocation featureID,
@NotNull F feature @NotNull F feature
) { ) {
super(featureID, feature); super(ctx, featureID, feature);
} }
public W add(Block block, int weight) { public W add(Block block, int weight) {
@ -955,8 +998,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
private final List<WeightedPlacedFeature> features = new LinkedList<>(); private final List<WeightedPlacedFeature> features = new LinkedList<>();
private Holder<PlacedFeature> defaultFeature; private Holder<PlacedFeature> defaultFeature;
private AsRandomSelect(ResourceLocation featureID, RandomSelectorFeature feature) { private AsRandomSelect(
super(featureID, feature); @NotNull Context ctx,
@NotNull ResourceLocation featureID,
@NotNull RandomSelectorFeature feature
) {
super(ctx, featureID, feature);
} }
@ -989,11 +1036,12 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
private final Placer modFunction; private final Placer modFunction;
private AsMultiPlaceRandomSelect( private AsMultiPlaceRandomSelect(
ResourceLocation featureID, @NotNull Context ctx,
RandomSelectorFeature feature, @NotNull ResourceLocation featureID,
Placer mod @NotNull RandomSelectorFeature feature,
@NotNull Placer mod
) { ) {
super(featureID, feature); super(ctx, featureID, feature);
this.modFunction = mod; this.modFunction = mod;
} }
@ -1067,7 +1115,7 @@ public abstract class BCLFeatureBuilder<F extends Feature<FC>, FC extends Featur
} }
private Holder<PlacedFeature> place(BlockStateProvider p, int id) { private Holder<PlacedFeature> place(BlockStateProvider p, int id) {
var builder = BCLFeatureBuilder var builder = ctx
.start(BCLib.makeID("temp_select_feature" + (featureCounter++)), p) .start(BCLib.makeID("temp_select_feature" + (featureCounter++)), p)
.inlinePlace(); .inlinePlace();
return modFunction.place(builder, id); return modFunction.place(builder, id);

View file

@ -11,8 +11,10 @@ import net.minecraft.world.level.levelgen.placement.PlacementModifier;
public class BCLInlinePlacedBuilder<F extends Feature<FC>, FC extends FeatureConfiguration> extends CommonPlacedFeatureBuilder<F, FC, BCLInlinePlacedBuilder<F, FC>> { public class BCLInlinePlacedBuilder<F extends Feature<FC>, FC extends FeatureConfiguration> extends CommonPlacedFeatureBuilder<F, FC, BCLInlinePlacedBuilder<F, FC>> {
private final BCLConfigureFeature<F, FC> cFeature; private final BCLConfigureFeature<F, FC> cFeature;
protected final BCLFeatureBuilder.Context ctx;
private BCLInlinePlacedBuilder(BCLConfigureFeature<F, FC> cFeature) { private BCLInlinePlacedBuilder(BCLFeatureBuilder.Context ctx, BCLConfigureFeature<F, FC> cFeature) {
this.ctx = ctx;
this.cFeature = cFeature; this.cFeature = cFeature;
} }
@ -23,10 +25,11 @@ public class BCLInlinePlacedBuilder<F extends Feature<FC>, FC extends FeatureCon
* @return {@link CommonPlacedFeatureBuilder} instance. * @return {@link CommonPlacedFeatureBuilder} instance.
*/ */
public static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLInlinePlacedBuilder<F, FC> place( public static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLInlinePlacedBuilder<F, FC> place(
BCLFeatureBuilder.Context ctx,
ResourceLocation featureID, ResourceLocation featureID,
Holder<ConfiguredFeature<FC, F>> holder Holder<ConfiguredFeature<FC, F>> holder
) { ) {
return place(BCLConfigureFeature.create(holder)); return place(ctx, BCLConfigureFeature.create(holder));
} }
@ -37,9 +40,10 @@ public class BCLInlinePlacedBuilder<F extends Feature<FC>, FC extends FeatureCon
* @return {@link CommonPlacedFeatureBuilder} instance. * @return {@link CommonPlacedFeatureBuilder} instance.
*/ */
static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLInlinePlacedBuilder<F, FC> place( static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLInlinePlacedBuilder<F, FC> place(
BCLFeatureBuilder.Context ctx,
BCLConfigureFeature<F, FC> cFeature BCLConfigureFeature<F, FC> cFeature
) { ) {
return new BCLInlinePlacedBuilder(cFeature); return new BCLInlinePlacedBuilder(ctx, cFeature);
} }
/** /**
@ -68,7 +72,7 @@ public class BCLInlinePlacedBuilder<F extends Feature<FC>, FC extends FeatureCon
*/ */
public Holder<PlacedFeature> build(Holder<ConfiguredFeature<FC, F>> feature) { public Holder<PlacedFeature> build(Holder<ConfiguredFeature<FC, F>> feature) {
PlacementModifier[] modifiers = modifications.toArray(new PlacementModifier[modifications.size()]); PlacementModifier[] modifiers = modifications.toArray(new PlacementModifier[modifications.size()]);
return PlacementUtils.inlinePlaced(feature, modifiers); return PlacementUtils.inlinePlaced((Holder<ConfiguredFeature<?, ?>>) (Object) feature, modifiers);
} }
/** /**
@ -82,4 +86,14 @@ public class BCLInlinePlacedBuilder<F extends Feature<FC>, FC extends FeatureCon
} }
public BCLFeatureBuilder.RandomPatch inRandomPatch(ResourceLocation id) {
return ctx.startRandomPatch(id, build());
}
public BCLFeatureBuilder.RandomPatch randomBonemealDistribution(ResourceLocation id) {
return inRandomPatch(id)
.tries(9)
.spreadXZ(3)
.spreadY(1);
}
} }

View file

@ -1,7 +1,10 @@
package org.betterx.bclib.api.v3.levelgen.features; package org.betterx.bclib.api.v3.levelgen.features;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.data.worldgen.placement.PlacementUtils; import net.minecraft.data.worldgen.placement.PlacementUtils;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
@ -13,8 +16,14 @@ public class BCLPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureCo
private final ResourceLocation featureID; private final ResourceLocation featureID;
private GenerationStep.Decoration decoration = GenerationStep.Decoration.VEGETAL_DECORATION; private GenerationStep.Decoration decoration = GenerationStep.Decoration.VEGETAL_DECORATION;
private final BCLConfigureFeature<F, FC> cFeature; private final BCLConfigureFeature<F, FC> cFeature;
protected final BCLPlacedFeatureBuilder.Context ctx;
private BCLPlacedFeatureBuilder(ResourceLocation featureID, BCLConfigureFeature<F, FC> cFeature) { private BCLPlacedFeatureBuilder(
Context ctx,
ResourceLocation featureID,
BCLConfigureFeature<F, FC> cFeature
) {
this.ctx = ctx;
this.featureID = featureID; this.featureID = featureID;
this.cFeature = cFeature; this.cFeature = cFeature;
} }
@ -39,10 +48,11 @@ public class BCLPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureCo
* @return {@link CommonPlacedFeatureBuilder} instance. * @return {@link CommonPlacedFeatureBuilder} instance.
*/ */
public static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLPlacedFeatureBuilder<F, FC> place( public static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLPlacedFeatureBuilder<F, FC> place(
Context ctx,
ResourceLocation featureID, ResourceLocation featureID,
Holder<ConfiguredFeature<FC, F>> holder Holder<ConfiguredFeature<FC, F>> holder
) { ) {
return place(featureID, BCLConfigureFeature.create(holder)); return place(ctx, featureID, BCLConfigureFeature.create(holder));
} }
@ -54,24 +64,43 @@ public class BCLPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureCo
* @return {@link CommonPlacedFeatureBuilder} instance. * @return {@link CommonPlacedFeatureBuilder} instance.
*/ */
static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLPlacedFeatureBuilder<F, FC> place( static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLPlacedFeatureBuilder<F, FC> place(
Context ctx,
ResourceLocation featureID, ResourceLocation featureID,
BCLConfigureFeature<F, FC> cFeature BCLConfigureFeature<F, FC> cFeature
) { ) {
return new BCLPlacedFeatureBuilder(featureID, cFeature); return new BCLPlacedFeatureBuilder(ctx, featureID, cFeature);
} }
public static <F extends Feature<FC>, FC extends FeatureConfiguration> BCLPlacedFeatureBuilder<F, FC> place(
BCLPlacedFeatureBuilder.Context ctx,
ResourceLocation configuredFeature
) {
ResourceKey<ConfiguredFeature<?, ?>> key = ResourceKey.create(
Registries.CONFIGURED_FEATURE,
configuredFeature
);
Holder<ConfiguredFeature<FC, F>> holder = (Holder<ConfiguredFeature<FC, F>>) (Object) ctx.bootstrapContext
.lookup(Registries.CONFIGURED_FEATURE)
.getOrThrow(key);
var cFeature = new BCLConfigureFeature<F, FC>(configuredFeature, holder, false);
return new BCLPlacedFeatureBuilder<F, FC>(ctx, configuredFeature, cFeature);
}
/** /**
* Builds a new {@link BCLFeature} instance. * Builds a new {@link BCLFeature} instance.
* *
* @return created {@link BCLFeature} instance. * @return created {@link BCLFeature} instance.
*/ */
public Holder<PlacedFeature> build() { public Holder<PlacedFeature> build() {
Holder<PlacedFeature> p = PlacementUtils.register( final ResourceKey<PlacedFeature> key = ResourceKey.create(Registries.PLACED_FEATURE, featureID);
featureID.toString(), PlacementUtils.register(
cFeature.configuredFeature, ctx.bootstrapContext,
key,
(Holder<ConfiguredFeature<?, ?>>) (Object) cFeature.configuredFeature,
modifications modifications
); );
return p; return ctx.bootstrapContext.lookup(Registries.PLACED_FEATURE).get(key).orElseThrow();
} }
@ -85,4 +114,7 @@ public class BCLPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureCo
Holder<PlacedFeature> p = build(); Holder<PlacedFeature> p = build();
return new BCLFeature(cFeature, p, decoration); return new BCLFeature(cFeature, p, decoration);
} }
public record Context(BootstapContext<PlacedFeature> bootstrapContext) {
}
} }

View file

@ -24,8 +24,8 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
abstract class CommonPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureConfiguration, T extends CommonPlacedFeatureBuilder<F, FC, T>> { abstract class CommonPlacedFeatureBuilder<F extends Feature<FC>, FC extends FeatureConfiguration, T extends CommonPlacedFeatureBuilder<F, FC, T>> {
protected final List<PlacementModifier> modifications = new LinkedList<>();
protected final List<PlacementModifier> modifications = new LinkedList<>();
/** /**
* Add feature placement modifier. Used as a condition for feature how to generate. * Add feature placement modifier. Used as a condition for feature how to generate.
@ -425,15 +425,4 @@ abstract class CommonPlacedFeatureBuilder<F extends Feature<FC>, FC extends Feat
* @return created {@link PlacedFeature} instance. * @return created {@link PlacedFeature} instance.
*/ */
abstract Holder<PlacedFeature> build(); abstract Holder<PlacedFeature> build();
public BCLFeatureBuilder.RandomPatch inRandomPatch(ResourceLocation id) {
return BCLFeatureBuilder.startRandomPatch(id, build());
}
public BCLFeatureBuilder.RandomPatch randomBonemealDistribution(ResourceLocation id) {
return inRandomPatch(id)
.tries(9)
.spreadXZ(3)
.spreadY(1);
}
} }

View file

@ -5,6 +5,7 @@ import org.betterx.worlds.together.tag.v3.CommonBlockTags;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags; import net.minecraft.tags.BlockTags;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
@ -39,7 +40,7 @@ public class BlockPredicates {
); );
public static <P extends BlockPredicate> BlockPredicateType<P> register(ResourceLocation location, Codec<P> codec) { public static <P extends BlockPredicate> BlockPredicateType<P> register(ResourceLocation location, Codec<P> codec) {
return Registry.register(Registry.BLOCK_PREDICATE_TYPES, location, () -> codec); return Registry.register(BuiltInRegistries.BLOCK_PREDICATE_TYPE, location, () -> codec);
} }
public static void ensureStaticInitialization() { public static void ensureStaticInitialization() {

View file

@ -5,7 +5,7 @@ import org.betterx.bclib.noise.Noises;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.level.levelgen.placement.PlacementContext; import net.minecraft.world.level.levelgen.placement.PlacementContext;
@ -16,7 +16,7 @@ import net.minecraft.world.level.levelgen.synth.NormalNoise;
public class NoiseFilter extends PlacementFilter { public class NoiseFilter extends PlacementFilter {
public static final Codec<NoiseFilter> CODEC = RecordCodecBuilder.create(instance -> instance public static final Codec<NoiseFilter> CODEC = RecordCodecBuilder.create(instance -> instance
.group( .group(
ResourceKey.codec(Registry.NOISE_REGISTRY).fieldOf("noise").forGetter(o -> o.noise), ResourceKey.codec(Registries.NOISE).fieldOf("noise").forGetter(o -> o.noise),
Codec.DOUBLE.fieldOf("min_noise_level").forGetter(o -> o.minNoiseLevel), Codec.DOUBLE.fieldOf("min_noise_level").forGetter(o -> o.minNoiseLevel),
Codec.DOUBLE.fieldOf("max_noise_level").orElse(Double.MAX_VALUE).forGetter(o -> o.maxNoiseLevel), Codec.DOUBLE.fieldOf("max_noise_level").orElse(Double.MAX_VALUE).forGetter(o -> o.maxNoiseLevel),
Codec.FLOAT.fieldOf("scale_xz").orElse(1f).forGetter(o -> o.scaleXZ), Codec.FLOAT.fieldOf("scale_xz").orElse(1f).forGetter(o -> o.scaleXZ),

View file

@ -4,6 +4,7 @@ import org.betterx.bclib.BCLib;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.levelgen.placement.PlacementModifier; import net.minecraft.world.level.levelgen.placement.PlacementModifier;
import net.minecraft.world.level.levelgen.placement.PlacementModifierType; import net.minecraft.world.level.levelgen.placement.PlacementModifierType;
@ -85,7 +86,7 @@ public class PlacementModifiers {
ResourceLocation location, ResourceLocation location,
Codec<P> codec Codec<P> codec
) { ) {
return Registry.register(Registry.PLACEMENT_MODIFIERS, location, () -> codec); return Registry.register(BuiltInRegistries.PLACEMENT_MODIFIER_TYPE, location, () -> codec);
} }
public static void ensureStaticInitialization() { public static void ensureStaticInitialization() {

View file

@ -13,6 +13,7 @@ import net.minecraft.world.item.enchantment.EnchantmentHelper;
import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelReader;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
@ -89,7 +90,7 @@ public class BaseCropBlock extends BasePlantBlock {
} }
@Override @Override
public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { public boolean isValidBonemealTarget(LevelReader world, BlockPos pos, BlockState state, boolean isClient) {
return state.getValue(AGE) < 3; return state.getValue(AGE) < 3;
} }

View file

@ -131,7 +131,12 @@ public abstract class BaseDoublePlantBlock extends BaseBlockNotFull implements R
} }
@Override @Override
public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { public boolean isValidBonemealTarget(
LevelReader levelReader,
BlockPos blockPos,
BlockState blockState,
boolean isClient
) {
return true; return true;
} }

View file

@ -104,7 +104,7 @@ public abstract class BasePlantBlock extends BaseBlockNotFull implements RenderL
this( this(
propMod.amend(Properties propMod.amend(Properties
.of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT) .of(replaceable ? Material.REPLACEABLE_PLANT : Material.PLANT)
.lightLevel((state)->light) .lightLevel((state) -> light)
.sound(SoundType.GRASS) .sound(SoundType.GRASS)
.noCollission() .noCollission()
.offsetType(BlockBehaviour.OffsetType.XZ) .offsetType(BlockBehaviour.OffsetType.XZ)
@ -169,7 +169,7 @@ public abstract class BasePlantBlock extends BaseBlockNotFull implements RenderL
} }
@Override @Override
public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { public boolean isValidBonemealTarget(LevelReader world, BlockPos pos, BlockState state, boolean isClient) {
return true; return true;
} }

View file

@ -135,7 +135,7 @@ public class BaseVineBlock extends BaseBlockNotFull implements RenderLayerProvid
} }
@Override @Override
public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { public boolean isValidBonemealTarget(LevelReader world, BlockPos pos, BlockState state, boolean isClient) {
while (world.getBlockState(pos).getBlock() == this) { while (world.getBlockState(pos).getBlock() == this) {
pos = pos.below(); pos = pos.below();
} }

View file

@ -151,7 +151,7 @@ public abstract class UnderwaterPlantBlock extends BaseBlockNotFull implements R
} }
@Override @Override
public boolean isValidBonemealTarget(BlockGetter world, BlockPos pos, BlockState state, boolean isClient) { public boolean isValidBonemealTarget(LevelReader world, BlockPos pos, BlockState state, boolean isClient) {
return true; return true;
} }

View file

@ -10,15 +10,12 @@ import org.betterx.bclib.registry.PresetsRegistryClient;
import org.betterx.worlds.together.WorldsTogether; import org.betterx.worlds.together.WorldsTogether;
import org.betterx.worlds.together.client.WorldsTogetherClient; import org.betterx.worlds.together.client.WorldsTogetherClient;
import net.minecraft.client.renderer.texture.SpriteLoader;
import net.minecraft.client.renderer.texture.TextureAtlas;
import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.model.*; import net.fabricmc.fabric.api.client.model.*;
import net.fabricmc.fabric.api.event.client.ClientSpriteRegistryCallback;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -39,13 +36,13 @@ public class BCLibClient implements ClientModInitializer, ModelResourceProvider,
PresetsRegistryClient.onLoad(); PresetsRegistryClient.onLoad();
WorldsTogether.SURPRESS_EXPERIMENTAL_DIALOG = Configs.CLIENT_CONFIG.suppressExperimentalDialog(); WorldsTogether.SURPRESS_EXPERIMENTAL_DIALOG = Configs.CLIENT_CONFIG.suppressExperimentalDialog();
//dumpDatapack(); //dumpDatapack();
//TODO: 1.19.3 Find out how to load sprites from custom folders
ClientSpriteRegistryCallback // ClientSpriteRegistryCallback
.event(TextureAtlas.LOCATION_BLOCKS) // .event(TextureAtlas.LOCATION_BLOCKS)
.register((resourceManager, sprites) -> { // .register((resourceManager, sprites) -> {
SpriteLoader.listSprites(resourceManager, "entity/chest", sprites::put); // SpriteLoader.listSprites(resourceManager, "entity/chest", sprites::put);
SpriteLoader.listSprites(resourceManager, "blocks", sprites::put); // SpriteLoader.listSprites(resourceManager, "blocks", sprites::put);
}); // });
} }
@Override @Override

View file

@ -9,6 +9,7 @@ import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.client.renderer.block.model.multipart.MultiPart; import net.minecraft.client.renderer.block.model.multipart.MultiPart;
import net.minecraft.client.resources.model.ModelResourceLocation; import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.client.resources.model.UnbakedModel;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;

View file

@ -13,6 +13,7 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.client.renderer.blockentity.BrightnessCombiner; import net.minecraft.client.renderer.blockentity.BrightnessCombiner;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.*;

View file

@ -18,6 +18,7 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider;
import net.minecraft.client.renderer.blockentity.SignRenderer; import net.minecraft.client.renderer.blockentity.SignRenderer;
import net.minecraft.client.resources.model.Material; import net.minecraft.client.resources.model.Material;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.FormattedCharSequence;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;

View file

@ -15,14 +15,13 @@ import com.mojang.serialization.JsonOps;
import com.mojang.serialization.codecs.KeyDispatchCodec; import com.mojang.serialization.codecs.KeyDispatchCodec;
import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.CommandSourceStack;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.Style; import net.minecraft.network.chat.Style;
import net.minecraft.resources.RegistryOps; import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvent;
import net.minecraft.tags.TagEntry; import net.minecraft.tags.TagEntry;
import net.minecraft.tags.TagFile; import net.minecraft.tags.TagFile;
import net.minecraft.util.KeyDispatchDataCodec; import net.minecraft.util.KeyDispatchDataCodec;
@ -141,22 +140,22 @@ public class DumpDatapack {
) { ) {
BCLib.LOGGER.info("- Serializing: " + registry.key().toString()); BCLib.LOGGER.info("- Serializing: " + registry.key().toString());
DUMPERS.clear(); DUMPERS.clear();
DUMPERS.put(Registry.BIOME_REGISTRY.location(), new Dumper<>((Biome v) -> Biome.DIRECT_CODEC)); DUMPERS.put(Registries.BIOME.location(), new Dumper<>((Biome v) -> Biome.DIRECT_CODEC));
DUMPERS.put( DUMPERS.put(
Registry.CONFIGURED_FEATURE_REGISTRY.location(), Registries.CONFIGURED_FEATURE.location(),
new Dumper<>((ConfiguredFeature v) -> ConfiguredFeature.DIRECT_CODEC) new Dumper<>((ConfiguredFeature v) -> ConfiguredFeature.DIRECT_CODEC)
); );
DUMPERS.put( DUMPERS.put(
Registry.WORLD_PRESET_REGISTRY.location(), Registries.WORLD_PRESET.location(),
new Dumper<>((WorldPreset v) -> WorldPreset.DIRECT_CODEC) new Dumper<>((WorldPreset v) -> WorldPreset.DIRECT_CODEC)
); );
DUMPERS.put( DUMPERS.put(
Registry.NOISE_GENERATOR_SETTINGS_REGISTRY.location(), Registries.NOISE_SETTINGS.location(),
new Dumper<>((NoiseGeneratorSettings v) -> NoiseGeneratorSettings.DIRECT_CODEC) new Dumper<>((NoiseGeneratorSettings v) -> NoiseGeneratorSettings.DIRECT_CODEC)
); );
DUMPERS.put(Registry.STRUCTURE_REGISTRY.location(), new Dumper<>((Structure v) -> Structure.DIRECT_CODEC)); DUMPERS.put(Registries.STRUCTURE.location(), new Dumper<>((Structure v) -> Structure.DIRECT_CODEC));
DUMPERS.put( DUMPERS.put(
Registry.DIMENSION_TYPE_REGISTRY.location(), Registries.DIMENSION_TYPE.location(),
new Dumper<>((DimensionType v) -> DimensionType.DIRECT_CODEC) new Dumper<>((DimensionType v) -> DimensionType.DIRECT_CODEC)
); );
DUMPERS.put(BCLBiomeRegistry.BCL_BIOMES_REGISTRY.location(), new Dumper<>((BCLBiome v) -> v.codec().codec())); DUMPERS.put(BCLBiomeRegistry.BCL_BIOMES_REGISTRY.location(), new Dumper<>((BCLBiome v) -> v.codec().codec()));
@ -164,43 +163,37 @@ public class DumpDatapack {
SurfaceRuleRegistry.SURFACE_RULES_REGISTRY.location(), SurfaceRuleRegistry.SURFACE_RULES_REGISTRY.location(),
new Dumper<>((AssignedSurfaceRule v) -> AssignedSurfaceRule.CODEC) new Dumper<>((AssignedSurfaceRule v) -> AssignedSurfaceRule.CODEC)
); );
DUMPERS.put(Registry.SOUND_EVENT_REGISTRY.location(), new Dumper<>((SoundEvent v) -> SoundEvent.CODEC));
DUMPERS.put( DUMPERS.put(
Registry.CONFIGURED_CARVER_REGISTRY.location(), Registries.CONFIGURED_CARVER.location(),
new Dumper<>((ConfiguredWorldCarver v) -> ConfiguredWorldCarver.DIRECT_CODEC) new Dumper<>((ConfiguredWorldCarver v) -> ConfiguredWorldCarver.DIRECT_CODEC)
); );
DUMPERS.put( DUMPERS.put(
Registry.PROCESSOR_LIST_REGISTRY.location(), Registries.PROCESSOR_LIST.location(),
new Dumper<>((StructureProcessorList v) -> StructureProcessorType.DIRECT_CODEC) new Dumper<>((StructureProcessorList v) -> StructureProcessorType.DIRECT_CODEC)
); );
DUMPERS.put( DUMPERS.put(
Registry.FLAT_LEVEL_GENERATOR_PRESET_REGISTRY.location(), Registries.FLAT_LEVEL_GENERATOR_PRESET.location(),
new Dumper<>((FlatLevelGeneratorPreset v) -> FlatLevelGeneratorPreset.DIRECT_CODEC) new Dumper<>((FlatLevelGeneratorPreset v) -> FlatLevelGeneratorPreset.DIRECT_CODEC)
); );
DUMPERS.put( DUMPERS.put(
Registry.DENSITY_FUNCTION_REGISTRY.location(), Registries.DENSITY_FUNCTION.location(),
new Dumper<>((DensityFunction v) -> DensityFunction.DIRECT_CODEC) new Dumper<>((DensityFunction v) -> DensityFunction.DIRECT_CODEC)
); );
DUMPERS.put( DUMPERS.put(
Registry.PLACED_FEATURE_REGISTRY.location(), Registries.PLACED_FEATURE.location(),
new Dumper<>((PlacedFeature v) -> PlacedFeature.DIRECT_CODEC) new Dumper<>((PlacedFeature v) -> PlacedFeature.DIRECT_CODEC)
); );
DUMPERS.put( DUMPERS.put(
Registry.NOISE_REGISTRY.location(), Registries.NOISE.location(),
new Dumper<>((NormalNoise.NoiseParameters v) -> NormalNoise.NoiseParameters.DIRECT_CODEC)
);
DUMPERS.put(
Registry.NOISE_REGISTRY.location(),
new Dumper<>((NormalNoise.NoiseParameters v) -> NormalNoise.NoiseParameters.DIRECT_CODEC) new Dumper<>((NormalNoise.NoiseParameters v) -> NormalNoise.NoiseParameters.DIRECT_CODEC)
); );
DUMPERS.put( DUMPERS.put(
Registry.TEMPLATE_POOL_REGISTRY.location(), Registries.TEMPLATE_POOL.location(),
new Dumper<>((StructureTemplatePool v) -> StructureTemplatePool.DIRECT_CODEC) new Dumper<>((StructureTemplatePool v) -> StructureTemplatePool.DIRECT_CODEC)
); );
DUMPERS.put( DUMPERS.put(
Registry.STRUCTURE_SET_REGISTRY.location(), Registries.STRUCTURE_SET.location(),
new Dumper<>((StructureSet v) -> StructureSet.DIRECT_CODEC) new Dumper<>((StructureSet v) -> StructureSet.DIRECT_CODEC)
); );

View file

@ -0,0 +1,33 @@
package org.betterx.bclib.datagen;
import org.betterx.bclib.BCLib;
import net.minecraft.core.RegistrySetBuilder;
import net.minecraft.core.registries.Registries;
import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint;
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
public class BCLibDatagen implements DataGeneratorEntrypoint {
static boolean ADD_TESTS = true;
@Override
public void onInitializeDataGenerator(FabricDataGenerator dataGenerator) {
BCLib.LOGGER.info("Bootstrap onInitializeDataGenerator");
final FabricDataGenerator.Pack pack = dataGenerator.createPack();
pack.addProvider(WorldgenProvider::new);
//pack.addProvider(BiomeProvider::new);
//pack.addProvider(new BiomeProvider());
// pack.addProvider(CustomRegistriesDataProvider::new);
}
@Override
public void buildRegistry(RegistrySetBuilder registryBuilder) {
BCLib.LOGGER.info("Datagen buildRegistry");
registryBuilder.add(Registries.CONFIGURED_FEATURE, TestConfiguredFeatures::bootstrap);
registryBuilder.add(Registries.PLACED_FEATURE, TestPlacedFeatures::bootstrap);
registryBuilder.add(Registries.BIOME, TestBiomes::bootstrap);
registryBuilder.add(Registries.NOISE_SETTINGS, NoiseDatagen::bootstrap);
}
}

View file

@ -0,0 +1,137 @@
package org.betterx.bclib.datagen;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry;
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeData;
import org.betterx.worlds.together.WorldsTogether;
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.HolderLookup;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.CachedOutput;
import net.minecraft.data.DataProvider;
import net.minecraft.data.PackOutput;
import net.minecraft.data.registries.VanillaRegistries;
import net.minecraft.resources.RegistryDataLoader;
import net.minecraft.resources.RegistryOps;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import com.google.gson.JsonElement;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
public class CustomRegistriesDataProvider implements DataProvider {
public static final List<RegistryDataLoader.RegistryData<?>> REGISTRIES = List.of(
new RegistryDataLoader.RegistryData<>(BCLBiomeRegistry.BCL_BIOMES_REGISTRY, BiomeData.CODEC),
new RegistryDataLoader.RegistryData<>(
SurfaceRuleRegistry.SURFACE_RULES_REGISTRY,
AssignedSurfaceRule.CODEC
),
new RegistryDataLoader.RegistryData<>(Registries.BIOME, Biome.DIRECT_CODEC),
new RegistryDataLoader.RegistryData<>(Registries.CONFIGURED_FEATURE, ConfiguredFeature.DIRECT_CODEC),
new RegistryDataLoader.RegistryData<>(Registries.PLACED_FEATURE, PlacedFeature.DIRECT_CODEC),
new RegistryDataLoader.RegistryData<>(Registries.STRUCTURE, Structure.DIRECT_CODEC)
);
private final PackOutput output;
public CustomRegistriesDataProvider(FabricDataOutput generator) {
this.output = generator;
}
@Override
public CompletableFuture<?> run(CachedOutput cachedOutput) {
HolderLookup.Provider registryAccess = VanillaRegistries.createLookup();
RegistryOps<JsonElement> dynamicOps = RegistryOps.create(JsonOps.INSTANCE, registryAccess);
final List<CompletableFuture<?>> futures = new ArrayList<>();
for (RegistryDataLoader.RegistryData<?> registryData : REGISTRIES) {
futures.add(this.dumpRegistryCapFuture(
cachedOutput,
registryAccess,
dynamicOps,
(RegistryDataLoader.RegistryData) registryData
));
}
return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new));
}
private <T> CompletableFuture dumpRegistryCapFuture(
CachedOutput cachedOutput,
HolderLookup.Provider registryAccess,
DynamicOps<JsonElement> dynamicOps,
RegistryDataLoader.RegistryData<T> registryData
) {
return CompletableFuture.runAsync(() -> dumpRegistryCap(
cachedOutput,
registryAccess,
dynamicOps,
registryData
));
}
private <T> void dumpRegistryCap(
CachedOutput cachedOutput,
HolderLookup.Provider registryAccess,
DynamicOps<JsonElement> dynamicOps,
RegistryDataLoader.RegistryData<T> registryData
) {
ResourceKey<? extends Registry<T>> resourceKey = registryData.key();
HolderLookup.RegistryLookup<T> registry = registryAccess.lookupOrThrow(resourceKey);
PackOutput.PathProvider pathProvider = this.output.createPathProvider(
PackOutput.Target.DATA_PACK,
resourceKey.location().getPath()
);
registry.listElementIds().forEach(entry ->
dumpValue(
pathProvider.json(entry.location()),
cachedOutput,
dynamicOps,
registryData.elementCodec(),
registry.get(entry).orElseThrow().value()
)
);
}
private static <E> void dumpValue(
Path path,
CachedOutput cachedOutput,
DynamicOps<JsonElement> dynamicOps,
Encoder<E> encoder,
E object
) {
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);
}
}
@Override
public String getName() {
return "BCL Registries";
}
}

View file

@ -0,0 +1,16 @@
package org.betterx.bclib.datagen;
import org.betterx.bclib.api.v2.generator.BCLChunkGenerator;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
public class NoiseDatagen {
public static void bootstrap(BootstapContext<NoiseGeneratorSettings> bootstrapContext) {
bootstrapContext.register(
BCLChunkGenerator.AMPLIFIED_NETHER,
BCLChunkGenerator.amplifiedNether(bootstrapContext)
);
}
}

View file

@ -0,0 +1,102 @@
package org.betterx.bclib.datagen;
import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeBuilder;
import net.minecraft.core.Holder;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
public class TestBiomes {
public static void bootstrap(BootstapContext<Biome> bootstrapContext) {
BCLib.LOGGER.info("Bootstrap Biomes");
if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) {
HolderGetter<PlacedFeature> holderGetter = bootstrapContext.lookup(Registries.PLACED_FEATURE);
Holder.Reference<PlacedFeature> reference = holderGetter.getOrThrow(ResourceKey.create(
Registries.PLACED_FEATURE,
BCLib.makeID("yellow_feature")
));
BCLib.LOGGER.info("REF Biome:" + reference);
BCLBiomeBuilder.Context biomeBuilder = new BCLBiomeBuilder.Context(bootstrapContext);
BCLBiome theYellow = biomeBuilder
.start(BCLib.makeID("the_yellow"))
.precipitation(Biome.Precipitation.NONE)
.temperature(1.0f)
.wetness(1.0f)
.fogColor(0xFFFF00)
.waterColor(0x777700)
.waterFogColor(0xFFFF00)
.skyColor(0xAAAA00)
.feature(GenerationStep.Decoration.VEGETAL_DECORATION, reference)
.addNetherClimateParamater(-1, 1)
.surface(Blocks.YELLOW_CONCRETE)
.build()
.registerEndLandBiome();
BCLBiome theBlue = biomeBuilder
.start(BCLib.makeID("the_blue"))
.precipitation(Biome.Precipitation.NONE)
.temperature(1.0f)
.wetness(1.0f)
.fogColor(0x0000FF)
.waterColor(0x000077)
.waterFogColor(0x0000FF)
.skyColor(0x0000AA)
.addNetherClimateParamater(-1, 1)
.surface(Blocks.LIGHT_BLUE_CONCRETE)
.build()
.registerEndLandBiome();
BCLBiome theGray = biomeBuilder
.start(BCLib.makeID("the_gray"))
.precipitation(Biome.Precipitation.NONE)
.temperature(1.0f)
.wetness(1.0f)
.fogColor(0xFFFFFF)
.waterColor(0x777777)
.waterFogColor(0xFFFFFF)
.skyColor(0xAAAAAA)
.addNetherClimateParamater(-1, 1)
.surface(Blocks.GRAY_CONCRETE)
.build()
.registerEndVoidBiome();
BCLBiome theOrange = biomeBuilder
.start(BCLib.makeID("the_orange"))
.precipitation(Biome.Precipitation.NONE)
.temperature(1.0f)
.wetness(1.0f)
.fogColor(0xFF7700)
.waterColor(0x773300)
.waterFogColor(0xFF7700)
.skyColor(0xAA7700)
.addNetherClimateParamater(-1, 1.1f)
.surface(Blocks.ORANGE_CONCRETE)
.build()
.registerNetherBiome();
BCLBiome thePurple = biomeBuilder
.start(BCLib.makeID("the_purple"))
.precipitation(Biome.Precipitation.NONE)
.temperature(1.0f)
.wetness(1.0f)
.fogColor(0xFF00FF)
.waterColor(0x770077)
.waterFogColor(0xFF00FF)
.skyColor(0xAA00AA)
.addNetherClimateParamater(-1.1f, 1)
.surface(Blocks.PURPLE_CONCRETE)
.build()
.registerNetherBiome();
}
}
}

View file

@ -0,0 +1,29 @@
package org.betterx.bclib.datagen;
import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.v3.levelgen.features.BCLConfigureFeature;
import org.betterx.bclib.api.v3.levelgen.features.BCLFeatureBuilder;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.levelgen.feature.RandomPatchFeature;
import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConfiguration;
public class TestConfiguredFeatures {
static BCLConfigureFeature<RandomPatchFeature, RandomPatchConfiguration> YELLOW_FEATURE;
public static void bootstrap(BootstapContext<ConfiguredFeature<?, ?>> bootstrapContext) {
BCLib.LOGGER.info("Bootstrap CONFIGUREDFeatures");
if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) {
BCLFeatureBuilder.Context builder = new BCLFeatureBuilder.Context(bootstrapContext);
YELLOW_FEATURE = builder
.startBonemealPatch(BCLib.makeID("yellow_feature"))
.add(Blocks.YELLOW_STAINED_GLASS, 30)
.add(Blocks.YELLOW_CONCRETE_POWDER, 30)
.add(Blocks.YELLOW_GLAZED_TERRACOTTA, 5)
.buildAndRegister();
}
}
}

View file

@ -0,0 +1,31 @@
package org.betterx.bclib.datagen;
import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.v3.levelgen.features.BCLFeature;
import org.betterx.bclib.api.v3.levelgen.features.BCLPlacedFeatureBuilder;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.feature.RandomPatchFeature;
import net.minecraft.world.level.levelgen.feature.configurations.RandomPatchConfiguration;
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
public class TestPlacedFeatures {
static BCLFeature<RandomPatchFeature, RandomPatchConfiguration> YELLOW_PLACED;
public static void bootstrap(BootstapContext<PlacedFeature> bootstrapContext) {
BCLib.LOGGER.info("Bootstrap PLACEDFeatures");
if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) {
final BCLPlacedFeatureBuilder.Context buildContext = new BCLPlacedFeatureBuilder.Context(bootstrapContext);
YELLOW_PLACED = BCLPlacedFeatureBuilder.<RandomPatchFeature, RandomPatchConfiguration>place(
buildContext,
BCLib.makeID("yellow_feature")
)
.decoration(GenerationStep.Decoration.VEGETAL_DECORATION)
.vanillaNetherGround(8)
.isEmptyAndOnNetherGround()
.buildAndRegister();
}
}
}

View file

@ -0,0 +1,31 @@
package org.betterx.bclib.datagen;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.Registries;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricDynamicRegistryProvider;
import java.util.concurrent.CompletableFuture;
public class WorldgenProvider extends FabricDynamicRegistryProvider {
public WorldgenProvider(
FabricDataOutput output,
CompletableFuture<HolderLookup.Provider> registriesFuture
) {
super(output, registriesFuture);
}
@Override
protected void configure(HolderLookup.Provider registries, Entries entries) {
entries.addAll(registries.lookupOrThrow(Registries.CONFIGURED_FEATURE));
entries.addAll(registries.lookupOrThrow(Registries.PLACED_FEATURE));
entries.addAll(registries.lookupOrThrow(Registries.BIOME));
entries.addAll(registries.lookupOrThrow(Registries.NOISE_SETTINGS));
}
@Override
public String getName() {
return "007 - BCLib Feature Provider";
}
}

View file

@ -4,7 +4,6 @@ import org.betterx.bclib.BCLib;
import org.betterx.worlds.together.tag.v3.TagManager; import org.betterx.worlds.together.tag.v3.TagManager;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
@ -55,7 +54,7 @@ public abstract class ModIntegration {
} }
public ResourceKey<Biome> getKey(String name) { public ResourceKey<Biome> getKey(String name) {
return ResourceKey.create(Registry.BIOME_REGISTRY, getID(name)); return ResourceKey.create(Registries.BIOME, getID(name));
} }
public boolean modIsInstalled() { public boolean modIsInstalled() {
@ -64,11 +63,13 @@ public abstract class ModIntegration {
public ConfiguredFeature<?, ?> getConfiguredFeature(String name) { public ConfiguredFeature<?, ?> getConfiguredFeature(String name) {
return BuiltInRegistries.CONFIGURED_FEATURE.get(getID(name)); //TODO: 1.19.3 find how to change this without having features before a world gets loaded
return null; //BuiltInRegistries.CONFIGURED_FEATURE.get(getID(name));
} }
public Holder<Biome> getBiome(String name) { public Holder<Biome> getBiome(String name) {
return BuiltInRegistries.BIOME.getHolder(getKey(name)).orElseThrow(); //TODO: 1.19.3 find how to change this without having features before a world gets loaded
return null; //BuiltInRegistries.BIOME.getHolder(getKey(name)).orElseThrow();
} }
public Class<?> getClass(String path) { public Class<?> getClass(String path) {

View file

@ -1,6 +1,6 @@
package org.betterx.bclib.interfaces; package org.betterx.bclib.interfaces;
import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
@ -9,7 +9,7 @@ import java.util.List;
public interface AlloyingRecipeWorkstation { public interface AlloyingRecipeWorkstation {
static List<Block> getWorkstations() { static List<Block> getWorkstations() {
return Registry.BLOCK return BuiltInRegistries.BLOCK
.stream() .stream()
.filter(b -> b instanceof AlloyingRecipeWorkstation) .filter(b -> b instanceof AlloyingRecipeWorkstation)
.toList(); .toList();

View file

@ -1,13 +1,9 @@
package org.betterx.bclib.interfaces; package org.betterx.bclib.interfaces;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.synth.NormalNoise;
public interface NoiseGeneratorSettingsProvider { public interface NoiseGeneratorSettingsProvider {
NoiseGeneratorSettings bclib_getNoiseGeneratorSettings(); NoiseGeneratorSettings bclib_getNoiseGeneratorSettings();
Holder<NoiseGeneratorSettings> bclib_getNoiseGeneratorSettingHolders(); Holder<NoiseGeneratorSettings> bclib_getNoiseGeneratorSettingHolders();
Registry<NormalNoise.NoiseParameters> bclib_getNoises();
} }

View file

@ -1,5 +1,6 @@
package org.betterx.bclib.interfaces; package org.betterx.bclib.interfaces;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;

View file

@ -5,6 +5,7 @@ import org.betterx.bclib.interfaces.BlockModelProvider;
import org.betterx.bclib.interfaces.ItemModelProvider; import org.betterx.bclib.interfaces.ItemModelProvider;
import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.client.renderer.block.model.BlockModel;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;

View file

@ -8,6 +8,7 @@ import net.minecraft.client.color.block.BlockColors;
import net.minecraft.client.color.item.ItemColors; import net.minecraft.client.color.item.ItemColors;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.main.GameConfig; import net.minecraft.client.main.GameConfig;
import net.minecraft.core.registries.BuiltInRegistries;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;

View file

@ -3,7 +3,6 @@ package org.betterx.bclib.mixin.common;
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry; 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.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
@ -18,21 +17,21 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(BuiltInRegistries.class) @Mixin(BuiltInRegistries.class)
public abstract class BuiltinRegistriesMixin { public abstract class BuiltinRegistriesMixin {
@Shadow @Shadow
protected static <T, R extends WritableRegistry<T>> R internalRegister( private static <T, R extends WritableRegistry<T>> R internalRegister(
ResourceKey<? extends Registry<T>> resourceKey, ResourceKey<? extends Registry<T>> resourceKey,
R writableRegistry, R writableRegistry,
BuiltInRegistries.RegistryBootstrap<T> registryBootstrap, BuiltInRegistries.RegistryBootstrap<T> registryBootstrap,
Lifecycle lifecycle Lifecycle lifecycle
) { ) {
throw new RuntimeException("Shadowed Call"); throw new RuntimeException("Shadowed");
} }
//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", ordinal = 0, target = "Lnet/minecraft/core/registries/BuiltInRegistries;registerSimple(Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry;"))
private static void bcl_registerBuiltin(CallbackInfo ci) { private static void bcl_registerBuiltin(CallbackInfo ci) {
BCLBiomeRegistry.BUILTIN_BCL_BIOMES = internalRegister( BCLBiomeRegistry.BUILTIN_BCL_BIOMES = internalRegister(
BCLBiomeRegistry.BCL_BIOMES_REGISTRY, BCLBiomeRegistry.BCL_BIOMES_REGISTRY,
(MappedRegistry) BCLBiomeRegistry.BUILTIN_BCL_BIOMES, BCLBiomeRegistry.BUILTIN_BCL_BIOMES,
BCLBiomeRegistry::bootstrap, BCLBiomeRegistry::bootstrap,
Lifecycle.stable() Lifecycle.stable()
); );

View file

@ -9,9 +9,7 @@ import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.levelgen.structure.StructureSet; import net.minecraft.world.level.levelgen.structure.StructureSet;
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.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.ModifyArg;
@ -19,9 +17,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(ChunkGenerator.class) @Mixin(ChunkGenerator.class)
public class ChunkGeneratorMixin implements ChunkGeneratorAccessor { public class ChunkGeneratorMixin implements ChunkGeneratorAccessor {
@Shadow
@Final
protected Registry<StructureSet> structureSets;
private int bclib_featureIteratorSeed; private int bclib_featureIteratorSeed;
@ -41,6 +36,6 @@ public class ChunkGeneratorMixin implements ChunkGeneratorAccessor {
} }
public Registry<StructureSet> bclib_getStructureSetsRegistry() { public Registry<StructureSet> bclib_getStructureSetsRegistry() {
return structureSets; return null;
} }
} }

View file

@ -4,10 +4,8 @@ import org.betterx.bclib.interfaces.NoiseGeneratorSettingsProvider;
import org.betterx.bclib.interfaces.SurfaceProvider; import org.betterx.bclib.interfaces.SurfaceProvider;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
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;
@ -19,9 +17,6 @@ public abstract class NoiseBasedChunkGeneratorMixin implements SurfaceProvider,
@Shadow @Shadow
protected Holder<NoiseGeneratorSettings> settings; protected Holder<NoiseGeneratorSettings> settings;
@Shadow
@Final
private Registry<NormalNoise.NoiseParameters> noises;
@Override @Override
public NoiseGeneratorSettings bclib_getNoiseGeneratorSettings() { public NoiseGeneratorSettings bclib_getNoiseGeneratorSettings() {
@ -32,9 +27,4 @@ public abstract class NoiseBasedChunkGeneratorMixin implements SurfaceProvider,
public Holder<NoiseGeneratorSettings> bclib_getNoiseGeneratorSettingHolders() { public Holder<NoiseGeneratorSettings> bclib_getNoiseGeneratorSettingHolders() {
return settings; return settings;
} }
@Override
public Registry<NormalNoise.NoiseParameters> bclib_getNoises() {
return noises;
}
} }

View file

@ -1,36 +1,22 @@
package org.betterx.bclib.mixin.common; package org.betterx.bclib.mixin.common;
import org.betterx.bclib.api.v2.generator.BCLChunkGenerator;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(NoiseGeneratorSettings.class) @Mixin(NoiseGeneratorSettings.class)
public abstract class NoiseGeneratorSettingsMixin { public abstract class NoiseGeneratorSettingsMixin {
@Shadow
static protected Holder<NoiseGeneratorSettings> register(
Registry<NoiseGeneratorSettings> registry,
ResourceKey<NoiseGeneratorSettings> resourceKey,
NoiseGeneratorSettings noiseGeneratorSettings
) {
return null;
}
; ;
//TODO:1.19.3 Replaced by Datagen pack file in NoiseDatagen
@Inject(method = "bootstrap", at = @At("HEAD")) // @Inject(method = "bootstrap", at = @At("HEAD"))
private static void bcl_addNoiseGenerators( // private static void bcl_addNoiseGenerators(
Registry<NoiseGeneratorSettings> registry, // BootstapContext<NoiseGeneratorSettings> bootstapContext, CallbackInfo ci
CallbackInfoReturnable<Holder<NoiseGeneratorSettings>> cir // ) {
) { // bootstapContext.register(
register(registry, BCLChunkGenerator.AMPLIFIED_NETHER, BCLChunkGenerator.amplifiedNether()); // BCLChunkGenerator.AMPLIFIED_NETHER,
} // BCLChunkGenerator.amplifiedNether(bootstapContext)
// );
// }
} }

View file

@ -1,17 +1,14 @@
package org.betterx.bclib.mixin.common; package org.betterx.bclib.mixin.common;
import net.minecraft.core.Holder;
import net.minecraft.data.worldgen.Structures; import net.minecraft.data.worldgen.Structures;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.levelgen.structure.Structure;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
@Mixin(Structures.class) @Mixin(Structures.class)
public interface StructuresAccessor { public interface StructuresAccessor {
@Invoker //TODO: 1.19.3 Refactor
static Holder<Structure> callRegister(ResourceKey<Structure> resourceKey, Structure structure) { // @Invoker
throw new RuntimeException("Unexpected call"); // static Holder<Structure> callRegister(ResourceKey<Structure> resourceKey, Structure structure) {
} // throw new RuntimeException("Unexpected call");
// }
} }

View file

@ -48,7 +48,7 @@ public abstract class BoatMixin extends Entity implements CustomBoatTypeOverride
return bcl_type; return bcl_type;
} }
@Inject(method = "setType", at = @At("HEAD"), cancellable = true) @Inject(method = "setVariant", at = @At("HEAD"), cancellable = true)
void bcl_setType(Boat.Type type, CallbackInfo ci) { void bcl_setType(Boat.Type type, CallbackInfo ci) {
if (bcl_type != null) { if (bcl_type != null) {
this.entityData.set(DATA_ID_TYPE, bcl_type.ordinal()); this.entityData.set(DATA_ID_TYPE, bcl_type.ordinal());
@ -56,7 +56,7 @@ public abstract class BoatMixin extends Entity implements CustomBoatTypeOverride
} }
} }
@Inject(method = "getBoatType", at = @At("HEAD"), cancellable = true) @Inject(method = "getVariant", at = @At("HEAD"), cancellable = true)
void bcl_getBoatType(CallbackInfoReturnable<Boat.Type> cir) { void bcl_getBoatType(CallbackInfoReturnable<Boat.Type> cir) {
BoatTypeOverride type = BoatTypeOverride.byId(this.entityData.get(DATA_ID_TYPE)); BoatTypeOverride type = BoatTypeOverride.byId(this.entityData.get(DATA_ID_TYPE));
if (type != null) { if (type != null) {

View file

@ -5,6 +5,7 @@ import org.betterx.bclib.BCLib;
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.core.registries.Registries;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
@ -19,7 +20,7 @@ public class Noises {
"roughness_noise")); "roughness_noise"));
public static ResourceKey<NormalNoise.NoiseParameters> createKey(ResourceLocation loc) { public static ResourceKey<NormalNoise.NoiseParameters> createKey(ResourceLocation loc) {
return ResourceKey.create(Registry.NOISE_REGISTRY, loc); return ResourceKey.create(Registries.NOISE, loc);
} }
public static NormalNoise createNoise( public static NormalNoise createNoise(
@ -36,7 +37,7 @@ public class Noises {
RandomSource randomSource, RandomSource randomSource,
ResourceKey<NormalNoise.NoiseParameters> noise ResourceKey<NormalNoise.NoiseParameters> noise
) { ) {
final Registry<NormalNoise.NoiseParameters> registry = registryAccess.registryOrThrow(Registry.NOISE_REGISTRY); final Registry<NormalNoise.NoiseParameters> registry = registryAccess.registryOrThrow(Registries.NOISE);
return noiseIntances.computeIfAbsent(noise, (key) -> createNoise(registry, randomSource, noise)); return noiseIntances.computeIfAbsent(noise, (key) -> createNoise(registry, randomSource, noise));
} }
} }

View file

@ -5,6 +5,7 @@ import net.minecraft.core.Registry;
import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleOptions;
import net.minecraft.core.particles.ParticleType; import net.minecraft.core.particles.ParticleType;
import net.minecraft.core.particles.SimpleParticleType; import net.minecraft.core.particles.SimpleParticleType;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry;
@ -45,7 +46,11 @@ public class BCLParticleType {
ParticleOptions.Deserializer<T> factory, ParticleOptions.Deserializer<T> factory,
Codec<T> codec Codec<T> codec
) { ) {
return Registry.register(Registry.PARTICLE_TYPE, location, deserializer(overrideLimiter, factory, codec)); return Registry.register(
BuiltInRegistries.PARTICLE_TYPE,
location,
deserializer(overrideLimiter, factory, codec)
);
} }
public static SimpleParticleType simple(boolean overrideLimiter) { public static SimpleParticleType simple(boolean overrideLimiter) {
@ -62,7 +67,7 @@ public class BCLParticleType {
} }
public static SimpleParticleType register(ResourceLocation location, boolean overrideLimiter) { public static SimpleParticleType register(ResourceLocation location, boolean overrideLimiter) {
return Registry.register(Registry.PARTICLE_TYPE, location, simple(overrideLimiter)); return Registry.register(BuiltInRegistries.PARTICLE_TYPE, location, simple(overrideLimiter));
} }
public static SimpleParticleType register( public static SimpleParticleType register(
@ -77,7 +82,7 @@ public class BCLParticleType {
boolean overrideLimiter, boolean overrideLimiter,
ParticleFactoryRegistry.PendingParticleFactory<SimpleParticleType> provider ParticleFactoryRegistry.PendingParticleFactory<SimpleParticleType> provider
) { ) {
SimpleParticleType type = Registry.register(Registry.PARTICLE_TYPE, location, simple(overrideLimiter)); SimpleParticleType type = Registry.register(BuiltInRegistries.PARTICLE_TYPE, location, simple(overrideLimiter));
ParticleFactoryRegistry.getInstance().register(type, provider); ParticleFactoryRegistry.getInstance().register(type, provider);
return type; return type;
} }

View file

@ -3,6 +3,7 @@ package org.betterx.bclib.recipes;
import org.betterx.bclib.api.v2.advancement.AdvancementManager; import org.betterx.bclib.api.v2.advancement.AdvancementManager;
import net.minecraft.advancements.RequirementsStrategy; import net.minecraft.advancements.RequirementsStrategy;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.item.ArmorItem; import net.minecraft.world.item.ArmorItem;

View file

@ -12,6 +12,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.NonNullList; import net.minecraft.core.NonNullList;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.TagParser; import net.minecraft.nbt.TagParser;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;

View file

@ -3,6 +3,7 @@ package org.betterx.bclib.recipes;
import org.betterx.bclib.util.CollectionsUtil; import org.betterx.bclib.util.CollectionsUtil;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.Container; import net.minecraft.world.Container;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
@ -103,12 +104,12 @@ public class BCLRecipeManager {
String id, String id,
S serializer S serializer
) { ) {
return Registry.register(Registry.RECIPE_SERIALIZER, modID + ":" + id, serializer); return Registry.register(BuiltInRegistries.RECIPE_SERIALIZER, modID + ":" + id, serializer);
} }
public static <C extends Container, T extends Recipe<C>> RecipeType<T> registerType(String modID, String type) { public static <C extends Container, T extends Recipe<C>> RecipeType<T> registerType(String modID, String type) {
ResourceLocation recipeTypeId = new ResourceLocation(modID, type); ResourceLocation recipeTypeId = new ResourceLocation(modID, type);
return Registry.register(Registry.RECIPE_TYPE, recipeTypeId, new RecipeType<T>() { return Registry.register(BuiltInRegistries.RECIPE_TYPE, recipeTypeId, new RecipeType<T>() {
public String toString() { public String toString() {
return type; return type;
} }

View file

@ -9,6 +9,7 @@ import org.betterx.bclib.blocks.BaseFurnaceBlock;
import org.betterx.bclib.blocks.BaseSignBlock; import org.betterx.bclib.blocks.BaseSignBlock;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
@ -29,35 +30,35 @@ public class BaseBlockEntities {
ResourceLocation typeId, ResourceLocation typeId,
BlockEntitySupplier<? extends T> supplier BlockEntitySupplier<? extends T> supplier
) { ) {
return Registry.register(Registry.BLOCK_ENTITY_TYPE, typeId, new DynamicBlockEntityType<>(supplier)); return Registry.register(BuiltInRegistries.BLOCK_ENTITY_TYPE, typeId, new DynamicBlockEntityType<>(supplier));
} }
public static void register() { public static void register() {
} }
public static Block[] getChests() { public static Block[] getChests() {
return Registry.BLOCK return BuiltInRegistries.BLOCK
.stream() .stream()
.filter(block -> block instanceof BaseChestBlock) .filter(block -> block instanceof BaseChestBlock)
.toArray(Block[]::new); .toArray(Block[]::new);
} }
public static Block[] getBarrels() { public static Block[] getBarrels() {
return Registry.BLOCK return BuiltInRegistries.BLOCK
.stream() .stream()
.filter(block -> block instanceof BaseBarrelBlock) .filter(block -> block instanceof BaseBarrelBlock)
.toArray(Block[]::new); .toArray(Block[]::new);
} }
public static Block[] getSigns() { public static Block[] getSigns() {
return Registry.BLOCK return BuiltInRegistries.BLOCK
.stream() .stream()
.filter(block -> block instanceof BaseSignBlock) .filter(block -> block instanceof BaseSignBlock)
.toArray(Block[]::new); .toArray(Block[]::new);
} }
public static Block[] getFurnaces() { public static Block[] getFurnaces() {
return Registry.BLOCK return BuiltInRegistries.BLOCK
.stream() .stream()
.filter(block -> block instanceof BaseFurnaceBlock) .filter(block -> block instanceof BaseFurnaceBlock)
.toArray(Block[]::new); .toArray(Block[]::new);

View file

@ -12,6 +12,7 @@ import org.betterx.worlds.together.tag.v3.MineableTags;
import org.betterx.worlds.together.tag.v3.TagManager; import org.betterx.worlds.together.tag.v3.TagManager;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags; import net.minecraft.tags.BlockTags;
import net.minecraft.tags.ItemTags; import net.minecraft.tags.ItemTags;
@ -49,7 +50,7 @@ public class BlockRegistry extends BaseRegistry<Block> {
FlammableBlockRegistry.getDefaultInstance().add(block, 5, 5); FlammableBlockRegistry.getDefaultInstance().add(block, 5, 5);
} }
block = Registry.register(Registry.BLOCK, id, block); block = Registry.register(BuiltInRegistries.BLOCK, id, block);
getModBlocks(id.getNamespace()).add(block); getModBlocks(id.getNamespace()).add(block);
if (block instanceof BaseLeavesBlock) { if (block instanceof BaseLeavesBlock) {
@ -80,7 +81,7 @@ public class BlockRegistry extends BaseRegistry<Block> {
return block; return block;
} }
getModBlocks(id.getNamespace()).add(block); getModBlocks(id.getNamespace()).add(block);
return Registry.register(Registry.BLOCK, id, block); return Registry.register(BuiltInRegistries.BLOCK, id, block);
} }
private Item registerBlockItem(ResourceLocation id, BlockItem item) { private Item registerBlockItem(ResourceLocation id, BlockItem item) {
@ -91,7 +92,7 @@ public class BlockRegistry extends BaseRegistry<Block> {
@Override @Override
public void registerItem(ResourceLocation id, Item item) { public void registerItem(ResourceLocation id, Item item) {
if (item != null && item != Items.AIR) { if (item != null && item != Items.AIR) {
Registry.register(Registry.ITEM, id, item); Registry.register(BuiltInRegistries.ITEM, id, item);
getModBlockItems(id.getNamespace()).add(item); getModBlockItems(id.getNamespace()).add(item);
} }
} }

View file

@ -19,6 +19,7 @@ import net.minecraft.core.Direction;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.dispenser.DefaultDispenseItemBehavior; import net.minecraft.core.dispenser.DefaultDispenseItemBehavior;
import net.minecraft.core.dispenser.ShearsDispenseItemBehavior; import net.minecraft.core.dispenser.ShearsDispenseItemBehavior;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundEvent;
import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffectInstance;
@ -138,7 +139,7 @@ public class ItemRegistry extends BaseRegistry<Item> {
@Override @Override
public void registerItem(ResourceLocation id, Item item) { public void registerItem(ResourceLocation id, Item item) {
if (item != null && item != Items.AIR) { if (item != null && item != Items.AIR) {
Registry.register(Registry.ITEM, id, item); Registry.register(BuiltInRegistries.ITEM, id, item);
getModItems(id.getNamespace()).add(item); getModItems(id.getNamespace()).add(item);
} }
} }

View file

@ -44,7 +44,7 @@ public class PresetsRegistry implements WorldPresetBootstrap {
BCLib.makeID("large"), BCLib.makeID("large"),
(overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> { (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> {
Holder<NoiseGeneratorSettings> largeBiomeGenerator = noiseSettings Holder<NoiseGeneratorSettings> largeBiomeGenerator = noiseSettings
.getOrCreateHolderOrThrow(NoiseGeneratorSettings.LARGE_BIOMES); .getOrThrow(NoiseGeneratorSettings.LARGE_BIOMES);
return buildPreset( return buildPreset(
noiseBasedOverworld.make( noiseBasedOverworld.make(
overworldStem.generator().getBiomeSource(), overworldStem.generator().getBiomeSource(),
@ -61,14 +61,13 @@ public class PresetsRegistry implements WorldPresetBootstrap {
BCLib.makeID("amplified"), BCLib.makeID("amplified"),
(overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> { (overworldStem, netherContext, endContext, noiseSettings, noiseBasedOverworld) -> {
Holder<NoiseGeneratorSettings> amplifiedBiomeGenerator = noiseSettings Holder<NoiseGeneratorSettings> amplifiedBiomeGenerator = noiseSettings
.getOrCreateHolderOrThrow(NoiseGeneratorSettings.AMPLIFIED); .getOrThrow(NoiseGeneratorSettings.AMPLIFIED);
WorldGenUtil.Context amplifiedNetherContext = new WorldGenUtil.Context( WorldGenUtil.Context amplifiedNetherContext = new WorldGenUtil.Context(
netherContext.biomes, netherContext.biomes,
netherContext.dimension, netherContext.dimension,
netherContext.structureSets, netherContext.structureSets,
netherContext.noiseParameters, noiseSettings.getOrThrow(BCLChunkGenerator.AMPLIFIED_NETHER)
Holder.direct(BCLChunkGenerator.amplifiedNether())
); );
return buildPreset( return buildPreset(

View file

@ -1,7 +1,6 @@
package org.betterx.bclib.util; package org.betterx.bclib.util;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.Vec3i; import net.minecraft.core.Vec3i;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
@ -69,7 +68,7 @@ public class StructureHelper {
CompoundTag nbttagcompound = NbtIo.readCompressed(stream); CompoundTag nbttagcompound = NbtIo.readCompressed(stream);
StructureTemplate template = new StructureTemplate(); StructureTemplate template = new StructureTemplate();
template.load(HolderLookup.forRegistry(BuiltInRegistries.BLOCK), nbttagcompound); template.load(BuiltInRegistries.BLOCK.asLookup(), nbttagcompound);
return template; return template;
} }

View file

@ -1,124 +0,0 @@
package org.betterx.bclib.util;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import com.google.common.collect.Sets;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Set;
public class TranslationHelper {
/**
* Print English translation file lines. Translation is "auto-beautified" text (example "strange_thing" -> "Strange Thing").
*
* @param modID {@link String} mod ID string.
*/
public static void printMissingEnNames(String modID) {
printMissingNames(modID, "en_us");
}
/**
* Prints translation file lines for specified language.
*
* @param modID {@link String} mod ID string;
* @param languageCode {@link String} language code (example "en_us", "ru_ru").
*/
public static void printMissingNames(String modID, String languageCode) {
Set<String> missingNames = Sets.newHashSet();
Gson gson = new Gson();
InputStream inputStream = TranslationHelper.class.getResourceAsStream("/assets/" + modID + "/lang/" + languageCode + ".json");
JsonObject translation = inputStream == null
? new JsonObject()
: gson.fromJson(new InputStreamReader(inputStream), JsonObject.class);
BuiltInRegistries.BLOCK.forEach(block -> {
if (BuiltInRegistries.BLOCK.getKey(block).getNamespace().equals(modID)) {
String name = block.getName().getString();
if (!translation.has(name)) {
missingNames.add(name);
}
}
});
BuiltInRegistries.ITEM.forEach(item -> {
if (BuiltInRegistries.ITEM.getKey(item).getNamespace().equals(modID)) {
String name = item.getDescription().getString();
if (!translation.has(name)) {
missingNames.add(name);
}
}
});
BuiltinRegistries.BIOME.forEach(biome -> {
ResourceLocation id = BuiltinRegistries.BIOME.getKey(biome);
if (id.getNamespace().equals(modID)) {
String name = "biome." + modID + "." + id.getPath();
if (!translation.has(name)) {
missingNames.add(name);
}
}
});
Registry.ENTITY_TYPE.forEach((entity) -> {
ResourceLocation id = Registry.ENTITY_TYPE.getKey(entity);
if (id.getNamespace().equals(modID)) {
String name = "entity." + modID + "." + id.getPath();
if (!translation.has(name)) {
missingNames.add(name);
}
}
});
if (!missingNames.isEmpty()) {
System.out.println("========================================");
System.out.println(" MISSING NAMES LIST");
if (!missingNames.isEmpty()) {
if (languageCode.equals("en_us")) {
System.out.println("========================================");
System.out.println(" AUTO ENGLISH BEAUTIFICATION");
System.out.println("========================================");
missingNames.stream().sorted().forEach(name -> {
System.out.println(" \"" + name + "\": \"" + fastTranslateEn(name) + "\",");
});
} else {
System.out.println("========================================");
System.out.println(" TEMPLATE: [" + languageCode + "]");
System.out.println("========================================");
missingNames.stream().sorted().forEach(name -> {
System.out.println(" \"" + name + "\": \"\",");
});
}
}
System.out.println("========================================");
}
}
/**
* Simple fast text beautification (example "strange_thing" -> "Strange Thing").
*
* @param text {@link String} to process;
* @return {@link String} result.
*/
public static String fastTranslateEn(String text) {
String[] words = text.substring(text.lastIndexOf('.') + 1).split("_");
StringBuilder builder = new StringBuilder();
for (int i = 0; i < words.length; i++) {
String word = words[i];
builder.append(Character.toUpperCase(word.charAt(0)));
builder.append(word, 1, word.length());
if (i < words.length - 1) {
builder.append(' ');
}
}
return builder.toString();
}
}

View file

@ -1,108 +0,0 @@
package org.betterx.bclib.world.structures;
import org.betterx.bclib.api.v2.levelgen.structures.BCLStructureBuilder;
import org.betterx.worlds.together.tag.v3.TagManager;
import com.mojang.serialization.Codec;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.TerrainAdjustment;
import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement;
import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadType;
import java.util.function.Function;
@Deprecated(forRemoval = true)
/**
* Please use the {@link org.betterx.bclib.api.v2.levelgen.structures.BCLStructure} and
* {@link BCLStructureBuilder} instead.
* @deprecated Use {@link org.betterx.bclib.api.v2.levelgen.structures.BCLStructure} instead
*/
public class BCLStructure<S extends Structure> extends org.betterx.bclib.api.v2.levelgen.structures.BCLStructure<S> {
@Deprecated(forRemoval = true)
/**
* Please use the {@link BCLStructureBuilder} instead:
*
* BCLStructureBuilder
* .start(id, structureBuilder)
* .step(step)
* .randomPlacement(spacing, separation)
* .build();
*/
public BCLStructure(
ResourceLocation id,
Function<Structure.StructureSettings, S> structureBuilder,
GenerationStep.Decoration step,
int spacing,
int separation
) {
this(id, structureBuilder, step, spacing, separation, false);
}
@Deprecated(forRemoval = true)
/**
* Please use the {@link BCLStructureBuilder} instead:
*
* BCLStructureBuilder
* .start(id, structureBuilder)
* .step(step)
* .randomPlacement(spacing, separation)
* .build();
*/
public BCLStructure(
ResourceLocation id,
Function<Structure.StructureSettings, S> structureBuilder,
GenerationStep.Decoration step,
int spacing,
int separation,
boolean adaptNoise
) {
this(
id,
structureBuilder,
step,
spacing,
separation,
adaptNoise,
Structure.simpleCodec(structureBuilder),
TagManager.BIOMES.makeStructureTag(id.getNamespace(), id.getPath())
);
}
@Deprecated(forRemoval = true)
/**
*
* Please use the {@link BCLStructureBuilder} instead:
*
* BCLStructureBuilder
* .start(id, structureBuilder)
* .step(step)
* .randomPlacement(spacing, separation)
* .codec(codec)
* .biomeTag(biomeTag)
* .build();
*
*/
public BCLStructure(
ResourceLocation id,
Function<Structure.StructureSettings, S> structureBuilder,
GenerationStep.Decoration step,
int spacing,
int separation,
boolean adaptNoise,
Codec<S> codec,
TagKey<Biome> biomeTag
) {
super(id, structureBuilder, step, new RandomSpreadStructurePlacement(
spacing,
separation,
RandomSpreadType.LINEAR,
id.toString().hashCode()
), codec, biomeTag, TerrainAdjustment.NONE);
}
}

View file

@ -1,11 +1,11 @@
package org.betterx.worlds.together.biomesource; package org.betterx.worlds.together.biomesource;
import net.minecraft.core.Registry; import net.minecraft.core.HolderGetter;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.BiomeSource;
public interface BiomeSourceFromRegistry<T extends BiomeSource> { public interface BiomeSourceFromRegistry<T extends BiomeSource> {
Registry<Biome> getBiomeRegistry(); HolderGetter<Biome> getBiomeRegistry();
boolean didBiomeRegistryChange(); boolean didBiomeRegistryChange();
default <R extends BiomeSource> boolean togetherBiomeSourceContentChanged(BiomeSourceFromRegistry<R> other) { default <R extends BiomeSource> boolean togetherBiomeSourceContentChanged(BiomeSourceFromRegistry<R> other) {

View file

@ -12,6 +12,7 @@ import org.betterx.worlds.together.worldPreset.TogetherWorldPreset;
import org.betterx.worlds.together.worldPreset.WorldPresets; import org.betterx.worlds.together.worldPreset.WorldPresets;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
@ -28,7 +29,6 @@ import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.WorldDimensions; import net.minecraft.world.level.levelgen.WorldDimensions;
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;
import net.minecraft.world.level.levelgen.synth.NormalNoise;
import java.util.Map; import java.util.Map;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
@ -99,35 +99,31 @@ public class WorldGenUtil {
} }
public static class Context extends StemContext { public static class Context extends StemContext {
public final Registry<Biome> biomes; public final HolderGetter<Biome> biomes;
public Context( public Context(
Registry<Biome> biomes, HolderGetter<Biome> biomes,
Holder<DimensionType> dimension, Holder<DimensionType> dimension,
Registry<StructureSet> structureSets, HolderGetter<StructureSet> structureSets,
Registry<NormalNoise.NoiseParameters> noiseParameters,
Holder<NoiseGeneratorSettings> generatorSettings Holder<NoiseGeneratorSettings> generatorSettings
) { ) {
super(dimension, structureSets, noiseParameters, generatorSettings); super(dimension, structureSets, generatorSettings);
this.biomes = biomes; this.biomes = biomes;
} }
} }
public static class StemContext { public static class StemContext {
public final Holder<DimensionType> dimension; public final Holder<DimensionType> dimension;
public final Registry<StructureSet> structureSets; public final HolderGetter<StructureSet> structureSets;
public final Registry<NormalNoise.NoiseParameters> noiseParameters;
public final Holder<NoiseGeneratorSettings> generatorSettings; public final Holder<NoiseGeneratorSettings> generatorSettings;
public StemContext( public StemContext(
Holder<DimensionType> dimension, Holder<DimensionType> dimension,
Registry<StructureSet> structureSets, HolderGetter<StructureSet> structureSets,
Registry<NormalNoise.NoiseParameters> noiseParameters,
Holder<NoiseGeneratorSettings> generatorSettings Holder<NoiseGeneratorSettings> generatorSettings
) { ) {
this.dimension = dimension; this.dimension = dimension;
this.structureSets = structureSets; this.structureSets = structureSets;
this.noiseParameters = noiseParameters;
this.generatorSettings = generatorSettings; this.generatorSettings = generatorSettings;
} }
} }

View file

@ -1,32 +0,0 @@
package org.betterx.worlds.together.mixin.common;
import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceKey;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(BuiltInRegistries.class)
public class BuiltinRegistriesMixin {
@Inject(method = "<clinit>", at = @At(value = "INVOKE", target = "Ljava/util/Map;forEach(Ljava/util/function/BiConsumer;)V"))
private static void together_registerSurface(CallbackInfo ci) {
SurfaceRuleRegistry.BUILTIN_SURFACE_RULES = registerSimple(
SurfaceRuleRegistry.SURFACE_RULES_REGISTRY,
SurfaceRuleRegistry::bootstrap
);
}
@Shadow
static protected <T> Registry<T> registerSimple(
ResourceKey<? extends Registry<T>> resourceKey, BuiltInRegistries.RegistryBootstrap<T> registryBootstrap
) {
throw new RuntimeException("Shadowed Call");
}
}

View file

@ -1,6 +1,5 @@
package org.betterx.worlds.together.mixin.common; package org.betterx.worlds.together.mixin.common;
import net.minecraft.core.RegistryAccess;
import net.minecraft.resources.RegistryOps; import net.minecraft.resources.RegistryOps;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@ -8,6 +7,6 @@ import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(RegistryOps.class) @Mixin(RegistryOps.class)
public interface RegistryOpsAccessor { public interface RegistryOpsAccessor {
@Accessor("registryAccess") @Accessor("lookupProvider")
RegistryAccess bcl_getRegistryAccess(); RegistryOps.RegistryInfoLookup bcl_getLookupProvider();
} }

View file

@ -0,0 +1,28 @@
package org.betterx.worlds.together.mixin.common;
import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry;
import net.minecraft.core.RegistrySetBuilder;
import net.minecraft.data.registries.VanillaRegistries;
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;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(VanillaRegistries.class)
public class VanillaRegistriesMixin {
@Shadow
@Final
private static RegistrySetBuilder BUILDER;
@Inject(method = "<clinit>", at = @At(value = "TAIL"))
private static void together_registerSurface(CallbackInfo ci) {
BUILDER.add(
SurfaceRuleRegistry.SURFACE_RULES_REGISTRY,
SurfaceRuleRegistry::bootstrap
);
}
}

View file

@ -4,15 +4,16 @@ import org.betterx.worlds.together.levelgen.WorldGenUtil;
import org.betterx.worlds.together.worldPreset.WorldPresets; 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.HolderGetter;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.dimension.DimensionType;
import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
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;
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;
@ -24,29 +25,23 @@ import org.spongepowered.asm.mixin.injection.ModifyArg;
public abstract class WorldPresetsBootstrapMixin { public abstract class WorldPresetsBootstrapMixin {
@Shadow @Shadow
@Final @Final
private Registry<WorldPreset> presets; private HolderGetter<Biome> biomes;
@Shadow @Shadow
@Final @Final
private Registry<Biome> biomes; private HolderGetter<StructureSet> structureSets;
@Shadow
@Final
private Registry<StructureSet> structureSets;
@Shadow
@Final
private Registry<NormalNoise.NoiseParameters> noises;
@Shadow
@Final
private Holder<DimensionType> netherDimensionType;
@Shadow
@Final
private Holder<NoiseGeneratorSettings> netherNoiseSettings;
@Shadow
@Final
private Holder<DimensionType> endDimensionType;
@Shadow
@Final
private Holder<NoiseGeneratorSettings> endNoiseSettings;
@Shadow
@Final
private BootstapContext<WorldPreset> context;
@Shadow
@Final
private HolderGetter<PlacedFeature> placedFeatures;
@Shadow
@Final
private LevelStem netherStem;
@Shadow
@Final
private LevelStem endStem;
//see WorldPresets.register //see WorldPresets.register
@Shadow @Shadow
@ -57,27 +52,38 @@ public abstract class WorldPresetsBootstrapMixin {
@Shadow @Shadow
@Final @Final
private Registry<NoiseGeneratorSettings> noiseSettings; private HolderGetter<NoiseGeneratorSettings> noiseSettings;
@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;)V"))
private LevelStem bcl_getOverworldStem(LevelStem overworldStem) { private LevelStem bcl_getOverworldStem(LevelStem overworldStem) {
Holder<NoiseGeneratorSettings> netherSettings, endSettings;
if (this.netherStem.generator() instanceof NoiseBasedChunkGenerator nether) {
netherSettings = nether.generatorSettings();
} else {
netherSettings = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.NETHER);
}
if (this.endStem.generator() instanceof NoiseBasedChunkGenerator nether) {
endSettings = nether.generatorSettings();
} else {
endSettings = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.END);
}
WorldGenUtil.Context netherContext = new WorldGenUtil.Context( WorldGenUtil.Context netherContext = new WorldGenUtil.Context(
this.biomes, this.biomes,
this.netherDimensionType, this.netherStem.type(),
this.structureSets, this.structureSets,
this.noises, netherSettings
this.netherNoiseSettings
); );
WorldGenUtil.Context endContext = new WorldGenUtil.Context( WorldGenUtil.Context endContext = new WorldGenUtil.Context(
this.biomes, this.biomes,
this.endDimensionType, this.endStem.type(),
this.structureSets, this.structureSets,
this.noises, endSettings
this.endNoiseSettings
); );
WorldPresets.bootstrapPresets( WorldPresets.bootstrapPresets(
presets, context,
overworldStem, overworldStem,
netherContext, netherContext,
endContext, endContext,

View file

@ -2,16 +2,16 @@ package org.betterx.worlds.together.surfaceRules;
import org.betterx.worlds.together.WorldsTogether; import org.betterx.worlds.together.WorldsTogether;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.dimension.LevelStem;
import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.SurfaceRules;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Predicate; import java.util.function.Predicate;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
@ -21,40 +21,50 @@ public class SurfaceRuleRegistry {
public static final Predicate<ResourceKey<LevelStem>> NON_MANAGED_DIMENSIONS = dim -> dim != LevelStem.NETHER && dim != LevelStem.END; public static final Predicate<ResourceKey<LevelStem>> NON_MANAGED_DIMENSIONS = dim -> dim != LevelStem.NETHER && dim != LevelStem.END;
public static final Predicate<ResourceKey<LevelStem>> ALL_DIMENSIONS = dim -> true; public static final Predicate<ResourceKey<LevelStem>> ALL_DIMENSIONS = dim -> true;
public static Registry<AssignedSurfaceRule> BUILTIN_SURFACE_RULES; //public static Registry<AssignedSurfaceRule> BUILTIN_SURFACE_RULES;
private static <T> ResourceKey<Registry<T>> createRegistryKey(ResourceLocation location) { private static <T> ResourceKey<Registry<T>> createRegistryKey(ResourceLocation location) {
return ResourceKey.createRegistryKey(location); return ResourceKey.createRegistryKey(location);
} }
@ApiStatus.Internal @ApiStatus.Internal
public static Holder<AssignedSurfaceRule> bootstrap(Registry<AssignedSurfaceRule> registry) { public static void bootstrap(BootstapContext<AssignedSurfaceRule> ctx) {
return BuiltInRegistries.register( // ctx.register(
registry, // ResourceKey.create(
WorldsTogether.makeID("dummy"), // SurfaceRuleRegistry.SURFACE_RULES_REGISTRY,
new AssignedSurfaceRule( // WorldsTogether.makeID("dummy")
SurfaceRules.state(Blocks.YELLOW_CONCRETE.defaultBlockState()), // ),
WorldsTogether.makeID("none") // new AssignedSurfaceRule(
) // SurfaceRules.state(Blocks.YELLOW_CONCRETE.defaultBlockState()),
); // WorldsTogether.makeID("none")
// )
// );
for (var entry : KNOWN.entrySet()) {
ctx.register(entry.getKey(), entry.getValue());
}
} }
private static Map<ResourceKey<AssignedSurfaceRule>, AssignedSurfaceRule> KNOWN = new HashMap<>();
public static ResourceKey<AssignedSurfaceRule> registerRule( public static ResourceKey<AssignedSurfaceRule> registerRule(
ResourceLocation ruleID, ResourceLocation ruleID,
SurfaceRules.RuleSource rules, SurfaceRules.RuleSource rules,
ResourceLocation biomeID ResourceLocation biomeID
) { ) {
ResourceKey<AssignedSurfaceRule> key = ResourceKey.create( final ResourceKey<AssignedSurfaceRule> key = ResourceKey.create(
SurfaceRuleRegistry.SURFACE_RULES_REGISTRY, SurfaceRuleRegistry.SURFACE_RULES_REGISTRY,
ruleID ruleID
); );
Registry.register(SurfaceRuleRegistry.BUILTIN_SURFACE_RULES, key, new AssignedSurfaceRule( KNOWN.put(
key,
new AssignedSurfaceRule(
SurfaceRules.ifTrue( SurfaceRules.ifTrue(
SurfaceRules.isBiome(ResourceKey.create(Registries.BIOME, biomeID)), SurfaceRules.isBiome(ResourceKey.create(Registries.BIOME, biomeID)),
rules rules
), biomeID ), biomeID
) )
); );
return key; return key;
} }

View file

@ -19,10 +19,13 @@ import java.util.stream.Collectors;
public class SurfaceRuleUtil { public class SurfaceRuleUtil {
private static List<SurfaceRules.RuleSource> getRulesForBiome(ResourceLocation biomeID) { private static List<SurfaceRules.RuleSource> getRulesForBiome(ResourceLocation biomeID) {
Registry<AssignedSurfaceRule> registry = SurfaceRuleRegistry.BUILTIN_SURFACE_RULES; Registry<AssignedSurfaceRule> registry = null;
if (WorldBootstrap.getLastRegistryAccess() != null) if (WorldBootstrap.getLastRegistryAccess() != null)
registry = WorldBootstrap.getLastRegistryAccess() registry = WorldBootstrap.getLastRegistryAccess()
.registryOrThrow(SurfaceRuleRegistry.SURFACE_RULES_REGISTRY); .registryOrThrow(SurfaceRuleRegistry.SURFACE_RULES_REGISTRY);
if (registry == null) return List.of();
return registry.stream() return registry.stream()
.filter(a -> a != null && a.biomeID != null && a.biomeID.equals( .filter(a -> a != null && a.biomeID != null && a.biomeID.equals(
biomeID)) biomeID))

View file

@ -111,7 +111,7 @@ public class WorldBootstrap {
public static class DedicatedServer { public static class DedicatedServer {
public static void registryReady(RegistryOps<Tag> regOps) { public static void registryReady(RegistryOps<Tag> regOps) {
if (regOps instanceof RegistryOpsAccessor acc) { if (regOps instanceof RegistryOpsAccessor acc) {
Helpers.onRegistryReady(acc.bcl_getRegistryAccess()); //Helpers.onRegistryReady(acc.bcl_getLookupProvider().);
} }
} }

View file

@ -14,7 +14,6 @@ import com.mojang.serialization.codecs.RecordCodecBuilder;
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.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.NbtOps;
@ -30,6 +29,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class TogetherWorldPreset extends WorldPreset { public class TogetherWorldPreset extends WorldPreset {
public final int sortOrder; public final int sortOrder;
@ -152,12 +152,13 @@ public class TogetherWorldPreset extends WorldPreset {
} }
} }
public static Registry<LevelStem> getDimensions(ResourceKey<WorldPreset> key) { public static @Nullable Registry<LevelStem> getDimensions(ResourceKey<WorldPreset> key) {
RegistryAccess access = WorldBootstrap.getLastRegistryAccessOrElseBuiltin(); RegistryAccess access = WorldBootstrap.getLastRegistryAccessOrElseBuiltin();
var preset = (access == null if (access == null) {
? BuiltInRegistries.WORLD_PRESET WorldsTogether.LOGGER.error("No valid registry found!");
: access.registryOrThrow(Registries.WORLD_PRESET)) return null;
.getHolder(key); }
var preset = access.registryOrThrow(Registries.WORLD_PRESET).getHolder(key);
if (preset.isEmpty()) return null; if (preset.isEmpty()) return null;
return preset return preset
.get() .get()

View file

@ -9,10 +9,10 @@ import org.betterx.worlds.together.tag.v3.TagRegistry;
import org.betterx.worlds.together.worldPreset.client.WorldPresetsClient; import org.betterx.worlds.together.worldPreset.client.WorldPresetsClient;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.HolderGetter;
import net.minecraft.core.RegistryAccess; import net.minecraft.core.RegistryAccess;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries; import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.WorldPresetTags; import net.minecraft.tags.WorldPresetTags;
@ -32,8 +32,8 @@ public class WorldPresets {
LevelStem make(BiomeSource biomeSource, Holder<NoiseGeneratorSettings> noiseGeneratorSettings); LevelStem make(BiomeSource biomeSource, Holder<NoiseGeneratorSettings> noiseGeneratorSettings);
} }
public static final TagRegistry.Simple<WorldPreset> WORLD_PRESETS = public static final TagRegistry.UnTyped<WorldPreset> WORLD_PRESETS =
TagManager.registerType(BuiltInRegistries.WORLD_PRESET, "tags/worldgen/world_preset"); TagManager.registerType(Registries.WORLD_PRESET, "tags/worldgen/world_preset");
private static Map<ResourceKey<WorldPreset>, PresetBuilder> BUILDERS = Maps.newHashMap(); private static Map<ResourceKey<WorldPreset>, PresetBuilder> BUILDERS = Maps.newHashMap();
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;
@ -87,23 +87,24 @@ public class WorldPresets {
@ApiStatus.Internal @ApiStatus.Internal
public static void bootstrapPresets( public static void bootstrapPresets(
Registry<WorldPreset> presets, BootstapContext<WorldPreset> bootstrapContext,
LevelStem overworldStem, LevelStem overworldStem,
WorldGenUtil.Context netherContext, WorldGenUtil.Context netherContext,
WorldGenUtil.Context endContext, WorldGenUtil.Context endContext,
Registry<NoiseGeneratorSettings> noiseSettings, HolderGetter<NoiseGeneratorSettings> noiseSettings,
OverworldBuilder noiseBasedOverworld OverworldBuilder noiseBasedOverworld
) { ) {
EntrypointUtil.getCommon(WorldPresetBootstrap.class) EntrypointUtil.getCommon(WorldPresetBootstrap.class)
.forEach(e -> e.bootstrapWorldPresets()); .forEach(e -> e.bootstrapWorldPresets());
for (Map.Entry<ResourceKey<WorldPreset>, PresetBuilder> e : BUILDERS.entrySet()) { for (Map.Entry<ResourceKey<WorldPreset>, PresetBuilder> e : BUILDERS.entrySet()) {
TogetherWorldPreset preset = e.getValue() //TODO:1.19.3 called out of sync
.create( // TogetherWorldPreset preset = e.getValue()
overworldStem, netherContext, endContext, // .create(
noiseSettings, noiseBasedOverworld // overworldStem, netherContext, endContext,
); // noiseSettings, noiseBasedOverworld
BuiltInRegistries.register(presets, e.getKey(), preset); // );
// bootstrapContext.register(e.getKey(), preset);
} }
BUILDERS = null; BUILDERS = null;
} }
@ -127,7 +128,7 @@ public class WorldPresets {
LevelStem overworldStem, LevelStem overworldStem,
WorldGenUtil.Context netherContext, WorldGenUtil.Context netherContext,
WorldGenUtil.Context endContext, WorldGenUtil.Context endContext,
Registry<NoiseGeneratorSettings> noiseSettings, HolderGetter<NoiseGeneratorSettings> noiseSettings,
OverworldBuilder noiseBasedOverworld OverworldBuilder noiseBasedOverworld
); );
} }

View file

@ -7,13 +7,12 @@ import net.minecraft.world.level.levelgen.presets.WorldPreset;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import java.util.Optional;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class WorldPresetsClient { public class WorldPresetsClient {
public static void registerCustomizeUI(ResourceKey<WorldPreset> key, PresetEditor setupScreen) { public static void registerCustomizeUI(ResourceKey<WorldPreset> key, PresetEditor setupScreen) {
if (setupScreen != null) { if (setupScreen != null) {
PresetEditor.EDITORS.put(Optional.of(key), setupScreen); //TODO: 1.19.3 this is called out of order
//PresetEditor.EDITORS.put(Optional.of(key), setupScreen);
} }
} }

View file

@ -11,7 +11,6 @@ accessible class net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSou
accessible class net/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap accessible class net/minecraft/world/level/levelgen/presets/WorldPresets$Bootstrap
extendable class net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator extendable class net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator
accessible class net/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap accessible class net/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap
accessible class net/minecraft/core/Registry$RegistryBootstrap
accessible class net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSource accessible class net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSource
accessible class net/minecraft/server/dedicated/DedicatedServerProperties$WorldDimensionData accessible class net/minecraft/server/dedicated/DedicatedServerProperties$WorldDimensionData
@ -20,11 +19,11 @@ accessible method net/minecraft/client/gui/screens/worldselection/WorldGenSettin
accessible method net/minecraft/world/level/storage/loot/LootPool <init> ([Lnet/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer;[Lnet/minecraft/world/level/storage/loot/predicates/LootItemCondition;[Lnet/minecraft/world/level/storage/loot/functions/LootItemFunction;Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;)V accessible method net/minecraft/world/level/storage/loot/LootPool <init> ([Lnet/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer;[Lnet/minecraft/world/level/storage/loot/predicates/LootItemCondition;[Lnet/minecraft/world/level/storage/loot/functions/LootItemFunction;Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;)V
accessible method net/minecraft/world/entity/ai/village/poi/PoiTypes register (Lnet/minecraft/core/Registry;Lnet/minecraft/resources/ResourceKey;Ljava/util/Set;II)Lnet/minecraft/world/entity/ai/village/poi/PoiType; accessible method net/minecraft/world/entity/ai/village/poi/PoiTypes register (Lnet/minecraft/core/Registry;Lnet/minecraft/resources/ResourceKey;Ljava/util/Set;II)Lnet/minecraft/world/entity/ai/village/poi/PoiType;
accessible method net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSource <init> (Ljava/util/List;)V accessible method net/minecraft/world/level/levelgen/SurfaceRules$SequenceRuleSource <init> (Ljava/util/List;)V
accessible method net/minecraft/core/Registry registerSimple (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/Registry$RegistryBootstrap;)Lnet/minecraft/core/Registry; accessible method net/minecraft/core/registries/BuiltInRegistries registerSimple (Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/core/registries/BuiltInRegistries$RegistryBootstrap;)Lnet/minecraft/core/Registry;
accessible method net/minecraft/world/entity/SpawnPlacements register (Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/entity/SpawnPlacements$Type;Lnet/minecraft/world/level/levelgen/Heightmap$Types;Lnet/minecraft/world/entity/SpawnPlacements$SpawnPredicate;)V accessible method net/minecraft/world/entity/SpawnPlacements register (Lnet/minecraft/world/entity/EntityType;Lnet/minecraft/world/entity/SpawnPlacements$Type;Lnet/minecraft/world/level/levelgen/Heightmap$Types;Lnet/minecraft/world/entity/SpawnPlacements$SpawnPredicate;)V
accessible method net/minecraft/world/level/block/state/properties/WoodType register (Lnet/minecraft/world/level/block/state/properties/WoodType;)Lnet/minecraft/world/level/block/state/properties/WoodType; accessible method net/minecraft/world/level/block/state/properties/WoodType register (Lnet/minecraft/world/level/block/state/properties/WoodType;)Lnet/minecraft/world/level/block/state/properties/WoodType;
accessible method net/minecraft/world/level/levelgen/NoiseRouterData nether (Lnet/minecraft/core/Registry;)Lnet/minecraft/world/level/levelgen/NoiseRouter; accessible method net/minecraft/world/level/levelgen/NoiseRouterData nether (Lnet/minecraft/core/HolderGetter;Lnet/minecraft/core/HolderGetter;)Lnet/minecraft/world/level/levelgen/NoiseRouter;
accessible method net/minecraft/world/level/levelgen/NoiseRouterData noNewCaves (Lnet/minecraft/core/Registry;Lnet/minecraft/world/level/levelgen/DensityFunction;)Lnet/minecraft/world/level/levelgen/NoiseRouter; accessible method net/minecraft/world/level/levelgen/NoiseRouterData noNewCaves (Lnet/minecraft/core/HolderGetter;Lnet/minecraft/core/HolderGetter;Lnet/minecraft/world/level/levelgen/DensityFunction;)Lnet/minecraft/world/level/levelgen/NoiseRouter;
accessible method net/minecraft/world/level/levelgen/NoiseRouterData slideNetherLike (Lnet/minecraft/core/Registry;II)Lnet/minecraft/world/level/levelgen/DensityFunction; accessible method net/minecraft/world/level/levelgen/NoiseRouterData slideNetherLike (Lnet/minecraft/core/HolderGetter;II)Lnet/minecraft/world/level/levelgen/DensityFunction;
#Fields #Fields
accessible field net/minecraft/world/entity/ai/village/poi/PoiTypes TYPE_BY_STATE Ljava/util/Map; accessible field net/minecraft/world/entity/ai/village/poi/PoiTypes TYPE_BY_STATE Ljava/util/Map;

View file

@ -1,7 +1,7 @@
{ {
"schemaVersion": 1, "schemaVersion": 1,
"id": "bclib", "id": "bclib",
"version": "2.1.5", "version": "2.2.0",
"name": "BCLib", "name": "BCLib",
"description": "A library for BetterX team mods", "description": "A library for BetterX team mods",
"authors": [ "authors": [
@ -37,7 +37,7 @@
"org.betterx.bclib.integration.emi.EMIPlugin" "org.betterx.bclib.integration.emi.EMIPlugin"
], ],
"fabric-datagen": [ "fabric-datagen": [
"org.betterx.bclib.BCLibDatagen" "org.betterx.bclib.datagen.BCLibDatagen"
] ]
}, },
"accessWidener": "bclib.accesswidener", "accessWidener": "bclib.accesswidener",
@ -52,7 +52,7 @@
"fabricloader": ">=0.14.10", "fabricloader": ">=0.14.10",
"fabric": ">=0.65.0", "fabric": ">=0.65.0",
"minecraft": [ "minecraft": [
"1.19.3-alpha.22.43.a" "1.19.3-beta.3"
] ]
}, },
"custom": { "custom": {

View file

@ -5,7 +5,6 @@
"compatibilityLevel": "JAVA_17", "compatibilityLevel": "JAVA_17",
"mixins": [ "mixins": [
"BiomeSourceMixin", "BiomeSourceMixin",
"BuiltinRegistriesMixin",
"DedicatedServerPropertiesMixin", "DedicatedServerPropertiesMixin",
"DiggerItemAccessor", "DiggerItemAccessor",
"MainDataMixin", "MainDataMixin",
@ -17,6 +16,7 @@
"RegistryDataLoaderMixin", "RegistryDataLoaderMixin",
"RegistryOpsAccessor", "RegistryOpsAccessor",
"TagLoaderMixin", "TagLoaderMixin",
"VanillaRegistriesMixin",
"WorldGenPropertiesMixin", "WorldGenPropertiesMixin",
"WorldLoaderMixin", "WorldLoaderMixin",
"WorldPresetAccessor", "WorldPresetAccessor",