From 2368763d7430f194d4b53c54dea6e612e0770dfe Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 17 Oct 2021 14:37:50 -0700 Subject: [PATCH] Initial commit --- .../config-distributors/build.gradle.kts | 2 + .../feature/distributor/DistributorAddon.java | 56 +++++++++++++++++++ .../config/AndDistributorTemplate.java | 33 +++++++++++ .../config/NoDistributorTemplate.java | 13 +++++ .../config/NoiseDistributorTemplate.java | 24 ++++++++ .../config/OrDistributorTemplate.java | 33 +++++++++++ .../config/PointSetDistributorTemplate.java | 22 ++++++++ .../config/YesDistributorTemplate.java | 13 +++++ .../distributors/NoiseDistributor.java | 21 +++++++ .../distributors/PointSetDistributor.java | 20 +++++++ .../feature/distributor/util/Point.java | 34 +++++++++++ .../distributor/util/PointTemplate.java | 20 +++++++ 12 files changed, 291 insertions(+) create mode 100644 common/addons/config-distributors/build.gradle.kts create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoDistributorTemplate.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/YesDistributorTemplate.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java diff --git a/common/addons/config-distributors/build.gradle.kts b/common/addons/config-distributors/build.gradle.kts new file mode 100644 index 000000000..7d82dc72f --- /dev/null +++ b/common/addons/config-distributors/build.gradle.kts @@ -0,0 +1,2 @@ +dependencies { +} 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 new file mode 100644 index 000000000..0a64b1386 --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/DistributorAddon.java @@ -0,0 +1,56 @@ +package com.dfsek.terra.addons.feature.distributor; + +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.function.Supplier; + +import com.dfsek.terra.addons.feature.distributor.config.AndDistributorTemplate; +import com.dfsek.terra.addons.feature.distributor.config.NoiseDistributorTemplate; +import com.dfsek.terra.addons.feature.distributor.config.OrDistributorTemplate; +import com.dfsek.terra.addons.feature.distributor.config.PointSetDistributorTemplate; +import com.dfsek.terra.addons.feature.distributor.config.YesDistributorTemplate; +import com.dfsek.terra.addons.feature.distributor.util.Point; +import com.dfsek.terra.addons.feature.distributor.util.PointTemplate; +import com.dfsek.terra.api.Platform; +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.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.structure.feature.Distributor; +import com.dfsek.terra.api.util.reflection.TypeKey; + + +@Addon("config-distributors") +@Version("1.0.0") +@Author("Terra") +public class DistributorAddon extends TerraAddon { + public static final TypeKey>> DISTRIBUTOR_TOKEN = new TypeKey<>() { + }; + @Inject + private Platform platform; + + @Override + public void initialize() { + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> { + CheckedRegistry>> distributorRegistry = event.getPack().getOrCreateRegistry( + DISTRIBUTOR_TOKEN); + distributorRegistry.register("NOISE", NoiseDistributorTemplate::new); + distributorRegistry.register("POINTS", PointSetDistributorTemplate::new); + distributorRegistry.register("AND", AndDistributorTemplate::new); + distributorRegistry.register("OR", OrDistributorTemplate::new); + distributorRegistry.register("YES", YesDistributorTemplate::new); + distributorRegistry.register("NO", NoiseDistributorTemplate::new); + + event.getPack() + .applyLoader(Point.class, PointTemplate::new); + }) + .failThrough(); + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java new file mode 100644 index 000000000..55d973f3f --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/AndDistributorTemplate.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.addons.feature.distributor.config; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.config.ValidatedConfigTemplate; +import com.dfsek.tectonic.exception.ValidationException; +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.List; + +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.structure.feature.Distributor; + + +public class AndDistributorTemplate implements ObjectTemplate, ValidatedConfigTemplate { + @Value("distributors") + private @Meta List<@Meta Distributor> distributors; + + + @Override + public Distributor get() { + Distributor current = distributors.remove(0); + while(!distributors.isEmpty()) { + current = current.and(distributors.remove(0)); + } + return current; + } + + @Override + public boolean validate() throws ValidationException { + if(distributors.isEmpty()) throw new ValidationException("AND Distributor must specify at least 1 distributor."); + return true; + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoDistributorTemplate.java new file mode 100644 index 000000000..bafa1b50d --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoDistributorTemplate.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.addons.feature.distributor.config; + +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import com.dfsek.terra.api.structure.feature.Distributor; + + +public class NoDistributorTemplate implements ObjectTemplate { + @Override + public Distributor get() { + return Distributor.no(); + } +} 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..945928f02 --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.addons.feature.distributor.config; + +import com.dfsek.tectonic.annotations.Default; +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.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.structure.feature.Distributor; + + +public class NoiseDistributorTemplate implements ObjectTemplate { + @Value("threshold") + @Default + private @Meta double threshold = 0; + @Value("distribution") + private @Meta NoiseSampler noise; + + @Override + public Distributor get() { + return new NoiseDistributor(noise, threshold); + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java new file mode 100644 index 000000000..3a8aa26c3 --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/OrDistributorTemplate.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.addons.feature.distributor.config; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.config.ValidatedConfigTemplate; +import com.dfsek.tectonic.exception.ValidationException; +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.List; + +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.structure.feature.Distributor; + + +public class OrDistributorTemplate implements ObjectTemplate, ValidatedConfigTemplate { + @Value("distributors") + private @Meta List<@Meta Distributor> distributors; + + + @Override + public Distributor get() { + Distributor current = distributors.remove(0); + while(!distributors.isEmpty()) { + current = current.or(distributors.remove(0)); + } + return current; + } + + @Override + public boolean validate() throws ValidationException { + if(distributors.isEmpty()) throw new ValidationException("AND Distributor must specify at least 1 distributor."); + return true; + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java new file mode 100644 index 000000000..da61112a7 --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PointSetDistributorTemplate.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.feature.distributor.config; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import java.util.Set; + +import com.dfsek.terra.addons.feature.distributor.distributors.PointSetDistributor; +import com.dfsek.terra.addons.feature.distributor.util.Point; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.structure.feature.Distributor; + + +public class PointSetDistributorTemplate implements ObjectTemplate { + @Value("points") + private @Meta Set<@Meta Point> points; + + @Override + public Distributor get() { + return new PointSetDistributor(points); + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/YesDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/YesDistributorTemplate.java new file mode 100644 index 000000000..aacddc06f --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/YesDistributorTemplate.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.addons.feature.distributor.config; + +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import com.dfsek.terra.api.structure.feature.Distributor; + + +public class YesDistributorTemplate implements ObjectTemplate { + @Override + public Distributor get() { + return Distributor.yes(); + } +} 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..8303c2288 --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java @@ -0,0 +1,21 @@ +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; + + private final double threshold; + + public NoiseDistributor(NoiseSampler sampler, double threshold) { + this.sampler = sampler; + this.threshold = threshold; + } + + @Override + public boolean matches(int x, int z, long seed) { + return sampler.getNoiseSeeded(seed, x, z) > threshold; + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java new file mode 100644 index 000000000..5508ebe8f --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PointSetDistributor.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.feature.distributor.distributors; + +import java.util.Set; + +import com.dfsek.terra.addons.feature.distributor.util.Point; +import com.dfsek.terra.api.structure.feature.Distributor; + + +public class PointSetDistributor implements Distributor { + private final Set points; + + public PointSetDistributor(Set points) { + this.points = points; + } + + @Override + public boolean matches(int x, int z, long seed) { + return points.contains(new Point(x, z)); + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java new file mode 100644 index 000000000..973f1c8d1 --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/Point.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.addons.feature.distributor.util; + +public class Point { + private final int x; + private final int z; + + private final int hash; + + public Point(int x, int z) { + this.x = x; + this.z = z; + this.hash = 31 * x + z; + } + + public int getX() { + return x; + } + + public int getZ() { + return z; + } + + @Override + public int hashCode() { + return hash; + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Point)) return false; + Point that = (Point) obj; + return this.x == that.x && this.z == that.z; + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java new file mode 100644 index 000000000..864b5168f --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/util/PointTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.feature.distributor.util; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import com.dfsek.terra.api.config.meta.Meta; + + +public class PointTemplate implements ObjectTemplate { + @Value("x") + private @Meta int x; + + @Value("z") + private @Meta int z; + + @Override + public Point get() { + return new Point(x, z); + } +}