feature configuration

This commit is contained in:
dfsek 2021-07-20 15:18:03 -07:00
parent 0ff6a9cce1
commit 3a7edcb1e4
5 changed files with 144 additions and 0 deletions

View File

@ -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<Structure> structures;
private final NoiseSampler structureSelector;
private final Distributor distributor;
private final Locator locator;
public ConfiguredFeature(ProbabilityCollection<Structure> 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;
}
}

View File

@ -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);
}
}

View File

@ -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<FeatureTemplate, Feature> {
public static final TypeKey<Feature> 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<FeatureTemplate, Feature> getFactory() {
return factory;
}
@Override
public TypeKey<Feature> getTypeClass() {
return FEATURE_TYPE_KEY;
}
@Override
public Supplier<OpenRegistry<Feature>> registrySupplier(ConfigPack pack) {
return pack.getRegistryFactory()::create;
}
}

View File

@ -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<FeatureTemplate, Feature> {
@Override
public Feature build(FeatureTemplate config, TerraPlugin main) throws LoadException {
return new ConfiguredFeature(config.getStructures(), config.getStructureNoise(), config.getDistributor(), config.getLocator());
}
}

View File

@ -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<Structure> structures;
@Override
public String getID() {
return id;
}
public Distributor getDistributor() {
return distributor;
}
public Locator getLocator() {
return locator;
}
public NoiseSampler getStructureNoise() {
return structureNoise;
}
public ProbabilityCollection<Structure> getStructures() {
return structures;
}
}