Commits

durron597 authored ea0b6164922
Implemented BLOCK_FLOW
No tags

src/net/minecraft/server/BlockFlowing.java

Added
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 +}

Everything looks good. We'll let you know here if there's anything you should know about.

Add shortcut