LoMines/src/main/java/com/loki/lomines/util/Selection.java
loki5512344 bd32b9fab2 chore: initial commit - LoMines v3.0.0 base structure
- Java rewrite from Kotlin
- LoAPI 3.0.0 integration
- Paper 1.21 support
- Core mine system with handlers
- BlockSetter abstraction (Bukkit/Oraxen/ItemsAdder)
- Statistics and leaderboard system
- Group wand for batch mine creation
- Mask fill mode support

Known issues:
- ConfigLoader.java: 712 lines (needs refactoring)
- MineCommands.java: 341 lines (needs splitting)
- 7 classes exceed 200 line limit
- Code quality improvements needed (KISS, DRY, SOLID)
2026-04-23 23:01:11 +02:00

138 lines
4.2 KiB
Java

package com.loki.lomines.util;
import org.bukkit.Location;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* Manages selection points for defining mine regions.
* Stores up to 10 points (5 pairs) for multi-regional mines.
* Points are organized in pairs where indices 2i and 2i+1 form a pair for i ∈ [0, 4].
*
* <p>This class is NOT thread-safe and should be used per-player.</p>
*/
public final class Selection {
private static final int MAX_POINTS = 10;
private static final int MAX_PAIRS = 5;
private final Location[] points;
/**
* Creates a new empty selection.
*/
public Selection() {
this.points = new Location[MAX_POINTS];
}
/**
* Sets a point at the specified index.
*
* @param index The point index (0-9)
* @param location The location to set
* @throws IllegalArgumentException if index is out of bounds
*/
public void setPoint(int index, Location location) {
validateIndex(index);
points[index] = location;
}
/**
* Gets a point at the specified index.
*
* @param index The point index (0-9)
* @return Optional containing the location if set, empty otherwise
* @throws IllegalArgumentException if index is out of bounds
*/
public Optional<Location> getPoint(int index) {
validateIndex(index);
return Optional.ofNullable(points[index]);
}
/**
* Gets a pair of points as an array.
* A pair consists of points at indices 2*pairIndex and 2*pairIndex+1.
*
* @param pairIndex The pair index (0-4)
* @return Array of two locations [point1, point2], may contain nulls
* @throws IllegalArgumentException if pairIndex is out of bounds
*/
public Location[] getPair(int pairIndex) {
validatePairIndex(pairIndex);
int firstIndex = pairIndex * 2;
int secondIndex = firstIndex + 1;
return new Location[] { points[firstIndex], points[secondIndex] };
}
/**
* Checks if a pair has both points set.
*
* @param pairIndex The pair index (0-4)
* @return true if both points in the pair are set, false otherwise
* @throws IllegalArgumentException if pairIndex is out of bounds
*/
public boolean hasPair(int pairIndex) {
validatePairIndex(pairIndex);
int firstIndex = pairIndex * 2;
int secondIndex = firstIndex + 1;
return points[firstIndex] != null && points[secondIndex] != null;
}
/**
* Clears all selection points.
*/
public void clear() {
for (int i = 0; i < MAX_POINTS; i++) {
points[i] = null;
}
}
/**
* Converts all complete pairs to Cuboid regions.
* Only pairs with both points set are converted.
*
* @return List of Cuboid regions created from complete pairs
*/
public List<Cuboid> toCuboids() {
List<Cuboid> cuboids = new ArrayList<>();
for (int pairIndex = 0; pairIndex < MAX_PAIRS; pairIndex++) {
if (hasPair(pairIndex)) {
Location[] pair = getPair(pairIndex);
cuboids.add(new Cuboid(pair[0], pair[1]));
}
}
return cuboids;
}
/**
* Validates that an index is within valid bounds [0, 9].
*
* @param index The index to validate
* @throws IllegalArgumentException if index is out of bounds
*/
private void validateIndex(int index) {
if (index < 0 || index >= MAX_POINTS) {
throw new IllegalArgumentException(
"Point index must be between 0 and " + (MAX_POINTS - 1) + ", got: " + index
);
}
}
/**
* Validates that a pair index is within valid bounds [0, 4].
*
* @param pairIndex The pair index to validate
* @throws IllegalArgumentException if pairIndex is out of bounds
*/
private void validatePairIndex(int pairIndex) {
if (pairIndex < 0 || pairIndex >= MAX_PAIRS) {
throw new IllegalArgumentException(
"Pair index must be between 0 and " + (MAX_PAIRS - 1) + ", got: " + pairIndex
);
}
}
}