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 index e5c6a5df8..5ce901736 100644 --- 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 @@ -23,12 +23,15 @@ public class ConfiguredFeature implements Feature { private final Distributor distributor; private final Locator locator; + private final String id; + public ConfiguredFeature(ProbabilityCollection structures, NoiseSampler structureSelector, Distributor distributor, - Locator locator) { + Locator locator, String id) { this.structures = structures; this.structureSelector = structureSelector; this.distributor = distributor; this.locator = locator; + this.id = id; } @Override @@ -45,4 +48,9 @@ public class ConfiguredFeature implements Feature { public Locator getLocator() { return locator; } + + @Override + public String getID() { + return id; + } } 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 index db1db68be..5bab47d77 100644 --- 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 @@ -17,6 +17,7 @@ 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()); + return new ConfiguredFeature(config.getStructures(), config.getStructureNoise(), config.getDistributor(), config.getLocator(), + config.getID()); } } diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java index c607e99ef..b59f1774b 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationAddon.java @@ -7,7 +7,10 @@ package com.dfsek.terra.addons.generation.feature; +import com.dfsek.tectonic.loading.object.ObjectTemplate; + import com.dfsek.terra.addons.generation.feature.config.BiomeFeaturesTemplate; +import com.dfsek.terra.addons.generation.feature.config.FeatureStageTemplate; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -15,11 +18,14 @@ import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; 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.util.reflection.TypeKey; import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.chunk.generation.util.provider.GenerationStageProvider; + +import java.util.function.Supplier; public class FeatureGenerationAddon implements AddonInitializer { + public static final TypeKey>> STAGE_TYPE_KEY = new TypeKey<>() {}; @Inject private Platform platform; @@ -32,8 +38,8 @@ public class FeatureGenerationAddon implements AddonInitializer { .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .then(event -> event.getPack() - .getOrCreateRegistry(GenerationStageProvider.class) - .register("FEATURE", pack -> new FeatureGenerationStage(platform))) + .getOrCreateRegistry(STAGE_TYPE_KEY) + .register("FEATURE", () -> new FeatureStageTemplate(platform))) .failThrough(); platform.getEventManager() diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java index b9123af8c..955452c3f 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java @@ -12,6 +12,7 @@ import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.profiler.ProfileFrame; import com.dfsek.terra.api.util.Rotation; import com.dfsek.terra.api.util.PopulationUtil; +import com.dfsek.terra.api.util.StringIdentifiable; import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.world.chunk.generation.ProtoWorld; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; @@ -19,17 +20,20 @@ import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; import java.util.Random; -public class FeatureGenerationStage implements GenerationStage { +public class FeatureGenerationStage implements GenerationStage, StringIdentifiable { private final Platform platform; - public FeatureGenerationStage(Platform platform) { + private final String id; + + public FeatureGenerationStage(Platform platform, String id) { this.platform = platform; + this.id = id; } @Override @SuppressWarnings("try") public void populate(ProtoWorld world) { - try(ProfileFrame ignore = platform.getProfiler().profile("feature")) { + try(ProfileFrame ignore = platform.getProfiler().profile("feature_stage:" + id)) { int cx = world.centerChunkX() << 4; int cz = world.centerChunkZ() << 4; long seed = world.getSeed(); @@ -39,18 +43,27 @@ public class FeatureGenerationStage implements GenerationStage { int tz = cz + z; ColumnImpl column = new ColumnImpl<>(tx, tz, world); world.getBiomeProvider().getBiome(tx, tz, seed).getContext().get(BiomeFeatures.class).getFeatures().forEach(feature -> { - if(feature.getDistributor().matches(tx, tz, seed)) { - feature.getLocator() - .getSuitableCoordinates(column) - .forEach(y -> - feature.getStructure(world, tx, y, tz) - .generate(new Vector3(tx, y, tz), world, new Random(PopulationUtil.getCarverChunkSeed(world.centerChunkX(), world.centerChunkZ(), seed)), - Rotation.NONE) - ); + try(ProfileFrame ignored = platform.getProfiler().profile(feature.getID())) { + if(feature.getDistributor().matches(tx, tz, seed)) { + feature.getLocator() + .getSuitableCoordinates(column) + .forEach(y -> + feature.getStructure(world, tx, y, tz) + .generate(new Vector3(tx, y, tz), world, new Random( + PopulationUtil.getCarverChunkSeed(world.centerChunkX(), + world.centerChunkZ(), seed)), + Rotation.NONE) + ); + } } }); } } } } + + @Override + public String getID() { + return id; + } } diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java new file mode 100644 index 000000000..d280dd8ad --- /dev/null +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/config/FeatureStageTemplate.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.addons.generation.feature.config; + +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; + +import com.dfsek.terra.addons.generation.feature.FeatureGenerationStage; +import com.dfsek.terra.api.Platform; + + +public class FeatureStageTemplate implements ObjectTemplate { + @Value("id") + private String id; + + private final Platform platform; + + public FeatureStageTemplate(Platform platform) { this.platform = platform; } + + + @Override + public FeatureGenerationStage get() { + return new FeatureGenerationStage(platform, id); + } +} diff --git a/common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java b/common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java index 46f596c65..bea82e399 100644 --- a/common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java +++ b/common/api/core/src/main/java/com/dfsek/terra/api/structure/feature/Feature.java @@ -8,10 +8,11 @@ package com.dfsek.terra.api.structure.feature; import com.dfsek.terra.api.structure.Structure; +import com.dfsek.terra.api.util.StringIdentifiable; import com.dfsek.terra.api.world.WritableWorld; -public interface Feature { +public interface Feature extends StringIdentifiable { Structure getStructure(WritableWorld world, int x, int y, int z); Distributor getDistributor(); diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index 48557f726..151826c43 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -118,12 +118,6 @@ public class ConfigPackImpl implements ConfigPack { private final Map, CheckedRegistry>> registryMap = new HashMap<>(); private final ConfigTypeRegistry configTypeRegistry; - - private final Lazy> stages = Lazy.lazy(() -> template - .getStages() - .stream() - .map(stage -> stage.newInstance(this)) - .collect(Collectors.toList())); private final TreeMap>>> configTypes = new TreeMap<>(); public ConfigPackImpl(File folder, Platform platform) throws ConfigException { @@ -352,7 +346,7 @@ public class ConfigPackImpl implements ConfigPack { @Override public List getStages() { - return stages.value(); + return template.getStages(); } @Override diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java index 257fd08f0..75eca338a 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java @@ -26,6 +26,7 @@ import java.util.List; import java.util.Map; import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider; import com.dfsek.terra.api.world.chunk.generation.util.provider.GenerationStageProvider; @@ -76,7 +77,7 @@ public class ConfigPackTemplate implements ConfigTemplate { private @Meta boolean disableSaplings = false; @Value("stages") - private @Meta List<@Meta GenerationStageProvider> stages; + private @Meta List<@Meta GenerationStage> stages; @Value("version") @Default @@ -149,7 +150,7 @@ public class ConfigPackTemplate implements ConfigTemplate { return generatorProvider; } - public List getStages() { + public List getStages() { return stages; }