Ensure registries get written after Registry Bootstrap
This commit is contained in:
parent
ef1e899589
commit
b1679114cf
9 changed files with 361 additions and 173 deletions
|
@ -130,7 +130,9 @@ public abstract class BCLBiomeSource extends BiomeSource implements BiomeSourceW
|
||||||
) {
|
) {
|
||||||
final RegistryAccess access = WorldBootstrap.getLastRegistryAccess();
|
final RegistryAccess access = WorldBootstrap.getLastRegistryAccess();
|
||||||
if (access == null) {
|
if (access == null) {
|
||||||
BCLib.LOGGER.info("Unable to build Biome List yet");
|
if (Configs.MAIN_CONFIG.verboseLogging() && !BCLib.isDatagen()) {
|
||||||
|
BCLib.LOGGER.info("Unable to build Biome List yet");
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ import org.betterx.bclib.api.v2.generator.config.BCLEndBiomeSourceConfig;
|
||||||
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome;
|
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiome;
|
||||||
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.biomes.BiomeAPI;
|
||||||
|
import org.betterx.bclib.config.Configs;
|
||||||
import org.betterx.bclib.interfaces.BiomeMap;
|
import org.betterx.bclib.interfaces.BiomeMap;
|
||||||
import org.betterx.worlds.together.biomesource.BiomeSourceWithConfig;
|
import org.betterx.worlds.together.biomesource.BiomeSourceWithConfig;
|
||||||
|
|
||||||
|
@ -179,20 +180,24 @@ public class BCLibEndBiomeSource extends BCLBiomeSource implements BiomeSourceWi
|
||||||
}
|
}
|
||||||
|
|
||||||
if (endVoidBiomePicker.isEmpty()) {
|
if (endVoidBiomePicker.isEmpty()) {
|
||||||
BCLib.LOGGER.info("No Void Biomes found. Disabling by using barrens");
|
if (Configs.MAIN_CONFIG.verboseLogging() && !BCLib.isDatagen())
|
||||||
|
BCLib.LOGGER.info("No Void Biomes found. Disabling by using barrens");
|
||||||
endVoidBiomePicker = endBarrensBiomePicker;
|
endVoidBiomePicker = endBarrensBiomePicker;
|
||||||
}
|
}
|
||||||
if (endBarrensBiomePicker.isEmpty()) {
|
if (endBarrensBiomePicker.isEmpty()) {
|
||||||
BCLib.LOGGER.info("No Barrens Biomes found. Disabling by using land Biomes");
|
if (Configs.MAIN_CONFIG.verboseLogging() && !BCLib.isDatagen())
|
||||||
|
BCLib.LOGGER.info("No Barrens Biomes found. Disabling by using land Biomes");
|
||||||
endBarrensBiomePicker = endLandBiomePicker;
|
endBarrensBiomePicker = endLandBiomePicker;
|
||||||
endVoidBiomePicker = endLandBiomePicker;
|
endVoidBiomePicker = endLandBiomePicker;
|
||||||
}
|
}
|
||||||
if (endCenterBiomePicker.isEmpty()) {
|
if (endCenterBiomePicker.isEmpty()) {
|
||||||
BCLib.LOGGER.warning("No Center Island Biomes found. Forcing use of vanilla center.");
|
if (Configs.MAIN_CONFIG.verboseLogging() && !BCLib.isDatagen())
|
||||||
|
BCLib.LOGGER.warning("No Center Island Biomes found. Forcing use of vanilla center.");
|
||||||
endCenterBiomePicker.addBiome(BiomeAPI.THE_END);
|
endCenterBiomePicker.addBiome(BiomeAPI.THE_END);
|
||||||
endCenterBiomePicker.rebuild();
|
endCenterBiomePicker.rebuild();
|
||||||
if (endCenterBiomePicker.isEmpty()) {
|
if (endCenterBiomePicker.isEmpty()) {
|
||||||
BCLib.LOGGER.error("Unable to force vanilla central Island. Falling back to land Biomes...");
|
if (Configs.MAIN_CONFIG.verboseLogging() && !BCLib.isDatagen())
|
||||||
|
BCLib.LOGGER.error("Unable to force vanilla central Island. Falling back to land Biomes...");
|
||||||
endCenterBiomePicker = endLandBiomePicker;
|
endCenterBiomePicker = endLandBiomePicker;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,162 +2,69 @@ package org.betterx.bclib.api.v3.datagen;
|
||||||
|
|
||||||
import org.betterx.worlds.together.util.Logger;
|
import org.betterx.worlds.together.util.Logger;
|
||||||
|
|
||||||
import com.mojang.serialization.Codec;
|
|
||||||
import com.mojang.serialization.DynamicOps;
|
import com.mojang.serialization.DynamicOps;
|
||||||
import com.mojang.serialization.Encoder;
|
import com.mojang.serialization.Encoder;
|
||||||
import com.mojang.serialization.JsonOps;
|
import com.mojang.serialization.JsonOps;
|
||||||
import net.minecraft.core.Holder;
|
import net.minecraft.core.Holder;
|
||||||
import net.minecraft.core.HolderLookup;
|
import net.minecraft.core.HolderLookup;
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.RegistrySetBuilder;
|
||||||
import net.minecraft.data.CachedOutput;
|
import net.minecraft.data.CachedOutput;
|
||||||
import net.minecraft.data.DataProvider;
|
import net.minecraft.data.DataProvider;
|
||||||
import net.minecraft.data.PackOutput;
|
import net.minecraft.data.PackOutput;
|
||||||
import net.minecraft.resources.RegistryDataLoader;
|
|
||||||
import net.minecraft.resources.RegistryOps;
|
import net.minecraft.resources.RegistryOps;
|
||||||
import net.minecraft.resources.ResourceKey;
|
|
||||||
|
|
||||||
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
|
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
|
||||||
|
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public abstract class RegistriesDataProvider implements DataProvider {
|
public abstract class RegistriesDataProvider implements DataProvider {
|
||||||
public class InfoList extends LinkedList<RegistryInfo<?>> {
|
|
||||||
public <T> void add(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec) {
|
|
||||||
this.add(new RegistryInfo<T>(key, elementCodec));
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T> void add(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec, String... modIDs) {
|
|
||||||
this.add(new RegistryInfo<T>(key, elementCodec, modIDs));
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T> void add(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec, List<String> modIDs) {
|
|
||||||
this.add(new RegistryInfo<T>(key, elementCodec, modIDs));
|
|
||||||
}
|
|
||||||
|
|
||||||
public <T> void addUnfiltered(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec) {
|
|
||||||
this.add(new RegistryInfo<T>(key, elementCodec, RegistryInfo.UNFILTERED));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class RegistryInfo<T> {
|
|
||||||
public static final List<String> UNFILTERED = null;
|
|
||||||
public final RegistryDataLoader.RegistryData<T> data;
|
|
||||||
public final List<String> modIDs;
|
|
||||||
|
|
||||||
public RegistryInfo(RegistryDataLoader.RegistryData<T> data, List<String> modIDs) {
|
|
||||||
this.data = data;
|
|
||||||
this.modIDs = modIDs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public RegistryInfo(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec) {
|
|
||||||
this(new RegistryDataLoader.RegistryData<>(key, elementCodec), RegistriesDataProvider.this.defaultModIDs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public RegistryInfo(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec, String... modIDs) {
|
|
||||||
this(new RegistryDataLoader.RegistryData<>(key, elementCodec), List.of(modIDs));
|
|
||||||
}
|
|
||||||
|
|
||||||
public RegistryInfo(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec, List<String> modIDs) {
|
|
||||||
this(new RegistryDataLoader.RegistryData<>(key, elementCodec), modIDs);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ResourceKey<? extends Registry<T>> key() {
|
|
||||||
return data.key();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Codec<T> elementCodec() {
|
|
||||||
return data.elementCodec();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
List<Holder<T>> allElements(HolderLookup.Provider registryAccess) {
|
protected final RegistrySupplier registries;
|
||||||
final HolderLookup.RegistryLookup<T> registry = registryAccess.lookupOrThrow(key());
|
|
||||||
return registry
|
|
||||||
.listElementIds()
|
|
||||||
.filter(k -> modIDs == null || modIDs.isEmpty() || modIDs.contains(k.location().getNamespace()))
|
|
||||||
.map(k -> (Holder<T>) registry.get(k).orElseThrow())
|
|
||||||
.toList();
|
|
||||||
}
|
|
||||||
|
|
||||||
public RegistryDataLoader.RegistryData<T> data() {
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<String> modIDs() {
|
|
||||||
return modIDs;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (obj == this) return true;
|
|
||||||
if (obj == null || obj.getClass() != this.getClass()) return false;
|
|
||||||
var that = (RegistryInfo) obj;
|
|
||||||
return Objects.equals(this.data, that.data) &&
|
|
||||||
Objects.equals(this.modIDs, that.modIDs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(data, modIDs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "RegistryInfo[" +
|
|
||||||
"data=" + data + ", " +
|
|
||||||
"modIDs=" + modIDs + ']';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
protected final List<RegistryInfo<?>> registries;
|
|
||||||
|
|
||||||
protected final PackOutput output;
|
protected final PackOutput output;
|
||||||
protected final Logger LOGGER;
|
protected final Logger LOGGER;
|
||||||
protected final CompletableFuture<HolderLookup.Provider> registriesFuture;
|
protected final CompletableFuture<HolderLookup.Provider> registriesFuture;
|
||||||
private @Nullable List<String> defaultModIDs;
|
|
||||||
|
|
||||||
protected RegistriesDataProvider(
|
protected RegistriesDataProvider(
|
||||||
Logger logger,
|
Logger logger,
|
||||||
@Nullable List<String> defaultModIDs,
|
RegistrySupplier registries,
|
||||||
FabricDataOutput generator,
|
FabricDataOutput generator,
|
||||||
CompletableFuture<HolderLookup.Provider> registriesFuture
|
CompletableFuture<HolderLookup.Provider> registriesFuture
|
||||||
) {
|
) {
|
||||||
this.defaultModIDs = defaultModIDs;
|
|
||||||
this.LOGGER = logger;
|
this.LOGGER = logger;
|
||||||
this.output = generator;
|
this.output = generator;
|
||||||
this.registriesFuture = registriesFuture;
|
this.registriesFuture = registriesFuture;
|
||||||
this.registries = initializeRegistryList(defaultModIDs);
|
this.registries = registries;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract List<RegistryInfo<?>> initializeRegistryList(@Nullable List<String> modIDs);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CompletableFuture<?> run(CachedOutput cachedOutput) {
|
public CompletableFuture<?> run(CachedOutput cachedOutput) {
|
||||||
LOGGER.info("Serialize Registries " + defaultModIDs);
|
LOGGER.info("Serialize Registries " + registries.defaultModIDs);
|
||||||
|
|
||||||
return registriesFuture.thenCompose(registriesProvider -> CompletableFuture
|
return registriesFuture.thenCompose(registriesProvider -> CompletableFuture
|
||||||
.supplyAsync(() -> registries)
|
.supplyAsync(() -> registries)
|
||||||
.thenCompose(entries -> {
|
.thenCompose(entries -> {
|
||||||
final List<CompletableFuture<?>> futures = new ArrayList<>();
|
final List<CompletableFuture<?>> futures = new ArrayList<>();
|
||||||
final RegistryOps<JsonElement> dynamicOps = RegistryOps.create(
|
|
||||||
JsonOps.INSTANCE,
|
|
||||||
registriesProvider
|
|
||||||
);
|
|
||||||
|
|
||||||
futures.add(CompletableFuture.runAsync(() -> {
|
futures.add(CompletableFuture.runAsync(() -> {
|
||||||
for (RegistryInfo<?> registryData : entries) {
|
registries.acquireLock();
|
||||||
// futures.add(CompletableFuture.runAsync(() ->
|
final RegistryOps<JsonElement> dynamicOps = RegistryOps.create(
|
||||||
|
JsonOps.INSTANCE,
|
||||||
|
registriesProvider
|
||||||
|
);
|
||||||
|
|
||||||
|
for (RegistrySupplier.RegistryInfo<?> registryData : entries.allRegistries) {
|
||||||
serializeRegistry(
|
serializeRegistry(
|
||||||
cachedOutput, registriesProvider, dynamicOps, registryData
|
cachedOutput, registriesProvider, dynamicOps, registryData
|
||||||
);
|
);
|
||||||
// ));
|
|
||||||
}
|
}
|
||||||
|
registries.releaseLock();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new));
|
return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new));
|
||||||
|
@ -168,9 +75,10 @@ public abstract class RegistriesDataProvider implements DataProvider {
|
||||||
CachedOutput cachedOutput,
|
CachedOutput cachedOutput,
|
||||||
HolderLookup.Provider registryAccess,
|
HolderLookup.Provider registryAccess,
|
||||||
DynamicOps<JsonElement> dynamicOps,
|
DynamicOps<JsonElement> dynamicOps,
|
||||||
RegistryInfo<T> registryData
|
RegistrySupplier.RegistryInfo<T> registryData
|
||||||
) {
|
) {
|
||||||
final List<Holder<T>> elements = registryData.allElements(registryAccess);
|
final List<Holder<T>> elements = registryData.allElements(registryAccess);
|
||||||
|
LOGGER.info("Serializing " + elements.size() + " elements from " + registryData.data.key());
|
||||||
|
|
||||||
if (!elements.isEmpty()) {
|
if (!elements.isEmpty()) {
|
||||||
PackOutput.PathProvider pathProvider = this.output.createPathProvider(
|
PackOutput.PathProvider pathProvider = this.output.createPathProvider(
|
||||||
|
@ -188,7 +96,6 @@ public abstract class RegistriesDataProvider implements DataProvider {
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private <E> void serializeElements(
|
private <E> void serializeElements(
|
||||||
|
@ -207,7 +114,15 @@ public abstract class RegistriesDataProvider implements DataProvider {
|
||||||
if (optional.isPresent()) {
|
if (optional.isPresent()) {
|
||||||
DataProvider.saveStable(cachedOutput, optional.get(), path);
|
DataProvider.saveStable(cachedOutput, optional.get(), path);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void buildRegistry(RegistrySetBuilder registryBuilder) {
|
||||||
|
registries.allRegistries
|
||||||
|
.stream()
|
||||||
|
.filter(nfo -> nfo.registryBootstrap != null)
|
||||||
|
.forEach(nfo -> {
|
||||||
|
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,246 @@
|
||||||
|
package org.betterx.bclib.api.v3.datagen;
|
||||||
|
|
||||||
|
import com.mojang.serialization.Codec;
|
||||||
|
import net.minecraft.core.Holder;
|
||||||
|
import net.minecraft.core.HolderLookup;
|
||||||
|
import net.minecraft.core.Registry;
|
||||||
|
import net.minecraft.core.RegistrySetBuilder;
|
||||||
|
import net.minecraft.data.worldgen.BootstapContext;
|
||||||
|
import net.minecraft.resources.RegistryDataLoader;
|
||||||
|
import net.minecraft.resources.ResourceKey;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
public abstract class RegistrySupplier {
|
||||||
|
private static final int MAX_PERMITS = 1000;
|
||||||
|
private final Semaphore BOOTSTRAP_LOCK = new Semaphore(MAX_PERMITS);
|
||||||
|
|
||||||
|
final List<RegistrySupplier.RegistryInfo<?>> allRegistries;
|
||||||
|
@Nullable List<String> defaultModIDs;
|
||||||
|
|
||||||
|
protected RegistrySupplier(
|
||||||
|
@Nullable List<String> defaultModIDs
|
||||||
|
) {
|
||||||
|
this.defaultModIDs = defaultModIDs;
|
||||||
|
this.allRegistries = initializeRegistryList(defaultModIDs);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract List<RegistrySupplier.RegistryInfo<?>> initializeRegistryList(@Nullable List<String> modIDs);
|
||||||
|
|
||||||
|
public void bootstrapRegistries(RegistrySetBuilder registryBuilder) {
|
||||||
|
for (RegistrySupplier.RegistryInfo<?> nfo : allRegistries) {
|
||||||
|
if (nfo.registryBootstrap != null) {
|
||||||
|
nfo.add(registryBuilder, BOOTSTRAP_LOCK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void acquireLock() {
|
||||||
|
try {
|
||||||
|
BOOTSTRAP_LOCK.acquire(MAX_PERMITS);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void releaseLock() {
|
||||||
|
BOOTSTRAP_LOCK.release(MAX_PERMITS);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class InfoList extends LinkedList<RegistrySupplier.RegistryInfo<?>> {
|
||||||
|
public <T> void add(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec) {
|
||||||
|
this.add(new RegistrySupplier.RegistryInfo<T>(key, elementCodec));
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> void add(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec, String... modIDs) {
|
||||||
|
this.add(new RegistrySupplier.RegistryInfo<T>(key, elementCodec, modIDs));
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> void add(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec, List<String> modIDs) {
|
||||||
|
this.add(new RegistrySupplier.RegistryInfo<T>(key, elementCodec, modIDs));
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> void addUnfiltered(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec) {
|
||||||
|
this.add(new RegistrySupplier.RegistryInfo<T>(
|
||||||
|
key,
|
||||||
|
elementCodec,
|
||||||
|
RegistrySupplier.RegistryInfo.UNFILTERED
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> void add(
|
||||||
|
ResourceKey<? extends Registry<T>> key,
|
||||||
|
Codec<T> elementCodec,
|
||||||
|
RegistrySetBuilder.RegistryBootstrap<T> registryBootstrap
|
||||||
|
) {
|
||||||
|
this.add(new RegistrySupplier.RegistryInfo<T>(key, elementCodec, registryBootstrap));
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> void add(
|
||||||
|
ResourceKey<? extends Registry<T>> key,
|
||||||
|
Codec<T> elementCodec,
|
||||||
|
RegistrySetBuilder.RegistryBootstrap<T> registryBootstrap,
|
||||||
|
String... modIDs
|
||||||
|
) {
|
||||||
|
this.add(new RegistrySupplier.RegistryInfo<T>(key, elementCodec, registryBootstrap, modIDs));
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> void add(
|
||||||
|
ResourceKey<? extends Registry<T>> key,
|
||||||
|
Codec<T> elementCodec,
|
||||||
|
RegistrySetBuilder.RegistryBootstrap<T> registryBootstrap,
|
||||||
|
List<String> modIDs
|
||||||
|
) {
|
||||||
|
this.add(new RegistrySupplier.RegistryInfo<T>(key, elementCodec, registryBootstrap, modIDs));
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> void addUnfiltered(
|
||||||
|
ResourceKey<? extends Registry<T>> key,
|
||||||
|
Codec<T> elementCodec,
|
||||||
|
RegistrySetBuilder.RegistryBootstrap<T> registryBootstrap
|
||||||
|
) {
|
||||||
|
this.add(new RegistrySupplier.RegistryInfo<T>(
|
||||||
|
key,
|
||||||
|
elementCodec,
|
||||||
|
registryBootstrap,
|
||||||
|
RegistryInfo.UNFILTERED
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T> void addBootstrapOnly(
|
||||||
|
ResourceKey<? extends Registry<T>> key,
|
||||||
|
Codec<T> elementCodec,
|
||||||
|
RegistrySetBuilder.RegistryBootstrap<T> registryBootstrap
|
||||||
|
) {
|
||||||
|
this.add(new RegistrySupplier.RegistryInfo<T>(key, elementCodec, registryBootstrap, List.of()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class RegistryInfo<T> {
|
||||||
|
public static final List<String> UNFILTERED = null;
|
||||||
|
public final RegistryDataLoader.RegistryData<T> data;
|
||||||
|
public final List<String> modIDs;
|
||||||
|
public final RegistrySetBuilder.RegistryBootstrap<T> registryBootstrap;
|
||||||
|
|
||||||
|
public RegistryInfo(
|
||||||
|
RegistryDataLoader.RegistryData<T> data,
|
||||||
|
List<String> modIDs,
|
||||||
|
RegistrySetBuilder.RegistryBootstrap<T> registryBootstrap
|
||||||
|
) {
|
||||||
|
this.data = data;
|
||||||
|
this.modIDs = modIDs;
|
||||||
|
this.registryBootstrap = registryBootstrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegistryInfo(
|
||||||
|
ResourceKey<? extends Registry<T>> key,
|
||||||
|
Codec<T> elementCodec,
|
||||||
|
RegistrySetBuilder.RegistryBootstrap<T> registryBootstrap
|
||||||
|
) {
|
||||||
|
this(
|
||||||
|
new RegistryDataLoader.RegistryData<>(key, elementCodec),
|
||||||
|
RegistrySupplier.this.defaultModIDs,
|
||||||
|
registryBootstrap
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegistryInfo(
|
||||||
|
ResourceKey<? extends Registry<T>> key,
|
||||||
|
Codec<T> elementCodec,
|
||||||
|
RegistrySetBuilder.RegistryBootstrap<T> registryBootstrap,
|
||||||
|
String... modIDs
|
||||||
|
) {
|
||||||
|
this(new RegistryDataLoader.RegistryData<>(key, elementCodec), List.of(modIDs), registryBootstrap);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegistryInfo(
|
||||||
|
ResourceKey<? extends Registry<T>> key,
|
||||||
|
Codec<T> elementCodec,
|
||||||
|
RegistrySetBuilder.RegistryBootstrap<T> registryBootstrap,
|
||||||
|
List<String> modIDs
|
||||||
|
) {
|
||||||
|
this(new RegistryDataLoader.RegistryData<>(key, elementCodec), modIDs, registryBootstrap);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegistryInfo(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec) {
|
||||||
|
this(
|
||||||
|
new RegistryDataLoader.RegistryData<>(key, elementCodec),
|
||||||
|
RegistrySupplier.this.defaultModIDs,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegistryInfo(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec, String... modIDs) {
|
||||||
|
this(new RegistryDataLoader.RegistryData<>(key, elementCodec), List.of(modIDs), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegistryInfo(ResourceKey<? extends Registry<T>> key, Codec<T> elementCodec, List<String> modIDs) {
|
||||||
|
this(new RegistryDataLoader.RegistryData<>(key, elementCodec), modIDs, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ResourceKey<? extends Registry<T>> key() {
|
||||||
|
return data.key();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Codec<T> elementCodec() {
|
||||||
|
return data.elementCodec();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Holder<T>> allElements(HolderLookup.Provider registryAccess) {
|
||||||
|
final HolderLookup.RegistryLookup<T> registry = registryAccess.lookupOrThrow(key());
|
||||||
|
return registry
|
||||||
|
.listElementIds()
|
||||||
|
.filter(k -> modIDs == null || modIDs.contains(k.location().getNamespace()))
|
||||||
|
.map(k -> (Holder<T>) registry.get(k).orElseThrow())
|
||||||
|
.toList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void add(RegistrySetBuilder registryBuilder, final Semaphore LOCK_BOOSTRAP) {
|
||||||
|
try {
|
||||||
|
LOCK_BOOSTRAP.acquire();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
registryBuilder.add(key(), (BootstapContext<T> ctx) -> {
|
||||||
|
registryBootstrap.run(ctx);
|
||||||
|
LOCK_BOOSTRAP.release();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public RegistryDataLoader.RegistryData<T> data() {
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> modIDs() {
|
||||||
|
return modIDs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj) {
|
||||||
|
if (obj == this) return true;
|
||||||
|
if (obj == null || obj.getClass() != this.getClass()) return false;
|
||||||
|
var that = (RegistryInfo) obj;
|
||||||
|
return Objects.equals(this.data, that.data) &&
|
||||||
|
Objects.equals(this.modIDs, that.modIDs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(data, modIDs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "RegistryInfo[" +
|
||||||
|
"data=" + data + ", " +
|
||||||
|
"modIDs=" + modIDs + ']';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,69 @@
|
||||||
|
package org.betterx.datagen.bclib;
|
||||||
|
|
||||||
|
import org.betterx.bclib.BCLib;
|
||||||
|
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry;
|
||||||
|
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeData;
|
||||||
|
import org.betterx.bclib.api.v3.datagen.RegistrySupplier;
|
||||||
|
import org.betterx.datagen.bclib.preset.WorldPresetDataProvider;
|
||||||
|
import org.betterx.datagen.bclib.tests.TestBiomes;
|
||||||
|
import org.betterx.datagen.bclib.tests.TestConfiguredFeatures;
|
||||||
|
import org.betterx.datagen.bclib.tests.TestPlacedFeatures;
|
||||||
|
import org.betterx.datagen.bclib.tests.TestStructure;
|
||||||
|
import org.betterx.datagen.bclib.worldgen.NoiseTypesDataProvider;
|
||||||
|
import org.betterx.worlds.together.WorldsTogether;
|
||||||
|
import org.betterx.worlds.together.surfaceRules.AssignedSurfaceRule;
|
||||||
|
import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry;
|
||||||
|
|
||||||
|
import net.minecraft.core.registries.Registries;
|
||||||
|
import net.minecraft.world.level.biome.Biome;
|
||||||
|
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
|
||||||
|
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
|
||||||
|
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
|
||||||
|
import net.minecraft.world.level.levelgen.presets.WorldPreset;
|
||||||
|
import net.minecraft.world.level.levelgen.structure.Structure;
|
||||||
|
import net.minecraft.world.level.levelgen.structure.StructureSet;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
public class BCLRegistrySupplier extends RegistrySupplier {
|
||||||
|
public static final BCLRegistrySupplier INSTANCE = new BCLRegistrySupplier();
|
||||||
|
|
||||||
|
private BCLRegistrySupplier() {
|
||||||
|
super(List.of(
|
||||||
|
BCLib.MOD_ID,
|
||||||
|
WorldsTogether.MOD_ID
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected List<RegistryInfo<?>> initializeRegistryList(@Nullable List<String> modIDs) {
|
||||||
|
InfoList registries = new InfoList();
|
||||||
|
|
||||||
|
registries.addUnfiltered(BCLBiomeRegistry.BCL_BIOMES_REGISTRY, BiomeData.CODEC);
|
||||||
|
registries.addUnfiltered(SurfaceRuleRegistry.SURFACE_RULES_REGISTRY, AssignedSurfaceRule.CODEC);
|
||||||
|
|
||||||
|
if (BCLibDatagen.ADD_TESTS) {
|
||||||
|
registries.add(Registries.STRUCTURE, Structure.DIRECT_CODEC, TestStructure::bootstrap);
|
||||||
|
registries.add(Registries.STRUCTURE_SET, StructureSet.DIRECT_CODEC, TestStructure::bootstrapSet);
|
||||||
|
registries.add(
|
||||||
|
Registries.CONFIGURED_FEATURE,
|
||||||
|
ConfiguredFeature.DIRECT_CODEC,
|
||||||
|
TestConfiguredFeatures::bootstrap
|
||||||
|
);
|
||||||
|
registries.add(Registries.PLACED_FEATURE, PlacedFeature.DIRECT_CODEC, TestPlacedFeatures::bootstrap);
|
||||||
|
registries.add(Registries.BIOME, Biome.DIRECT_CODEC, TestBiomes::bootstrap);
|
||||||
|
} else {
|
||||||
|
registries.addBootstrapOnly(Registries.BIOME, Biome.DIRECT_CODEC, TestBiomes::bootstrap);
|
||||||
|
}
|
||||||
|
|
||||||
|
registries.add(
|
||||||
|
Registries.NOISE_SETTINGS,
|
||||||
|
NoiseGeneratorSettings.DIRECT_CODEC,
|
||||||
|
NoiseTypesDataProvider::bootstrap
|
||||||
|
);
|
||||||
|
registries.add(Registries.WORLD_PRESET, WorldPreset.DIRECT_CODEC, WorldPresetDataProvider::bootstrap);
|
||||||
|
|
||||||
|
return registries;
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,13 +2,12 @@ package org.betterx.datagen.bclib;
|
||||||
|
|
||||||
import org.betterx.bclib.BCLib;
|
import org.betterx.bclib.BCLib;
|
||||||
import org.betterx.datagen.bclib.preset.WorldPresetDataProvider;
|
import org.betterx.datagen.bclib.preset.WorldPresetDataProvider;
|
||||||
import org.betterx.datagen.bclib.tests.*;
|
import org.betterx.datagen.bclib.tests.TestBiomes;
|
||||||
|
import org.betterx.datagen.bclib.tests.TestWorldgenProvider;
|
||||||
import org.betterx.datagen.bclib.worldgen.BCLibRegistriesDataProvider;
|
import org.betterx.datagen.bclib.worldgen.BCLibRegistriesDataProvider;
|
||||||
import org.betterx.datagen.bclib.worldgen.NoiseTypesDataProvider;
|
|
||||||
import org.betterx.datagen.bclib.worldgen.VanillaBCLBiomesDataProvider;
|
import org.betterx.datagen.bclib.worldgen.VanillaBCLBiomesDataProvider;
|
||||||
|
|
||||||
import net.minecraft.core.RegistrySetBuilder;
|
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.DataGeneratorEntrypoint;
|
||||||
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
|
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
|
||||||
|
@ -32,19 +31,9 @@ public class BCLibDatagen implements DataGeneratorEntrypoint {
|
||||||
pack.addProvider(BCLibRegistriesDataProvider::new);
|
pack.addProvider(BCLibRegistriesDataProvider::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void buildRegistry(RegistrySetBuilder registryBuilder) {
|
public void buildRegistry(RegistrySetBuilder registryBuilder) {
|
||||||
BCLib.LOGGER.info("Datagen buildRegistry");
|
BCLRegistrySupplier.INSTANCE.bootstrapRegistries(registryBuilder);
|
||||||
if (ADD_TESTS) {
|
|
||||||
registryBuilder.add(Registries.CONFIGURED_FEATURE, TestConfiguredFeatures::bootstrap);
|
|
||||||
registryBuilder.add(Registries.PLACED_FEATURE, TestPlacedFeatures::bootstrap);
|
|
||||||
//registryBuilder.add(Registries.STRUCTURE_PIECE, TestStructure::bootstrapPiece);
|
|
||||||
//registryBuilder.add(Registries.STRUCTURE_TYPE, TestStructure::bootstrapType);
|
|
||||||
registryBuilder.add(Registries.STRUCTURE, TestStructure::bootstrap);
|
|
||||||
registryBuilder.add(Registries.STRUCTURE_SET, TestStructure::bootstrapSet);
|
|
||||||
}
|
|
||||||
registryBuilder.add(Registries.BIOME, TestBiomes::bootstrap);
|
|
||||||
registryBuilder.add(Registries.NOISE_SETTINGS, NoiseTypesDataProvider::bootstrap);
|
|
||||||
registryBuilder.add(Registries.WORLD_PRESET, WorldPresetDataProvider::bootstrap);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,8 +32,8 @@ public class TestConfiguredFeatures {
|
||||||
YELLOW_FEATURE.id
|
YELLOW_FEATURE.id
|
||||||
));
|
));
|
||||||
|
|
||||||
BCLib.LOGGER.info("Bootstrap CONFIGUREDFeatures" + holder);
|
|
||||||
if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) {
|
if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) {
|
||||||
|
BCLib.LOGGER.info("Bootstrap CONFIGUREDFeatures" + holder);
|
||||||
//YELLOW_FEATURE = YELLOW_FEATURE.register(bootstrapContext);
|
//YELLOW_FEATURE = YELLOW_FEATURE.register(bootstrapContext);
|
||||||
BCLFeatureBuilder.registerUnbound(bootstrapContext);
|
BCLFeatureBuilder.registerUnbound(bootstrapContext);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,9 +26,8 @@ public class TestPlacedFeatures {
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
public static void bootstrap(BootstapContext<PlacedFeature> bootstrapContext) {
|
public static void bootstrap(BootstapContext<PlacedFeature> bootstrapContext) {
|
||||||
BCLib.LOGGER.info("Bootstrap PLACEDFeatures");
|
|
||||||
|
|
||||||
if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) {
|
if (BCLibDatagen.ADD_TESTS && BCLib.isDevEnvironment()) {
|
||||||
|
BCLib.LOGGER.info("Bootstrap PLACEDFeatures");
|
||||||
YELLOW_PLACED = YELLOW_PLACED.register(bootstrapContext);
|
YELLOW_PLACED = YELLOW_PLACED.register(bootstrapContext);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,57 +1,20 @@
|
||||||
package org.betterx.datagen.bclib.worldgen;
|
package org.betterx.datagen.bclib.worldgen;
|
||||||
|
|
||||||
import org.betterx.bclib.BCLib;
|
import org.betterx.bclib.BCLib;
|
||||||
import org.betterx.bclib.api.v2.levelgen.biomes.BCLBiomeRegistry;
|
|
||||||
import org.betterx.bclib.api.v2.levelgen.biomes.BiomeData;
|
|
||||||
import org.betterx.bclib.api.v3.datagen.RegistriesDataProvider;
|
import org.betterx.bclib.api.v3.datagen.RegistriesDataProvider;
|
||||||
import org.betterx.datagen.bclib.BCLibDatagen;
|
import org.betterx.datagen.bclib.BCLRegistrySupplier;
|
||||||
import org.betterx.worlds.together.WorldsTogether;
|
|
||||||
import org.betterx.worlds.together.surfaceRules.AssignedSurfaceRule;
|
|
||||||
import org.betterx.worlds.together.surfaceRules.SurfaceRuleRegistry;
|
|
||||||
|
|
||||||
import net.minecraft.core.HolderLookup;
|
import net.minecraft.core.HolderLookup;
|
||||||
import net.minecraft.core.registries.Registries;
|
|
||||||
import net.minecraft.world.level.biome.Biome;
|
|
||||||
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
|
|
||||||
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
|
|
||||||
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
|
|
||||||
import net.minecraft.world.level.levelgen.presets.WorldPreset;
|
|
||||||
import net.minecraft.world.level.levelgen.structure.Structure;
|
|
||||||
import net.minecraft.world.level.levelgen.structure.StructureSet;
|
|
||||||
|
|
||||||
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
|
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
public class BCLibRegistriesDataProvider extends RegistriesDataProvider {
|
public class BCLibRegistriesDataProvider extends RegistriesDataProvider {
|
||||||
public BCLibRegistriesDataProvider(
|
public BCLibRegistriesDataProvider(
|
||||||
FabricDataOutput generator,
|
FabricDataOutput generator,
|
||||||
CompletableFuture<HolderLookup.Provider> registriesFuture
|
CompletableFuture<HolderLookup.Provider> registriesFuture
|
||||||
) {
|
) {
|
||||||
super(BCLib.LOGGER, List.of(BCLib.MOD_ID, WorldsTogether.MOD_ID), generator, registriesFuture);
|
super(BCLib.LOGGER, BCLRegistrySupplier.INSTANCE, generator, registriesFuture);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected List<RegistryInfo<?>> initializeRegistryList(@Nullable List<String> modIDs) {
|
|
||||||
InfoList registries = new InfoList();
|
|
||||||
|
|
||||||
registries.addUnfiltered(BCLBiomeRegistry.BCL_BIOMES_REGISTRY, BiomeData.CODEC);
|
|
||||||
registries.addUnfiltered(SurfaceRuleRegistry.SURFACE_RULES_REGISTRY, AssignedSurfaceRule.CODEC);
|
|
||||||
|
|
||||||
if (BCLibDatagen.ADD_TESTS) {
|
|
||||||
registries.add(Registries.STRUCTURE, Structure.DIRECT_CODEC);
|
|
||||||
registries.add(Registries.STRUCTURE_SET, StructureSet.DIRECT_CODEC);
|
|
||||||
registries.add(Registries.CONFIGURED_FEATURE, ConfiguredFeature.DIRECT_CODEC);
|
|
||||||
registries.add(Registries.PLACED_FEATURE, PlacedFeature.DIRECT_CODEC);
|
|
||||||
registries.add(Registries.BIOME, Biome.DIRECT_CODEC);
|
|
||||||
}
|
|
||||||
|
|
||||||
registries.add(Registries.NOISE_SETTINGS, NoiseGeneratorSettings.DIRECT_CODEC);
|
|
||||||
registries.add(Registries.WORLD_PRESET, WorldPreset.DIRECT_CODEC);
|
|
||||||
|
|
||||||
return registries;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue