From 72e9e0cf9af8cdcaa50955845956069f10ad2407 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 17 Oct 2021 14:44:13 -0700 Subject: [PATCH] Initial commit --- common/addons/config-feature/build.gradle.kts | 2 + .../addons/feature/ConfiguredFeature.java | 41 +++++++++++++++ .../terra/addons/feature/FeatureAddon.java | 28 ++++++++++ .../addons/feature/FeatureConfigType.java | 39 ++++++++++++++ .../terra/addons/feature/FeatureFactory.java | 15 ++++++ .../terra/addons/feature/FeatureTemplate.java | 52 +++++++++++++++++++ 6 files changed, 177 insertions(+) create mode 100644 common/addons/config-feature/build.gradle.kts create mode 100644 common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java create mode 100644 common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java create mode 100644 common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java create mode 100644 common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java create mode 100644 common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java diff --git a/common/addons/config-feature/build.gradle.kts b/common/addons/config-feature/build.gradle.kts new file mode 100644 index 000000000..7d82dc72f --- /dev/null +++ b/common/addons/config-feature/build.gradle.kts @@ -0,0 +1,2 @@ +dependencies { +} diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java new file mode 100644 index 000000000..8fe4eab9e --- /dev/null +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.addons.feature; + +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.structure.Structure; +import com.dfsek.terra.api.structure.feature.Distributor; +import com.dfsek.terra.api.structure.feature.Feature; +import com.dfsek.terra.api.structure.feature.Locator; +import com.dfsek.terra.api.util.collection.ProbabilityCollection; +import com.dfsek.terra.api.world.World; + + +public class ConfiguredFeature implements Feature { + private final ProbabilityCollection structures; + + private final NoiseSampler structureSelector; + private final Distributor distributor; + private final Locator locator; + + public ConfiguredFeature(ProbabilityCollection structures, NoiseSampler structureSelector, Distributor distributor, + Locator locator) { + this.structures = structures; + this.structureSelector = structureSelector; + this.distributor = distributor; + this.locator = locator; + } + + @Override + public Structure getStructure(World world, int x, int y, int z) { + return structures.get(structureSelector, x, y, z, world.getSeed()); + } + + @Override + public Distributor getDistributor() { + return distributor; + } + + @Override + public Locator getLocator() { + return locator; + } +} diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java new file mode 100644 index 000000000..64568b40a --- /dev/null +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.addons.feature; + +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; + + +@Addon("config-feature") +@Version("1.0.0") +@Author("Terra") +public class FeatureAddon extends TerraAddon { + @Inject + private Platform platform; + + @Override + public void initialize() { + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(this, ConfigPackPreLoadEvent.class) + .then(event -> event.getPack().registerConfigType(new FeatureConfigType(), "FEATURE", 3)) + .failThrough(); + } +} diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java new file mode 100644 index 000000000..cb761e5e2 --- /dev/null +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java @@ -0,0 +1,39 @@ +package com.dfsek.terra.addons.feature; + +import java.util.function.Supplier; + +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.config.ConfigFactory; +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.config.ConfigType; +import com.dfsek.terra.api.registry.OpenRegistry; +import com.dfsek.terra.api.structure.feature.Feature; +import com.dfsek.terra.api.util.reflection.TypeKey; + + +public class FeatureConfigType implements ConfigType { + public static final TypeKey FEATURE_TYPE_KEY = new TypeKey<>() { + }; + + private final FeatureFactory factory = new FeatureFactory(); + + @Override + public Supplier> registrySupplier(ConfigPack pack) { + return pack.getRegistryFactory()::create; + } + + @Override + public FeatureTemplate getTemplate(ConfigPack pack, Platform platform) { + return new FeatureTemplate(); + } + + @Override + public ConfigFactory getFactory() { + return factory; + } + + @Override + public TypeKey getTypeKey() { + return FEATURE_TYPE_KEY; + } +} diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java new file mode 100644 index 000000000..7ad615929 --- /dev/null +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.addons.feature; + +import com.dfsek.tectonic.exception.LoadException; + +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.config.ConfigFactory; +import com.dfsek.terra.api.structure.feature.Feature; + + +public class FeatureFactory implements ConfigFactory { + @Override + public Feature build(FeatureTemplate config, Platform platform) throws LoadException { + return new ConfiguredFeature(config.getStructures(), config.getStructureNoise(), config.getDistributor(), config.getLocator()); + } +} diff --git a/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java new file mode 100644 index 000000000..1357987a2 --- /dev/null +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.addons.feature; + +import com.dfsek.tectonic.annotations.Final; +import com.dfsek.tectonic.annotations.Value; + +import com.dfsek.terra.api.config.AbstractableTemplate; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.structure.Structure; +import com.dfsek.terra.api.structure.feature.Distributor; +import com.dfsek.terra.api.structure.feature.Locator; +import com.dfsek.terra.api.util.collection.ProbabilityCollection; + + +public class FeatureTemplate implements AbstractableTemplate { + @Value("id") + @Final + private String id; + + @Value("distributor") + private @Meta Distributor distributor; + + @Value("locator") + private @Meta Locator locator; + + @Value("structures.distribution") + private @Meta NoiseSampler structureNoise; + + @Value("structures.structures") + private @Meta ProbabilityCollection structures; + + @Override + public String getID() { + return id; + } + + public Distributor getDistributor() { + return distributor; + } + + public Locator getLocator() { + return locator; + } + + public NoiseSampler getStructureNoise() { + return structureNoise; + } + + public ProbabilityCollection getStructures() { + return structures; + } +}