From 49b225ac08cacb3055f322ea066b34014876692b Mon Sep 17 00:00:00 2001 From: Dinnerbone Date: Sat, 1 Jan 2011 07:05:05 +0000 Subject: [PATCH] Fixed Material --- src/net/minecraft/server/BlockFlowing.java | 502 ++++++++++----------- src/org/bukkit/craftbukkit/CraftBlock.java | 22 +- 2 files changed, 271 insertions(+), 253 deletions(-) diff --git a/src/net/minecraft/server/BlockFlowing.java b/src/net/minecraft/server/BlockFlowing.java index 34c31749f3..86405a89eb 100644 --- a/src/net/minecraft/server/BlockFlowing.java +++ b/src/net/minecraft/server/BlockFlowing.java @@ -1,252 +1,252 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.BlockFace; -import org.bukkit.craftbukkit.CraftBlock; -import org.bukkit.event.Event.Type; -import org.bukkit.event.block.BlockFromToEvent; - -public class BlockFlowing extends BlockFluids -{ - - protected BlockFlowing(int i1, Material material) - { - super(i1, material); - a = 0; - b = new boolean[4]; - c = new int[4]; - } - - private void i(World world, int i1, int j1, int k1) - { - int l1 = world.b(i1, j1, k1); - world.a(i1, j1, k1, bh + 1, l1); - world.b(i1, j1, k1, i1, j1, k1); - world.g(i1, j1, k1); - } - - public void a(World world, int i1, int j1, int k1, Random random) - { - int l1 = g(world, i1, j1, k1); - byte byte0 = 1; - if(bs == Material.g && !world.q.d) - byte0 = 2; - boolean flag = true; - if(l1 > 0) - { - int i2 = -100; - a = 0; - i2 = e(world, i1 - 1, j1, k1, i2); - i2 = e(world, i1 + 1, j1, k1, i2); - i2 = e(world, i1, j1, k1 - 1, i2); - i2 = e(world, i1, j1, k1 + 1, i2); - int j2 = i2 + byte0; - if(j2 >= 8 || i2 < 0) - j2 = -1; - if(g(world, i1, j1 + 1, k1) >= 0) - { - int l2 = g(world, i1, j1 + 1, k1); - if(l2 >= 8) - j2 = l2; - else - j2 = l2 + 8; - } - if(a >= 2 && bs == Material.f) - if(world.d(i1, j1 - 1, k1)) - j2 = 0; - else - if(world.c(i1, j1 - 1, k1) == bs && world.b(i1, j1, k1) == 0) - j2 = 0; - if(bs == Material.g && l1 < 8 && j2 < 8 && j2 > l1 && random.nextInt(4) != 0) - { - j2 = l1; - flag = false; - } - if(j2 != l1) - { - l1 = j2; - if(l1 < 0) - { - world.d(i1, j1, k1, 0); - } else - { - world.b(i1, j1, k1, l1); - world.h(i1, j1, k1, bh); - world.g(i1, j1, k1, bh); - } - } else - if(flag) - i(world, i1, j1, k1); - } else - { - i(world, i1, j1, k1); - } - - // Craftbukkit start - CraftBlock source = (CraftBlock) ((WorldServer) world).getWorld().getBlockAt(i1, j1, k1); - - if(l(world, i1, j1 - 1, k1)) - { - // Craftbucket send "down" to the server - BlockFromToEvent blockFlow = new BlockFromToEvent(Type.BLOCK_FLOW, source, BlockFace.Down); - ((WorldServer) world).getServer().getPluginManager().callEvent(blockFlow); - - if (!blockFlow.isCancelled()) { - if(l1 >= 8) - world.b(i1, j1 - 1, k1, bh, l1); - else - world.b(i1, j1 - 1, k1, bh, l1 + 8); - } - } else - if(l1 >= 0 && (l1 == 0 || k(world, i1, j1 - 1, k1))) - { - boolean aflag[] = j(world, i1, j1, k1); - int k2 = l1 + byte0; - if(l1 >= 8) - k2 = 1; - if(k2 >= 8) - return; - - // Craftbukkit start - BlockFace[] faces = new BlockFace[]{ BlockFace.North, BlockFace.South, BlockFace.East, BlockFace.West }; - for (BlockFace currentFace : faces) { - int index = 0; - if (aflag[index]) { - BlockFromToEvent event = new BlockFromToEvent(Type.BLOCK_FLOW, source, currentFace); - ((WorldServer) world).getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) - f(world, i1 + currentFace.getModX(), j1, k1 + currentFace.getModZ(), k2); - } - index++; - } - // Craftbukkit stop - } - } - - private void f(World world, int i1, int j1, int k1, int l1) - { - if(l(world, i1, j1, k1)) - { - int i2 = world.a(i1, j1, k1); - if(i2 > 0) - if(bs == Material.g) - h(world, i1, j1, k1); - else - Block.m[i2].a_(world, i1, j1, k1, world.b(i1, j1, k1)); - world.b(i1, j1, k1, bh, l1); - } - } - - private int a(World world, int i1, int j1, int k1, int l1, int i2) - { - int j2 = 1000; - for(int k2 = 0; k2 < 4; k2++) - { - if(k2 == 0 && i2 == 1 || k2 == 1 && i2 == 0 || k2 == 2 && i2 == 3 || k2 == 3 && i2 == 2) - continue; - int l2 = i1; - int i3 = j1; - int j3 = k1; - if(k2 == 0) - l2--; - if(k2 == 1) - l2++; - if(k2 == 2) - j3--; - if(k2 == 3) - j3++; - if(k(world, l2, i3, j3) || world.c(l2, i3, j3) == bs && world.b(l2, i3, j3) == 0) - continue; - if(!k(world, l2, i3 - 1, j3)) - return l1; - if(l1 >= 4) - continue; - int k3 = a(world, l2, i3, j3, l1 + 1, k2); - if(k3 < j2) - j2 = k3; - } - - return j2; - } - - private boolean[] j(World world, int i1, int j1, int k1) - { - for(int l1 = 0; l1 < 4; l1++) - { - c[l1] = 1000; - int j2 = i1; - int i3 = j1; - int j3 = k1; - if(l1 == 0) - j2--; - if(l1 == 1) - j2++; - if(l1 == 2) - j3--; - if(l1 == 3) - j3++; - if(k(world, j2, i3, j3) || world.c(j2, i3, j3) == bs && world.b(j2, i3, j3) == 0) - continue; - if(!k(world, j2, i3 - 1, j3)) - c[l1] = 0; - else - c[l1] = a(world, j2, i3, j3, 1, l1); - } - - int i2 = c[0]; - for(int k2 = 1; k2 < 4; k2++) - if(c[k2] < i2) - i2 = c[k2]; - - for(int l2 = 0; l2 < 4; l2++) - b[l2] = c[l2] == i2; - - return b; - } - - private boolean k(World world, int i1, int j1, int k1) - { - int l1 = world.a(i1, j1, k1); - if(l1 == Block.aE.bh || l1 == Block.aL.bh || l1 == Block.aD.bh || l1 == Block.aF.bh || l1 == Block.aX.bh) - return true; - if(l1 == 0) - return false; - Material material = Block.m[l1].bs; - return material.a(); - } - - protected int e(World world, int i1, int j1, int k1, int l1) - { - int i2 = g(world, i1, j1, k1); - if(i2 < 0) - return l1; - if(i2 == 0) - a++; - if(i2 >= 8) - i2 = 0; - return l1 >= 0 && i2 >= l1 ? l1 : i2; - } - - private boolean l(World world, int i1, int j1, int k1) - { - Material material = world.c(i1, j1, k1); - if(material == bs) - return false; - if(material == Material.g) - return false; - else - return !k(world, i1, j1, k1); - } - - public void e(World world, int i1, int j1, int k1) - { - super.e(world, i1, j1, k1); - if(world.a(i1, j1, k1) == bh) - world.h(i1, j1, k1, bh); - } - - int a; - boolean b[]; - int c[]; +package net.minecraft.server; + +import java.util.Random; + +import org.bukkit.BlockFace; +import org.bukkit.craftbukkit.CraftBlock; +import org.bukkit.event.Event.Type; +import org.bukkit.event.block.BlockFromToEvent; + +public class BlockFlowing extends BlockFluids +{ + + protected BlockFlowing(int i1, Material material) + { + super(i1, material); + a = 0; + b = new boolean[4]; + c = new int[4]; + } + + private void i(World world, int i1, int j1, int k1) + { + int l1 = world.b(i1, j1, k1); + world.a(i1, j1, k1, bh + 1, l1); + world.b(i1, j1, k1, i1, j1, k1); + world.g(i1, j1, k1); + } + + public void a(World world, int i1, int j1, int k1, Random random) + { + int l1 = g(world, i1, j1, k1); + byte byte0 = 1; + if(bs == Material.g && !world.q.d) + byte0 = 2; + boolean flag = true; + if(l1 > 0) + { + int i2 = -100; + a = 0; + i2 = e(world, i1 - 1, j1, k1, i2); + i2 = e(world, i1 + 1, j1, k1, i2); + i2 = e(world, i1, j1, k1 - 1, i2); + i2 = e(world, i1, j1, k1 + 1, i2); + int j2 = i2 + byte0; + if(j2 >= 8 || i2 < 0) + j2 = -1; + if(g(world, i1, j1 + 1, k1) >= 0) + { + int l2 = g(world, i1, j1 + 1, k1); + if(l2 >= 8) + j2 = l2; + else + j2 = l2 + 8; + } + if(a >= 2 && bs == Material.f) + if(world.d(i1, j1 - 1, k1)) + j2 = 0; + else + if(world.c(i1, j1 - 1, k1) == bs && world.b(i1, j1, k1) == 0) + j2 = 0; + if(bs == Material.g && l1 < 8 && j2 < 8 && j2 > l1 && random.nextInt(4) != 0) + { + j2 = l1; + flag = false; + } + if(j2 != l1) + { + l1 = j2; + if(l1 < 0) + { + world.d(i1, j1, k1, 0); + } else + { + world.b(i1, j1, k1, l1); + world.h(i1, j1, k1, bh); + world.g(i1, j1, k1, bh); + } + } else + if(flag) + i(world, i1, j1, k1); + } else + { + i(world, i1, j1, k1); + } + + // Craftbukkit start + CraftBlock source = (CraftBlock) ((WorldServer) world).getWorld().getBlockAt(i1, j1, k1); + + if(l(world, i1, j1 - 1, k1)) + { + // Craftbucket send "down" to the server + BlockFromToEvent blockFlow = new BlockFromToEvent(Type.BLOCK_FLOW, source, BlockFace.Down); + ((WorldServer) world).getServer().getPluginManager().callEvent(blockFlow); + + if (!blockFlow.isCancelled()) { + if(l1 >= 8) + world.b(i1, j1 - 1, k1, bh, l1); + else + world.b(i1, j1 - 1, k1, bh, l1 + 8); + } + } else + if(l1 >= 0 && (l1 == 0 || k(world, i1, j1 - 1, k1))) + { + boolean aflag[] = j(world, i1, j1, k1); + int k2 = l1 + byte0; + if(l1 >= 8) + k2 = 1; + if(k2 >= 8) + return; + + // Craftbukkit start + BlockFace[] faces = new BlockFace[]{ BlockFace.North, BlockFace.South, BlockFace.East, BlockFace.West }; + for (BlockFace currentFace : faces) { + int index = 0; + if (aflag[index]) { + BlockFromToEvent event = new BlockFromToEvent(Type.BLOCK_FLOW, source, currentFace); + ((WorldServer) world).getServer().getPluginManager().callEvent(event); + if (!event.isCancelled()) + f(world, i1 + currentFace.getModX(), j1, k1 + currentFace.getModZ(), k2); + } + index++; + } + // Craftbukkit stop + } + } + + private void f(World world, int i1, int j1, int k1, int l1) + { + if(l(world, i1, j1, k1)) + { + int i2 = world.a(i1, j1, k1); + if(i2 > 0) + if(bs == Material.g) + h(world, i1, j1, k1); + else + Block.m[i2].a_(world, i1, j1, k1, world.b(i1, j1, k1)); + world.b(i1, j1, k1, bh, l1); + } + } + + private int a(World world, int i1, int j1, int k1, int l1, int i2) + { + int j2 = 1000; + for(int k2 = 0; k2 < 4; k2++) + { + if(k2 == 0 && i2 == 1 || k2 == 1 && i2 == 0 || k2 == 2 && i2 == 3 || k2 == 3 && i2 == 2) + continue; + int l2 = i1; + int i3 = j1; + int j3 = k1; + if(k2 == 0) + l2--; + if(k2 == 1) + l2++; + if(k2 == 2) + j3--; + if(k2 == 3) + j3++; + if(k(world, l2, i3, j3) || world.c(l2, i3, j3) == bs && world.b(l2, i3, j3) == 0) + continue; + if(!k(world, l2, i3 - 1, j3)) + return l1; + if(l1 >= 4) + continue; + int k3 = a(world, l2, i3, j3, l1 + 1, k2); + if(k3 < j2) + j2 = k3; + } + + return j2; + } + + private boolean[] j(World world, int i1, int j1, int k1) + { + for(int l1 = 0; l1 < 4; l1++) + { + c[l1] = 1000; + int j2 = i1; + int i3 = j1; + int j3 = k1; + if(l1 == 0) + j2--; + if(l1 == 1) + j2++; + if(l1 == 2) + j3--; + if(l1 == 3) + j3++; + if(k(world, j2, i3, j3) || world.c(j2, i3, j3) == bs && world.b(j2, i3, j3) == 0) + continue; + if(!k(world, j2, i3 - 1, j3)) + c[l1] = 0; + else + c[l1] = a(world, j2, i3, j3, 1, l1); + } + + int i2 = c[0]; + for(int k2 = 1; k2 < 4; k2++) + if(c[k2] < i2) + i2 = c[k2]; + + for(int l2 = 0; l2 < 4; l2++) + b[l2] = c[l2] == i2; + + return b; + } + + private boolean k(World world, int i1, int j1, int k1) + { + int l1 = world.a(i1, j1, k1); + if(l1 == Block.aE.bh || l1 == Block.aL.bh || l1 == Block.aD.bh || l1 == Block.aF.bh || l1 == Block.aX.bh) + return true; + if(l1 == 0) + return false; + Material material = Block.m[l1].bs; + return material.a(); + } + + protected int e(World world, int i1, int j1, int k1, int l1) + { + int i2 = g(world, i1, j1, k1); + if(i2 < 0) + return l1; + if(i2 == 0) + a++; + if(i2 >= 8) + i2 = 0; + return l1 >= 0 && i2 >= l1 ? l1 : i2; + } + + private boolean l(World world, int i1, int j1, int k1) + { + Material material = world.c(i1, j1, k1); + if(material == bs) + return false; + if(material == Material.g) + return false; + else + return !k(world, i1, j1, k1); + } + + public void e(World world, int i1, int j1, int k1) + { + super.e(world, i1, j1, k1); + if(world.a(i1, j1, k1) == bh) + world.h(i1, j1, k1, bh); + } + + int a; + boolean b[]; + int c[]; } \ No newline at end of file diff --git a/src/org/bukkit/craftbukkit/CraftBlock.java b/src/org/bukkit/craftbukkit/CraftBlock.java index 351f4a7bea..f67d14bfed 100644 --- a/src/org/bukkit/craftbukkit/CraftBlock.java +++ b/src/org/bukkit/craftbukkit/CraftBlock.java @@ -86,22 +86,40 @@ public class CraftBlock implements Block { return data; } + /** + * Sets the type of this block + * + * @param type Material to change this block to + */ + public void setType(final Material type) { + setTypeID(type.getID()); + } + /** * Sets the type-ID of this block * * @param type Type-ID to change this block to */ - public void setType(final int type) { + public void setTypeID(final int type) { this.type = type; world.getHandle().d(x, y, z, type); } + /** + * Gets the type of this block + * + * @return block type + */ + public Material getType() { + return Material.getMaterial(getTypeID()); + } + /** * Gets the type-ID of this block * * @return block type-ID */ - public int getType() { + public int getTypeID() { return type; }