133 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.world.level;
 | |
| 
 | |
| import com.google.common.collect.ImmutableList;
 | |
| import com.google.common.collect.ImmutableList.Builder;
 | |
| import java.util.List;
 | |
| import java.util.UUID;
 | |
| import java.util.function.Predicate;
 | |
| import net.minecraft.world.entity.Entity;
 | |
| import net.minecraft.world.entity.EntitySelector;
 | |
| import net.minecraft.world.entity.player.Player;
 | |
| import net.minecraft.world.level.entity.EntityTypeTest;
 | |
| import net.minecraft.world.phys.AABB;
 | |
| import net.minecraft.world.phys.shapes.BooleanOp;
 | |
| import net.minecraft.world.phys.shapes.Shapes;
 | |
| import net.minecraft.world.phys.shapes.VoxelShape;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| 
 | |
| public interface EntityGetter {
 | |
| 	/**
 | |
| 	 * Gets all entities within the specified AABB excluding the one passed into it.
 | |
| 	 */
 | |
| 	List<Entity> getEntities(@Nullable Entity entity, AABB area, Predicate<? super Entity> predicate);
 | |
| 
 | |
| 	<T extends Entity> List<T> getEntities(EntityTypeTest<Entity, T> entityTypeTest, AABB bounds, Predicate<? super T> predicate);
 | |
| 
 | |
| 	default <T extends Entity> List<T> getEntitiesOfClass(Class<T> entityClass, AABB area, Predicate<? super T> filter) {
 | |
| 		return this.getEntities(EntityTypeTest.forClass(entityClass), area, filter);
 | |
| 	}
 | |
| 
 | |
| 	List<? extends Player> players();
 | |
| 
 | |
| 	/**
 | |
| 	 * Will get all entities within the specified AABB excluding the one passed into it. Args: entityToExclude, aabb
 | |
| 	 */
 | |
| 	default List<Entity> getEntities(@Nullable Entity entity, AABB area) {
 | |
| 		return this.getEntities(entity, area, EntitySelector.NO_SPECTATORS);
 | |
| 	}
 | |
| 
 | |
| 	default boolean isUnobstructed(@Nullable Entity entity, VoxelShape shape) {
 | |
| 		if (shape.isEmpty()) {
 | |
| 			return true;
 | |
| 		} else {
 | |
| 			for (Entity entity2 : this.getEntities(entity, shape.bounds())) {
 | |
| 				if (!entity2.isRemoved()
 | |
| 					&& entity2.blocksBuilding
 | |
| 					&& (entity == null || !entity2.isPassengerOfSameVehicle(entity))
 | |
| 					&& Shapes.joinIsNotEmpty(shape, Shapes.create(entity2.getBoundingBox()), BooleanOp.AND)) {
 | |
| 					return false;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			return true;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	default <T extends Entity> List<T> getEntitiesOfClass(Class<T> entityClass, AABB area) {
 | |
| 		return this.getEntitiesOfClass(entityClass, area, EntitySelector.NO_SPECTATORS);
 | |
| 	}
 | |
| 
 | |
| 	default List<VoxelShape> getEntityCollisions(@Nullable Entity entity, AABB collisionBox) {
 | |
| 		if (collisionBox.getSize() < 1.0E-7) {
 | |
| 			return List.of();
 | |
| 		} else {
 | |
| 			Predicate<Entity> predicate = entity == null ? EntitySelector.CAN_BE_COLLIDED_WITH : EntitySelector.NO_SPECTATORS.and(entity::canCollideWith);
 | |
| 			List<Entity> list = this.getEntities(entity, collisionBox.inflate(1.0E-7), predicate);
 | |
| 			if (list.isEmpty()) {
 | |
| 				return List.of();
 | |
| 			} else {
 | |
| 				Builder<VoxelShape> builder = ImmutableList.builderWithExpectedSize(list.size());
 | |
| 
 | |
| 				for (Entity entity2 : list) {
 | |
| 					builder.add(Shapes.create(entity2.getBoundingBox()));
 | |
| 				}
 | |
| 
 | |
| 				return builder.build();
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	default Player getNearestPlayer(double x, double y, double z, double distance, @Nullable Predicate<Entity> predicate) {
 | |
| 		double d = -1.0;
 | |
| 		Player player = null;
 | |
| 
 | |
| 		for (Player player2 : this.players()) {
 | |
| 			if (predicate == null || predicate.test(player2)) {
 | |
| 				double e = player2.distanceToSqr(x, y, z);
 | |
| 				if ((distance < 0.0 || e < distance * distance) && (d == -1.0 || e < d)) {
 | |
| 					d = e;
 | |
| 					player = player2;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return player;
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	default Player getNearestPlayer(Entity entity, double distance) {
 | |
| 		return this.getNearestPlayer(entity.getX(), entity.getY(), entity.getZ(), distance, false);
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	default Player getNearestPlayer(double x, double y, double z, double distance, boolean creativePlayers) {
 | |
| 		Predicate<Entity> predicate = creativePlayers ? EntitySelector.NO_CREATIVE_OR_SPECTATOR : EntitySelector.NO_SPECTATORS;
 | |
| 		return this.getNearestPlayer(x, y, z, distance, predicate);
 | |
| 	}
 | |
| 
 | |
| 	default boolean hasNearbyAlivePlayer(double x, double y, double z, double distance) {
 | |
| 		for (Player player : this.players()) {
 | |
| 			if (EntitySelector.NO_SPECTATORS.test(player) && EntitySelector.LIVING_ENTITY_STILL_ALIVE.test(player)) {
 | |
| 				double d = player.distanceToSqr(x, y, z);
 | |
| 				if (distance < 0.0 || d < distance * distance) {
 | |
| 					return true;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	default Player getPlayerByUUID(UUID uniqueId) {
 | |
| 		for (int i = 0; i < this.players().size(); i++) {
 | |
| 			Player player = (Player)this.players().get(i);
 | |
| 			if (uniqueId.equals(player.getUUID())) {
 | |
| 				return player;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return null;
 | |
| 	}
 | |
| }
 |