From 3117556ac0160cbd098f8fc0f0bb9d66d3d54de3 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Fri, 6 Mar 2026 22:32:37 +0100 Subject: [PATCH] Implement Garden updates for Path Regions correctly --- .../region/dynamic/DynamicRegion.java | 27 +++++++++++++++++-- .../region/dynamic/path/PathArea.java | 7 ++++- .../region/dynamic/path/PathRegion.java | 6 +++++ 3 files changed, 37 insertions(+), 3 deletions(-) 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 8e0997c1..5a4e0364 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 @@ -28,7 +28,9 @@ import de.steamwar.bausystem.shared.Pair; import lombok.Getter; import lombok.NonNull; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.UUID; public abstract class DynamicRegion implements Region { @@ -54,15 +56,36 @@ public abstract class DynamicRegion implements Region { public final void updateNeighbours() { List> list = DynamicRegionSystem.INSTANCE.getNeighbours(this) .filter(data -> data.getKey() instanceof PathRegion) - .map(data -> (Pair)(Pair) data) + .map(data -> (Pair) (Pair) data) .toList(); // Calculate Garden State for all neighbouring PathRegions + Set needsFullReset = new HashSet<>(); list.forEach(data -> { + boolean previousGardenState = data.getKey().isGarden(); data.getKey().calculateGardenState(); + if (data.getKey().isGarden() != previousGardenState) { + needsFullReset.add(data.getKey().getID()); + } }); // Updating world state for all neighbouring PathRegions list.forEach(data -> { - data.getKey().update(this, data.getValue().opposite()); + if (needsFullReset.contains(data.getKey().getID())) { + data.getKey().getArea().reset(null, false); + } else { + data.getKey().update(this, data.getValue().opposite()); + } + }); + // All full reset regions need to update their neighbours! + needsFullReset.forEach(uuid -> { + Region region = DynamicRegionSystem.INSTANCE.getRegion(uuid).orElse(null); + if (!(region instanceof DynamicRegion dynamicRegion)) return; + DynamicRegionSystem.INSTANCE.getNeighbours(dynamicRegion) + .filter(data -> data.getKey() instanceof PathRegion) + .map(data -> (Pair) (Pair) data) + .forEach(data -> { + if (data.getKey().isGarden()) return; + data.getKey().update(dynamicRegion, data.getValue().opposite()); + }); }); } 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 285c5309..4a6d7537 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 @@ -44,6 +44,7 @@ public class PathArea implements 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 GARDEN = VariantSelector.Get(new File(PATH_DIR, "garden")); private static final VariantSelector CENTER_NORMAL = VariantSelector.Get(new File(PATH_DIR, "center/normal")); private static final VariantSelector SIDE_GLOBAL = VariantSelector.Get(new File(PATH_DIR, "side/global")); private static final VariantSelector CORNER_INNER_GLOBAL = VariantSelector.Get(new File(PATH_DIR, "cinner/global")); @@ -150,7 +151,11 @@ public class PathArea implements Region.Area { @Override public void reset(PasteBuilder pasteBuilder, boolean extension) { if (region.isGarden()) { - // TODO: Implement Garden case! + File resetFile = GARDEN.select(regionIdentifier, 0).orElse(null); + if (resetFile != null) { + PasteUtils.paste(resetFile, minPoint, 0); + } + return; } File resetFile = CENTER_NORMAL.select(regionIdentifier, 0).orElse(null); diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathRegion.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathRegion.java index 0f2096b7..165751e8 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathRegion.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/dynamic/path/PathRegion.java @@ -40,6 +40,7 @@ public class PathRegion extends DynamicRegion { public PathRegion(UUID id, int minX, int minZ) { super(id, minX, minZ); + calculateGardenState(); } @Override @@ -122,4 +123,9 @@ public class PathRegion extends DynamicRegion { public void loadRegion(RegionData regionData) { DynamicRegionRepository.loadRegionData(this, regionData); } + + @Override + public String toString() { + return tile + "=" + getID(); + } }