From 7a554a1fdb0d7b716633c74eb20acf2f43ddd799 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 20 Jul 2021 15:00:46 -0700 Subject: [PATCH 1/8] create feature config addon module --- common/addons/config-feature/build.gradle.kts | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 common/addons/config-feature/build.gradle.kts diff --git a/common/addons/config-feature/build.gradle.kts b/common/addons/config-feature/build.gradle.kts new file mode 100644 index 000000000..07542d899 --- /dev/null +++ b/common/addons/config-feature/build.gradle.kts @@ -0,0 +1,45 @@ +import com.dfsek.terra.configureCompilation +import com.dfsek.terra.configureDependencies + +plugins { + `java-library` + `maven-publish` + idea +} + +configureCompilation() +configureDependencies() + +group = "com.dfsek.terra.common" + +dependencies { + "shadedApi"(project(":common:api")) + "compileOnly"("com.google.guava:guava:30.0-jre") + + "testImplementation"("com.google.guava:guava:30.0-jre") +} + +publishing { + publications { + create("mavenJava") { + artifact(tasks["sourcesJar"]) + artifact(tasks["jar"]) + } + } + + repositories { + val mavenUrl = "https://repo.codemc.io/repository/maven-releases/" + val mavenSnapshotUrl = "https://repo.codemc.io/repository/maven-snapshots/" + + maven(mavenUrl) { + val mavenUsername: String? by project + val mavenPassword: String? by project + if (mavenUsername != null && mavenPassword != null) { + credentials { + username = mavenUsername + password = mavenPassword + } + } + } + } +} \ No newline at end of file From c1dfcafa1d0feedcd25b869045e043f445296458 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 20 Jul 2021 15:06:23 -0700 Subject: [PATCH 2/8] create base FeatureAddon --- .../terra/addons/feature/FeatureAddon.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java 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..765420f61 --- /dev/null +++ b/common/addons/config-feature/src/main/java/com/dfsek/terra/addons/feature/FeatureAddon.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.feature; + +import com.dfsek.terra.api.TerraPlugin; +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.EventListener; +import com.dfsek.terra.api.injection.annotations.Inject; + +@Addon("config-feature") +@Version("1.0.0") +@Author("Terra") +public class FeatureAddon extends TerraAddon implements EventListener { + @Inject + private TerraPlugin main; + + @Override + public void initialize() { + main.getEventManager().registerListener(this, this); + } +} From d807abb1656e3d328f88b7bbf2ab5055f1744ee6 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 20 Jul 2021 15:09:51 -0700 Subject: [PATCH 3/8] pass pack to ConfigType#registrySupplier --- .../java/com/dfsek/terra/addons/biome/BiomeConfigType.java | 4 ++-- .../java/com/dfsek/terra/addons/flora/FloraConfigType.java | 4 ++-- .../main/java/com/dfsek/terra/addons/ore/OreConfigType.java | 4 ++-- .../com/dfsek/terra/addons/palette/PaletteConfigType.java | 4 ++-- .../main/java/com/dfsek/terra/addons/tree/TreeConfigType.java | 4 ++-- .../src/main/java/com/dfsek/terra/api/config/ConfigType.java | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java index 7616a3e65..9e1e95ee4 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java @@ -39,8 +39,8 @@ public class BiomeConfigType implements ConfigType { } @Override - public Supplier> registrySupplier() { - return () -> pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { + public Supplier> registrySupplier(ConfigPack pack) { + return () -> this.pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { if(c.equals("SELF")) return null; TerraBiome obj = registry.get((String) c); if(obj == null) diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java index f0e4044c9..d8d34164b 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java @@ -36,7 +36,7 @@ public class FloraConfigType implements ConfigType { } @Override - public Supplier> registrySupplier() { - return pack.getRegistryFactory()::create; + public Supplier> registrySupplier(ConfigPack pack) { + return this.pack.getRegistryFactory()::create; } } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java index 1a6fd9695..cd17b4212 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java @@ -35,7 +35,7 @@ public class OreConfigType implements ConfigType { } @Override - public Supplier> registrySupplier() { - return pack.getRegistryFactory()::create; + public Supplier> registrySupplier(ConfigPack pack) { + return this.pack.getRegistryFactory()::create; } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java index 49c77e386..0455910de 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java @@ -41,8 +41,8 @@ public class PaletteConfigType implements ConfigType { } @Override - public Supplier> registrySupplier() { - return () -> pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { + public Supplier> registrySupplier(ConfigPack pack) { + return () -> this.pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { if(((String) c).startsWith("BLOCK:")) return new PaletteImpl.Singleton(main.getWorldHandle().createBlockData(((String) c).substring(6))); // Return single palette for BLOCK: shortcut. Palette obj = registry.get((String) c); diff --git a/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java b/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java index b6da598d1..85a79f88f 100644 --- a/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java +++ b/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java @@ -35,7 +35,7 @@ public class TreeConfigType implements ConfigType { } @Override - public Supplier> registrySupplier() { - return pack.getRegistryFactory()::create; + public Supplier> registrySupplier(ConfigPack pack) { + return this.pack.getRegistryFactory()::create; } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java index 482bfc8d4..15ad2541d 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java +++ b/common/api/src/main/java/com/dfsek/terra/api/config/ConfigType.java @@ -13,5 +13,5 @@ public interface ConfigType { TypeKey getTypeClass(); - Supplier> registrySupplier(); + Supplier> registrySupplier(ConfigPack pack); } From 0ff6a9cce1ea9d1d693a89578b0be8b6fc86f7e0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 20 Jul 2021 15:12:06 -0700 Subject: [PATCH 4/8] dont use pack instance where unneeded --- .../java/com/dfsek/terra/addons/biome/BiomeConfigType.java | 4 +--- .../main/java/com/dfsek/terra/addons/flora/FloraAddon.java | 2 +- .../java/com/dfsek/terra/addons/flora/FloraConfigType.java | 7 +------ .../src/main/java/com/dfsek/terra/addons/ore/OreAddon.java | 2 +- .../java/com/dfsek/terra/addons/ore/OreConfigType.java | 7 +------ .../java/com/dfsek/terra/addons/palette/PaletteAddon.java | 2 +- .../com/dfsek/terra/addons/palette/PaletteConfigType.java | 6 ++---- .../main/java/com/dfsek/terra/addons/tree/TreeAddon.java | 2 +- .../java/com/dfsek/terra/addons/tree/TreeConfigType.java | 6 +----- .../java/com/dfsek/terra/config/pack/ConfigPackImpl.java | 2 +- 10 files changed, 11 insertions(+), 29 deletions(-) diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java index 9e1e95ee4..9f9786b07 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/BiomeConfigType.java @@ -13,13 +13,11 @@ import com.dfsek.terra.api.world.biome.TerraBiome; import java.util.function.Supplier; public class BiomeConfigType implements ConfigType { - private final ConfigPack pack; private final BiomeFactory factory; public static final TypeKey BIOME_TYPE_TOKEN = new TypeKey<>() {}; public BiomeConfigType(ConfigPack pack) { - this.pack = pack; this.factory = new BiomeFactory(pack); } @@ -40,7 +38,7 @@ public class BiomeConfigType implements ConfigType { @Override public Supplier> registrySupplier(ConfigPack pack) { - return () -> this.pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { + return () -> pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { if(c.equals("SELF")) return null; TerraBiome obj = registry.get((String) c); if(obj == null) diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java index 6dd284243..101a6aa90 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraAddon.java @@ -25,7 +25,7 @@ public class FloraAddon extends TerraAddon implements EventListener { } public void onPackLoad(ConfigPackPreLoadEvent event) throws DuplicateEntryException { - event.getPack().registerConfigType(new FloraConfigType(event.getPack()), "FLORA", 2); + event.getPack().registerConfigType(new FloraConfigType(), "FLORA", 2); event.getPack().applyLoader(BlockLayer.class, BlockLayerTemplate::new); } } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java index d8d34164b..1fc80a9b4 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/FloraConfigType.java @@ -12,14 +12,9 @@ import java.util.function.Supplier; public class FloraConfigType implements ConfigType { private final FloraFactory factory = new FloraFactory(); - private final ConfigPack pack; public static final TypeKey FLORA_TYPE_TOKEN = new TypeKey<>(){}; - public FloraConfigType(ConfigPack pack) { - this.pack = pack; - } - @Override public FloraTemplate getTemplate(ConfigPack pack, TerraPlugin main) { return new FloraTemplate(); @@ -37,6 +32,6 @@ public class FloraConfigType implements ConfigType { @Override public Supplier> registrySupplier(ConfigPack pack) { - return this.pack.getRegistryFactory()::create; + return pack.getRegistryFactory()::create; } } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java index 3ad6c7474..16ec7e418 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreAddon.java @@ -25,7 +25,7 @@ public class OreAddon extends TerraAddon implements EventListener { } public void onPackLoad(ConfigPackPreLoadEvent event) throws DuplicateEntryException { - event.getPack().registerConfigType(new OreConfigType(event.getPack()), "ORE", 1); + event.getPack().registerConfigType(new OreConfigType(), "ORE", 1); event.getPack().getOrCreateRegistry(GenerationStageProvider.class).register("ORE", pack -> new OrePopulator(main)); } } diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java index cd17b4212..e284b41d3 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OreConfigType.java @@ -12,13 +12,8 @@ import java.util.function.Supplier; public class OreConfigType implements ConfigType { private final OreFactory factory = new OreFactory(); - private final ConfigPack pack; public static final TypeKey ORE_TYPE_TOKEN = new TypeKey<>(){}; - public OreConfigType(ConfigPack pack) { - this.pack = pack; - } - @Override public OreTemplate getTemplate(ConfigPack pack, TerraPlugin main) { return new OreTemplate(); @@ -36,6 +31,6 @@ public class OreConfigType implements ConfigType { @Override public Supplier> registrySupplier(ConfigPack pack) { - return this.pack.getRegistryFactory()::create; + return pack.getRegistryFactory()::create; } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java index 5e3e2bb5c..45817a62b 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteAddon.java @@ -24,7 +24,7 @@ public class PaletteAddon extends TerraAddon implements EventListener { } public void onPackLoad(ConfigPackPreLoadEvent event) { - event.getPack().registerConfigType(new PaletteConfigType(event.getPack(), main), "PALETTE", 2); + event.getPack().registerConfigType(new PaletteConfigType(main), "PALETTE", 2); event.getPack().applyLoader(PaletteLayerHolder.class, new PaletteLayerLoader()); } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java index 0455910de..2a3c821be 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteConfigType.java @@ -15,13 +15,11 @@ import java.util.function.Supplier; public class PaletteConfigType implements ConfigType { private final PaletteFactory factory = new PaletteFactory(); - private final ConfigPack pack; private final TerraPlugin main; public static final TypeKey PALETTE_TYPE_TOKEN = new TypeKey<>(){}; - public PaletteConfigType(ConfigPack pack, TerraPlugin main) { - this.pack = pack; + public PaletteConfigType(TerraPlugin main) { this.main = main; } @@ -42,7 +40,7 @@ public class PaletteConfigType implements ConfigType { @Override public Supplier> registrySupplier(ConfigPack pack) { - return () -> this.pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { + return () -> pack.getRegistryFactory().create(registry -> (TypeLoader) (t, c, loader) -> { if(((String) c).startsWith("BLOCK:")) return new PaletteImpl.Singleton(main.getWorldHandle().createBlockData(((String) c).substring(6))); // Return single palette for BLOCK: shortcut. Palette obj = registry.get((String) c); diff --git a/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeAddon.java b/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeAddon.java index 2f9020275..053f07cfc 100644 --- a/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeAddon.java +++ b/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeAddon.java @@ -23,6 +23,6 @@ public class TreeAddon extends TerraAddon implements EventListener { } public void onPackLoad(ConfigPackPreLoadEvent event) throws DuplicateEntryException { - event.getPack().registerConfigType(new TreeConfigType(event.getPack()), "TREE", 2); + event.getPack().registerConfigType(new TreeConfigType(), "TREE", 2); } } diff --git a/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java b/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java index 85a79f88f..179463470 100644 --- a/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java +++ b/common/addons/config-tree/src/main/java/com/dfsek/terra/addons/tree/TreeConfigType.java @@ -12,12 +12,8 @@ import java.util.function.Supplier; public class TreeConfigType implements ConfigType { private final TreeFactory factory = new TreeFactory(); - private final ConfigPack pack; public static final TypeKey TREE_TYPE_TOKEN = new TypeKey<>(){}; - public TreeConfigType(ConfigPack pack) { - this.pack = pack; - } @Override public TreeTemplate getTemplate(ConfigPack pack, TerraPlugin main) { @@ -36,6 +32,6 @@ public class TreeConfigType implements ConfigType { @Override public Supplier> registrySupplier(ConfigPack pack) { - return this.pack.getRegistryFactory()::create; + return pack.getRegistryFactory()::create; } } diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index 15d66e5ca..37883b349 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -191,7 +191,7 @@ public class ConfigPackImpl implements ConfigPack { @SuppressWarnings("unchecked") private ConfigTypeRegistry createRegistry() { return new ConfigTypeRegistry(main, (id, configType) -> { - OpenRegistry openRegistry = configType.registrySupplier().get(); + OpenRegistry openRegistry = configType.registrySupplier(this).get(); if(registryMap.containsKey(configType.getTypeClass().getType())) { // Someone already registered something; we need to copy things to the new registry. registryMap.get(configType.getTypeClass().getType()).getLeft().forEach(((OpenRegistry) openRegistry)::register); } From 3a7edcb1e4e2e77cd435eb8087224c9552c584dc Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 20 Jul 2021 15:18:03 -0700 Subject: [PATCH 5/8] 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; + } +} From c8bb9bbfeb9727f3f217c60d48809a3acff07df3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 20 Jul 2021 16:05:54 -0700 Subject: [PATCH 6/8] automatically register loader for Supplier> --- .../GenericTemplateSupplierLoader.java | 38 +++++++++++++++++++ .../terra/config/pack/ConfigPackImpl.java | 29 +++++++++++++- 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 common/implementation/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java new file mode 100644 index 000000000..f21a560ba --- /dev/null +++ b/common/implementation/src/main/java/com/dfsek/terra/config/loaders/GenericTemplateSupplierLoader.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.config.loaders; + +import com.dfsek.tectonic.config.MapConfiguration; +import com.dfsek.tectonic.exception.ConfigException; +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.registry.Registry; + +import java.lang.reflect.AnnotatedType; +import java.util.Map; +import java.util.function.Supplier; + +public class GenericTemplateSupplierLoader implements TypeLoader { + private final Registry>> registry; + + public GenericTemplateSupplierLoader(Registry>> registry) { + this.registry = registry; + } + + @SuppressWarnings("unchecked") + @Override + public T load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { + Map map = (Map) c; + try { + if(!registry.contains((String) map.get("type"))) { + throw new LoadException("No such entry: " + map.get("type")); + } + ObjectTemplate template = registry.get(((String) map.get("type"))).get(); + loader.load(template, new MapConfiguration(map)); + return template.get(); + } catch(ConfigException e) { + throw new LoadException("Unable to load object: ", e); + } + } +} diff --git a/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java b/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java index 37883b349..ec945ff43 100644 --- a/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java +++ b/common/implementation/src/main/java/com/dfsek/terra/config/pack/ConfigPackImpl.java @@ -18,18 +18,19 @@ 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.config.Loader; +import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent; import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; -import com.dfsek.terra.api.event.events.config.ConfigurationDiscoveryEvent; import com.dfsek.terra.api.event.events.config.type.ConfigTypePostLoadEvent; import com.dfsek.terra.api.event.events.config.type.ConfigTypePreLoadEvent; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.registry.OpenRegistry; +import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.exception.DuplicateEntryException; import com.dfsek.terra.api.registry.meta.RegistryFactory; -import com.dfsek.terra.api.util.reflection.ReflectionUtil; import com.dfsek.terra.api.util.generic.pair.ImmutablePair; +import com.dfsek.terra.api.util.reflection.ReflectionUtil; import com.dfsek.terra.api.world.TerraWorld; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider; @@ -37,6 +38,7 @@ import com.dfsek.terra.api.world.generator.GenerationStageProvider; import com.dfsek.terra.config.dummy.DummyWorld; import com.dfsek.terra.config.fileloaders.FolderLoader; import com.dfsek.terra.config.fileloaders.ZIPLoader; +import com.dfsek.terra.config.loaders.GenericTemplateSupplierLoader; import com.dfsek.terra.config.loaders.config.BufferedImageLoader; import com.dfsek.terra.config.prototype.ProtoConfig; import com.dfsek.terra.registry.CheckedRegistryImpl; @@ -50,6 +52,7 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collections; @@ -304,6 +307,28 @@ public class ConfigPackImpl implements ConfigPack { selfLoader.registerLoader(c, registry); abstractConfigLoader.registerLoader(c, registry); main.getDebugLogger().info("Registered loader for registry of class " + ReflectionUtil.typeToString(c)); + + if(type instanceof ParameterizedType) { + ParameterizedType param = (ParameterizedType) type; + Type base = param.getRawType(); + if(base instanceof Class // should always be true but we'll check anyways + && Supplier.class.isAssignableFrom((Class) base)) { // If it's a supplier + Type supplied = param.getActualTypeArguments()[0]; // Grab the supplied type + if(supplied instanceof ParameterizedType) { + ParameterizedType suppliedParam = (ParameterizedType) supplied; + Type suppliedBase = suppliedParam.getRawType(); + if(suppliedBase instanceof Class // should always be true but we'll check anyways + && ObjectTemplate.class.isAssignableFrom((Class) suppliedBase)) { + Type templateType = suppliedParam.getActualTypeArguments()[0]; + GenericTemplateSupplierLoader loader = new GenericTemplateSupplierLoader<>((Registry>>>>) registry); + selfLoader.registerLoader(templateType, loader); + abstractConfigLoader.registerLoader(templateType, loader); + main.getDebugLogger().info("Registered template loader for registry of class " + ReflectionUtil.typeToString(templateType)); + } + } + } + } + return ImmutablePair.of(registry, new CheckedRegistryImpl<>(registry)); }).getRight(); } From 7b1853823c1ce9d94653bf9dac370bc9a345a69d Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 20 Jul 2021 16:08:58 -0700 Subject: [PATCH 7/8] remove unneeded NoiseSamplerBuilderLoader --- .../dfsek/terra/addons/noise/NoiseAddon.java | 7 ---- .../config/NoiseSamplerBuilderLoader.java | 38 ------------------- 2 files changed, 45 deletions(-) delete mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/NoiseSamplerBuilderLoader.java diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java index 68420f7c0..0af3b2782 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java @@ -2,7 +2,6 @@ package com.dfsek.terra.addons.noise; import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; -import com.dfsek.terra.addons.noise.config.NoiseSamplerBuilderLoader; import com.dfsek.terra.addons.noise.config.templates.DomainWarpTemplate; import com.dfsek.terra.addons.noise.config.templates.ImageSamplerTemplate; import com.dfsek.terra.addons.noise.config.templates.KernelTemplate; @@ -59,14 +58,8 @@ public class NoiseAddon extends TerraAddon implements EventListener { public void packPreLoad(ConfigPackPreLoadEvent event) { CheckedRegistry>> noiseRegistry = event.getPack().getOrCreateRegistry(NOISE_SAMPLER_TOKEN); event.getPack() - .applyLoader(NoiseSampler.class, new NoiseSamplerBuilderLoader(noiseRegistry)) - .applyLoader(ImageSamplerTemplate.class, ImageSamplerTemplate::new) .applyLoader(CellularSampler.DistanceFunction.class, (t, o, l) -> CellularSampler.DistanceFunction.valueOf((String) o)) .applyLoader(CellularSampler.ReturnType.class, (t, o, l) -> CellularSampler.ReturnType.valueOf((String) o)) - .applyLoader(DomainWarpTemplate.class, DomainWarpTemplate::new) - .applyLoader(LinearNormalizerTemplate.class, LinearNormalizerTemplate::new) - .applyLoader(NormalNormalizerTemplate.class, NormalNormalizerTemplate::new) - .applyLoader(ClampNormalizerTemplate.class, ClampNormalizerTemplate::new) .applyLoader(DimensionApplicableNoiseSampler.class, DimensionApplicableNoiseSampler::new); noiseRegistry.register("LINEAR", LinearNormalizerTemplate::new); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/NoiseSamplerBuilderLoader.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/NoiseSamplerBuilderLoader.java deleted file mode 100644 index 8d057043e..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/NoiseSamplerBuilderLoader.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dfsek.terra.addons.noise.config; - -import com.dfsek.tectonic.config.MapConfiguration; -import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.registry.Registry; - -import java.lang.reflect.AnnotatedType; -import java.util.Map; -import java.util.function.Supplier; - -@SuppressWarnings("unchecked") -public class NoiseSamplerBuilderLoader implements TypeLoader { - private final Registry>> noiseRegistry; - - public NoiseSamplerBuilderLoader(Registry>> noiseRegistry) { - this.noiseRegistry = noiseRegistry; - } - - @Override - public NoiseSampler load(AnnotatedType t, Object c, ConfigLoader loader) throws LoadException { - Map map = (Map) c; - try { - if(!noiseRegistry.contains((String) map.get("type"))) { - throw new LoadException("No such noise function: " + map.get("type")); - } - ObjectTemplate normalizerTemplate = noiseRegistry.get(((String) map.get("type"))).get(); - loader.load(normalizerTemplate, new MapConfiguration(map)); - return normalizerTemplate.get(); - } catch(ConfigException e) { - throw new LoadException("Unable to load noise function: ", e); - } - } -} From d6e2acce38ac51d0c5d7f22795943c0be2fb0560 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 20 Jul 2021 17:34:33 -0700 Subject: [PATCH 8/8] make salt long --- .../config/NoiseDistributorTemplate.java | 7 ++++++- .../distributor/distributors/NoiseDistributor.java | 6 ++++-- .../templates/noise/CellularNoiseTemplate.java | 1 + .../config/templates/noise/GaborNoiseTemplate.java | 1 + .../config/templates/noise/NoiseTemplate.java | 3 ++- .../templates/noise/SimpleNoiseTemplate.java | 1 + .../addons/noise/samplers/noise/NoiseFunction.java | 14 ++++++++++++-- 7 files changed, 27 insertions(+), 6 deletions(-) diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java index e87ce15c2..b0e47dc42 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/config/NoiseDistributorTemplate.java @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.feature.distributor.config; +import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.loading.object.ObjectTemplate; import com.dfsek.terra.addons.feature.distributor.distributors.NoiseDistributor; @@ -10,8 +11,12 @@ public class NoiseDistributorTemplate implements ObjectTemplate { @Value("distribution") private NoiseSampler noise; + @Value("threshold") + @Default + private double threshold = 0; + @Override public Distributor get() { - return new NoiseDistributor(noise); + return new NoiseDistributor(noise, threshold); } } diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java index b97657e4d..876beb2aa 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java @@ -6,12 +6,14 @@ import com.dfsek.terra.api.structure.feature.Distributor; public class NoiseDistributor implements Distributor { private final NoiseSampler sampler; - public NoiseDistributor(NoiseSampler sampler) { + private final double threshold; + public NoiseDistributor(NoiseSampler sampler, double threshold) { this.sampler = sampler; + this.threshold = threshold; } @Override public boolean matches(int x, int z, long seed) { - return sampler.getNoiseSeeded(seed, x, z) > 0; + return sampler.getNoiseSeeded(seed, x, z) > threshold; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java index eb00a599b..a84d95cd0 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java @@ -33,6 +33,7 @@ public class CellularNoiseTemplate extends NoiseTemplate { sampler.setJitterModifier(cellularJitter); sampler.setReturnType(cellularReturnType); sampler.setDistanceFunction(cellularDistanceFunction); + sampler.setSalt(salt); return sampler; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java index 8cbb381b2..46aacdbf5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java @@ -35,6 +35,7 @@ public class GaborNoiseTemplate extends NoiseTemplate { gaborNoiseSampler.setDeviation(deviation); gaborNoiseSampler.setImpulsesPerKernel(impulses); gaborNoiseSampler.setFrequency0(f0); + gaborNoiseSampler.setSalt(salt); return gaborNoiseSampler; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java index 4b9e6fad5..691249d7c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/NoiseTemplate.java @@ -4,6 +4,7 @@ import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.addons.noise.config.templates.SamplerTemplate; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; +import com.dfsek.terra.api.noise.NoiseSampler; @SuppressWarnings({"unused", "FieldMayBeFinal"}) public abstract class NoiseTemplate extends SamplerTemplate { @@ -13,5 +14,5 @@ public abstract class NoiseTemplate extends SamplerTemp @Value("salt") @Default - protected int salt = 0; + protected long salt = 0; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java index 2e0c338d7..915b06dcc 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/SimpleNoiseTemplate.java @@ -17,6 +17,7 @@ public class SimpleNoiseTemplate extends NoiseTemplate { public NoiseSampler get() { NoiseFunction sampler = samplerSupplier.get(); sampler.setFrequency(frequency); + sampler.setSalt(salt); return sampler; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java index dec509e4a..c5b20abe6 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java @@ -21,6 +21,16 @@ public abstract class NoiseFunction implements NoiseSampler { protected double frequency = 0.02d; + protected long salt; + + public void setSalt(long salt) { + this.salt = salt; + } + + public NoiseFunction() { + this.salt = 0; + } + protected static int fastFloor(double f) { return f >= 0 ? (int) f : (int) f - 1; } @@ -119,12 +129,12 @@ public abstract class NoiseFunction implements NoiseSampler { @Override public double getNoiseSeeded(long seed, double x, double y) { - return getNoiseRaw(seed, x * frequency, y * frequency); + return getNoiseRaw(seed + salt, x * frequency, y * frequency); } @Override public double getNoiseSeeded(long seed, double x, double y, double z) { - return getNoiseRaw(seed, x * frequency, y * frequency, z * frequency); + return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency); } public abstract double getNoiseRaw(long seed, double x, double y);