diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java index 9c74fac62..4295cde1d 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java @@ -1,17 +1,27 @@ package com.dfsek.terra.addons.feature.distributor; +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.addons.feature.distributor.config.NoiseDistributorTemplate; import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.annotations.Addon; import com.dfsek.terra.api.addon.annotations.Author; import com.dfsek.terra.api.addon.annotations.Version; import com.dfsek.terra.api.event.EventListener; +import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.injection.annotations.Inject; +import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.structure.feature.Distributor; +import com.dfsek.terra.api.util.reflection.TypeKey; +import com.dfsek.terra.api.util.seeded.SeededBuilder; + +import java.util.function.Supplier; @Addon("config-distributors") @Version("1.0.0") @Author("Terra") public class DistributorAddon extends TerraAddon implements EventListener { + public static final TypeKey>>> DISTRIBUTOR_TOKEN = new TypeKey<>() {}; @Inject private TerraPlugin main; @@ -21,4 +31,8 @@ public class DistributorAddon extends TerraAddon implements EventListener { } + public void packPreLoad(ConfigPackPreLoadEvent event) { + CheckedRegistry>>> distributorRegistry = event.getPack().getOrCreateRegistry(DISTRIBUTOR_TOKEN); + distributorRegistry.register("NOISE", NoiseDistributorTemplate::new); + } } diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java new file mode 100644 index 000000000..f4930b78f --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.feature.distributor.config; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.addons.feature.distributor.distributors.NoiseDistributor; +import com.dfsek.terra.api.structure.feature.Distributor; +import com.dfsek.terra.api.util.seeded.SeededBuilder; +import com.dfsek.terra.api.util.seeded.SeededNoiseSampler; + +public class NoiseDistributorTemplate implements ObjectTemplate> { + @Value("distribution") + private SeededNoiseSampler noise; + + @Override + public SeededBuilder get() { + return seed -> new NoiseDistributor(noise.build(seed)); + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java new file mode 100644 index 000000000..00b4ad8fb --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.addons.feature.distributor.distributors; + +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.structure.feature.Distributor; + +public class NoiseDistributor implements Distributor { + private final NoiseSampler sampler; + + public NoiseDistributor(NoiseSampler sampler) { + this.sampler = sampler; + } + + @Override + public boolean matches(int x, int z) { + return sampler.getNoise(x, z) > 0; + } +}