package tc.oc.pgm.points; import java.util.Collection; import javax.annotation.Nullable; import org.bukkit.Location; import org.bukkit.entity.Entity; import tc.oc.pgm.match.Match; import tc.oc.pgm.match.MatchPlayer; /** * Get 16 points from each child and choose the farthest point from any enemy */ public class SpreadPointProvider extends AggregatePointProvider { private static final int SAMPLE_COUNT = 16; public SpreadPointProvider(Collection<? extends PointProvider> children) { super(children); } @Override public Location getPoint(Match match, @Nullable Entity entity) { Location bestPoint = null; double bestDistance = Double.NEGATIVE_INFINITY; MatchPlayer player = match.getPlayer(entity); for(PointProvider child : children) { final int sampleCount = SAMPLE_COUNT * child.getWeight(); for(int i = 0; i < sampleCount; i++) { Location pos = child.getPoint(match, entity); if(pos == null) continue; double nearest = Double.POSITIVE_INFINITY; for(MatchPlayer enemy : match.getParticipatingPlayers()) { if(enemy.isParticipating() && !enemy.isDead() && (player == null || player.getParty() != enemy.getParty())) { nearest = Math.min(nearest, pos.distanceSquared(enemy.getBukkit().getLocation())); } } if(bestDistance < nearest) { bestDistance = nearest; bestPoint = pos; } } } return bestPoint; } @Override public boolean canFail() { return allChildrenCanFail(); } }