Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
at develop 326 lines 10 kB view raw
1package net.minecraft.server; 2 3import org.bukkit.Bukkit; 4import org.bukkit.event.world.PortalCreateEvent; 5 6import java.util.Random; 7 8// CraftBukkit start 9// CraftBukkit end 10 11public class PortalTravelAgent { 12 13 private Random a = new Random(); 14 15 public PortalTravelAgent() { 16 } 17 18 public void a(World world, Entity entity) { 19 if (!this.b(world, entity)) { 20 this.c(world, entity); 21 this.b(world, entity); 22 } 23 } 24 25 public boolean b(World world, Entity entity) { 26 short short1 = 128; 27 double d0 = -1.0D; 28 int i = 0; 29 int j = 0; 30 int k = 0; 31 int l = MathHelper.floor(entity.locX); 32 int i1 = MathHelper.floor(entity.locZ); 33 34 double d1; 35 36 for (int j1 = l - short1; j1 <= l + short1; ++j1) { 37 double d2 = (double) j1 + 0.5D - entity.locX; 38 39 for (int k1 = i1 - short1; k1 <= i1 + short1; ++k1) { 40 double d3 = (double) k1 + 0.5D - entity.locZ; 41 42 for (int l1 = 127; l1 >= 0; --l1) { 43 if (world.getTypeId(j1, l1, k1) == Block.PORTAL.id) { 44 while (world.getTypeId(j1, l1 - 1, k1) == Block.PORTAL.id) { 45 --l1; 46 } 47 48 d1 = (double) l1 + 0.5D - entity.locY; 49 double d4 = d2 * d2 + d1 * d1 + d3 * d3; 50 51 if (d0 < 0.0D || d4 < d0) { 52 d0 = d4; 53 i = j1; 54 j = l1; 55 k = k1; 56 } 57 } 58 } 59 } 60 } 61 62 if (d0 >= 0.0D) { 63 double d5 = (double) i + 0.5D; 64 double d6 = (double) j + 0.5D; 65 66 d1 = (double) k + 0.5D; 67 if (world.getTypeId(i - 1, j, k) == Block.PORTAL.id) { 68 d5 -= 0.5D; 69 } 70 71 if (world.getTypeId(i + 1, j, k) == Block.PORTAL.id) { 72 d5 += 0.5D; 73 } 74 75 if (world.getTypeId(i, j, k - 1) == Block.PORTAL.id) { 76 d1 -= 0.5D; 77 } 78 79 if (world.getTypeId(i, j, k + 1) == Block.PORTAL.id) { 80 d1 += 0.5D; 81 } 82 83 entity.setPositionRotation(d5, d6, d1, entity.yaw, 0.0F); 84 entity.motX = entity.motY = entity.motZ = 0.0D; 85 return true; 86 } else { 87 return false; 88 } 89 } 90 91 public boolean c(World world, Entity entity) { 92 byte b0 = 16; 93 double d0 = -1.0D; 94 int i = MathHelper.floor(entity.locX); 95 int j = MathHelper.floor(entity.locY); 96 int k = MathHelper.floor(entity.locZ); 97 int l = i; 98 int i1 = j; 99 int j1 = k; 100 int k1 = 0; 101 int l1 = this.a.nextInt(4); 102 103 int i2; 104 double d1; 105 int j2; 106 double d2; 107 int k2; 108 int l2; 109 int i3; 110 int j3; 111 int k3; 112 int l3; 113 int i4; 114 int j4; 115 int k4; 116 double d3; 117 double d4; 118 119 for (i2 = i - b0; i2 <= i + b0; ++i2) { 120 d1 = (double) i2 + 0.5D - entity.locX; 121 122 for (j2 = k - b0; j2 <= k + b0; ++j2) { 123 d2 = (double) j2 + 0.5D - entity.locZ; 124 125 label271: 126 for (l2 = 127; l2 >= 0; --l2) { 127 if (world.isEmpty(i2, l2, j2)) { 128 while (l2 > 0 && world.isEmpty(i2, l2 - 1, j2)) { 129 --l2; 130 } 131 132 for (k2 = l1; k2 < l1 + 4; ++k2) { 133 j3 = k2 % 2; 134 i3 = 1 - j3; 135 if (k2 % 4 >= 2) { 136 j3 = -j3; 137 i3 = -i3; 138 } 139 140 for (l3 = 0; l3 < 3; ++l3) { 141 for (k3 = 0; k3 < 4; ++k3) { 142 for (j4 = -1; j4 < 4; ++j4) { 143 i4 = i2 + (k3 - 1) * j3 + l3 * i3; 144 k4 = l2 + j4; 145 int l4 = j2 + (k3 - 1) * i3 - l3 * j3; 146 147 if (j4 < 0 && !world.getMaterial(i4, k4, l4).isBuildable() || j4 >= 0 && !world.isEmpty(i4, k4, l4)) { 148 continue label271; 149 } 150 } 151 } 152 } 153 154 d3 = (double) l2 + 0.5D - entity.locY; 155 d4 = d1 * d1 + d3 * d3 + d2 * d2; 156 if (d0 < 0.0D || d4 < d0) { 157 d0 = d4; 158 l = i2; 159 i1 = l2; 160 j1 = j2; 161 k1 = k2 % 4; 162 } 163 } 164 } 165 } 166 } 167 } 168 169 if (d0 < 0.0D) { 170 for (i2 = i - b0; i2 <= i + b0; ++i2) { 171 d1 = (double) i2 + 0.5D - entity.locX; 172 173 for (j2 = k - b0; j2 <= k + b0; ++j2) { 174 d2 = (double) j2 + 0.5D - entity.locZ; 175 176 label219: 177 for (l2 = 127; l2 >= 0; --l2) { 178 if (world.isEmpty(i2, l2, j2)) { 179 while (world.isEmpty(i2, l2 - 1, j2)) { 180 --l2; 181 } 182 183 for (k2 = l1; k2 < l1 + 2; ++k2) { 184 j3 = k2 % 2; 185 i3 = 1 - j3; 186 187 for (l3 = 0; l3 < 4; ++l3) { 188 for (k3 = -1; k3 < 4; ++k3) { 189 j4 = i2 + (l3 - 1) * j3; 190 i4 = l2 + k3; 191 k4 = j2 + (l3 - 1) * i3; 192 if (k3 < 0 && !world.getMaterial(j4, i4, k4).isBuildable() || k3 >= 0 && !world.isEmpty(j4, i4, k4)) { 193 continue label219; 194 } 195 } 196 } 197 198 d3 = (double) l2 + 0.5D - entity.locY; 199 d4 = d1 * d1 + d3 * d3 + d2 * d2; 200 if (d0 < 0.0D || d4 < d0) { 201 d0 = d4; 202 l = i2; 203 i1 = l2; 204 j1 = j2; 205 k1 = k2 % 2; 206 } 207 } 208 } 209 } 210 } 211 } 212 } 213 214 int i5 = l; 215 int j5 = i1; 216 217 j2 = j1; 218 int k5 = k1 % 2; 219 int l5 = 1 - k5; 220 221 if (k1 % 4 >= 2) { 222 k5 = -k5; 223 l5 = -l5; 224 } 225 226 boolean flag; 227 228 // CraftBukkit start - portal create event 229 java.util.Collection<org.bukkit.block.Block> blocks = new java.util.HashSet<org.bukkit.block.Block>(); 230 // Find out what blocks the portal is going to modify, duplicated from below 231 org.bukkit.World bworld = world.getWorld(); 232 233 if (d0 < 0.0D) { 234 if (i1 < 70) { 235 i1 = 70; 236 } 237 238 if (i1 > 118) { 239 i1 = 118; 240 } 241 242 j5 = i1; 243 244 for (l2 = -1; l2 <= 1; ++l2) { 245 for (k2 = 1; k2 < 3; ++k2) { 246 for (j3 = -1; j3 < 3; ++j3) { 247 i3 = i5 + (k2 - 1) * k5 + l2 * l5; 248 l3 = j5 + j3; 249 k3 = j2 + (k2 - 1) * l5 - l2 * k5; 250 blocks.add(bworld.getBlockAt(i3, l3, k3)); 251 } 252 } 253 } 254 } 255 256 for (l2 = 0; l2 < 4; ++l2) { 257 for (k2 = 0; k2 < 4; ++k2) { 258 for (j3 = -1; j3 < 4; ++j3) { 259 i3 = i5 + (k2 - 1) * k5; 260 l3 = j5 + j3; 261 k3 = j2 + (k2 - 1) * l5; 262 blocks.add(bworld.getBlockAt(i3, l3, k3)); 263 } 264 } 265 } 266 267 PortalCreateEvent event = new PortalCreateEvent(blocks, bworld); 268 Bukkit.getServer().getPluginManager().callEvent(event); 269 270 if (event.isCancelled()) { 271 return true; 272 } 273 // CraftBukkit end 274 275 if (d0 < 0.0D) { 276 if (i1 < 70) { 277 i1 = 70; 278 } 279 280 if (i1 > 118) { 281 i1 = 118; 282 } 283 284 j5 = i1; 285 286 for (l2 = -1; l2 <= 1; ++l2) { 287 for (k2 = 1; k2 < 3; ++k2) { 288 for (j3 = -1; j3 < 3; ++j3) { 289 i3 = i5 + (k2 - 1) * k5 + l2 * l5; 290 l3 = j5 + j3; 291 k3 = j2 + (k2 - 1) * l5 - l2 * k5; 292 flag = j3 < 0; 293 world.setTypeId(i3, l3, k3, flag ? Block.OBSIDIAN.id : 0); 294 } 295 } 296 } 297 } 298 299 for (l2 = 0; l2 < 4; ++l2) { 300 world.suppressPhysics = true; 301 302 for (k2 = 0; k2 < 4; ++k2) { 303 for (j3 = -1; j3 < 4; ++j3) { 304 i3 = i5 + (k2 - 1) * k5; 305 l3 = j5 + j3; 306 k3 = j2 + (k2 - 1) * l5; 307 flag = k2 == 0 || k2 == 3 || j3 == -1 || j3 == 3; 308 world.setTypeId(i3, l3, k3, flag ? Block.OBSIDIAN.id : Block.PORTAL.id); 309 } 310 } 311 312 world.suppressPhysics = false; 313 314 for (k2 = 0; k2 < 4; ++k2) { 315 for (j3 = -1; j3 < 4; ++j3) { 316 i3 = i5 + (k2 - 1) * k5; 317 l3 = j5 + j3; 318 k3 = j2 + (k2 - 1) * l5; 319 world.applyPhysics(i3, l3, k3, world.getTypeId(i3, l3, k3)); 320 } 321 } 322 } 323 324 return true; 325 } 326}