diff --git a/patches/server/0002-Purpur-config-files.patch b/patches/server/0002-Purpur-config-files.patch index e723d0d97..37d46ac67 100644 --- a/patches/server/0002-Purpur-config-files.patch +++ b/patches/server/0002-Purpur-config-files.patch @@ -142,7 +142,7 @@ index 4fd030ef9537d9b31c6167d73349f4c4a6b33a15..d708e210dc605ce4dca845292532dd17 public void sendMessage(Component message, UUID sender) {} diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java -index 9da5b7b54c91894b379d41fb8d2b24f7c1c9d96f..c664bd4ab5eb976fd9cdd241436c5c4c947fca08 100644 +index 4bf799db871243b07eea57ec7744cf6dc2628645..aa9bf40aa937acbda8cfb821666d466b1945e8a0 100644 --- a/src/main/java/net/minecraft/world/level/Level.java +++ b/src/main/java/net/minecraft/world/level/Level.java @@ -166,6 +166,8 @@ public abstract class Level implements LevelAccessor, AutoCloseable { @@ -164,7 +164,7 @@ index 9da5b7b54c91894b379d41fb8d2b24f7c1c9d96f..c664bd4ab5eb976fd9cdd241436c5c4c this.ticksPerAnimalSpawns = this.getCraftServer().getTicksPerAnimalSpawns(); // CraftBukkit diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java new file mode 100644 -index 0000000000000000000000000000000000000000..74fc4fc2216cf82e1546ef3d567f2750b1240df1 +index 0000000000000000000000000000000000000000..7c5ecdbd5a05ae07a440cadf79d59a439e4db524 --- /dev/null +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -0,0 +1,130 @@ @@ -223,8 +223,8 @@ index 0000000000000000000000000000000000000000..74fc4fc2216cf82e1546ef3d567f2750 + commands = new HashMap<>(); + commands.put("purpur", new PurpurCommand("purpur")); + -+ version = getInt("config-version", 13); -+ set("config-version", 13); ++ version = getInt("config-version", 14); ++ set("config-version", 14); + + readConfig(PurpurConfig.class, null); + } diff --git a/patches/server/0085-Configurable-feature-seed-settings.patch b/patches/server/0085-Configurable-feature-seed-settings.patch index 9ad9946ff..301e9db42 100644 --- a/patches/server/0085-Configurable-feature-seed-settings.patch +++ b/patches/server/0085-Configurable-feature-seed-settings.patch @@ -4,102 +4,838 @@ Date: Wed, 15 Jul 2020 11:49:36 -0500 Subject: [PATCH] Configurable feature seed settings -diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java -index 74a0adf4adf2b701126724e08bb72fa4e8e8560a..464a416069a87c390df3a0842fb34bc1049e9c6f 100644 ---- a/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java -+++ b/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java -@@ -26,6 +26,7 @@ import net.minecraft.world.level.material.FluidState; - - public class GeodeFeature extends Feature { - private static final Direction[] DIRECTIONS = Direction.values(); -+ private Random rnd; // Purpur - - public GeodeFeature(Codec configCodec) { - super(configCodec); -@@ -33,8 +34,14 @@ public class GeodeFeature extends Feature { - - @Override - public boolean place(FeaturePlaceContext context) { -+ // Purpur start -+ if (this.rnd == null) { -+ int seed = net.pl3x.purpur.PurpurConfig.geodeSeed; -+ this.rnd = seed == -1 ? context.random() : new Random(seed); -+ } -+ // Purpur end - GeodeConfiguration geodeConfiguration = context.config(); -- Random random = context.random(); -+ Random random = this.rnd; // Purpur +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/BambooFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/BambooFeature.java +index 7f3792fce13fbc27364b7d881933f54138717f51..f16c2ea9c44bb9889f4b12cb89367ef90a9bf222 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/BambooFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/BambooFeature.java +@@ -27,7 +27,7 @@ public class BambooFeature extends Feature { + int i = 0; BlockPos blockPos = context.origin(); WorldGenLevel worldGenLevel = context.level(); - int i = geodeConfiguration.minGenOffset; -diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.java -index d36b6208077254af5f0ebed8e8ce20fd45cbb79d..612bc6e4a759df96bade4c322aad0b3e8753e0ee 100644 ---- a/src/main/java/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.java -+++ b/src/main/java/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.java -@@ -25,6 +25,7 @@ public class MonsterRoomFeature extends Feature { - private static final Logger LOGGER = LogManager.getLogger(); - private static final EntityType[] MOBS = new EntityType[]{EntityType.SKELETON, EntityType.ZOMBIE, EntityType.ZOMBIE, EntityType.SPIDER}; - private static final BlockState AIR = Blocks.CAVE_AIR.defaultBlockState(); -+ private Random rnd; // Purpur - - public MonsterRoomFeature(Codec configCodec) { +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureBamboo); // Purpur + ProbabilityFeatureConfiguration probabilityFeatureConfiguration = context.config(); + BlockPos.MutableBlockPos mutableBlockPos = blockPos.mutable(); + BlockPos.MutableBlockPos mutableBlockPos2 = blockPos.mutable(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/BasaltColumnsFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/BasaltColumnsFeature.java +index 1949477637d826978e01547624bfccdb5048afb1..1af28ee54dc061d9ab1f06d07f4b8d58e7794677 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/BasaltColumnsFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/BasaltColumnsFeature.java +@@ -29,7 +29,7 @@ public class BasaltColumnsFeature extends Feature { + int i = context.chunkGenerator().getSeaLevel(); + BlockPos blockPos = context.origin(); + WorldGenLevel worldGenLevel = context.level(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureBasaltColumns); // Purpur + ColumnFeatureConfiguration columnFeatureConfiguration = context.config(); + if (!canPlaceAt(worldGenLevel, i, blockPos.mutable())) { + return false; +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/BasaltPillarFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/BasaltPillarFeature.java +index 94c01df47765c7e7e9cc4cd59b87e14ead4e4e86..39b6d627ff7c59b91ab22d5eba8658232784b50f 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/BasaltPillarFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/BasaltPillarFeature.java +@@ -19,7 +19,7 @@ public class BasaltPillarFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + BlockPos blockPos = context.origin(); + WorldGenLevel worldGenLevel = context.level(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureBasaltPillar); // Purpur + if (worldGenLevel.isEmptyBlock(blockPos) && !worldGenLevel.isEmptyBlock(blockPos.above())) { + BlockPos.MutableBlockPos mutableBlockPos = blockPos.mutable(); + BlockPos.MutableBlockPos mutableBlockPos2 = blockPos.mutable(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/BaseDiskFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/BaseDiskFeature.java +index 080bc62fa178bb84ad8672268e75be2ad554dfd2..b48084e3b63bda65ab58d5966dc5b0c94cef2992 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/BaseDiskFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/BaseDiskFeature.java +@@ -14,17 +14,20 @@ public class BaseDiskFeature extends Feature { super(configCodec); -@@ -32,9 +33,15 @@ public class MonsterRoomFeature extends Feature { + } + ++ protected net.minecraft.core.BlockPos origin; // Purpur ++ protected java.util.Random random; // Purpur ++ + @Override + public boolean place(FeaturePlaceContext context) { + DiskConfiguration diskConfiguration = context.config(); +- BlockPos blockPos = context.origin(); ++ BlockPos blockPos = this.origin; // Purpur + WorldGenLevel worldGenLevel = context.level(); + boolean bl = false; + int i = blockPos.getY(); + int j = i + diskConfiguration.halfHeight; + int k = i - diskConfiguration.halfHeight - 1; + boolean bl2 = diskConfiguration.state.getBlock() instanceof FallingBlock; +- int l = diskConfiguration.radius.sample(context.random()); ++ int l = diskConfiguration.radius.sample(this.random); // Purpur + + for(int m = blockPos.getX() - l; m <= blockPos.getX() + l; ++m) { + for(int n = blockPos.getZ() - l; n <= blockPos.getZ() + l; ++n) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/BlockBlobFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/BlockBlobFeature.java +index fb7002cbc3a80e390f3220e1e8a8c3ad85b97b52..455d6ac2824a8a6cfa8cc89f7f108d2c855c692c 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/BlockBlobFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/BlockBlobFeature.java +@@ -16,7 +16,7 @@ public class BlockBlobFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + BlockPos blockPos = context.origin(); + WorldGenLevel worldGenLevel = context.level(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureForestRock); // Purpur + + BlockStateConfiguration blockStateConfiguration; + for(blockStateConfiguration = context.config(); blockPos.getY() > worldGenLevel.getMinBuildHeight() + 3; blockPos = blockPos.below()) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/BlockPileFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/BlockPileFeature.java +index 2cdb1f0dd3e5d184f4cf5f3807c0e76913e62be0..749577d6a8fc01cd89fef885961de2cf59145f75 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/BlockPileFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/BlockPileFeature.java +@@ -19,7 +19,7 @@ public class BlockPileFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + BlockPos blockPos = context.origin(); + WorldGenLevel worldGenLevel = context.level(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureBlockPile); // Purpur + BlockPileConfiguration blockPileConfiguration = context.config(); + if (blockPos.getY() < worldGenLevel.getMinBuildHeight() + 5) { + return false; +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/BlueIceFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/BlueIceFeature.java +index fd289d06417a96a95265f0da835b7ca868eba6b6..0c9ca3866caf870f07c6a1c84832a0efad4934a5 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/BlueIceFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/BlueIceFeature.java +@@ -19,7 +19,7 @@ public class BlueIceFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + BlockPos blockPos = context.origin(); + WorldGenLevel worldGenLevel = context.level(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureBlueIce); // Purpur + if (blockPos.getY() > worldGenLevel.getSeaLevel() - 1) { + return false; + } else if (!worldGenLevel.getBlockState(blockPos).is(Blocks.WATER) && !worldGenLevel.getBlockState(blockPos.below()).is(Blocks.WATER)) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/BonusChestFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/BonusChestFeature.java +index f0897875e9b61a9e49f0acf31fdfac6237dc32b3..47f14f5b331c925222e363ef3b42a5539c1b626f 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/BonusChestFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/BonusChestFeature.java +@@ -24,7 +24,7 @@ public class BonusChestFeature extends Feature { @Override public boolean place(FeaturePlaceContext context) { -+ // Purpur start -+ if (this.rnd == null) { -+ int seed = net.pl3x.purpur.PurpurConfig.dungeonSeed; -+ this.rnd = seed == -1 ? context.random() : new Random(seed); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureBonusChest); // Purpur + WorldGenLevel worldGenLevel = context.level(); + ChunkPos chunkPos = new ChunkPos(context.origin()); + List list = IntStream.rangeClosed(chunkPos.getMinBlockX(), chunkPos.getMaxBlockX()).boxed().collect(Collectors.toList()); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/ChorusPlantFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/ChorusPlantFeature.java +index 6640061ecc11ec3e4a0203d8d6990489fcf10729..565f32a933090360412d9c98f8945f1719a768d3 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/ChorusPlantFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/ChorusPlantFeature.java +@@ -17,7 +17,7 @@ public class ChorusPlantFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureChorusPlant); // Purpur + if (worldGenLevel.isEmptyBlock(blockPos) && worldGenLevel.getBlockState(blockPos.below()).is(Blocks.END_STONE)) { + ChorusFlowerBlock.generatePlant(worldGenLevel, blockPos, random, 8); + return true; +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/CoralClawFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/CoralClawFeature.java +index 17f603fe4508fd8b803a2e921a169eccf0d20585..76b32e7cb8ec952475a98478294806426ce5a667 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/CoralClawFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/CoralClawFeature.java +@@ -17,6 +17,14 @@ public class CoralClawFeature extends CoralFeature { + super(configCodec); + } + ++ // Purpur start ++ @Override ++ public boolean place(FeaturePlaceContext context) { ++ this.random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureCoralClaw); ++ return super.place(context); ++ } ++ // Purpur end ++ + @Override + protected boolean placeFeature(LevelAccessor world, Random random, BlockPos pos, BlockState state) { + if (!this.placeCoralBlock(world, random, pos, state)) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/CoralFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/CoralFeature.java +index 15b99d94b7d3e494a2fe4a205f9145b5fabbc125..650296b6526d06df0bca12262db90aec380d35f3 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/CoralFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/CoralFeature.java +@@ -18,9 +18,11 @@ public abstract class CoralFeature extends Feature { + super(configCodec); + } + ++ protected Random random; // Purpur ++ + @Override + public boolean place(FeaturePlaceContext context) { +- Random random = context.random(); ++ //Random random = context.random(); // Purpur + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); + BlockState blockState = BlockTags.CORAL_BLOCKS.getRandomElement(random).defaultBlockState(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/CoralMushroomFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/CoralMushroomFeature.java +index 8c2b3a037bac75fcadafd368ff8416f5de00df7f..85522d9c8ac4893aedb208b0f054ff0016808e56 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/CoralMushroomFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/CoralMushroomFeature.java +@@ -13,6 +13,14 @@ public class CoralMushroomFeature extends CoralFeature { + super(configCodec); + } + ++ // Purpur start ++ @Override ++ public boolean place(FeaturePlaceContext context) { ++ this.random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureCoralMushroom); ++ return super.place(context); ++ } ++ // Purpur end ++ + @Override + protected boolean placeFeature(LevelAccessor world, Random random, BlockPos pos, BlockState state) { + int i = random.nextInt(3) + 3; +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/CoralTreeFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/CoralTreeFeature.java +index 8d1985c96277a50c39858ee7754ed3d34d10d8cb..4cb63f98aca829154c67f354c64d7bef4af095cb 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/CoralTreeFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/CoralTreeFeature.java +@@ -16,6 +16,14 @@ public class CoralTreeFeature extends CoralFeature { + super(configCodec); + } + ++ // Purpur start ++ @Override ++ public boolean place(FeaturePlaceContext context) { ++ this.random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureCoralTree); ++ return super.place(context); ++ } ++ // Purpur end ++ + @Override + protected boolean placeFeature(LevelAccessor world, Random random, BlockPos pos, BlockState state) { + BlockPos.MutableBlockPos mutableBlockPos = pos.mutable(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/DecoratedFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/DecoratedFeature.java +index ae11f1ecf23b38b84ab09f66796d1509a21bfbd8..2d102ea80d3f8e8aad0d57626450a7f30bb6c346 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/DecoratedFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/DecoratedFeature.java +@@ -21,7 +21,7 @@ public class DecoratedFeature extends Feature { + WorldGenLevel worldGenLevel = context.level(); + DecoratedFeatureConfiguration decoratedFeatureConfiguration = context.config(); + ChunkGenerator chunkGenerator = context.chunkGenerator(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureDecorated); // Purpur + BlockPos blockPos = context.origin(); + ConfiguredFeature configuredFeature = decoratedFeatureConfiguration.feature.get(); + decoratedFeatureConfiguration.decorator.getPositions(new DecorationContext(worldGenLevel, chunkGenerator), random, blockPos).forEach((blockPosx) -> { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/DefaultFlowerFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/DefaultFlowerFeature.java +index 2bc983496d77058ecbb89d33c5614d798d321b85..4e715ba8c4cbffc681ec3c1256d286538a38bebd 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/DefaultFlowerFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/DefaultFlowerFeature.java +@@ -29,6 +29,7 @@ public class DefaultFlowerFeature extends AbstractFlowerFeature { + @Override + public boolean place(FeaturePlaceContext context) { + boolean bl = false; +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureDeltaFeature); // Purpur + WorldGenLevel worldGenLevel = context.level(); + DeltaFeatureConfiguration deltaFeatureConfiguration = context.config(); + BlockPos blockPos = context.origin(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/DiskReplaceFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/DiskReplaceFeature.java +index b29719a0af670261073ef2a1d87ca255f9de095b..a957765736a2c49a58254fb6bedbc8f961811224 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/DiskReplaceFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/DiskReplaceFeature.java +@@ -11,6 +11,8 @@ public class DiskReplaceFeature extends BaseDiskFeature { + + @Override + public boolean place(FeaturePlaceContext context) { ++ this.origin = context.origin(); // Purpur ++ this.random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureDisk); // Purpur + return !context.level().getFluidState(context.origin()).is(FluidTags.WATER) ? false : super.place(context); + } + } +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/DripstoneClusterFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/DripstoneClusterFeature.java +index eeda6ce19bef98f939a4ecd12e0e63c6bf6d3986..3f94aadc6216a83714be8af9e22ed56fb5bc1b93 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/DripstoneClusterFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/DripstoneClusterFeature.java +@@ -28,7 +28,7 @@ public class DripstoneClusterFeature extends Feature { + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel worldGenLevel = context.level(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureEndIsland); // Purpur + BlockPos blockPos = context.origin(); + float f = (float)(random.nextInt(3) + 4); + +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/Feature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/Feature.java +index 66f97b70985ed728eadcf837f25e81a256c2033b..6120409ab412c1237b44862ed1c402c855ededf0 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/Feature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/Feature.java +@@ -118,6 +118,21 @@ public abstract class Feature { + return Registry.register(Registry.FEATURE, name, feature); + } + ++ // Purpur start ++ @org.jetbrains.annotations.Nullable ++ private java.util.Random rnd; ++ ++ protected java.util.Random getRnd(java.util.Random rand, int seed) { ++ if (seed == -1) { ++ return rand; + } ++ if(this.rnd == null) { ++ this.rnd = new java.util.Random(seed); ++ } ++ return this.rnd; ++ } ++ // Purpur end ++ + public Feature(Codec configCodec) { + this.configuredCodec = configCodec.fieldOf("config").xmap((config) -> { + return new ConfiguredFeature<>(this, config); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/FossilFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/FossilFeature.java +index 5edee64e2b446f8055cae77058992e54a8b28660..fbc1af1dfe1f48be1383980b416a543e784da821 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/FossilFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/FossilFeature.java +@@ -25,7 +25,7 @@ public class FossilFeature extends Feature { + + @Override + public boolean place(FeaturePlaceContext context) { +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureFossil); // Purpur + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); + Rotation rotation = Rotation.getRandom(random); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java +index 74a0adf4adf2b701126724e08bb72fa4e8e8560a..37756eb9e84ad8d91e6ede9b6c9264b2dc8371d5 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/GeodeFeature.java +@@ -34,7 +34,7 @@ public class GeodeFeature extends Feature { + @Override + public boolean place(FeaturePlaceContext context) { + GeodeConfiguration geodeConfiguration = context.config(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureGeode); // Purpur + BlockPos blockPos = context.origin(); + WorldGenLevel worldGenLevel = context.level(); + int i = geodeConfiguration.minGenOffset; +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/GlowLichenFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/GlowLichenFeature.java +index f8e72b9e68e0ce7611005650bee24842099973a7..817c3117f1d7f0fe2d627e87444f71f8c8fd06df 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/GlowLichenFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/GlowLichenFeature.java +@@ -23,7 +23,7 @@ public class GlowLichenFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureGlowLichen); // Purpur + GlowLichenConfiguration glowLichenConfiguration = context.config(); + if (!isAirOrWater(worldGenLevel.getBlockState(blockPos))) { + return false; +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/GlowstoneFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/GlowstoneFeature.java +index df6229c8d2d8bc182d113fa1508da5a3948516e2..2a1337006f06f399dd8885c1b0380389c1dde493 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/GlowstoneFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/GlowstoneFeature.java +@@ -18,7 +18,7 @@ public class GlowstoneFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureGlowstoneBlob); // Purpur + if (!worldGenLevel.isEmptyBlock(blockPos)) { + return false; + } else { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/GrowingPlantFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/GrowingPlantFeature.java +index 6f0549c72d9fedae39da1427b6facbf938da5d3f..db22ef9d2a1529096b5b44cc76d909dfadc77e42 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/GrowingPlantFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/GrowingPlantFeature.java +@@ -17,7 +17,7 @@ public class GrowingPlantFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + LevelAccessor levelAccessor = context.level(); + GrowingPlantConfiguration growingPlantConfiguration = context.config(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureGrowingPlant); // Purpur + int i = growingPlantConfiguration.heightDistribution.getRandomValue(random).orElseThrow(IllegalStateException::new).sample(random); + BlockPos.MutableBlockPos mutableBlockPos = context.origin().mutable(); + BlockPos.MutableBlockPos mutableBlockPos2 = mutableBlockPos.mutable().move(growingPlantConfiguration.direction); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/HugeBrownMushroomFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/HugeBrownMushroomFeature.java +index 9261ca82851fb28ac17fc636bacd22cd02b1cbc5..e55594840a9cede00bc997ac667438a695acd74a 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/HugeBrownMushroomFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/HugeBrownMushroomFeature.java +@@ -15,6 +15,7 @@ public class HugeBrownMushroomFeature extends AbstractHugeMushroomFeature { + + @Override + protected void makeCap(LevelAccessor world, Random random, BlockPos start, int y, BlockPos.MutableBlockPos mutable, HugeMushroomFeatureConfiguration config) { ++ random = getRnd(random, net.pl3x.purpur.PurpurConfig.seedFeatureHugeBrownMushroom); // Purpur + int i = config.foliageRadius; + + for(int j = -i; j <= i; ++j) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/HugeFungusFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/HugeFungusFeature.java +index 44ae76882096cc6270a39754adf6070433c1e8d7..4f1cc232ec3e9a498308cf00749d7cda5ba60542 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/HugeFungusFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/HugeFungusFeature.java +@@ -24,7 +24,7 @@ public class HugeFungusFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureHugeFungus); // Purpur + ChunkGenerator chunkGenerator = context.chunkGenerator(); + HugeFungusConfiguration hugeFungusConfiguration = context.config(); + Block block = hugeFungusConfiguration.validBaseState.getBlock(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/HugeRedMushroomFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/HugeRedMushroomFeature.java +index c5e436fa3188bee2cd546a6bc59cdb6b90c5d816..27d4a21321729a52fb9879131cf413df12c1e25d 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/HugeRedMushroomFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/HugeRedMushroomFeature.java +@@ -15,6 +15,7 @@ public class HugeRedMushroomFeature extends AbstractHugeMushroomFeature { + + @Override + protected void makeCap(LevelAccessor world, Random random, BlockPos start, int y, BlockPos.MutableBlockPos mutable, HugeMushroomFeatureConfiguration config) { ++ random = getRnd(random, net.pl3x.purpur.PurpurConfig.seedFeatureHugeRedMushroom); // Purpur + for(int i = y - 3; i <= y; ++i) { + int j = i < y ? config.foliageRadius : config.foliageRadius - 1; + int k = config.foliageRadius - 2; +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/IcePatchFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/IcePatchFeature.java +index 17b03939edeb0a51fdaa4cb5313a9b8e0c81471e..d415263abda0505acd0af16724a3501a0e00f7bc 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/IcePatchFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/IcePatchFeature.java +@@ -16,14 +16,19 @@ public class IcePatchFeature extends BaseDiskFeature { + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel worldGenLevel = context.level(); +- ChunkGenerator chunkGenerator = context.chunkGenerator(); +- Random random = context.random(); +- DiskConfiguration diskConfiguration = context.config(); ++ // Purpur start ++ //ChunkGenerator chunkGenerator = context.chunkGenerator(); ++ this.random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureIcePatch); // Purpur ++ //DiskConfiguration diskConfiguration = context.config(); + // Purpur end + + BlockPos blockPos; + for(blockPos = context.origin(); worldGenLevel.isEmptyBlock(blockPos) && blockPos.getY() > worldGenLevel.getMinBuildHeight() + 2; blockPos = blockPos.below()) { + } + +- return !worldGenLevel.getBlockState(blockPos).is(Blocks.SNOW_BLOCK) ? false : super.place(new FeaturePlaceContext<>(worldGenLevel, chunkGenerator, random, blockPos, diskConfiguration)); ++ // Purpur start - lets not allocate _another_ context here... ++ this.origin = blockPos; ++ return !worldGenLevel.getBlockState(blockPos).is(Blocks.SNOW_BLOCK) ? false : super.place(context); ++ // Purpur end + } + } +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/IceSpikeFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/IceSpikeFeature.java +index a580c19c4d6f00472da0a229808c5962322e5b7f..1fbf9b071e4253b860e863d3b79dfe4079e453a4 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/IceSpikeFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/IceSpikeFeature.java +@@ -17,7 +17,7 @@ public class IceSpikeFeature extends Feature { + @Override + public boolean place(FeaturePlaceContext context) { + BlockPos blockPos = context.origin(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureIceSpike); // Purpur + + WorldGenLevel worldGenLevel; + for(worldGenLevel = context.level(); worldGenLevel.isEmptyBlock(blockPos) && blockPos.getY() > worldGenLevel.getMinBuildHeight() + 2; blockPos = blockPos.below()) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/IcebergFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/IcebergFeature.java +index c12ce0d8e4e0e3caa7cb4a17787498a546d8bcca..0726174d6e1b4c4653ae53b25e22e36fb68f4cb3 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/IcebergFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/IcebergFeature.java +@@ -22,7 +22,7 @@ public class IcebergFeature extends Feature { + BlockPos blockPos = context.origin(); + WorldGenLevel worldGenLevel = context.level(); + blockPos = new BlockPos(blockPos.getX(), context.chunkGenerator().getSeaLevel(), blockPos.getZ()); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureIceberg); // Purpur + boolean bl = random.nextDouble() > 0.7D; + BlockState blockState = (context.config()).state; + double d = random.nextDouble() * 2.0D * Math.PI; +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/KelpFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/KelpFeature.java +index ecf431bffe7da1f1a82b054213a736ad0fa17029..54a41a1536ada31402cdfe428c02492c0cc4b6fb 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/KelpFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/KelpFeature.java +@@ -20,7 +20,7 @@ public class KelpFeature extends Feature { + int i = 0; + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureKelp); // Purpur + int j = worldGenLevel.getHeight(Heightmap.Types.OCEAN_FLOOR, blockPos.getX(), blockPos.getZ()); + BlockPos blockPos2 = new BlockPos(blockPos.getX(), j, blockPos.getZ()); + if (worldGenLevel.getBlockState(blockPos2).is(Blocks.WATER)) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/LakeFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/LakeFeature.java +index f3d9fc4b64089c5f406b346f92a2bcd00e98e370..5cc88872bf2eb54bb1ac04b1b837617a096b6f4f 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/LakeFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/LakeFeature.java +@@ -25,7 +25,7 @@ public class LakeFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + BlockPos blockPos = context.origin(); + WorldGenLevel worldGenLevel = context.level(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureLake); // Purpur + + BlockStateConfiguration blockStateConfiguration; + for(blockStateConfiguration = context.config(); blockPos.getY() > worldGenLevel.getMinBuildHeight() + 5 && worldGenLevel.isEmptyBlock(blockPos); blockPos = blockPos.below()) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/LargeDripstoneFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/LargeDripstoneFeature.java +index 975e1f0fb37e1e289eba73cc6cb51adba7ba2667..523bbd94f4b83c0123873083267cf28fc64a2e33 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/LargeDripstoneFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/LargeDripstoneFeature.java +@@ -26,7 +26,7 @@ public class LargeDripstoneFeature extends Feature + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); + LargeDripstoneConfiguration largeDripstoneConfiguration = context.config(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureLargeDripstone); // Purpur + if (!DripstoneUtils.isEmptyOrWater(worldGenLevel, blockPos)) { + return false; + } else { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.java +index d36b6208077254af5f0ebed8e8ce20fd45cbb79d..d60a6e06cd5730f1efbccde71834b0f1b619b66b 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.java +@@ -34,7 +34,7 @@ public class MonsterRoomFeature extends Feature { + public boolean place(FeaturePlaceContext context) { Predicate predicate = Feature.isReplaceable(BlockTags.FEATURES_CANNOT_REPLACE.getName()); BlockPos blockPos = context.origin(); - Random random = context.random(); -+ Random random = this.rnd; // Purpur ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureMonsterRoom); // Purpur WorldGenLevel worldGenLevel = context.level(); int i = 3; int j = random.nextInt(2) + 2; +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/NetherForestVegetationFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/NetherForestVegetationFeature.java +index c8af12a5989bb8d8800927c8b2d7988a5d26614c..3f90becb14be2cfd7467596da1b85ee4c8708421 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/NetherForestVegetationFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/NetherForestVegetationFeature.java +@@ -15,7 +15,8 @@ public class NetherForestVegetationFeature extends Feature context) { +- return place(context.level(), context.random(), context.origin(), context.config(), 8, 4); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureNetherFortressVegetation); // Purpur ++ return place(context.level(), random, context.origin(), context.config(), 8, 4); // Purpur + } + + public static boolean place(LevelAccessor world, Random random, BlockPos pos, BlockPileConfiguration config, int i, int j) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/OreFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/OreFeature.java +index dbe7d624aaaa8455217a5397a66ef6964a3e210f..a6f6a5481d360f8259a0fec84be7183885937d58 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/OreFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/OreFeature.java +@@ -22,7 +22,7 @@ public class OreFeature extends Feature { + + @Override + public boolean place(FeaturePlaceContext context) { +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureOre); // Purpur + BlockPos blockPos = context.origin(); + WorldGenLevel worldGenLevel = context.level(); + OreConfiguration oreConfiguration = context.config(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/RandomBooleanSelectorFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/RandomBooleanSelectorFeature.java +index e7c0f1ae6b526e0f22bc9f9abc59e1dccc3cc063..b7fee9c4a5a3dc22e4a095d2d07b64252a83a608 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/RandomBooleanSelectorFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/RandomBooleanSelectorFeature.java +@@ -14,7 +14,7 @@ public class RandomBooleanSelectorFeature extends Feature context) { +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureRandomBooleanSelector); // Purpur + RandomBooleanFeatureConfiguration randomBooleanFeatureConfiguration = context.config(); + WorldGenLevel worldGenLevel = context.level(); + ChunkGenerator chunkGenerator = context.chunkGenerator(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/RandomPatchFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/RandomPatchFeature.java +index 8dfa0a29fdf9977d9b6dd062821effd7fba47719..22d99ef44b9dc6c0fb095ea32afb552410e59962 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/RandomPatchFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/RandomPatchFeature.java +@@ -17,7 +17,7 @@ public class RandomPatchFeature extends Feature { + @Override + public boolean place(FeaturePlaceContext context) { + RandomPatchConfiguration randomPatchConfiguration = context.config(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureRandomPatch); // Purpur + BlockPos blockPos = context.origin(); + WorldGenLevel worldGenLevel = context.level(); + BlockState blockState = randomPatchConfiguration.stateProvider.getState(random, blockPos); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/RandomSelectorFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/RandomSelectorFeature.java +index 3188de86c094f2c820e8dad3086df37f867add34..bcfd697bda3521722576e4b1fcc327971820b5e7 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/RandomSelectorFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/RandomSelectorFeature.java +@@ -15,7 +15,7 @@ public class RandomSelectorFeature extends Feature { + @Override + public boolean place(FeaturePlaceContext context) { + RandomFeatureConfiguration randomFeatureConfiguration = context.config(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureRandomSelector); // Purpur + WorldGenLevel worldGenLevel = context.level(); + ChunkGenerator chunkGenerator = context.chunkGenerator(); + BlockPos blockPos = context.origin(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/ReplaceBlobsFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/ReplaceBlobsFeature.java +index efc970a27c556c3b8da6727ffdfda71c90f12556..6634bc093a3308d3b9bd491456ac115062fba2e4 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/ReplaceBlobsFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/ReplaceBlobsFeature.java +@@ -20,7 +20,7 @@ public class ReplaceBlobsFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + ReplaceSphereConfiguration replaceSphereConfiguration = context.config(); + WorldGenLevel worldGenLevel = context.level(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureNetherrackReplaceBlobs); // Purpur + Block block = replaceSphereConfiguration.targetState.getBlock(); + BlockPos blockPos = findTarget(worldGenLevel, context.origin().mutable().clamp(Direction.Axis.Y, worldGenLevel.getMinBuildHeight() + 1, worldGenLevel.getMaxBuildHeight() - 1), block); + if (blockPos == null) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/ReplaceBlockFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/ReplaceBlockFeature.java +index 72ed95adc043ba78979ba0518d975ff57b35d5e1..513ac0f8a98ae6e1ad6e554c2dd3b16888cb9b68 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/ReplaceBlockFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/ReplaceBlockFeature.java +@@ -16,9 +16,10 @@ public class ReplaceBlockFeature extends Feature { + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); + ReplaceBlockConfiguration replaceBlockConfiguration = context.config(); ++ java.util.Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureReplaceSingleBlock); // Purpur + + for(OreConfiguration.TargetBlockState targetBlockState : replaceBlockConfiguration.targetStates) { +- if (targetBlockState.target.test(worldGenLevel.getBlockState(blockPos), context.random())) { ++ if (targetBlockState.target.test(worldGenLevel.getBlockState(blockPos), random)) { // Purpur + worldGenLevel.setBlock(blockPos, targetBlockState.state, 2); + break; + } +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/RootSystemFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/RootSystemFeature.java +index 0ca15ac28c198e96ac21208e3c6bd46377df9b3b..a0c0bd2a5173e6629aa1422efb5be79881acf440 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/RootSystemFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/RootSystemFeature.java +@@ -26,7 +26,7 @@ public class RootSystemFeature extends Feature { + if (!worldGenLevel.getBlockState(blockPos).isAir()) { + return false; + } else { +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureRootSystem); // Purpur + BlockPos blockPos2 = context.origin(); + RootSystemConfiguration rootSystemConfiguration = context.config(); + BlockPos.MutableBlockPos mutableBlockPos = blockPos2.mutable(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/ScatteredOreFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/ScatteredOreFeature.java +index eb4abeee4009c8f271c51f6c711c03b7a7360937..eb8af78c3fa6bfd960644b419c4500bd37f9a8d4 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/ScatteredOreFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/ScatteredOreFeature.java +@@ -17,7 +17,7 @@ public class ScatteredOreFeature extends Feature { + @Override + public boolean place(FeaturePlaceContext context) { + WorldGenLevel worldGenLevel = context.level(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureScatteredOre); // Purpur + OreConfiguration oreConfiguration = context.config(); + BlockPos blockPos = context.origin(); + int i = random.nextInt(oreConfiguration.size + 1); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/SeaPickleFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/SeaPickleFeature.java +index 5b1dd00cf379e07ac8770ab7b7ceb20a377fd586..415297785c83835333aef1da552cd510f2c8e4f7 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/SeaPickleFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/SeaPickleFeature.java +@@ -18,7 +18,7 @@ public class SeaPickleFeature extends Feature { + @Override + public boolean place(FeaturePlaceContext context) { + int i = 0; +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureSeaPickle); // Purpur + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); + int j = context.config().count().sample(random); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/SeagrassFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/SeagrassFeature.java +index fc5a9fba1ecfa8850d31ba68e92c537e65dbed78..f913486542f0ca35cd36eb19f25918505dd2e70a 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/SeagrassFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/SeagrassFeature.java +@@ -19,7 +19,7 @@ public class SeagrassFeature extends Feature { + @Override + public boolean place(FeaturePlaceContext context) { + boolean bl = false; +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureSeagrass); // Purpur + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); + ProbabilityFeatureConfiguration probabilityFeatureConfiguration = context.config(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/SimpleBlockFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/SimpleBlockFeature.java +index bc47bba59d4edb092ccf7e012d0ce38a9741e043..fefa21b1c967a1891d6076d30be45d4a0231b777 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/SimpleBlockFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/SimpleBlockFeature.java +@@ -17,8 +17,9 @@ public class SimpleBlockFeature extends Feature { + SimpleBlockConfiguration simpleBlockConfiguration = context.config(); + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); ++ java.util.Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureSimpleBlock); // Purpur + if ((simpleBlockConfiguration.placeOn.isEmpty() || simpleBlockConfiguration.placeOn.contains(worldGenLevel.getBlockState(blockPos.below()))) && (simpleBlockConfiguration.placeIn.isEmpty() || simpleBlockConfiguration.placeIn.contains(worldGenLevel.getBlockState(blockPos))) && (simpleBlockConfiguration.placeUnder.isEmpty() || simpleBlockConfiguration.placeUnder.contains(worldGenLevel.getBlockState(blockPos.above())))) { +- BlockState blockState = simpleBlockConfiguration.toPlace.getState(context.random(), blockPos); ++ BlockState blockState = simpleBlockConfiguration.toPlace.getState(random, blockPos); // Purpur + if (blockState.canSurvive(worldGenLevel, blockPos)) { + if (blockState.getBlock() instanceof DoublePlantBlock) { + if (!worldGenLevel.isEmptyBlock(blockPos.above())) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/SimpleRandomSelectorFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/SimpleRandomSelectorFeature.java +index 51ddafe889ebd3a78eaa31c8f32db4b2931f5a20..60eae6fb250840e689172fb639d79670c501b7bc 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/SimpleRandomSelectorFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/SimpleRandomSelectorFeature.java +@@ -14,7 +14,7 @@ public class SimpleRandomSelectorFeature extends Feature context) { +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureSimpleRandomSelector); // Purpur + SimpleRandomFeatureConfiguration simpleRandomFeatureConfiguration = context.config(); + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/SmallDripstoneFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/SmallDripstoneFeature.java +index 7fe7009538b392ccb7547d0268ac8a1a6f682270..eb8bda1c3f73c3c2727ab893daa8b00008b1c117 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/SmallDripstoneFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/SmallDripstoneFeature.java +@@ -18,7 +18,7 @@ public class SmallDripstoneFeature extends Feature + public boolean place(FeaturePlaceContext context) { + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureSmallDripstone); // Purpur + SmallDripstoneConfiguration smallDripstoneConfiguration = context.config(); + if (!DripstoneUtils.isEmptyOrWater(worldGenLevel, blockPos)) { + return false; diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/SpikeFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/SpikeFeature.java -index c03bf5bdb67b00c75f9fcfead882c4d944282244..1f71cd40b9fe5aeb118b698c9932c8a43d5ca4a5 100644 +index c03bf5bdb67b00c75f9fcfead882c4d944282244..5ad051dd62968fb861a4ed2ad5426d6429184173 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/feature/SpikeFeature.java +++ b/src/main/java/net/minecraft/world/level/levelgen/feature/SpikeFeature.java -@@ -30,22 +30,30 @@ public class SpikeFeature extends Feature { - public static final int NUMBER_OF_SPIKES = 10; - private static final int SPIKE_DISTANCE = 42; - private static final LoadingCache> SPIKE_CACHE = CacheBuilder.newBuilder().expireAfterWrite(5L, TimeUnit.MINUTES).build(new SpikeFeature.SpikeCacheLoader()); -+ private Random rnd; // Purpur - - public SpikeFeature(Codec configCodec) { - super(configCodec); +@@ -36,7 +36,8 @@ public class SpikeFeature extends Feature { } public static List getSpikesForLevel(WorldGenLevel world) { - Random random = new Random(world.getSeed()); -+ int seed = net.pl3x.purpur.PurpurConfig.endSpikeSeed; // Purpur ++ int seed = net.pl3x.purpur.PurpurConfig.seedFeatureEndSpike; // Purpur + Random random = new Random(seed == -1 ? world.getSeed() : seed); // Purpur long l = random.nextLong() & 65535L; return SPIKE_CACHE.getUnchecked(l); } - - @Override +@@ -45,7 +46,7 @@ public class SpikeFeature extends Feature { public boolean place(FeaturePlaceContext context) { -+ // Purpur start -+ if (this.rnd == null) { -+ int seed = net.pl3x.purpur.PurpurConfig.endSpikeSeed; -+ this.rnd = seed == -1 ? context.random() : new Random(seed); -+ } -+ // Purpur end SpikeConfiguration spikeConfiguration = context.config(); WorldGenLevel worldGenLevel = context.level(); - Random random = context.random(); -+ Random random = this.rnd; // Purpur ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureEndSpike); // Purpur BlockPos blockPos = context.origin(); List list = spikeConfiguration.getSpikes(); if (list.isEmpty()) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/TreeFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/TreeFeature.java +index 0be9ce0734e3ba72893a7349bb9f83a94f4af30c..2f71e80f6c9d37a97d1d03b7a1d893c825b315fa 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/TreeFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/TreeFeature.java +@@ -76,6 +76,7 @@ public class TreeFeature extends Feature { + } + + private boolean doPlace(WorldGenLevel world, Random random, BlockPos pos, BiConsumer trunkReplacer, BiConsumer foliageReplacer, TreeConfiguration config) { ++ random = getRnd(random, net.pl3x.purpur.PurpurConfig.seedFeatureTree); // Purpur + int i = config.trunkPlacer.getTreeHeight(random); + int j = config.foliagePlacer.foliageHeight(random, i, config); + int k = i - j; +@@ -88,8 +89,9 @@ public class TreeFeature extends Feature { + int m = this.getMaxFreeTreeHeight(world, i, pos, config); + if (m >= i || optionalInt.isPresent() && m >= optionalInt.getAsInt()) { + List list = config.trunkPlacer.placeTrunk(world, trunkReplacer, random, m, pos, config); ++ final Random finalrandom = random; // Purpur + list.forEach((foliageAttachment) -> { +- config.foliagePlacer.createFoliage(world, foliageReplacer, random, config, m, foliageAttachment, j, l); ++ config.foliagePlacer.createFoliage(world, foliageReplacer, finalrandom, config, m, foliageAttachment, j, l); // Purpur + }); + return true; + } else { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/TwistingVinesFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/TwistingVinesFeature.java +index c4d51a31343b92f62742506d7add2154a0b23015..799127f0bb1a91d640af6f542dbe304428a99092 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/TwistingVinesFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/TwistingVinesFeature.java +@@ -18,7 +18,8 @@ public class TwistingVinesFeature extends Feature { + + @Override + public boolean place(FeaturePlaceContext context) { +- return place(context.level(), context.random(), context.origin(), 8, 4, 8); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureTwistingVines); // Purpur ++ return place(context.level(), random, context.origin(), 8, 4, 8); // Purpur + } + + public static boolean place(LevelAccessor world, Random random, BlockPos pos, int horizontalSpread, int verticalSpread, int length) { +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/UnderwaterMagmaFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/UnderwaterMagmaFeature.java +index bd5466e532dc0f1b5a1df3bff3144d0bf7ff25f3..661680aa501dd57a228b7c4447969223592c88a8 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/UnderwaterMagmaFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/UnderwaterMagmaFeature.java +@@ -26,7 +26,7 @@ public class UnderwaterMagmaFeature extends Feature context) { ++ // Purpur start ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureVegetationPatch); ++ return place0(context, random); ++ } ++ protected boolean place0(FeaturePlaceContext context, Random random) { ++ // Purpur end + WorldGenLevel worldGenLevel = context.level(); + VegetationPatchConfiguration vegetationPatchConfiguration = context.config(); +- Random random = context.random(); ++ //Random random = context.random(); // Purpur + BlockPos blockPos = context.origin(); + Predicate predicate = getReplaceableTag(vegetationPatchConfiguration); + int i = vegetationPatchConfiguration.xzRadius.sample(random) + 1; +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/WaterloggedVegetationPatchFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/WaterloggedVegetationPatchFeature.java +index 62506ae3a49b0507d2d492da3a9baf96fea64a25..565e74a8314357a8e6e1a89c830011868d28c2a2 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/WaterloggedVegetationPatchFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/WaterloggedVegetationPatchFeature.java +@@ -19,6 +19,14 @@ public class WaterloggedVegetationPatchFeature extends VegetationPatchFeature { + super(configCodec); + } + ++ // Purpur start ++ @Override ++ public boolean place(FeaturePlaceContext context) { ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureWaterloggedVegetationPatch); // Purpur ++ return place0(context, random); ++ } ++ // Purpur end ++ + @Override + protected Set placeGroundPatch(WorldGenLevel world, VegetationPatchConfiguration config, Random random, BlockPos pos, Predicate replaceable, int radiusX, int radiusZ) { + Set set = super.placeGroundPatch(world, config, random, pos, replaceable, radiusX, radiusZ); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/feature/WeepingVinesFeature.java b/src/main/java/net/minecraft/world/level/levelgen/feature/WeepingVinesFeature.java +index ed3944a60d09495eb424dd11d00e8c3585177d51..fcf25cc905ece0213a0eb6365a0a57566ad29c9c 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/feature/WeepingVinesFeature.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/feature/WeepingVinesFeature.java +@@ -23,7 +23,7 @@ public class WeepingVinesFeature extends Feature { + public boolean place(FeaturePlaceContext context) { + WorldGenLevel worldGenLevel = context.level(); + BlockPos blockPos = context.origin(); +- Random random = context.random(); ++ Random random = getRnd(context.random(), net.pl3x.purpur.PurpurConfig.seedFeatureWeepingVines); // Purpur + if (!worldGenLevel.isEmptyBlock(blockPos)) { + return false; + } else { diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index fa1af3c9da4fee4c529113b30f652c3243e73635..4102856324b9f5bd683175c0662309366fe9e3c8 100644 +index 12915ecd4ade052427afc673e067f3a8bdac4fd9..66e91f78b49825615ef3761827903402ad7b1475 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -1,5 +1,6 @@ @@ -109,21 +845,130 @@ index fa1af3c9da4fee4c529113b30f652c3243e73635..4102856324b9f5bd683175c066230936 import com.google.common.base.Throwables; import net.minecraft.server.MinecraftServer; import net.pl3x.purpur.command.PurpurCommand; -@@ -147,6 +148,19 @@ public class PurpurConfig { +@@ -147,6 +148,128 @@ public class PurpurConfig { pingCommandOutput = getString("settings.messages.ping-command-output", pingCommandOutput); } -+ public static int dungeonSeed = -1; -+ public static int endSpikeSeed = -1; -+ public static int geodeSeed = -1; ++ public static int seedFeatureBamboo = -1; ++ public static int seedFeatureBasaltColumns = -1; ++ public static int seedFeatureBasaltPillar = -1; ++ public static int seedFeatureBlockPile = -1; ++ public static int seedFeatureBlueIce = -1; ++ public static int seedFeatureBonusChest = -1; ++ public static int seedFeatureChorusPlant = -1; ++ public static int seedFeatureCoralClaw = -1; ++ public static int seedFeatureCoralMushroom = -1; ++ public static int seedFeatureCoralTree = -1; ++ public static int seedFeatureDecorated = -1; ++ public static int seedFeatureDeltaFeature = -1; ++ public static int seedFeatureDisk = -1; ++ public static int seedFeatureDripstoneCluster = -1; ++ public static int seedFeatureEndIsland = -1; ++ public static int seedFeatureEndSpike = -1; ++ public static int seedFeatureFlower = -1; ++ public static int seedFeatureForestRock = -1; ++ public static int seedFeatureFossil = -1; ++ public static int seedFeatureGeode = -1; ++ public static int seedFeatureGlowLichen = -1; ++ public static int seedFeatureGlowstoneBlob = -1; ++ public static int seedFeatureGrowingPlant = -1; ++ public static int seedFeatureHugeBrownMushroom = -1; ++ public static int seedFeatureHugeFungus = -1; ++ public static int seedFeatureHugeRedMushroom = -1; ++ public static int seedFeatureIcePatch = -1; ++ public static int seedFeatureIceSpike = -1; ++ public static int seedFeatureIceberg = -1; ++ public static int seedFeatureKelp = -1; ++ public static int seedFeatureLake = -1; ++ public static int seedFeatureLargeDripstone = -1; ++ public static int seedFeatureMonsterRoom = -1; ++ public static int seedFeatureNetherFortressVegetation = -1; ++ public static int seedFeatureNetherrackReplaceBlobs = -1; ++ public static int seedFeatureOre = -1; ++ public static int seedFeatureRandomBooleanSelector = -1; ++ public static int seedFeatureRandomPatch = -1; ++ public static int seedFeatureRandomSelector = -1; ++ public static int seedFeatureReplaceSingleBlock = -1; ++ public static int seedFeatureRootSystem = -1; ++ public static int seedFeatureScatteredOre = -1; ++ public static int seedFeatureSeaPickle = -1; ++ public static int seedFeatureSeagrass = -1; ++ public static int seedFeatureSimpleBlock = -1; ++ public static int seedFeatureSimpleRandomSelector = -1; ++ public static int seedFeatureSmallDripstone = -1; ++ public static int seedFeatureTree = -1; ++ public static int seedFeatureTwistingVines = -1; ++ public static int seedFeatureUnderwaterMagma = -1; ++ public static int seedFeatureVegetationPatch = -1; ++ public static int seedFeatureWaterloggedVegetationPatch = -1; ++ public static int seedFeatureWeepingVines = -1; + private static void seedSettings() { -+ dungeonSeed = getInt("settings.seed.dungeon", dungeonSeed); -+ endSpikeSeed = getInt("settings.seed.end-spike", endSpikeSeed); -+ geodeSeed = getInt("settings.seed.geode", geodeSeed); ++ if (version < 14) { ++ int oldValue = getInt("settings.seed.dungeon", -1); ++ set("settings.seed.feature.monster_room", oldValue); ++ set("settings.seed.dungeon", null); ++ oldValue = getInt("settings.seed.end-spike", -1); ++ set("settings.seed.feature.end_spike", oldValue); ++ set("settings.seed.end-spike", null); ++ oldValue = getInt("settings.seed.geode", -1); ++ set("settings.seed.feature.geode", oldValue); ++ set("settings.seed.geode", null); ++ } ++ seedFeatureBamboo = getInt("settings.seed.feature.bamboo", seedFeatureBamboo); ++ seedFeatureBasaltColumns = getInt("settings.seed.feature.basalt_columns", seedFeatureBasaltColumns); ++ seedFeatureBasaltPillar = getInt("settings.seed.feature.basalt_pillar", seedFeatureBasaltPillar); ++ seedFeatureBlockPile = getInt("settings.seed.feature.block_pile", seedFeatureBlockPile); ++ seedFeatureBlueIce = getInt("settings.seed.feature.blue_ice", seedFeatureBlueIce); ++ seedFeatureBonusChest = getInt("settings.seed.feature.bonus_chest", seedFeatureBonusChest); ++ seedFeatureChorusPlant = getInt("settings.seed.feature.chorus_plant", seedFeatureChorusPlant); ++ seedFeatureCoralClaw = getInt("settings.seed.feature.coral_claw", seedFeatureCoralClaw); ++ seedFeatureCoralMushroom = getInt("settings.seed.feature.coral_mushroom", seedFeatureCoralMushroom); ++ seedFeatureCoralTree = getInt("settings.seed.feature.coral_tree", seedFeatureCoralTree); ++ seedFeatureDecorated = getInt("settings.seed.feature.decorated", seedFeatureDecorated); ++ seedFeatureDeltaFeature = getInt("settings.seed.feature.delta_feature", seedFeatureDeltaFeature); ++ seedFeatureDisk = getInt("settings.seed.feature.disk", seedFeatureDisk); ++ seedFeatureDripstoneCluster = getInt("settings.seed.feature.dripstone_cluster", seedFeatureDripstoneCluster); ++ seedFeatureEndIsland = getInt("settings.seed.feature.end_island", seedFeatureEndIsland); ++ seedFeatureEndSpike = getInt("settings.seed.feature.end_spike", seedFeatureEndSpike); ++ seedFeatureFlower = getInt("settings.seed.feature.flower", seedFeatureFlower); ++ seedFeatureForestRock = getInt("settings.seed.feature.forest_rock", seedFeatureForestRock); ++ seedFeatureFossil = getInt("settings.seed.feature.fossil", seedFeatureFossil); ++ seedFeatureGeode = getInt("settings.seed.feature.geode", seedFeatureGeode); ++ seedFeatureGlowLichen = getInt("settings.seed.feature.glow_lichen", seedFeatureGlowLichen); ++ seedFeatureGlowstoneBlob = getInt("settings.seed.feature.glowstone_blob", seedFeatureGlowstoneBlob); ++ seedFeatureGrowingPlant = getInt("settings.seed.feature.growing_plant", seedFeatureGrowingPlant); ++ seedFeatureHugeBrownMushroom = getInt("settings.seed.feature.huge_brown_mushroom", seedFeatureHugeBrownMushroom); ++ seedFeatureHugeFungus = getInt("settings.seed.feature.huge_fungus", seedFeatureHugeFungus); ++ seedFeatureHugeRedMushroom = getInt("settings.seed.feature.huge_red_mushroom", seedFeatureHugeRedMushroom); ++ seedFeatureIcePatch = getInt("settings.seed.feature.ice_patch", seedFeatureIcePatch); ++ seedFeatureIceSpike = getInt("settings.seed.feature.ice_spike", seedFeatureIceSpike); ++ seedFeatureIceberg = getInt("settings.seed.feature.iceberg", seedFeatureIceberg); ++ seedFeatureKelp = getInt("settings.seed.feature.kelp", seedFeatureKelp); ++ seedFeatureLake = getInt("settings.seed.feature.lake", seedFeatureLake); ++ seedFeatureLargeDripstone = getInt("settings.seed.feature.large_dripstone", seedFeatureLargeDripstone); ++ seedFeatureMonsterRoom = getInt("settings.seed.feature.monster_room", seedFeatureMonsterRoom); ++ seedFeatureNetherFortressVegetation = getInt("settings.seed.feature.nether_forest_vegetation", seedFeatureNetherFortressVegetation); ++ seedFeatureNetherrackReplaceBlobs = getInt("settings.seed.feature.netherrack_replace_blobs", seedFeatureNetherrackReplaceBlobs); ++ seedFeatureOre = getInt("settings.seed.feature.ore", seedFeatureOre); ++ seedFeatureRandomBooleanSelector = getInt("settings.seed.feature.random_boolean_selector", seedFeatureRandomBooleanSelector); ++ seedFeatureRandomPatch = getInt("settings.seed.feature.random_patch", seedFeatureRandomPatch); ++ seedFeatureRandomSelector = getInt("settings.seed.feature.random_selector", seedFeatureRandomSelector); ++ seedFeatureReplaceSingleBlock = getInt("settings.seed.feature.replace_single_block", seedFeatureReplaceSingleBlock); ++ seedFeatureRootSystem = getInt("settings.seed.feature.root_system", seedFeatureRootSystem); ++ seedFeatureScatteredOre = getInt("settings.seed.feature.scattered_ore", seedFeatureScatteredOre); ++ seedFeatureSeaPickle = getInt("settings.seed.feature.sea_pickle", seedFeatureSeaPickle); ++ seedFeatureSeagrass = getInt("settings.seed.feature.seagrass", seedFeatureSeagrass); ++ seedFeatureSimpleBlock = getInt("settings.seed.feature.simple_block", seedFeatureSimpleBlock); ++ seedFeatureSimpleRandomSelector = getInt("settings.seed.feature.simple_random_selector", seedFeatureSimpleRandomSelector); ++ seedFeatureSmallDripstone = getInt("settings.seed.feature.small_dripstone", seedFeatureSmallDripstone); ++ seedFeatureTree = getInt("settings.seed.feature.tree", seedFeatureTree); ++ seedFeatureTwistingVines = getInt("settings.seed.feature.twisting_vines", seedFeatureTwistingVines); ++ seedFeatureUnderwaterMagma = getInt("settings.seed.feature.underwater_magma", seedFeatureUnderwaterMagma); ++ seedFeatureVegetationPatch = getInt("settings.seed.feature.vegetation_patch", seedFeatureVegetationPatch); ++ seedFeatureWaterloggedVegetationPatch = getInt("settings.seed.feature.waterlogged_vegetation_patch", seedFeatureWaterloggedVegetationPatch); ++ seedFeatureWeepingVines = getInt("settings.seed.feature.weeping_vines", seedFeatureWeepingVines); ++ // hide these from timings report + if (!TimingsManager.hiddenConfigs.contains("settings.seed")) TimingsManager.hiddenConfigs.add("settings.seed"); -+ if (!TimingsManager.hiddenConfigs.contains("settings.seed.dungeon")) TimingsManager.hiddenConfigs.add("settings.seed.dungeon"); -+ if (!TimingsManager.hiddenConfigs.contains("settings.seed.end-spike")) TimingsManager.hiddenConfigs.add("settings.seed.end-spike"); -+ if (!TimingsManager.hiddenConfigs.contains("settings.seed.geode")) TimingsManager.hiddenConfigs.add("settings.seed.geode"); + } + public static String serverModName = "Purpur"; diff --git a/patches/server/0091-Add-option-to-disable-certain-block-updates.patch b/patches/server/0091-Add-option-to-disable-certain-block-updates.patch index 81060a168..54e6c73dd 100644 --- a/patches/server/0091-Add-option-to-disable-certain-block-updates.patch +++ b/patches/server/0091-Add-option-to-disable-certain-block-updates.patch @@ -117,10 +117,10 @@ index f8e58d9f71703139a736d93e7f1996e027a29444..d3c8fd8399629efb8bcbaf7d9a0c4334 } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 4102856324b9f5bd683175c0662309366fe9e3c8..4020c996730fb39ed8c1e40a9c235c2aaade7a27 100644 +index 66e91f78b49825615ef3761827903402ad7b1475..8aba62b764bbf9973dfdc4ca3ab0ce2d632c04a7 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -211,6 +211,15 @@ public class PurpurConfig { +@@ -320,6 +320,15 @@ public class PurpurConfig { allowWaterPlacementInTheEnd = getBoolean("settings.allow-water-placement-in-the-end", allowWaterPlacementInTheEnd); } diff --git a/patches/server/0096-Short-enderman-height.patch b/patches/server/0096-Short-enderman-height.patch index b87815507..f42d88a08 100644 --- a/patches/server/0096-Short-enderman-height.patch +++ b/patches/server/0096-Short-enderman-height.patch @@ -31,7 +31,7 @@ index 6e0b5fbf5b0d216b6b7c647d45ef37cd6b591717..5ebedd6a156b06e98aded57c817f6342 if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper start for (int i = 0; i < 64; ++i) { diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 4020c996730fb39ed8c1e40a9c235c2aaade7a27..4c5a52d848ebc37f5543988485f0330812a8ea93 100644 +index 8aba62b764bbf9973dfdc4ca3ab0ce2d632c04a7..a290d43d466929030a55674a811dd229b6a03196 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -3,6 +3,8 @@ package net.pl3x.purpur; @@ -43,7 +43,7 @@ index 4020c996730fb39ed8c1e40a9c235c2aaade7a27..4c5a52d848ebc37f5543988485f03308 import net.pl3x.purpur.command.PurpurCommand; import org.bukkit.Bukkit; import org.bukkit.command.Command; -@@ -201,6 +203,12 @@ public class PurpurConfig { +@@ -310,6 +312,12 @@ public class PurpurConfig { enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); } diff --git a/patches/server/0099-Crying-obsidian-valid-for-portal-frames.patch b/patches/server/0099-Crying-obsidian-valid-for-portal-frames.patch index 37031f729..68076f265 100644 --- a/patches/server/0099-Crying-obsidian-valid-for-portal-frames.patch +++ b/patches/server/0099-Crying-obsidian-valid-for-portal-frames.patch @@ -18,10 +18,10 @@ index c07b5d1f1ef8b5e6026c7555d476880c8802d6c5..068f1b184a3694603f564d49fa45d5ce private final LevelAccessor level; private final Direction.Axis axis; diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 4c5a52d848ebc37f5543988485f0330812a8ea93..0f75e5e0f31433391559930b017fb0913bd46bbd 100644 +index a290d43d466929030a55674a811dd229b6a03196..56e03e71b544eaf2f427cac2764f5c76b4b3acc5 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -187,6 +187,7 @@ public class PurpurConfig { +@@ -296,6 +296,7 @@ public class PurpurConfig { public static boolean barrelSixRows = false; public static boolean enderChestSixRows = false; public static boolean enderChestPermissionRows = false; @@ -29,7 +29,7 @@ index 4c5a52d848ebc37f5543988485f0330812a8ea93..0f75e5e0f31433391559930b017fb091 private static void blockSettings() { if (version < 3) { boolean oldValue = getBoolean("settings.barrel.packed-barrels", true); -@@ -201,6 +202,7 @@ public class PurpurConfig { +@@ -310,6 +311,7 @@ public class PurpurConfig { enderChestSixRows = getBoolean("settings.blocks.ender_chest.six-rows", enderChestSixRows); org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); diff --git a/patches/server/0113-Allow-infinite-and-mending-enchantments-together.patch b/patches/server/0113-Allow-infinite-and-mending-enchantments-together.patch index 2c1bf136c..0107e175d 100644 --- a/patches/server/0113-Allow-infinite-and-mending-enchantments-together.patch +++ b/patches/server/0113-Allow-infinite-and-mending-enchantments-together.patch @@ -17,10 +17,10 @@ index 3aece8245060dd1ba269c08d226c84247a6f0a83..6763d0b96c83d1b462999f525bf1f31c } } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 0f75e5e0f31433391559930b017fb0913bd46bbd..e93911c4041f8b4457f76e471f5a8e102cded339 100644 +index 56e03e71b544eaf2f427cac2764f5c76b4b3acc5..9044bde82f5f40563ffa61600348bb6ee40417a1 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -205,6 +205,16 @@ public class PurpurConfig { +@@ -314,6 +314,16 @@ public class PurpurConfig { cryingObsidianValidForPortalFrame = getBoolean("settings.blocks.crying_obsidian.valid-for-portal-frame", cryingObsidianValidForPortalFrame); } diff --git a/patches/server/0132-EMC-Configurable-disable-give-dropping.patch b/patches/server/0132-EMC-Configurable-disable-give-dropping.patch index e4f6a9d27..b9ed9a090 100644 --- a/patches/server/0132-EMC-Configurable-disable-give-dropping.patch +++ b/patches/server/0132-EMC-Configurable-disable-give-dropping.patch @@ -20,10 +20,10 @@ index a0dc380e90415de9068ea408d62a1605c82631df..60fd566f7e1499ecf2ad91216a667f12 itemStack.setCount(1); ItemEntity itemEntity2 = serverPlayer.drop(itemStack, false, false, true); // Paper - Fix duplicating /give items on item drop cancel diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index e93911c4041f8b4457f76e471f5a8e102cded339..b3c7ad62159184e324eb397f538926dcb4ce0746 100644 +index 9044bde82f5f40563ffa61600348bb6ee40417a1..639e408b7f1db13524be6a9dc10474bbecac6d2d 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -184,6 +184,11 @@ public class PurpurConfig { +@@ -293,6 +293,11 @@ public class PurpurConfig { useAlternateKeepAlive = getBoolean("settings.use-alternate-keepalive", useAlternateKeepAlive); } diff --git a/patches/server/0173-Allow-infinity-on-crossbows.patch b/patches/server/0173-Allow-infinity-on-crossbows.patch index 66dfdd4b2..ae91d5ab9 100644 --- a/patches/server/0173-Allow-infinity-on-crossbows.patch +++ b/patches/server/0173-Allow-infinity-on-crossbows.patch @@ -59,10 +59,10 @@ index 6f6106ca4d74d50a7b74b086adc96c58c7906cb6..d6417c1e77ac8823e18a179dc9f61757 public abstract boolean canEnchant(Item item); diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index b3c7ad62159184e324eb397f538926dcb4ce0746..c926650327c014d7d63b0f7ccbcdbeacd052edcc 100644 +index 639e408b7f1db13524be6a9dc10474bbecac6d2d..709cae4bc41fe18dd8e4f270729cc71191614d03 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -211,6 +211,7 @@ public class PurpurConfig { +@@ -320,6 +320,7 @@ public class PurpurConfig { } public static boolean allowInfinityMending = false; @@ -70,7 +70,7 @@ index b3c7ad62159184e324eb397f538926dcb4ce0746..c926650327c014d7d63b0f7ccbcdbeac private static void enchantmentSettings() { if (version < 5) { boolean oldValue = getBoolean("settings.enchantment.allow-infinite-and-mending-together", false); -@@ -218,6 +219,7 @@ public class PurpurConfig { +@@ -327,6 +328,7 @@ public class PurpurConfig { set("settings.enchantment.allow-infinite-and-mending-together", null); } allowInfinityMending = getBoolean("settings.enchantment.allow-infinity-and-mending-together", allowInfinityMending); diff --git a/patches/server/0179-Config-to-allow-for-unsafe-enchants.patch b/patches/server/0179-Config-to-allow-for-unsafe-enchants.patch index d0686056d..903fe8ea0 100644 --- a/patches/server/0179-Config-to-allow-for-unsafe-enchants.patch +++ b/patches/server/0179-Config-to-allow-for-unsafe-enchants.patch @@ -44,10 +44,10 @@ index 5bd25f8b8a554b965665b3f5686c14189b51f28e..4be9924556e0f447dbe6a53c2d4cb7fb this.getOrCreateTag().put(key, tag); } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index c926650327c014d7d63b0f7ccbcdbeacd052edcc..0960670278f907817a83455e242eb13935a99fc8 100644 +index 709cae4bc41fe18dd8e4f270729cc71191614d03..62d3b002da6946af256144de3c1cf29d3f8ef515 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -212,6 +212,7 @@ public class PurpurConfig { +@@ -321,6 +321,7 @@ public class PurpurConfig { public static boolean allowInfinityMending = false; public static boolean allowCrossbowInfinity = false; @@ -55,7 +55,7 @@ index c926650327c014d7d63b0f7ccbcdbeacd052edcc..0960670278f907817a83455e242eb139 private static void enchantmentSettings() { if (version < 5) { boolean oldValue = getBoolean("settings.enchantment.allow-infinite-and-mending-together", false); -@@ -220,6 +221,7 @@ public class PurpurConfig { +@@ -329,6 +330,7 @@ public class PurpurConfig { } allowInfinityMending = getBoolean("settings.enchantment.allow-infinity-and-mending-together", allowInfinityMending); allowCrossbowInfinity = getBoolean("settings.enchantment.allow-infinity-on-crossbow", allowCrossbowInfinity); diff --git a/patches/server/0184-Config-to-change-max-number-of-bees.patch b/patches/server/0184-Config-to-change-max-number-of-bees.patch index 9e9111ea2..1049690d4 100644 --- a/patches/server/0184-Config-to-change-max-number-of-bees.patch +++ b/patches/server/0184-Config-to-change-max-number-of-bees.patch @@ -18,10 +18,10 @@ index 8484e80a70129fb0358d56efab6fd54798b54e6e..ffacc4b8cc3ab8285c4131aec58e48ff public BeehiveBlockEntity(BlockPos pos, BlockState state) { super(BlockEntityType.BEEHIVE, pos, state); diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 0960670278f907817a83455e242eb13935a99fc8..92c463d374e42f53e8bd78b04ae7a298a740d351 100644 +index 62d3b002da6946af256144de3c1cf29d3f8ef515..aebb1879ec9609b6c25be680a5781b409f50a500 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -193,6 +193,7 @@ public class PurpurConfig { +@@ -302,6 +302,7 @@ public class PurpurConfig { public static boolean enderChestSixRows = false; public static boolean enderChestPermissionRows = false; public static boolean cryingObsidianValidForPortalFrame = false; @@ -29,7 +29,7 @@ index 0960670278f907817a83455e242eb13935a99fc8..92c463d374e42f53e8bd78b04ae7a298 private static void blockSettings() { if (version < 3) { boolean oldValue = getBoolean("settings.barrel.packed-barrels", true); -@@ -208,6 +209,7 @@ public class PurpurConfig { +@@ -317,6 +318,7 @@ public class PurpurConfig { org.bukkit.event.inventory.InventoryType.ENDER_CHEST.setDefaultSize(enderChestSixRows ? 54 : 27); enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); cryingObsidianValidForPortalFrame = getBoolean("settings.blocks.crying_obsidian.valid-for-portal-frame", cryingObsidianValidForPortalFrame); diff --git a/patches/server/0187-Gamemode-extra-permissions.patch b/patches/server/0187-Gamemode-extra-permissions.patch index 356a71761..f0f11f979 100644 --- a/patches/server/0187-Gamemode-extra-permissions.patch +++ b/patches/server/0187-Gamemode-extra-permissions.patch @@ -54,10 +54,10 @@ index 79f6089b934124c3309c6bee2e48b36b937252e0..dff8ef0a1a2e52792070d93685c29002 for(ServerPlayer serverPlayer : targets) { diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 92c463d374e42f53e8bd78b04ae7a298a740d351..d162f001593e284cf94e3f5f5c2800a91b185a72 100644 +index aebb1879ec9609b6c25be680a5781b409f50a500..324346d34ea7decb94700189b5e0231ca92f3d61 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -189,6 +189,11 @@ public class PurpurConfig { +@@ -298,6 +298,11 @@ public class PurpurConfig { disableGiveCommandDrops = getBoolean("settings.disable-give-dropping", disableGiveCommandDrops); } diff --git a/patches/server/0190-Configurable-broadcast-settings.patch b/patches/server/0190-Configurable-broadcast-settings.patch index ae1ed89fc..dc144d36e 100644 --- a/patches/server/0190-Configurable-broadcast-settings.patch +++ b/patches/server/0190-Configurable-broadcast-settings.patch @@ -29,7 +29,7 @@ index 177c61a306b9e07eb7aabbac664616cc23bfef5b..4775d9feb52dc899a30d34cdc0ab8414 if (scoreboardteambase.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) { this.server.getPlayerList().broadcastToTeam((Player) this, ichatbasecomponent); diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index d162f001593e284cf94e3f5f5c2800a91b185a72..6da70ade62affe4c3b4c6d34b61af487bc3e2c6a 100644 +index 324346d34ea7decb94700189b5e0231ca92f3d61..045856a67bde9eba5a1cce960b9e93e1bb5b76bb 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java @@ -150,6 +150,18 @@ public class PurpurConfig { @@ -48,6 +48,6 @@ index d162f001593e284cf94e3f5f5c2800a91b185a72..6da70ade62affe4c3b4c6d34b61af487 + deathMessageOnlyBroadcastToAffectedPlayer = getBoolean("settings.broadcasts.death.only-broadcast-to-affected-player", deathMessageOnlyBroadcastToAffectedPlayer); + } + - public static int dungeonSeed = -1; - public static int endSpikeSeed = -1; - public static int geodeSeed = -1; + public static int seedFeatureBamboo = -1; + public static int seedFeatureBasaltColumns = -1; + public static int seedFeatureBasaltPillar = -1; diff --git a/patches/server/0193-Hide-hidden-players-from-entity-selector.patch b/patches/server/0193-Hide-hidden-players-from-entity-selector.patch index 7b1ca05e5..ee0cbc865 100644 --- a/patches/server/0193-Hide-hidden-players-from-entity-selector.patch +++ b/patches/server/0193-Hide-hidden-players-from-entity-selector.patch @@ -59,10 +59,10 @@ index 0fb8f32427843f4bfd90ab88ecb3ab3e4a4fda31..f99f1ba7f912a2fd503e12c446b342a8 + // Purpur end } diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index 6da70ade62affe4c3b4c6d34b61af487bc3e2c6a..2e869dab6955691a1b0bada5251544d7f345845f 100644 +index 045856a67bde9eba5a1cce960b9e93e1bb5b76bb..2dc870397edf29c111fb5cc8a14f858f1c83672c 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -202,8 +202,10 @@ public class PurpurConfig { +@@ -311,8 +311,10 @@ public class PurpurConfig { } public static boolean commandGamemodeRequiresPermission = false; diff --git a/patches/server/0201-Make-anvil-cumulative-cost-configurable.patch b/patches/server/0201-Make-anvil-cumulative-cost-configurable.patch index 5e51832a4..f7b4af39e 100644 --- a/patches/server/0201-Make-anvil-cumulative-cost-configurable.patch +++ b/patches/server/0201-Make-anvil-cumulative-cost-configurable.patch @@ -18,10 +18,10 @@ index 2dbc71a3d76cc87e2683b8f351bd8db04481855e..44ecc27fd9bd5a02656321cf8c69bbae public void setItemName(String newItemName) { diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java -index feba60bd2e4d8bb2a23d956ca53b60ff8c493e39..fb4a745404c7b0c28f4eba8ebfdc87977a132884 100644 +index 05c219bc29db631ded5b5f48ac4d6ac0641616fb..8b5f2de46838e8c7c9e3ca6dfbd72bdbc6d82036 100644 --- a/src/main/java/net/pl3x/purpur/PurpurConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java -@@ -215,6 +215,7 @@ public class PurpurConfig { +@@ -324,6 +324,7 @@ public class PurpurConfig { public static boolean enderChestPermissionRows = false; public static boolean cryingObsidianValidForPortalFrame = false; public static int beeInsideBeeHive = 3; @@ -29,7 +29,7 @@ index feba60bd2e4d8bb2a23d956ca53b60ff8c493e39..fb4a745404c7b0c28f4eba8ebfdc8797 private static void blockSettings() { if (version < 3) { boolean oldValue = getBoolean("settings.barrel.packed-barrels", true); -@@ -231,6 +232,7 @@ public class PurpurConfig { +@@ -340,6 +341,7 @@ public class PurpurConfig { enderChestPermissionRows = getBoolean("settings.blocks.ender_chest.use-permissions-for-rows", enderChestPermissionRows); cryingObsidianValidForPortalFrame = getBoolean("settings.blocks.crying_obsidian.valid-for-portal-frame", cryingObsidianValidForPortalFrame); beeInsideBeeHive = getInt("settings.blocks.beehive.max-bees-inside", beeInsideBeeHive);