Improve VariantSelector for easier version upgrades (if needed)

This commit is contained in:
2026-09-07 11:42:22 +02:00
parent cbfc1038b8
commit 0e4a0702d8
6 changed files with 42 additions and 24 deletions
@@ -25,13 +25,14 @@ import lombok.NonNull;
import java.io.File;
import java.time.LocalDate;
import java.time.Month;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Optional;
import java.util.Random;
import java.util.*;
public abstract class VariantSelector {
public static final int BaseNodeId = 179925;
private static final SchematicNode BaseNode = Objects.requireNonNull(SchematicNode.byId(BaseNodeId));
private static final Random RANDOM = new Random();
public static final VariantSelector EMPTY = new VariantSelector() {
@Override
@@ -97,8 +98,9 @@ public abstract class VariantSelector {
};
}
public static VariantSelector Folder(int folderId) {
SchematicNode[] schematics = SchematicNode.getSchematicNodeInNode(folderId).toArray(SchematicNode[]::new);
public static VariantSelector Folder(String... path) {
SchematicNode folder = folder(path);
SchematicNode[] schematics = SchematicNode.getSchematicNodeInNode(folder.getId()).toArray(SchematicNode[]::new);
if (schematics.length == 0) return EMPTY;
if (schematics.length == 1) {
final SchematicNode node = schematics[0];
@@ -119,8 +121,8 @@ public abstract class VariantSelector {
};
}
public static VariantSelector Schematic(int schematicId) {
SchematicNode schematic = SchematicNode.getSchematicNode(schematicId);
public static VariantSelector Schematic(String... path) {
SchematicNode schematic = folder(path);
return new VariantSelector() {
@Override
public Optional<SchematicNode> select() {
@@ -128,4 +130,14 @@ public abstract class VariantSelector {
}
};
}
private static SchematicNode folder(String[] path) {
SchematicNode current = BaseNode;
for (int i = 0; i < path.length; i++) {
SchematicNode node = SchematicNode.getSchematicNode(current.getId(), path[i]);
if (node == null) throw new NullPointerException("Path " + path[i] + " not found in " + current.getId());
current = node;
}
return current;
}
}
@@ -48,21 +48,21 @@ public class PathArea extends Region.Area {
private static final File PATH_DIR = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "sections/path");
private static final File FALLBACK_SCHEM = new File(PATH_DIR, "Fallback.schem");
private static final VariantSelector CENTER = VariantSelector.Folder(179927);
private static final VariantSelector CENTER = VariantSelector.Folder("Path", "Center");
private static final VariantSelector SIDE_VOID = VariantSelector.Folder(179930);
private static final VariantSelector CORNER_INNER_VOID = VariantSelector.Folder(179937);
private static final VariantSelector CORNER_OUTER_VOID = VariantSelector.Folder(179942);
private static final VariantSelector SIDE_VOID = VariantSelector.Folder("Path", "Edge", "Void");
private static final VariantSelector CORNER_INNER_VOID = VariantSelector.Folder("Path", "Corner", "Inner", "Void");
private static final VariantSelector CORNER_OUTER_VOID = VariantSelector.Folder("Path", "Corner", "Outer", "Void");
private static final VariantSelector SIDE_WATER = VariantSelector.Folder(179931);
private static final VariantSelector CORNER_INNER_WATER = VariantSelector.Folder(179938);
private static final VariantSelector CORNER_OUTER_WATER = VariantSelector.Folder(179943);
private static final VariantSelector SIDE_WATER = VariantSelector.Folder("Path", "Edge", "Water");
private static final VariantSelector CORNER_INNER_WATER = VariantSelector.Folder("Path", "Corner", "Inner", "Water");
private static final VariantSelector CORNER_OUTER_WATER = VariantSelector.Folder("Path", "Corner", "Outer", "Water");
private static final VariantSelector SIDE_CLOSED = VariantSelector.Get(new File(PATH_DIR, "side/closed"));
private static final VariantSelector CORNER_INNER_CLOSED = VariantSelector.Get(new File(PATH_DIR, "cinner/closed"));
private static final VariantSelector CORNER_OUTER_CLOSED = VariantSelector.Get(new File(PATH_DIR, "couter/closed"));
private static final VariantSelector GARDEN = VariantSelector.Folder(180045);
private static final VariantSelector GARDEN = VariantSelector.Folder("Path", "Garden");
private static final VariantSelector SIDE_GARDEN = VariantSelector.Get(new File(PATH_DIR, "side/garden"));
private static final VariantSelector SIDE_GARDEN_CONNECTED = VariantSelector.Get(new File(PATH_DIR, "side/garden_connected"));
private static final VariantSelector CORNER_INNER_GARDEN = VariantSelector.Get(new File(PATH_DIR, "cinner/garden"));
@@ -34,12 +34,12 @@ import java.util.List;
public class SpawnArea extends Region.Area {
private static final VariantSelector SPAWN_BIG = VariantSelector.Schematic(179980);
private static final VariantSelector SPAWN_LITTLE_ZZ = VariantSelector.Schematic(180022);
private static final VariantSelector SPAWN_LITTLE_NZ = VariantSelector.Schematic(180024);
private static final VariantSelector SPAWN_LITTLE_PZ = VariantSelector.Schematic(180025);
private static final VariantSelector SPAWN_LITTLE_ZN = VariantSelector.Schematic(180023);
private static final VariantSelector SPAWN_LITTLE_ZP = VariantSelector.Schematic(180021);
private static final VariantSelector SPAWN_BIG = VariantSelector.Schematic("Spawn", "Big");
private static final VariantSelector SPAWN_LITTLE_ZZ = VariantSelector.Schematic("Spawn", "Little_ZZ");
private static final VariantSelector SPAWN_LITTLE_NZ = VariantSelector.Schematic("Spawn", "Little_NZ");
private static final VariantSelector SPAWN_LITTLE_PZ = VariantSelector.Schematic("Spawn", "Little_PZ");
private static final VariantSelector SPAWN_LITTLE_ZN = VariantSelector.Schematic("Spawn", "Little_ZN");
private static final VariantSelector SPAWN_LITTLE_ZP = VariantSelector.Schematic("Spawn", "Little_ZP");
private final Tile tile;
@@ -46,7 +46,7 @@ public class DryRegion extends DynamicRegion {
protected static final int TILE_X = 1;
protected static final int TILE_Z = 1;
private static final VariantSelector DRY = VariantSelector.Folder(180028);
private static final VariantSelector DRY = VariantSelector.Folder("Dry");
private final SpecialArea area;
@@ -45,7 +45,7 @@ public class WetRegion extends DynamicRegion {
protected static final int TILE_X = 1;
protected static final int TILE_Z = 1;
private static final VariantSelector WET = VariantSelector.Folder(180026);
private static final VariantSelector WET = VariantSelector.Folder("Wet");
private final SpecialArea area;
@@ -288,6 +288,12 @@ class SchematicNode(id: EntityID<Int>) : IntEntity(id) {
find { (SchematicNodeTable.owner eq owner) and (SchematicNodeTable.name eq name) and (SchematicNodeTable.parent eq parent) }.firstOrNull()
}
@JvmStatic
fun getSchematicNode(parent: Int, name: String) =
useDb {
find { (SchematicNodeTable.parent eq parent) and (SchematicNodeTable.name eq name) }.firstOrNull()
}
@JvmStatic
fun getSchematicNode(owner: Int, name: String, parent: SchematicNode) =
getSchematicNode(owner, name, parent.nodeId)