From 36d417d3db0c7dd41036172abfc2b95c65dbf760 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 28 Dec 2021 17:46:40 -0700 Subject: [PATCH] implement padded grid distributor --- .../feature/distributor/DistributorAddon.java | 2 + .../config/PaddedGridDistributorTemplate.java | 25 +++++++++++++ .../distributors/PaddedGridDistributor.java | 37 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PaddedGridDistributorTemplate.java create mode 100644 common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java 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 182cc935c..f28e5b02d 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 @@ -13,6 +13,7 @@ import java.util.function.Supplier; import com.dfsek.terra.addons.feature.distributor.config.AndDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.config.NoDistributorTemplate; +import com.dfsek.terra.addons.feature.distributor.config.PaddedGridDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.config.SamplerDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.config.OrDistributorTemplate; import com.dfsek.terra.addons.feature.distributor.config.PointSetDistributorTemplate; @@ -49,6 +50,7 @@ public class DistributorAddon implements AddonInitializer { DISTRIBUTOR_TOKEN); distributorRegistry.register(addon.key("SAMPLER"), SamplerDistributorTemplate::new); distributorRegistry.register(addon.key("POINTS"), PointSetDistributorTemplate::new); + distributorRegistry.register(addon.key("PADDED_GRID"), PaddedGridDistributorTemplate::new); distributorRegistry.register(addon.key("AND"), AndDistributorTemplate::new); distributorRegistry.register(addon.key("OR"), OrDistributorTemplate::new); distributorRegistry.register(addon.key("YES"), YesDistributorTemplate::new); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PaddedGridDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PaddedGridDistributorTemplate.java new file mode 100644 index 000000000..ff77d18be --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/PaddedGridDistributorTemplate.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.addons.feature.distributor.config; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.feature.distributor.distributors.PaddedGridDistributor; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.structure.feature.Distributor; + + +public class PaddedGridDistributorTemplate implements ObjectTemplate { + @Value("width") + private @Meta int width; + + @Value("padding") + private @Meta int padding; + + @Value("salt") + private @Meta int salt; + + @Override + public Distributor get() { + return new PaddedGridDistributor(width, padding, salt); + } +} diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java new file mode 100644 index 000000000..1be75d3e5 --- /dev/null +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/PaddedGridDistributor.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.feature.distributor.distributors; + +import com.dfsek.terra.api.structure.feature.Distributor; + +import com.dfsek.terra.api.util.MathUtil; + +import net.jafama.FastMath; + +import java.util.Random; + + +public class PaddedGridDistributor implements Distributor { + private final int width; + + private final int cellWidth; + + private final int salt; + + public PaddedGridDistributor(int width, int padding, int salt) { + this.width = width; + this.salt = salt; + this.cellWidth = width + padding; + } + + @Override + public boolean matches(int x, int z, long seed) { + int cellX = FastMath.floorDiv(x, cellWidth); + int cellZ = FastMath.floorDiv(z, cellWidth); + + Random random = new Random(MathUtil.squash(cellX, cellZ) + salt); + + int pointX = random.nextInt(width) + cellX * cellWidth; + int pointZ = random.nextInt(width) + cellZ * cellWidth; + + return x == pointX && z == pointZ; + } +}