--- ../src-base/minecraft/net/minecraft/world/Teleporter.java +++ ../src-work/minecraft/net/minecraft/world/Teleporter.java @@ -12,6 +12,12 @@ import net.minecraft.util.LongHashMap; import net.minecraft.util.MathHelper; +// CraftBukkit start +import org.bukkit.Location; +import org.bukkit.event.entity.EntityPortalExitEvent; +import org.bukkit.util.Vector; +// CraftBukkit end + public class Teleporter { private final WorldServer worldServerInstance; @@ -20,100 +26,172 @@ private final List destinationCoordinateKeys = new ArrayList(); private static final String __OBFID = "CL_00000153"; - public Teleporter(WorldServer p_i1963_1_) + public Teleporter(WorldServer par1WorldServer) { - this.worldServerInstance = p_i1963_1_; - this.random = new Random(p_i1963_1_.getSeed()); + this.worldServerInstance = par1WorldServer; + this.random = new Random(par1WorldServer.getSeed()); } - public void placeInPortal(Entity p_77185_1_, double p_77185_2_, double p_77185_4_, double p_77185_6_, float p_77185_8_) + public void placeInPortal(Entity par1Entity, double par2, double par4, double par6, float par8) { if (this.worldServerInstance.provider.dimensionId != 1) { - if (!this.placeInExistingPortal(p_77185_1_, p_77185_2_, p_77185_4_, p_77185_6_, p_77185_8_)) + if (!this.placeInExistingPortal(par1Entity, par2, par4, par6, par8)) { - this.makePortal(p_77185_1_); - this.placeInExistingPortal(p_77185_1_, p_77185_2_, p_77185_4_, p_77185_6_, p_77185_8_); + this.makePortal(par1Entity); + this.placeInExistingPortal(par1Entity, par2, par4, par6, par8); } } else { - int i = MathHelper.floor_double(p_77185_1_.posX); - int j = MathHelper.floor_double(p_77185_1_.posY) - 1; - int k = MathHelper.floor_double(p_77185_1_.posZ); - byte b0 = 1; - byte b1 = 0; + // CraftBukkit start - Modularize end portal creation + ChunkCoordinates created = this.createEndPortal(par2, par4, par6); + par1Entity.setLocationAndAngles((double) created.posX, (double) created.posY, (double) created.posZ, par1Entity.rotationYaw, 0.0F); + par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D; + } + } - for (int l = -2; l <= 2; ++l) + // Split out from original a(Entity, double, double, double, float) method in order to enable being called from createPortal + private ChunkCoordinates createEndPortal(double x, double y, double z) + { + int i = MathHelper.floor_double(x); + int j = MathHelper.floor_double(y) - 1; + int k = MathHelper.floor_double(z); + // CraftBukkit end + byte b0 = 1; + byte b1 = 0; + + for (int l = -2; l <= 2; ++l) + { + for (int i1 = -2; i1 <= 2; ++i1) { - for (int i1 = -2; i1 <= 2; ++i1) + for (int j1 = -1; j1 < 3; ++j1) { - for (int j1 = -1; j1 < 3; ++j1) + int k1 = i + i1 * b0 + l * b1; + int l1 = j + j1; + int i2 = k + i1 * b1 - l * b0; + boolean flag = j1 < 0; + this.worldServerInstance.setBlock(k1, l1, i2, flag ? Blocks.obsidian : Blocks.air); + } + } + } + + // CraftBukkit start + return new ChunkCoordinates(i, j, k); + } + + // use logic based on creation to verify end portal + private ChunkCoordinates findEndPortal(ChunkCoordinates portal) + { + int i = portal.posX; + int j = portal.posY - 1; + int k = portal.posZ; + byte b0 = 1; + byte b1 = 0; + + for (int l = -2; l <= 2; ++l) + { + for (int i1 = -2; i1 <= 2; ++i1) + { + for (int j1 = -1; j1 < 3; ++j1) + { + int k1 = i + i1 * b0 + l * b1; + int l1 = j + j1; + int i2 = k + i1 * b1 - l * b0; + boolean flag = j1 < 0; + + if (this.worldServerInstance.getBlock(k1, l1, i2) != (flag ? Blocks.obsidian : Blocks.air)) { - int k1 = i + i1 * b0 + l * b1; - int l1 = j + j1; - int i2 = k + i1 * b1 - l * b0; - boolean flag = j1 < 0; - this.worldServerInstance.setBlock(k1, l1, i2, flag ? Blocks.obsidian : Blocks.air); + return null; } } } + } - p_77185_1_.setLocationAndAngles((double)i, (double)j, (double)k, p_77185_1_.rotationYaw, 0.0F); - p_77185_1_.motionX = p_77185_1_.motionY = p_77185_1_.motionZ = 0.0D; + return new ChunkCoordinates(i, j, k); + } + // CraftBukkit end + + public boolean placeInExistingPortal(Entity par1Entity, double par2, double par4, double par6, float par8) + { + // CraftBukkit start - Modularize portal search process and entity teleportation + ChunkCoordinates found = this.findPortal(par1Entity.posX, par1Entity.posY, par1Entity.posZ, 128); + + if (found == null) + { + return false; } + + Location exit = new Location(this.worldServerInstance.getWorld(), found.posX, found.posY, found.posZ, par8, par1Entity.rotationPitch); + Vector velocity = par1Entity.getBukkitEntity().getVelocity(); + this.adjustExit(par1Entity, exit, velocity); + par1Entity.setLocationAndAngles(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); + + if (par1Entity.motionX != velocity.getX() || par1Entity.motionY != velocity.getY() || par1Entity.motionZ != velocity.getZ()) + { + par1Entity.getBukkitEntity().setVelocity(velocity); + } + + return true; } - public boolean placeInExistingPortal(Entity p_77184_1_, double p_77184_2_, double p_77184_4_, double p_77184_6_, float p_77184_8_) + public ChunkCoordinates findPortal(double x, double y, double z, int short1) { - short short1 = 128; + if (this.worldServerInstance.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) + { + return this.findEndPortal(this.worldServerInstance.provider.getEntrancePortalLocation()); + } + + // CraftBukkit end double d3 = -1.0D; int i = 0; int j = 0; int k = 0; - int l = MathHelper.floor_double(p_77184_1_.posX); - int i1 = MathHelper.floor_double(p_77184_1_.posZ); + // CraftBukkit start + int l = MathHelper.floor_double(x); + int i1 = MathHelper.floor_double(z); + // CraftBukkit end long j1 = ChunkCoordIntPair.chunkXZ2Int(l, i1); boolean flag = true; - double d7; - int l3; + double d4; + int k1; if (this.destinationCoordinateCache.containsItem(j1)) { - Teleporter.PortalPosition portalposition = (Teleporter.PortalPosition)this.destinationCoordinateCache.getValueByKey(j1); + PortalPosition chunkcoordinatesportal = (PortalPosition) this.destinationCoordinateCache.getValueByKey(j1); d3 = 0.0D; - i = portalposition.posX; - j = portalposition.posY; - k = portalposition.posZ; - portalposition.lastUpdateTime = this.worldServerInstance.getTotalWorldTime(); + i = chunkcoordinatesportal.posX; + j = chunkcoordinatesportal.posY; + k = chunkcoordinatesportal.posZ; + chunkcoordinatesportal.lastUpdateTime = this.worldServerInstance.getTotalWorldTime(); flag = false; } else { - for (l3 = l - short1; l3 <= l + short1; ++l3) + for (k1 = l - short1; k1 <= l + short1; ++k1) { - double d4 = (double)l3 + 0.5D - p_77184_1_.posX; + double d5 = (double) k1 + 0.5D - x; // CraftBukkit for (int l1 = i1 - short1; l1 <= i1 + short1; ++l1) { - double d5 = (double)l1 + 0.5D - p_77184_1_.posZ; + double d6 = (double) l1 + 0.5D - z; // CraftBukkit for (int i2 = this.worldServerInstance.getActualHeight() - 1; i2 >= 0; --i2) { - if (this.worldServerInstance.getBlock(l3, i2, l1) == Blocks.portal) + if (this.worldServerInstance.getBlock(k1, i2, l1) == Blocks.portal) { - while (this.worldServerInstance.getBlock(l3, i2 - 1, l1) == Blocks.portal) + while (this.worldServerInstance.getBlock(k1, i2 - 1, l1) == Blocks.portal) { --i2; } - d7 = (double)i2 + 0.5D - p_77184_1_.posY; - double d8 = d4 * d4 + d7 * d7 + d5 * d5; + d4 = (double) i2 + 0.5D - y; // CraftBukkit + double d7 = d5 * d5 + d4 * d4 + d6 * d6; - if (d3 < 0.0D || d8 < d3) + if (d3 < 0.0D || d7 < d3) { - d3 = d8; - i = l3; + d3 = d7; + i = k1; j = i2; k = l1; } @@ -127,61 +205,93 @@ { if (flag) { - this.destinationCoordinateCache.add(j1, new Teleporter.PortalPosition(i, j, k, this.worldServerInstance.getTotalWorldTime())); + this.destinationCoordinateCache.add(j1, new PortalPosition(i, j, k, this.worldServerInstance.getTotalWorldTime())); this.destinationCoordinateKeys.add(Long.valueOf(j1)); } - double d11 = (double)i + 0.5D; - double d6 = (double)j + 0.5D; - d7 = (double)k + 0.5D; - int i4 = -1; + // CraftBukkit start - Moved entity teleportation logic into exit + return new ChunkCoordinates(i, j, k); + } + else + { + return null; + } + } + // Entity repositioning logic split out from original b method and combined with repositioning logic for The End from original a method + public void adjustExit(Entity entity, Location position, Vector velocity) + { + Location from = position.clone(); + Vector before = velocity.clone(); + int i = position.getBlockX(); + int j = position.getBlockY(); + int k = position.getBlockZ(); + float f = position.getYaw(); + if (this.worldServerInstance.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) + { + // entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F); + // entity.motX = entity.motY = entity.motZ = 0.0D; + position.setPitch(0.0F); + velocity.setX(0); + velocity.setY(0); + velocity.setZ(0); + } + else + { + double d4; + int k1; + // CraftBukkit end + double d8 = (double) i + 0.5D; + double d9 = (double) j + 0.5D; + d4 = (double) k + 0.5D; + int j2 = -1; + if (this.worldServerInstance.getBlock(i - 1, j, k) == Blocks.portal) { - i4 = 2; + j2 = 2; } if (this.worldServerInstance.getBlock(i + 1, j, k) == Blocks.portal) { - i4 = 0; + j2 = 0; } if (this.worldServerInstance.getBlock(i, j, k - 1) == Blocks.portal) { - i4 = 3; + j2 = 3; } if (this.worldServerInstance.getBlock(i, j, k + 1) == Blocks.portal) { - i4 = 1; + j2 = 1; } - int j2 = p_77184_1_.getTeleportDirection(); + int k2 = entity.getTeleportDirection(); - if (i4 > -1) + if (j2 > -1) { - int k2 = Direction.rotateLeft[i4]; - int l2 = Direction.offsetX[i4]; - int i3 = Direction.offsetZ[i4]; - int j3 = Direction.offsetX[k2]; - int k3 = Direction.offsetZ[k2]; - boolean flag1 = !this.worldServerInstance.isAirBlock(i + l2 + j3, j, k + i3 + k3) || !this.worldServerInstance.isAirBlock(i + l2 + j3, j + 1, k + i3 + k3); - boolean flag2 = !this.worldServerInstance.isAirBlock(i + l2, j, k + i3) || !this.worldServerInstance.isAirBlock(i + l2, j + 1, k + i3); + int l2 = Direction.rotateLeft[j2]; + int i3 = Direction.offsetX[j2]; + int j3 = Direction.offsetZ[j2]; + int k3 = Direction.offsetX[l2]; + int l3 = Direction.offsetZ[l2]; + boolean flag1 = !this.worldServerInstance.isAirBlock(i + i3 + k3, j, k + j3 + l3) || !this.worldServerInstance.isAirBlock(i + i3 + k3, j + 1, k + j3 + l3); + boolean flag2 = !this.worldServerInstance.isAirBlock(i + i3, j, k + j3) || !this.worldServerInstance.isAirBlock(i + i3, j + 1, k + j3); if (flag1 && flag2) { - i4 = Direction.rotateOpposite[i4]; - k2 = Direction.rotateOpposite[k2]; - l2 = Direction.offsetX[i4]; - i3 = Direction.offsetZ[i4]; - j3 = Direction.offsetX[k2]; - k3 = Direction.offsetZ[k2]; - l3 = i - j3; - d11 -= (double)j3; - int k1 = k - k3; - d7 -= (double)k3; - flag1 = !this.worldServerInstance.isAirBlock(l3 + l2 + j3, j, k1 + i3 + k3) || !this.worldServerInstance.isAirBlock(l3 + l2 + j3, j + 1, k1 + i3 + k3); - flag2 = !this.worldServerInstance.isAirBlock(l3 + l2, j, k1 + i3) || !this.worldServerInstance.isAirBlock(l3 + l2, j + 1, k1 + i3); + j2 = Direction.rotateOpposite[j2]; + l2 = Direction.rotateOpposite[l2]; + i3 = Direction.offsetX[j2]; + j3 = Direction.offsetZ[j2]; + k3 = Direction.offsetX[l2]; + l3 = Direction.offsetZ[l2]; + k1 = i - k3; + d8 -= (double) k3; + int i4 = k - l3; + d4 -= (double) l3; + flag1 = !this.worldServerInstance.isAirBlock(k1 + i3 + k3, j, i4 + j3 + l3) || !this.worldServerInstance.isAirBlock(k1 + i3 + k3, j + 1, i4 + j3 + l3); + flag2 = !this.worldServerInstance.isAirBlock(k1 + i3, j, i4 + j3) || !this.worldServerInstance.isAirBlock(k1 + i3, j + 1, i4 + j3); } float f1 = 0.5F; @@ -200,24 +310,24 @@ f2 = 0.0F; } - d11 += (double)((float)j3 * f1 + f2 * (float)l2); - d7 += (double)((float)k3 * f1 + f2 * (float)i3); + d8 += (double)((float) k3 * f1 + f2 * (float) i3); + d4 += (double)((float) l3 * f1 + f2 * (float) j3); float f3 = 0.0F; float f4 = 0.0F; float f5 = 0.0F; float f6 = 0.0F; - if (i4 == j2) + if (j2 == k2) { f3 = 1.0F; f4 = 1.0F; } - else if (i4 == Direction.rotateOpposite[j2]) + else if (j2 == Direction.rotateOpposite[k2]) { f3 = -1.0F; f4 = -1.0F; } - else if (i4 == Direction.rotateRight[j2]) + else if (j2 == Direction.rotateRight[k2]) { f5 = 1.0F; f6 = -1.0F; @@ -228,33 +338,77 @@ f6 = 1.0F; } - double d9 = p_77184_1_.motionX; - double d10 = p_77184_1_.motionZ; - p_77184_1_.motionX = d9 * (double)f3 + d10 * (double)f6; - p_77184_1_.motionZ = d9 * (double)f5 + d10 * (double)f4; - p_77184_1_.rotationYaw = p_77184_8_ - (float)(j2 * 90) + (float)(i4 * 90); + // CraftBukkit start + double d10 = velocity.getX(); + double d11 = velocity.getZ(); + // CraftBukkit end + // CraftBukkit start - Adjust position and velocity instances instead of entity + velocity.setX(d10 * (double) f3 + d11 * (double) f6); + velocity.setZ(d10 * (double) f5 + d11 * (double) f4); + f = f - (float)(k2 * 90) + (float)(j2 * 90); } else { - p_77184_1_.motionX = p_77184_1_.motionY = p_77184_1_.motionZ = 0.0D; + // entity.motX = entity.motY = entity.motZ = 0.0D; + velocity.setX(0); + velocity.setY(0); + velocity.setZ(0); } - p_77184_1_.setLocationAndAngles(d11, d6, d7, p_77184_1_.rotationYaw, p_77184_1_.rotationPitch); - return true; + // entity.setPositionRotation(d8, d9, d4, entity.yaw, entity.pitch); + position.setX(d8); + position.setY(d9); + position.setZ(d4); + position.setYaw(f); } + + EntityPortalExitEvent event = new EntityPortalExitEvent(entity.getBukkitEntity(), from, position, before, velocity); + this.worldServerInstance.getServer().getPluginManager().callEvent(event); + Location to = event.getTo(); + + if (event.isCancelled() || to == null || !entity.isEntityAlive()) + { + position.setX(from.getX()); + position.setY(from.getY()); + position.setZ(from.getZ()); + position.setYaw(from.getYaw()); + position.setPitch(from.getPitch()); + velocity.copy(before); + } else { - return false; + position.setX(to.getX()); + position.setY(to.getY()); + position.setZ(to.getZ()); + position.setYaw(to.getYaw()); + position.setPitch(to.getPitch()); + velocity.copy(event.getAfter()); // event.getAfter() will never be null, as setAfter() will cause an NPE if null is passed in } + + // CraftBukkit end } - public boolean makePortal(Entity p_85188_1_) + public boolean makePortal(Entity par1Entity) { - byte b0 = 16; + // CraftBukkit start - Allow for portal creation to be based on coordinates instead of entity + return this.createPortal(par1Entity.posX, par1Entity.posY, par1Entity.posZ, 16); + } + + public boolean createPortal(double x, double y, double z, int b0) + { + if (this.worldServerInstance.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) + { + this.createEndPortal(x, y, z); + return true; + } + + // CraftBukkit end double d0 = -1.0D; - int i = MathHelper.floor_double(p_85188_1_.posX); - int j = MathHelper.floor_double(p_85188_1_.posY); - int k = MathHelper.floor_double(p_85188_1_.posZ); + // CraftBukkit start + int i = MathHelper.floor_double(x); + int j = MathHelper.floor_double(y); + int k = MathHelper.floor_double(z); + // CraftBukkit end int l = i; int i1 = j; int j1 = k; @@ -262,8 +416,10 @@ int l1 = this.random.nextInt(4); int i2; double d1; - int k2; double d2; + int j2; + int k2; + int l2; int i3; int j3; int k3; @@ -271,125 +427,123 @@ int i4; int j4; int k4; - int l4; - int i5; double d3; double d4; - + for (i2 = i - b0; i2 <= i + b0; ++i2) { - d1 = (double)i2 + 0.5D - p_85188_1_.posX; - - for (k2 = k - b0; k2 <= k + b0; ++k2) + d1 = (double) i2 + 0.5D - x; // CraftBukkit + + for (j2 = k - b0; j2 <= k + b0; ++j2) { - d2 = (double)k2 + 0.5D - p_85188_1_.posZ; + d2 = (double) j2 + 0.5D - z; // CraftBukkit label274: - - for (i3 = this.worldServerInstance.getActualHeight() - 1; i3 >= 0; --i3) + + for (k2 = this.worldServerInstance.getActualHeight() - 1; k2 >= 0; --k2) { - if (this.worldServerInstance.isAirBlock(i2, i3, k2)) + if (this.worldServerInstance.isAirBlock(i2, k2, j2)) { - while (i3 > 0 && this.worldServerInstance.isAirBlock(i2, i3 - 1, k2)) + while (k2 > 0 && this.worldServerInstance.isAirBlock(i2, k2 - 1, j2)) { - --i3; + --k2; } - - for (j3 = l1; j3 < l1 + 4; ++j3) + + for (i3 = l1; i3 < l1 + 4; ++i3) { - k3 = j3 % 2; - l3 = 1 - k3; - - if (j3 % 4 >= 2) + l2 = i3 % 2; + k3 = 1 - l2; + + if (i3 % 4 >= 2) { + l2 = -l2; k3 = -k3; - l3 = -l3; } - - for (i4 = 0; i4 < 3; ++i4) + + for (j3 = 0; j3 < 3; ++j3) { - for (j4 = 0; j4 < 4; ++j4) + for (i4 = 0; i4 < 4; ++i4) { - for (k4 = -1; k4 < 4; ++k4) + for (l3 = -1; l3 < 4; ++l3) { - l4 = i2 + (j4 - 1) * k3 + i4 * l3; - i5 = i3 + k4; - int j5 = k2 + (j4 - 1) * l3 - i4 * k3; - - if (k4 < 0 && !this.worldServerInstance.getBlock(l4, i5, j5).getMaterial().isSolid() || k4 >= 0 && !this.worldServerInstance.isAirBlock(l4, i5, j5)) + k4 = i2 + (i4 - 1) * l2 + j3 * k3; + j4 = k2 + l3; + int l4 = j2 + (i4 - 1) * k3 - j3 * l2; + + if (l3 < 0 && !this.worldServerInstance.getBlock(k4, j4, l4).getMaterial().isSolid() || l3 >= 0 && !this.worldServerInstance.isAirBlock(k4, j4, l4)) { continue label274; } } } } - - d3 = (double)i3 + 0.5D - p_85188_1_.posY; + + d3 = (double) k2 + 0.5D - y; // CraftBukkit d4 = d1 * d1 + d3 * d3 + d2 * d2; - + if (d0 < 0.0D || d4 < d0) { d0 = d4; l = i2; - i1 = i3; - j1 = k2; - k1 = j3 % 4; + i1 = k2; + j1 = j2; + k1 = i3 % 4; } } } } } } - + if (d0 < 0.0D) { for (i2 = i - b0; i2 <= i + b0; ++i2) { - d1 = (double)i2 + 0.5D - p_85188_1_.posX; - - for (k2 = k - b0; k2 <= k + b0; ++k2) + d1 = (double) i2 + 0.5D - x; // CraftBukkit + + for (j2 = k - b0; j2 <= k + b0; ++j2) { - d2 = (double)k2 + 0.5D - p_85188_1_.posZ; + d2 = (double) j2 + 0.5D - z; // CraftBukkit label222: - - for (i3 = this.worldServerInstance.getActualHeight() - 1; i3 >= 0; --i3) + + for (k2 = this.worldServerInstance.getActualHeight() - 1; k2 >= 0; --k2) { - if (this.worldServerInstance.isAirBlock(i2, i3, k2)) + if (this.worldServerInstance.isAirBlock(i2, k2, j2)) { - while (i3 > 0 && this.worldServerInstance.isAirBlock(i2, i3 - 1, k2)) + while (k2 > 0 && this.worldServerInstance.isAirBlock(i2, k2 - 1, j2)) { - --i3; + --k2; } - - for (j3 = l1; j3 < l1 + 2; ++j3) + + for (i3 = l1; i3 < l1 + 2; ++i3) { - k3 = j3 % 2; - l3 = 1 - k3; - - for (i4 = 0; i4 < 4; ++i4) + l2 = i3 % 2; + k3 = 1 - l2; + + for (j3 = 0; j3 < 4; ++j3) { - for (j4 = -1; j4 < 4; ++j4) + for (i4 = -1; i4 < 4; ++i4) { - k4 = i2 + (i4 - 1) * k3; - l4 = i3 + j4; - i5 = k2 + (i4 - 1) * l3; - - if (j4 < 0 && !this.worldServerInstance.getBlock(k4, l4, i5).getMaterial().isSolid() || j4 >= 0 && !this.worldServerInstance.isAirBlock(k4, l4, i5)) + l3 = i2 + (j3 - 1) * l2; + k4 = k2 + i4; + j4 = j2 + (j3 - 1) * k3; + + if (i4 < 0 && !this.worldServerInstance.getBlock(l3, k4, j4).getMaterial().isSolid() || i4 >= 0 && !this.worldServerInstance.isAirBlock(l3, k4, j4)) { continue label222; } } } - - d3 = (double)i3 + 0.5D - p_85188_1_.posY; + + d3 = (double) k2 + 0.5D - y; // CraftBukkit d4 = d1 * d1 + d3 * d3 + d2 * d2; - + if (d0 < 0.0D || d4 < d0) { d0 = d4; l = i2; - i1 = i3; - j1 = k2; - k1 = j3 % 2; + i1 = k2; + j1 = j2; + k1 = i3 % 2; } } } @@ -397,93 +551,93 @@ } } } - - int k5 = l; - int j2 = i1; - k2 = j1; - int l5 = k1 % 2; - int l2 = 1 - l5; - + + int i5 = l; + int j5 = i1; + j2 = j1; + int k5 = k1 % 2; + int l5 = 1 - k5; + if (k1 % 4 >= 2) { + k5 = -k5; l5 = -l5; - l2 = -l2; } - + boolean flag; - + if (d0 < 0.0D) { if (i1 < 70) { i1 = 70; } - + if (i1 > this.worldServerInstance.getActualHeight() - 10) { i1 = this.worldServerInstance.getActualHeight() - 10; } - - j2 = i1; - - for (i3 = -1; i3 <= 1; ++i3) + + j5 = i1; + + for (k2 = -1; k2 <= 1; ++k2) { - for (j3 = 1; j3 < 3; ++j3) + for (i3 = 1; i3 < 3; ++i3) { - for (k3 = -1; k3 < 3; ++k3) + for (l2 = -1; l2 < 3; ++l2) { - l3 = k5 + (j3 - 1) * l5 + i3 * l2; - i4 = j2 + k3; - j4 = k2 + (j3 - 1) * l2 - i3 * l5; - flag = k3 < 0; - this.worldServerInstance.setBlock(l3, i4, j4, flag ? Blocks.obsidian : Blocks.air); + k3 = i5 + (i3 - 1) * k5 + k2 * l5; + j3 = j5 + l2; + i4 = j2 + (i3 - 1) * l5 - k2 * k5; + flag = l2 < 0; + this.worldServerInstance.setBlock(k3, j3, i4, flag ? Blocks.obsidian : Blocks.air); } } } } - - for (i3 = 0; i3 < 4; ++i3) + + for (k2 = 0; k2 < 4; ++k2) { - for (j3 = 0; j3 < 4; ++j3) + for (i3 = 0; i3 < 4; ++i3) { - for (k3 = -1; k3 < 4; ++k3) + for (l2 = -1; l2 < 4; ++l2) { - l3 = k5 + (j3 - 1) * l5; - i4 = j2 + k3; - j4 = k2 + (j3 - 1) * l2; - flag = j3 == 0 || j3 == 3 || k3 == -1 || k3 == 3; - this.worldServerInstance.setBlock(l3, i4, j4, (Block)(flag ? Blocks.obsidian : Blocks.portal), 0, 2); + k3 = i5 + (i3 - 1) * k5; + j3 = j5 + l2; + i4 = j2 + (i3 - 1) * l5; + flag = i3 == 0 || i3 == 3 || l2 == -1 || l2 == 3; + this.worldServerInstance.setBlock(k3, j3, i4, flag ? Blocks.obsidian : Blocks.portal, 0, 2); } } - - for (j3 = 0; j3 < 4; ++j3) + + for (i3 = 0; i3 < 4; ++i3) { - for (k3 = -1; k3 < 4; ++k3) + for (l2 = -1; l2 < 4; ++l2) { - l3 = k5 + (j3 - 1) * l5; - i4 = j2 + k3; - j4 = k2 + (j3 - 1) * l2; - this.worldServerInstance.notifyBlocksOfNeighborChange(l3, i4, j4, this.worldServerInstance.getBlock(l3, i4, j4)); + k3 = i5 + (i3 - 1) * k5; + j3 = j5 + l2; + i4 = j2 + (i3 - 1) * l5; + this.worldServerInstance.notifyBlocksOfNeighborChange(k3, j3, i4, this.worldServerInstance.getBlock(k3, j3, i4)); } } } - + return true; } - public void removeStalePortalLocations(long p_85189_1_) + public void removeStalePortalLocations(long par1) { - if (p_85189_1_ % 100L == 0L) + if (par1 % 100L == 0L) { Iterator iterator = this.destinationCoordinateKeys.iterator(); - long j = p_85189_1_ - 600L; - + long j = par1 - 600L; + while (iterator.hasNext()) { - Long olong = (Long)iterator.next(); - Teleporter.PortalPosition portalposition = (Teleporter.PortalPosition)this.destinationCoordinateCache.getValueByKey(olong.longValue()); - - if (portalposition == null || portalposition.lastUpdateTime < j) + Long olong = (Long) iterator.next(); + PortalPosition chunkcoordinatesportal = (PortalPosition) this.destinationCoordinateCache.getValueByKey(olong.longValue()); + + if (chunkcoordinatesportal == null || chunkcoordinatesportal.lastUpdateTime < j) { iterator.remove(); this.destinationCoordinateCache.remove(olong.longValue()); @@ -491,16 +645,16 @@ } } } - + public class PortalPosition extends ChunkCoordinates { public long lastUpdateTime; private static final String __OBFID = "CL_00000154"; - - public PortalPosition(int p_i1962_2_, int p_i1962_3_, int p_i1962_4_, long p_i1962_5_) + + public PortalPosition(int par2, int par3, int par4, long par5) { - super(p_i1962_2_, p_i1962_3_, p_i1962_4_); - this.lastUpdateTime = p_i1962_5_; + super(par2, par3, par4); + this.lastUpdateTime = par5; } } }