Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
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}