diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt index 2405568cd..c06a71b2d 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt @@ -30,7 +30,7 @@ fun Project.configureCommon() { } fun Project.getGitHash(): String { - val stdout = java.io.ByteArrayOutputStream() + val stdout = ByteArrayOutputStream() exec { commandLine = mutableListOf("git", "rev-parse", "--short", "HEAD") standardOutput = stdout diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt index 855d50c95..aeb306888 100644 --- a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt @@ -14,13 +14,9 @@ fun Project.configureDistribution() { apply(plugin = "java-library") apply(plugin = "com.github.johnrengelman.shadow") - -// configurations.create("shaded") - configurations { val shaded = create("shaded") getByName("compile").extendsFrom(shaded) -// shaded.extendsFrom(getByName("compile")) val shadedApi = create("shadedApi") shaded.extendsFrom(shadedApi) getByName("api").extendsFrom(shadedApi) @@ -29,11 +25,8 @@ fun Project.configureDistribution() { getByName("implementation").extendsFrom(shadedImplementation) } -// tasks.withType { -// classpath += -// } - val downloadDefaultPacks = tasks.create("downloadDefaultPacks") { + group = "terra" doFirst { file("${buildDir}/resources/main/packs/").deleteRecursively() diff --git a/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java b/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java index d76c3a83f..482aefba9 100644 --- a/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java +++ b/common/src/main/java/com/dfsek/terra/api/command/TerraCommandManager.java @@ -160,7 +160,6 @@ public class TerraCommandManager implements CommandManager { if(field.isAnnotationPresent(SwitchTarget.class)) { SwitchTarget switchTarget = field.getAnnotation(SwitchTarget.class); if(!holder.switches.containsValue(switchTarget.value())) { - System.out.println(holder.switches); throw new MalformedCommandException("Switch Target specifies nonexistent switch \"" + switchTarget.value() + "\""); } diff --git a/common/src/main/java/com/dfsek/terra/api/world/generation/Chunkified.java b/common/src/main/java/com/dfsek/terra/api/world/generation/Chunkified.java new file mode 100644 index 000000000..3b9925d46 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/Chunkified.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.world.generation; + +/** + * Marker interface that marks a feature as "chunkified" (only modifying one chunk at a time) + */ +public interface Chunkified { +} diff --git a/common/src/main/java/com/dfsek/terra/api/world/generation/GenerationPhase.java b/common/src/main/java/com/dfsek/terra/api/world/generation/GenerationPhase.java deleted file mode 100644 index 6dfee8985..000000000 --- a/common/src/main/java/com/dfsek/terra/api/world/generation/GenerationPhase.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.dfsek.terra.api.world.generation; - -/** - * The phase of terrain generation. Used for modifying values based on the phase of generation. - */ -public enum GenerationPhase { - BASE, POPULATE, GENERATION_POPULATE, PALETTE_APPLY, POST_GEN -} diff --git a/common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java index 280ee8f96..345e32c61 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java @@ -6,10 +6,10 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.generator.ChunkData; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.world.generation.math.SamplerCache; import com.dfsek.terra.world.generation.math.samplers.Sampler; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.Random; public interface TerraChunkGenerator { @@ -32,4 +32,6 @@ public interface TerraChunkGenerator { TerraPlugin getMain(); Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth); + + List getPopulators(); } diff --git a/common/src/main/java/com/dfsek/terra/commands/structure/StructureLoadCommand.java b/common/src/main/java/com/dfsek/terra/commands/structure/StructureLoadCommand.java index ae1327b11..dfd22addf 100644 --- a/common/src/main/java/com/dfsek/terra/commands/structure/StructureLoadCommand.java +++ b/common/src/main/java/com/dfsek/terra/commands/structure/StructureLoadCommand.java @@ -63,8 +63,6 @@ public class StructureLoadCommand implements CommandTemplate { @Override public void execute(CommandSender sender) { - System.out.println(rotation); - Player player = (Player) sender; long t = System.nanoTime(); diff --git a/common/src/main/java/com/dfsek/terra/config/builder/BiomeBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/BiomeBuilder.java index a454cb07c..f29a06c7c 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/BiomeBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/BiomeBuilder.java @@ -4,7 +4,10 @@ import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.util.collections.ProbabilityCollection; import com.dfsek.terra.api.util.seeded.SeededBuilder; import com.dfsek.terra.api.world.biome.TerraBiome; +import com.dfsek.terra.config.templates.BiomeTemplate; public interface BiomeBuilder extends SeededBuilder { ProbabilityCollection getVanillaBiomes(); + + BiomeTemplate getTemplate(); } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/UserDefinedBiomeBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/UserDefinedBiomeBuilder.java index 904a541c9..a4a39e3e3 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/UserDefinedBiomeBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/UserDefinedBiomeBuilder.java @@ -66,4 +66,9 @@ public class UserDefinedBiomeBuilder implements BiomeBuilder { public ProbabilityCollection getVanillaBiomes() { return template.getVanilla(); } + + @Override + public BiomeTemplate getTemplate() { + return template; + } } diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/noise/ExpressionFunctionTemplate.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/noise/ExpressionFunctionTemplate.java index 79aa5a41a..90926aea6 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/noise/ExpressionFunctionTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/sampler/templates/noise/ExpressionFunctionTemplate.java @@ -65,7 +65,6 @@ public class ExpressionFunctionTemplate extends SamplerTemplate noiseFunctionMap = new HashMap<>(); for(Map.Entry entry : expressions.entrySet()) { - System.out.println(entry); noiseFunctionMap.put(entry.getKey(), UserDefinedFunction.newInstance(entry.getValue(), new Parser(), new Scope())); } diff --git a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java index c49d2b667..bfebcb717 100644 --- a/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/pack/ConfigPackTemplate.java @@ -73,6 +73,46 @@ public class ConfigPackTemplate implements ConfigTemplate { @Default private String version = "0.1.0"; + @Value("disable.carvers") + @Default + private boolean disableCarvers = false; + + @Value("disable.structures") + @Default + private boolean disableStructures = false; + + @Value("disable.ores") + @Default + private boolean disableOres = false; + + @Value("disable.trees") + @Default + private boolean disableTrees = false; + + @Value("disable.flora") + @Default + private boolean disableFlora = false; + + public boolean disableCarvers() { + return disableCarvers; + } + + public boolean disableFlora() { + return disableFlora; + } + + public boolean disableOres() { + return disableOres; + } + + public boolean disableStructures() { + return disableStructures; + } + + public boolean disableTrees() { + return disableTrees; + } + public LinkedHashMap getFunctions() { return functions; } diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index b3a28548b..69ee69122 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -190,10 +190,19 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Default private Map carvers = new HashMap<>(); + @Value("colors") + @Abstractable + @Default + private Map colors = new HashMap<>(); // Plain ol' map, so platforms can decide what to do with colors (if anything). + public Set getTags() { return tags; } + public Map getColors() { + return colors; + } + public Map getCarvers() { return carvers; } diff --git a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java index ed93986bc..c4f384b07 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator2D.java @@ -10,6 +10,7 @@ import com.dfsek.terra.api.util.world.PaletteUtil; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; +import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.config.pack.ConfigPack; @@ -21,9 +22,15 @@ import com.dfsek.terra.world.carving.NoiseCarver; import com.dfsek.terra.world.generation.math.SamplerCache; import com.dfsek.terra.world.generation.math.samplers.Sampler; import com.dfsek.terra.world.generation.math.samplers.Sampler2D; +import com.dfsek.terra.world.population.CavePopulator; +import com.dfsek.terra.world.population.OrePopulator; +import com.dfsek.terra.world.population.StructurePopulator; +import com.dfsek.terra.world.population.TreePopulator; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; import java.util.Random; public class DefaultChunkGenerator2D implements TerraChunkGenerator { @@ -31,12 +38,18 @@ public class DefaultChunkGenerator2D implements TerraChunkGenerator { private final TerraPlugin main; private final Carver carver; + private final List blockPopulators = new ArrayList<>(); private final SamplerCache cache; public DefaultChunkGenerator2D(ConfigPack c, TerraPlugin main, SamplerCache cache) { this.configPack = c; this.main = main; + blockPopulators.add(new CavePopulator(main)); + blockPopulators.add(new StructurePopulator(main)); + blockPopulators.add(new OrePopulator(main)); + blockPopulators.add(new TreePopulator(main)); + blockPopulators.add(new TreePopulator(main)); carver = new NoiseCarver(new Range(0, 255), main.getWorldHandle().createBlockData("minecraft:air"), main); this.cache = cache; } @@ -125,4 +138,9 @@ public class DefaultChunkGenerator2D implements TerraChunkGenerator { public Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth) { return new Sampler2D(chunkX, chunkZ, provider, world, elevationSmooth); } + + @Override + public List getPopulators() { + return blockPopulators; + } } diff --git a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java index af656ac84..f63676161 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/generators/DefaultChunkGenerator3D.java @@ -17,6 +17,7 @@ import com.dfsek.terra.api.util.world.PaletteUtil; import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; +import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.SinglePalette; @@ -28,8 +29,15 @@ import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.carving.NoiseCarver; import com.dfsek.terra.world.generation.math.samplers.Sampler; import com.dfsek.terra.world.generation.math.samplers.Sampler3D; +import com.dfsek.terra.world.population.CavePopulator; +import com.dfsek.terra.world.population.FloraPopulator; +import com.dfsek.terra.world.population.OrePopulator; +import com.dfsek.terra.world.population.StructurePopulator; +import com.dfsek.terra.world.population.TreePopulator; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Random; @@ -38,14 +46,21 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { private final TerraPlugin main; private final BlockType water; private final SinglePalette blank; + private final List blockPopulators = new ArrayList<>(); private final Carver carver; - public DefaultChunkGenerator3D(ConfigPack c, TerraPlugin main) { this.configPack = c; this.main = main; + + blockPopulators.add(new CavePopulator(main)); + blockPopulators.add(new StructurePopulator(main)); + blockPopulators.add(new OrePopulator(main)); + blockPopulators.add(new TreePopulator(main)); + blockPopulators.add(new FloraPopulator(main)); + carver = new NoiseCarver(new Range(0, 255), main.getWorldHandle().createBlockData("minecraft:air"), main); water = main.getWorldHandle().createBlockData("minecraft:water").getBlockType(); blank = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:air")); @@ -236,4 +251,9 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator { public Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth) { return new Sampler3D(chunkX, chunkZ, provider, world, elevationSmooth); } + + @Override + public List getPopulators() { + return blockPopulators; + } } diff --git a/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java index 15d386ca9..ee3aa0553 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/CavePopulator.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.util.world.PopulationUtil; +import com.dfsek.terra.api.world.generation.Chunkified; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.pack.WorldConfig; @@ -23,7 +24,7 @@ import java.util.Map; import java.util.Random; import java.util.Set; -public class CavePopulator implements TerraBlockPopulator { +public class CavePopulator implements TerraBlockPopulator, Chunkified { private static final Map shiftStorage = new HashMap<>(); // Persist BlockData created for shifts, to avoid re-calculating each time. private final TerraPlugin main; @@ -41,6 +42,7 @@ public class CavePopulator implements TerraBlockPopulator { Random random = PopulationUtil.getRandom(chunk); if(!tw.isSafe()) return; WorldConfig config = tw.getConfig(); + if(config.getTemplate().disableCarvers()) return; for(UserDefinedCarver c : config.getCarvers()) { CarverTemplate template = c.getConfig(); diff --git a/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java index 281854cce..4bb62c2db 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/FloraPopulator.java @@ -33,6 +33,8 @@ public class FloraPopulator implements TerraBlockPopulator { public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("FloraTime")) { + if(tw.getConfig().getTemplate().disableCarvers()) return; + if(!tw.isSafe()) return; BiomeProvider provider = tw.getBiomeProvider(); Map> layers = new HashMap<>(); diff --git a/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java index a67944409..d6a0f7779 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/OrePopulator.java @@ -28,6 +28,8 @@ public class OrePopulator implements TerraBlockPopulator { public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("OreTime")) { + if(tw.getConfig().getTemplate().disableCarvers()) return; + if(!tw.isSafe()) return; for(int cx = -1; cx <= 1; cx++) { for(int cz = -1; cz <= 1; cz++) { diff --git a/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java index 17bb41221..4a0ae6826 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/StructurePopulator.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.biome.UserDefinedBiome; import com.dfsek.terra.api.world.biome.provider.BiomeProvider; +import com.dfsek.terra.api.world.generation.Chunkified; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.pack.WorldConfig; @@ -20,7 +21,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Random; -public class StructurePopulator implements TerraBlockPopulator { +public class StructurePopulator implements TerraBlockPopulator, Chunkified { private final TerraPlugin main; public StructurePopulator(TerraPlugin main) { @@ -32,6 +33,8 @@ public class StructurePopulator implements TerraBlockPopulator { public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("StructureTime")) { + if(tw.getConfig().getTemplate().disableCarvers()) return; + int cx = (chunk.getX() << 4); int cz = (chunk.getZ() << 4); if(!tw.isSafe()) return; diff --git a/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java index 82bf925c7..5700da165 100644 --- a/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/world/population/TreePopulator.java @@ -33,6 +33,8 @@ public class TreePopulator implements TerraBlockPopulator { public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("TreeTime")) { + if(tw.getConfig().getTemplate().disableCarvers()) return; + if(!tw.isSafe()) return; BiomeProvider provider = tw.getBiomeProvider(); Random random = PopulationUtil.getRandom(chunk); diff --git a/common/src/test/java/biome/DistributionTest.java b/common/src/test/java/biome/DistributionTest.java index 226da5898..711aba9c7 100644 --- a/common/src/test/java/biome/DistributionTest.java +++ b/common/src/test/java/biome/DistributionTest.java @@ -39,6 +39,7 @@ import com.dfsek.terra.config.loaders.config.biome.templates.provider.SingleBiom import com.dfsek.terra.config.loaders.config.sampler.NoiseSamplerBuilderLoader; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.AbstractableTemplate; +import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.registry.config.BiomeRegistry; import com.dfsek.terra.registry.config.NoiseRegistry; import com.dfsek.terra.world.TerraWorld; @@ -306,6 +307,11 @@ public class DistributionTest { return null; } + @Override + public BiomeTemplate getTemplate() { + return null; + } + @Override public Generator getGenerator(World w) { return null; diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index dbf066f36..e9dac10e5 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -15,6 +15,13 @@ configureCommon() group = "com.dfsek.terra.bukkit" +val mcVersion = "1.16.5" +val testDir = "target/server/" +val testMem = "3G" + +val paperURL = "https://papermc.io/api/v1/paper/%version%/latest/download/" +val purpurURL = "https://ci.pl3x.net/job/Purpur/lastSuccessfulBuild/artifact/final/purpurclip.jar" + repositories { mavenCentral() maven { url = uri("http://maven.enginehub.org/repo/") } @@ -35,73 +42,155 @@ dependencies { "shadedImplementation"("com.google.guava:guava:30.0-jre") } -val testDir = "target/server/" +val aikarsFlags = listOf("-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", + "-XX:+UnlockExperimentalVMOptions", "-XX:+DisableExplicitGC", "-XX:+AlwaysPreTouch", + "-XX:G1NewSizePercent=30", "-XX:G1MaxNewSizePercent=40", "-XX:G1HeapRegionSize=8M", + "-XX:G1ReservePercent=20", "-XX:G1HeapWastePercent=5", "-XX:G1MixedGCCountTarget=4", + "-XX:InitiatingHeapOccupancyPercent=15", "-XX:G1MixedGCLiveThresholdPercent=90", + "-XX:G1RSetUpdatingPauseTimePercent=5", "-XX:SurvivorRatio=32", "-XX:+PerfDisableSharedMem", + "-XX:MaxTenuringThreshold=1", "-Dusing.aikars.flags=https://mcflags.emc.gs", + "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear") -val setupServer = tasks.create("setupServer") { - dependsOn("shadowJar") - doFirst { - // clean - file("${testDir}/").deleteRecursively() - file("${testDir}/plugins").mkdirs() +fun downloadPaperclip(url: String, dir: String) { + val clip = URL(url.replace("%version%", mcVersion)) + val clipReadableByteChannel = Channels.newChannel(clip.openStream()) + val clipFile = file("$testDir/$dir/paperclip.jar") + val clipOutputStream = clipFile.outputStream() + val clipFileChannel = clipOutputStream.channel + clipFileChannel.transferFrom(clipReadableByteChannel, 0, Long.MAX_VALUE) +} - // Downloading latest paper jar. - val paperUrl = URL("https://papermc.io/api/v1/paper/1.16.4/latest/download") - val paperReadableByteChannel = Channels.newChannel(paperUrl.openStream()) - val paperFile = file("${testDir}/paper.jar") - val paperFileOutputStream = paperFile.outputStream() - val paperFileChannel = paperFileOutputStream.channel - paperFileChannel.transferFrom(paperReadableByteChannel, 0, Long.MAX_VALUE) - - // Cloning test setup. - gitClone("https://github.com/PolyhedralDev/WorldGenTestServer") - // Copying plugins - Files.move(Paths.get("WorldGenTestServer/plugins"), - Paths.get("$testDir/plugins"), - StandardCopyOption.REPLACE_EXISTING) - // Copying config - val serverText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/server.properties").readText() - file("${testDir}/server.properties").writeText(serverText) - val bukkitText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/bukkit.yml").readText() - file("${testDir}/bukkit.yml").writeText(bukkitText.replace("\${world}", "world").replace("\${gen}", "Terra:DEFAULT")) - - File("${testDir}/eula.txt").writeText("eula=true") - - // clean up - file("WorldGenTestServer").deleteRecursively() +fun copyTerra(dir: String) { + file("$testDir/$dir").walk().forEach { + if(it.name.startsWith("Terra-") && it.name.endsWith(".jar")) it.delete() // Delete old Terra jar(s) + } + copy { + from("$buildDir/libs/Terra-bukkit-$version-shaded.jar") + into("$testDir/$dir/plugins/") } } -val testWithPaper = task(name = "testWithPaper") { +fun installServer(dir: String) { + // clean + file("$testDir/$dir").deleteRecursively() + file("$testDir/$dir/plugins").mkdirs() + // Cloning test setup. + gitClone("https://github.com/PolyhedralDev/WorldGenTestServer") + // Copying plugins + Files.move(Paths.get("WorldGenTestServer/plugins"), + Paths.get("$testDir/$dir/plugins"), + StandardCopyOption.REPLACE_EXISTING) + // Copying config + val serverText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/server.properties").readText() + file("$testDir/$dir/server.properties").writeText(serverText) + val bukkitText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/bukkit.yml").readText() + file("$testDir/$dir/bukkit.yml").writeText(bukkitText.replace("\${world}", "world").replace("\${gen}", "Terra:DEFAULT")) + + println("By proceeding, you are agreeing to the Minecraft EULA: https://account.mojang.com/documents/minecraft_eula") + file("$testDir/$dir/eula.txt").writeText("eula=true") + + // clean up + file("WorldGenTestServer").deleteRecursively() +} + +fun deleteFolder(folder: File) { + if(folder.exists()) folder.deleteRecursively() +} + +fun deleteFile(file: File) { + if(file.exists()) file.delete() +} + +tasks.create("cleanWorlds") { + group = "bukkit" + doFirst { + deleteFolder(file("$testDir/paper/world")) + deleteFolder(file("$testDir/paper/world_nether")) + deleteFolder(file("$testDir/paper/world_the_end")) + + deleteFolder(file("$testDir/purpur/world")) + deleteFolder(file("$testDir/purpur/world_nether")) + deleteFolder(file("$testDir/purpur/world_the_end")) + } +} + +tasks.create("updatePaper") { + group = "bukkit" + doFirst { + deleteFile(file("$testDir/paper/paperclip.jar")) + downloadPaperclip(paperURL, "paper") + } +} + +tasks.create("updatePurpur") { + group = "bukkit" + doFirst { + deleteFile(file("$testDir/paper/paperclip.jar")) + downloadPaperclip(purpurURL, "purpur") + } +} + +tasks.create("installPaper") { + group = "bukkit" + dependsOn("shadowJar") + doFirst { + installServer("paper") + // Downloading latest paper jar. + downloadPaperclip(paperURL, "paper") + } +} + +tasks.create("installPurpur") { + group = "bukkit" + dependsOn("shadowJar") + doFirst { + installServer("purpur") + // Downloading latest paper jar. + downloadPaperclip(purpurURL, "purpur") + } +} + +task(name = "runPaper") { + group = "bukkit" standardInput = System.`in` dependsOn("shadowJar") // Copy Terra into dir doFirst { - copy { - from("${buildDir}/libs/Terra-bukkit-${version}-shaded.jar") - into("${testDir}/plugins/") - } + copyTerra("paper") } main = "io.papermc.paperclip.Paperclip" - jvmArgs = listOf("-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", - "-XX:+UnlockExperimentalVMOptions", "-XX:+DisableExplicitGC", "-XX:+AlwaysPreTouch", - "-XX:G1NewSizePercent=30", "-XX:G1MaxNewSizePercent=40", "-XX:G1HeapRegionSize=8M", - "-XX:G1ReservePercent=20", "-XX:G1HeapWastePercent=5", "-XX:G1MixedGCCountTarget=4", - "-XX:InitiatingHeapOccupancyPercent=15", "-XX:G1MixedGCLiveThresholdPercent=90", - "-XX:G1RSetUpdatingPauseTimePercent=5", "-XX:SurvivorRatio=32", "-XX:+PerfDisableSharedMem", - "-XX:MaxTenuringThreshold=1", "-Dusing.aikars.flags=https://mcflags.emc.gs", - "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear") - maxHeapSize = "4G" - minHeapSize = "4G" + jvmArgs = aikarsFlags + maxHeapSize = testMem + minHeapSize = testMem //args = listOf("nogui") - workingDir = file("${testDir}/") - classpath = files("${testDir}/paper.jar") + workingDir = file("$testDir/paper") + classpath = files("$testDir/paper/paperclip.jar") +} + +task(name = "runPurpur") { + group = "bukkit" + standardInput = System.`in` + dependsOn("shadowJar") + // Copy Terra into dir + doFirst { + copyTerra("purpur") + } + + main = "io.papermc.paperclip.Paperclip" + jvmArgs = aikarsFlags + maxHeapSize = testMem + minHeapSize = testMem + //args = listOf("nogui") + workingDir = file("$testDir/purpur") + classpath = files("$testDir/purpur/paperclip.jar") } tasks.named("shadowJar") { relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") } + publishing { publications { create("mavenJava") { @@ -112,7 +201,6 @@ publishing { 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 diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 092b486f2..96ae67747 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -23,6 +23,8 @@ import org.jetbrains.annotations.NotNull; import java.io.FileNotFoundException; import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; @@ -40,20 +42,13 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Gener private final TerraPlugin main; - private final List populators = new LinkedList<>(); - private boolean needsLoad = true; public BukkitChunkGeneratorWrapper(TerraChunkGenerator delegate) { this.delegate = delegate; this.main = delegate.getMain(); - popMan = new PopulationManager(main); - popMan.attach(new OrePopulator(main)); - popMan.attach(new TreePopulator(main)); - popMan.attach(new FloraPopulator(main)); - populators.add(new CavePopulator(main)); - populators.add(new StructurePopulator(main)); - populators.add(popMan); + this.popMan = new PopulationManager(delegate, main); + } @@ -96,7 +91,7 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public @NotNull List getDefaultPopulators(@NotNull World world) { - return populators.stream().map(BukkitPopulatorWrapper::new).collect(Collectors.toList()); + return Arrays.asList(popMan, new BukkitPopulatorWrapper(delegate)); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java deleted file mode 100644 index fabb1d53c..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dfsek.terra.bukkit.generator; - -import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.generator.BlockPopulator; -import com.dfsek.terra.bukkit.world.BukkitChunk; -import com.dfsek.terra.bukkit.world.BukkitWorld; - -import java.util.Random; - -public class BukkitPopulator implements BlockPopulator { - private final org.bukkit.generator.BlockPopulator handle; - - public BukkitPopulator(org.bukkit.generator.BlockPopulator handle) { - this.handle = handle; - } - - @Override - public void populate(World world, Random random, Chunk chunk) { - handle.populate(((BukkitWorld) world).getHandle(), random, ((BukkitChunk) chunk).getHandle()); - } - - @Override - public org.bukkit.generator.BlockPopulator getHandle() { - return handle; - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java index 22b1a2a53..eb57cb2dc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java @@ -1,6 +1,8 @@ package com.dfsek.terra.bukkit.generator; +import com.dfsek.terra.api.world.generation.Chunkified; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.bukkit.world.BukkitAdapter; import org.bukkit.Chunk; import org.bukkit.World; @@ -10,14 +12,18 @@ import org.jetbrains.annotations.NotNull; import java.util.Random; public class BukkitPopulatorWrapper extends BlockPopulator { - private final TerraBlockPopulator delegate; + private final TerraChunkGenerator delegate; - public BukkitPopulatorWrapper(TerraBlockPopulator delegate) { + public BukkitPopulatorWrapper(TerraChunkGenerator delegate) { this.delegate = delegate; } @Override public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk source) { - delegate.populate(BukkitAdapter.adapt(world), BukkitAdapter.adapt(source)); + delegate.getPopulators().forEach(populator -> { + if(populator instanceof Chunkified) { + populator.populate(BukkitAdapter.adapt(world), BukkitAdapter.adapt(source)); + } + }); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java index 34ec49d68..9b9c7a100 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/population/PopulationManager.java @@ -4,54 +4,35 @@ import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.util.FastRandom; -import com.dfsek.terra.api.util.GlueList; +import com.dfsek.terra.api.world.generation.Chunkified; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.profiler.ProfileFuture; import com.dfsek.terra.profiler.WorldProfiler; +import org.bukkit.generator.BlockPopulator; import org.jetbrains.annotations.NotNull; import java.io.File; import java.io.IOException; import java.util.HashSet; -import java.util.List; import java.util.Random; /** * Cursed management class for the horrors of Bukkit population */ -public class PopulationManager implements TerraBlockPopulator { - private final List attachedPopulators = new GlueList<>(); +public class PopulationManager extends BlockPopulator { + private final TerraChunkGenerator generator; private final HashSet needsPop = new HashSet<>(); private final TerraPlugin main; private WorldProfiler profiler; - public PopulationManager(TerraPlugin main) { + public PopulationManager(TerraChunkGenerator generator, TerraPlugin main) { + this.generator = generator; this.main = main; } - public void attach(TerraBlockPopulator populator) { - this.attachedPopulators.add(populator); - } - - @Override - @SuppressWarnings("try") - public void populate(@NotNull World world, @NotNull Chunk chunk) { - try(ProfileFuture ignored = measure()) { - needsPop.add(new ChunkCoordinate(chunk)); - int x = chunk.getX(); - int z = chunk.getZ(); - if(((TerraBukkitPlugin) main).isEnabled()) { - for(int xi = -1; xi <= 1; xi++) { - for(int zi = -1; zi <= 1; zi++) { - if(xi == 0 && zi == 0) continue; - if(world.isChunkGenerated(xi + x, zi + z)) checkNeighbors(xi + x, zi + z, world); - } - } - } - } - } - private ProfileFuture measure() { if(profiler != null) return profiler.measure("PopulationManagerTime"); return null; @@ -87,10 +68,30 @@ public class PopulationManager implements TerraBlockPopulator { long zRand = (random.nextLong() / 2L << 1L) + 1L; random.setSeed((long) x * xRand + (long) z * zRand ^ w.getSeed()); Chunk currentChunk = w.getChunkAt(x, z); - for(TerraBlockPopulator r : attachedPopulators) { - r.populate(w, currentChunk); - } + generator.getPopulators().forEach(populator -> { + if(!(populator instanceof Chunkified)) { + populator.populate(w, currentChunk); + } + }); needsPop.remove(c); } } + + @Override + public void populate(org.bukkit.@NotNull World world, @NotNull Random random, org.bukkit.@NotNull Chunk source) { + try(ProfileFuture ignored = measure()) { + Chunk chunk = BukkitAdapter.adapt(source); + needsPop.add(new ChunkCoordinate(chunk)); + int x = chunk.getX(); + int z = chunk.getZ(); + if(((TerraBukkitPlugin) main).isEnabled()) { + for(int xi = -1; xi <= 1; xi++) { + for(int zi = -1; zi <= 1; zi++) { + if(xi == 0 && zi == 0) continue; + if(world.isChunkGenerated(xi + x, zi + z)) checkNeighbors(xi + x, zi + z, BukkitAdapter.adapt(world)); + } + } + } + } + } } \ No newline at end of file diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 2e085d24d..900d17698 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -40,6 +40,7 @@ configure { } tasks.register("remapShadedJar") { + group = "fabric" val shadowJar = tasks.getByName("shadowJar") dependsOn(shadowJar) input.set(shadowJar.archiveFile) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index ea17d400f..57a326726 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -35,6 +35,7 @@ import com.dfsek.terra.config.builder.BiomeBuilder; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; +import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.world.FabricAdapter; @@ -150,7 +151,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public TerraWorld getWorld(World world) { - if(worldMap.size() > 1) System.out.println(worldMap.size()); return worldMap.computeIfAbsent(world.getSeed(), w -> { logger.info("Loading world " + w); return new TerraWorld(world, ((FabricChunkGeneratorWrapper) ((FabricChunkGenerator) world.getGenerator()).getHandle()).getPack(), this); @@ -246,6 +246,9 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { DefaultBiomeFeatures.addFarmAnimals(spawnSettings); DefaultBiomeFeatures.addMonsters(spawnSettings, 95, 5, 100); + BiomeTemplate template = biome.getTemplate(); + Map colors = template.getColors(); + Biome vanilla = ((FabricBiome) new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); @@ -254,28 +257,37 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { BiomeEffects.Builder effects = new BiomeEffects.Builder() - .waterColor(vanilla.getEffects().waterColor) - .waterFogColor(vanilla.getEffects().waterFogColor) - .fogColor(vanilla.getEffects().fogColor) - .skyColor(vanilla.getEffects().skyColor) + .waterColor(colors.getOrDefault("water", vanilla.getEffects().waterColor)) + .waterFogColor(colors.getOrDefault("water-fog", vanilla.getEffects().waterFogColor)) + .fogColor(colors.getOrDefault("fog", vanilla.getEffects().fogColor)) + .skyColor(colors.getOrDefault("sky", vanilla.getEffects().skyColor)) .grassColorModifier(vanilla.getEffects().grassColorModifier); - vanilla.getEffects().grassColor.ifPresent(effects::grassColor); - vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); - return (new Biome.Builder()) + if(colors.containsKey("grass")) { + effects.grassColor(colors.get("grass")); + } else { + vanilla.getEffects().grassColor.ifPresent(effects::grassColor); + } + vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); + if(colors.containsKey("foliage")) { + effects.foliageColor(colors.get("foliage")); + } else { + vanilla.getEffects().foliageColor.ifPresent(effects::foliageColor); + } + + return new Biome.Builder() .precipitation(vanilla.getPrecipitation()) .category(vanilla.getCategory()) .depth(vanilla.getDepth()) .scale(vanilla.getScale()) .temperature(vanilla.getTemperature()) .downfall(vanilla.getDownfall()) - .effects(vanilla.getEffects()) // TODO: configurable + .effects(effects.build()) .spawnSettings(spawnSettings.build()) .generationSettings(generationSettings.build()) .build(); } - @SuppressWarnings("unchecked") @Override public void onInitialize() { instance = this; @@ -327,10 +339,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { int max = manager.getMaxArgumentDepth(); - System.out.println("MAX:" + max); RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); for(int i = 0; i < max; i++) { - System.out.println("arg " + i); RequiredArgumentBuilder next = argument("arg" + (max - i - 1), StringArgumentType.word()); arg = next.then(assemble(arg, manager)); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java index fdb39fe78..b284acd43 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java @@ -27,11 +27,7 @@ public class PopulatorFeature extends Feature { FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator; FabricChunkWorldAccess chunk = new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4); FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator)); - gen.getCavePopulator().populate(new FabricWorldAccess(world), chunk); - gen.getStructurePopulator().populate(new FabricWorldAccess(world), chunk); - gen.getOrePopulator().populate(world1, chunk); - gen.getTreePopulator().populate(world1, chunk); - gen.getFloraPopulator().populate(world1, chunk); + gen.getHandle().getPopulators().forEach(populator -> populator.populate(world1, chunk)); return true; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index cb7ebe8b8..a15267e2d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -50,32 +50,6 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener return pack; } - private final FloraPopulator floraPopulator = new FloraPopulator(TerraFabricPlugin.getInstance()); - private final OrePopulator orePopulator = new OrePopulator(TerraFabricPlugin.getInstance()); - private final TreePopulator treePopulator = new TreePopulator(TerraFabricPlugin.getInstance()); - private final StructurePopulator structurePopulator = new StructurePopulator(TerraFabricPlugin.getInstance()); - private final CavePopulator cavePopulator = new CavePopulator(TerraFabricPlugin.getInstance()); - - public TreePopulator getTreePopulator() { - return treePopulator; - } - - public OrePopulator getOrePopulator() { - return orePopulator; - } - - public FloraPopulator getFloraPopulator() { - return floraPopulator; - } - - public StructurePopulator getStructurePopulator() { - return structurePopulator; - } - - public CavePopulator getCavePopulator() { - return cavePopulator; - } - public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { super(biomeSource, new StructuresConfig(false)); this.pack = configPack; @@ -124,6 +98,8 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener } + + @Override public boolean isStrongholdStartingChunk(ChunkPos chunkPos) { return false;