From 14fc70da2db7f629b523dac319b2d42a009d48b0 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Sat, 4 Jan 2020 11:41:38 -0600 Subject: [PATCH] Allow beehives to generate with saplings --- .../net/minecraft/server/BlockSapling.java | 3 ++ .../server/WorldGenFeatureTreeBeehive.java | 21 ++++++++++-- .../minecraft/server/WorldGenGroundBush.java | 10 +++--- .../server/WorldGenTreeAbstract.java | 2 +- .../server/WorldGenTreeProvider.java | 16 +++++++-- .../server/WorldGenTreeProviderBirch.java | 10 +++++- .../server/WorldGenTreeProviderOak.java | 33 ++++++++++++++++++- .../net/pl3x/purpur/PurpurWorldConfig.java | 5 +++ 8 files changed, 88 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockSapling.java b/src/main/java/net/minecraft/server/BlockSapling.java index 54c49e9ef9..425beb43cc 100644 --- a/src/main/java/net/minecraft/server/BlockSapling.java +++ b/src/main/java/net/minecraft/server/BlockSapling.java @@ -17,6 +17,7 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen protected static final VoxelShape b = Block.a(2.0D, 0.0D, 2.0D, 14.0D, 12.0D, 14.0D); private final WorldGenTreeProvider c; public static TreeType treeType; // CraftBukkit + public static boolean growing = false; // Purpur protected BlockSapling(WorldGenTreeProvider worldgentreeprovider, Block.Info block_info) { super(block_info); @@ -65,7 +66,9 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen if ((Integer) iblockdata.get(BlockSapling.STAGE) == 0) { worldserver.setTypeAndData(blockposition, (IBlockData) iblockdata.a((IBlockState) BlockSapling.STAGE), 4); } else { + growing = true; // Purpur this.c.a(worldserver, worldserver.getChunkProvider().getChunkGenerator(), blockposition, iblockdata, random); + growing = false; // Purpur } } diff --git a/src/main/java/net/minecraft/server/WorldGenFeatureTreeBeehive.java b/src/main/java/net/minecraft/server/WorldGenFeatureTreeBeehive.java index 4fbc53068f..e85e096cd6 100644 --- a/src/main/java/net/minecraft/server/WorldGenFeatureTreeBeehive.java +++ b/src/main/java/net/minecraft/server/WorldGenFeatureTreeBeehive.java @@ -24,6 +24,19 @@ public class WorldGenFeatureTreeBeehive extends WorldGenFeatureTree { @Override public void a(GeneratorAccess generatoraccess, Random random, List list, List list1, Set set, StructureBoundingBox structureboundingbox) { if (random.nextFloat() < this.b) { + // Purpur start + if (BlockSapling.growing) { + MinecraftServer.getServer().scheduleOnMain(() -> { + generate(generatoraccess, random, list, list1, set, structureboundingbox); + }); + } else { + generate(generatoraccess, random, list, list1, set, structureboundingbox); + } + } + } + + private void generate(GeneratorAccess generatoraccess, Random random, List list, List list1, Set set, StructureBoundingBox structureboundingbox) { + // Purpur end EnumDirection enumdirection = BlockBeehive.a[random.nextInt(BlockBeehive.a.length)]; int i = !list1.isEmpty() ? Math.max(((BlockPosition) list1.get(0)).getY() - 1, ((BlockPosition) list.get(0)).getY()) : Math.min(((BlockPosition) list.get(0)).getY() + 1 + random.nextInt(3), ((BlockPosition) list.get(list.size() - 1)).getY()); List list2 = (List) list.stream().filter((blockposition) -> { @@ -50,11 +63,15 @@ public class WorldGenFeatureTreeBeehive extends WorldGenFeatureTree { } } - } + //} // Purpur } @Override public T a(DynamicOps dynamicops) { - return (new Dynamic(dynamicops, dynamicops.createMap(ImmutableMap.of(dynamicops.createString("type"), dynamicops.createString(IRegistry.w.getKey(this.a).toString()), dynamicops.createString("probability"), dynamicops.createFloat(this.b))))).getValue(); + // Purpur start - decompile error + ImmutableMap.Builder builder = ImmutableMap.builder(); + builder.put(dynamicops.createString("type"), dynamicops.createString(IRegistry.w.getKey(this.a).toString())).put(dynamicops.createString("probability"), dynamicops.createFloat(this.b)); + return (new Dynamic(dynamicops, dynamicops.createMap(builder.build()))).getValue(); + // Purpur end } } diff --git a/src/main/java/net/minecraft/server/WorldGenGroundBush.java b/src/main/java/net/minecraft/server/WorldGenGroundBush.java index bd756fd201..815ec6c6bb 100644 --- a/src/main/java/net/minecraft/server/WorldGenGroundBush.java +++ b/src/main/java/net/minecraft/server/WorldGenGroundBush.java @@ -38,10 +38,12 @@ public class WorldGenGroundBush extends WorldGenTreeAbstract chunkgenerator, Random random, BlockPosition blockposition, WorldGenFeatureTreeConfiguration fc) { - return super.a(generatoraccess, chunkgenerator, random, blockposition, fc); - } + //@Override + //public boolean generate(GeneratorAccess generatoraccess, ChunkGenerator chunkgenerator, Random random, BlockPosition blockposition, WorldGenFeatureTreeConfiguration fc) { + // return super.a(generatoraccess, chunkgenerator, random, blockposition, fc); + //} // CraftBukkit end + // Purpur end } diff --git a/src/main/java/net/minecraft/server/WorldGenTreeAbstract.java b/src/main/java/net/minecraft/server/WorldGenTreeAbstract.java index b7c1919ae4..0e5db4e3b2 100644 --- a/src/main/java/net/minecraft/server/WorldGenTreeAbstract.java +++ b/src/main/java/net/minecraft/server/WorldGenTreeAbstract.java @@ -117,7 +117,7 @@ public abstract class WorldGenTreeAbstract chunkgenerator, Random random, BlockPosition blockposition, T t0) { + public final boolean generate(GeneratorAccess generatoraccess, ChunkGenerator chunkgenerator, Random random, BlockPosition blockposition, T t0) { // Purpur Set set = Sets.newHashSet(); Set set1 = Sets.newHashSet(); Set set2 = Sets.newHashSet(); diff --git a/src/main/java/net/minecraft/server/WorldGenTreeProvider.java b/src/main/java/net/minecraft/server/WorldGenTreeProvider.java index 17ee097ac8..69ddae1bcc 100644 --- a/src/main/java/net/minecraft/server/WorldGenTreeProvider.java +++ b/src/main/java/net/minecraft/server/WorldGenTreeProvider.java @@ -8,11 +8,11 @@ public abstract class WorldGenTreeProvider { public WorldGenTreeProvider() {} - @Nullable - protected abstract WorldGenFeatureConfigured b(Random random); + @Nullable protected WorldGenFeatureConfigured getFeature(GeneratorAccess generatoraccess, BiomeBase biome) { return b(generatoraccess.getRandom()); } // Purpur + @Nullable protected abstract WorldGenFeatureConfigured b(Random random); public boolean a(GeneratorAccess generatoraccess, ChunkGenerator chunkgenerator, BlockPosition blockposition, IBlockData iblockdata, Random random) { - WorldGenFeatureConfigured worldgenfeatureconfigured = this.b(random); + WorldGenFeatureConfigured worldgenfeatureconfigured = getFeature(generatoraccess, generatoraccess.getBiome(blockposition)); // Purpur if (worldgenfeatureconfigured == null) { return false; @@ -65,6 +65,16 @@ public abstract class WorldGenTreeProvider { BlockSapling.treeType = TreeType.MEGA_REDWOOD; } else if (worldgentreeabstract.c == BiomeDecoratorGroups.MEGA_JUNGLE_TREE) { BlockSapling.treeType = TreeType.JUNGLE; + } else if (worldgentreeabstract.c == BiomeDecoratorGroups.k) { + BlockSapling.treeType = TreeType.TREE; + } else if (worldgentreeabstract.c == BiomeDecoratorGroups.l) { + BlockSapling.treeType = TreeType.BIG_TREE; + } else if (worldgentreeabstract.c == BiomeDecoratorGroups.m) { + BlockSapling.treeType = TreeType.TREE; + } else if (worldgentreeabstract.c == BiomeDecoratorGroups.n) { + BlockSapling.treeType = TreeType.BIG_TREE; + } else if (worldgentreeabstract.c == BiomeDecoratorGroups.o) { + BlockSapling.treeType = TreeType.BIRCH; } else { throw new IllegalArgumentException("Unknown tree generator " + worldgentreeabstract); } diff --git a/src/main/java/net/minecraft/server/WorldGenTreeProviderBirch.java b/src/main/java/net/minecraft/server/WorldGenTreeProviderBirch.java index 0915718854..55c4ec0e55 100644 --- a/src/main/java/net/minecraft/server/WorldGenTreeProviderBirch.java +++ b/src/main/java/net/minecraft/server/WorldGenTreeProviderBirch.java @@ -10,6 +10,14 @@ public class WorldGenTreeProviderBirch extends WorldGenTreeProvider { @Nullable @Override protected WorldGenFeatureConfigured b(Random random) { - return WorldGenerator.NORMAL_TREE.b((WorldGenFeatureConfiguration) BiomeDecoratorGroups.BIRCH_TREE); + return WorldGenerator.NORMAL_TREE.b(BiomeDecoratorGroups.BIRCH_TREE); // Purpur - decompile error } + + // Purpur start + @Override + protected WorldGenFeatureConfigured getFeature(GeneratorAccess generatoraccess, BiomeBase biome) { + if (!generatoraccess.getMinecraftWorld().purpurConfig.beeHivesGenerateFromSaplings) return b(generatoraccess.getRandom()); + return WorldGenerator.NORMAL_TREE.b(biome == Biomes.FLOWER_FOREST ? BiomeDecoratorGroups.o : BiomeDecoratorGroups.BIRCH_TREE); + } + // Purpur end } diff --git a/src/main/java/net/minecraft/server/WorldGenTreeProviderOak.java b/src/main/java/net/minecraft/server/WorldGenTreeProviderOak.java index 1998d19776..b9264c84c9 100644 --- a/src/main/java/net/minecraft/server/WorldGenTreeProviderOak.java +++ b/src/main/java/net/minecraft/server/WorldGenTreeProviderOak.java @@ -10,6 +10,37 @@ public class WorldGenTreeProviderOak extends WorldGenTreeProvider { @Nullable @Override protected WorldGenFeatureConfigured b(Random random) { - return random.nextInt(10) == 0 ? WorldGenerator.FANCY_TREE.b((WorldGenFeatureConfiguration) BiomeDecoratorGroups.FANCY_TREE) : WorldGenerator.NORMAL_TREE.b((WorldGenFeatureConfiguration) BiomeDecoratorGroups.NORMAL_TREE); + return random.nextInt(10) == 0 ? WorldGenerator.FANCY_TREE.b(BiomeDecoratorGroups.FANCY_TREE) : WorldGenerator.NORMAL_TREE.b(BiomeDecoratorGroups.NORMAL_TREE); // Purpur - decompile error } + + // Purpur start + @Override + protected WorldGenFeatureConfigured getFeature(GeneratorAccess generatoraccess, BiomeBase biome) { + if (!generatoraccess.getMinecraftWorld().purpurConfig.beeHivesGenerateFromSaplings) return b(generatoraccess.getRandom()); + boolean fancy = generatoraccess.getRandom().nextInt(10) == 0; + boolean more = biome == Biomes.PLAINS || biome == Biomes.SUNFLOWER_PLAINS; + boolean bees = more || biome == Biomes.FLOWER_FOREST; + if (fancy) { + if (bees) { + if (more) { + return WorldGenerator.FANCY_TREE.b(BiomeDecoratorGroups.l); + } else { + return WorldGenerator.FANCY_TREE.b(BiomeDecoratorGroups.n); + } + } else { + return WorldGenerator.FANCY_TREE.b(BiomeDecoratorGroups.FANCY_TREE); + } + } else { + if (bees) { + if (more) { + return WorldGenerator.NORMAL_TREE.b(BiomeDecoratorGroups.k); + } else { + return WorldGenerator.NORMAL_TREE.b(BiomeDecoratorGroups.m); + } + } else { + return WorldGenerator.NORMAL_TREE.b(BiomeDecoratorGroups.NORMAL_TREE); + } + } + } + // Purpur end } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java index 57fbb298d3..340697ae53 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -144,6 +144,11 @@ public class PurpurWorldConfig { milkCuresBadOmen = getBoolean("milk-cures-bad-omen", milkCuresBadOmen); } + public boolean beeHivesGenerateFromSaplings = false; + private void beehiveSettings() { + beeHivesGenerateFromSaplings = getBoolean("beehive.can-generate-from-saplings", beeHivesGenerateFromSaplings); + } + public boolean hayBlockFallDamage = true; private void hayBlockFallDamage() { hayBlockFallDamage = getBoolean("hay-block-fall-damage", hayBlockFallDamage); -- 2.24.0