mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-19 15:20:55 +00:00
Implement biome defined layer samplers
This commit is contained in:
+5
-1
@@ -23,11 +23,13 @@ import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredic
|
|||||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerListLayerPredicateTemplate;
|
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerListLayerPredicateTemplate;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate;
|
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate;
|
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.config.sampler.BiomeDefinedLayerSamplerTemplate;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate;
|
import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator;
|
import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette;
|
import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate;
|
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest;
|
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
|
||||||
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper;
|
||||||
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
import com.dfsek.terra.addons.manifest.api.AddonInitializer;
|
||||||
import com.dfsek.terra.api.Platform;
|
import com.dfsek.terra.api.Platform;
|
||||||
@@ -83,6 +85,7 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
|
|||||||
CheckedRegistry<Supplier<ObjectTemplate<LayerSampler>>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN);
|
CheckedRegistry<Supplier<ObjectTemplate<LayerSampler>>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN);
|
||||||
CheckedRegistry<InstanceWrapper<LayerSampler>> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN);
|
CheckedRegistry<InstanceWrapper<LayerSampler>> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN);
|
||||||
samplerTypeRegistry.register(addon.key("SIMPLE"), SimpleLayerSamplerTemplate::new);
|
samplerTypeRegistry.register(addon.key("SIMPLE"), SimpleLayerSamplerTemplate::new);
|
||||||
|
samplerTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerSamplerTemplate::new);
|
||||||
|
|
||||||
event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> {
|
event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> {
|
||||||
samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler));
|
samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler));
|
||||||
@@ -134,6 +137,7 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
|
|||||||
.getHandler(FunctionalEventHandler.class)
|
.getHandler(FunctionalEventHandler.class)
|
||||||
.register(addon, ConfigurationLoadEvent.class)
|
.register(addon, ConfigurationLoadEvent.class)
|
||||||
.priority(1000)
|
.priority(1000)
|
||||||
.then(BiomeDefinedLayerPalette.injectLayerPalettes);
|
.then(BiomeDefinedLayerPalette.injectLayerPalettes)
|
||||||
|
.then(BiomeDefinedLayerSampler.injectLayerSamplers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+23
@@ -0,0 +1,23 @@
|
|||||||
|
package com.dfsek.terra.addons.chunkgenerator.config.sampler;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||||
|
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler;
|
||||||
|
import com.dfsek.terra.api.config.meta.Meta;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomeDefinedLayerSamplerTemplate implements ObjectTemplate<LayerSampler> {
|
||||||
|
|
||||||
|
@Value("default")
|
||||||
|
@Default
|
||||||
|
private @Meta NoiseSampler defaultSampler = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LayerSampler get() {
|
||||||
|
return new BiomeDefinedLayerSampler(defaultSampler);
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
-1
@@ -49,7 +49,7 @@ public class BiomeDefinedLayerPalette extends LayerPalette {
|
|||||||
String id = registryKey.getID();
|
String id = registryKey.getID();
|
||||||
String fieldName = id + "LayerPalette";
|
String fieldName = id + "LayerPalette";
|
||||||
paletteFields.put(biomeLayerPalette, fieldName);
|
paletteFields.put(biomeLayerPalette, fieldName);
|
||||||
DynamicValue.Builder<Palette> value = DynamicValue.builder("layers." + id, Palette.class);
|
DynamicValue.Builder<Palette> value = DynamicValue.builder("generation.layers." + id, Palette.class);
|
||||||
biomeLayerPalette.getDefaultPalette().ifPresent(value::setDefault);
|
biomeLayerPalette.getDefaultPalette().ifPresent(value::setDefault);
|
||||||
templateBuilder.value(fieldName, value.build());
|
templateBuilder.value(fieldName, value.build());
|
||||||
}
|
}
|
||||||
|
|||||||
+75
@@ -0,0 +1,75 @@
|
|||||||
|
package com.dfsek.terra.addons.chunkgenerator.layer.sampler;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate;
|
||||||
|
import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon;
|
||||||
|
import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler;
|
||||||
|
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.properties.Properties;
|
||||||
|
import com.dfsek.terra.api.world.biome.Biome;
|
||||||
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||||
|
|
||||||
|
|
||||||
|
public class BiomeDefinedLayerSampler implements LayerSampler {
|
||||||
|
|
||||||
|
private final NoiseSampler defaultSampler;
|
||||||
|
|
||||||
|
public BiomeDefinedLayerSampler(@Nullable NoiseSampler defaultSampler) {
|
||||||
|
this.defaultSampler = defaultSampler;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) {
|
||||||
|
return biomeProvider.getBiome(x, y, z, world.getSeed())
|
||||||
|
.getContext()
|
||||||
|
.get(BiomeLayerSamplers.class)
|
||||||
|
.samplers()
|
||||||
|
.get(this)
|
||||||
|
.noise(world.getSeed(), x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Optional<NoiseSampler> getDefaultSampler() {
|
||||||
|
return Optional.ofNullable(defaultSampler);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Consumer<ConfigurationLoadEvent> injectLayerSamplers = event -> {
|
||||||
|
if(event.is(Biome.class)) {
|
||||||
|
|
||||||
|
Map<BiomeDefinedLayerSampler, String> samplerFields = new HashMap<>();
|
||||||
|
DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder();
|
||||||
|
|
||||||
|
event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_SAMPLER_TOKEN).forEach((registryKey, registryEntry) -> {
|
||||||
|
LayerSampler layerSampler = registryEntry.get();
|
||||||
|
|
||||||
|
if (layerSampler instanceof BiomeDefinedLayerSampler biomeLayerSampler) {
|
||||||
|
String id = registryKey.getID();
|
||||||
|
String fieldName = id + "LayerSampler";
|
||||||
|
samplerFields.put(biomeLayerSampler, fieldName);
|
||||||
|
DynamicValue.Builder<NoiseSampler> value = DynamicValue.builder("generation.samplers." + id, NoiseSampler.class);
|
||||||
|
biomeLayerSampler.getDefaultSampler().ifPresent(value::setDefault);
|
||||||
|
templateBuilder.value(fieldName, value.build());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
DynamicTemplate layerSamplerBiomeTemplate = event.load(templateBuilder.build());
|
||||||
|
|
||||||
|
Map<BiomeDefinedLayerSampler, NoiseSampler> samplerMap = samplerFields.entrySet().stream().collect(
|
||||||
|
Collectors.toMap(Entry::getKey, entry -> layerSamplerBiomeTemplate.get(entry.getValue(), NoiseSampler.class)));
|
||||||
|
event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerSamplers(samplerMap));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public record BiomeLayerSamplers(Map<BiomeDefinedLayerSampler, NoiseSampler> samplers) implements Properties {
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user