mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-04-06 15:56:14 +00:00
Finish initial layered generator implementation
This commit is contained in:
@@ -1,12 +1,18 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.LayeredChunkGeneratorPackConfigTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.palette.LayerPalettePackConfigTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.LayerPredicatePackConfigTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.resolve.LayerResolverPackConfigTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator;
|
||||
@@ -19,16 +25,10 @@ import com.dfsek.terra.api.addon.BaseAddon;
|
||||
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
|
||||
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
|
||||
import com.dfsek.terra.api.inject.annotations.Inject;
|
||||
|
||||
import com.dfsek.terra.api.registry.CheckedRegistry;
|
||||
import com.dfsek.terra.api.util.reflection.TypeKey;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.function.Supplier;
|
||||
|
||||
|
||||
public class LayeredChunkGeneratorAddon implements AddonInitializer {
|
||||
|
||||
@@ -51,34 +51,38 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer {
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
|
||||
LayerPalettePackConfigTemplate paletteConfig = new LayerPalettePackConfigTemplate();
|
||||
LayerPredicatePackConfigTemplate predicateConfig = new LayerPredicatePackConfigTemplate();
|
||||
LayerResolverPackConfigTemplate resolverConfig = new LayerResolverPackConfigTemplate();
|
||||
|
||||
platform.getEventManager()
|
||||
.getHandler(FunctionalEventHandler.class)
|
||||
.register(addon, ConfigPackPreLoadEvent.class)
|
||||
.priority(50)
|
||||
.priority(1000)
|
||||
.then(event -> {
|
||||
CheckedRegistry<Supplier<ObjectTemplate<LayerPalette>>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN);
|
||||
paletteRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new);
|
||||
})
|
||||
.then(event -> {
|
||||
logger.info("Registering LayerResolvers..");
|
||||
LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate());
|
||||
CheckedRegistry<Supplier<ObjectTemplate<LayerResolver>>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN);
|
||||
resolverRegistry.register(addon.key("PREDICATE"), PredicateLayerResolverTemplate::new);
|
||||
resolverRegistry.register(addon.key("PALETTE"), () -> new PaletteLayerResolverTemplate(config.getPalettes()));
|
||||
event.loadTemplate(paletteConfig);
|
||||
})
|
||||
.then(event -> {
|
||||
CheckedRegistry<Supplier<ObjectTemplate<LayerPredicate>>> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN);
|
||||
predicateRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new);
|
||||
predicateRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new);
|
||||
predicateRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new);
|
||||
event.loadTemplate(predicateConfig);
|
||||
})
|
||||
.then(event -> {
|
||||
CheckedRegistry<Supplier<ObjectTemplate<LayerResolver>>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN);
|
||||
resolverRegistry.register(addon.key("TEST_PREDICATE"), () -> new PredicateLayerResolverTemplate(predicateConfig.getPredicates()));
|
||||
resolverRegistry.register(addon.key("USE_PALETTE"), () -> new PaletteLayerResolverTemplate(paletteConfig.getPalettes()));
|
||||
event.loadTemplate(resolverConfig);
|
||||
})
|
||||
.then(event -> {
|
||||
LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate());
|
||||
event.getPack()
|
||||
.getOrCreateRegistry(ChunkGeneratorProvider.class)
|
||||
.register(addon.key("LAYERED"),
|
||||
pack -> new LayeredChunkGenerator(platform, config.getResolver()));
|
||||
pack -> new LayeredChunkGenerator(platform, resolverConfig.getResolver()));
|
||||
})
|
||||
.failThrough();
|
||||
}
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Default;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
public class LayeredChunkGeneratorPackConfigTemplate implements ConfigTemplate {
|
||||
@Value("generation.sampler")
|
||||
private @Meta NoiseSampler sampler;
|
||||
|
||||
@Value("generation.resolver")
|
||||
private @Meta LayerResolver resolver;
|
||||
|
||||
@Value("generation.palettes")
|
||||
private @Meta Map<String, LayerPalette> palettes;
|
||||
|
||||
public Map<String, LayerPalette> getPalettes() {
|
||||
return palettes;
|
||||
}
|
||||
|
||||
public NoiseSampler getSampler() {
|
||||
return sampler;
|
||||
}
|
||||
|
||||
public LayerResolver getResolver() {
|
||||
return resolver;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.palette;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class LayerPalettePackConfigTemplate implements ConfigTemplate {
|
||||
|
||||
@Value("generation.palettes")
|
||||
private @Meta Map<String, LayerPalette> palettes;
|
||||
|
||||
public Map<String, LayerPalette> getPalettes() {
|
||||
return palettes;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.predicate;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class LayerPredicatePackConfigTemplate implements ConfigTemplate {
|
||||
|
||||
@Value("generation.predicates")
|
||||
private @Meta Map<String, LayerPredicate> predicates;
|
||||
|
||||
public Map<String, LayerPredicate> getPredicates() {
|
||||
return predicates;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.resolve;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver;
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class LayerResolverPackConfigTemplate implements ConfigTemplate {
|
||||
|
||||
@Value("generation.resolver")
|
||||
private @Meta LayerResolver resolver;
|
||||
|
||||
public LayerResolver getResolver() {
|
||||
return resolver;
|
||||
}
|
||||
}
|
||||
@@ -1,8 +1,11 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.config.resolve;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate;
|
||||
import com.dfsek.tectonic.api.config.template.annotations.Value;
|
||||
|
||||
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
|
||||
import com.dfsek.tectonic.api.exception.ValidationException;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver;
|
||||
@@ -10,10 +13,16 @@ import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PredicateLayerResolve
|
||||
import com.dfsek.terra.api.config.meta.Meta;
|
||||
|
||||
|
||||
public class PredicateLayerResolverTemplate implements ObjectTemplate<LayerResolver> {
|
||||
public class PredicateLayerResolverTemplate implements ObjectTemplate<LayerResolver>, ValidatedConfigTemplate {
|
||||
|
||||
private final Map<String, LayerPredicate> predicates;
|
||||
|
||||
public PredicateLayerResolverTemplate(Map<String, LayerPredicate> predicates) {
|
||||
this.predicates = predicates;
|
||||
}
|
||||
|
||||
@Value("if")
|
||||
private @Meta LayerPredicate predicate;
|
||||
private @Meta String predicate;
|
||||
|
||||
@Value("then")
|
||||
private @Meta LayerResolver trueResolver;
|
||||
@@ -24,6 +33,12 @@ public class PredicateLayerResolverTemplate implements ObjectTemplate<LayerResol
|
||||
|
||||
@Override
|
||||
public PredicateLayerResolver get() {
|
||||
return new PredicateLayerResolver(predicate, trueResolver, falseResolver);
|
||||
return new PredicateLayerResolver(predicates.get(predicate), trueResolver, falseResolver);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validate() throws ValidationException {
|
||||
if (!predicates.containsKey(predicate)) throw new ValidationException("The predicate " + predicate + " does not exist!");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.dfsek.terra.addons.chunkgenerator.generation;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette;
|
||||
import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver;
|
||||
import com.dfsek.terra.api.Platform;
|
||||
@@ -12,8 +14,6 @@ import com.dfsek.terra.api.world.chunk.generation.ProtoChunk;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
|
||||
public class LayeredChunkGenerator implements ChunkGenerator {
|
||||
|
||||
@@ -48,7 +48,7 @@ public class LayeredChunkGenerator implements ChunkGenerator {
|
||||
|
||||
Biome biome = biomeColumn.get(y);
|
||||
|
||||
LayerPalette layerPalette = resolver.resolve(seed, biome, x, y, z);
|
||||
LayerPalette layerPalette = resolver.resolve(seed, biome, cx, y, cz);
|
||||
|
||||
if (previousLayerPalette == layerPalette) {
|
||||
paletteLevel++;
|
||||
@@ -57,9 +57,9 @@ public class LayeredChunkGenerator implements ChunkGenerator {
|
||||
}
|
||||
previousLayerPalette = layerPalette;
|
||||
|
||||
Palette palette = layerPalette.get(seed, biome, x, y, z);
|
||||
Palette palette = layerPalette.get(seed, biome, cx, y, cz);
|
||||
|
||||
chunk.setBlock(cx, y, cz, palette.get(paletteLevel, x, y, z, seed));
|
||||
chunk.setBlock(cx, y, cz, palette.get(paletteLevel, cx, y, cz, seed));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,6 @@ package com.dfsek.terra.addons.chunkgenerator.layer.palette;
|
||||
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
import com.dfsek.terra.api.world.chunk.generation.util.Palette;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
|
||||
public interface LayerPalette {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user