private Optional<ChunkCoordinates> findValidTombstoneLocation(EntityPlayer player) { final int maxRadius = 100; /** Search an increasing square box (only check edge) for a valid location */ for (int radius = 0; radius < maxRadius; radius++) { List<ChunkCoordinates> validLocations = new ArrayList<ChunkCoordinates>(); validLocations.addAll(searchXPlaneAt(-radius, radius, player)); validLocations.addAll(searchXPlaneAt(radius, radius, player)); validLocations.addAll(searchZPlaneAt(-radius, radius, player)); validLocations.addAll(searchZPlaneAt(radius, radius, player)); validLocations.addAll(searchYPlaneAt(-radius, radius, player)); validLocations.addAll(searchYPlaneAt(radius, radius, player)); ChunkCoordinates closestPoint = null; float bestDistance = 0; for (ChunkCoordinates chunkCoordinates : validLocations) { if (closestPoint != null) { float distance = chunkCoordinates.getDistanceSquared( (int) player.posX, (int) player.posY, (int) player.posZ); if (distance < bestDistance) { bestDistance = distance; closestPoint = chunkCoordinates; } } else { closestPoint = chunkCoordinates; bestDistance = closestPoint.getDistanceSquared( (int) player.posX, (int) player.posY, (int) player.posZ); } } if (closestPoint != null) { return Optional.of(closestPoint); } } return Optional.absent(); }
/** Teleports the entity to another dimension. Params: Dimension number to teleport to */ public static void travelEntityToDimension(Entity entity, int dimensionId, int x, int y, int z) { if (!entity.worldObj.isRemote && !entity.isDead) { entity.worldObj.theProfiler.startSection("changeDimension"); MinecraftServer minecraftserver = MinecraftServer.getServer(); int j = entity.dimension; WorldServer worldserver = minecraftserver.worldServerForDimension(j); WorldServer worldserver1 = minecraftserver.worldServerForDimension(dimensionId); entity.dimension = dimensionId; if (j == 1 && dimensionId == 1) { worldserver1 = minecraftserver.worldServerForDimension(0); entity.dimension = 0; } entity.worldObj.removeEntity(entity); entity.isDead = false; entity.worldObj.theProfiler.startSection("reposition"); minecraftserver .getConfigurationManager() .transferEntityToWorld(entity, j, worldserver, worldserver1); entity.worldObj.theProfiler.endStartSection("reloading"); Entity newEntity = EntityList.createEntityByName(EntityList.getEntityString(entity), worldserver1); if (newEntity != null) { newEntity.copyDataFrom(entity, true); if (j == 1 && dimensionId == 1) { ChunkCoordinates chunkcoordinates = worldserver1.getSpawnPoint(); chunkcoordinates.posY = entity.worldObj.getTopSolidOrLiquidBlock( chunkcoordinates.posX, chunkcoordinates.posZ); newEntity.setLocationAndAngles( (double) chunkcoordinates.posX, (double) chunkcoordinates.posY, (double) chunkcoordinates.posZ, newEntity.rotationYaw, newEntity.rotationPitch); } worldserver1.spawnEntityInWorld(newEntity); newEntity.setPosition(x + 0.5D, y, z + 0.5D); } entity.isDead = true; entity.worldObj.theProfiler.endSection(); worldserver.resetUpdateEntityTick(); worldserver1.resetUpdateEntityTick(); entity.worldObj.theProfiler.endSection(); } }
/** Find all players in a specified range and narrowing down by other parameters */ public List findPlayers( ChunkCoordinates par1ChunkCoordinates, int par2, int par3, int par4, int par5, int par6, int par7) { if (this.playerEntityList.isEmpty()) { return null; } else { Object var8 = new ArrayList(); boolean var9 = par4 < 0; int var10 = par2 * par2; int var11 = par3 * par3; par4 = MathHelper.abs_int(par4); for (int var12 = 0; var12 < this.playerEntityList.size(); ++var12) { EntityPlayerMP var13 = (EntityPlayerMP) this.playerEntityList.get(var12); if (par1ChunkCoordinates != null && (par2 > 0 || par3 > 0)) { float var14 = par1ChunkCoordinates.getDistanceSquaredToChunkCoordinates( var13.getPlayerCoordinates()); if (par2 > 0 && var14 < (float) var10 || par3 > 0 && var14 > (float) var11) { continue; } } if ((par5 == EnumGameType.NOT_SET.getID() || par5 == var13.theItemInWorldManager.getGameType().getID()) && (par6 <= 0 || var13.experienceLevel >= par6) && var13.experienceLevel <= par7) { ((List) var8).add(var13); } } if (par1ChunkCoordinates != null) { Collections.sort((List) var8, new PlayerPositionComparator(par1ChunkCoordinates)); } if (var9) { Collections.reverse((List) var8); } if (par4 > 0) { var8 = ((List) var8).subList(0, Math.min(par4, ((List) var8).size())); } return (List) var8; } }