From 3a7edcb1e4e2e77cd435eb8087224c9552c584dc Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 20 Jul 2021 15:18:03 -0700 Subject: [PATCH] feature configuration --- .../addons/feature/ConfiguredFeature.java | 39 +++++++++++++++ .../terra/addons/feature/FeatureAddon.java | 5 ++ .../addons/feature/FeatureConfigType.java | 37 ++++++++++++++ .../terra/addons/feature/FeatureFactory.java | 13 +++++ .../terra/addons/feature/FeatureTemplate.java | 50 +++++++++++++++++++ 5 files changed, 144 insertions(+) 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/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/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..c3c5cae2d --- /dev/null +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/ConfiguredFeature.java @@ -0,0 +1,39 @@ +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 index 765420f61..144f2088c 100644 --- 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 @@ -6,6 +6,7 @@ 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; @Addon("config-feature") @@ -19,4 +20,8 @@ public class FeatureAddon extends TerraAddon implements EventListener { public void initialize() { main.getEventManager().registerListener(this, this); } + + public void onPackLoad(ConfigPackPreLoadEvent event) { + event.getPack().registerConfigType(new FeatureConfigType(), "FEATURE", 2); + } } 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..3d2c3e709 --- /dev/null +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureConfigType.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.feature; + +import com.dfsek.terra.api.TerraPlugin; +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; + +import java.util.function.Supplier; + +public class FeatureConfigType implements ConfigType { + public static final TypeKey FEATURE_TYPE_KEY = new TypeKey<>() {}; + + private final FeatureFactory factory = new FeatureFactory(); + + @Override + public FeatureTemplate getTemplate(ConfigPack pack, TerraPlugin main) { + return new FeatureTemplate(); + } + + @Override + public ConfigFactory getFactory() { + return factory; + } + + @Override + public TypeKey getTypeClass() { + return FEATURE_TYPE_KEY; + } + + @Override + public Supplier> registrySupplier(ConfigPack pack) { + return pack.getRegistryFactory()::create; + } +} 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..83f07ecc5 --- /dev/null +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureFactory.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.addons.feature; + +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.terra.api.TerraPlugin; +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, TerraPlugin main) 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..4adfa8736 --- /dev/null +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureTemplate.java @@ -0,0 +1,50 @@ +package com.dfsek.terra.addons.feature; + +import com.dfsek.tectonic.annotations.Final; +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.terra.api.config.AbstractableTemplate; +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 Distributor distributor; + + @Value("locator") + private Locator locator; + + @Value("structures.distribution") + private NoiseSampler structureNoise; + + @Value("structures.structures") + private 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; + } +}