@Override public Set<PS> getChunks() throws MassiveException { // Common Startup final PS chunk = PS.valueOf(me.getLocation()).getChunk(true); final Set<PS> chunks = new LinkedHashSet<PS>(); chunks.add(chunk); // The center should come first for pretty messages Integer radiusZero = this.getRadiusZero(); if (radiusZero == null) return null; double radiusSquared = radiusZero * radiusZero; for (int dx = -radiusZero; dx <= radiusZero; dx++) { for (int dz = -radiusZero; dz <= radiusZero; dz++) { if (dx * dx + dz * dz > radiusSquared) continue; int x = chunk.getChunkX() + dx; int z = chunk.getChunkZ() + dz; chunks.add(chunk.withChunkX(x).withChunkZ(z)); } } return chunks; }
public static void floodSearch(Set<PS> set, Faction color, int max) { // Clean if (set == null) throw new NullPointerException("set"); if (color == null) throw new NullPointerException("color"); // Expand Set<PS> expansion = new LinkedHashSet<PS>(); for (PS chunk : set) { Set<PS> neighbours = MUtil.set( chunk.withChunkX(chunk.getChunkX() + 1), chunk.withChunkX(chunk.getChunkX() - 1), chunk.withChunkZ(chunk.getChunkZ() + 1), chunk.withChunkZ(chunk.getChunkZ() - 1)); for (PS neighbour : neighbours) { if (set.contains(neighbour)) continue; Faction faction = BoardColl.get().getFactionAt(neighbour); if (faction == null) continue; if (faction != color) continue; expansion.add(neighbour); } } set.addAll(expansion); // No Expansion? if (expansion.isEmpty()) return; // Reached Max? if (set.size() >= max) return; // Recurse floodSearch(set, color, max); }