From 8aee4c3f563f8a6e5e2f5b3233c25097487bf6c4 Mon Sep 17 00:00:00 2001 From: zml2008 Date: Tue, 13 Mar 2012 19:38:39 -0700 Subject: [PATCH] [Bleeding] Added support for all TreeType entries to CraftWorld.generateTree(). Addresses BUKKIT-1161 --- .../net/minecraft/server/BlockMushroom.java | 3 +- .../net/minecraft/server/BlockSapling.java | 4 +-- .../minecraft/server/WorldGenGroundBush.java | 7 ++-- .../server/WorldGenHugeMushroom.java | 20 +++++++---- .../minecraft/server/WorldGenSwampTree.java | 10 ++++-- .../net/minecraft/server/WorldGenTrees.java | 4 +-- .../net/minecraft/server/WorldGenerator.java | 2 +- .../org/bukkit/craftbukkit/CraftWorld.java | 36 ++++++++++++++++--- .../util/StructureGrowDelegate.java | 8 +++++ 9 files changed, 71 insertions(+), 23 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockMushroom.java b/src/main/java/net/minecraft/server/BlockMushroom.java index 8a90307068..337d308103 100644 --- a/src/main/java/net/minecraft/server/BlockMushroom.java +++ b/src/main/java/net/minecraft/server/BlockMushroom.java @@ -3,6 +3,7 @@ package net.minecraft.server; import java.util.ArrayList; import java.util.Random; // CraftBukkit start +import org.bukkit.BlockChangeDelegate; import org.bukkit.Location; import org.bukkit.TreeType; import org.bukkit.block.BlockState; @@ -109,7 +110,7 @@ public class BlockMushroom extends BlockFlower { worldgenhugemushroom = new WorldGenHugeMushroom(1); } if (worldgenhugemushroom != null && event != null) { - grown = worldgenhugemushroom.grow(world, random, i, j, k, event, itemstack, world.getWorld()); + grown = worldgenhugemushroom.grow((BlockChangeDelegate)world, random, i, j, k, event, itemstack, world.getWorld()); if (event.isFromBonemeal() && itemstack != null) { --itemstack.count; } diff --git a/src/main/java/net/minecraft/server/BlockSapling.java b/src/main/java/net/minecraft/server/BlockSapling.java index 3f437bead3..67e727c7ba 100644 --- a/src/main/java/net/minecraft/server/BlockSapling.java +++ b/src/main/java/net/minecraft/server/BlockSapling.java @@ -78,7 +78,7 @@ public class BlockSapling extends BlockFlower { if (gen == null) { j1 = 0; i1 = 0; - treeType = TreeType.TREE; + treeType = TreeType.SMALL_JUNGLE; gen = new WorldGenTrees(false, 4 + random.nextInt(7), 3, 3, false); } } else { @@ -132,7 +132,7 @@ public class BlockSapling extends BlockFlower { } // CraftBukkit start - interface TreeGenerator { + public interface TreeGenerator { public boolean a(World world, Random random, int i, int j, int k); diff --git a/src/main/java/net/minecraft/server/WorldGenGroundBush.java b/src/main/java/net/minecraft/server/WorldGenGroundBush.java index 3b21c52ffc..632266486b 100644 --- a/src/main/java/net/minecraft/server/WorldGenGroundBush.java +++ b/src/main/java/net/minecraft/server/WorldGenGroundBush.java @@ -4,7 +4,7 @@ import java.util.Random; import org.bukkit.BlockChangeDelegate; // CraftBukkit -public class WorldGenGroundBush extends WorldGenerator { +public class WorldGenGroundBush extends WorldGenerator implements BlockSapling.TreeGenerator { // CraftBukkit - add interface private int a; private int b; @@ -49,8 +49,11 @@ public class WorldGenGroundBush extends WorldGenerator { } } } + // CraftBukkit start - return false if gen was unsuccessful + } else { + return false; } - + // CraftBukkit end return true; } } diff --git a/src/main/java/net/minecraft/server/WorldGenHugeMushroom.java b/src/main/java/net/minecraft/server/WorldGenHugeMushroom.java index 0873320bbd..23230713c9 100644 --- a/src/main/java/net/minecraft/server/WorldGenHugeMushroom.java +++ b/src/main/java/net/minecraft/server/WorldGenHugeMushroom.java @@ -2,6 +2,7 @@ package net.minecraft.server; import java.util.Random; // CraftBukkit start +import org.bukkit.BlockChangeDelegate; import org.bukkit.Bukkit; import org.bukkit.block.BlockState; import org.bukkit.craftbukkit.CraftWorld; @@ -9,7 +10,7 @@ import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.material.MaterialData; // CraftBukkit end -public class WorldGenHugeMushroom extends WorldGenerator { +public class WorldGenHugeMushroom extends WorldGenerator implements BlockSapling.TreeGenerator { // CraftBukkit - add interface private int a = -1; @@ -22,12 +23,16 @@ public class WorldGenHugeMushroom extends WorldGenerator { super(false); } - // CraftBukkit start - delegate to grow() + // CraftBukkit start - delegate to generate() and use BlockChangeDelegate public boolean a(World world, Random random, int i, int j, int k) { + return grow((BlockChangeDelegate) world, random, i, j, k, null, null, null); + } + + public boolean generate(BlockChangeDelegate world, Random random, int i, int j, int k) { return grow(world, random, i, j, k, null, null, null); } - public boolean grow(World world, Random random, int i, int j, int k, StructureGrowEvent event, ItemStack itemstack, CraftWorld bukkitWorld) { + public boolean grow(BlockChangeDelegate world, Random random, int i, int j, int k, StructureGrowEvent event, ItemStack itemstack, CraftWorld bukkitWorld) { // CraftBukkit end int l = random.nextInt(2); @@ -71,12 +76,13 @@ public class WorldGenHugeMushroom extends WorldGenerator { j1 = world.getTypeId(i, j - 1, k); if (j1 != Block.DIRT.id && j1 != Block.GRASS.id && j1 != Block.MYCEL.id) { return false; - } else if (!Block.BROWN_MUSHROOM.canPlace(world, i, j, k)) { + // CraftBukkit - Adjust canPlace check to handle non-World BlockChangeDelegates (orig check was: !Block.BROWN_MUSHROOM.canPlace(world, i, j, k)) + } else if ((world.getTypeId(i, j, k) != 0 && !Block.byId[world.getTypeId(i, j, k)].material.isReplacable()) || (world instanceof World && !Block.BROWN_MUSHROOM.canPlace((World) world, i, j, k))) { return false; } else { // CraftBukkit start if (event == null) { - world.setRawTypeIdAndData(i, j - 1, k, Block.DIRT.id, 0); + this.setTypeAndData(world, i, j - 1, k, Block.DIRT.id, 0); } else { BlockState dirtState = bukkitWorld.getBlockAt(i, j - 1, k).getState(); dirtState.setTypeId(Block.DIRT.id); @@ -164,7 +170,7 @@ public class WorldGenHugeMushroom extends WorldGenerator { if ((l2 != 0 || j >= j + i1 - 1) && !Block.n[world.getTypeId(i2, k1, k2)]) { // CraftBukkit start if (event == null) { - world.setRawTypeIdAndData(i2, k1, k2, Block.BIG_MUSHROOM_1.id + l, l2); + this.setTypeAndData(world, i2, k1, k2, Block.BIG_MUSHROOM_1.id + l, l2); } else { BlockState state = bukkitWorld.getBlockAt(i2, k1, k2).getState(); state.setTypeId(Block.BIG_MUSHROOM_1.id + l); @@ -182,7 +188,7 @@ public class WorldGenHugeMushroom extends WorldGenerator { if (!Block.n[l1]) { // CraftBukkit start if (event == null) { - world.setRawTypeIdAndData(i, j + k1, k, Block.BIG_MUSHROOM_1.id + l, 10); + this.setTypeAndData(world, i, j + k1, k, Block.BIG_MUSHROOM_1.id + l, 10); } else { BlockState state = bukkitWorld.getBlockAt(i, j + k1, k).getState(); state.setTypeId(Block.BIG_MUSHROOM_1.id + l); diff --git a/src/main/java/net/minecraft/server/WorldGenSwampTree.java b/src/main/java/net/minecraft/server/WorldGenSwampTree.java index ae4f544643..aac4c0351f 100644 --- a/src/main/java/net/minecraft/server/WorldGenSwampTree.java +++ b/src/main/java/net/minecraft/server/WorldGenSwampTree.java @@ -2,14 +2,18 @@ package net.minecraft.server; import java.util.Random; -public class WorldGenSwampTree extends WorldGenerator { +public class WorldGenSwampTree extends WorldGenerator implements BlockSapling.TreeGenerator { // CraftBukkit - add interface public WorldGenSwampTree() {} public boolean a(World world, Random random, int i, int j, int k) { + return generate((org.bukkit.BlockChangeDelegate) world, random, i, j, k); + } + + public boolean generate(org.bukkit.BlockChangeDelegate world, Random random, int i, int j, int k) { int l; - for (l = random.nextInt(4) + 5; world.getMaterial(i, j - 1, k) == Material.WATER; --j) { + for (l = random.nextInt(4) + 5; world.getTypeId(i, j - 1, k) != 0 && Block.byId[world.getTypeId(i, j - 1, k)].material == Material.WATER; --j) { // CraftBukkit - bypass World.getMaterial ; } @@ -121,7 +125,7 @@ public class WorldGenSwampTree extends WorldGenerator { } } - private void a(World world, int i, int j, int k, int l) { + private void a(org.bukkit.BlockChangeDelegate world, int i, int j, int k, int l) { // CraftBukkit - change signature world.setTypeIdAndData(i, j, k, Block.VINE.id, l); int i1 = 4; diff --git a/src/main/java/net/minecraft/server/WorldGenTrees.java b/src/main/java/net/minecraft/server/WorldGenTrees.java index bc8f8facbb..f62ab02ccd 100644 --- a/src/main/java/net/minecraft/server/WorldGenTrees.java +++ b/src/main/java/net/minecraft/server/WorldGenTrees.java @@ -162,7 +162,7 @@ public class WorldGenTrees extends WorldGenerator implements BlockSapling.TreeGe // CraftBukkit - Changed world to BlockChangeDelegate private void a(BlockChangeDelegate world, int i, int j, int k, int l) { - ((World)world).setTypeIdAndData(i, j, k, Block.VINE.id, l); // CraftBukkit - Cast + world.setTypeIdAndData(i, j, k, Block.VINE.id, l); int i1 = 4; while (true) { @@ -171,7 +171,7 @@ public class WorldGenTrees extends WorldGenerator implements BlockSapling.TreeGe return; } - ((World)world).setRawTypeIdAndData(i, j, k, Block.VINE.id, l); // CraftBukkit - Cast + world.setTypeIdAndData(i, j, k, Block.VINE.id, l); --i1; } } diff --git a/src/main/java/net/minecraft/server/WorldGenerator.java b/src/main/java/net/minecraft/server/WorldGenerator.java index 1a3ad0bc7e..ae9b7ca626 100644 --- a/src/main/java/net/minecraft/server/WorldGenerator.java +++ b/src/main/java/net/minecraft/server/WorldGenerator.java @@ -23,7 +23,7 @@ public abstract class WorldGenerator { // CraftBukkit - change signature protected void setTypeAndData(BlockChangeDelegate world, int i, int j, int k, int l, int i1) { if (this.a) { - ((World) world).setTypeIdAndData(i, j, k, l, i1); // CraftBukkit - force-cast to world to get it working + world.setTypeIdAndData(i, j, k, l, i1); } else { world.setRawTypeIdAndData(i, j, k, l, i1); } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 2c41ba892f..25967d9126 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -369,19 +369,45 @@ public class CraftWorld implements World { } public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { + BlockSapling.TreeGenerator gen; switch (type) { case BIG_TREE: - return new WorldGenBigTree(false).generate(delegate, rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + gen = new WorldGenBigTree(true); + break; case BIRCH: - return new WorldGenForest(false).generate(delegate, rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + gen = new WorldGenForest(true); + break; case REDWOOD: - return new WorldGenTaiga2(false).generate(delegate, rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + gen = new WorldGenTaiga2(true); + break; case TALL_REDWOOD: - return new WorldGenTaiga1().generate(delegate, rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + gen = new WorldGenTaiga1(); + break; + case JUNGLE: + gen = new WorldGenMegaTree(true, 10 + rand.nextInt(20), 3, 3); + break; + case SMALL_JUNGLE: + gen = new WorldGenTrees(true, 4 + rand.nextInt(7), 3, 3, false); + break; + case JUNGLE_BUSH: + gen = new WorldGenGroundBush(3, 0); + break; + case RED_MUSHROOM: + gen = new WorldGenHugeMushroom(1); + break; + case BROWN_MUSHROOM: + gen = new WorldGenHugeMushroom(0); + break; + case SWAMP: + gen = new WorldGenSwampTree(); + break; case TREE: default: - return new WorldGenTrees(false).generate(delegate, rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + gen = new WorldGenTrees(true); + break; } + + return gen.generate(delegate, rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); } public TileEntity getTileEntityAt(final int x, final int y, final int z) { diff --git a/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java b/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java index f7bab681d5..6566b9e0c7 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java +++ b/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java @@ -30,6 +30,14 @@ public class StructureGrowDelegate implements BlockChangeDelegate { return true; } + public boolean setTypeId(int x, int y, int z, int typeId) { + return setRawTypeId(x, y, z, typeId); + } + + public boolean setTypeIdAndData(int x, int y, int z, int typeId, int data) { + return setRawTypeIdAndData(x, y, z, typeId, data); + } + public int getTypeId(int x, int y, int z) { return world.getBlockTypeIdAt(x, y, z); }