diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionBackups.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionBackups.java index a3f95617..76d69e5d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionBackups.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionBackups.java @@ -22,6 +22,7 @@ package de.steamwar.bausystem.region; import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; +import org.bukkit.Location; import javax.annotation.CheckReturnValue; import javax.annotation.Nullable; @@ -78,9 +79,9 @@ public interface RegionBackups { public final void load(RegionData regionData) { } - @SuppressWarnings("java:S3038") // This forces everybody to implement 'deleteRegion' for Backups! + @SuppressWarnings("java:S3038") // This forces everybody to implement 'delete' for Backups! @Override - public abstract void delete(); + public abstract void delete(Location location); } @CheckReturnValue diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionDataStore.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionDataStore.java index 4ec6a7a4..c452a288 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionDataStore.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionDataStore.java @@ -19,9 +19,11 @@ package de.steamwar.bausystem.region; +import org.bukkit.Location; + public interface RegionDataStore { void save(); void load(RegionData regionData); - default void delete() { + default void delete(Location location) { } } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionVisualizer.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionVisualizer.java index 446b7c4b..a34290a3 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionVisualizer.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionVisualizer.java @@ -174,7 +174,7 @@ public class DynamicRegionVisualizer implements SWPlayer.Component, Listener { player.closeInventory(); Region region = DynamicRegionSystem.INSTANCE.get(tile); Set tiles = DynamicRegionSystem.INSTANCE.getTilesOfRegion(region); - region.delete(); + region.delete(tile.getCenterLocation()); SWPlayer.allWithSingleComponent(DynamicRegionVisualizer.class) .forEach(pair -> { diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegion.java index 2db68e18..803f28cc 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/DynamicRegion.java @@ -27,6 +27,7 @@ import de.steamwar.bausystem.region.dynamic.path.PathRegion; import de.steamwar.bausystem.shared.Pair; import lombok.Getter; import lombok.NonNull; +import org.bukkit.Location; import java.util.HashSet; import java.util.List; @@ -98,7 +99,7 @@ public abstract class DynamicRegion implements Region { } @Override - public void delete() { + public void delete(Location location) { if (!getType().isDeletable()) return; DynamicRegionSystem.INSTANCE.remove(this); DynamicRegionRepository.deleteRegion(this); diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/MultiTileArea.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/MultiTileArea.java index b8a7ed39..df0f439c 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/MultiTileArea.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/MultiTileArea.java @@ -32,7 +32,14 @@ import java.util.function.BiConsumer; public abstract class MultiTileArea implements Region.Area { - private final Set tiles = new HashSet<>(); + protected final Set tiles = new HashSet<>(); + + protected MultiTileArea() { + } + + protected MultiTileArea(Set initialTiles) { + tiles.addAll(initialTiles); + } public boolean addTile(Tile tile) { boolean result = tiles.add(tile); 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 63c1b720..90956ffb 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 @@ -24,14 +24,17 @@ import lombok.NonNull; import java.io.File; import java.time.LocalDate; import java.time.Month; -import java.util.*; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Optional; +import java.util.Random; public abstract class VariantSelector { private static final Random RANDOM = new Random(); public static final VariantSelector EMPTY = new VariantSelector() { @Override - public Optional select(UUID regionID, int drift) { + public Optional select() { return Optional.empty(); } }; @@ -39,15 +42,15 @@ public abstract class VariantSelector { private VariantSelector() { } - public abstract Optional select(UUID regionID, int drift); + public abstract Optional select(); public final VariantSelector or(VariantSelector other) { if (this == EMPTY) return other; VariantSelector self = this; return new VariantSelector() { @Override - public Optional select(UUID regionID, int drift) { - return self.select(regionID, drift).or(() -> other.select(regionID, drift)); + public Optional select() { + return self.select().or(() -> other.select()); } }; } @@ -57,10 +60,10 @@ public abstract class VariantSelector { VariantSelector self = this; return new VariantSelector() { @Override - public Optional select(UUID regionID, int drift) { + public Optional select() { LocalDate date = LocalDate.now(); if (date.getDayOfMonth() == day && date.getMonth() == month) { - return self.select(regionID, drift); + return self.select(); } else { return Optional.empty(); } @@ -75,7 +78,7 @@ public abstract class VariantSelector { final File file = files[0]; return new VariantSelector() { @Override - public Optional select(UUID regionID, int drift) { + public Optional select() { return Optional.of(file); } }; @@ -85,8 +88,7 @@ public abstract class VariantSelector { final int filesCount = files.length; return new VariantSelector() { @Override - public Optional select(UUID regionID, int drift) { - RANDOM.setSeed(regionID.getLeastSignificantBits() ^ regionID.getMostSignificantBits() ^ drift); + public Optional select() { return Optional.of(files[RANDOM.nextInt(filesCount)]); } }; diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaBlock.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaBlock.java index 53a4c857..f4c82806 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaBlock.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaBlock.java @@ -162,7 +162,7 @@ public class AreaBlock implements Region.Area { @Override public void place(Location location, PasteBuilder pasteBuilder, boolean extension) { EditSession editSession = pasteBuilder - .with(PasteBuilder.ClipboardProvider.file(selector.select(region.getID(), 0).orElse(null))) + .with(PasteBuilder.ClipboardProvider.file(selector.select().orElse(null))) .pastePoint(copyPoint) .run(); region.getHistory() diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaTile.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaTile.java index 9207ac55..0248a0a6 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaTile.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/AreaTile.java @@ -67,7 +67,7 @@ public class AreaTile implements Region.Area { @Override public void place(Location location, PasteBuilder pasteBuilder, boolean extension) { - File resetFile = selector.select(regionIdentifier, 0).orElse(null); + File resetFile = selector.select().orElse(null); if (resetFile != null) PasteUtils.paste(resetFile, minPoint, 0); } } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/PlotRegionBackups.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/PlotRegionBackups.java index 5df0bfa1..fecd8a10 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/PlotRegionBackups.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/modes/PlotRegionBackups.java @@ -30,6 +30,7 @@ import de.steamwar.bausystem.region.dynamic.DynamicRegionRepository; import de.steamwar.bausystem.region.dynamic.PasteUtils; import lombok.NonNull; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.jetbrains.annotations.Nullable; import java.io.File; @@ -75,7 +76,7 @@ public class PlotRegionBackups implements RegionBackups { // Cleanup backups if there are too many! backupList.sort(Backup::compareTo); while (backupList.size() >= backupType.maxBackups) { - backupList.removeFirst().delete(); + backupList.removeFirst().delete(null); } // Create backup and save! @@ -148,7 +149,7 @@ public class PlotRegionBackups implements RegionBackups { } @Override - public void delete() { + public void delete(Location location) { backups.getOrDefault(type, Collections.emptyList()) .remove(this); DynamicRegionRepository.deleteBackup(region, this); 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 37de9f44..237e60e9 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 @@ -111,12 +111,6 @@ public class PathArea implements Region.Area { .Case(Path, Path, Garden, CORNER_INNER_GARDEN, RotationCorrection.UsingOrdinal) ; - protected enum RotationCorrection { - Unchanged, - WithCorrection, - UsingOrdinal, - } - private final PathRegion region; private final UUID regionIdentifier; private final Tile tile; @@ -177,7 +171,7 @@ public class PathArea implements Region.Area { public void reset(PathSide side) { File resetFile = null; VariantSelector selector = SELECTOR_SIDE.Select(tile, side); - if (selector != null) resetFile = selector.select(regionIdentifier, side.ordinal() + side.rotate).orElse(null); + if (selector != null) resetFile = selector.select().orElse(null); if (selector == null || resetFile == null) { if (!BauSystem.DEV_SERVER) return; resetFile = FALLBACK_SCHEM; @@ -191,7 +185,7 @@ public class PathArea implements Region.Area { Pair pair = SELECTOR_CORNER.Select(tile, corner); VariantSelector selector = pair.getKey(); RotationCorrection rotationCorrection = pair.getValue(); - if (selector != null) resetFile = selector.select(regionIdentifier, corner.side1.ordinal() * corner.side2.ordinal() + corner.side1.rotate * corner.side2.rotate).orElse(null); + if (selector != null) resetFile = selector.select().orElse(null); if (selector == null || resetFile == null) { if (!BauSystem.DEV_SERVER) return; resetFile = FALLBACK_SCHEM; @@ -216,14 +210,14 @@ public class PathArea implements Region.Area { @Override public void place(Location location, PasteBuilder pasteBuilder, boolean extension) { if (region.isGarden()) { - File resetFile = GARDEN.select(regionIdentifier, 0).orElse(null); + File resetFile = GARDEN.select().orElse(null); if (resetFile != null) { PasteUtils.paste(resetFile, minPoint, 0); } return; } - File resetFile = CENTER_NORMAL.select(regionIdentifier, 0).orElse(null); + File resetFile = CENTER_NORMAL.select().orElse(null); if (resetFile != null) { PasteUtils.paste(resetFile, minPoint.add(7, 0, 7), 0); } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/RotationCorrection.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/RotationCorrection.java new file mode 100644 index 00000000..49fbf5cd --- /dev/null +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/RotationCorrection.java @@ -0,0 +1,26 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2026 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.dynamic.path; + +public enum RotationCorrection { + Unchanged, + WithCorrection, + UsingOrdinal, +} diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/SelectorCorner.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/SelectorCorner.java index b374a99a..55a373a8 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/SelectorCorner.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/SelectorCorner.java @@ -24,7 +24,7 @@ import de.steamwar.bausystem.region.dynamic.Tile; import de.steamwar.bausystem.region.dynamic.VariantSelector; import de.steamwar.bausystem.shared.Pair; -class SelectorCorner { +public class SelectorCorner { private static final int BITS; private static final int SELECTOR_COUNT; @@ -36,7 +36,7 @@ class SelectorCorner { } private VariantSelector[] selectors = new VariantSelector[SELECTOR_COUNT]; - private PathArea.RotationCorrection[] rotationCorrections = new PathArea.RotationCorrection[SELECTOR_COUNT]; + private RotationCorrection[] rotationCorrections = new RotationCorrection[SELECTOR_COUNT]; private int getIndex(RegionType.ConnectionType left, RegionType.ConnectionType right, RegionType.ConnectionType diagonal) { int index = left.ordinal(); @@ -47,18 +47,18 @@ class SelectorCorner { public SelectorCorner Case(RegionType.ConnectionType left, RegionType.ConnectionType right, RegionType.ConnectionType diagonal, VariantSelector selector) { int index = getIndex(left, right, diagonal); selectors[index] = selector; - rotationCorrections[index] = PathArea.RotationCorrection.Unchanged; + rotationCorrections[index] = RotationCorrection.Unchanged; return this; } - public SelectorCorner Case(RegionType.ConnectionType left, RegionType.ConnectionType right, RegionType.ConnectionType diagonal, VariantSelector selector, PathArea.RotationCorrection rotationCorrection) { + public SelectorCorner Case(RegionType.ConnectionType left, RegionType.ConnectionType right, RegionType.ConnectionType diagonal, VariantSelector selector, RotationCorrection rotationCorrection) { int index = getIndex(left, right, diagonal); selectors[index] = selector; rotationCorrections[index] = rotationCorrection; return this; } - public Pair Select(Tile tile, PathCorner corner) { + public Pair Select(Tile tile, PathCorner corner) { RegionType.ConnectionType left = PathArea.getConnectionType(tile, corner.side1, null); RegionType.ConnectionType right = PathArea.getConnectionType(tile, corner.side2, null); RegionType.ConnectionType diagonal = PathArea.getConnectionType(tile, corner.side1, corner.side2); diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/SelectorSide.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/SelectorSide.java index 8d064ab4..021f2dde 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/SelectorSide.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/SelectorSide.java @@ -23,11 +23,11 @@ import de.steamwar.bausystem.region.RegionType; import de.steamwar.bausystem.region.dynamic.Tile; import de.steamwar.bausystem.region.dynamic.VariantSelector; -class SelectorSide { +public class SelectorSide { private VariantSelector[] selectors = new VariantSelector[RegionType.ConnectionType.values().length]; - protected SelectorSide Case(RegionType.ConnectionType type, VariantSelector selector) { + public SelectorSide Case(RegionType.ConnectionType type, VariantSelector selector) { selectors[type.ordinal()] = selector; return this; } diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialArea.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialArea.java index c38e9eaa..43ef3154 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialArea.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/special/SpecialArea.java @@ -105,7 +105,7 @@ public class SpecialArea implements Region.Area { @Override public void place(Location location, PasteBuilder pasteBuilder, boolean extension) { - File resetFile = resetFiles.select(regionIdentifier, 0).orElse(null); + File resetFile = resetFiles.select().orElse(null); if (resetFile != null) PasteUtils.paste(resetFile, minPoint, 0); resetting = false; } diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedRegion.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedRegion.java index f773e2dc..bf2b93fa 100644 --- a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedRegion.java +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedRegion.java @@ -139,7 +139,7 @@ public class FixedRegion implements Region { } @Override - public void delete() { + public void delete(Location location) { file.delete(); } }