summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/main/java/net/minecraft/server/BlockMushroom.java30
-rw-r--r--src/main/java/net/minecraft/server/BlockSapling.java89
-rw-r--r--src/main/java/net/minecraft/server/Chunk.java9
-rw-r--r--src/main/java/net/minecraft/server/ItemBed.java61
-rw-r--r--src/main/java/net/minecraft/server/ItemBlock.java138
-rw-r--r--src/main/java/net/minecraft/server/ItemDoor.java106
-rw-r--r--src/main/java/net/minecraft/server/ItemDye.java34
-rw-r--r--src/main/java/net/minecraft/server/ItemFireball.java12
-rw-r--r--src/main/java/net/minecraft/server/ItemHoe.java46
-rw-r--r--src/main/java/net/minecraft/server/ItemRedstone.java57
-rw-r--r--src/main/java/net/minecraft/server/ItemReed.java68
-rw-r--r--src/main/java/net/minecraft/server/ItemSeedFood.java35
-rw-r--r--src/main/java/net/minecraft/server/ItemSeeds.java35
-rw-r--r--src/main/java/net/minecraft/server/ItemSign.java72
-rw-r--r--src/main/java/net/minecraft/server/ItemSkull.java118
-rw-r--r--src/main/java/net/minecraft/server/ItemSnow.java38
-rw-r--r--src/main/java/net/minecraft/server/ItemStack.java87
-rw-r--r--src/main/java/net/minecraft/server/ItemStep.java100
-rw-r--r--src/main/java/net/minecraft/server/ItemWaterLily.java8
-rw-r--r--src/main/java/net/minecraft/server/World.java114
-rw-r--r--src/main/java/net/minecraft/server/WorldGenAcaciaTree.java169
-rw-r--r--src/main/java/net/minecraft/server/WorldGenBigTree.java16
-rw-r--r--src/main/java/net/minecraft/server/WorldGenForest.java109
-rw-r--r--src/main/java/net/minecraft/server/WorldGenForestTree.java175
-rw-r--r--src/main/java/net/minecraft/server/WorldGenGroundBush.java9
-rw-r--r--src/main/java/net/minecraft/server/WorldGenHugeMushroom.java215
-rw-r--r--src/main/java/net/minecraft/server/WorldGenJungleTree.java124
-rw-r--r--src/main/java/net/minecraft/server/WorldGenMegaTree.java124
-rw-r--r--src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java17
-rw-r--r--src/main/java/net/minecraft/server/WorldGenSwampTree.java151
-rw-r--r--src/main/java/net/minecraft/server/WorldGenTaiga1.java101
-rw-r--r--src/main/java/net/minecraft/server/WorldGenTaiga2.java114
-rw-r--r--src/main/java/net/minecraft/server/WorldGenTrees.java190
-rw-r--r--src/main/java/net/minecraft/server/WorldGenerator.java50
-rw-r--r--src/main/java/net/minecraft/server/WorldServer.java22
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftBlockChangeDelegate.java35
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftWorld.java38
-rw-r--r--src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java21
-rw-r--r--src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java21
39 files changed, 323 insertions, 2635 deletions
diff --git a/src/main/java/net/minecraft/server/BlockMushroom.java b/src/main/java/net/minecraft/server/BlockMushroom.java
index 75fe4c03..5b90eb9c 100644
--- a/src/main/java/net/minecraft/server/BlockMushroom.java
+++ b/src/main/java/net/minecraft/server/BlockMushroom.java
@@ -3,13 +3,9 @@ package net.minecraft.server;
import java.util.Random;
// CraftBukkit start
-import java.util.ArrayList;
-
-import org.bukkit.Location;
import org.bukkit.TreeType;
import org.bukkit.block.BlockState;
import org.bukkit.event.block.BlockSpreadEvent;
-import org.bukkit.event.world.StructureGrowEvent;
// CraftBukkit end
public class BlockMushroom extends BlockPlant implements IBlockFragilePlantElement {
@@ -95,37 +91,25 @@ public class BlockMushroom extends BlockPlant implements IBlockFragilePlantEleme
}
}
- // CraftBukkit - added bonemeal, player and itemstack
- public boolean grow(World world, int i, int j, int k, Random random, boolean bonemeal, org.bukkit.entity.Player player, ItemStack itemstack) {
+ public boolean grow(World world, int i, int j, int k, Random random) {
int l = world.getData(i, j, k);
-
world.setAir(i, j, k);
- // CraftBukkit start
- boolean grown = false;
- StructureGrowEvent event = null;
- Location location = new Location(world.getWorld(), i, j, k);
WorldGenHugeMushroom worldgenhugemushroom = null;
if (this == Blocks.BROWN_MUSHROOM) {
- event = new StructureGrowEvent(location, TreeType.BROWN_MUSHROOM, bonemeal, player, new ArrayList<BlockState>());
+ BlockSapling.treeType = TreeType.BROWN_MUSHROOM; // CraftBukkit
worldgenhugemushroom = new WorldGenHugeMushroom(0);
} else if (this == Blocks.RED_MUSHROOM) {
- event = new StructureGrowEvent(location, TreeType.RED_MUSHROOM, bonemeal, player, new ArrayList<BlockState>());
+ BlockSapling.treeType = TreeType.RED_MUSHROOM; // CraftBukkit
worldgenhugemushroom = new WorldGenHugeMushroom(1);
}
- if (worldgenhugemushroom != null && event != null) {
- grown = worldgenhugemushroom.grow(new org.bukkit.craftbukkit.CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k, event, itemstack, world.getWorld());
- if (event.isFromBonemeal() && itemstack != null) {
- --itemstack.count;
- }
- }
- if (!grown || event.isCancelled()) {
+ if (worldgenhugemushroom != null && worldgenhugemushroom.a(world, random, i, j, k)) {
+ return true;
+ } else {
world.setTypeAndData(i, j, k, this, l, 3);
return false;
}
- return true;
- // CraftBukkit end
}
public boolean a(World world, int i, int j, int k, boolean flag) {
@@ -137,6 +121,6 @@ public class BlockMushroom extends BlockPlant implements IBlockFragilePlantEleme
}
public void b(World world, Random random, int i, int j, int k) {
- this.grow(world, i, j, k, random, false, null, null); // CraftBukkit - Add bonemeal, player, and itemstack
+ this.grow(world, i, j, k, random);
}
}
diff --git a/src/main/java/net/minecraft/server/BlockSapling.java b/src/main/java/net/minecraft/server/BlockSapling.java
index 830eb65d..ab8b07c7 100644
--- a/src/main/java/net/minecraft/server/BlockSapling.java
+++ b/src/main/java/net/minecraft/server/BlockSapling.java
@@ -3,11 +3,11 @@ package net.minecraft.server;
import java.util.Random;
// CraftBukkit start
+import java.util.List;
+
import org.bukkit.Location;
import org.bukkit.TreeType;
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate;
-import org.bukkit.craftbukkit.util.StructureGrowDelegate;
-import org.bukkit.entity.Player;
+import org.bukkit.block.BlockState;
import org.bukkit.event.world.StructureGrowEvent;
// CraftBukkit end
@@ -15,6 +15,7 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen
public static final String[] a = new String[] { "oak", "spruce", "birch", "jungle", "acacia", "roofed_oak"};
private static final IIcon[] b = new IIcon[a.length];
+ public static TreeType treeType; // CraftBukkit
protected BlockSapling() {
float f = 0.4F;
@@ -27,32 +28,50 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen
if (!world.isStatic) {
super.a(world, i, j, k, random);
if (world.getLightLevel(i, j + 1, k) >= 9 && random.nextInt(7) == 0) {
- this.grow(world, i, j, k, random, false, null, null); // CraftBukkit - added bonemeal, player and itemstack
+ // CraftBukkit start
+ world.captureTreeGeneration = true;
+ // CraftBukkit end
+ this.grow(world, i, j, k, random);
+ // CraftBukkit start
+ world.captureTreeGeneration = false;
+ if (world.capturedBlockStates.size() > 0)
+ {
+ TreeType treeType = BlockSapling.treeType;
+ BlockSapling.treeType = null;
+ Location location = new Location(world.getWorld(), i, j, k);
+ List<BlockState> blocks = (List<BlockState>) world.capturedBlockStates.clone();
+ world.capturedBlockStates.clear();
+ StructureGrowEvent event = null;
+ if (treeType != null) {
+ event = new StructureGrowEvent(location, treeType, false, null, blocks);
+ org.bukkit.Bukkit.getPluginManager().callEvent(event);
+ }
+ if (event == null || !event.isCancelled()) {
+ for (BlockState blockstate : blocks) {
+ blockstate.update(true);
+ }
+ }
+ }
+ // CraftBukkit end
}
}
}
- // CraftBukkit - added bonemeal, player and itemstack
- public void grow(World world, int i, int j, int k, Random random, boolean bonemeal, Player player, ItemStack itemstack) {
+ public void grow(World world, int i, int j, int k, Random random) {
int l = world.getData(i, j, k);
if ((l & 8) == 0) {
world.setData(i, j, k, l | 8, 4);
} else {
- this.d(world, i, j, k, random, bonemeal, player, itemstack); // CraftBukkit
+ this.d(world, i, j, k, random);
}
}
- // CraftBukkit - Added bonemeal, player and itemstack
- public void d(World world, int i, int j, int k, Random random, boolean bonemeal, Player player, ItemStack itemstack) {
+ public void d(World world, int i, int j, int k, Random random) {
int l = world.getData(i, j, k) & 7;
- // CraftBukkit start - Records tree generation and calls StructureGrowEvent
- StructureGrowDelegate delegate = new StructureGrowDelegate(world);
- TreeType treeType = null;
- boolean grownTree = false;
- // Turn ternary operator into if statement to set treeType
- //Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true);
- TreeGenerator object; // Changed to TreeGenerator
+ // CraftBukkit start - Turn ternary operator into if statement to set treeType
+ // Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true);
+ Object object;
if (random.nextInt(10) == 0) {
treeType = TreeType.BIG_TREE;
object = new WorldGenBigTree(true);
@@ -71,11 +90,11 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen
break;
case 1:
- treeType = TreeType.REDWOOD; // CraftBukkit
label78:
for (i1 = 0; i1 >= -1; --i1) {
for (j1 = 0; j1 >= -1; --j1) {
if (this.a(world, i + i1, j, k + j1, 1) && this.a(world, i + i1 + 1, j, k + j1, 1) && this.a(world, i + i1, j, k + j1 + 1, 1) && this.a(world, i + i1 + 1, j, k + j1 + 1, 1)) {
+ treeType = TreeType.TALL_REDWOOD; // CraftBukkit
object = new WorldGenMegaTree(false, random.nextBoolean());
flag = true;
break label78;
@@ -86,6 +105,7 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen
if (!flag) {
j1 = 0;
i1 = 0;
+ treeType = TreeType.REDWOOD; // CraftBukkit
object = new WorldGenTaiga2(true);
}
break;
@@ -150,29 +170,7 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen
world.setTypeAndData(i, j, k, block, 0, 4);
}
- // CraftBukkit start
- grownTree = object.generate(new CraftBlockChangeDelegate(delegate), random, i + i1, j, k + j1);
- if (grownTree) {
- Location location = new Location(world.getWorld(), i, j, k);
- StructureGrowEvent event = new StructureGrowEvent(location, treeType, bonemeal, player, delegate.getBlocks());
- org.bukkit.Bukkit.getPluginManager().callEvent(event);
- if (event.isCancelled()) {
- grownTree = false;
- } else {
- for (org.bukkit.block.BlockState state : event.getBlocks()) {
- state.update(true);
- }
- if (event.isFromBonemeal() && itemstack != null) {
- --itemstack.count;
- }
- }
- } else if (bonemeal && itemstack != null) {
- // We always consume bonemeal when trying to grow
- --itemstack.count;
- }
- // No need to generate the tree again.
- if (!grownTree) {
- // CraftBukkit end
+ if (!((WorldGenerator) object).a(world, random, i + i1, j, k + j1)) {
if (flag) {
world.setTypeAndData(i + i1, j, k + j1, this, l, 4);
world.setTypeAndData(i + i1 + 1, j, k + j1, this, l, 4);
@@ -201,15 +199,6 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen
}
public void b(World world, Random random, int i, int j, int k) {
- this.grow(world, i, j, k, random, false, null, null); // CraftBukkit - added bonemeal, player and itemstack
- }
-
- // CraftBukkit start
- public interface TreeGenerator {
-
- public boolean a(World world, Random random, int i, int j, int k);
-
- public boolean generate(org.bukkit.craftbukkit.CraftBlockChangeDelegate world, Random random, int i, int j, int k);
+ this.grow(world, i, j, k, random);
}
- // CraftBukkit end
}
diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java
index 771eab37..ade0c35b 100644
--- a/src/main/java/net/minecraft/server/Chunk.java
+++ b/src/main/java/net/minecraft/server/Chunk.java
@@ -480,17 +480,12 @@ public class Chunk {
}
}
- // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer
- if (!this.world.isStatic && (!this.world.callingPlaceEvent || (block instanceof BlockContainer))) {
+ // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled.
+ if (!this.world.isStatic && (!this.world.captureBlockStates || block instanceof BlockContainer)) {
block.onPlace(this.world, l1, j, i2);
}
if (block instanceof IContainer) {
- // CraftBukkit start - Don't create tile entity if placement failed
- if (this.getType(i, j, k) != block) {
- return false;
- }
- // CraftBukkit end
tileentity = this.e(i, j, k);
if (tileentity == null) {
diff --git a/src/main/java/net/minecraft/server/ItemBed.java b/src/main/java/net/minecraft/server/ItemBed.java
deleted file mode 100644
index 9b749bf8..00000000
--- a/src/main/java/net/minecraft/server/ItemBed.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package net.minecraft.server;
-
-public class ItemBed extends Item {
-
- public ItemBed() {
- this.a(CreativeModeTab.c);
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (world.isStatic) {
- return true;
- } else if (l != 1) {
- return false;
- } else {
- ++j;
- BlockBed blockbed = (BlockBed) Blocks.BED;
- int i1 = MathHelper.floor((double) (entityhuman.yaw * 4.0F / 360.0F) + 0.5D) & 3;
- byte b0 = 0;
- byte b1 = 0;
-
- if (i1 == 0) {
- b1 = 1;
- }
-
- if (i1 == 1) {
- b0 = -1;
- }
-
- if (i1 == 2) {
- b1 = -1;
- }
-
- if (i1 == 3) {
- b0 = 1;
- }
-
- if (entityhuman.a(i, j, k, l, itemstack) && entityhuman.a(i + b0, j, k + b1, l, itemstack)) {
- if (world.isEmpty(i, j, k) && world.isEmpty(i + b0, j, k + b1) && World.a((IBlockAccess) world, i, j - 1, k) && World.a((IBlockAccess) world, i + b0, j - 1, k + b1)) {
- // CraftBukkit start - fire BlockPlaceEvent
- // world.setTypeAndData(i, j, k, blockbed, i1, 3);
- if (!ItemBlock.processBlockPlace(world, entityhuman, null, i, j, k, blockbed, i1, clickedX, clickedY, clickedZ)) {
- return false;
- }
- // CraftBukkit end
-
- if (world.getType(i, j, k) == blockbed) {
- world.setTypeAndData(i + b0, j, k + b1, blockbed, i1 + 8, 3);
- }
-
- --itemstack.count;
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java
deleted file mode 100644
index 3cb4f839..00000000
--- a/src/main/java/net/minecraft/server/ItemBlock.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package net.minecraft.server;
-
-public class ItemBlock extends Item {
-
- protected final Block block;
-
- public ItemBlock(Block block) {
- this.block = block;
- }
-
- public ItemBlock b(String s) {
- super.c(s);
- return this;
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- Block block = world.getType(i, j, k);
-
- if (block == Blocks.SNOW && (world.getData(i, j, k) & 7) < 1) {
- l = 1;
- } else if (block != Blocks.VINE && block != Blocks.LONG_GRASS && block != Blocks.DEAD_BUSH) {
- if (l == 0) {
- --j;
- }
-
- if (l == 1) {
- ++j;
- }
-
- if (l == 2) {
- --k;
- }
-
- if (l == 3) {
- ++k;
- }
-
- if (l == 4) {
- --i;
- }
-
- if (l == 5) {
- ++i;
- }
- }
-
- if (itemstack.count == 0) {
- return false;
- } else if (!entityhuman.a(i, j, k, l, itemstack)) {
- return false;
- } else if (j == 255 && this.block.getMaterial().isBuildable()) {
- return false;
- } else if (world.mayPlace(this.block, i, j, k, false, l, entityhuman, itemstack)) {
- int i1 = this.filterData(itemstack.getData());
- int j1 = this.block.getPlacedData(world, i, j, k, l, f, f1, f2, i1);
-
- // CraftBukkit start - Redirect to common function handler
- /*
- if (world.setTypeAndData(i, j, k, this.block, j1, 3)) {
- if (world.getType(i, j, k) == this.block) {
- this.block.postPlace(world, i, j, k, entityhuman, itemstack);
- this.block.postPlace(world, i, j, k, j1);
- }
-
- world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this.block.stepSound.getPlaceSound(), (this.block.stepSound.getVolume1() + 1.0F) / 2.0F, this.block.stepSound.getVolume2() * 0.8F);
- --itemstack.count;
- }
-
- return true;
- */
- return processBlockPlace(world, entityhuman, itemstack, i, j, k, this.block, j1, clickedX, clickedY, clickedZ);
- // CraftBukkit end
- } else {
- return false;
- }
- }
-
- // CraftBukkit start - Add method to process block placement
- static boolean processBlockPlace(final World world, final EntityHuman entityhuman, final ItemStack itemstack, final int x, final int y, final int z, final Block id, final int data, final int clickedX, final int clickedY, final int clickedZ) {
- org.bukkit.block.BlockState blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(world, x, y, z);
-
- world.callingPlaceEvent = true;
- // Sign is now 3 not 2.
- int flag = (id == Blocks.SIGN_POST || id == Blocks.WALL_SIGN) ? 3 : 2;
- world.setTypeAndData(x, y, z, id, data, flag);
-
- org.bukkit.event.block.BlockPlaceEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockstate, clickedX, clickedY, clickedZ);
- if (event.isCancelled() || !event.canBuild()) {
- blockstate.update(true, false);
- world.callingPlaceEvent = false;
- return false;
- }
-
- world.callingPlaceEvent = false;
-
- Block block = world.getType(x, y, z);
- int newData = world.getData(x, y, z);
-
- if (block != null && !(block instanceof BlockContainer)) { // Containers get placed automatically
- block.onPlace(world, x, y, z);
- }
-
- world.update(x, y, z, block);
-
- // Cocoa beans placed via ItemDye do not need the rest of the processing
- if (block == Blocks.COCOA && itemstack != null && itemstack.getItem() instanceof ItemDye) {
- return true;
- }
-
- // Skulls don't get block data applied to them
- if (block != null && block != Blocks.SKULL) {
- block.postPlace(world, x, y, z, entityhuman, itemstack);
- block.postPlace(world, x, y, z, newData);
-
- world.makeSound((double) ((float) x + 0.5F), (double) ((float) y + 0.5F), (double) ((float) z + 0.5F), block.stepSound.getPlaceSound(), (block.stepSound.getVolume1() + 1.0F) / 2.0F, block.stepSound.getVolume2() * 0.8F);
- }
-
- if (itemstack != null) {
- --itemstack.count;
- }
-
- return true;
- }
- // CraftBukkit end
-
- public String a(ItemStack itemstack) {
- return this.block.a();
- }
-
- public String getName() {
- return this.block.a();
- }
-
- public Item c(String s) {
- return this.b(s);
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemDoor.java b/src/main/java/net/minecraft/server/ItemDoor.java
deleted file mode 100644
index dcb400cb..00000000
--- a/src/main/java/net/minecraft/server/ItemDoor.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package net.minecraft.server;
-
-public class ItemDoor extends Item {
-
- private Material a;
-
- public ItemDoor(Material material) {
- this.a = material;
- this.maxStackSize = 1;
- this.a(CreativeModeTab.d);
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (l != 1) {
- return false;
- } else {
- ++j;
- Block block;
-
- if (this.a == Material.WOOD) {
- block = Blocks.WOODEN_DOOR;
- } else {
- block = Blocks.IRON_DOOR_BLOCK;
- }
-
- if (entityhuman.a(i, j, k, l, itemstack) && entityhuman.a(i, j + 1, k, l, itemstack)) {
- if (!block.canPlace(world, i, j, k)) {
- return false;
- } else {
- int i1 = MathHelper.floor((double) ((entityhuman.yaw + 180.0F) * 4.0F / 360.0F) - 0.5D) & 3;
-
- // CraftBukkit start - fire BlockPlaceEvent
- if (!place(world, i, j, k, i1, block, entityhuman, clickedX, clickedY, clickedZ)) {
- return false;
- }
- // CraftBukkit end
-
- --itemstack.count;
- return true;
- }
- } else {
- return false;
- }
- }
- }
-
- public static void place(World world, int i, int j, int k, int l, Block block) {
- // CraftBukkit start
- place(world, i, j, k, l, block, null, i, j, k);
- }
-
- public static boolean place(World world, int i, int j, int k, int l, Block block, EntityHuman entityhuman, int clickedX, int clickedY, int clickedZ) {
- // CraftBukkit end
- byte b0 = 0;
- byte b1 = 0;
-
- if (l == 0) {
- b1 = 1;
- }
-
- if (l == 1) {
- b0 = -1;
- }
-
- if (l == 2) {
- b1 = -1;
- }
-
- if (l == 3) {
- b0 = 1;
- }
-
- int i1 = (world.getType(i - b0, j, k - b1).r() ? 1 : 0) + (world.getType(i - b0, j + 1, k - b1).r() ? 1 : 0);
- int j1 = (world.getType(i + b0, j, k + b1).r() ? 1 : 0) + (world.getType(i + b0, j + 1, k + b1).r() ? 1 : 0);
- boolean flag = world.getType(i - b0, j, k - b1) == block || world.getType(i - b0, j + 1, k - b1) == block;
- boolean flag1 = world.getType(i + b0, j, k + b1) == block || world.getType(i + b0, j + 1, k + b1) == block;
- boolean flag2 = false;
-
- if (flag && !flag1) {
- flag2 = true;
- } else if (j1 > i1) {
- flag2 = true;
- }
-
- // CraftBukkit start - fire BlockPlaceEvent
- if (entityhuman != null) {
- if (!ItemBlock.processBlockPlace(world, entityhuman, null, i, j, k, block, l, clickedX, clickedY, clickedZ)) {
- ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j + 1, k, world));
- return false;
- }
-
- if (world.getType(i, j, k) != block) {
- ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j + 1, k, world));
- return true;
- }
- } else {
- world.setTypeAndData(i, j, k, block, l, 2);
- }
- // CraftBukkit end
- world.setTypeAndData(i, j + 1, k, block, 8 | (flag2 ? 1 : 0), 2);
- world.applyPhysics(i, j, k, block);
- world.applyPhysics(i, j + 1, k, block);
- return true; // CraftBukkit
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemDye.java b/src/main/java/net/minecraft/server/ItemDye.java
index 064e9685..156af8e3 100644
--- a/src/main/java/net/minecraft/server/ItemDye.java
+++ b/src/main/java/net/minecraft/server/ItemDye.java
@@ -1,9 +1,6 @@
package net.minecraft.server;
-// CraftBukkit start
-import org.bukkit.entity.Player;
-import org.bukkit.event.entity.SheepDyeWoolEvent;
-// CraftBukkit end
+import org.bukkit.event.entity.SheepDyeWoolEvent; // CraftBukkit
public class ItemDye extends Item {
@@ -24,12 +21,11 @@ public class ItemDye extends Item {
}
public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
if (!entityhuman.a(i, j, k, l, itemstack)) {
return false;
} else {
if (itemstack.getData() == 15) {
- if (a(itemstack, world, i, j, k, entityhuman)) { // CraftBukkit - pass entity for StructureGrowEvent
+ if (a(itemstack, world, i, j, k)) {
if (!world.isStatic) {
world.triggerEffect(2005, i, j, k, 0);
}
@@ -68,12 +64,7 @@ public class ItemDye extends Item {
if (world.isEmpty(i, j, k)) {
int j1 = Blocks.COCOA.getPlacedData(world, i, j, k, l, f, f1, f2, 0);
- // CraftBukkit start - fire BlockPlaceEvent
- // world.setTypeAndData(i, j, k, Blocks.COCOA, j1, 2);
- if (!ItemBlock.processBlockPlace(world, entityhuman, itemstack, i, j, k, Blocks.COCOA, j1, clickedX, clickedY, clickedZ)) {
- return false;
- }
- // CraftBukkit end
+ world.setTypeAndData(i, j, k, Blocks.COCOA, j1, 2);
if (!entityhuman.abilities.canInstantlyBuild) {
--itemstack.count;
}
@@ -88,12 +79,6 @@ public class ItemDye extends Item {
}
public static boolean a(ItemStack itemstack, World world, int i, int j, int k) {
- // CraftBukkit start - add EntityHuman parameter
- return a(itemstack, world, i, j, k, null);
- }
-
- public static boolean a(ItemStack itemstack, World world, int i, int j, int k, EntityHuman entityhuman) {
- // CraftBukkit end
Block block = world.getType(i, j, k);
if (block instanceof IBlockFragilePlantElement) {
@@ -102,18 +87,7 @@ public class ItemDye extends Item {
if (iblockfragileplantelement.a(world, i, j, k, world.isStatic)) {
if (!world.isStatic) {
if (iblockfragileplantelement.a(world, world.random, i, j, k)) {
- // CraftBukkit start - Special case BlockSapling and BlockMushroom to use our methods
- if (block instanceof BlockSapling) {
- Player player = (entityhuman instanceof EntityPlayer) ? (Player) entityhuman.getBukkitEntity() : null;
- ((BlockSapling) block).grow(world, i, j, k, world.random, true, player, null);
- } else if (block instanceof BlockMushroom) {
- Player player = (entityhuman instanceof EntityPlayer) ? (Player) entityhuman.getBukkitEntity() : null;
- ((BlockMushroom) block).grow(world, i, j, k, world.random, true, player, null);
- } else {
- iblockfragileplantelement.b(world, world.random, i, j, k);
- }
- // CraftBukkit end
-
+ iblockfragileplantelement.b(world, world.random, i, j, k);
}
--itemstack.count;
diff --git a/src/main/java/net/minecraft/server/ItemFireball.java b/src/main/java/net/minecraft/server/ItemFireball.java
index bee5320b..0a3bf131 100644
--- a/src/main/java/net/minecraft/server/ItemFireball.java
+++ b/src/main/java/net/minecraft/server/ItemFireball.java
@@ -12,7 +12,6 @@ public class ItemFireball extends Item {
}
public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
if (world.isStatic) {
return true;
} else {
@@ -51,21 +50,10 @@ public class ItemFireball extends Item {
}
return false;
}
-
- CraftBlockState blockState = CraftBlockState.getBlockState(world, i, j, k);
// CraftBukkit end
world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "fire.ignite", 1.0F, g.nextFloat() * 0.4F + 0.8F);
world.setTypeUpdate(i, j, k, Blocks.FIRE);
-
- // CraftBukkit start
- org.bukkit.event.block.BlockPlaceEvent placeEvent = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clickedX, clickedY, clickedZ);
-
- if (placeEvent.isCancelled() || !placeEvent.canBuild()) {
- placeEvent.getBlockPlaced().setTypeIdAndData(0, (byte) 0, false);
- return false;
- }
- // CraftBukkit end
}
if (!entityhuman.abilities.canInstantlyBuild) {
diff --git a/src/main/java/net/minecraft/server/ItemHoe.java b/src/main/java/net/minecraft/server/ItemHoe.java
deleted file mode 100644
index 67c63d55..00000000
--- a/src/main/java/net/minecraft/server/ItemHoe.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package net.minecraft.server;
-
-public class ItemHoe extends Item {
-
- protected EnumToolMaterial a;
-
- public ItemHoe(EnumToolMaterial enumtoolmaterial) {
- this.a = enumtoolmaterial;
- this.maxStackSize = 1;
- this.setMaxDurability(enumtoolmaterial.a());
- this.a(CreativeModeTab.i);
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (!entityhuman.a(i, j, k, l, itemstack)) {
- return false;
- } else {
- Block block = world.getType(i, j, k);
-
- if (l != 0 && world.getType(i, j + 1, k).getMaterial() == Material.AIR && (block == Blocks.GRASS || block == Blocks.DIRT)) {
- Block block1 = Blocks.SOIL;
-
- world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), block1.stepSound.getStepSound(), (block1.stepSound.getVolume1() + 1.0F) / 2.0F, block1.stepSound.getVolume2() * 0.8F);
- if (world.isStatic) {
- return true;
- } else {
- // CraftBukkit start - Hoes - blockface -1 for 'SELF'
- // world.setTypeUpdate(i, j, k, block1);
- if (!ItemBlock.processBlockPlace(world, entityhuman, null, i, j, k, block1, 0, clickedX, clickedY, clickedZ)) {
- return false;
- }
- // CraftBukkit end
- itemstack.damage(1, entityhuman);
- return true;
- }
- } else {
- return false;
- }
- }
- }
-
- public String i() {
- return this.a.toString();
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemRedstone.java b/src/main/java/net/minecraft/server/ItemRedstone.java
deleted file mode 100644
index dea1548e..00000000
--- a/src/main/java/net/minecraft/server/ItemRedstone.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package net.minecraft.server;
-
-public class ItemRedstone extends Item {
-
- public ItemRedstone() {
- this.a(CreativeModeTab.d);
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (world.getType(i, j, k) != Blocks.SNOW) {
- if (l == 0) {
- --j;
- }
-
- if (l == 1) {
- ++j;
- }
-
- if (l == 2) {
- --k;
- }
-
- if (l == 3) {
- ++k;
- }
-
- if (l == 4) {
- --i;
- }
-
- if (l == 5) {
- ++i;
- }
-
- if (!world.isEmpty(i, j, k)) {
- return false;
- }
- }
-
- if (!entityhuman.a(i, j, k, l, itemstack)) {
- return false;
- } else {
- if (Blocks.REDSTONE_WIRE.canPlace(world, i, j, k)) {
- // CraftBukkit start - fire BlockPlaceEvent
- // --itemstack.count;
- // world.setTypeUpdate(i, j, k, Blocks.REDSTONE_WIRE);
- if (!ItemBlock.processBlockPlace(world, entityhuman, itemstack, i, j, k, Blocks.REDSTONE_WIRE, 0, clickedX, clickedY, clickedZ)) {
- return false;
- }
- // CraftBukkit end
- }
-
- return true;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemReed.java b/src/main/java/net/minecraft/server/ItemReed.java
deleted file mode 100644
index bdcc92b6..00000000
--- a/src/main/java/net/minecraft/server/ItemReed.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package net.minecraft.server;
-
-public class ItemReed extends Item {
-
- private Block block;
-
- public ItemReed(Block block) {
- this.block = block;
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- Block block = world.getType(i, j, k);
-
- if (block == Blocks.SNOW && (world.getData(i, j, k) & 7) < 1) {
- l = 1;
- } else if (block != Blocks.VINE && block != Blocks.LONG_GRASS && block != Blocks.DEAD_BUSH) {
- if (l == 0) {
- --j;
- }
-
- if (l == 1) {
- ++j;
- }
-
- if (l == 2) {
- --k;
- }
-
- if (l == 3) {
- ++k;
- }
-
- if (l == 4) {
- --i;
- }
-
- if (l == 5) {
- ++i;
- }
- }
-
- if (!entityhuman.a(i, j, k, l, itemstack)) {
- return false;
- } else if (itemstack.count == 0) {
- return false;
- } else {
- if (world.mayPlace(this.block, i, j, k, false, l, (Entity) null, itemstack)) {
- int i1 = this.block.getPlacedData(world, i, j, k, l, f, f1, f2, 0);
- // CraftBukkit start - Redirect to common handler
- ItemBlock.processBlockPlace(world, entityhuman, itemstack, i, j, k, this.block, i1, clickedX, clickedY, clickedZ);
- /*
- if (world.setTypeAndData(i, j, k, this.block, i1, 3)) {
- if (world.getType(i, j, k) == this.block) {
- this.block.postPlace(world, i, j, k, entityhuman, itemstack);
- this.block.postPlace(world, i, j, k, i1);
- }
-
- world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this.block.stepSound.getPlaceSound(), (this.block.stepSound.getVolume1() + 1.0F) / 2.0F, this.block.stepSound.getVolume2() * 0.8F);
- --itemstack.count;
- }
- // CraftBukkit end */
- }
-
- return true;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemSeedFood.java b/src/main/java/net/minecraft/server/ItemSeedFood.java
deleted file mode 100644
index 0b3e5e50..00000000
--- a/src/main/java/net/minecraft/server/ItemSeedFood.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package net.minecraft.server;
-
-public class ItemSeedFood extends ItemFood {
-
- private Block b;
- private Block c;
-
- public ItemSeedFood(int i, float f, Block block, Block block1) {
- super(i, f, false);
- this.b = block;
- this.c = block1;
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (l != 1) {
- return false;
- } else if (entityhuman.a(i, j, k, l, itemstack) && entityhuman.a(i, j + 1, k, l, itemstack)) {
- if (world.getType(i, j, k) == this.c && world.isEmpty(i, j + 1, k)) {
- // CraftBukkit start - fire BlockPlaceEvent
- // world.setTypeUpdate(i, j + 1, k, this.b);
- if (!ItemBlock.processBlockPlace(world, entityhuman, null, i, j + 1, k, this.b, 0, clickedX, clickedY, clickedZ)) {
- return false;
- }
- // CraftBukkit end
- --itemstack.count;
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemSeeds.java b/src/main/java/net/minecraft/server/ItemSeeds.java
deleted file mode 100644
index d74cb30f..00000000
--- a/src/main/java/net/minecraft/server/ItemSeeds.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package net.minecraft.server;
-
-public class ItemSeeds extends Item {
-
- private Block block;
- private Block b;
-
- public ItemSeeds(Block block, Block block1) {
- this.block = block;
- this.b = block1;
- this.a(CreativeModeTab.l);
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (l != 1) {
- return false;
- } else if (entityhuman.a(i, j, k, l, itemstack) && entityhuman.a(i, j + 1, k, l, itemstack)) {
- if (world.getType(i, j, k) == this.b && world.isEmpty(i, j + 1, k)) {
- // CraftBukkit start - Seeds
- // world.setTypeUpdate(i, j + 1, k, this.block);
- if (!ItemBlock.processBlockPlace(world, entityhuman, null, i, j + 1, k, this.block, 0, clickedX, clickedY, clickedZ)) {
- return false;
- }
- // CraftBukkit end
- --itemstack.count;
- return true;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemSign.java b/src/main/java/net/minecraft/server/ItemSign.java
deleted file mode 100644
index b04a2de1..00000000
--- a/src/main/java/net/minecraft/server/ItemSign.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package net.minecraft.server;
-
-public class ItemSign extends Item {
-
- public ItemSign() {
- this.maxStackSize = 16;
- this.a(CreativeModeTab.c);
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (l == 0) {
- return false;
- } else if (!world.getType(i, j, k).getMaterial().isBuildable()) {
- return false;
- } else {
- if (l == 1) {
- ++j;
- }
-
- if (l == 2) {
- --k;
- }
-
- if (l == 3) {
- ++k;
- }
-
- if (l == 4) {
- --i;
- }
-
- if (l == 5) {
- ++i;
- }
-
- if (!entityhuman.a(i, j, k, l, itemstack)) {
- return false;
- } else if (!Blocks.SIGN_POST.canPlace(world, i, j, k)) {
- return false;
- } else if (world.isStatic) {
- return true;
- } else {
- // CraftBukkit start - fire BlockPlaceEvent
- final Block block;
- if (l == 1) {
- int i1 = MathHelper.floor((double) ((entityhuman.yaw + 180.0F) * 16.0F / 360.0F) + 0.5D) & 15;
-
- // world.setTypeAndData(i, j, k, Blocks.SIGN_POST, i1, 3);
- block = Blocks.SIGN_POST;
- l = i1;
- } else {
- // world.setTypeAndData(i, j, k, Blocks.WALL_SIGN, l, 3);
- block = Blocks.WALL_SIGN;
- }
- if (!ItemBlock.processBlockPlace(world, entityhuman, null, i, j, k, block, l, clickedX, clickedY, clickedZ)) {
- return false;
- }
- // CraftBukkit end
-
- --itemstack.count;
- TileEntitySign tileentitysign = (TileEntitySign) world.getTileEntity(i, j, k);
-
- if (tileentitysign != null) {
- entityhuman.a((TileEntity) tileentitysign);
- }
-
- return true;
- }
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemSkull.java b/src/main/java/net/minecraft/server/ItemSkull.java
deleted file mode 100644
index dd7e5ccf..00000000
--- a/src/main/java/net/minecraft/server/ItemSkull.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package net.minecraft.server;
-
-import java.util.UUID;
-
-import net.minecraft.util.com.mojang.authlib.GameProfile;
-
-public class ItemSkull extends Item {
-
- private static final String[] b = new String[] { "skeleton", "wither", "zombie", "char", "creeper"};
- public static final String[] a = new String[] { "skeleton", "wither", "zombie", "steve", "creeper"};
-
- public ItemSkull() {
- this.a(CreativeModeTab.c);
- this.setMaxDurability(0);
- this.a(true);
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (l == 0) {
- return false;
- } else if (!world.getType(i, j, k).getMaterial().isBuildable()) {
- return false;
- } else {
- if (l == 1) {
- ++j;
- }
-
- if (l == 2) {
- --k;
- }
-
- if (l == 3) {
- ++k;
- }
-
- if (l == 4) {
- --i;
- }
-
- if (l == 5) {
- ++i;
- }
-
- if (!world.isStatic) {
- // CraftBukkit start - Handle in ItemBlock
- // world.setTypeAndData(i, j, k, Blocks.SKULL, l, 2);
- if (!ItemBlock.processBlockPlace(world, entityhuman, null, i, j, k, Blocks.SKULL, l, clickedX, clickedY, clickedZ)) {
- return false;
- }
- l = world.getData(i, j, k);
- // CraftBukkit end
- int i1 = 0;
-
- if (l == 1) {
- i1 = MathHelper.floor((double) (entityhuman.yaw * 16.0F / 360.0F) + 0.5D) & 15;
- }
-
- TileEntity tileentity = world.getTileEntity(i, j, k);
-
- if (tileentity != null && tileentity instanceof TileEntitySkull) {
- if (itemstack.getData() == 3) {
- GameProfile gameprofile = null;
-
- if (itemstack.hasTag()) {
- NBTTagCompound nbttagcompound = itemstack.getTag();
-
- if (nbttagcompound.hasKeyOfType("SkullOwner", 10)) {
- gameprofile = GameProfileSerializer.a(nbttagcompound.getCompound("SkullOwner"));
- } else if (nbttagcompound.hasKeyOfType("SkullOwner", 8) && nbttagcompound.getString("SkullOwner").length() > 0) {
- gameprofile = new GameProfile((UUID) null, nbttagcompound.getString("SkullOwner"));
- }
- }
-
- ((TileEntitySkull) tileentity).setGameProfile(gameprofile);
- } else {
- ((TileEntitySkull) tileentity).setSkullType(itemstack.getData());
- }
-
- ((TileEntitySkull) tileentity).setRotation(i1);
- ((BlockSkull) Blocks.SKULL).a(world, i, j, k, (TileEntitySkull) tileentity);
- }
-
- --itemstack.count;
- }
-
- return true;
- }
- }
-
- public int filterData(int i) {
- return i;
- }
-
- public String a(ItemStack itemstack) {
- int i = itemstack.getData();
-
- if (i < 0 || i >= b.length) {
- i = 0;
- }
-
- return super.getName() + "." + b[i];
- }
-
- public String n(ItemStack itemstack) {
- if (itemstack.getData() == 3 && itemstack.hasTag()) {
- if (itemstack.getTag().hasKeyOfType("SkullOwner", 10)) {
- return LocaleI18n.get("item.skull.player.name", new Object[] { GameProfileSerializer.a(itemstack.getTag().getCompound("SkullOwner")).getName()});
- }
-
- if (itemstack.getTag().hasKeyOfType("SkullOwner", 8)) {
- return LocaleI18n.get("item.skull.player.name", new Object[] { itemstack.getTag().getString("SkullOwner")});
- }
- }
-
- return super.n(itemstack);
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemSnow.java b/src/main/java/net/minecraft/server/ItemSnow.java
deleted file mode 100644
index 19e2b38c..00000000
--- a/src/main/java/net/minecraft/server/ItemSnow.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package net.minecraft.server;
-
-public class ItemSnow extends ItemBlockWithAuxData {
-
- public ItemSnow(Block block, Block block1) {
- super(block, block1);
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (itemstack.count == 0) {
- return false;
- } else if (!entityhuman.a(i, j, k, l, itemstack)) {
- return false;
- } else {
- Block block = world.getType(i, j, k);
-
- if (block == Blocks.SNOW) {
- int i1 = world.getData(i, j, k);
- int j1 = i1 & 7;
-
- // CraftBukkit start - Redirect to common handler
- if (j1 <= 6 && world.b(this.block.a(world, i, j, k)) && ItemBlock.processBlockPlace(world, entityhuman, itemstack, i, j, k, block, j1 + 1 | i1 & -8, clickedX, clickedY, clickedZ)) {
- return true;
- }
- /*
- if (j1 <= 6 && world.b(this.block.a(world, i, j, k)) && world.setData(i, j, k, j1 + 1 | i1 & -8, 2)) {
- world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this.block.stepSound.getPlaceSound(), (this.block.stepSound.getVolume1() + 1.0F) / 2.0F, this.block.stepSound.getVolume2() * 0.8F);
- --itemstack.count;
- return true;
- }
- // CraftBukkit end */
- }
-
- return super.interactWith(itemstack, entityhuman, world, i, j, k, l, f, f1, f2);
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java
index 791467ba..bae352b2 100644
--- a/src/main/java/net/minecraft/server/ItemStack.java
+++ b/src/main/java/net/minecraft/server/ItemStack.java
@@ -6,7 +6,17 @@ import java.util.Random;
import net.minecraft.util.com.google.common.collect.HashMultimap;
import net.minecraft.util.com.google.common.collect.Multimap;
-import org.bukkit.craftbukkit.util.CraftMagicNumbers; // CraftBukkit
+// CraftBukkit start
+import java.util.List;
+
+import org.bukkit.Location;
+import org.bukkit.TreeType;
+import org.bukkit.block.BlockState;
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
+import org.bukkit.entity.Player;
+import org.bukkit.event.world.StructureGrowEvent;
+// CraftBukkit end
public final class ItemStack {
@@ -75,11 +85,84 @@ public final class ItemStack {
}
public boolean placeItem(EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
+ // CraftBukkit start - handle all block place event logic here
+ int data = this.getData();
+ int count = this.count;
+
+ if (!(this.getItem() instanceof ItemBucket)) { // if not bucket
+ world.captureBlockStates = true;
+ // special case bonemeal
+ if (this.getItem() instanceof ItemDye && this.getData() == 15) {
+ Block block = world.getType(i, j, k);
+ if (block == Blocks.SAPLING || block instanceof BlockMushroom) {
+ world.captureTreeGeneration = true;
+ }
+ }
+ }
boolean flag = this.getItem().interactWith(this, entityhuman, world, i, j, k, l, f, f1, f2);
+ world.captureBlockStates = false;
+ if (flag && world.captureTreeGeneration && world.capturedBlockStates.size() > 0) {
+ world.captureTreeGeneration = false;
+ Location location = new Location(world.getWorld(), i, j, k);
+ TreeType treeType = BlockSapling.treeType;
+ BlockSapling.treeType = null;
+ List<BlockState> blocks = (List<BlockState>) world.capturedBlockStates.clone();
+ world.capturedBlockStates.clear();
+ StructureGrowEvent event = null;
+ if (treeType != null) {
+ event = new StructureGrowEvent(location, treeType, false, (Player) entityhuman.getBukkitEntity(), blocks);
+ org.bukkit.Bukkit.getPluginManager().callEvent(event);
+ }
+ if (event == null || !event.isCancelled()) {
+ for (BlockState blockstate : blocks) {
+ blockstate.update(true);
+ }
+ }
+
+ return flag;
+ }
+ world.captureTreeGeneration = false;
if (flag) {
- entityhuman.a(StatisticList.USE_ITEM_COUNT[Item.b(this.item)], 1);
+ org.bukkit.event.block.BlockPlaceEvent placeEvent = null;
+ List<BlockState> blocks = (List<BlockState>) world.capturedBlockStates.clone();
+ world.capturedBlockStates.clear();
+ if (blocks.size() > 1) {
+ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockMultiPlaceEvent(world, entityhuman, blocks, i, j, k);
+ } else if (blocks.size() == 1) {
+ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blocks.get(0), i, j, k);
+ }
+
+ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) {
+ flag = false; // cancel placement
+ // revert back all captured blocks
+ for (BlockState blockstate : blocks) {
+ blockstate.update(true, false);
+ }
+ // make sure to restore stack after cancel
+ this.setData(data);
+ this.count = count;
+ } else {
+ for (BlockState blockstate : blocks) {
+ int x = blockstate.getX();
+ int y = blockstate.getY();
+ int z = blockstate.getZ();
+ int updateFlag = ((CraftBlockState) blockstate).getFlag();
+ org.bukkit.Material mat = blockstate.getType();
+ Block oldBlock = CraftMagicNumbers.getBlock(mat);
+ Block block = world.getType(x, y, z);
+
+ if (block != null && !(block instanceof BlockContainer)) { // Containers get placed automatically
+ block.onPlace(world, x, y, z);
+ }
+
+ world.notifyAndUpdatePhysics(x, y, z, null, oldBlock, block, updateFlag); // send null chunk as chunk.k() returns false by this point
+ }
+ entityhuman.a(StatisticList.USE_ITEM_COUNT[Item.b(this.item)], 1);
+ }
}
+ world.capturedBlockStates.clear();
+ // CraftBukkit end
return flag;
}
diff --git a/src/main/java/net/minecraft/server/ItemStep.java b/src/main/java/net/minecraft/server/ItemStep.java
deleted file mode 100644
index 56fb09e1..00000000
--- a/src/main/java/net/minecraft/server/ItemStep.java
+++ /dev/null
@@ -1,100 +0,0 @@
-package net.minecraft.server;
-
-public class ItemStep extends ItemBlock {
-
- private final boolean b;
- private final BlockStepAbstract c;
- private final BlockStepAbstract d;
-
- public ItemStep(Block block, BlockStepAbstract blockstepabstract, BlockStepAbstract blockstepabstract1, boolean flag) {
- super(block);
- this.c = blockstepabstract;
- this.d = blockstepabstract1;
- this.b = flag;
- this.setMaxDurability(0);
- this.a(true);
- }
-
- public int filterData(int i) {
- return i;
- }
-
- public String a(ItemStack itemstack) {
- return this.c.b(itemstack.getData());
- }
-
- public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (this.b) {
- return super.interactWith(itemstack, entityhuman, world, i, j, k, l, f, f1, f2);
- } else if (itemstack.count == 0) {
- return false;
- } else if (!entityhuman.a(i, j, k, l, itemstack)) {
- return false;
- } else {
- Block block = world.getType(i, j, k);
- int i1 = world.getData(i, j, k);
- int j1 = i1 & 7;
- boolean flag = (i1 & 8) != 0;
-
- if ((l == 1 && !flag || l == 0 && flag) && block == this.c && j1 == itemstack.getData()) {
- // CraftBukkit start - world.setTypeIdAndData -> processBlockPlace()
- // if (world.b(this.d.a(world, i, j, k)) && world.setTypeAndData(i, j, k, this.d, j1, 3)) {
- if (world.b(this.d.a(world, i, j, k)) && processBlockPlace(world, entityhuman, null, i, j, k, this.d, j1, clickedX, clickedY, clickedZ)) {
- // world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this.d.stepSound.getPlaceSound(), (this.d.stepSound.getVolume1() + 1.0F) / 2.0F, this.d.stepSound.getVolume2() * 0.8F);
- // CraftBukkit end
- --itemstack.count;
- }
-
- return true;
- } else {
- return this.a(itemstack, entityhuman, world, i, j, k, l) ? true : super.interactWith(itemstack, entityhuman, world, i, j, k, l, f, f1, f2);
- }
- }
- }
-
- private boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l) {
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
- if (l == 0) {
- --j;
- }
-
- if (l == 1) {
- ++j;
- }
-
- if (l == 2) {
- --k;
- }
-
- if (l == 3) {
- ++k;
- }
-
- if (l == 4) {
- --i;
- }
-
- if (l == 5) {
- ++i;
- }
-
- Block block = world.getType(i, j, k);
- int i1 = world.getData(i, j, k);
- int j1 = i1 & 7;
-
- if (block == this.c && j1 == itemstack.getData()) {
- // CraftBukkit start - world.setTypeIdAndData -> processBlockPlace()
- // if (world.b(this.d.a(world, i, j, k)) && world.setTypeAndData(i, j, k, this.d, j1, 3)) {
- if (world.b(this.d.a(world, i, j, k)) && processBlockPlace(world, entityhuman, null, i, j, k, this.d, j1, clickedX, clickedY, clickedZ)) {
- // world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this.d.stepSound.getPlaceSound(), (this.d.stepSound.getVolume1() + 1.0F) / 2.0F, this.d.stepSound.getVolume2() * 0.8F);
- // CraftBukkit end
- --itemstack.count;
- }
-
- return true;
- } else {
- return false;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/ItemWaterLily.java b/src/main/java/net/minecraft/server/ItemWaterLily.java
index 0b319943..abf1b3f8 100644
--- a/src/main/java/net/minecraft/server/ItemWaterLily.java
+++ b/src/main/java/net/minecraft/server/ItemWaterLily.java
@@ -16,7 +16,6 @@ public class ItemWaterLily extends ItemWithAuxData {
int i = movingobjectposition.b;
int j = movingobjectposition.c;
int k = movingobjectposition.d;
- final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
if (!world.a(entityhuman, i, j, k)) {
return itemstack;
@@ -27,12 +26,7 @@ public class ItemWaterLily extends ItemWithAuxData {
}
if (world.getType(i, j, k).getMaterial() == Material.WATER && world.getData(i, j, k) == 0 && world.isEmpty(i, j + 1, k)) {
- // CraftBukkit start - fire BlockPlaceEvent
- // world.setTypeUpdate(i, j + 1, k, Blocks.WATER_LILY);
- if (!processBlockPlace(world, entityhuman, null, i, j + 1, k, Blocks.WATER_LILY, 0, clickedX, clickedY, clickedZ)) {
- return itemstack;
- }
- // CraftBukkit end
+ world.setTypeUpdate(i, j + 1, k, Blocks.WATER_LILY);
if (!entityhuman.abilities.canInstantlyBuild) {
--itemstack.count;
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index e6bb1d5f..bbf61a39 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -13,6 +13,7 @@ import java.util.concurrent.Callable;
// CraftBukkit start
import org.bukkit.Bukkit;
+import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.craftbukkit.util.LongHashSet;
import org.bukkit.generator.ChunkGenerator;
@@ -66,7 +67,9 @@ public abstract class World implements IBlockAccess {
public boolean allowMonsters;
public boolean allowAnimals;
// Added the following
- public boolean callingPlaceEvent = false;
+ public boolean captureBlockStates = false;
+ public boolean captureTreeGeneration = false;
+ public ArrayList<BlockState> capturedBlockStates= new ArrayList<BlockState>();
public long ticksPerAnimalSpawns;
public long ticksPerMonsterSpawns;
public boolean populating;
@@ -196,6 +199,17 @@ public abstract class World implements IBlockAccess {
}
public Block getType(int i, int j, int k) {
+ // CraftBukkit start - tree generation
+ if (captureTreeGeneration) {
+ Iterator<BlockState> it = capturedBlockStates.iterator();
+ while (it.hasNext()) {
+ BlockState previous = it.next();
+ if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) {
+ return CraftMagicNumbers.getBlock(previous.getTypeId());
+ }
+ }
+ }
+ // CraftBukkit end
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000 && j >= 0 && j < 256) {
Chunk chunk = null;
@@ -262,6 +276,26 @@ public abstract class World implements IBlockAccess {
}
public boolean setTypeAndData(int i, int j, int k, Block block, int l, int i1) {
+ // CraftBukkit start - tree generation
+ if (this.captureTreeGeneration) {
+ BlockState blockstate = null;
+ Iterator<BlockState> it = capturedBlockStates.iterator();
+ while (it.hasNext()) {
+ BlockState previous = it.next();
+ if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) {
+ blockstate = previous;
+ it.remove();
+ break;
+ }
+ }
+ if (blockstate == null) {
+ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, i, j, k, i1);
+ }
+ blockstate.setTypeId(CraftMagicNumbers.getId(block));
+ blockstate.setRawData((byte) l);
+ this.capturedBlockStates.add(blockstate);
+ return true;
+ }
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
if (j < 0) {
return false;
@@ -275,22 +309,30 @@ public abstract class World implements IBlockAccess {
block1 = chunk.getType(i & 15, j, k & 15);
}
+ // CraftBukkit start - capture blockstates
+ BlockState blockstate = null;
+ if (this.captureBlockStates) {
+ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, i, j, k, i1);
+ this.capturedBlockStates.add(blockstate);
+ }
+ // CraftBukkit end
+
boolean flag = chunk.a(i & 15, j, k & 15, block, l);
+ // CraftBukkit start - remove blockstate if failed
+ if (!flag && this.captureBlockStates) {
+ this.capturedBlockStates.remove(blockstate);
+ }
+ // CraftBukkit end
+
this.methodProfiler.a("checkLight");
this.t(i, j, k);
this.methodProfiler.b();
- if (flag) {
- if ((i1 & 2) != 0 && (!this.isStatic || (i1 & 4) == 0) && chunk.k()) {
- this.notify(i, j, k);
- }
-
- if (!this.isStatic && (i1 & 1) != 0) {
- this.update(i, j, k, block1);
- if (block.M()) {
- this.f(i, j, k, block);
- }
- }
+ // CraftBukkit start
+ if (flag && !this.captureBlockStates) { // Don't notify clients or update physics while capturing blockstates
+ // Modularize client and physic updates
+ this.notifyAndUpdatePhysics(i, j, k, chunk, block1, block, i1);
+ // CraftBukkit end
}
return flag;
@@ -300,7 +342,35 @@ public abstract class World implements IBlockAccess {
}
}
+ // CraftBukkit start - Split off from original setTypeAndData(int i, int j, int k, Block block, int l, int i1) method in order to directly send client and physic updates
+ public void notifyAndUpdatePhysics(int i, int j, int k, Chunk chunk, Block oldBlock, Block newBlock, int flag)
+ {
+ // should be isReady()
+ if ((flag & 2) != 0 && (chunk == null || chunk.k())) { // allow chunk to be null here as chunk.k() is false when we send our notification during block placement
+ this.notify(i, j, k);
+ }
+
+ if ((flag & 1) != 0) {
+ this.update(i, j, k, oldBlock);
+ if (newBlock.M()) { // should be isComplexRedstone()
+ this.f(i, j, k, newBlock); // should be updateAdjacentComparators
+ }
+ }
+ }
+ // CraftBukkit end
+
public int getData(int i, int j, int k) {
+ // CraftBukkit start - tree generation
+ if (captureTreeGeneration) {
+ Iterator<BlockState> it = capturedBlockStates.iterator();
+ while (it.hasNext()) {
+ BlockState previous = it.next();
+ if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) {
+ return previous.getRawData();
+ }
+ }
+ }
+ // CraftBukkit end
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
if (j < 0) {
return 0;
@@ -319,6 +389,26 @@ public abstract class World implements IBlockAccess {
}
public boolean setData(int i, int j, int k, int l, int i1) {
+ // CraftBukkit start - tree generation
+ if (this.captureTreeGeneration) {
+ BlockState blockstate = null;
+ Iterator<BlockState> it = capturedBlockStates.iterator();
+ while (it.hasNext()) {
+ BlockState previous = it.next();
+ if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) {
+ blockstate = previous;
+ it.remove();
+ break;
+ }
+ }
+ if (blockstate == null) {
+ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, i, j, k, i1);
+ }
+ blockstate.setRawData((byte) l);
+ this.capturedBlockStates.add(blockstate);
+ return true;
+ }
+ // CraftBukkit end
if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) {
if (j < 0) {
return false;
diff --git a/src/main/java/net/minecraft/server/WorldGenAcaciaTree.java b/src/main/java/net/minecraft/server/WorldGenAcaciaTree.java
deleted file mode 100644
index 9ed8492a..00000000
--- a/src/main/java/net/minecraft/server/WorldGenAcaciaTree.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public class WorldGenAcaciaTree extends WorldGenTreeAbstract implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
-
- public WorldGenAcaciaTree(boolean flag) {
- super(flag);
- }
-
- public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
- int l = random.nextInt(3) + random.nextInt(3) + 5;
- boolean flag = true;
-
- if (j >= 1 && j + l + 1 <= 256) {
- int i1;
- int j1;
-
- for (int k1 = j; k1 <= j + 1 + l; ++k1) {
- byte b0 = 1;
-
- if (k1 == j) {
- b0 = 0;
- }
-
- if (k1 >= j + 1 + l - 2) {
- b0 = 2;
- }
-
- for (i1 = i - b0; i1 <= i + b0 && flag; ++i1) {
- for (j1 = k - b0; j1 <= k + b0 && flag; ++j1) {
- if (k1 >= 0 && k1 < 256) {
- Block block = world.getType(i1, k1, j1);
-
- if (!this.a(block)) {
- flag = false;
- }
- } else {
- flag = false;
- }
- }
- }
- }
-
- if (!flag) {
- return false;
- } else {
- Block block1 = world.getType(i, j - 1, k);
-
- if ((block1 == Blocks.GRASS || block1 == Blocks.DIRT) && j < 256 - l - 1) {
- this.setType(world, i, j - 1, k, Blocks.DIRT);
- int l1 = random.nextInt(4);
-
- i1 = l - random.nextInt(4) - 1;
- j1 = 3 - random.nextInt(3);
- int i2 = i;
- int j2 = k;
- int k2 = 0;
-
- int l2;
- int i3;
-
- for (l2 = 0; l2 < l; ++l2) {
- i3 = j + l2;
- if (l2 >= i1 && j1 > 0) {
- i2 += Direction.a[l1];
- j2 += Direction.b[l1];
- --j1;
- }
-
- Block block2 = world.getType(i2, i3, j2);
-
- if (block2.getMaterial() == Material.AIR || block2.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i2, i3, j2, Blocks.LOG2, 0);
- k2 = i3;
- }
- }
-
- for (l2 = -1; l2 <= 1; ++l2) {
- for (i3 = -1; i3 <= 1; ++i3) {
- this.a(world, i2 + l2, k2 + 1, j2 + i3);
- }
- }
-
- this.a(world, i2 + 2, k2 + 1, j2);
- this.a(world, i2 - 2, k2 + 1, j2);
- this.a(world, i2, k2 + 1, j2 + 2);
- this.a(world, i2, k2 + 1, j2 - 2);
-
- for (l2 = -3; l2 <= 3; ++l2) {
- for (i3 = -3; i3 <= 3; ++i3) {
- if (Math.abs(l2) != 3 || Math.abs(i3) != 3) {
- this.a(world, i2 + l2, k2, j2 + i3);
- }
- }
- }
-
- i2 = i;
- j2 = k;
- l2 = random.nextInt(4);
- if (l2 != l1) {
- i3 = i1 - random.nextInt(2) - 1;
- int j3 = 1 + random.nextInt(3);
-
- k2 = 0;
-
- int k3;
- int l3;
-
- for (l3 = i3; l3 < l && j3 > 0; --j3) {
- if (l3 >= 1) {
- k3 = j + l3;
- i2 += Direction.a[l2];
- j2 += Direction.b[l2];
- Block block3 = world.getType(i2, k3, j2);
-
- if (block3.getMaterial() == Material.AIR || block3.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i2, k3, j2, Blocks.LOG2, 0);
- k2 = k3;
- }
- }
-
- ++l3;
- }
-
- if (k2 > 0) {
- for (l3 = -1; l3 <= 1; ++l3) {
- for (k3 = -1; k3 <= 1; ++k3) {
- this.a(world, i2 + l3, k2 + 1, j2 + k3);
- }
- }
-
- for (l3 = -2; l3 <= 2; ++l3) {
- for (k3 = -2; k3 <= 2; ++k3) {
- if (Math.abs(l3) != 2 || Math.abs(k3) != 2) {
- this.a(world, i2 + l3, k2, j2 + k3);
- }
- }
- }
- }
- }
-
- return true;
- } else {
- return false;
- }
- }
- } else {
- return false;
- }
- }
-
- // CraftBukkit - Changed signature
- private void a(CraftBlockChangeDelegate world, int i, int j, int k) {
- Block block = world.getType(i, j, k);
-
- if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i, j, k, Blocks.LEAVES2, 0);
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/WorldGenBigTree.java b/src/main/java/net/minecraft/server/WorldGenBigTree.java
index d4de58ad..d81845dd 100644
--- a/src/main/java/net/minecraft/server/WorldGenBigTree.java
+++ b/src/main/java/net/minecraft/server/WorldGenBigTree.java
@@ -2,13 +2,11 @@ package net.minecraft.server;
import java.util.Random;
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public class WorldGenBigTree extends WorldGenTreeAbstract implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
+public class WorldGenBigTree extends WorldGenTreeAbstract {
static final byte[] a = new byte[] { (byte) 2, (byte) 0, (byte) 0, (byte) 1, (byte) 2, (byte) 1};
Random b = new Random();
- CraftBlockChangeDelegate world; // CraftBukkit - Change type
+ World world;
int[] d = new int[] { 0, 0, 0};
int e;
int f;
@@ -350,16 +348,6 @@ public class WorldGenBigTree extends WorldGenTreeAbstract implements BlockSaplin
}
public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- // sk: The idea is to have (our) WorldServer implement
- // BlockChangeDelegate and then we can implicitly cast World to
- // WorldServer (a safe cast, AFAIK) and no code will be broken. This
- // then allows plugins to catch manually-invoked generation events
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
this.world = world;
long l = random.nextLong();
diff --git a/src/main/java/net/minecraft/server/WorldGenForest.java b/src/main/java/net/minecraft/server/WorldGenForest.java
deleted file mode 100644
index 25f4549a..00000000
--- a/src/main/java/net/minecraft/server/WorldGenForest.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public class WorldGenForest extends WorldGenTreeAbstract implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
-
- private boolean a;
-
- public WorldGenForest(boolean flag, boolean flag1) {
- super(flag);
- this.a = flag1;
- }
-
- public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
- int l = random.nextInt(3) + 5;
-
- if (this.a) {
- l += random.nextInt(7);
- }
-
- boolean flag = true;
-
- if (j >= 1 && j + l + 1 <= 256) {
- int i1;
- int j1;
-
- for (int k1 = j; k1 <= j + 1 + l; ++k1) {
- byte b0 = 1;
-
- if (k1 == j) {
- b0 = 0;
- }
-
- if (k1 >= j + 1 + l - 2) {
- b0 = 2;
- }
-
- for (i1 = i - b0; i1 <= i + b0 && flag; ++i1) {
- for (j1 = k - b0; j1 <= k + b0 && flag; ++j1) {
- if (k1 >= 0 && k1 < 256) {
- Block block = world.getType(i1, k1, j1);
-
- if (!this.a(block)) {
- flag = false;
- }
- } else {
- flag = false;
- }
- }
- }
- }
-
- if (!flag) {
- return false;
- } else {
- Block block1 = world.getType(i, j - 1, k);
-
- if ((block1 == Blocks.GRASS || block1 == Blocks.DIRT || block1 == Blocks.SOIL) && j < 256 - l - 1) {
- this.setType(world, i, j - 1, k, Blocks.DIRT);
-
- int l1;
-
- for (l1 = j - 3 + l; l1 <= j + l; ++l1) {
- i1 = l1 - (j + l);
- j1 = 1 - i1 / 2;
-
- for (int i2 = i - j1; i2 <= i + j1; ++i2) {
- int j2 = i2 - i;
-
- for (int k2 = k - j1; k2 <= k + j1; ++k2) {
- int l2 = k2 - k;
-
- if (Math.abs(j2) != j1 || Math.abs(l2) != j1 || random.nextInt(2) != 0 && i1 != 0) {
- Block block2 = world.getType(i2, l1, k2);
-
- if (block2.getMaterial() == Material.AIR || block2.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i2, l1, k2, Blocks.LEAVES, 2);
- }
- }
- }
- }
- }
-
- for (l1 = 0; l1 < l; ++l1) {
- Block block3 = world.getType(i, j + l1, k);
-
- if (block3.getMaterial() == Material.AIR || block3.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i, j + l1, k, Blocks.LOG, 2);
- }
- }
-
- return true;
- } else {
- return false;
- }
- }
- } else {
- return false;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/WorldGenForestTree.java b/src/main/java/net/minecraft/server/WorldGenForestTree.java
deleted file mode 100644
index 71ce9734..00000000
--- a/src/main/java/net/minecraft/server/WorldGenForestTree.java
+++ /dev/null
@@ -1,175 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public class WorldGenForestTree extends WorldGenTreeAbstract implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
-
- public WorldGenForestTree(boolean flag) {
- super(flag);
- }
-
- public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
- int l = random.nextInt(3) + random.nextInt(2) + 6;
- boolean flag = true;
-
- if (j >= 1 && j + l + 1 <= 256) {
- int i1;
- int j1;
-
- for (int k1 = j; k1 <= j + 1 + l; ++k1) {
- byte b0 = 1;
-
- if (k1 == j) {
- b0 = 0;
- }
-
- if (k1 >= j + 1 + l - 2) {
- b0 = 2;
- }
-
- for (i1 = i - b0; i1 <= i + b0 && flag; ++i1) {
- for (j1 = k - b0; j1 <= k + b0 && flag; ++j1) {
- if (k1 >= 0 && k1 < 256) {
- Block block = world.getType(i1, k1, j1);
-
- if (!this.a(block)) {
- flag = false;
- }
- } else {
- flag = false;
- }
- }
- }
- }
-
- if (!flag) {
- return false;
- } else {
- Block block1 = world.getType(i, j - 1, k);
-
- if ((block1 == Blocks.GRASS || block1 == Blocks.DIRT) && j < 256 - l - 1) {
- this.setType(world, i, j - 1, k, Blocks.DIRT);
- this.setType(world, i + 1, j - 1, k, Blocks.DIRT);
- this.setType(world, i + 1, j - 1, k + 1, Blocks.DIRT);
- this.setType(world, i, j - 1, k + 1, Blocks.DIRT);
- int l1 = random.nextInt(4);
-
- i1 = l - random.nextInt(4);
- j1 = 2 - random.nextInt(3);
- int i2 = i;
- int j2 = k;
- int k2 = 0;
-
- int l2;
- int i3;
-
- for (l2 = 0; l2 < l; ++l2) {
- i3 = j + l2;
- if (l2 >= i1 && j1 > 0) {
- i2 += Direction.a[l1];
- j2 += Direction.b[l1];
- --j1;
- }
-
- Block block2 = world.getType(i2, i3, j2);
-
- if (block2.getMaterial() == Material.AIR || block2.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i2, i3, j2, Blocks.LOG2, 1);
- this.setTypeAndData(world, i2 + 1, i3, j2, Blocks.LOG2, 1);
- this.setTypeAndData(world, i2, i3, j2 + 1, Blocks.LOG2, 1);
- this.setTypeAndData(world, i2 + 1, i3, j2 + 1, Blocks.LOG2, 1);
- k2 = i3;
- }
- }
-
- for (l2 = -2; l2 <= 0; ++l2) {
- for (i3 = -2; i3 <= 0; ++i3) {
- byte b1 = -1;
-
- this.a(world, i2 + l2, k2 + b1, j2 + i3);
- this.a(world, 1 + i2 - l2, k2 + b1, j2 + i3);
- this.a(world, i2 + l2, k2 + b1, 1 + j2 - i3);
- this.a(world, 1 + i2 - l2, k2 + b1, 1 + j2 - i3);
- if ((l2 > -2 || i3 > -1) && (l2 != -1 || i3 != -2)) {
- byte b2 = 1;
-
- this.a(world, i2 + l2, k2 + b2, j2 + i3);
- this.a(world, 1 + i2 - l2, k2 + b2, j2 + i3);
- this.a(world, i2 + l2, k2 + b2, 1 + j2 - i3);
- this.a(world, 1 + i2 - l2, k2 + b2, 1 + j2 - i3);
- }
- }
- }
-
- if (random.nextBoolean()) {
- this.a(world, i2, k2 + 2, j2);
- this.a(world, i2 + 1, k2 + 2, j2);
- this.a(world, i2 + 1, k2 + 2, j2 + 1);
- this.a(world, i2, k2 + 2, j2 + 1);
- }
-
- for (l2 = -3; l2 <= 4; ++l2) {
- for (i3 = -3; i3 <= 4; ++i3) {
- if ((l2 != -3 || i3 != -3) && (l2 != -3 || i3 != 4) && (l2 != 4 || i3 != -3) && (l2 != 4 || i3 != 4) && (Math.abs(l2) < 3 || Math.abs(i3) < 3)) {
- this.a(world, i2 + l2, k2, j2 + i3);
- }
- }
- }
-
- for (l2 = -1; l2 <= 2; ++l2) {
- for (i3 = -1; i3 <= 2; ++i3) {
- if ((l2 < 0 || l2 > 1 || i3 < 0 || i3 > 1) && random.nextInt(3) <= 0) {
- int j3 = random.nextInt(3) + 2;
-
- int k3;
-
- for (k3 = 0; k3 < j3; ++k3) {
- this.setTypeAndData(world, i + l2, k2 - k3 - 1, k + i3, Blocks.LOG2, 1);
- }
-
- int l3;
-
- for (k3 = -1; k3 <= 1; ++k3) {
- for (l3 = -1; l3 <= 1; ++l3) {
- this.a(world, i2 + l2 + k3, k2 - 0, j2 + i3 + l3);
- }
- }
-
- for (k3 = -2; k3 <= 2; ++k3) {
- for (l3 = -2; l3 <= 2; ++l3) {
- if (Math.abs(k3) != 2 || Math.abs(l3) != 2) {
- this.a(world, i2 + l2 + k3, k2 - 1, j2 + i3 + l3);
- }
- }
- }
- }
- }
- }
-
- return true;
- } else {
- return false;
- }
- }
- } else {
- return false;
- }
- }
-
- // CraftBukkit - Changed signature
- private void a(CraftBlockChangeDelegate world, int i, int j, int k) {
- Block block = world.getType(i, j, k);
-
- if (block.getMaterial() == Material.AIR) {
- this.setTypeAndData(world, i, j, k, Blocks.LEAVES2, 1);
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/WorldGenGroundBush.java b/src/main/java/net/minecraft/server/WorldGenGroundBush.java
index 5d70f55a..ea8fdb55 100644
--- a/src/main/java/net/minecraft/server/WorldGenGroundBush.java
+++ b/src/main/java/net/minecraft/server/WorldGenGroundBush.java
@@ -2,8 +2,6 @@ package net.minecraft.server;
import java.util.Random;
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
public class WorldGenGroundBush extends WorldGenTrees {
private int a;
@@ -16,13 +14,6 @@ public class WorldGenGroundBush extends WorldGenTrees {
}
public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- @Override
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
Block block;
while (((block = world.getType(i, j, k)).getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) && j > 0) {
diff --git a/src/main/java/net/minecraft/server/WorldGenHugeMushroom.java b/src/main/java/net/minecraft/server/WorldGenHugeMushroom.java
deleted file mode 100644
index 67273f21..00000000
--- a/src/main/java/net/minecraft/server/WorldGenHugeMushroom.java
+++ /dev/null
@@ -1,215 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-
-// CraftBukkit start
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate;
-import org.bukkit.block.BlockState;
-import org.bukkit.material.MaterialData;
-// CraftBukkit end
-
-public class WorldGenHugeMushroom extends WorldGenerator implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
-
- private int a = -1;
-
- public WorldGenHugeMushroom(int i) {
- super(true);
- this.a = i;
- }
-
- public WorldGenHugeMushroom() {
- super(false);
- }
-
- public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return grow(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k, null, null, null);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- return grow(world, random, i, j, k, null, null, null);
- }
-
- public boolean grow(CraftBlockChangeDelegate world, Random random, int i, int j, int k, org.bukkit.event.world.StructureGrowEvent event, ItemStack itemstack, org.bukkit.craftbukkit.CraftWorld bukkitWorld) {
- // CraftBukkit end
- int l = random.nextInt(2);
-
- if (this.a >= 0) {
- l = this.a;
- }
-
- int i1 = random.nextInt(3) + 4;
- boolean flag = true;
-
- if (j >= 1 && j + i1 + 1 < 256) {
- int j1;
- int k1;
-
- for (int l1 = j; l1 <= j + 1 + i1; ++l1) {
- byte b0 = 3;
-
- if (l1 <= j + 3) {
- b0 = 0;
- }
-
- for (j1 = i - b0; j1 <= i + b0 && flag; ++j1) {
- for (k1 = k - b0; k1 <= k + b0 && flag; ++k1) {
- if (l1 >= 0 && l1 < 256) {
- Block block = world.getType(j1, l1, k1);
-
- if (block.getMaterial() != Material.AIR && block.getMaterial() != Material.LEAVES) {
- flag = false;
- }
- } else {
- flag = false;
- }
- }
- }
- }
-
- if (!flag) {
- return false;
- } else {
- Block block1 = world.getType(i, j - 1, k);
-
- if (block1 != Blocks.DIRT && block1 != Blocks.GRASS && block1 != Blocks.MYCEL) {
- return false;
- } else {
- // CraftBukkit start
- if (event == null) {
- this.setTypeAndData(world, i, j - 1, k, Blocks.DIRT, 0);
- } else {
- BlockState dirtState = bukkitWorld.getBlockAt(i, j - 1, k).getState();
- dirtState.setTypeId(Block.b(Blocks.DIRT));
- event.getBlocks().add(dirtState);
- }
- // CraftBukkit end
-
- int i2 = j + i1;
-
- if (l == 1) {
- i2 = j + i1 - 3;
- }
-
- for (j1 = i2; j1 <= j + i1; ++j1) {
- k1 = 1;
- if (j1 < j + i1) {
- ++k1;
- }
-
- if (l == 0) {
- k1 = 3;
- }
-
- for (int j2 = i - k1; j2 <= i + k1; ++j2) {
- for (int k2 = k - k1; k2 <= k + k1; ++k2) {
- int l2 = 5;
-
- if (j2 == i - k1) {
- --l2;
- }
-
- if (j2 == i + k1) {
- ++l2;
- }
-
- if (k2 == k - k1) {
- l2 -= 3;
- }
-
- if (k2 == k + k1) {
- l2 += 3;
- }
-
- if (l == 0 || j1 < j + i1) {
- if ((j2 == i - k1 || j2 == i + k1) && (k2 == k - k1 || k2 == k + k1)) {
- continue;
- }
-
- if (j2 == i - (k1 - 1) && k2 == k - k1) {
- l2 = 1;
- }
-
- if (j2 == i - k1 && k2 == k - (k1 - 1)) {
- l2 = 1;
- }
-
- if (j2 == i + (k1 - 1) && k2 == k - k1) {
- l2 = 3;
- }
-
- if (j2 == i + k1 && k2 == k - (k1 - 1)) {
- l2 = 3;
- }
-
- if (j2 == i - (k1 - 1) && k2 == k + k1) {
- l2 = 7;
- }
-
- if (j2 == i - k1 && k2 == k + (k1 - 1)) {
- l2 = 7;
- }
-
- if (j2 == i + (k1 - 1) && k2 == k + k1) {
- l2 = 9;
- }
-
- if (j2 == i + k1 && k2 == k + (k1 - 1)) {
- l2 = 9;
- }
- }
-
- if (l2 == 5 && j1 < j + i1) {
- l2 = 0;
- }
-
- if ((l2 != 0 || j >= j + i1 - 1) && !world.getType(j2, j1, k2).j()) {
- // CraftBukkit start
- if (event == null) {
- this.setTypeAndData(world, j2, j1, k2, Block.e(Block.b(Blocks.BIG_MUSHROOM_1) + l), l2);
- } else {
- BlockState state = bukkitWorld.getBlockAt(j2, j1, k2).getState();
- state.setTypeId(Block.b(Blocks.BIG_MUSHROOM_1) + l);
- state.setData(new MaterialData(Block.b(Blocks.BIG_MUSHROOM_1) + l, (byte) l2));
- event.getBlocks().add(state);
- }
- // CraftBukkit end
- }
- }
- }
- }
-
- for (j1 = 0; j1 < i1; ++j1) {
- Block block2 = world.getType(i, j + j1, k);
-
- if (!block2.j()) {
- // CraftBukkit start
- if (event == null) {
- this.setTypeAndData(world, i, j + j1, k, Block.e(Block.b(Blocks.BIG_MUSHROOM_1) + l), 10);
- } else {
- BlockState state = bukkitWorld.getBlockAt(i, j + j1, k).getState();
- state.setTypeId(Block.b(Blocks.BIG_MUSHROOM_1) + l);
- state.setData(new MaterialData(Block.b(Blocks.BIG_MUSHROOM_1) + l, (byte) 10));
- event.getBlocks().add(state);
- }
- // CraftBukkit end
- }
- }
- // CraftBukkit start
- if (event != null) {
- org.bukkit.Bukkit.getPluginManager().callEvent(event);
- if (!event.isCancelled()) {
- for (BlockState state : event.getBlocks()) {
- state.update(true);
- }
- }
- }
- // CraftBukkit end
- return true;
- }
- }
- } else {
- return false;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/WorldGenJungleTree.java b/src/main/java/net/minecraft/server/WorldGenJungleTree.java
deleted file mode 100644
index 182232d7..00000000
--- a/src/main/java/net/minecraft/server/WorldGenJungleTree.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public class WorldGenJungleTree extends WorldGenMegaTreeAbstract implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
-
- public WorldGenJungleTree(boolean flag, int i, int j, int k, int l) {
- super(flag, i, j, k, l);
- }
-
- public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
- int l = this.a(random);
-
- if (!this.a(world, random, i, j, k, l)) {
- return false;
- } else {
- this.c(world, i, k, j + l, 2, random);
-
- for (int i1 = j + l - 2 - random.nextInt(4); i1 > j + l / 2; i1 -= 2 + random.nextInt(4)) {
- float f = random.nextFloat() * 3.1415927F * 2.0F;
- int j1 = i + (int) (0.5F + MathHelper.cos(f) * 4.0F);
- int k1 = k + (int) (0.5F + MathHelper.sin(f) * 4.0F);
-
- int l1;
-
- for (l1 = 0; l1 < 5; ++l1) {
- j1 = i + (int) (1.5F + MathHelper.cos(f) * (float) l1);
- k1 = k + (int) (1.5F + MathHelper.sin(f) * (float) l1);
- this.setTypeAndData(world, j1, i1 - 3 + l1 / 2, k1, Blocks.LOG, this.b);
- }
-
- l1 = 1 + random.nextInt(2);
- int i2 = i1;
-
- for (int j2 = i1 - l1; j2 <= i2; ++j2) {
- int k2 = j2 - i2;
-
- this.b(world, j1, j2, k1, 1 - k2, random);
- }
- }
-
- for (int l2 = 0; l2 < l; ++l2) {
- Block block = world.getType(i, j + l2, k);
-
- if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i, j + l2, k, Blocks.LOG, this.b);
- if (l2 > 0) {
- if (random.nextInt(3) > 0 && world.isEmpty(i - 1, j + l2, k)) {
- this.setTypeAndData(world, i - 1, j + l2, k, Blocks.VINE, 8);
- }
-
- if (random.nextInt(3) > 0 && world.isEmpty(i, j + l2, k - 1)) {
- this.setTypeAndData(world, i, j + l2, k - 1, Blocks.VINE, 1);
- }
- }
- }
-
- if (l2 < l - 1) {
- block = world.getType(i + 1, j + l2, k);
- if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i + 1, j + l2, k, Blocks.LOG, this.b);
- if (l2 > 0) {
- if (random.nextInt(3) > 0 && world.isEmpty(i + 2, j + l2, k)) {
- this.setTypeAndData(world, i + 2, j + l2, k, Blocks.VINE, 2);
- }
-
- if (random.nextInt(3) > 0 && world.isEmpty(i + 1, j + l2, k - 1)) {
- this.setTypeAndData(world, i + 1, j + l2, k - 1, Blocks.VINE, 1);
- }
- }
- }
-
- block = world.getType(i + 1, j + l2, k + 1);
- if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i + 1, j + l2, k + 1, Blocks.LOG, this.b);
- if (l2 > 0) {
- if (random.nextInt(3) > 0 && world.isEmpty(i + 2, j + l2, k + 1)) {
- this.setTypeAndData(world, i + 2, j + l2, k + 1, Blocks.VINE, 2);
- }
-
- if (random.nextInt(3) > 0 && world.isEmpty(i + 1, j + l2, k + 2)) {
- this.setTypeAndData(world, i + 1, j + l2, k + 2, Blocks.VINE, 4);
- }
- }
- }
-
- block = world.getType(i, j + l2, k + 1);
- if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i, j + l2, k + 1, Blocks.LOG, this.b);
- if (l2 > 0) {
- if (random.nextInt(3) > 0 && world.isEmpty(i - 1, j + l2, k + 1)) {
- this.setTypeAndData(world, i - 1, j + l2, k + 1, Blocks.VINE, 8);
- }
-
- if (random.nextInt(3) > 0 && world.isEmpty(i, j + l2, k + 2)) {
- this.setTypeAndData(world, i, j + l2, k + 2, Blocks.VINE, 4);
- }
- }
- }
- }
- }
-
- return true;
- }
- }
-
- // CraftBukkit - Changed signature
- private void c(CraftBlockChangeDelegate world, int i, int j, int k, int l, Random random) {
- byte b0 = 2;
-
- for (int i1 = k - b0; i1 <= k; ++i1) {
- int j1 = i1 - k;
-
- this.a(world, i, i1, j, l + 1 - j1, random);
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/WorldGenMegaTree.java b/src/main/java/net/minecraft/server/WorldGenMegaTree.java
deleted file mode 100644
index f83894f5..00000000
--- a/src/main/java/net/minecraft/server/WorldGenMegaTree.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public class WorldGenMegaTree extends WorldGenMegaTreeAbstract implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
-
- private boolean e;
-
- public WorldGenMegaTree(boolean flag, boolean flag1) {
- super(flag, 13, 15, 1, 1);
- this.e = flag1;
- }
-
- public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
- int l = this.a(random);
-
- if (!this.a(world, random, i, j, k, l)) {
- return false;
- } else {
- this.c(world, i, k, j + l, 0, random);
-
- for (int i1 = 0; i1 < l; ++i1) {
- Block block = world.getType(i, j + i1, k);
-
- if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i, j + i1, k, Blocks.LOG, this.b);
- }
-
- if (i1 < l - 1) {
- block = world.getType(i + 1, j + i1, k);
- if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i + 1, j + i1, k, Blocks.LOG, this.b);
- }
-
- block = world.getType(i + 1, j + i1, k + 1);
- if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i + 1, j + i1, k + 1, Blocks.LOG, this.b);
- }
-
- block = world.getType(i, j + i1, k + 1);
- if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i, j + i1, k + 1, Blocks.LOG, this.b);
- }
- }
- }
- }
-
- return true;
- }
-
- // CraftBukkit - Changed signature
- private void c(CraftBlockChangeDelegate world, int i, int j, int k, int l, Random random) {
- int i1 = random.nextInt(5);
-
- if (this.e) {
- i1 += this.a;
- } else {
- i1 += 3;
- }
-
- int j1 = 0;
-
- for (int k1 = k - i1; k1 <= k; ++k1) {
- int l1 = k - k1;
- int i2 = l + MathHelper.d((float) l1 / (float) i1 * 3.5F);
-
- this.a(world, i, k1, j, i2 + (l1 > 0 && i2 == j1 && (k1 & 1) == 0 ? 1 : 0), random);
- j1 = i2;
- }
- }
-
- // CraftBukkit - Changed signature
- public void b(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- this.c(world, random, i - 1, j, k - 1);
- this.c(world, random, i + 2, j, k - 1);
- this.c(world, random, i - 1, j, k + 2);
- this.c(world, random, i + 2, j, k + 2);
-
- for (int l = 0; l < 5; ++l) {
- int i1 = random.nextInt(64);
- int j1 = i1 % 8;
- int k1 = i1 / 8;
-
- if (j1 == 0 || j1 == 7 || k1 == 0 || k1 == 7) {
- this.c(world, random, i - 3 + j1, j, k - 3 + k1);
- }
- }
- }
-
- // CraftBukkit - Changed signature
- private void c(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- for (int l = -2; l <= 2; ++l) {
- for (int i1 = -2; i1 <= 2; ++i1) {
- if (Math.abs(l) != 2 || Math.abs(i1) != 2) {
- this.a(world, i + l, j, k + i1);
- }
- }
- }
- }
-
- // CraftBukkit - Changed signature
- private void a(CraftBlockChangeDelegate world, int i, int j, int k) {
- for (int l = j + 2; l >= j - 3; --l) {
- Block block = world.getType(i, l, k);
-
- if (block == Blocks.GRASS || block == Blocks.DIRT) {
- this.setTypeAndData(world, i, l, k, Blocks.DIRT, 2);
- break;
- }
-
- if (block.getMaterial() != Material.AIR && l < j) {
- break;
- }
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java b/src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java
index cabbb9f5..0fd21716 100644
--- a/src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java
+++ b/src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java
@@ -2,8 +2,6 @@ package net.minecraft.server;
import java.util.Random;
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
public abstract class WorldGenMegaTreeAbstract extends WorldGenTreeAbstract {
protected final int a;
@@ -29,8 +27,7 @@ public abstract class WorldGenMegaTreeAbstract extends WorldGenTreeAbstract {
return i;
}
- // CraftBukkit - Changed world to CraftBlockChangeDelegate
- private boolean b(CraftBlockChangeDelegate world, Random random, int i, int j, int k, int l) {
+ private boolean b(World world, Random random, int i, int j, int k, int l) {
boolean flag = true;
if (j >= 1 && j + l + 1 <= 256) {
@@ -67,8 +64,7 @@ public abstract class WorldGenMegaTreeAbstract extends WorldGenTreeAbstract {
}
}
- // CraftBukkit - Change world to CraftBlockChangeDelegate
- private boolean c(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
+ private boolean c(World world, Random random, int i, int j, int k) {
Block block = world.getType(i, j - 1, k);
if ((block == Blocks.GRASS || block == Blocks.DIRT) && j >= 2) {
@@ -82,13 +78,11 @@ public abstract class WorldGenMegaTreeAbstract extends WorldGenTreeAbstract {
}
}
- // CraftBukkit - Change world to CraftBlockChangeDelegate
- protected boolean a(CraftBlockChangeDelegate world, Random random, int i, int j, int k, int l) {
+ protected boolean a(World world, Random random, int i, int j, int k, int l) {
return this.b(world, random, i, j, k, l) && this.c(world, random, i, j, k);
}
- // CraftBukkit - Change world to CraftBlockChangeDelegate
- protected void a(CraftBlockChangeDelegate world, int i, int j, int k, int l, Random random) {
+ protected void a(World world, int i, int j, int k, int l, Random random) {
int i1 = l * l;
for (int j1 = i - l; j1 <= i + l + 1; ++j1) {
@@ -110,8 +104,7 @@ public abstract class WorldGenMegaTreeAbstract extends WorldGenTreeAbstract {
}
}
- // CraftBukkit - Change world to CraftBlockChangeDelegate
- protected void b(CraftBlockChangeDelegate world, int i, int j, int k, int l, Random random) {
+ protected void b(World world, int i, int j, int k, int l, Random random) {
int i1 = l * l;
for (int j1 = i - l; j1 <= i + l; ++j1) {
diff --git a/src/main/java/net/minecraft/server/WorldGenSwampTree.java b/src/main/java/net/minecraft/server/WorldGenSwampTree.java
deleted file mode 100644
index 3f051648..00000000
--- a/src/main/java/net/minecraft/server/WorldGenSwampTree.java
+++ /dev/null
@@ -1,151 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public class WorldGenSwampTree extends WorldGenTreeAbstract implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
-
- public WorldGenSwampTree() {
- super(false);
- }
-
- public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
- int l;
-
- for (l = random.nextInt(4) + 5; world.getType(i, j - 1, k).getMaterial() == Material.WATER; --j) {
- ;
- }
-
- boolean flag = true;
-
- if (j >= 1 && j + l + 1 <= 256) {
- int i1;
- int j1;
-
- for (int k1 = j; k1 <= j + 1 + l; ++k1) {
- byte b0 = 1;
-
- if (k1 == j) {
- b0 = 0;
- }
-
- if (k1 >= j + 1 + l - 2) {
- b0 = 3;
- }
-
- for (i1 = i - b0; i1 <= i + b0 && flag; ++i1) {
- for (j1 = k - b0; j1 <= k + b0 && flag; ++j1) {
- if (k1 >= 0 && k1 < 256) {
- Block block = world.getType(i1, k1, j1);
-
- if (block.getMaterial() != Material.AIR && block.getMaterial() != Material.LEAVES) {
- if (block != Blocks.STATIONARY_WATER && block != Blocks.WATER) {
- flag = false;
- } else if (k1 > j) {
- flag = false;
- }
- }
- } else {
- flag = false;
- }
- }
- }
- }
-
- if (!flag) {
- return false;
- } else {
- Block block1 = world.getType(i, j - 1, k);
-
- if ((block1 == Blocks.GRASS || block1 == Blocks.DIRT) && j < 256 - l - 1) {
- this.setType(world, i, j - 1, k, Blocks.DIRT);
-
- int l1;
- int i2;
- int j2;
-
- for (j2 = j - 3 + l; j2 <= j + l; ++j2) {
- i1 = j2 - (j + l);
- j1 = 2 - i1 / 2;
-
- for (i2 = i - j1; i2 <= i + j1; ++i2) {
- l1 = i2 - i;
-
- for (int k2 = k - j1; k2 <= k + j1; ++k2) {
- int l2 = k2 - k;
-
- if ((Math.abs(l1) != j1 || Math.abs(l2) != j1 || random.nextInt(2) != 0 && i1 != 0) && !world.getType(i2, j2, k2).j()) {
- this.setType(world, i2, j2, k2, Blocks.LEAVES);
- }
- }
- }
- }
-
- for (j2 = 0; j2 < l; ++j2) {
- Block block2 = world.getType(i, j + j2, k);
-
- if (block2.getMaterial() == Material.AIR || block2.getMaterial() == Material.LEAVES || block2 == Blocks.WATER || block2 == Blocks.STATIONARY_WATER) {
- this.setType(world, i, j + j2, k, Blocks.LOG);
- }
- }
-
- for (j2 = j - 3 + l; j2 <= j + l; ++j2) {
- i1 = j2 - (j + l);
- j1 = 2 - i1 / 2;
-
- for (i2 = i - j1; i2 <= i + j1; ++i2) {
- for (l1 = k - j1; l1 <= k + j1; ++l1) {
- if (world.getType(i2, j2, l1).getMaterial() == Material.LEAVES) {
- if (random.nextInt(4) == 0 && world.getType(i2 - 1, j2, l1).getMaterial() == Material.AIR) {
- this.a(world, i2 - 1, j2, l1, 8);
- }
-
- if (random.nextInt(4) == 0 && world.getType(i2 + 1, j2, l1).getMaterial() == Material.AIR) {
- this.a(world, i2 + 1, j2, l1, 2);
- }
-
- if (random.nextInt(4) == 0 && world.getType(i2, j2, l1 - 1).getMaterial() == Material.AIR) {
- this.a(world, i2, j2, l1 - 1, 1);
- }
-
- if (random.nextInt(4) == 0 && world.getType(i2, j2, l1 + 1).getMaterial() == Material.AIR) {
- this.a(world, i2, j2, l1 + 1, 4);
- }
- }
- }
- }
- }
-
- return true;
- } else {
- return false;
- }
- }
- } else {
- return false;
- }
- }
-
- // CraftBukkit - change signature
- private void a(CraftBlockChangeDelegate world, int i, int j, int k, int l) {
- this.setTypeAndData(world, i, j, k, Blocks.VINE, l);
- int i1 = 4;
-
- while (true) {
- --j;
- if (world.getType(i, j, k).getMaterial() != Material.AIR || i1 <= 0) {
- return;
- }
-
- this.setTypeAndData(world, i, j, k, Blocks.VINE, l);
- --i1;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/WorldGenTaiga1.java b/src/main/java/net/minecraft/server/WorldGenTaiga1.java
deleted file mode 100644
index c6bfc91c..00000000
--- a/src/main/java/net/minecraft/server/WorldGenTaiga1.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public class WorldGenTaiga1 extends WorldGenTreeAbstract implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
-
- public WorldGenTaiga1() {
- super(false);
- }
-
- public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
- int l = random.nextInt(5) + 7;
- int i1 = l - random.nextInt(2) - 3;
- int j1 = l - i1;
- int k1 = 1 + random.nextInt(j1 + 1);
- boolean flag = true;
-
- if (j >= 1 && j + l + 1 <= 256) {
- int l1;
- int i2;
- int j2;
-
- for (int k2 = j; k2 <= j + 1 + l && flag; ++k2) {
- boolean flag1 = true;
-
- if (k2 - j < i1) {
- j2 = 0;
- } else {
- j2 = k1;
- }
-
- for (l1 = i - j2; l1 <= i + j2 && flag; ++l1) {
- for (i2 = k - j2; i2 <= k + j2 && flag; ++i2) {
- if (k2 >= 0 && k2 < 256) {
- Block block = world.getType(l1, k2, i2);
-
- if (!this.a(block)) {
- flag = false;
- }
- } else {
- flag = false;
- }
- }
- }
- }
-
- if (!flag) {
- return false;
- } else {
- Block block1 = world.getType(i, j - 1, k);
-
- if ((block1 == Blocks.GRASS || block1 == Blocks.DIRT) && j < 256 - l - 1) {
- this.setType(world, i, j - 1, k, Blocks.DIRT);
- j2 = 0;
-
- for (l1 = j + l; l1 >= j + i1; --l1) {
- for (i2 = i - j2; i2 <= i + j2; ++i2) {
- int l2 = i2 - i;
-
- for (int i3 = k - j2; i3 <= k + j2; ++i3) {
- int j3 = i3 - k;
-
- if ((Math.abs(l2) != j2 || Math.abs(j3) != j2 || j2 <= 0) && !world.getType(i2, l1, i3).j()) {
- this.setTypeAndData(world, i2, l1, i3, Blocks.LEAVES, 1);
- }
- }
- }
-
- if (j2 >= 1 && l1 == j + i1 + 1) {
- --j2;
- } else if (j2 < k1) {
- ++j2;
- }
- }
-
- for (l1 = 0; l1 < l - 1; ++l1) {
- Block block2 = world.getType(i, j + l1, k);
-
- if (block2.getMaterial() == Material.AIR || block2.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i, j + l1, k, Blocks.LOG, 1);
- }
- }
-
- return true;
- } else {
- return false;
- }
- }
- } else {
- return false;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/WorldGenTaiga2.java b/src/main/java/net/minecraft/server/WorldGenTaiga2.java
deleted file mode 100644
index 24fd27e1..00000000
--- a/src/main/java/net/minecraft/server/WorldGenTaiga2.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public class WorldGenTaiga2 extends WorldGenTreeAbstract implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
-
- public WorldGenTaiga2(boolean flag) {
- super(flag);
- }
-
- public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
- int l = random.nextInt(4) + 6;
- int i1 = 1 + random.nextInt(2);
- int j1 = l - i1;
- int k1 = 2 + random.nextInt(2);
- boolean flag = true;
-
- if (j >= 1 && j + l + 1 <= 256) {
- int l1;
- int i2;
-
- for (int j2 = j; j2 <= j + 1 + l && flag; ++j2) {
- boolean flag1 = true;
-
- if (j2 - j < i1) {
- i2 = 0;
- } else {
- i2 = k1;
- }
-
- for (l1 = i - i2; l1 <= i + i2 && flag; ++l1) {
- for (int k2 = k - i2; k2 <= k + i2 && flag; ++k2) {
- if (j2 >= 0 && j2 < 256) {
- Block block = world.getType(l1, j2, k2);
-
- if (block.getMaterial() != Material.AIR && block.getMaterial() != Material.LEAVES) {
- flag = false;
- }
- } else {
- flag = false;
- }
- }
- }
- }
-
- if (!flag) {
- return false;
- } else {
- Block block1 = world.getType(i, j - 1, k);
-
- if ((block1 == Blocks.GRASS || block1 == Blocks.DIRT || block1 == Blocks.SOIL) && j < 256 - l - 1) {
- this.setType(world, i, j - 1, k, Blocks.DIRT);
- i2 = random.nextInt(2);
- l1 = 1;
- byte b0 = 0;
-
- int l2;
- int i3;
-
- for (i3 = 0; i3 <= j1; ++i3) {
- l2 = j + l - i3;
-
- for (int j3 = i - i2; j3 <= i + i2; ++j3) {
- int k3 = j3 - i;
-
- for (int l3 = k - i2; l3 <= k + i2; ++l3) {
- int i4 = l3 - k;
-
- if ((Math.abs(k3) != i2 || Math.abs(i4) != i2 || i2 <= 0) && !world.getType(j3, l2, l3).j()) {
- this.setTypeAndData(world, j3, l2, l3, Blocks.LEAVES, 1);
- }
- }
- }
-
- if (i2 >= l1) {
- i2 = b0;
- b0 = 1;
- ++l1;
- if (l1 > k1) {
- l1 = k1;
- }
- } else {
- ++i2;
- }
- }
-
- i3 = random.nextInt(3);
-
- for (l2 = 0; l2 < l - i3; ++l2) {
- Block block2 = world.getType(i, j + l2, k);
-
- if (block2.getMaterial() == Material.AIR || block2.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i, j + l2, k, Blocks.LOG, 1);
- }
- }
-
- return true;
- } else {
- return false;
- }
- }
- } else {
- return false;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/WorldGenTrees.java b/src/main/java/net/minecraft/server/WorldGenTrees.java
deleted file mode 100644
index 065a3b25..00000000
--- a/src/main/java/net/minecraft/server/WorldGenTrees.java
+++ /dev/null
@@ -1,190 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public class WorldGenTrees extends WorldGenTreeAbstract implements BlockSapling.TreeGenerator { // CraftBukkit - add interface
-
- private final int a;
- private final boolean b;
- private final int c;
- private final int d;
-
- public WorldGenTrees(boolean flag) {
- this(flag, 4, 0, 0, false);
- }
-
- public WorldGenTrees(boolean flag, int i, int j, int k, boolean flag1) {
- super(flag);
- this.a = i;
- this.c = j;
- this.d = k;
- this.b = flag1;
- }
-
- public boolean a(World world, Random random, int i, int j, int k) {
- // CraftBukkit start - Moved to generate
- return this.generate(new CraftBlockChangeDelegate((org.bukkit.BlockChangeDelegate) world), random, i, j, k);
- }
-
- public boolean generate(CraftBlockChangeDelegate world, Random random, int i, int j, int k) {
- // CraftBukkit end
- int l = random.nextInt(3) + this.a;
- boolean flag = true;
-
- if (j >= 1 && j + l + 1 <= 256) {
- byte b0;
- int i1;
- Block block;
-
- for (int j1 = j; j1 <= j + 1 + l; ++j1) {
- b0 = 1;
- if (j1 == j) {
- b0 = 0;
- }
-
- if (j1 >= j + 1 + l - 2) {
- b0 = 2;
- }
-
- for (int k1 = i - b0; k1 <= i + b0 && flag; ++k1) {
- for (i1 = k - b0; i1 <= k + b0 && flag; ++i1) {
- if (j1 >= 0 && j1 < 256) {
- block = world.getType(k1, j1, i1);
- if (!this.a(block)) {
- flag = false;
- }
- } else {
- flag = false;
- }
- }
- }
- }
-
- if (!flag) {
- return false;
- } else {
- Block block1 = world.getType(i, j - 1, k);
-
- if ((block1 == Blocks.GRASS || block1 == Blocks.DIRT || block1 == Blocks.SOIL) && j < 256 - l - 1) {
- this.setType(world, i, j - 1, k, Blocks.DIRT);
- b0 = 3;
- byte b1 = 0;
-
- int l1;
- int i2;
- int j2;
- int k2;
-
- for (i1 = j - b0 + l; i1 <= j + l; ++i1) {
- k2 = i1 - (j + l);
- l1 = b1 + 1 - k2 / 2;
-
- for (i2 = i - l1; i2 <= i + l1; ++i2) {
- j2 = i2 - i;
-
- for (int l2 = k - l1; l2 <= k + l1; ++l2) {
- int i3 = l2 - k;
-
- if (Math.abs(j2) != l1 || Math.abs(i3) != l1 || random.nextInt(2) != 0 && k2 != 0) {
- Block block2 = world.getType(i2, i1, l2);
-
- if (block2.getMaterial() == Material.AIR || block2.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i2, i1, l2, Blocks.LEAVES, this.d);
- }
- }
- }
- }
- }
-
- for (i1 = 0; i1 < l; ++i1) {
- block = world.getType(i, j + i1, k);
- if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) {
- this.setTypeAndData(world, i, j + i1, k, Blocks.LOG, this.c);
- if (this.b && i1 > 0) {
- if (random.nextInt(3) > 0 && world.isEmpty(i - 1, j + i1, k)) {
- this.setTypeAndData(world, i - 1, j + i1, k, Blocks.VINE, 8);
- }
-
- if (random.nextInt(3) > 0 && world.isEmpty(i + 1, j + i1, k)) {
- this.setTypeAndData(world, i + 1, j + i1, k, Blocks.VINE, 2);
- }
-
- if (random.nextInt(3) > 0 && world.isEmpty(i, j + i1, k - 1)) {
- this.setTypeAndData(world, i, j + i1, k - 1, Blocks.VINE, 1);
- }
-
- if (random.nextInt(3) > 0 && world.isEmpty(i, j + i1, k + 1)) {
- this.setTypeAndData(world, i, j + i1, k + 1, Blocks.VINE, 4);
- }
- }
- }
- }
-
- if (this.b) {
- for (i1 = j - 3 + l; i1 <= j + l; ++i1) {
- k2 = i1 - (j + l);
- l1 = 2 - k2 / 2;
-
- for (i2 = i - l1; i2 <= i + l1; ++i2) {
- for (j2 = k - l1; j2 <= k + l1; ++j2) {
- if (world.getType(i2, i1, j2).getMaterial() == Material.LEAVES) {
- if (random.nextInt(4) == 0 && world.getType(i2 - 1, i1, j2).getMaterial() == Material.AIR) {
- this.a(world, i2 - 1, i1, j2, 8);
- }
-
- if (random.nextInt(4) == 0 && world.getType(i2 + 1, i1, j2).getMaterial() == Material.AIR) {
- this.a(world, i2 + 1, i1, j2, 2);
- }
-
- if (random.nextInt(4) == 0 && world.getType(i2, i1, j2 - 1).getMaterial() == Material.AIR) {
- this.a(world, i2, i1, j2 - 1, 1);
- }
-
- if (random.nextInt(4) == 0 && world.getType(i2, i1, j2 + 1).getMaterial() == Material.AIR) {
- this.a(world, i2, i1, j2 + 1, 4);
- }
- }
- }
- }
- }
-
- if (random.nextInt(5) == 0 && l > 5) {
- for (i1 = 0; i1 < 2; ++i1) {
- for (k2 = 0; k2 < 4; ++k2) {
- if (random.nextInt(4 - i1) == 0) {
- l1 = random.nextInt(3);
- this.setTypeAndData(world, i + Direction.a[Direction.f[k2]], j + l - 5 + i1, k + Direction.b[Direction.f[k2]], Blocks.COCOA, l1 << 2 | k2);
- }
- }
- }
- }
- }
-
- return true;
- } else {
- return false;
- }
- }
- } else {
- return false;
- }
- }
-
- // CraftBukkit - Changed world to BlockChangeDelegate
- private void a(CraftBlockChangeDelegate world, int i, int j, int k, int l) {
- this.setTypeAndData(world, i, j, k, Blocks.VINE, l);
- int i1 = 4;
-
- while (true) {
- --j;
- if (world.getType(i, j, k).getMaterial() != Material.AIR || i1 <= 0) {
- return;
- }
-
- this.setTypeAndData(world, i, j, k, Blocks.VINE, l);
- --i1;
- }
- }
-}
diff --git a/src/main/java/net/minecraft/server/WorldGenerator.java b/src/main/java/net/minecraft/server/WorldGenerator.java
deleted file mode 100644
index 94c225a8..00000000
--- a/src/main/java/net/minecraft/server/WorldGenerator.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package net.minecraft.server;
-
-import java.util.Random;
-
-import org.bukkit.craftbukkit.CraftBlockChangeDelegate; // CraftBukkit
-
-public abstract class WorldGenerator {
-
- private final boolean a;
-
- public WorldGenerator() {
- this.a = false;
- }
-
- public WorldGenerator(boolean flag) {
- this.a = flag;
- }
-
- public abstract boolean a(World world, Random random, int i, int j, int k);
-
- public void a(double d0, double d1, double d2) {}
-
- protected void setType(World world, int i, int j, int k, Block block) {
- this.setTypeAndData(world, i, j, k, block, 0);
- }
-
- // CraftBukkit start - Duplicate method to add support for CraftBlockChangeDelegate
- protected void setType(CraftBlockChangeDelegate world, int i, int j, int k, Block block) {
- this.setTypeAndData(world, i, j, k, block, 0);
- }
- // CraftBukkit end
-
- protected void setTypeAndData(World world, int i, int j, int k, Block block, int l) {
- if (this.a) {
- world.setTypeAndData(i, j, k, block, l, 3);
- } else {
- world.setTypeAndData(i, j, k, block, l, 2);
- }
- }
-
- // CraftBukkit start - Duplicate method to add support for CraftBlockChangeDelegate
- protected void setTypeAndData(CraftBlockChangeDelegate world, int i, int j, int k, Block block, int l) {
- if (this.a) {
- world.setTypeAndData(i, j, k, block, l, 3);
- } else {
- world.setTypeAndData(i, j, k, block, l, 2);
- }
- }
- // CraftBukkit end
-}
diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java
index 843761a5..3fa3a819 100644
--- a/src/main/java/net/minecraft/server/WorldServer.java
+++ b/src/main/java/net/minecraft/server/WorldServer.java
@@ -22,9 +22,9 @@ import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.weather.LightningStrikeEvent;
import org.bukkit.event.weather.ThunderChangeEvent;
import org.bukkit.event.weather.WeatherChangeEvent;
+// CraftBukkit end
-public class WorldServer extends World implements org.bukkit.BlockChangeDelegate {
- // CraftBukkit end
+public class WorldServer extends World {
private static final Logger a = LogManager.getLogger();
private final MinecraftServer server;
@@ -998,23 +998,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate
}
}
- // CraftBukkit start - Compatibility methods for BlockChangeDelegate
- public boolean setRawTypeId(int x, int y, int z, int typeId) {
- return this.setTypeAndData(x, y, z, Block.e(typeId), 0, 4);
- }
-
- public boolean setRawTypeIdAndData(int x, int y, int z, int typeId, int data) {
- return this.setTypeAndData(x, y, z, Block.e(typeId), data, 4);
- }
-
- public boolean setTypeId(int x, int y, int z, int typeId) {
- return this.setTypeAndData(x, y, z, Block.e(typeId), 0, 3);
- }
-
- public boolean setTypeIdAndData(int x, int y, int z, int typeId, int data) {
- return this.setTypeAndData(x, y, z, Block.e(typeId), data, 3);
- }
-
+ // CraftBukkit start - Helper method
public int getTypeId(int x, int y, int z) {
return Block.b(getType(x, y, z));
}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftBlockChangeDelegate.java b/src/main/java/org/bukkit/craftbukkit/CraftBlockChangeDelegate.java
deleted file mode 100644
index 5946e7d0..00000000
--- a/src/main/java/org/bukkit/craftbukkit/CraftBlockChangeDelegate.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package org.bukkit.craftbukkit;
-
-import net.minecraft.server.Block;
-import net.minecraft.server.World;
-
-import org.bukkit.BlockChangeDelegate;
-
-public class CraftBlockChangeDelegate {
- private final BlockChangeDelegate delegate;
-
- public CraftBlockChangeDelegate(BlockChangeDelegate delegate) {
- this.delegate = delegate;
- }
-
- public BlockChangeDelegate getDelegate() {
- return delegate;
- }
-
- public Block getType(int x, int y, int z) {
- return Block.e(this.delegate.getTypeId(x, y, z));
- }
-
- public void setTypeAndData(int x, int y, int z, Block block, int data, int updateFlag) {
- // Layering violation :(
- if (delegate instanceof World) {
- ((World) delegate).setTypeAndData(x, y, z, block, data, 2);
- } else {
- delegate.setRawTypeIdAndData(x, y, z, Block.b(block), data);
- }
- }
-
- public boolean isEmpty(int x, int y, int z) {
- return delegate.isEmpty(x, y, z);
- }
-}
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 4590a713..8ef5509e 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -25,10 +25,13 @@ import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
+import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.block.CraftBlock;
+import org.bukkit.craftbukkit.block.CraftBlockState;
import org.bukkit.craftbukkit.entity.*;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.craftbukkit.metadata.BlockMetadataStore;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.craftbukkit.util.LongHash;
import org.bukkit.entity.*;
import org.bukkit.entity.Entity;
@@ -351,11 +354,7 @@ public class CraftWorld implements World {
}
public boolean generateTree(Location loc, TreeType type) {
- return generateTree(loc, type, world);
- }
-
- public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) {
- BlockSapling.TreeGenerator gen;
+ net.minecraft.server.WorldGenerator gen;
switch (type) {
case BIG_TREE:
gen = new WorldGenBigTree(true);
@@ -405,7 +404,34 @@ public class CraftWorld implements World {
break;
}
- return gen.generate(new CraftBlockChangeDelegate(delegate), rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
+ return gen.a(world, rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ());
+ }
+
+ public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) {
+ world.captureTreeGeneration = true;
+ world.captureBlockStates = true;
+ boolean grownTree = generateTree(loc, type);
+ world.captureBlockStates = false;
+ world.captureTreeGeneration = false;
+ if (grownTree) { // Copy block data to delegate
+ for (BlockState blockstate : world.capturedBlockStates) {
+ int x = blockstate.getX();
+ int y = blockstate.getY();
+ int z = blockstate.getZ();
+ net.minecraft.server.Block oldBlock = world.getType(x, y, z);
+ int typeId = blockstate.getTypeId();
+ int data = blockstate.getRawData();
+ int flag = ((CraftBlockState)blockstate).getFlag();
+ delegate.setTypeIdAndData(x, y, z, typeId, data);
+ net.minecraft.server.Block newBlock = world.getType(x, y, z);
+ world.notifyAndUpdatePhysics(x, y, z, null, oldBlock, newBlock, flag);
+ }
+ world.capturedBlockStates.clear();
+ return true;
+ } else {
+ world.capturedBlockStates.clear();
+ return false;
+ }
}
public TileEntity getTileEntityAt(final int x, final int y, final int z) {
diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java
index 2072db28..2297cc75 100644
--- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java
+++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java
@@ -22,6 +22,7 @@ public class CraftBlockState implements BlockState {
private final int z;
protected int type;
protected MaterialData data;
+ protected int flag;
protected final byte light;
public CraftBlockState(final Block block) {
@@ -32,14 +33,24 @@ public class CraftBlockState implements BlockState {
this.type = block.getTypeId();
this.light = block.getLightLevel();
this.chunk = (CraftChunk) block.getChunk();
+ this.flag = 3;
createData(block.getData());
}
+ public CraftBlockState(final Block block, int flag) {
+ this(block);
+ this.flag = flag;
+ }
+
public static CraftBlockState getBlockState(net.minecraft.server.World world, int x, int y, int z) {
return new CraftBlockState(world.getWorld().getBlockAt(x, y, z));
}
+ public static CraftBlockState getBlockState(net.minecraft.server.World world, int x, int y, int z, int flag) {
+ return new CraftBlockState(world.getWorld().getBlockAt(x, y, z), flag);
+ }
+
public World getWorld() {
return world;
}
@@ -96,6 +107,14 @@ public class CraftBlockState implements BlockState {
return Material.getMaterial(getTypeId());
}
+ public void setFlag(int flag) {
+ this.flag = flag;
+ }
+
+ public int getFlag() {
+ return flag;
+ }
+
public int getTypeId() {
return type;
}
@@ -224,4 +243,4 @@ public class CraftBlockState implements BlockState {
public void removeMetadata(String metadataKey, Plugin owningPlugin) {
chunk.getCraftWorld().getBlockMetadata().removeMetadata(getBlock(), metadataKey, owningPlugin);
}
-}
+} \ No newline at end of file
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 30f31d1f..522d6b03 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -102,6 +102,27 @@ public class CraftEventFactory {
/**
* Block place methods
*/
+ public static BlockMultiPlaceEvent callBlockMultiPlaceEvent(World world, EntityHuman who, List<BlockState> blockStates, int clickedX, int clickedY, int clickedZ) {
+ CraftWorld craftWorld = world.getWorld();
+ CraftServer craftServer = world.getServer();
+ Player player = (who == null) ? null : (Player) who.getBukkitEntity();
+
+ Block blockClicked = craftWorld.getBlockAt(clickedX, clickedY, clickedZ);
+
+ boolean canBuild = true;
+ for (int i = 0; i < blockStates.size(); i++) {
+ if (!canBuild(craftWorld, player, blockStates.get(i).getX(), blockStates.get(i).getZ())) {
+ canBuild = false;
+ break;
+ }
+ }
+
+ BlockMultiPlaceEvent event = new BlockMultiPlaceEvent(blockStates, blockClicked, player.getItemInHand(), player, canBuild);
+ craftServer.getPluginManager().callEvent(event);
+
+ return event;
+ }
+
public static BlockPlaceEvent callBlockPlaceEvent(World world, EntityHuman who, BlockState replacedBlockState, int clickedX, int clickedY, int clickedZ) {
CraftWorld craftWorld = world.getWorld();
CraftServer craftServer = world.getServer();