From dac3610bcfcf3b3f6a04bd7a8037a7d31b4f8a2f Mon Sep 17 00:00:00 2001 From: Jordan Date: Sun, 19 Jun 2022 22:33:16 +0100 Subject: [PATCH] Implement generation of biome decorations to //regen and add option for a random seed to be used (#1819) --- .../v1_17_R1_2/regen/PaperweightRegen.java | 20 ++++-- .../fawe/v1_18_R2/regen/PaperweightRegen.java | 54 +++++++++++++--- .../fawe/v1_19_R1/regen/PaperweightRegen.java | 61 ++++++++++++++----- .../bukkit/adapter/Regenerator.java | 28 +++++++++ .../worldedit/command/RegionCommands.java | 5 +- 5 files changed, 138 insertions(+), 30 deletions(-) diff --git a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java index b952b0fb4..6ea695d8c 100644 --- a/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_17_1/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_17_R1_2/regen/PaperweightRegen.java @@ -11,7 +11,6 @@ import com.mojang.datafixers.util.Either; import com.mojang.serialization.Codec; import com.mojang.serialization.Lifecycle; import com.sk89q.worldedit.bukkit.adapter.Refraction; -import com.sk89q.worldedit.bukkit.adapter.ext.fawe.PaperweightAdapter; import com.sk89q.worldedit.bukkit.adapter.impl.fawe.v1_17_R1_2.PaperweightGetBlocks; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.internal.util.LogManagerCompat; @@ -38,6 +37,7 @@ import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelSettings; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.FixedBiomeSource; import net.minecraft.world.level.biome.OverworldBiomeSource; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; @@ -67,6 +67,7 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_17_R1.CraftServer; import org.bukkit.craftbukkit.v1_17_R1.CraftWorld; import org.bukkit.craftbukkit.v1_17_R1.generator.CustomChunkGenerator; +import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.BlockPopulator; import javax.annotation.Nullable; @@ -213,6 +214,8 @@ public class PaperweightRegen extends Regenerator generatorSettingBaseSupplier = (Supplier) generatorSettingBaseSupplierField .get(originalChunkProvider.getGenerator()); - BiomeSource biomeSource = originalChunkProvider.getGenerator().getBiomeSource(); - if (biomeSource instanceof OverworldBiomeSource) { - biomeSource = fastOverworldBiomeSource(biomeSource); + BiomeSource biomeSource; + if (options.hasBiomeType()) { + biomeSource = new FixedBiomeSource(BuiltinRegistries.BIOME.get(ResourceLocation.tryParse(options + .getBiomeType() + .getId()))); + } else { + biomeSource = originalChunkProvider.getGenerator().getBiomeSource(); + if (biomeSource instanceof OverworldBiomeSource) { + biomeSource = fastOverworldBiomeSource(biomeSource); + } } chunkGenerator = new NoiseBasedChunkGenerator(biomeSource, seed, generatorSettingBaseSupplier); } else if (originalChunkProvider.getGenerator() instanceof CustomChunkGenerator) { diff --git a/worldedit-bukkit/adapters/adapter-1_18_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R2/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_18_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R2/regen/PaperweightRegen.java index cda182ea4..214484948 100644 --- a/worldedit-bukkit/adapters/adapter-1_18_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R2/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_18_2/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_18_R2/regen/PaperweightRegen.java @@ -17,6 +17,7 @@ import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.io.file.SafeFiles; import com.sk89q.worldedit.world.RegenOptions; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; @@ -33,6 +34,7 @@ import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelSettings; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.FixedBiomeSource; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkStatus; @@ -46,6 +48,7 @@ import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.levelgen.blending.BlendingData; import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; +import net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.PrimaryLevelData; @@ -54,6 +57,7 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_18_R2.CraftServer; import org.bukkit.craftbukkit.v1_18_R2.CraftWorld; import org.bukkit.craftbukkit.v1_18_R2.generator.CustomChunkGenerator; +import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.BlockPopulator; import javax.annotation.Nullable; @@ -81,6 +85,8 @@ public class PaperweightRegen extends Regenerator chunkStati = new LinkedHashMap<>(); @@ -139,6 +145,12 @@ public class PaperweightRegen extends Regenerator singleBiome = options.hasBiomeType() ? BuiltinRegistries.BIOME.asHolderIdMap().byId( WorldEditPlugin.getInstance().getBukkitImplAdapter().getInternalBiomeId(options.getBiomeType()) @@ -260,22 +274,30 @@ public class PaperweightRegen extends Regenerator generatorSettingBaseSupplier = (Holder) generatorSettingBaseSupplierField - .get(originalChunkProvider.getGenerator()); - BiomeSource biomeSource = originalChunkProvider.getGenerator().getBiomeSource(); - chunkGenerator = new NoiseBasedChunkGenerator(originalChunkProvider.getGenerator().structureSets, noiseBasedChunkGenerator.noises, + .get(originalGenerator); + BiomeSource biomeSource; + if (options.hasBiomeType()) { + biomeSource = new FixedBiomeSource(BuiltinRegistries.BIOME + .asHolderIdMap() + .byId(WorldEditPlugin.getInstance().getBukkitImplAdapter().getInternalBiomeId(options.getBiomeType()))); + } else { + biomeSource = originalGenerator.getBiomeSource(); + } + chunkGenerator = new NoiseBasedChunkGenerator(originalGenerator.structureSets, noiseBasedChunkGenerator.noises, biomeSource, seed, generatorSettingBaseSupplier ); - } else if (originalChunkProvider.getGenerator() instanceof CustomChunkGenerator customChunkGenerator) { + } else if (originalGenerator instanceof CustomChunkGenerator customChunkGenerator) { chunkGenerator = customChunkGenerator.delegate; } else { - LOGGER.error("Unsupported generator type {}", originalChunkProvider.getGenerator().getClass().getName()); + LOGGER.error("Unsupported generator type {}", originalGenerator.getClass().getName()); return false; } if (generator != null) { @@ -283,6 +305,20 @@ public class PaperweightRegen extends Regenerator>> ringPositions = + (Map>>) ringPositionsField.get( + originalGenerator); + Map>> copy = new Object2ObjectArrayMap<>(ringPositions); + ringPositionsField.set(chunkGenerator, copy); + hasGeneratedPositionsField.setBoolean(chunkGenerator, true); + } + } + + chunkGenerator.conf = originalServerWorld.spigotConfig; freshChunkProvider = new ServerChunkCache( freshWorld, diff --git a/worldedit-bukkit/adapters/adapter-1_19/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_19_R1/regen/PaperweightRegen.java b/worldedit-bukkit/adapters/adapter-1_19/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_19_R1/regen/PaperweightRegen.java index 81b37623d..44e579e90 100644 --- a/worldedit-bukkit/adapters/adapter-1_19/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_19_R1/regen/PaperweightRegen.java +++ b/worldedit-bukkit/adapters/adapter-1_19/src/main/java/com/sk89q/worldedit/bukkit/adapter/impl/fawe/v1_19_R1/regen/PaperweightRegen.java @@ -17,6 +17,7 @@ import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.util.io.file.SafeFiles; import com.sk89q.worldedit.world.RegenOptions; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; @@ -36,6 +37,7 @@ import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.LevelSettings; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.FixedBiomeSource; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.chunk.ChunkStatus; @@ -49,6 +51,7 @@ import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.WorldGenSettings; import net.minecraft.world.level.levelgen.blending.BlendingData; import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings; +import net.minecraft.world.level.levelgen.structure.placement.ConcentricRingsStructurePlacement; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager; import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.PrimaryLevelData; @@ -57,6 +60,7 @@ import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v1_19_R1.CraftServer; import org.bukkit.craftbukkit.v1_19_R1.CraftWorld; import org.bukkit.craftbukkit.v1_19_R1.generator.CustomChunkGenerator; +import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.BlockPopulator; import javax.annotation.Nullable; @@ -84,6 +88,8 @@ public class PaperweightRegen extends Regenerator chunkStati = new LinkedHashMap<>(); @@ -142,6 +148,12 @@ public class PaperweightRegen extends Regenerator) () -> new ServerLevel( server, @@ -233,7 +247,7 @@ public class PaperweightRegen extends Regenerator singleBiome = options.hasBiomeType() ? BuiltinRegistries.BIOME.asHolderIdMap().byId( WorldEditPlugin.getInstance().getBukkitImplAdapter().getInternalBiomeId(options.getBiomeType()) @@ -260,27 +274,30 @@ public class PaperweightRegen extends Regenerator generatorSettingBaseSupplier = - (Holder) generatorSettingBaseSupplierField - .get(originalChunkProvider.getGenerator()); - BiomeSource biomeSource = originalChunkProvider.getGenerator().getBiomeSource(); - chunkGenerator = new NoiseBasedChunkGenerator(originalChunkProvider.getGenerator().structureSets, + chunkGenerator = new FlatLevelSource(originalGenerator.structureSets, generatorSettingFlat); + } else if (originalGenerator instanceof NoiseBasedChunkGenerator noiseBasedChunkGenerator) { + Holder generatorSettingBaseSupplier = (Holder) generatorSettingBaseSupplierField.get( + originalGenerator); + BiomeSource biomeSource; + if (options.hasBiomeType()) { + biomeSource = new FixedBiomeSource(BuiltinRegistries.BIOME + .asHolderIdMap() + .byId(WorldEditPlugin.getInstance().getBukkitImplAdapter().getInternalBiomeId(options.getBiomeType()))); + } else { + biomeSource = originalGenerator.getBiomeSource(); + } + chunkGenerator = new NoiseBasedChunkGenerator(originalGenerator.structureSets, noiseBasedChunkGenerator.noises, biomeSource, generatorSettingBaseSupplier ); - } else if (originalChunkProvider.getGenerator() instanceof CustomChunkGenerator customChunkGenerator) { + } else if (originalGenerator instanceof CustomChunkGenerator customChunkGenerator) { chunkGenerator = customChunkGenerator.delegate; } else { - LOGGER.error("Unsupported generator type {}", originalChunkProvider.getGenerator().getClass().getName()); + LOGGER.error("Unsupported generator type {}", originalGenerator.getClass().getName()); return false; } if (generator != null) { @@ -289,6 +306,19 @@ public class PaperweightRegen extends Regenerator>> ringPositions = + (Map>>) ringPositionsField.get( + originalGenerator); + Map>> copy = new Object2ObjectArrayMap<>(ringPositions); + ringPositionsField.set(chunkGenerator, copy); + hasGeneratedPositionsField.setBoolean(chunkGenerator, true); + } + } + freshChunkProvider = new ServerChunkCache( freshWorld, session, @@ -529,6 +559,7 @@ public class PaperweightRegen extends Regenerator lightChunk(final ChunkAccess chunk, final boolean excludeBlocks) { return CompletableFuture.completedFuture(chunk); } + } } diff --git a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java index 363f8d646..8f3b4d118 100644 --- a/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java +++ b/worldedit-bukkit/src/main/java/com/fastasyncworldedit/bukkit/adapter/Regenerator.java @@ -7,6 +7,7 @@ import com.fastasyncworldedit.core.queue.implementation.SingleThreadQueueExtent; import com.fastasyncworldedit.core.util.MathMan; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.sk89q.worldedit.WorldEditException; +import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.function.pattern.Pattern; @@ -22,10 +23,14 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import org.apache.logging.log4j.Logger; +import org.bukkit.World; +import org.bukkit.generator.BiomeProvider; import org.bukkit.generator.BlockPopulator; +import org.bukkit.generator.WorldInfo; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.LinkedHashMap; @@ -521,6 +526,13 @@ public abstract class Regenerator getBiomes(final WorldInfo worldInfo) { + return Collections.singletonList(biome); + } + + } + } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java index 13a9fb54f..70e239caf 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/RegionCommands.java @@ -79,6 +79,7 @@ import org.enginehub.piston.annotation.param.Switch; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.concurrent.ThreadLocalRandom; import static com.sk89q.worldedit.command.util.Logging.LogMode.ALL; import static com.sk89q.worldedit.command.util.Logging.LogMode.ORIENTATION_REGION; @@ -691,6 +692,8 @@ public class RegionCommands { Long seed, @Switch(name = 'b', desc = "Regenerate biomes as well") boolean regenBiomes, + @Switch(name = 'r', desc = "If the seed should be randomized") + boolean randomSeed, @Arg(desc = "Biome to apply for this regeneration (only works in overworld)", def = "") BiomeType biomeType ) throws WorldEditException { @@ -703,7 +706,7 @@ public class RegionCommands { actor.print(Caption.of("fawe.regen.time")); //FAWE end RegenOptions options = RegenOptions.builder() - .seed(seed) + .seed(!randomSeed ? seed : new Long(ThreadLocalRandom.current().nextLong())) .regenBiomes(regenBiomes) .biomeType(biomeType) .build();