Commits
durron597 authored ea0b6164922
1 + | package net.minecraft.server; |
2 + | |
3 + | import java.util.LinkedList; |
4 + | import java.util.List; |
5 + | import java.util.Random; |
6 + | |
7 + | import org.bukkit.BlockFace; |
8 + | import org.bukkit.event.Event.Type; |
9 + | import org.bukkit.event.block.BlockFlowEvent; |
10 + | |
11 + | public class BlockFlowing extends BlockFluids |
12 + | { |
13 + | |
14 + | protected BlockFlowing(int i1, Material material) |
15 + | { |
16 + | super(i1, material); |
17 + | a = 0; |
18 + | b = new boolean[4]; |
19 + | c = new int[4]; |
20 + | } |
21 + | |
22 + | private void i(World world, int i1, int j1, int k1) |
23 + | { |
24 + | int l1 = world.b(i1, j1, k1); |
25 + | world.a(i1, j1, k1, bh + 1, l1); |
26 + | world.b(i1, j1, k1, i1, j1, k1); |
27 + | world.g(i1, j1, k1); |
28 + | } |
29 + | |
30 + | public void a(World world, int i1, int j1, int k1, Random random) |
31 + | { |
32 + | int l1 = g(world, i1, j1, k1); |
33 + | byte byte0 = 1; |
34 + | if(bs == Material.g && !world.q.d) |
35 + | byte0 = 2; |
36 + | boolean flag = true; |
37 + | if(l1 > 0) |
38 + | { |
39 + | int i2 = -100; |
40 + | a = 0; |
41 + | i2 = e(world, i1 - 1, j1, k1, i2); |
42 + | i2 = e(world, i1 + 1, j1, k1, i2); |
43 + | i2 = e(world, i1, j1, k1 - 1, i2); |
44 + | i2 = e(world, i1, j1, k1 + 1, i2); |
45 + | int j2 = i2 + byte0; |
46 + | if(j2 >= 8 || i2 < 0) |
47 + | j2 = -1; |
48 + | if(g(world, i1, j1 + 1, k1) >= 0) |
49 + | { |
50 + | int l2 = g(world, i1, j1 + 1, k1); |
51 + | if(l2 >= 8) |
52 + | j2 = l2; |
53 + | else |
54 + | j2 = l2 + 8; |
55 + | } |
56 + | if(a >= 2 && bs == Material.f) |
57 + | if(world.d(i1, j1 - 1, k1)) |
58 + | j2 = 0; |
59 + | else |
60 + | if(world.c(i1, j1 - 1, k1) == bs && world.b(i1, j1, k1) == 0) |
61 + | j2 = 0; |
62 + | if(bs == Material.g && l1 < 8 && j2 < 8 && j2 > l1 && random.nextInt(4) != 0) |
63 + | { |
64 + | j2 = l1; |
65 + | flag = false; |
66 + | } |
67 + | if(j2 != l1) |
68 + | { |
69 + | l1 = j2; |
70 + | if(l1 < 0) |
71 + | { |
72 + | world.d(i1, j1, k1, 0); |
73 + | } else |
74 + | { |
75 + | world.b(i1, j1, k1, l1); |
76 + | world.h(i1, j1, k1, bh); |
77 + | world.g(i1, j1, k1, bh); |
78 + | } |
79 + | } else |
80 + | if(flag) |
81 + | i(world, i1, j1, k1); |
82 + | } else |
83 + | { |
84 + | i(world, i1, j1, k1); |
85 + | } |
86 + | |
87 + | // Craftbukkit start |
88 + | org.bukkit.Block source = ((WorldServer) world).getWorld().getBlockAt(i1, j1, k1); |
89 + | |
90 + | if(l(world, i1, j1 - 1, k1)) |
91 + | { |
92 + | // Craftbucket send "down" to the server |
93 + | BlockFlowEvent bfe = new BlockFlowEvent(Type.BLOCK_FLOW, source, BlockFace.Down); |
94 + | ((WorldServer) world).callHook(bfe); |
95 + | |
96 + | for (BlockFlowEvent.BlockFlow bf : bfe.getFaces()) { |
97 + | if (bf.getFlowDirection().equals(BlockFace.Down) && !bf.isCancelled()) { |
98 + | if(l1 >= 8) |
99 + | world.b(i1, j1 - 1, k1, bh, l1); |
100 + | else |
101 + | world.b(i1, j1 - 1, k1, bh, l1 + 8); |
102 + | } |
103 + | break; |
104 + | } |
105 + | } else |
106 + | if(l1 >= 0 && (l1 == 0 || k(world, i1, j1 - 1, k1))) |
107 + | { |
108 + | boolean aflag[] = j(world, i1, j1, k1); |
109 + | int k2 = l1 + byte0; |
110 + | if(l1 >= 8) |
111 + | k2 = 1; |
112 + | if(k2 >= 8) |
113 + | return; |
114 + | // Craftbukkit start |
115 + | List<BlockFace> faces = new LinkedList<BlockFace>(); |
116 + | if(aflag[0]) |
117 + | faces.add(BlockFace.North); |
118 + | if(aflag[1]) |
119 + | faces.add(BlockFace.South); |
120 + | if(aflag[2]) |
121 + | faces.add(BlockFace.East); |
122 + | if(aflag[3]) |
123 + | faces.add(BlockFace.West); |
124 + | |
125 + | BlockFlowEvent bfe = new BlockFlowEvent(Type.BLOCK_FLOW, source, faces); |
126 + | ((WorldServer) world).callHook(bfe); |
127 + | for (BlockFlowEvent.BlockFlow bf : bfe.getFaces()) { |
128 + | if (!bf.isCancelled()) |
129 + | f(world, i1 + bf.getFlowDirection().getModX(), j1, k1 + bf.getFlowDirection().getModZ(), k2); |
130 + | } |
131 + | // Craftbukkit stop |
132 + | } |
133 + | } |
134 + | |
135 + | private void f(World world, int i1, int j1, int k1, int l1) |
136 + | { |
137 + | if(l(world, i1, j1, k1)) |
138 + | { |
139 + | int i2 = world.a(i1, j1, k1); |
140 + | if(i2 > 0) |
141 + | if(bs == Material.g) |
142 + | h(world, i1, j1, k1); |
143 + | else |
144 + | Block.m[i2].a_(world, i1, j1, k1, world.b(i1, j1, k1)); |
145 + | world.b(i1, j1, k1, bh, l1); |
146 + | } |
147 + | } |
148 + | |
149 + | private int a(World world, int i1, int j1, int k1, int l1, int i2) |
150 + | { |
151 + | int j2 = 1000; |
152 + | for(int k2 = 0; k2 < 4; k2++) |
153 + | { |
154 + | if(k2 == 0 && i2 == 1 || k2 == 1 && i2 == 0 || k2 == 2 && i2 == 3 || k2 == 3 && i2 == 2) |
155 + | continue; |
156 + | int l2 = i1; |
157 + | int i3 = j1; |
158 + | int j3 = k1; |
159 + | if(k2 == 0) |
160 + | l2--; |
161 + | if(k2 == 1) |
162 + | l2++; |
163 + | if(k2 == 2) |
164 + | j3--; |
165 + | if(k2 == 3) |
166 + | j3++; |
167 + | if(k(world, l2, i3, j3) || world.c(l2, i3, j3) == bs && world.b(l2, i3, j3) == 0) |
168 + | continue; |
169 + | if(!k(world, l2, i3 - 1, j3)) |
170 + | return l1; |
171 + | if(l1 >= 4) |
172 + | continue; |
173 + | int k3 = a(world, l2, i3, j3, l1 + 1, k2); |
174 + | if(k3 < j2) |
175 + | j2 = k3; |
176 + | } |
177 + | |
178 + | return j2; |
179 + | } |
180 + | |
181 + | private boolean[] j(World world, int i1, int j1, int k1) |
182 + | { |
183 + | for(int l1 = 0; l1 < 4; l1++) |
184 + | { |
185 + | c[l1] = 1000; |
186 + | int j2 = i1; |
187 + | int i3 = j1; |
188 + | int j3 = k1; |
189 + | if(l1 == 0) |
190 + | j2--; |
191 + | if(l1 == 1) |
192 + | j2++; |
193 + | if(l1 == 2) |
194 + | j3--; |
195 + | if(l1 == 3) |
196 + | j3++; |
197 + | if(k(world, j2, i3, j3) || world.c(j2, i3, j3) == bs && world.b(j2, i3, j3) == 0) |
198 + | continue; |
199 + | if(!k(world, j2, i3 - 1, j3)) |
200 + | c[l1] = 0; |
201 + | else |
202 + | c[l1] = a(world, j2, i3, j3, 1, l1); |
203 + | } |
204 + | |
205 + | int i2 = c[0]; |
206 + | for(int k2 = 1; k2 < 4; k2++) |
207 + | if(c[k2] < i2) |
208 + | i2 = c[k2]; |
209 + | |
210 + | for(int l2 = 0; l2 < 4; l2++) |
211 + | b[l2] = c[l2] == i2; |
212 + | |
213 + | return b; |
214 + | } |
215 + | |
216 + | private boolean k(World world, int i1, int j1, int k1) |
217 + | { |
218 + | int l1 = world.a(i1, j1, k1); |
219 + | if(l1 == Block.aE.bh || l1 == Block.aL.bh || l1 == Block.aD.bh || l1 == Block.aF.bh || l1 == Block.aX.bh) |
220 + | return true; |
221 + | if(l1 == 0) |
222 + | return false; |
223 + | Material material = Block.m[l1].bs; |
224 + | return material.a(); |
225 + | } |
226 + | |
227 + | protected int e(World world, int i1, int j1, int k1, int l1) |
228 + | { |
229 + | int i2 = g(world, i1, j1, k1); |
230 + | if(i2 < 0) |
231 + | return l1; |
232 + | if(i2 == 0) |
233 + | a++; |
234 + | if(i2 >= 8) |
235 + | i2 = 0; |
236 + | return l1 >= 0 && i2 >= l1 ? l1 : i2; |
237 + | } |
238 + | |
239 + | private boolean l(World world, int i1, int j1, int k1) |
240 + | { |
241 + | Material material = world.c(i1, j1, k1); |
242 + | if(material == bs) |
243 + | return false; |
244 + | if(material == Material.g) |
245 + | return false; |
246 + | else |
247 + | return !k(world, i1, j1, k1); |
248 + | } |
249 + | |
250 + | public void e(World world, int i1, int j1, int k1) |
251 + | { |
252 + | super.e(world, i1, j1, k1); |
253 + | if(world.a(i1, j1, k1) == bh) |
254 + | world.h(i1, j1, k1, bh); |
255 + | } |
256 + | |
257 + | int a; |
258 + | boolean b[]; |
259 + | int c[]; |
260 + | } |