diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/VariantSelector.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/VariantSelector.java index 2e556a06..722dea08 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/VariantSelector.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/VariantSelector.java @@ -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 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; + } } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathArea.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathArea.java index 8dfff02c..85aa567b 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathArea.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathArea.java @@ -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")); diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnArea.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnArea.java index 7cab122c..ad9210a4 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnArea.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/spawn/SpawnArea.java @@ -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; diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/dry/DryRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/dry/DryRegion.java index d8997ca7..dc6cbc9c 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/dry/DryRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/dry/DryRegion.java @@ -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; diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/wet/WetRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/wet/WetRegion.java index b663fd4b..77311fcb 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/wet/WetRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/wet/WetRegion.java @@ -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; diff --git a/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt b/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt index 860aeebd..049cfbcd 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt +++ b/CommonCore/SQL/src/de/steamwar/sql/SchematicNode.kt @@ -288,6 +288,12 @@ class SchematicNode(id: EntityID) : 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)