Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
at develop 178 lines 6.5 kB view raw
1package net.minecraft.server; 2 3import org.bukkit.event.block.LeavesDecayEvent; 4 5import uk.betacraft.uberbukkit.UberbukkitConfig; 6 7import java.util.Random; 8 9public class BlockLeaves extends BlockLeavesBase { 10 11 private int c; 12 int[] a; 13 14 protected BlockLeaves(int i, int j) { 15 super(i, j, Material.LEAVES, false); 16 this.c = j; 17 this.a(true); 18 } 19 20 public void remove(World world, int i, int j, int k) { 21 byte b0 = 1; 22 int l = b0 + 1; 23 24 if (world.a(i - l, j - l, k - l, i + l, j + l, k + l)) { 25 for (int i1 = -b0; i1 <= b0; ++i1) { 26 for (int j1 = -b0; j1 <= b0; ++j1) { 27 for (int k1 = -b0; k1 <= b0; ++k1) { 28 int l1 = world.getTypeId(i + i1, j + j1, k + k1); 29 30 if (l1 == Block.LEAVES.id) { 31 int i2 = world.getData(i + i1, j + j1, k + k1); 32 33 world.setRawData(i + i1, j + j1, k + k1, i2 | 8); 34 } 35 } 36 } 37 } 38 } 39 } 40 41 public void a(World world, int i, int j, int k, Random random) { 42 if (!world.isStatic) { 43 int l = world.getData(i, j, k); 44 45 if ((l & 8) != 0) { 46 byte b0 = 4; 47 int i1 = b0 + 1; 48 byte b1 = 32; 49 int j1 = b1 * b1; 50 int k1 = b1 / 2; 51 52 if (this.a == null) { 53 this.a = new int[b1 * b1 * b1]; 54 } 55 56 int l1; 57 58 if (world.a(i - i1, j - i1, k - i1, i + i1, j + i1, k + i1)) { 59 int i2; 60 int j2; 61 int k2; 62 63 for (l1 = -b0; l1 <= b0; ++l1) { 64 for (i2 = -b0; i2 <= b0; ++i2) { 65 for (j2 = -b0; j2 <= b0; ++j2) { 66 k2 = world.getTypeId(i + l1, j + i2, k + j2); 67 if (k2 == Block.LOG.id) { 68 this.a[(l1 + k1) * j1 + (i2 + k1) * b1 + j2 + k1] = 0; 69 } else if (k2 == Block.LEAVES.id) { 70 this.a[(l1 + k1) * j1 + (i2 + k1) * b1 + j2 + k1] = -2; 71 } else { 72 this.a[(l1 + k1) * j1 + (i2 + k1) * b1 + j2 + k1] = -1; 73 } 74 } 75 } 76 } 77 78 for (l1 = 1; l1 <= 4; ++l1) { 79 for (i2 = -b0; i2 <= b0; ++i2) { 80 for (j2 = -b0; j2 <= b0; ++j2) { 81 for (k2 = -b0; k2 <= b0; ++k2) { 82 if (this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + k2 + k1] == l1 - 1) { 83 if (this.a[(i2 + k1 - 1) * j1 + (j2 + k1) * b1 + k2 + k1] == -2) { 84 this.a[(i2 + k1 - 1) * j1 + (j2 + k1) * b1 + k2 + k1] = l1; 85 } 86 87 if (this.a[(i2 + k1 + 1) * j1 + (j2 + k1) * b1 + k2 + k1] == -2) { 88 this.a[(i2 + k1 + 1) * j1 + (j2 + k1) * b1 + k2 + k1] = l1; 89 } 90 91 if (this.a[(i2 + k1) * j1 + (j2 + k1 - 1) * b1 + k2 + k1] == -2) { 92 this.a[(i2 + k1) * j1 + (j2 + k1 - 1) * b1 + k2 + k1] = l1; 93 } 94 95 if (this.a[(i2 + k1) * j1 + (j2 + k1 + 1) * b1 + k2 + k1] == -2) { 96 this.a[(i2 + k1) * j1 + (j2 + k1 + 1) * b1 + k2 + k1] = l1; 97 } 98 99 if (this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + (k2 + k1 - 1)] == -2) { 100 this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + (k2 + k1 - 1)] = l1; 101 } 102 103 if (this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + k2 + k1 + 1] == -2) { 104 this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + k2 + k1 + 1] = l1; 105 } 106 } 107 } 108 } 109 } 110 } 111 } 112 113 l1 = this.a[k1 * j1 + k1 * b1 + k1]; 114 if (l1 >= 0) { 115 world.setRawData(i, j, k, l & -9); 116 } else { 117 this.g(world, i, j, k); 118 } 119 } 120 } 121 } 122 123 private void g(World world, int i, int j, int k) { 124 // CraftBukkit start 125 LeavesDecayEvent event = new LeavesDecayEvent(world.getWorld().getBlockAt(i, j, k)); 126 world.getServer().getPluginManager().callEvent(event); 127 128 if (event.isCancelled()) return; 129 // CraftBukkit end 130 131 int data = world.getData(i, j, k); 132 // uberbukkit 133 if (data > 0 && !UberbukkitConfig.getInstance().getBoolean("mechanics.drop_saplings_of_leaf_type", true)) { 134 data = 0; 135 } 136 137 this.g(world, i, j, k, data); 138 world.setTypeId(i, j, k, 0); 139 } 140 141 public int a(Random random) { 142 return random.nextInt(20) == 0 ? 1 : 0; 143 } 144 145 public int a(int i, Random random) { 146 return Block.SAPLING.id; 147 } 148 149 public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { 150 if (!world.isStatic && entityhuman.G() != null && entityhuman.G().id == Item.SHEARS.id) { 151 entityhuman.a(StatisticList.C[this.id], 1); 152 this.a(world, i, j, k, new ItemStack(Block.LEAVES.id, 1, l & 3)); 153 } else { 154 super.a(world, entityhuman, i, j, k, l); 155 } 156 } 157 158 protected int a_(int i) { 159 // uberbukkit 160 if (!UberbukkitConfig.getInstance().getBoolean("mechanics.drop_saplings_of_leaf_type", true)) { 161 return 0; 162 } else { 163 return i & 3; 164 } 165 } 166 167 public boolean a() { 168 return !this.b; 169 } 170 171 public int a(int i, int j) { 172 return (j & 3) == 1 ? this.textureId + 80 : this.textureId; 173 } 174 175 public void b(World world, int i, int j, int k, Entity entity) { 176 super.b(world, i, j, k, entity); 177 } 178}