Move some chunk area methods to a new ChunkUtil
This commit is contained in:
parent
0d034609f1
commit
4c530c1f7c
109
src/com/massivecraft/massivecore/util/ChunkUtil.java
Normal file
109
src/com/massivecraft/massivecore/util/ChunkUtil.java
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
package com.massivecraft.massivecore.util;
|
||||||
|
|
||||||
|
import com.massivecraft.massivecore.collections.MassiveSet;
|
||||||
|
import com.massivecraft.massivecore.predicate.Predicate;
|
||||||
|
import com.massivecraft.massivecore.ps.PS;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
public class ChunkUtil
|
||||||
|
{
|
||||||
|
// -------------------------------------------- //
|
||||||
|
// GET AREAS
|
||||||
|
// -------------------------------------------- //
|
||||||
|
|
||||||
|
public static Set<PS> getChunksCircle(PS center, int radius)
|
||||||
|
{
|
||||||
|
// Common Startup
|
||||||
|
final Set<PS> chunks = new MassiveSet<>();
|
||||||
|
|
||||||
|
chunks.add(center); // The center should come first for pretty messages
|
||||||
|
|
||||||
|
int radiusZero = radius - 1;
|
||||||
|
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 = center.getChunkX() + dx;
|
||||||
|
int z = center.getChunkZ() + dz;
|
||||||
|
|
||||||
|
chunks.add(center.withChunkX(x).withChunkZ(z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return chunks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<PS> getChunksSquare(PS center, int radius)
|
||||||
|
{
|
||||||
|
// Common Startup
|
||||||
|
final Set<PS> chunks = new MassiveSet<>();
|
||||||
|
|
||||||
|
chunks.add(center); // The center should come first for pretty messages
|
||||||
|
|
||||||
|
int radiusZero = radius - 1;
|
||||||
|
|
||||||
|
for (int dx = -radiusZero; dx <= radiusZero; dx++)
|
||||||
|
{
|
||||||
|
for (int dz = -radiusZero; dz <= radiusZero; dz++)
|
||||||
|
{
|
||||||
|
int x = center.getChunkX() + dx;
|
||||||
|
int z = center.getChunkZ() + dz;
|
||||||
|
|
||||||
|
chunks.add(center.withChunkX(x).withChunkZ(z));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return chunks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Set<PS> getChunkArea(PS startingPoint, Predicate<PS> matcher, int max)
|
||||||
|
{
|
||||||
|
Set<PS> set = new MassiveSet<>();
|
||||||
|
set.add(startingPoint);
|
||||||
|
floodSearch(set, matcher, max);
|
||||||
|
return set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void floodSearch(Set<PS> set, Predicate<PS> matcher, int max)
|
||||||
|
{
|
||||||
|
// Clean
|
||||||
|
if (set == null) throw new NullPointerException("set");
|
||||||
|
if (matcher == null) throw new NullPointerException("color");
|
||||||
|
|
||||||
|
// Expand
|
||||||
|
Set<PS> expansion = new MassiveSet<>();
|
||||||
|
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;
|
||||||
|
if ( ! matcher.apply(neighbour)) continue;
|
||||||
|
|
||||||
|
expansion.add(neighbour);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set.addAll(expansion);
|
||||||
|
|
||||||
|
// No Expansion?
|
||||||
|
if (expansion.isEmpty()) return;
|
||||||
|
|
||||||
|
// Reached Max?
|
||||||
|
if (set.size() >= max) return;
|
||||||
|
|
||||||
|
// Recurse
|
||||||
|
floodSearch(set, matcher, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user